Commit 2dc97703 by zhangxingmin

push

parent 1ac1bbf9
...@@ -5,15 +5,13 @@ import com.xxl.job.core.context.XxlJobHelper; ...@@ -5,15 +5,13 @@ import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
import com.yd.common.enums.CommonEnum; import com.yd.common.enums.CommonEnum;
import com.yd.common.utils.RandomStringGenerator; 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.feign.enums.OprSourceEnum;
import com.yd.csf.service.enums.RuleItemEnum; import com.yd.csf.service.enums.RuleItemEnum;
import com.yd.csf.service.model.*; import com.yd.csf.service.model.*;
import com.yd.csf.service.service.*; import com.yd.csf.service.service.*;
import com.yd.framework.config.LockExecutor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -22,14 +20,16 @@ import java.time.LocalDateTime; ...@@ -22,14 +20,16 @@ import java.time.LocalDateTime;
import java.util.Objects; import java.util.Objects;
/** /**
* 冷静期定时发送任务处理器 - XXL-Job定时任务执行器 * 冷静期定时发送任务处理器
* 使用@XxlJob注解方式
*/ */
@Component @Component
@Slf4j @Slf4j
public class CalmSendJobHandler { public class CalmSendJobHandler {
@Resource @Resource
private LockExecutor lockExecutor;
@Resource
private ICalmTaskService iCalmTaskService; private ICalmTaskService iCalmTaskService;
@Resource @Resource
private IAgentDetailFycService iAgentDetailFycService; private IAgentDetailFycService iAgentDetailFycService;
...@@ -43,118 +43,122 @@ public class CalmSendJobHandler { ...@@ -43,118 +43,122 @@ public class CalmSendJobHandler {
*/ */
@XxlJob("calmSendJobHandler") @XxlJob("calmSendJobHandler")
public void execute() throws Exception { public void execute() throws Exception {
//主任务发送时间
LocalDateTime taskSendTime = LocalDateTime.now(); LocalDateTime taskSendTime = LocalDateTime.now();
// 从XXL-Job参数中获取任务ID
String param = XxlJobHelper.getJobParam(); String param = XxlJobHelper.getJobParam();
// 记录任务开始日志
log.info("开始冷静期定时发送任务,参数: {}", param); log.info("开始冷静期定时发送任务,参数: {}", param);
// 解析任务参数(参数为冷静期定时任务业务ID)
String taskBizId = param; String taskBizId = param;
// 根据冷静期定时任务业务ID查询冷静期定时任务信息
CalmTask calmTask = iCalmTaskService.queryOne(taskBizId); CalmTask calmTask = iCalmTaskService.queryOne(taskBizId);
log.info("根据冷静期定时发送任务业务ID查询冷静期定时任务信息: {}: " + JSON.toJSONString(calmTask)); log.info("根据冷静期定时发送任务业务ID查询冷静期定时任务信息: {}: {}", taskBizId, JSON.toJSONString(calmTask));
// 检查冷静期定时任务是否存在
if (Objects.isNull(calmTask)) { if (Objects.isNull(calmTask)) {
// 记录错误并返回
XxlJobHelper.log("冷静期定时发送任务不存在: " + taskBizId); XxlJobHelper.log("冷静期定时发送任务不存在: " + taskBizId);
XxlJobHelper.handleFail("冷静期定时发送任务不存在"); XxlJobHelper.handleFail("冷静期定时发送任务不存在");
return; return;
} }
//更新保单冷静期定时任务对象字段 // 更新任务状态
//执行状态: 2-已执行
calmTask.setExecutionStatus("2"); calmTask.setExecutionStatus("2");
iCalmTaskService.saveOrUpdate(calmTask); iCalmTaskService.saveOrUpdate(calmTask);
//更新保单冷静期定时任务对应的积分明细对象字段 // 更新积分明细状态
//查询积分明细
AgentDetailFyc agentDetailFyc = iAgentDetailFycService.queryOne(calmTask.getDetailFycBizId()); AgentDetailFyc agentDetailFyc = iAgentDetailFycService.queryOne(calmTask.getDetailFycBizId());
if (agentDetailFyc != null) { if (agentDetailFyc != null) {
//状态:生效
agentDetailFyc.setStatus(1); agentDetailFyc.setStatus(1);
iAgentDetailFycService.saveOrUpdate(agentDetailFyc); iAgentDetailFycService.saveOrUpdate(agentDetailFyc);
} }
// 更新积分总表的字段(此时积分都已经生效) // 使用分布式锁保护积分总表更新(流式调用)
AgentAccumulatedFyc agentAccumulatedFyc = iAgentAccumulatedFycService.queryOne(calmTask.getBrokerBizId()); String brokerBizId = calmTask.getBrokerBizId();
if (agentAccumulatedFyc != null) { String lockKey = "calm:accumulated:lock:" + brokerBizId;
// 安全获取任务佣金增量值,若为 null 则用 0 代替
BigDecimal fycValue = calmTask.getAfterFyc() == null ? BigDecimal.ZERO : calmTask.getAfterFyc(); lockExecutor.executeWithLock(lockKey, () -> {
// 锁内业务逻辑
// 安全获取原有字段值,若为 null 则视为 0 updateAccumulatedFyc(calmTask);
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(); * 积分总表累计更新逻辑(原 execute 内的积分部分)
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(); private void updateAccumulatedFyc(CalmTask calmTask) {
String brokerBizId = calmTask.getBrokerBizId();
//未生效累计积分(不限业务场景)= 未生效累计积分(不限业务场景) - 增量积分 AgentAccumulatedFyc agentAccumulatedFyc = iAgentAccumulatedFycService.queryOne(brokerBizId);
BigDecimal noEffect = noEffectOld.subtract(fycValue); if (agentAccumulatedFyc == null) {
agentAccumulatedFyc.setNoEffect(noEffect.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : noEffect); log.warn("经纪人积分总表记录不存在,brokerBizId: {}", brokerBizId);
//已生效累计积分(不限业务场景) = 已生效累计积分(不限业务场景) + 增量积分 return;
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);
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);
}
} else {
//非首期
//已生效累计非首期佣金积分值(佣金场景) = 已生效累计非首期佣金积分值(佣金场景) + 增量积分
BigDecimal ryc = rycOld.add(fycValue);
agentAccumulatedFyc.setRyc(ryc);
//未生效累计非首期佣金积分值(佣金场景)= 未生效累计非首期佣金积分值(佣金场景)- 增量积分
BigDecimal noRyc = noRycOld.subtract(fycValue);
agentAccumulatedFyc.setNoRyc(noRyc.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : noRyc);
}
//晋升职级累计积分 = 初始化已生效积分(不限业务场景) + 已生效累计首期销售佣金积分值(销售佣金场景(佣金场景的其中一个))
BigDecimal initEffect = agentAccumulatedFyc.getInitEffect() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getInitEffect();
BigDecimal firstSalesCommission = agentAccumulatedFyc.getFirstSalesCommission() == null ? BigDecimal.ZERO : agentAccumulatedFyc.getFirstSalesCommission();
BigDecimal promotion = initEffect.add(firstSalesCommission);
agentAccumulatedFyc.setPromotion(promotion.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : promotion);
//最后计算日期,记录最后一次计算累计FYC的日期
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);
} }
// 安全获取任务佣金增量值
BigDecimal fycValue = calmTask.getAfterFyc() == null ? BigDecimal.ZERO : calmTask.getAfterFyc();
// 安全获取原有字段值(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.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.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.max(BigDecimal.ZERO));
}
} else {
// 非首期佣金
BigDecimal ryc = rycOld.add(fycValue);
agentAccumulatedFyc.setRyc(ryc);
BigDecimal noRyc = noRycOld.subtract(fycValue);
agentAccumulatedFyc.setNoRyc(noRyc.max(BigDecimal.ZERO));
}
// 晋升职级累计积分
BigDecimal initEffect = nvl(agentAccumulatedFyc.getInitEffect());
BigDecimal firstSalesCommission = nvl(agentAccumulatedFyc.getFirstSalesCommission());
BigDecimal promotion = initEffect.add(firstSalesCommission);
agentAccumulatedFyc.setPromotion(promotion.max(BigDecimal.ZERO));
agentAccumulatedFyc.setLastCalcDate(LocalDateTime.now());
iAgentAccumulatedFycService.saveOrUpdate(agentAccumulatedFyc);
// 新增积分总表日志
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