Commit 0707d9ed by jianan

新单跟进79

parent 632f1907
......@@ -9,6 +9,7 @@ public enum FortuneStatusEnum {
WAIT("待出账", "0"),
CAN_SEND("可出账", "1"),
SENT("已出账", "2"),
MATCH_FAIL("未找到当前预计发佣对应的来佣", "3"),
;
//字典项标签(名称)
......
......@@ -31,6 +31,11 @@ public class Fortune implements Serializable {
private String fortuneBizId;
/**
* 来佣保单业务id
*/
private String commissionBizId;
/**
* 保单号
*/
private String policyNo;
......
......@@ -52,6 +52,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
private PolicyService policyService;
@Resource
private CommissionExpectedService commissionExpectedService;
@Resource
private IExpectedFortuneService iExpectedFortuneService;
@Override
......@@ -141,66 +143,65 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
@Transactional(rollbackFor = Exception.class)
public Boolean generateFortune(GenerateFortuneRequest generateFortuneRequest) {
List<String> commissionBizIdList = generateFortuneRequest.getCommissionBizIdList();
// 1. 查询选中来佣记录
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());
// 根据保单号查询所有发佣记录
// 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));
// 校验,如果有"可发放或已发并关账"的发佣记录,不能重复生成
// 4. 校验,如果有"可发放或已发并关账"的发佣记录,不能重复生成
for (Fortune item : fortuneList) {
if (StringUtils.equals(item.getStatus(), FortuneStatusEnum.CAN_SEND.getItemValue()) ||
StringUtils.equals(item.getStatus(), FortuneStatusEnum.SENT.getItemValue())) {
throw new BusinessException(ResultCode.FAIL.getCode(), "该来佣记录已有出帐,不能重复生成");
throw new BusinessException(ResultCode.FAIL.getCode(), "该来佣记录已有出帐,不能生成");
}
}
// 1.查询所有保单号对应的保单跟进记录
List<PolicyFollow> policyFollowListList = policyFollowService.list(new QueryWrapper<PolicyFollow>().in("policy_no", policyNoSet));
// 2.根据保单号查询所有转介人
List<PolicyBroker> brokerList = policyBrokerService.list(new QueryWrapper<PolicyBroker>().in("policy_no", policyNoSet));
if (CollUtil.isEmpty(brokerList)) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "该保单不存在转介人,请先配置转介人");
}
// 构建保单号到转介人的映射
Map<String, List<PolicyBroker>> brokerMap = brokerList.stream().collect(Collectors.groupingBy(PolicyBroker::getPolicyNo));
// 5. 筛出来佣对应的预计发佣记录
List<ExpectedFortune> filteredExpectedFortuneList = expectedFortuneList.stream()
.filter(expectedFortune -> commissionList.stream()
.anyMatch(commission -> StringUtils.equals(commission.getPolicyNo(), expectedFortune.getPolicyNo())
&& commission.getCommissionPeriod().equals(expectedFortune.getFortunePeriod())))
.collect(Collectors.toList());
// 3.删除旧的发佣记录
// 6.删除旧的发佣记录
fortuneService.remove(new QueryWrapper<Fortune>().in("policy_no", policyNoSet));
// 4. 构建发佣记录
// 7. 构建实际的初始发佣记录
List<Fortune> newFortuneList = new ArrayList<>();
for (PolicyFollow policyFollow : policyFollowListList) {
String policyNo = policyFollow.getPolicyNo();
List<PolicyBroker> policyBrokers = brokerMap.get(policyNo);
if (CollectionUtils.isNotEmpty(policyBrokers)) {
for (PolicyBroker policyBroker : policyBrokers) {
for (Commission commission : commissionList) {
for (ExpectedFortune expectedFortune : filteredExpectedFortuneList) {
Fortune fortune = new Fortune();
BeanUtils.copyProperties(expectedFortune, fortune);
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setPolicyNo(policyNo);
fortune.setBroker(policyBroker.getBrokerName());
fortune.setStatus(FortuneStatusEnum.WAIT.getItemValue());
// 关联来佣业务ID
matchCommission(fortune, commissionList);
fortune.setCreateTime(new Date());
fortune.setUpdateTime(new Date());
newFortuneList.add(fortune);
}
}
}
}
// 5. 保存发佣记录
// 8. 保存发佣记录
if (CollUtil.isNotEmpty(newFortuneList)) {
boolean saveSuccess = fortuneService.saveBatch(newFortuneList);
if (!saveSuccess) {
......@@ -210,6 +211,20 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
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
@Transactional(rollbackFor = Exception.class)
public Boolean addCommission(CommissionAddRequest commissionAddRequest) {
......@@ -301,10 +316,16 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
public CommissionStatisticsVO getCommissionStatistics(List<Long> 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));
......
......@@ -7,6 +7,7 @@
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.Fortune">
<id property="id" column="id" />
<result property="fortuneBizId" column="fortune_biz_id" />
<result property="commissionBizId" column="commission_biz_id" />
<result property="policyNo" column="policy_no" />
<result property="fortunePeriod" column="fortune_period" />
<result property="fortuneTotalPeriod" column="fortune_total_period" />
......@@ -36,7 +37,7 @@
</resultMap>
<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,
amount,currency,status,payout_date,is_tax,
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