Commit f8d82c99 by jianan

新单跟进112

parent a8574718
......@@ -33,6 +33,7 @@ import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
......@@ -237,6 +238,11 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
}
// 构建保单号+期次的复合键集合
Set<String> commissionPolicyPeriodKeys = commissionList.stream()
.map(commission -> buildPolicyPeriodKey(commission.getPolicyNo(), commission.getCommissionPeriod()))
.collect(Collectors.toSet());
// 3. 根据保单号查询所有发佣记录
List<Fortune> fortuneList = fortuneService.list(new QueryWrapper<Fortune>().in("policy_no", policyNoSet));
......@@ -248,11 +254,10 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
}
// 5. 筛出来佣对应的预计发佣记录
// 5. 筛选匹配的预计发佣记录(优化性能)
List<ExpectedFortune> filteredExpectedFortuneList = expectedFortuneList.stream()
.filter(expectedFortune -> commissionList.stream()
.anyMatch(commission -> StringUtils.equals(commission.getPolicyNo(), expectedFortune.getPolicyNo())
&& commission.getCommissionPeriod().equals(expectedFortune.getFortunePeriod())))
.filter(expectedFortune -> commissionPolicyPeriodKeys.contains(
buildPolicyPeriodKey(expectedFortune.getPolicyNo(), expectedFortune.getFortunePeriod())))
.collect(Collectors.toList());
// 6.删除旧的发佣记录
......@@ -265,31 +270,93 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
List<Fortune> policyPaidFortuneList = fortuneService.list(fortuneQueryWrapper);
// 7.2 构建实际的初始发佣记录
List<Fortune> newFortuneList = new ArrayList<>();
for (ExpectedFortune expectedFortune : filteredExpectedFortuneList) {
List<Fortune> newFortuneList = buildNewFortunes(filteredExpectedFortuneList, commissionList, policyPaidFortuneList);
// List<Fortune> newFortuneList = new ArrayList<>();
// for (ExpectedFortune expectedFortune : filteredExpectedFortuneList) {
// Fortune fortune = new Fortune();
// BeanUtils.copyProperties(expectedFortune, fortune);
//
// fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
// fortune.setStatus(FortuneStatusEnum.WAIT.getItemValue());
// // 关联来佣业务ID
// matchCommission(fortune, commissionList);
// // 扣减已发薪资
// calculateCurrentFortune(fortune, policyPaidFortuneList);
//
// fortune.setCreateTime(new Date());
// fortune.setUpdateTime(new Date());
//
// newFortuneList.add(fortune);
// }
// 10. 保存发佣记录
saveNewFortunes(newFortuneList);
return true;
}
/**
* 保存新的发佣记录
*/
private void saveNewFortunes(List<Fortune> newFortuneList) {
if (CollectionUtils.isEmpty(newFortuneList)) {
throw new BusinessException(ResultCode.FAIL.getCode(), "没有可保存的发佣记录");
}
boolean saveSuccess = fortuneService.saveBatch(newFortuneList);
if (!saveSuccess) {
throw new BusinessException(ResultCode.FAIL.getCode(), "保存发佣记录失败");
}
}
/**
* 构建新的发佣记录
*/
private List<Fortune> buildNewFortunes(List<ExpectedFortune> filteredExpectedFortuneList,
List<Commission> commissionList,
List<Fortune> policyPaidFortuneList) {
// 构建来佣记录映射,用于快速查找
Map<String, Commission> commissionByPolicyPeriod = commissionList.stream()
.collect(Collectors.toMap(
commission -> buildPolicyPeriodKey(commission.getPolicyNo(), commission.getCommissionPeriod()),
Function.identity()
));
Date now = new Date();
return filteredExpectedFortuneList.stream()
.map(expectedFortune -> {
Fortune fortune = new Fortune();
BeanUtils.copyProperties(expectedFortune, fortune);
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setStatus(FortuneStatusEnum.WAIT.getItemValue());
// 关联来佣业务ID
matchCommission(fortune, commissionList);
String key = buildPolicyPeriodKey(expectedFortune.getPolicyNo(), expectedFortune.getFortunePeriod());
Commission matchedCommission = commissionByPolicyPeriod.get(key);
if (matchedCommission != null) {
fortune.setCommissionBizId(matchedCommission.getCommissionBizId());
} else {
fortune.setStatus(FortuneStatusEnum.MATCH_FAIL.getItemValue());
fortune.setRemark("未找到当前预计发佣对应的来佣");
}
// 扣减已发薪资
calculateCurrentFortune(fortune, policyPaidFortuneList);
fortune.setCreateTime(new Date());
fortune.setUpdateTime(new Date());
fortune.setCreateTime(now);
fortune.setUpdateTime(now);
newFortuneList.add(fortune);
}
// 8. 保存发佣记录
if (CollUtil.isNotEmpty(newFortuneList)) {
boolean saveSuccess = fortuneService.saveBatch(newFortuneList);
if (!saveSuccess) {
throw new BusinessException(ResultCode.FAIL.getCode(), "保存发佣记录失败");
}
return fortune;
})
.collect(Collectors.toList());
}
return true;
/**
* 构建保单号+期次的唯一键
*/
private String buildPolicyPeriodKey(String policyNo, Object period) {
return (policyNo == null ? "" : policyNo) + "|" + (period == null ? "" : period.toString());
}
private void calculateCurrentFortune(Fortune fortune, List<Fortune> policyPaidFortuneList) {
......
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