Commit 2dc97703 by zhangxingmin

push

parent 1ac1bbf9
......@@ -5,15 +5,13 @@ import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.yd.common.enums.CommonEnum;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.service.ApiAgentDetailFycService;
import com.yd.csf.feign.enums.FycSourceTypeEnum;
import com.yd.csf.feign.enums.OprSourceEnum;
import com.yd.csf.service.enums.RuleItemEnum;
import com.yd.csf.service.model.*;
import com.yd.csf.service.service.*;
import com.yd.framework.config.LockExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
......@@ -22,14 +20,16 @@ import java.time.LocalDateTime;
import java.util.Objects;
/**
* 冷静期定时发送任务处理器 - XXL-Job定时任务执行器
* 使用@XxlJob注解方式
* 冷静期定时发送任务处理器
*/
@Component
@Slf4j
public class CalmSendJobHandler {
@Resource
private LockExecutor lockExecutor;
@Resource
private ICalmTaskService iCalmTaskService;
@Resource
private IAgentDetailFycService iAgentDetailFycService;
......@@ -43,118 +43,122 @@ public class CalmSendJobHandler {
*/
@XxlJob("calmSendJobHandler")
public void execute() throws Exception {
//主任务发送时间
LocalDateTime taskSendTime = LocalDateTime.now();
// 从XXL-Job参数中获取任务ID
String param = XxlJobHelper.getJobParam();
// 记录任务开始日志
log.info("开始冷静期定时发送任务,参数: {}", param);
// 解析任务参数(参数为冷静期定时任务业务ID)
String taskBizId = param;
// 根据冷静期定时任务业务ID查询冷静期定时任务信息
CalmTask calmTask = iCalmTaskService.queryOne(taskBizId);
log.info("根据冷静期定时发送任务业务ID查询冷静期定时任务信息: {}: " + JSON.toJSONString(calmTask));
log.info("根据冷静期定时发送任务业务ID查询冷静期定时任务信息: {}: {}", taskBizId, JSON.toJSONString(calmTask));
// 检查冷静期定时任务是否存在
if (Objects.isNull(calmTask)) {
// 记录错误并返回
XxlJobHelper.log("冷静期定时发送任务不存在: " + taskBizId);
XxlJobHelper.handleFail("冷静期定时发送任务不存在");
return;
}
//更新保单冷静期定时任务对象字段
//执行状态: 2-已执行
// 更新任务状态
calmTask.setExecutionStatus("2");
iCalmTaskService.saveOrUpdate(calmTask);
//更新保单冷静期定时任务对应的积分明细对象字段
//查询积分明细
// 更新积分明细状态
AgentDetailFyc agentDetailFyc = iAgentDetailFycService.queryOne(calmTask.getDetailFycBizId());
if (agentDetailFyc != null) {
//状态:生效
agentDetailFyc.setStatus(1);
iAgentDetailFycService.saveOrUpdate(agentDetailFyc);
}
// 更新积分总表的字段(此时积分都已经生效)
AgentAccumulatedFyc agentAccumulatedFyc = iAgentAccumulatedFycService.queryOne(calmTask.getBrokerBizId());
if (agentAccumulatedFyc != null) {
// 安全获取任务佣金增量值,若为 null 则用 0 代替
// 使用分布式锁保护积分总表更新(流式调用)
String brokerBizId = calmTask.getBrokerBizId();
String lockKey = "calm:accumulated:lock:" + brokerBizId;
lockExecutor.executeWithLock(lockKey, () -> {
// 锁内业务逻辑
updateAccumulatedFyc(calmTask);
});
}
/**
* 积分总表累计更新逻辑(原 execute 内的积分部分)
* 在分布式锁保护下执行,确保同一经纪人串行处理
*/
private void updateAccumulatedFyc(CalmTask calmTask) {
String brokerBizId = calmTask.getBrokerBizId();
AgentAccumulatedFyc agentAccumulatedFyc = iAgentAccumulatedFycService.queryOne(brokerBizId);
if (agentAccumulatedFyc == null) {
log.warn("经纪人积分总表记录不存在,brokerBizId: {}", brokerBizId);
return;
}
// 安全获取任务佣金增量值
BigDecimal fycValue = calmTask.getAfterFyc() == null ? BigDecimal.ZERO : calmTask.getAfterFyc();
// 安全获取原有字段值,若为 null 则视为 0
BigDecimal noEffectOld = agentAccumulatedFyc.getNoEffect() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getNoEffect();
BigDecimal effectOld = agentAccumulatedFyc.getEffect() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getEffect();
BigDecimal firstCommissionOld = agentAccumulatedFyc.getFirstCommission() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getFirstCommission();
BigDecimal noFirstCommissionOld = agentAccumulatedFyc.getNoFirstCommission() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getNoFirstCommission();
BigDecimal rycOld = agentAccumulatedFyc.getRyc() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getRyc();
BigDecimal noRycOld = agentAccumulatedFyc.getNoRyc() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getNoRyc();
BigDecimal firstSalesCommissionOld = agentAccumulatedFyc.getFirstSalesCommission() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getFirstSalesCommission();
BigDecimal noFirstSalesCommissionOld = agentAccumulatedFyc.getNoFirstSalesCommission() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getNoFirstSalesCommission();
//未生效累计积分(不限业务场景)= 未生效累计积分(不限业务场景) - 增量积分
// 安全获取原有字段值(null -> 0)
BigDecimal noEffectOld = nvl(agentAccumulatedFyc.getNoEffect());
BigDecimal effectOld = nvl(agentAccumulatedFyc.getEffect());
BigDecimal firstCommissionOld = nvl(agentAccumulatedFyc.getFirstCommission());
BigDecimal noFirstCommissionOld = nvl(agentAccumulatedFyc.getNoFirstCommission());
BigDecimal rycOld = nvl(agentAccumulatedFyc.getRyc());
BigDecimal noRycOld = nvl(agentAccumulatedFyc.getNoRyc());
BigDecimal firstSalesCommissionOld = nvl(agentAccumulatedFyc.getFirstSalesCommission());
BigDecimal noFirstSalesCommissionOld = nvl(agentAccumulatedFyc.getNoFirstSalesCommission());
// 未生效/已生效累计积分
BigDecimal noEffect = noEffectOld.subtract(fycValue);
agentAccumulatedFyc.setNoEffect(noEffect.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : noEffect);
//已生效累计积分(不限业务场景) = 已生效累计积分(不限业务场景) + 增量积分
agentAccumulatedFyc.setNoEffect(noEffect.max(BigDecimal.ZERO));
BigDecimal effect = effectOld.add(fycValue);
agentAccumulatedFyc.setEffect(effect);
//累计积分 = 未生效累计积分 + 已生效累计积分
agentAccumulatedFyc.setTotalFyc(agentAccumulatedFyc.getNoEffect().add(agentAccumulatedFyc.getEffect()));
if (calmTask.getFortunePeriod() != null && calmTask.getFortunePeriod() == 1) {
//首期
//已生效累计首期佣金积分值(佣金场景) = 已生效累计首期佣金积分值(佣金场景) + 增量积分
// 首期佣金
BigDecimal firstCommission = firstCommissionOld.add(fycValue);
agentAccumulatedFyc.setFirstCommission(firstCommission);
//未生效累计首期佣金积分值(佣金场景)= 未生效累计首期佣金积分值(佣金场景)- 增量积分
BigDecimal noFirstCommission = noFirstCommissionOld.subtract(fycValue);
agentAccumulatedFyc.setNoFirstCommission(noFirstCommission.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : noFirstCommission);
agentAccumulatedFyc.setNoFirstCommission(noFirstCommission.max(BigDecimal.ZERO));
if (RuleItemEnum.SALES.getRuleItemBizId().equals(calmTask.getRuleItemBizId())) {
//销售佣金项目
//已生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个)) = 已生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个)) + 增量积分
BigDecimal firstSalesCommission = firstSalesCommissionOld.add(fycValue);
agentAccumulatedFyc.setFirstSalesCommission(firstSalesCommission);
//未生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个))= 未生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个))- 增量积分
BigDecimal noFirstSalesCommission = noFirstSalesCommissionOld.subtract(fycValue);
agentAccumulatedFyc.setNoFirstSalesCommission(noFirstSalesCommission.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : noFirstSalesCommission);
agentAccumulatedFyc.setNoFirstSalesCommission(noFirstSalesCommission.max(BigDecimal.ZERO));
}
} else {
//非首期
//已生效累计非首期佣金积分值(佣金场景) = 已生效累计非首期佣金积分值(佣金场景) + 增量积分
// 非首期佣金
BigDecimal ryc = rycOld.add(fycValue);
agentAccumulatedFyc.setRyc(ryc);
//未生效累计非首期佣金积分值(佣金场景)= 未生效累计非首期佣金积分值(佣金场景)- 增量积分
BigDecimal noRyc = noRycOld.subtract(fycValue);
agentAccumulatedFyc.setNoRyc(noRyc.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : noRyc);
agentAccumulatedFyc.setNoRyc(noRyc.max(BigDecimal.ZERO));
}
//晋升职级累计积分 = 初始化已生效积分(不限业务场景) + 已生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个))
BigDecimal initEffect = agentAccumulatedFyc.getInitEffect() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getInitEffect();
BigDecimal firstSalesCommission = agentAccumulatedFyc.getFirstSalesCommission() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getFirstSalesCommission();
// 晋升职级累计积分
BigDecimal initEffect = nvl(agentAccumulatedFyc.getInitEffect());
BigDecimal firstSalesCommission = nvl(agentAccumulatedFyc.getFirstSalesCommission());
BigDecimal promotion = initEffect.add(firstSalesCommission);
agentAccumulatedFyc.setPromotion(promotion.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : promotion);
//最后计算日期,记录最后一次计算累计FYC的日期
agentAccumulatedFyc.setPromotion(promotion.max(BigDecimal.ZERO));
agentAccumulatedFyc.setLastCalcDate(LocalDateTime.now());
iAgentAccumulatedFycService.saveOrUpdate(agentAccumulatedFyc);
//新增积分总表日志表
AgentAccumulatedFycLog log = new AgentAccumulatedFycLog();
BeanUtils.copyProperties(agentAccumulatedFyc, log);
log.setId(null);
log.setFycBizId(agentAccumulatedFyc.getFycBizId());
log.setFycLogBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_AGENT_ACCUMULATED_FYC_LOG.getCode()));
//操作来源枚举-解冻
log.setSourceType(OprSourceEnum.CALM_TASK_FREEZE.getItemValue());
log.setCreateTime(LocalDateTime.now());
log.setUpdateTime(LocalDateTime.now());
iAgentAccumulatedFycLogService.saveOrUpdate(log);
// 新增积分总表日志
AgentAccumulatedFycLog logObj = new AgentAccumulatedFycLog();
BeanUtils.copyProperties(agentAccumulatedFyc, logObj);
logObj.setId(null);
logObj.setFycBizId(agentAccumulatedFyc.getFycBizId());
logObj.setFycLogBizId(RandomStringGenerator.generateBizId16(
CommonEnum.UID_TYPE_AGENT_ACCUMULATED_FYC_LOG.getCode()));
logObj.setSourceType(OprSourceEnum.CALM_TASK_FREEZE.getItemValue());
logObj.setCreateTime(LocalDateTime.now());
logObj.setUpdateTime(LocalDateTime.now());
iAgentAccumulatedFycLogService.saveOrUpdate(logObj);
log.debug("经纪人积分累算完成,brokerBizId: {}, 本次增量: {}", brokerBizId, fycValue);
}
/**
* BigDecimal 空值安全转零
*/
private BigDecimal nvl(BigDecimal val) {
return val == null ? BigDecimal.ZERO : val;
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment