Commit 0707d9ed by jianan

新单跟进79

parent 632f1907
...@@ -9,6 +9,7 @@ public enum FortuneStatusEnum { ...@@ -9,6 +9,7 @@ public enum FortuneStatusEnum {
WAIT("待出账", "0"), WAIT("待出账", "0"),
CAN_SEND("可出账", "1"), CAN_SEND("可出账", "1"),
SENT("已出账", "2"), SENT("已出账", "2"),
MATCH_FAIL("未找到当前预计发佣对应的来佣", "3"),
; ;
//字典项标签(名称) //字典项标签(名称)
......
...@@ -31,6 +31,11 @@ public class Fortune implements Serializable { ...@@ -31,6 +31,11 @@ public class Fortune implements Serializable {
private String fortuneBizId; private String fortuneBizId;
/** /**
* 来佣保单业务id
*/
private String commissionBizId;
/**
* 保单号 * 保单号
*/ */
private String policyNo; private String policyNo;
......
...@@ -52,6 +52,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -52,6 +52,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
private PolicyService policyService; private PolicyService policyService;
@Resource @Resource
private CommissionExpectedService commissionExpectedService; private CommissionExpectedService commissionExpectedService;
@Resource
private IExpectedFortuneService iExpectedFortuneService;
@Override @Override
...@@ -141,66 +143,65 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -141,66 +143,65 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean generateFortune(GenerateFortuneRequest generateFortuneRequest) { public Boolean generateFortune(GenerateFortuneRequest generateFortuneRequest) {
List<String> commissionBizIdList = generateFortuneRequest.getCommissionBizIdList(); List<String> commissionBizIdList = generateFortuneRequest.getCommissionBizIdList();
// 1. 查询选中来佣记录
List<Commission> commissionList = this.list(new QueryWrapper<Commission>().in("commission_biz_id", commissionBizIdList)); List<Commission> commissionList = this.list(new QueryWrapper<Commission>().in("commission_biz_id", commissionBizIdList));
// 校验来佣记录状态
for (Commission commission : commissionList) {
if (StringUtils.equals(commission.getStatus(), CommissionStatusEnum.WAIT.getItemValue())) {
throw new BusinessException(ResultCode.FAIL.getCode(), "来佣记录为未比对,不能生成出帐");
}
}
// 获取所有保单号 // 获取所有保单号
Set<String> policyNoSet = commissionList.stream().map(Commission::getPolicyNo).collect(Collectors.toSet()); Set<String> policyNoSet = commissionList.stream().map(Commission::getPolicyNo).collect(Collectors.toSet());
// 根据保单号查询所有发佣记录 // 2. 查询对应的预计发佣记录
QueryWrapper<ExpectedFortune> expectedFortuneQueryWrapper = new QueryWrapper<ExpectedFortune>().in("policy_no", policyNoSet);
List<ExpectedFortune> expectedFortuneList = iExpectedFortuneService.list(expectedFortuneQueryWrapper);
if (CollectionUtils.isEmpty(expectedFortuneList)) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到该保单对应的预计发佣记录");
} else {
Set<String> expectedPolicyNoSet = expectedFortuneList.stream().map(ExpectedFortune::getPolicyNo).collect(Collectors.toSet());
// 获取没有预计发佣的保单号
Set<String> notExpectedPolicyNoSet = policyNoSet.stream().filter(policyNo -> !expectedPolicyNoSet.contains(policyNo)).collect(Collectors.toSet());
if (!CollectionUtils.isEmpty(notExpectedPolicyNoSet)) {
throw new BusinessException(ResultCode.FAIL.getCode(), "未找到以下保单对应的预计发佣记录:" + String.join(",", notExpectedPolicyNoSet));
}
}
// 3. 根据保单号查询所有发佣记录
List<Fortune> fortuneList = fortuneService.list(new QueryWrapper<Fortune>().in("policy_no", policyNoSet)); List<Fortune> fortuneList = fortuneService.list(new QueryWrapper<Fortune>().in("policy_no", policyNoSet));
// 校验,如果有"可发放或已发并关账"的发佣记录,不能重复生成 // 4. 校验,如果有"可发放或已发并关账"的发佣记录,不能重复生成
for (Fortune item : fortuneList) { for (Fortune item : fortuneList) {
if (StringUtils.equals(item.getStatus(), FortuneStatusEnum.CAN_SEND.getItemValue()) || if (StringUtils.equals(item.getStatus(), FortuneStatusEnum.CAN_SEND.getItemValue()) ||
StringUtils.equals(item.getStatus(), FortuneStatusEnum.SENT.getItemValue())) { StringUtils.equals(item.getStatus(), FortuneStatusEnum.SENT.getItemValue())) {
throw new BusinessException(ResultCode.FAIL.getCode(), "该来佣记录已有出帐,不能重复生成"); throw new BusinessException(ResultCode.FAIL.getCode(), "该来佣记录已有出帐,不能生成");
} }
} }
// 1.查询所有保单号对应的保单跟进记录 // 5. 筛出来佣对应的预计发佣记录
List<PolicyFollow> policyFollowListList = policyFollowService.list(new QueryWrapper<PolicyFollow>().in("policy_no", policyNoSet)); List<ExpectedFortune> filteredExpectedFortuneList = expectedFortuneList.stream()
.filter(expectedFortune -> commissionList.stream()
// 2.根据保单号查询所有转介人 .anyMatch(commission -> StringUtils.equals(commission.getPolicyNo(), expectedFortune.getPolicyNo())
List<PolicyBroker> brokerList = policyBrokerService.list(new QueryWrapper<PolicyBroker>().in("policy_no", policyNoSet)); && commission.getCommissionPeriod().equals(expectedFortune.getFortunePeriod())))
if (CollUtil.isEmpty(brokerList)) { .collect(Collectors.toList());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "该保单不存在转介人,请先配置转介人");
}
// 构建保单号到转介人的映射
Map<String, List<PolicyBroker>> brokerMap = brokerList.stream().collect(Collectors.groupingBy(PolicyBroker::getPolicyNo));
// 3.删除旧的发佣记录 // 6.删除旧的发佣记录
fortuneService.remove(new QueryWrapper<Fortune>().in("policy_no", policyNoSet)); fortuneService.remove(new QueryWrapper<Fortune>().in("policy_no", policyNoSet));
// 4. 构建发佣记录 // 7. 构建实际的初始发佣记录
List<Fortune> newFortuneList = new ArrayList<>(); List<Fortune> newFortuneList = new ArrayList<>();
for (PolicyFollow policyFollow : policyFollowListList) { for (ExpectedFortune expectedFortune : filteredExpectedFortuneList) {
String policyNo = policyFollow.getPolicyNo();
List<PolicyBroker> policyBrokers = brokerMap.get(policyNo);
if (CollectionUtils.isNotEmpty(policyBrokers)) {
for (PolicyBroker policyBroker : policyBrokers) {
for (Commission commission : commissionList) {
Fortune fortune = new Fortune(); Fortune fortune = new Fortune();
BeanUtils.copyProperties(expectedFortune, fortune);
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode())); fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setPolicyNo(policyNo);
fortune.setBroker(policyBroker.getBrokerName());
fortune.setStatus(FortuneStatusEnum.WAIT.getItemValue()); fortune.setStatus(FortuneStatusEnum.WAIT.getItemValue());
// 关联来佣业务ID
matchCommission(fortune, commissionList);
fortune.setCreateTime(new Date()); fortune.setCreateTime(new Date());
fortune.setUpdateTime(new Date()); fortune.setUpdateTime(new Date());
newFortuneList.add(fortune); newFortuneList.add(fortune);
} }
} // 8. 保存发佣记录
}
}
// 5. 保存发佣记录
if (CollUtil.isNotEmpty(newFortuneList)) { if (CollUtil.isNotEmpty(newFortuneList)) {
boolean saveSuccess = fortuneService.saveBatch(newFortuneList); boolean saveSuccess = fortuneService.saveBatch(newFortuneList);
if (!saveSuccess) { if (!saveSuccess) {
...@@ -210,6 +211,20 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -210,6 +211,20 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return true; return true;
} }
private void matchCommission(Fortune fortune, List<Commission> commissionList) {
for (Commission commission : commissionList) {
if (StringUtils.equals(commission.getPolicyNo(), fortune.getPolicyNo())
&& commission.getCommissionPeriod().equals(fortune.getFortunePeriod())
&& commission.getCommissionName().equals(fortune.getFortuneName())
) {
fortune.setCommissionBizId(commission.getCommissionBizId());
} else {
fortune.setStatus(FortuneStatusEnum.MATCH_FAIL.getItemValue());
fortune.setRemark("未找到当前预计发佣对应的来佣");
}
}
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean addCommission(CommissionAddRequest commissionAddRequest) { public Boolean addCommission(CommissionAddRequest commissionAddRequest) {
...@@ -301,10 +316,16 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -301,10 +316,16 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
public CommissionStatisticsVO getCommissionStatistics(List<Long> commissionIds) { public CommissionStatisticsVO getCommissionStatistics(List<Long> commissionIds) {
// 自定义统计数据 // 自定义统计数据
CommissionStatisticsVO commissionStatistics = baseMapper.getCommissionStatistics(commissionIds); CommissionStatisticsVO commissionStatistics = baseMapper.getCommissionStatistics(commissionIds);
BigDecimal totalAmount = commissionStatistics.getTotalAmount();
BigDecimal totalPaidAmount = commissionStatistics.getTotalPaidAmount();
// 计算待入账金额 // 计算待入账金额
commissionStatistics.setPendingPaidAmount(commissionStatistics.getTotalAmount().subtract(commissionStatistics.getTotalPaidAmount())); commissionStatistics.setPendingPaidAmount(totalAmount.subtract(totalPaidAmount));
// 计算已入账比例 // 计算已入账比例
BigDecimal divided = commissionStatistics.getTotalPaidAmount().divide(commissionStatistics.getTotalAmount(), 4, RoundingMode.HALF_UP); BigDecimal divided = BigDecimal.ZERO;
if (totalAmount.compareTo(BigDecimal.ZERO) > 0) {
divided = totalPaidAmount.divide(totalAmount, 4, RoundingMode.HALF_UP);
}
// 格式化 % // 格式化 %
commissionStatistics.setPaidAmountRatio(String.format("%.2f%%", divided.doubleValue() * 100)); commissionStatistics.setPaidAmountRatio(String.format("%.2f%%", divided.doubleValue() * 100));
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.Fortune"> <resultMap id="BaseResultMap" type="com.yd.csf.service.model.Fortune">
<id property="id" column="id" /> <id property="id" column="id" />
<result property="fortuneBizId" column="fortune_biz_id" /> <result property="fortuneBizId" column="fortune_biz_id" />
<result property="commissionBizId" column="commission_biz_id" />
<result property="policyNo" column="policy_no" /> <result property="policyNo" column="policy_no" />
<result property="fortunePeriod" column="fortune_period" /> <result property="fortunePeriod" column="fortune_period" />
<result property="fortuneTotalPeriod" column="fortune_total_period" /> <result property="fortuneTotalPeriod" column="fortune_total_period" />
...@@ -36,7 +37,7 @@ ...@@ -36,7 +37,7 @@
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id,fortune_biz_id,policy_no,fortune_period,fortune_total_period,broker_biz_id, id,fortune_biz_id,commission_biz_id,policy_no,fortune_period,fortune_total_period,broker_biz_id,
team_biz_id,grade_commission_rate,share_rate,fortune_name,fortune_type, team_biz_id,grade_commission_rate,share_rate,fortune_name,fortune_type,
amount,currency,status,payout_date,is_tax, amount,currency,status,payout_date,is_tax,
tax_amount,net_amount,salary_biz_id,base_rule_biz_id,settlement_biz_id, tax_amount,net_amount,salary_biz_id,base_rule_biz_id,settlement_biz_id,
......
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