Commit 9723692e by jianan

前端对接问题修复19

parent 13292b02
package com.yd.csf.service.component; package com.yd.csf.service.component;
import com.yd.common.exception.BusinessException;
import com.yd.csf.service.dto.CommissionExpectedAddDto; import com.yd.csf.service.dto.CommissionExpectedAddDto;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.core.ValueOperations;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -33,6 +35,10 @@ public class ReceivableService { ...@@ -33,6 +35,10 @@ public class ReceivableService {
} }
private String generateAdditionalReceivableNo(CommissionExpectedAddDto addDto) { private String generateAdditionalReceivableNo(CommissionExpectedAddDto addDto) {
String reconciliationCompanyCode = addDto.getReconciliationCompanyCode();
if (ObjectUtils.isEmpty(reconciliationCompanyCode)) {
throw new BusinessException("对账公司编码不能为空");
}
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
String dateStr = today.format(DATE_FORMATTER); String dateStr = today.format(DATE_FORMATTER);
...@@ -42,23 +48,11 @@ public class ReceivableService { ...@@ -42,23 +48,11 @@ public class ReceivableService {
// 格式:应收款类型-对账公司代码-年份后两位-席号(6位数字) // 格式:应收款类型-对账公司代码-年份后两位-席号(6位数字)
return String.format("%s%s%s%06d", return String.format("%s%s%s%06d",
"R".equals(addDto.getCommissionBizType()) ? "R-" : "U-", "R".equals(addDto.getCommissionBizType()) ? "R-" : "U-",
getCompanyCode(addDto), reconciliationCompanyCode,
dateStr.substring(2, 4), // 取年份后两位 dateStr.substring(2, 4), // 取年份后两位
dailySeq); dailySeq);
} }
public String getCompanyCode(CommissionExpectedAddDto addDto) {
if (StringUtils.isBlank(addDto.getReconciliationCompanyCode())) {
// 没有对账公司编码,使用自定义公司编码
// 取MD5前6位
String md5 = DigestUtils.md5Hex(addDto.getReconciliationCompany());
return "UNKNOWN_" + md5.substring(0, 6).toUpperCase();
} else {
// 有对账公司编码,使用对账公司编码
return addDto.getReconciliationCompanyCode();
}
}
private long getDailySequence() { private long getDailySequence() {
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
String redisKey = ADDITIONAL_NO_PREFIX + today.format(DATE_FORMATTER); String redisKey = ADDITIONAL_NO_PREFIX + today.format(DATE_FORMATTER);
......
...@@ -8,15 +8,9 @@ import java.math.BigDecimal; ...@@ -8,15 +8,9 @@ import java.math.BigDecimal;
@Data @Data
public class FortuneStatisticsVO { public class FortuneStatisticsVO {
/** /**
* 总出账金额 * 账金额
*/ */
@Schema(description = "总出账金额") @Schema(description = "入账金额")
private BigDecimal totalOutAmount;
/**
* 总入账金额
*/
@Schema(description = "总入账金额")
private BigDecimal totalInAmount; private BigDecimal totalInAmount;
/** /**
...@@ -24,4 +18,28 @@ public class FortuneStatisticsVO { ...@@ -24,4 +18,28 @@ public class FortuneStatisticsVO {
*/ */
@Schema(description = "总保单数") @Schema(description = "总保单数")
private Long totalPolicyCount; private Long totalPolicyCount;
/**
* 总保费
*/
@Schema(description = "总保费")
private BigDecimal totalPremium;
/**
* 待出账金额
*/
@Schema(description = "待出账金额")
private BigDecimal pendingOutAmount;
/**
* 可出账账金额
*/
@Schema(description = "可出账金额")
private BigDecimal availableOutAmount;
/**
* 差额
*/
@Schema(description = "差额(待出账金额 - 可出账金额)")
private BigDecimal differenceAmount;
} }
...@@ -124,6 +124,11 @@ public class Fortune implements Serializable { ...@@ -124,6 +124,11 @@ public class Fortune implements Serializable {
private String currency; private String currency;
/** /**
* 本次出账金额
*/
private BigDecimal currentPaymentAmount;
/**
* 佣金发放状态 0=待出账 1=可出账 2=已出账 * 佣金发放状态 0=待出账 1=可出账 2=已出账
*/ */
private String status; private String status;
......
...@@ -42,6 +42,7 @@ import javax.annotation.Resource; ...@@ -42,6 +42,7 @@ import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -234,33 +235,46 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -234,33 +235,46 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "预计入账列表不能为空"); throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "预计入账列表不能为空");
} }
// 查询保单信息 // 查询保单信息
String policyNo = addDtoList.get(0).getPolicyNo(); Set<String> policyNoSet = addDtoList.stream()
Policy policy = policyService.getOne(new QueryWrapper<Policy>().eq("policy_no", policyNo)); .map(CommissionExpectedAddDto::getPolicyNo)
.collect(Collectors.toSet());
List<Policy> policyList = policyService.lambdaQuery().in(Policy::getPolicyNo, policyNoSet).list();
// 保单映射
Map<String, Policy> policyMap = policyList.stream()
.collect(Collectors.toMap(Policy::getPolicyNo, Function.identity()));
List<CommissionExpected> addList = new ArrayList<>(); List<CommissionExpected> addList = new ArrayList<>();
List<CommissionExpected> updateList = new ArrayList<>(); List<CommissionExpected> updateList = new ArrayList<>();
for (CommissionExpectedAddDto addDto : addDtoList) { for (CommissionExpectedAddDto addDto : addDtoList) {
CommissionExpected commissionExpected = new CommissionExpected(); CommissionExpected commissionExpected = new CommissionExpected();
BeanUtils.copyProperties(addDto, commissionExpected); BeanUtils.copyProperties(addDto, commissionExpected);
// 初始值 // 校验参数
validCommissionExpected(commissionExpected, true);
// 结算汇率初始值为 1
commissionExpected.setDefaultExchangeRate(BigDecimal.valueOf(1)); commissionExpected.setDefaultExchangeRate(BigDecimal.valueOf(1));
// 如果币种不是港币,查询默认结算汇率 // 如果币种不是港币,查询默认结算汇率
if (!StringUtils.equalsIgnoreCase(addDto.getCurrency(), "HKD")) { if (!StringUtils.equalsIgnoreCase(addDto.getCurrency(), "HKD")) {
commissionExpected.setDefaultExchangeRate(queryDefaultExchangeRate(addDto.getCurrency())); commissionExpected.setDefaultExchangeRate(queryDefaultExchangeRate(addDto.getCurrency()));
} }
// 预计总金额 // 预计总金额
if (policy != null) { if ("R".equals(addDto.getCommissionBizType())) {
Policy policy = policyMap.get(addDto.getPolicyNo());
if (ObjectUtils.isEmpty(policy)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单号为" + addDto.getPolicyNo() + "的保单不存在");
}
BigDecimal expectedAmount = policy.getPaymentPremium() BigDecimal expectedAmount = policy.getPaymentPremium()
.multiply(commissionExpected.getCommissionRatio()) .multiply(commissionExpected.getCommissionRatio())
.multiply(commissionExpected.getDefaultExchangeRate()) .multiply(commissionExpected.getDefaultExchangeRate())
.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP); .divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP);
commissionExpected.setExpectedAmount(expectedAmount); commissionExpected.setExpectedAmount(expectedAmount);
// 设置关联字段
commissionExpected.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
commissionExpected.setProductLaunchBizId(policy.getProductLaunchBizId());
} else {
commissionExpected.setExpectedAmount(addDto.getAmount());
} }
// 校验参数
validCommissionExpected(commissionExpected, true);
if (StringUtils.isBlank(addDto.getCommissionExpectedBizId())) { if (StringUtils.isBlank(addDto.getCommissionExpectedBizId())) {
// 生成应收账款编号 // 生成应收账款编号
commissionExpected.setReceivableNo(receivableService.generateReceivableNo(addDto.getCommissionBizType(), addDto.getReconciliationCompanyCode(), addDto.getReconciliationCompany())); commissionExpected.setReceivableNo(receivableService.generateReceivableNo(addDto.getCommissionBizType(), addDto.getReconciliationCompanyCode(), addDto.getReconciliationCompany()));
......
...@@ -372,13 +372,19 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune> ...@@ -372,13 +372,19 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
public FortuneStatisticsVO getFortuneStatistics(List<Long> fortuneIdList) { public FortuneStatisticsVO getFortuneStatistics(List<Long> fortuneIdList) {
if (CollectionUtils.isEmpty(fortuneIdList)) { if (CollectionUtils.isEmpty(fortuneIdList)) {
FortuneStatisticsVO fortuneStatisticsVO = new FortuneStatisticsVO(); FortuneStatisticsVO fortuneStatisticsVO = new FortuneStatisticsVO();
fortuneStatisticsVO.setTotalOutAmount(BigDecimal.ZERO);
fortuneStatisticsVO.setTotalInAmount(BigDecimal.ZERO); fortuneStatisticsVO.setTotalInAmount(BigDecimal.ZERO);
fortuneStatisticsVO.setTotalPolicyCount(0L); fortuneStatisticsVO.setTotalPolicyCount(0L);
fortuneStatisticsVO.setTotalPremium(BigDecimal.ZERO);
fortuneStatisticsVO.setPendingOutAmount(BigDecimal.ZERO);
fortuneStatisticsVO.setAvailableOutAmount(BigDecimal.ZERO);
fortuneStatisticsVO.setDifferenceAmount(BigDecimal.ZERO);
return fortuneStatisticsVO; return fortuneStatisticsVO;
} }
// 自定义查询 // 自定义查询
return this.baseMapper.getFortuneStatistics(fortuneIdList); FortuneStatisticsVO fortuneStatistics = this.baseMapper.getFortuneStatistics(fortuneIdList);
// 计算差额
fortuneStatistics.setDifferenceAmount(fortuneStatistics.getPendingOutAmount().subtract(fortuneStatistics.getAvailableOutAmount()));
return fortuneStatistics;
} }
@Override @Override
......
...@@ -101,10 +101,10 @@ public class CommissionExpectedVO implements Serializable { ...@@ -101,10 +101,10 @@ public class CommissionExpectedVO implements Serializable {
private BigDecimal commissionRatio; private BigDecimal commissionRatio;
/** /**
* 来佣比例 (%) * 预计入账金额
*/ */
@Schema(description = "来佣比例 (%)") @Schema(description = "预计入账金额 HKD(如果不关联保单,就没有预计入账比例了,此时记录预计入账金额)")
private BigDecimal ratio; private BigDecimal amount;
/** /**
* 来佣币种 * 来佣币种
...@@ -207,7 +207,6 @@ public class CommissionExpectedVO implements Serializable { ...@@ -207,7 +207,6 @@ public class CommissionExpectedVO implements Serializable {
} }
CommissionExpectedVO commissionVO = new CommissionExpectedVO(); CommissionExpectedVO commissionVO = new CommissionExpectedVO();
BeanUtils.copyProperties(commissionExpected, commissionVO); BeanUtils.copyProperties(commissionExpected, commissionVO);
commissionVO.setRatio(commissionExpected.getCommissionRatio());
return commissionVO; return commissionVO;
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
<result property="fortuneType" column="fortune_type" /> <result property="fortuneType" column="fortune_type" />
<result property="amount" column="amount" /> <result property="amount" column="amount" />
<result property="currency" column="currency" /> <result property="currency" column="currency" />
<result property="currentPaymentAmount" column="current_payment_amount" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="payoutDate" column="payout_date" /> <result property="payoutDate" column="payout_date" />
<result property="isTax" column="is_tax" /> <result property="isTax" column="is_tax" />
...@@ -45,7 +46,7 @@ ...@@ -45,7 +46,7 @@
id,fortune_biz_id,expected_fortune_biz_id,reconciliation_year_month,fortune_biz_type,batch_biz_id, id,fortune_biz_id,expected_fortune_biz_id,reconciliation_year_month,fortune_biz_type,batch_biz_id,
commission_biz_id,policy_no,fortune_period,fortune_total_period,broker_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,is_part, team_biz_id,grade_commission_rate,share_rate,fortune_name,fortune_type,is_part,
amount,currency,status,payout_date,is_tax, amount,currency,current_payment_amount,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,
calculation_formula,remark,is_deleted,creator_id,updater_id, calculation_formula,remark,is_deleted,creator_id,updater_id,
create_time,update_time create_time,update_time
...@@ -53,17 +54,20 @@ ...@@ -53,17 +54,20 @@
<select id="getFortuneStatistics" resultType="com.yd.csf.service.dto.FortuneStatisticsVO"> <select id="getFortuneStatistics" resultType="com.yd.csf.service.dto.FortuneStatisticsVO">
select select
ifnull(f.amount,0) as totalOutAmount, ifnull(sum(f.amount),0) as pendingOutAmount,
ifnull(c.amount,0) as totalInAmount, ifnull(sum(c.amount),0) as totalInAmount,
count(distinct f.policy_no) as totalPolicyCount count(distinct f.policy_no) as totalPolicyCount,
ifnull(sum(c.premium),0) as totalPremium,
ifnull(sum(f.current_payment_amount),0) as availableOutAmount
from fortune f from fortune f
left join commission c on f.commission_biz_id = c.commission_biz_id left join commission c on f.commission_biz_id = c.commission_biz_id
where where
<if test="fortuneIdList != null and fortuneIdList.size() > 0"> <if test="fortuneIdList != null and fortuneIdList.size() > 0">
f.id in f.id in
<foreach collection="fortuneIdList" item="fortuneId" open="(" close=")" separator=","> <foreach collection="fortuneIdList" item="fortuneId" open="(" close=")" separator=",">
#{fortuneId} #{fortuneId}
</foreach> </foreach>
</if> </if>
</select> </select>
</mapper> </mapper>
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