Commit 7cdefb4e by zhangxingmin

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

parents e298b547 95a072fa
......@@ -298,8 +298,8 @@ public class ApiCommissionController {
@PostMapping("/compare/records")
@Operation(summary = "来佣比对记录列表", description = "可根据实际来佣业务id、预计来佣业务id,查询来佣比对记录")
public Result<Page<CommissionCompareRecord>> getCommissionCompareRecords(@RequestBody CommissionCompareRecordQueryRequest queryRequest) {
if (StringUtils.isBlank(queryRequest.getCommissionBizId())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "commissionBizId不能为空");
if (StringUtils.isBlank(queryRequest.getCommissionBizId()) && StringUtils.isBlank(queryRequest.getCommissionExpectedBizId())) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), "commissionBizId、commissionExpectedBizId不能同时为空");
}
// 查询来佣比对记录
QueryWrapper<CommissionCompareRecord> queryWrapper = new QueryWrapper<CommissionCompareRecord>();
......
......@@ -119,6 +119,7 @@ public class CommissionAsyncService {
// 预计来佣设置为部分来佣
commissionExpectedService.lambdaUpdate()
.set(CommissionExpected::getStatus, CommissionExpectedStatusEnum.PARTIAL.getItemValue())
.set(CommissionExpected::getPaidAmount, actualAmount)
.eq(CommissionExpected::getId, commissionExpected.getId())
.update();
// 来佣比对失败
......@@ -244,6 +245,8 @@ public class CommissionAsyncService {
// 对应预计来佣设置为部分来佣
commissionExpectedService.lambdaUpdate()
.set(CommissionExpected::getStatus, CommissionExpectedStatusEnum.PARTIAL.getItemValue())
.set(CommissionExpected::getPaidAmount, paidAmount)
.set(CommissionExpected::getPaidRatio, paidRatio)
.eq(CommissionExpected::getId, commissionExpected.getId())
.update();
// 更新已比对来佣记录
......@@ -321,6 +324,7 @@ public class CommissionAsyncService {
// 预计来佣设置为部分来佣
commissionExpectedService.lambdaUpdate()
.set(CommissionExpected::getStatus, CommissionExpectedStatusEnum.PARTIAL.getItemValue())
.set(CommissionExpected::getPaidAmount, commission.getAmount())
.eq(CommissionExpected::getId, commissionExpected.getId())
.update();
// 保存比对记录
......@@ -409,6 +413,8 @@ public class CommissionAsyncService {
// 预计来佣设置为部分来佣
commissionExpectedService.lambdaUpdate()
.set(CommissionExpected::getStatus, CommissionExpectedStatusEnum.PARTIAL.getItemValue())
.set(CommissionExpected::getPaidAmount, paidAmount)
.set(CommissionExpected::getPaidRatio, paidRatio)
.eq(CommissionExpected::getId, commissionExpected.getId())
.update();
// 保存比对记录
......
......@@ -19,6 +19,12 @@ public class CommissionExpectedUpdateRequest implements Serializable {
private String commissionExpectedBizId;
/**
* 佣金业务类型
*/
@Schema(description = "佣金业务类型")
private String commissionBizType;
/**
* 入账状态
*/
@Schema(description = "入账状态 字典值: csf_expected_commission_status")
......
......@@ -177,10 +177,11 @@ public class Commission implements Serializable {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
public BigDecimal calculateCurrentPaidRatio() {
// 当前来佣比例=当前入账金额/结算汇率/保费 * 100
return amount.divide(new BigDecimal(premium), 4, RoundingMode.HALF_UP)
.divide(exchangeRate, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
}
// public BigDecimal calculateCurrentPaidRatio() {
// // 当前来佣比例=当前入账金额/结算汇率/保费 * 100
// return amount.divide(new BigDecimal(premium), 4, RoundingMode.HALF_UP)
// .divide(exchangeRate, 4, RoundingMode.HALF_UP)
// .multiply(new BigDecimal(100));
// }
}
\ No newline at end of file
......@@ -115,6 +115,9 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (ObjectUtils.isEmpty(commissionBizType)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "应收款类型不能为空");
}
if (ObjectUtils.isEmpty(commissionExpected.getCommissionName())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "应收款名称不能为空");
}
if ("R".equals(commissionBizType)) {
// 关联保单应收单,保单号不能为空
String policyNo = commissionExpected.getPolicyNo();
......@@ -129,6 +132,9 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (ObjectUtils.isEmpty(commissionRatio)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "入账比例不能为空");
}
if (StringUtils.isBlank(commissionExpected.getCurrency())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "入账币种不能为空");
}
Integer commissionPeriod = commissionExpected.getCommissionPeriod();
if (ObjectUtils.isEmpty(commissionPeriod)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "佣金期数不能为空");
......@@ -268,10 +274,9 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
validCommissionExpected(commissionExpected, true);
// 结算汇率初始值为 1
commissionExpected.setDefaultExchangeRate(BigDecimal.valueOf(1));
// 如果币种不是港币,查询默认结算汇率
if (!StringUtils.equalsIgnoreCase(addDto.getCurrency(), "HKD")) {
// 查询默认结算汇率
commissionExpected.setDefaultExchangeRate(queryDefaultExchangeRate(addDto.getCurrency()));
}
// 预计总金额
if ("R".equals(addDto.getCommissionBizType())) {
Policy policy = policyMap.get(addDto.getPolicyNo());
......@@ -289,8 +294,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
commissionExpected.setProductLaunchBizId(policy.getProductLaunchBizId());
} else {
BigDecimal expectedAmount = addDto.getAmount()
.multiply(commissionExpected.getDefaultExchangeRate())
.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP);
.multiply(commissionExpected.getDefaultExchangeRate());
commissionExpected.setExpectedAmount(expectedAmount);
}
......@@ -383,26 +387,39 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (commissionExpected == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计入账不存在");
}
if (commissionExpected.getCommissionRatio() == null) {
commissionExpected.setCommissionRatio(commissionExpectedUpdateRequest.getCommissionRatio());
}
// 校验数据
validCommissionExpected(commissionExpected, false);
// 转换为实体类
BeanUtils.copyProperties(commissionExpectedUpdateRequest, commissionExpected);
// 如果修改了币种,需要更新默认结算汇率、预计入账金额
if (StringUtils.isNotBlank(commissionExpectedUpdateRequest.getCurrency()) && !StringUtils.equalsIgnoreCase(commissionExpectedUpdateRequest.getCurrency(), commissionExpected.getCurrency())) {
BeanUtils.copyProperties(commissionExpectedUpdateRequest, commissionExpected, "id", "commissionBizId");
// 更新默认结算汇率
commissionExpected.setDefaultExchangeRate(queryDefaultExchangeRate(commissionExpectedUpdateRequest.getCurrency()));
commissionExpected.setExpectedAmount(commissionExpectedUpdateRequest.getAmount().multiply(commissionExpected.getDefaultExchangeRate()));
}
// 如果修改了金额,需要更新预计入账金额
if (ObjectUtils.isNotEmpty(commissionExpectedUpdateRequest.getAmount()) && ObjectUtils.notEqual(commissionExpectedUpdateRequest.getAmount(), commissionExpected.getAmount())) {
commissionExpected.setExpectedAmount(commissionExpectedUpdateRequest.getAmount().multiply(commissionExpected.getDefaultExchangeRate()));
// 更新预计入账金额
if ("R".equals(commissionExpectedUpdateRequest.getCommissionBizType())) {
// 查询保单
Policy policy = policyService.queryOne(commissionExpected.getPolicyNo());
if (policy == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "保单不存在");
}
commissionExpected.setExpectedAmount(
policy.getPaymentPremium()
.multiply(commissionExpectedUpdateRequest.getCommissionRatio())
.multiply(commissionExpected.getDefaultExchangeRate())
.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP)
);
} else {
commissionExpected.setExpectedAmount(
commissionExpectedUpdateRequest.getAmount()
.multiply(commissionExpected.getDefaultExchangeRate())
);
}
// 如果修改了默认结算汇率,需要更新预计入账金额
if (ObjectUtils.isNotEmpty(commissionExpectedUpdateRequest.getDefaultExchangeRate()) && ObjectUtils.notEqual(commissionExpectedUpdateRequest.getDefaultExchangeRate(), commissionExpected.getDefaultExchangeRate())) {
commissionExpected.setExpectedAmount(commissionExpectedUpdateRequest.getAmount().multiply(commissionExpected.getDefaultExchangeRate()));
if (StringUtils.isBlank(commissionExpected.getReceivableNo())) {
commissionExpected.setReceivableNo(receivableService.generateReceivableNo(
commissionExpected.getCommissionBizType(),
commissionExpected.getReconciliationCompanyCode(),
commissionExpected.getReconciliationCompany()));
}
commissionExpected.setUpdateTime(new Date());
// 更新预计入账
return this.updateById(commissionExpected);
......
......@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.service.component.CommissionAsyncService;
import com.yd.csf.service.component.ReceivableService;
......@@ -24,12 +25,15 @@ import com.yd.csf.service.service.*;
import com.yd.csf.service.dao.CommissionMapper;
import com.yd.csf.service.vo.CommissionStatisticsVO;
import com.yd.csf.service.vo.CommissionVO;
import com.yd.user.feign.client.sysdict.ApiSysDictFeignClient;
import com.yd.user.feign.response.sysdict.GetDictItemListByDictTypeResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
......@@ -75,6 +79,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
private TransactionTemplate transactionTemplate;
@Resource
private ReceivableService receivableService;
@Autowired
private ApiSysDictFeignClient apiSysDictFeignClient;
@Override
......@@ -253,7 +259,6 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commission.setReconciliationCompany(policy.getReconciliationCompany());
commission.setReconciliationCompanyCode(policy.getReconciliationCompanyCode());
commission.setReconciliationCompanyBizId(policy.getReconciliationCompanyBizId());
commission.setCurrentCommissionRatio(commission.calculateCurrentPaidRatio());
}
// 匹配预计来佣记录
CommissionExpected expected = findExpectedFromList(commission, commissionExpectedList);
......@@ -261,6 +266,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commission.setCommissionExpectedBizId(expected.getCommissionExpectedBizId());
commission.setReceivableNo(expected.getReceivableNo());
commission.setTotalPeriod(expected.getTotalPeriod());
// 本次入账比例
commission.setCurrentCommissionRatio(calculateCurrentCommissionRatio(
commission.getPremium(), commission.getAmount(), commission.getCurrency(), commission.getExchangeRate(), expected));
} else {
commission.setRemark("未查询到预计来佣记录");
commission.setStatus(CommissionStatusEnum.MATCH_FAILED.getItemValue());
......@@ -315,18 +323,20 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
BigDecimal requestAmount = commissionUpdateRequest.getAmount();
// 重新关联预计来佣记录
CommissionExpected commissionExpected = getCommissionExpectedBizId(commission);
if (commissionExpected != null) {
if ("R".equals(commissionUpdateRequest.getCommissionBizType())) {
// 关联应收单,计算当前来佣比例
BigDecimal currentCommissionRatio = this.calculateCurrentCommissionRatio(
commission.getPremium(),
requestAmount,
commissionUpdateRequest.getExchangeRate());
commissionUpdateRequest.getCurrency(),
commissionUpdateRequest.getExchangeRate(),
commissionExpected);
commission.setCurrentCommissionRatio(currentCommissionRatio);
} else {
commission.setPolicyNo(null);
}
// 重新关联预计来佣记录
getCommissionExpectedBizId(commission);
}
// 计算来佣金额(港币)
commission.setHkdAmount(calculateHKDAmount(
requestAmount,
......@@ -342,6 +352,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
// 更新属性
BeanUtils.copyProperties(commissionUpdateRequest, commission, "commissionBizId");
if ("U".equals(commissionUpdateRequest.getCommissionBizType())) {
commission.setPolicyNo(null);
}
commission.setUpdaterId(loginUserId);
commission.setUpdateTime(new Date());
// 执行更新操作(这个方法将在当前事务中执行)
......@@ -373,7 +386,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return requestAmount.multiply(exchangeRate);
}
private void getCommissionExpectedBizId(Commission commission) {
private CommissionExpected getCommissionExpectedBizId(Commission commission) {
CommissionExpected commissionExpected = null;
if ("R".equals(commission.getCommissionBizType())) {
commissionExpected = commissionExpectedService.lambdaQuery()
......@@ -397,21 +410,28 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
} else {
commission.setStatus(CommissionStatusEnum.MATCH_FAILED.getItemValue());
}
return commissionExpected;
}
@Override
public void validateCommissionUpdateRequest(CommissionUpdateRequest commissionUpdateRequest) {
// 校验入参
if (ObjectUtils.isEmpty(commissionUpdateRequest.getCommissionBizId())) {
log.error("来佣业务id不能为空:{}", commissionUpdateRequest.getCommissionBizId());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "来佣业务id不能为空");
}
if (ObjectUtils.isEmpty(commissionUpdateRequest.getCommissionName())) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "来佣名称不能为空");
}
if (ObjectUtils.isEmpty(commissionUpdateRequest.getCommissionType())) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "来佣类型不能为空");
}
if (ObjectUtils.isEmpty(commissionUpdateRequest.getAmount())) {
log.error("当前入账金额不能为空,来佣业务id:{}", commissionUpdateRequest.getCommissionBizId());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "入账金额不能为空");
}
if (ObjectUtils.isEmpty(commissionUpdateRequest.getCurrency())) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "入账币种不能为空");
}
if (ObjectUtils.isEmpty(commissionUpdateRequest.getExchangeRate())) {
log.error("当前结算汇率不能为空,来佣业务id:{}", commissionUpdateRequest.getCommissionBizId());
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "结算汇率不能为空");
}
}
......@@ -686,7 +706,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return this.getOne(new QueryWrapper<Commission>().eq("commission_biz_id", commissionBizId));
}
public BigDecimal calculateCurrentCommissionRatio(String premium, BigDecimal amount, BigDecimal exchangeRate) {
public BigDecimal calculateCurrentCommissionRatio(String premium, BigDecimal amount, String currentCurrency, BigDecimal exchangeRate, CommissionExpected commissionExpected) {
if (ObjectUtils.isEmpty(premium)) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "保单保费不能为空");
}
......@@ -696,10 +716,43 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (ObjectUtils.isEmpty(exchangeRate)) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "当前结算汇率不能为空");
}
// 当前来佣比例=当前入账金额/结算汇率/保费 * 100
// 获取保单币种
String currency = commissionExpected.getCurrency();
// 如果当前入账币种等于保单币种,直接计算来佣比例
if (StringUtils.equals(currentCurrency, currency)) {
return amount.divide(new BigDecimal(premium), 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
}
// 如果币种不同,首先把当前入账金额转换为对应币种金额
if (!StringUtils.equals(currentCurrency, "HKD")) {
Result<List<GetDictItemListByDictTypeResponse>> result = apiSysDictFeignClient.getDictItemListByDictType("csf_exchange_rate_hkd");
log.info("--------------当前入账金额: {} {}", amount, currentCurrency);
log.info("--------------当前入账币种: {}", currentCurrency);
BigDecimal defaultExchangeRate = null;
if (CollectionUtils.isNotEmpty(result.getData())) {
for (GetDictItemListByDictTypeResponse dictItem : result.getData()) {
if (StringUtils.equalsIgnoreCase(dictItem.getItemLabel(), currentCurrency)) {
defaultExchangeRate = new BigDecimal(dictItem.getItemValue());
}
}
}
if (ObjectUtils.isEmpty(defaultExchangeRate)) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到当前入账币种对应的结算汇率");
}
amount = amount.divide(defaultExchangeRate, 4, RoundingMode.HALF_UP);
log.info("--------------当前入账港币: {}", amount);
}
// 当前来佣比例=当前入账金额/结算汇率/保费 * 100
BigDecimal currentCommissionRatio = amount.divide(new BigDecimal(premium), 4, RoundingMode.HALF_UP)
.divide(exchangeRate, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
log.info("--------------当前结算汇率: {}", exchangeRate);
log.info("--------------当前来佣比例: {}", currentCommissionRatio);
return currentCommissionRatio;
}
@Override
......@@ -776,8 +829,6 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commission.setProductLaunchBizId(policy.getProductLaunchBizId());
commission.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
commission.setPremium(Convert.toStr(policy.getPaymentPremium()));
// 本次入账比例
commission.setCurrentCommissionRatio(commission.calculateCurrentPaidRatio());
} else {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单不存在, policyNo: " + request.getPolicyNo());
}
......@@ -786,7 +837,12 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commission.setPolicyNo(null);
}
// 关联预计来佣信息
getCommissionExpectedBizIdBatch(request, policyNoSet, commission);
CommissionExpected expected = getCommissionExpectedBizIdBatch(request, policyNoSet, commission);
if (expected != null) {
// 本次入账比例
commission.setCurrentCommissionRatio(calculateCurrentCommissionRatio(
commission.getPremium(), commission.getAmount(), commission.getCurrency(), commission.getExchangeRate(), expected));
}
commissionList.add(commission);
}
......@@ -811,7 +867,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return commissionList;
}
private void getCommissionExpectedBizIdBatch(CommissionAddRequest request, Set<String> policyNoSet, Commission commission) {
private CommissionExpected getCommissionExpectedBizIdBatch(CommissionAddRequest request, Set<String> policyNoSet, Commission commission) {
CommissionExpected expected = null;
if ("R".equals(request.getCommissionBizType())) {
// 查询预计入账信息
......@@ -854,6 +910,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commission.setRemark("未查询到预计来佣记录");
commission.setStatus(CommissionStatusEnum.MATCH_FAILED.getItemValue());
}
return expected;
}
private void validateAddCommissionBatch(List<CommissionAddRequest> customerAddRequestList) {
......
......@@ -251,13 +251,11 @@ public class CommissionExpectedVO implements Serializable {
commissionVO.setPendingAmount(commissionExpected.getExpectedAmount().subtract(paidAmount1));
}
return commissionVO;
}
if (commissionExpected.getAmount() != null) {
} else {
commissionVO.setPaidAmount(paidAmount1);
commissionVO.setPendingAmount(commissionExpected.getAmount().subtract(paidAmount1));
return commissionVO;
}
return commissionVO;
}
}
......@@ -87,22 +87,18 @@
<!-- 总金额:统计保单预计来佣表 已入账金额:统计来佣表-->
<select id="getCommissionStatistics" resultType="com.yd.csf.service.vo.CommissionStatisticsVO">
SELECT
COALESCE(SUM(c.amount), 0) as totalPaidAmount,
IFNULL(e.expected_amount, 0) as expectePaidAmount,
COALESCE(SUM(c.hkd_amount), 0) as totalPaidAmount,
COALESCE(MAX(e.expected_amount), 0) as expectePaidAmount,
COALESCE(IFNULL(e.expected_amount, 0) - SUM(c.amount), 0) as pendingPaidAmount,
COALESCE(IFNULL(e.expected_amount, 0) - SUM(c.amount), 0) as differenceAmount,
COUNT(DISTINCT c.policy_no) as totalPolicyCount,
COALESCE(SUM(CAST(c.premium AS DECIMAL(15,2))*p.payment_term), 0) as totalPremium,
COALESCE(CAST(c.premium AS DECIMAL(15,2)) * p.payment_term, 0) AS totalPremium,
COUNT(DISTINCT c.reconciliation_company) as reconciliationCompanyCount,
COUNT(DISTINCT c.id) as totalCompareCommissionCount,
SUM(CASE WHEN c.status = '1' THEN 1 ELSE 0 END) as successCompareCommissionCount,
SUM(CASE WHEN c.status = '2' THEN 1 ELSE 0 END) as failedCompareCommissionCount
FROM commission c
LEFT JOIN (
SELECT policy_no, SUM(expected_amount) as expected_amount
FROM commission_expected
GROUP BY policy_no
) e ON c.policy_no = e.policy_no
LEFT JOIN commission_expected e ON c.commission_expected_biz_id = e.commission_expected_biz_id
LEFT JOIN policy p ON c.policy_no = p.policy_no
<where>
<if test="commissionIdList != null and commissionIdList.size > 0">
......
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