Commit 9137b722 by zhangxingmin

Merge remote-tracking branch 'origin/test' into test

parents 892015bd dc3fd6ff
......@@ -192,14 +192,15 @@ public class ApiCommissionController {
// errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行存在空字段");
// }
if (excelDTO.getAmount2() == null) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行, 来佣金额不能为空");
}
if ("关联保单应收单".equals(excelDTO.getCommissionBizType())) {
if (StringUtils.isBlank(excelDTO.getPolicyNo())) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行关联保单应收单, 保单号不能为空");
}
if (excelDTO.getAmount2() == null) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行关联保单应收单, 来佣金额不能为空");
}
if (StringUtils.isBlank(excelDTO.getExchangeRate2())) {
if (ObjectUtils.isEmpty(excelDTO.getExchangeRate2())) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行关联保单应收单, 结算汇率不能为空");
}
}
......@@ -222,7 +223,7 @@ public class ApiCommissionController {
entities.add(entity);
}
// 补充完整字段
// 补充关联字段、计算本次入账比例
commissionService.fillCommissionList(entities);
return entities;
......@@ -282,7 +283,7 @@ public class ApiCommissionController {
* @param request
* @return
*/
@Operation(summary = "同步到预计来佣")
@Operation(summary = "同步到预计来佣(比对状态自动为已比对成功)")
@PostMapping("/addToExpected")
public Result<Boolean> addToExpected(@RequestBody AddToExpectedCommissionRequest addToExpectedCommissionRequest, HttpServletRequest request) {
if (StringUtils.isBlank(addToExpectedCommissionRequest.getCommissionBizId())) {
......
package com.yd.csf.api.dto;
import cn.hutool.core.convert.Convert;
import com.alibaba.excel.annotation.ExcelProperty;
import com.yd.common.enums.CommonEnum;
import com.yd.common.utils.RandomStringGenerator;
......@@ -10,6 +11,7 @@ import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
@Data
......@@ -72,7 +74,7 @@ public class CommissionExcelDTO {
private String commissionName2;
@ExcelProperty("结算汇率(实)")
private String exchangeRate2;
private BigDecimal exchangeRate2;
/**
......@@ -85,13 +87,14 @@ public class CommissionExcelDTO {
if (StringUtils.isNotBlank(commissionBizType)) {
entity.setCommissionBizType("R".equals(commissionBizType) || "关联保单应收单".equalsIgnoreCase(commissionBizType) ? "R" : "U");
}
entity.setPolicyNo(data.getPolicyNo2());
entity.setPolicyNo("U".equals(entity.getCommissionBizType()) ? null : data.getPolicyNo2());
entity.setCommissionPeriod(data.getCommissionPeriod2());
entity.setCommissionName(data.getCommissionName2());
entity.setAmount(data.getAmount2());
entity.setCurrency(CurrencyEnum.getEnumByItemLabel(data.getCurrency2()));
entity.setExchangeRate(data.getExchangeRate2());
entity.setCommissionDate(data.getCommissionDate2());
entity.setHkdAmount(data.getAmount2().multiply(data.getExchangeRate2()));
entity.setRemark(data.getRemark());
entity.setStatus(null);
entity.setCreatorId(loginUserId);
......@@ -117,7 +120,7 @@ public class CommissionExcelDTO {
entity.setCommissionName(data.getCommissionName());
entity.setAmount(data.getAmount());
entity.setCurrency(data.getCurrency());
entity.setExchangeRate(data.getExchangeRate());
entity.setExchangeRate(Convert.toBigDecimal(data.getExchangeRate()));
entity.setCommissionDate(data.getCommissionDate());
entity.setRemark(data.getRemark());
entity.setStatus(null);
......
......@@ -26,6 +26,7 @@ import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
......@@ -38,14 +39,14 @@ public class CommissionAsyncService {
@Resource
private CommissionCompareRecordService commissionCompareRecordService;
// @Async("commonAsyncExecutor")
// @Async("commonAsyncExecutor")
@Transactional(rollbackFor = Exception.class)
public void commissionCompareBatch(List<Commission> entities) {
// 根据是否保单号,来区分比对方式
// 根据是否关联保单号,来区分比对方式
List<Commission> hasPolicyNoList = new ArrayList<>();
List<Commission> noPolicyNoList = new ArrayList<>();
for (Commission entity : entities) {
if (StringUtils.isBlank(entity.getPolicyNo())) {
if ("U".equals(entity.getCommissionBizType())) {
noPolicyNoList.add(entity);
} else {
hasPolicyNoList.add(entity);
......@@ -61,6 +62,7 @@ public class CommissionAsyncService {
/**
* 无保单号的来佣比对
*
* @param noPolicyNoList
*/
private void noPolicyNoBatch(List<Commission> noPolicyNoList) {
......@@ -68,6 +70,9 @@ public class CommissionAsyncService {
List<String> receivableNoList = noPolicyNoList.stream()
.map(Commission::getReceivableNo)
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(receivableNoList)) {
throw new BusinessException(ResultCode.FAIL.getCode(), "非关联保单号应收单,应收款编号不能为空");
}
// 2.根据应收款编号查询预计来佣
List<CommissionExpected> expectedList = commissionExpectedService.lambdaQuery()
.in(CommissionExpected::getReceivableNo, receivableNoList)
......@@ -132,35 +137,29 @@ public class CommissionAsyncService {
}
private void normalBatch(List<Commission> entities) {
// 1.根据导入的来佣获取保单号集合
List<String> policyNoList = entities.stream()
.map(Commission::getPolicyNo)
// 1.需要比对的预计来佣业务id集合
List<String> commissionExpectedBizIdList = entities.stream()
.map(Commission::getCommissionExpectedBizId)
.collect(Collectors.toList());
// 2.根据保单号查询已存在的来佣记录
// 2.根据预计来佣业务id查询已存在的来佣记录
List<Commission> existingCommissions = commissionService.lambdaQuery()
.in(Commission::getPolicyNo, policyNoList)
.in(Commission::getCommissionExpectedBizId, commissionExpectedBizIdList)
.list();
// 来佣根据 保单号、来佣名称、来佣周期、货币 进行分组
// commission 根据关联的 commission_expected_biz_id 进行分组
Map<String, List<Commission>> commissionMap = existingCommissions.stream()
.collect(Collectors.groupingBy(
c -> c.getPolicyNo() + c.getCommissionName() + c.getCommissionPeriod() + c.getCurrency()
));
.filter(commission -> commission.getCommissionExpectedBizId() != null)
.collect(Collectors.groupingBy(Commission::getCommissionExpectedBizId));
// 3.根据保单号查询预计来佣
List<CommissionExpected> expectedList = commissionExpectedService.lambdaQuery()
.in(CommissionExpected::getPolicyNo, policyNoList)
.in(CommissionExpected::getCommissionExpectedBizId, commissionExpectedBizIdList)
.list();
// 预计来佣根据 保单号、来佣名称、来佣周期、货币 进行映射
// 预计来佣映射
Map<String, CommissionExpected> expectedMap = expectedList.stream()
.collect(Collectors.toMap(
commissionExpected -> commissionExpected.getPolicyNo() + commissionExpected.getCommissionName() + commissionExpected.getCommissionPeriod() + commissionExpected.getCurrency(),
commissionExpected -> commissionExpected
));
.collect(Collectors.toMap(CommissionExpected::getCommissionExpectedBizId, Function.identity()));
// 4.遍历预计来佣,进行比对
for (Map.Entry<String, CommissionExpected> entry : expectedMap.entrySet()) {
// 根据 保单号、来佣名称、来佣周期、货币 分组
String key = entry.getKey();
CommissionExpected commissionExpected = entry.getValue();
// 从已存在的来佣记录中获取当前来佣记录
......@@ -172,7 +171,7 @@ public class CommissionAsyncService {
private void doCompareBatch(CommissionExpected commissionExpected, List<Commission> existingCommissions) {
// 校验参数
boolean validFlag = false;
boolean validFlag = false;
for (Commission existingCommission : existingCommissions) {
Integer commissionTotalPeriod = existingCommission.getTotalPeriod();
Integer expectedTotalPeriod = commissionExpected.getTotalPeriod();
......@@ -194,12 +193,7 @@ public class CommissionAsyncService {
BigDecimal paidRatio = BigDecimal.ZERO;
BigDecimal paidAmount = BigDecimal.ZERO;
for (Commission item : existingCommissions) {
if (item.getCurrentCommissionRatio() == null) {
log.warn("当前来佣比例为空,临时计算当前来佣比例: commission_id={}", item.getId());
paidRatio = paidRatio.add(item.calculateCurrentPaidRatio());
} else {
paidRatio = paidRatio.add(item.getCurrentCommissionRatio());
}
paidRatio = paidRatio.add(item.getCurrentCommissionRatio());
paidAmount = paidAmount.add(item.getHkdAmount());
}
......@@ -217,6 +211,8 @@ public class CommissionAsyncService {
List<CommissionCompareRecord> compareRecords = new ArrayList<>();
// 计算比对状态
log.info("paidRatio: {}, commissionExpected.getCommissionRatio(): {}", paidRatio, commissionExpected.getCommissionRatio());
log.info("commissionExpected_id: {}", commissionExpected.getId());
if (paidRatio.compareTo(commissionExpected.getCommissionRatio()) == 0) {
// 等于预计比例时,所有来佣设置为比对成功
for (Commission existingCommission : existingCommissions) {
......@@ -263,10 +259,15 @@ public class CommissionAsyncService {
public void commissionCompare(Commission commission) {
log.info("开始执行比对事务,来佣ID: {}", commission.getCommissionBizId());
if (StringUtils.isNotBlank(commission.getPolicyNo())) {
// 未查询到预计来佣,需要先同步到预计来佣表
if (CommissionStatusEnum.MATCH_FAILED.getItemValue().equals(commission.getStatus())) {
return;
}
if ("R".equals(commission.getCommissionBizType())) {
normalCommission(commission.getCommissionBizId(), commission.getPolicyNo(), commission.getCommissionName(), commission.getCommissionPeriod(), commission.getCurrency(), commission.getPremium());
} else {
// 无保单号,根据来佣名称、对账公司查询来佣记录
// 非关联保单号应收单,根据来佣名称、对账公司查询来佣记录
noPolicyNoCommission(commission);
}
}
......@@ -281,6 +282,7 @@ public class CommissionAsyncService {
// 1.根据来佣名称、对账公司查询预计来佣
QueryWrapper<CommissionExpected> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("reconciliation_company", commission.getReconciliationCompany());
queryWrapper.eq("commission_period", commission.getCommissionPeriod());
queryWrapper.eq("commission_name", commission.getCommissionName());
List<CommissionExpected> expectedList = commissionExpectedService.list(queryWrapper);
if (expectedList.size() != 1) {
......@@ -332,8 +334,7 @@ public class CommissionAsyncService {
List<Commission> existingCommissions = commissionService.list(new QueryWrapper<Commission>()
.eq("policy_no", policyNo)
.eq("commission_name", commissionName)
.eq("commission_period", commissionPeriod)
.eq("currency", currency));
.eq("commission_period", commissionPeriod));
// 当前 commission 记录
Commission commission = existingCommissions.stream()
......@@ -345,12 +346,7 @@ public class CommissionAsyncService {
}
// 查询对应预计来佣
CommissionExpected commissionExpected = commissionService.queryByCommission(
commission.getPolicyNo(),
commission.getCommissionName(),
commission.getCommissionPeriod(),
commission.getCurrency(),
premium);
CommissionExpected commissionExpected = commissionExpectedService.getByBizId(commission.getCommissionExpectedBizId());
doCompare(existingCommissions, commissionExpected, commission);
}
......@@ -359,6 +355,7 @@ public class CommissionAsyncService {
// 校验参数
if (commission.getTotalPeriod().compareTo(commissionExpected.getTotalPeriod()) != 0) {
commission.setRemark("来佣总期数与预计来佣总期数不一致");
commission.setStatus(CommissionStatusEnum.COMPARE_FAIL.getItemValue());
commissionService.updateById(commission);
return;
}
......
......@@ -78,7 +78,7 @@ public class CommissionAddRequest implements Serializable {
* 结算汇率
*/
@Schema(description = "结算汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private String exchangeRate;
private BigDecimal exchangeRate;
/**
* 入账日(实)
......
......@@ -111,7 +111,7 @@ public class Commission implements Serializable {
/**
* 结算汇率
*/
private String exchangeRate;
private BigDecimal exchangeRate;
/**
* 来佣金额(港币)
......@@ -129,7 +129,7 @@ public class Commission implements Serializable {
private Date commissionDate;
/**
* 来佣状态 0=未比对 1=比对成功 2=比对失败
* 来佣状态 0=未比对 1=比对成功 2=比对失败 3=未查询到预计来佣,需要先同步到预计来佣表
*/
private String status;
......@@ -180,7 +180,7 @@ public class Commission implements Serializable {
public BigDecimal calculateCurrentPaidRatio() {
// 当前来佣比例=当前入账金额/结算汇率/保费 * 100
return amount.divide(new BigDecimal(premium), 4, RoundingMode.HALF_UP)
.divide(new BigDecimal(exchangeRate), 4, RoundingMode.HALF_UP)
.divide(exchangeRate, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
}
}
\ No newline at end of file
......@@ -40,8 +40,6 @@ public interface CommissionService extends IService<Commission> {
CommissionStatisticsVO getCommissionStatistics(List<Long> commissionIds);
CommissionExpected queryByCommission(String policyNo, String commissionName, Integer commissionPeriod, String currency, String premium);
void validateCommissionUpdateRequest(CommissionUpdateRequest commissionUpdateRequest);
void saveUpdateCommissionRecord(Commission commission, CommissionUpdateRequest commissionUpdateRequest, AuthUserDto currentLoginUser);
......
......@@ -125,7 +125,7 @@ public class CommissionVO implements Serializable {
* 当前结算汇率
*/
@Schema(description = "当前结算汇率")
private String exchangeRate;
private BigDecimal exchangeRate;
/**
* 来佣金额
......
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