Commit 0f54f404 by zhangxingmin

push

parent 4471fa35
package com.yd.csf.api.async;
import com.yd.common.enums.CommonEnum;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.dto.AlgorithmCollectResDto;
import com.yd.csf.api.dto.AlgorithmResDto;
import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
import com.yd.csf.feign.response.expectedfortune.ApiGenerateExpectedFortuneResponse;
import com.yd.csf.service.model.CalmTask;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.service.ICalmTaskService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyService;
import com.yd.feign.config.FeignTokenInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
......@@ -13,16 +25,30 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.time.ZoneId;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 发佣异步类
*/
@Slf4j
@Component
public class ApiExpectedFortuneAsyncService {
@Resource
private ApiExpectedFortuneService apiExpectedFortuneService;
@Resource
private PolicyFollowService policyFollowService;
@Resource
private PolicyService policyService;
@Resource
private ICalmTaskService iCalmTaskService;
/**
* 异步处理
* 异步处理-执行预计发拥数据
*
* @return
*/
......@@ -51,4 +77,128 @@ public class ApiExpectedFortuneAsyncService {
}
}
// /**
// * 异步处理-构建冷静期定时任务
// * @param collectResDtos
// */
// @Async("commonAsyncExecutor")
// public void buildCalmDateTask(List<AlgorithmCollectResDto> collectResDtos,String policyNo){
// //collectResDtos要分组,分组条件是clientUserBizId,sumCalculatedValue和commissionName需要分组统计计算,拿到分组后的创建新的List<AlgorithmCollectResDto>返回
//
// }
/**
* 异步处理-构建冷静期定时任务
* @param collectResDtos 原始计算结果收集列表
* @param policyNo 保单号
*/
@Async("commonAsyncExecutor")
public void buildCalmDateTask(List<AlgorithmCollectResDto> collectResDtos, String policyNo) {
if (CollectionUtils.isEmpty(collectResDtos)) {
log.info("构建冷静期定时任务,collectResDtos 为空,policyNo: {}", policyNo);
return;
}
//新单跟进对象
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(policyNo);
//保单对象
// Policy policy = policyService.queryOne(policyNo);
// 按 clientUserBizId 分组,计算每个用户的 sumCalculatedValue 和 commissionName
Map<String, AlgorithmCollectResDto> groupedMap = collectResDtos.stream()
.filter(dto -> StringUtils.isNotBlank(dto.getClientUserBizId()))
.collect(Collectors.toMap(
AlgorithmCollectResDto::getClientUserBizId,
Function.identity(),
(existing, replacement) -> {
// 合并:累加 sumCalculatedValue,合并 commissionName
BigDecimal sum1 = existing.getSumCalculatedValue() != null ? existing.getSumCalculatedValue() : BigDecimal.ZERO;
BigDecimal sum2 = calculateSumFromResList(replacement.getAlgorithmResDtoList());
existing.setSumCalculatedValue(sum1.add(sum2));
String commission1 = existing.getCommissionName() != null ? existing.getCommissionName() : "";
String commission2 = buildCommissionName(replacement.getAlgorithmResDtoList());
existing.setCommissionName(mergeCommissionNames(commission1, commission2));
return existing;
}
));
// 构造calmTask列表返回
List<CalmTask> resultList = groupedMap.values().stream().map(dto -> {
//计算合计值
BigDecimal totalSum = dto.getSumCalculatedValue();
if (totalSum == null || (totalSum != null && totalSum.compareTo(BigDecimal.ZERO) == 0)) {
//计算合计值为空或者0,直接返回null,不构造此CalmTask对象。
return null;
}
CalmTask calmTask = new CalmTask();
calmTask.setBrokerBizId(dto.getClientUserBizId());
calmTask.setBrokerName(dto.getClientUserName());
//当前保单转介人累计FYC(当前保单转介人基本法计算积分合值)
calmTask.setTotalFyc(totalSum);
calmTask.setCommissionName(dto.getCommissionName());
//执行状态->未执行
calmTask.setExecutionStatus("0");
calmTask.setCalmTaskBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_CALM_TASK.getCode()));
//冷静期天数
calmTask.setCoolingOffDays(policyFollow.getCoolingOffDays());
//冷静期结束日期
calmTask.setCoolingOffEndDate(policyFollow.getCoolingOffEndDate());
//执行时间(定时任务执行时间)
calmTask.setExecutionTime(policyFollow.getCoolingOffEndDate().toInstant()
.atZone(ZoneId.of("Asia/Shanghai"))
.toLocalDateTime());
//新单跟进唯一业务ID
calmTask.setPolicyBizId(policyFollow.getPolicyBizId());
//保单号
calmTask.setPolicyNo(policyNo);
return calmTask;
}).collect(Collectors.toList());
iCalmTaskService.saveOrUpdateBatch(resultList);
log.info("完成基本法分组计算,policyNo: {}, 分组后用户数: {}", policyNo, resultList.size());
// 构建冷静期定时任务逻辑
}
/**
* 从 AlgorithmResDto 列表中计算所有 calculatedValue 的总和
*/
private BigDecimal calculateSumFromResList(List<AlgorithmResDto> resDtoList) {
if (CollectionUtils.isEmpty(resDtoList)) {
return BigDecimal.ZERO;
}
return resDtoList.stream()
.map(AlgorithmResDto::getCalculatedValue)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
/**
* 从 AlgorithmResDto 列表中构建去重后的佣金项目名称(分号拼接)
*/
private String buildCommissionName(List<AlgorithmResDto> resDtoList) {
if (CollectionUtils.isEmpty(resDtoList)) {
return "";
}
return resDtoList.stream()
.map(AlgorithmResDto::getItemName)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.joining(";"));
}
/**
* 合并两个佣金名称字符串(去重后用分号拼接)
*/
private String mergeCommissionNames(String name1, String name2) {
Set<String> nameSet = new LinkedHashSet<>();
if (StringUtils.isNotBlank(name1)) {
nameSet.addAll(Arrays.asList(name1.split(";")));
}
if (StringUtils.isNotBlank(name2)) {
nameSet.addAll(Arrays.asList(name2.split(";")));
}
return String.join(";", nameSet);
}
}
package com.yd.csf.api.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 基本法计算值收集对象
*/
@Data
public class AlgorithmCollectResDto {
/**
* 客户端用户业务ID
*/
private String clientUserBizId;
/**
* 客户端用户名称
*/
private String clientUserName;
/**
* 计算值-当前用户的基本法合计值(客户端用户业务ID分组后统计组内的algorithmResDtoList的里面的calculatedValue合计值)
*/
private BigDecimal sumCalculatedValue;
/**
* 计算值-佣金项目(去重algorithmResDtoList的itemName通过分号拼接的)
*/
private String commissionName;
/**
* 算法-基本法计算-返回的列表(当前客户端用户绑定的多个基本法类型的计算值列表)
*/
private List<AlgorithmResDto> algorithmResDtoList;
}
......@@ -18,6 +18,7 @@ import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.common.utils.RedisUtil;
import com.yd.csf.api.async.ApiExpectedFortuneAsyncService;
import com.yd.csf.api.dto.*;
import com.yd.csf.api.service.ApiBasicLawCalculateService;
import com.yd.csf.api.service.ApiCommissionConditionService;
......@@ -117,6 +118,9 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
@Autowired
private ApiCommissionConditionService apiCommissionConditionService;
@Autowired
private ApiExpectedFortuneAsyncService apiExpectedFortuneAsyncService;
/**
* 生成预计发佣
*
......@@ -520,6 +524,8 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
String token2 = request2.getHeader("Authorization");
log.info("使用编程式事务,确保方法内的事务一致性 token==============,{}",token2);
//基本法计算值收集列表
List<AlgorithmCollectResDto> collectResDtos = new ArrayList<>();
for (QueryPolicyAndBrokerDto brokerDto : queryPolicyAndBrokerDtoList) {
// Integer paymentTerm = brokerDto.getPaymentTerm();
if (paymentTerm == null || paymentTerm == 0) {
......@@ -529,20 +535,33 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
List<CommissionRuleBinding> commissionRuleBindingList = brokerRelUserIdList(brokerDto);
log.info("同步处理-> 遍历保单转介人列表信息 -> 调用基本法算出预计发佣列表->commissionRuleBindingList:{}",JSON.toJSONString(commissionRuleBindingList));
for (int i = 1; i <= paymentTerm; i++) {
executeBilling(ExecuteBillingDto.builder()
Result<List<AlgorithmResDto>> result = executeBilling(ExecuteBillingDto.builder()
.name(brokerDto.getBrokerName())
.policyAndBrokerDto(brokerDto)
.issueNumber(i)
.build());
//收集计算销售佣金的转介人
AlgorithmCollectResDto resDto = new AlgorithmCollectResDto();
resDto.setClientUserBizId(brokerDto.getBrokerBizId());
resDto.setClientUserName(brokerDto.getBrokerName());
resDto.setAlgorithmResDtoList(result.getData());
collectResDtos.add(resDto);
if (!CollectionUtils.isEmpty(commissionRuleBindingList)) {
for (CommissionRuleBinding binding : commissionRuleBindingList) {
executeReward(ExecuteBillingDto.builder()
Result<List<AlgorithmResDto>> result1 = executeReward(ExecuteBillingDto.builder()
.clientUserBizId(binding.getTargetId())
.name(binding.getTargetName())
.policyAndBrokerDto(brokerDto)
.issueNumber(i)
.build());
//收集计算非销售佣金的转介人
AlgorithmCollectResDto resDto1 = new AlgorithmCollectResDto();
resDto.setClientUserBizId(binding.getTargetId());
resDto.setClientUserName(binding.getTargetName());
resDto.setAlgorithmResDtoList(result1.getData());
collectResDtos.add(resDto1);
}
}
}
......@@ -564,6 +583,10 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
.policyNo(policyNo)
.status(0)
.build());
//异步处理-构建冷静期定时任务
apiExpectedFortuneAsyncService.buildCalmDateTask(collectResDtos,policyNo);
return Result.success();
} catch (Exception e) {
//抛出异常,销毁redis缓存
......@@ -581,6 +604,8 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
});
}
/**
* 查询和当前转介人相关关系(推荐,一级管理,二级管理,辅导)的客户端用户ID列表数据
* @param brokerDto
......@@ -636,7 +661,7 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
* @return
*/
@Transactional(rollbackFor = Exception.class)
public Result executeReward(ExecuteBillingDto dto) {
public Result<List<AlgorithmResDto>> executeReward(ExecuteBillingDto dto) {
QueryPolicyAndBrokerDto brokerDto = dto.getPolicyAndBrokerDto();
//构造销售佣金基本法项目的顺序下标值执行
List<Integer> executionOrderList = new ArrayList<>();
......@@ -710,7 +735,7 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
* @return
*/
@Transactional(rollbackFor = Exception.class)
public Result executeBilling(ExecuteBillingDto dto) {
public Result<List<AlgorithmResDto>> executeBilling(ExecuteBillingDto dto) {
log.info("执行 - 销售佣金(销售佣金基本法)——>入参:{}", JSON.toJSONString(dto));
QueryPolicyAndBrokerDto brokerDto = dto.getPolicyAndBrokerDto();
//构造销售佣金基本法项目的顺序下标值执行
......@@ -771,7 +796,7 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
.source(1)
.build());
return Result.success();
return Result.success(result.getData());
}
/**
......
......@@ -1290,7 +1290,7 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
// 修改为生效时需要同步预计发佣
if (PolicyFollowStatusEnum.EFFECTIVE.equals(currentStatusEnum)) {
log.info("修改跟进状态获取token:{}", token);
// 同步:根据保单生成预计出账记录
// 根据保单生成预计出账记录
apiExpectedFortuneAsyncService.execute(policyFollow.getPolicyNo(),token);
}
return Result.success(true);
......
......@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
......@@ -77,7 +79,7 @@ public class CalmTask implements Serializable {
* 冷静期结束日期
*/
@TableField("cooling_off_end_date")
private LocalDateTime coolingOffEndDate;
private Date coolingOffEndDate;
/**
* 冷静期天数
......
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