Commit e9119fda by zhangxingmin

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

parents bd58b118 32517d1f
......@@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
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.api.dto.CommissionExcelDTO;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.component.CommissionAsyncService;
......@@ -27,21 +29,16 @@ import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
......@@ -73,12 +70,14 @@ public class ApiCommissionController {
private PolicyFollowService policyFollowService;
@Resource
private PolicyService policyService;
@Resource
private TransactionTemplate transactionTemplate;
@PostMapping("/upload/excel")
@Operation(summary = "上传入账Excel文件")
@Transactional(rollbackFor = Exception.class)
public Result<List<CommissionVO>> uploadExcel(@RequestParam("file") MultipartFile file,
public Result<Boolean> uploadExcel(@RequestParam("file") MultipartFile file,
@RequestParam("reconciliationYearMonth") String reconciliationYearMonth) throws IOException {
// 校验来佣检核年月是否为空
......@@ -113,7 +112,7 @@ public class ApiCommissionController {
}
// 数据完整性校验
// validateCommissionUpload(dataList);
validateCommissionUpload(dataList);
// 校验保单是否存在
Set<String> policyNos = dataList.stream()
......@@ -134,7 +133,7 @@ public class ApiCommissionController {
}
}
if (StringUtils.isNotBlank(errorMsg)) {
errorMsg.append("\n请确认新单跟进中保单是否存在,若不存在请先添加保单");
errorMsg.append("\n请确认保单中心是否存在该保单,若不存在请先添加");
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), errorMsg.toString());
}
......@@ -147,28 +146,30 @@ public class ApiCommissionController {
.eq(Commission::getReconciliationYearMonth, reconciliationYearMonth));
// 数据处理
List<Commission> entities = processData(dataList, loginUserId);
// 转换为 VO
List<CommissionVO> commissionVOList = commissionService.getCommissionList(entities);
// 批量比对
// TransactionSynchronizationManager.registerSynchronization(
// new TransactionSynchronization() {
// @Override
// public void afterCommit() {
// try {
// // 重新查询最新的数据,获取已提交的数据
// commissionAsyncService.commissionCompareBatch(entities);
// } catch (Exception e) {
// // 比对失败不影响主事务,记录日志即可
// log.error("批量导入, 比对操作执行失败, error: {}", e.getMessage());
// }
// }
// }
// );
List<Commission> entities = processData(dataList, loginUserId, reconciliationYearMonth);
return Result.success(commissionVOList);
transactionTemplate.execute(status -> {
// 保存来佣数据
commissionService.saveBatch(entities);
return null;
});
// // 转换为 VO
// List<CommissionVO> commissionVOList = commissionService.getCommissionList(entities);
// 开启新事务,比对数据
transactionTemplate.execute(status -> {
try {
commissionAsyncService.commissionCompareBatch(entities);
} catch (Exception e) {
// 比对失败不影响主事务,记录日志即可
e.printStackTrace();
log.error("批量导入, 比对操作执行失败, error: {}", e.getMessage());
}
return null;
});
return Result.success(true);
}
/**
......@@ -182,21 +183,25 @@ public class ApiCommissionController {
StringBuilder errorMsg = new StringBuilder();
for (CommissionExcelDTO excelDTO : dataList) {
// 校验必填字段是否为空
if (StringUtils.isBlank(excelDTO.getPolicyNo()) ||
StringUtils.isBlank(excelDTO.getReconciliationCompany()) ||
StringUtils.isBlank(excelDTO.getCommissionName()) ||
excelDTO.getAmount() == null ||
StringUtils.isBlank(excelDTO.getCurrency()) ||
excelDTO.getCommissionDate() == null) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行存在空字段");
// if (StringUtils.isBlank(excelDTO.getPolicyNo()) ||
// StringUtils.isBlank(excelDTO.getReconciliationCompany()) ||
// StringUtils.isBlank(excelDTO.getCommissionName()) ||
// excelDTO.getAmount() == null ||
// StringUtils.isBlank(excelDTO.getCurrency()) ||
// excelDTO.getCommissionDate() == 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.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
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())) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行关联保单应收单, 结算汇率不能为空");
}
// 如果没有保单号,应收账款编号不能为空
if (StringUtils.isBlank(excelDTO.getPolicyNo()) && StringUtils.isBlank(excelDTO.getReceivableNo())) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行无保单号时应收账款编号不能为空");
}
}
if (errorMsg.length() > 0) {
......@@ -207,16 +212,18 @@ public class ApiCommissionController {
/**
* 1.处理导入的数据
*/
private List<Commission> processData(List<CommissionExcelDTO> dataList, String loginUserId) {
private List<Commission> processData(List<CommissionExcelDTO> dataList, String loginUserId, String reconciliationYearMonth) {
List<Commission> entities = new ArrayList<>();
for (CommissionExcelDTO data : dataList) {
// 数据验证
Commission entity = CommissionExcelDTO.convertToEntityNew(data, loginUserId);
entity.setCommissionBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_COMMISSION.getCode()));
entity.setReconciliationYearMonth(reconciliationYearMonth);
entities.add(entity);
}
// 保存来佣数据
// commissionService.saveBatch(entities);
// 补充完整字段
commissionService.fillCommissionList(entities);
return entities;
}
......@@ -256,11 +263,11 @@ public class ApiCommissionController {
// commissionAsyncService.commissionCompareBatch(commissionList);
@GetMapping("/test")
public Result<List<Commission>> testCompareBatch(@RequestParam("customerBizId") String policyNo) {
if (StringUtils.isBlank(policyNo)) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), "保单号不能为空");
public Result<List<Commission>> testCompareBatch(@RequestParam("commissionBizId") String commissionBizId) {
if (StringUtils.isBlank(commissionBizId)) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), "来佣业务id不能为空");
}
List<Commission> commissionList = commissionService.list(new QueryWrapper<Commission>().eq("policy_no", policyNo));
List<Commission> commissionList = commissionService.list(new QueryWrapper<Commission>().eq("commission_biz_id", commissionBizId));
if (CollectionUtils.isEmpty(commissionList)) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), "未查询到来佣数据");
}
......
......@@ -24,7 +24,6 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.List;
import java.util.stream.Collectors;
......
......@@ -221,12 +221,12 @@ public class ApiPolicyController {
*/
@GetMapping("/get_policy_product_info")
@Operation(summary = "获取保单产品信息")
public Result<List<Map<String, Object>>> getPolicyProductInfo(@RequestParam("productLaunchBizId") List<String> productLaunchBizId) {
public Result<List<PolicyProductInfo>> getPolicyProductInfo(@RequestParam("productLaunchBizId") List<String> productLaunchBizId) {
if (productLaunchBizId == null) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), ResultCode.PARAMS_ERROR.getMessage());
}
// 查询
List<Map<String, Object>> productLaunchPageResponse = policyService.getPolicyProductInfo(productLaunchBizId);
List<PolicyProductInfo> productLaunchPageResponse = policyService.getPolicyProductInfo(productLaunchBizId);
// 获取封装类
return Result.success(productLaunchPageResponse);
......
......@@ -3,6 +3,7 @@ package com.yd.csf.api.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import com.yd.common.enums.CommonEnum;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.service.enums.CurrencyEnum;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import lombok.Data;
......@@ -88,7 +89,7 @@ public class CommissionExcelDTO {
entity.setCommissionPeriod(data.getCommissionPeriod2());
entity.setCommissionName(data.getCommissionName2());
entity.setAmount(data.getAmount2());
entity.setCurrency(data.getCurrency2());
entity.setCurrency(CurrencyEnum.getEnumByItemLabel(data.getCurrency2()));
entity.setExchangeRate(data.getExchangeRate2());
entity.setCommissionDate(data.getCommissionDate2());
entity.setRemark(data.getRemark());
......
......@@ -442,7 +442,7 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
IPage<ExpectedFortune> iPage = iExpectedFortuneService.page(page, queryWrapper);
// 查询统计数据
List<ExpectedFortune> fortuneList = iExpectedFortuneService.list(queryWrapper);
ExpectedFortuneStatisticsVO statisticsVO = iExpectedFortuneService.getStatistics(fortuneList.stream().map(ExpectedFortune::getId).collect(Collectors.toList()));
ExpectedFortuneStatisticsVO statisticsVO = this.getStatistics(fortuneList.stream().map(ExpectedFortune::getId).collect(Collectors.toList()));
// 组装返回结果
ApiExpectedFortunePageResponseVO response = new ApiExpectedFortunePageResponseVO();
......@@ -618,15 +618,17 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
if (expectedFortune == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计发佣数据不存在");
}
BeanUtils.copyProperties(request, expectedFortune, "id", "expectedFortuneBizId");
ExpectedFortune updateExpectedFortune = new ExpectedFortune();
BeanUtils.copyProperties(request, updateExpectedFortune);
updateExpectedFortune.setId(expectedFortune.getId());
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
expectedFortune.setUpdaterId(loginUserId);
expectedFortune.setUpdateTime(LocalDateTime.now());
iExpectedFortuneService.updateById(expectedFortune);
updateExpectedFortune.setUpdaterId(loginUserId);
updateExpectedFortune.setUpdateTime(LocalDateTime.now());
iExpectedFortuneService.updateById(updateExpectedFortune);
return true;
}
......
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
@Data
public class ExpectedFortuneAddRequest {
......@@ -92,14 +92,14 @@ public class ExpectedFortuneAddRequest {
*/
@Schema(description = "出账日 (估)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate payoutDate;
private Date payoutDate;
/**
* 出账日 (实)
*/
@Schema(description = "出账日 (实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate actualPayoutDate;
private Date actualPayoutDate;
/**
* 出账状态
......
package com.yd.csf.feign.request.expectedfortune;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ExpectedFortuneUpdateRequest {
......@@ -14,6 +16,32 @@ public class ExpectedFortuneUpdateRequest {
private String expectedFortuneBizId;
/**
* 应付款类型 R-关联保单应付款 U-非关联保单应付款
*/
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
private String fortuneBizType;
/**
* 出账日 (估)
*/
@Schema(description = "出账日 (估)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date payoutDate;
/**
* 出账日 (实)
*/
@Schema(description = "出账日 (实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date actualPayoutDate;
/**
* 出账金额
*/
@Schema(description = "出账金额")
private BigDecimal amount;
/**
* 出账状态
*/
@Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
......@@ -32,12 +60,36 @@ public class ExpectedFortuneUpdateRequest {
private BigDecimal currentPaymentAmount;
/**
* 出账项目
*/
@Schema(description = "出账项目")
private String fortuneName;
/**
* 出账项目类型
*/
@Schema(description = "出账项目类型 字典值:csf_fortune_type")
private String fortuneType;
/**
* 币种
*/
@Schema(description = "币种")
private String currency;
/**
* 转介人名称
*/
@Schema(description = "转介人名称")
private String broker;
/**
* 转介人业务ID
*/
@Schema(description = "broker biz id")
private String brokerBizId;
/**
* 备注
*/
@Schema(description = "备注")
......
......@@ -194,7 +194,7 @@ public class CommissionAsyncService {
BigDecimal paidAmount = BigDecimal.ZERO;
for (Commission item : existingCommissions) {
if (item.getCurrentCommissionRatio() == null) {
log.warn("当前来佣比例为空,临时计算当前来佣比例: {}", item);
log.warn("当前来佣比例为空,临时计算当前来佣比例: commission_id={}", item.getId());
paidRatio = paidRatio.add(item.calculateCurrentPaidRatio());
} else {
paidRatio = paidRatio.add(item.getCurrentCommissionRatio());
......
......@@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
@Data
public class CommissionExpectedAddDto {
......@@ -98,14 +98,14 @@ public class CommissionExpectedAddDto {
*/
@Schema(description = "入账日 (估) format:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate commissionDate;
private Date commissionDate;
/**
* 入账日 (实)
*/
@Schema(description = "入账日 (实) format:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate actualCommissionDate;
private Date actualCommissionDate;
/**
* 入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效
......
package com.yd.csf.service.enums;
import org.apache.commons.lang3.ObjectUtils;
/**
* 货币枚举
* <p>
* 美元
* 人民幣
* 港幣
* 澳元
* 加元
* 欧元
* 英鎊
* 新加坡元
*/
public enum CurrencyEnum {
// 货币枚举
USD("美元", "USD"),
CNY("人民幣", "CNY"),
HKD("港幣", "HKD"),
AUD("澳元", "AUD"),
JPY("日元", "JPY"),
CAD("加元", "CAD"),
EUR("欧元", "EUR"),
GBP("英镑", "GBP"),
SGD("新加坡元", "SGD");
//字典项标签(名称)
private String itemLabel;
//字典项值
private String itemValue;
//构造函数
CurrencyEnum(String itemLabel, String itemValue) {
this.itemLabel = itemLabel;
this.itemValue = itemValue;
}
/**
* 根据 币种(去掉最后一个字) 获取枚举值
*
* @param itemLabel
* @return
*/
public static String getEnumByItemLabel(String itemLabel) {
if (ObjectUtils.isEmpty(itemLabel)) {
return null;
}
// 币种名称去掉最后一个字
itemLabel = itemLabel.substring(0, itemLabel.length() - 1);
for (CurrencyEnum anEnum : CurrencyEnum.values()) {
if (anEnum.itemLabel.startsWith(itemLabel)) {
return anEnum.getItemValue();
}
}
return null;
}
public String getItemLabel() {
return itemLabel;
}
public String getItemValue() {
return itemValue;
}
}
......@@ -119,16 +119,6 @@ public class Commission implements Serializable {
private BigDecimal currentCommissionRatio;
/**
* 当期已入账来佣比例
*/
private BigDecimal periodPaidRatio;
/**
* 当期剩余来佣比例
*/
private BigDecimal periodPendingRatio;
/**
* 来佣日期
*/
private Date commissionDate;
......@@ -149,21 +139,6 @@ public class Commission implements Serializable {
private String commissionExpectedBizId;
/**
* 总金额
*/
private BigDecimal expectedAmount;
/**
* 已入账金额
*/
private BigDecimal paidAmount;
/**
* 待入账金额
*/
private BigDecimal pendingAmount;
/**
* 通用备注
*/
private String remark;
......
......@@ -26,6 +26,8 @@ public interface CommissionService extends IService<Commission> {
List<CommissionVO> getCommissionList(List<Commission> commissionList);
void fillCommissionList(List<Commission> commissionList);
Boolean updateCommission(CommissionUpdateRequest commissionUpdateRequest);
Boolean generateFortune(GenerateFortuneRequest generateFortuneRequest);
......
......@@ -6,6 +6,8 @@ import com.yd.csf.service.dto.*;
import com.yd.csf.service.model.Policy;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.vo.PolicyVO;
import java.util.Collection;
import java.util.List;
import java.util.Map;
......@@ -28,5 +30,7 @@ public interface PolicyService extends IService<Policy> {
List<QueryPolicyAndBrokerDto> queryPolicyBrokerList(String policyNo);
List<Map<String, Object>> getPolicyProductInfo(List<String> productLaunchBizIdList);
List<PolicyProductInfo> getPolicyProductInfo(List<String> productLaunchBizIdList);
Map<String, PolicyProductInfo> getPolicyProductInfoMap(Collection<String> productLaunchBizIdList);
}
......@@ -129,7 +129,12 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
// 2.关联查询预计入账信息
Set<String> commissionExpectedBizIdSet = commissionList.stream().map(Commission::getCommissionExpectedBizId).collect(Collectors.toSet());
List<CommissionExpected> commissionExpectedList = commissionExpectedService.lambdaQuery()
.select(CommissionExpected::getCommissionExpectedBizId, CommissionExpected::getReceivableNo)
.select(CommissionExpected::getCommissionExpectedBizId,
CommissionExpected::getCommissionRatio,
CommissionExpected::getPaidAmount,
CommissionExpected::getPaidRatio,
CommissionExpected::getStatus,
CommissionExpected::getReceivableNo)
.in(CommissionExpected::getCommissionExpectedBizId, commissionExpectedBizIdSet)
.list();
Map<String, CommissionExpected> commissionExpectedMap = commissionExpectedList.stream().collect(Collectors.toMap(CommissionExpected::getCommissionExpectedBizId, a -> a, (oldValue, newValue) -> newValue));
......@@ -147,8 +152,12 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
CommissionExpected commissionExpected = commissionExpectedMap.get(commission.getCommissionExpectedBizId());
if (commissionExpected != null) {
// 填充应收账款编号
// 填充应收账款编号、已入账比例、待入账比例
commissionVO.setReceivableNo(commissionExpected.getReceivableNo());
if (commissionExpected.getCommissionRatio() != null) {
commissionVO.setPaidRatio(commissionExpected.getPaidRatio());
commissionVO.setPendingRatio(commissionExpected.getCommissionRatio().subtract(commissionExpected.getPaidRatio()));
}
commissionVO.setCommissionExpectedStatus(commissionExpected.getStatus());
}
return commissionVO;
......@@ -198,6 +207,81 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
@Override
public void fillCommissionList(List<Commission> commissionList) {
if (CollUtil.isEmpty(commissionList)) {
return;
}
// 1.关联查询保单信息
Set<String> policyNoSet = commissionList.stream().map(Commission::getPolicyNo).collect(Collectors.toSet());
QueryWrapper<Policy> queryWrapper = new QueryWrapper<Policy>();
queryWrapper.in("policy_no", policyNoSet);
queryWrapper.select(
"policy_no", "payment_premium",
"product_launch_biz_id", "product_name",
"insurance_company_biz_id", "insurance_company",
"reconciliation_company", "reconciliation_company_code", "reconciliation_company_biz_id");
List<Policy> policyList = policyService.list(queryWrapper);
Map<String, Policy> policyMap = policyList.stream().collect(Collectors.toMap(Policy::getPolicyNo, a -> a, (oldValue, newValue) -> newValue));
// 2.关联查询预计入账信息
List<CommissionExpected> commissionExpectedList = commissionExpectedService.lambdaQuery()
.in(CommissionExpected::getPolicyNo, policyNoSet)
.select(CommissionExpected::getCommissionExpectedBizId,
CommissionExpected::getPolicyNo,
CommissionExpected::getReceivableNo,
CommissionExpected::getCommissionPeriod,
CommissionExpected::getTotalPeriod,
CommissionExpected::getCommissionName,
CommissionExpected::getCurrency,
CommissionExpected::getStatus)
.list();
// 填充信息
commissionList.forEach(commission -> {
Policy policy = policyMap.get(commission.getPolicyNo());
if (policy != null) {
// 填充保费、产品名称、保险公司、对账公司
commission.setPremium(String.valueOf(policy.getPaymentPremium()));
commission.setProductLaunchBizId(policy.getProductLaunchBizId());
commission.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
commission.setReconciliationCompany(policy.getReconciliationCompany());
commission.setReconciliationCompanyCode(policy.getReconciliationCompanyCode());
commission.setReconciliationCompanyBizId(policy.getReconciliationCompanyBizId());
commission.setCurrentCommissionRatio(commission.calculateCurrentPaidRatio());
}
// 根据保单号、期数、入账名称、币种查询预计来佣记录
CommissionExpected expected = findExpectedFromList(commission, commissionExpectedList);
if (expected != null) {
commission.setCommissionExpectedBizId(expected.getCommissionExpectedBizId());
commission.setTotalPeriod(expected.getTotalPeriod());
} else {
log.warn("导入入账:未查询到预计来佣记录, policyNo: {}, commissionPeriod: {}, commissionName: {}, currency: {}",
commission.getPolicyNo(), commission.getCommissionPeriod(), commission.getCommissionName(), commission.getCurrency());
commission.setRemark("未查询到预计来佣记录");
commission.setStatus(CommissionStatusEnum.MATCH_FAILED.getItemValue());
}
});
}
private CommissionExpected findExpectedFromList(Commission commission, List<CommissionExpected> commissionExpectedList) {
log.info("commission: policyNo={}, commissionPeriod={}, commissionName={}, currency={}",
commission.getPolicyNo(), commission.getCommissionPeriod(), commission.getCommissionName(), commission.getCurrency());
for (CommissionExpected i : commissionExpectedList) {
log.info(" expected: policyNo={}, commissionPeriod={}, commissionName={}, currency={}",
i.getPolicyNo(), i.getCommissionPeriod(), i.getCommissionName(), i.getCurrency());
if (Objects.equals(i.getPolicyNo(), commission.getPolicyNo())
&& Objects.equals(i.getCommissionPeriod(), commission.getCommissionPeriod())
&& Objects.equals(i.getCommissionName(), commission.getCommissionName())
&& Objects.equals(i.getCurrency(), commission.getCurrency())) {
return i;
}
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateCommission(CommissionUpdateRequest commissionUpdateRequest) {
String commissionBizId = commissionUpdateRequest.getCommissionBizId();
......@@ -215,7 +299,6 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
BigDecimal currentCommissionRatio = this.calculateCurrentCommissionRatio(
commission.getPremium(),
requestAmount,
commissionUpdateRequest.getCurrency(),
commissionUpdateRequest.getExchangeRate());
// 获取当前登录用户
......@@ -567,7 +650,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, String exchangeRate, String currency) {
public BigDecimal calculateCurrentCommissionRatio(String premium, BigDecimal amount, String exchangeRate) {
if (ObjectUtils.isEmpty(premium)) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "保单保费不能为空");
}
......@@ -656,6 +739,8 @@ 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());
}
}
// 关联预计来佣信息
......@@ -670,6 +755,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
.orElse(null);
if (expected != null) {
commission.setCommissionExpectedBizId(expected.getCommissionExpectedBizId());
commission.setTotalPeriod(expected.getTotalPeriod());
} else {
log.warn("新增入账:未查询到预计来佣记录, policyNo: {}, commissionPeriod: {}, commissionName: {}, currency: {}",
request.getPolicyNo(), request.getCommissionPeriod(), request.getCommissionName(), request.getCurrency());
......@@ -679,7 +765,11 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
}
commissionList.add(commission);
}
boolean b = this.saveOrUpdateBatch(commissionList);
// 提交事务,保存数据
transactionTemplate.execute(status -> {
saveOrUpdateBatch(commissionList);
return null;
});
// 开启新事务,比对数据
transactionTemplate.execute(status -> {
......@@ -687,6 +777,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commissionAsyncService.commissionCompareBatch(commissionList);
} catch (Exception e) {
// 比对失败不影响主事务,记录日志即可
e.printStackTrace();
log.error("批量新增, 比对操作执行失败, error: {}", e.getMessage());
}
return null;
......@@ -709,6 +800,12 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (StringUtils.isBlank(request.getCommissionName())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "入账项目名称不能为空");
}
if ("R".equals(request.getCommissionBizType())) {
// 校验保单号是否存在
if (StringUtils.isBlank(request.getExchangeRate())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "关联保单号记录,结算汇率不能为空");
}
}
}
}
......
......@@ -107,9 +107,12 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
}
// 1.关联查询来佣信息
List<Commission> commissionList = commissionService.list(new QueryWrapper<Commission>().in("commission_biz_id", commissionBizIdSet));
Map<String, Commission> commissionMap = commissionList.stream().collect(Collectors.toMap(Commission::getCommissionBizId, a -> a, (oldValue, newValue) -> newValue));
Set<String> commissionExpectedBizIdSet = commissionList.stream().map(Commission::getCommissionExpectedBizId).collect(Collectors.toSet());
// 1.1 关联查询来佣预期信息
List<CommissionExpected> commissionExpectedList = commissionExpectedService.lambdaQuery()
.in(CommissionExpected::getCommissionExpectedBizId, expectedFortuneBizIdSet)
.in(CommissionExpected::getCommissionExpectedBizId, commissionExpectedBizIdSet)
.select(CommissionExpected::getCommissionExpectedBizId, CommissionExpected::getPaidAmount, CommissionExpected::getPaidRatio)
.list();
Map<String, CommissionExpected> commissionExpectedMap = commissionExpectedList.stream().collect(Collectors.toMap(CommissionExpected::getCommissionExpectedBizId, a -> a, (oldValue, newValue) -> newValue));
......@@ -127,12 +130,16 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
fortuneVOList.forEach(fortuneVO -> {
String commissionBizId = fortuneVO.getCommissionBizId();
Commission commission = commissionMap.get(commissionBizId);
if (commission != null) {
// 设置来佣金额和比例
CommissionExpected commissionExpected = commissionExpectedMap.get(commissionBizId);
CommissionExpected commissionExpected = commissionExpectedMap.get(commission.getCommissionExpectedBizId());
if (commissionExpected != null) {
fortuneVO.setCommissionPaidAmount(commissionExpected.getPaidAmount());
fortuneVO.setCommissionPaidRatio(commissionExpected.getPaidRatio());
}
}
// 设置保单信息
Policy policy = policyMap.get(fortuneVO.getPolicyNo());
if (policy != null) {
......
......@@ -38,6 +38,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
......@@ -183,7 +184,7 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
}
@Override
public List<Map<String, Object>> getPolicyProductInfo(List<String> productLaunchBizIdList) {
public List<PolicyProductInfo> getPolicyProductInfo(List<String> productLaunchBizIdList) {
ApiRelProjectProductLaunchPageRequest pageRequest = new ApiRelProjectProductLaunchPageRequest();
pageRequest.setProductLaunchBizIdList(productLaunchBizIdList);
pageRequest.setPageNo(1);
......@@ -201,7 +202,7 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
// 直接使用Map来处理数据,避免复杂的类型转换
Object data = result.getData();
List<Map<String, Object>> policyProductInfoList = new ArrayList<>();
List<PolicyProductInfo> policyProductInfoList = new ArrayList<>();
// 将数据转换为JSONObject进行解析
JSONObject jsonObject = JSONUtil.parseObj(data);
......@@ -212,20 +213,20 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
for (int i = 0; i < recordsArray.size(); i++) {
JSONObject record = recordsArray.getJSONObject(i);
Map<String, Object> infoMap = new HashMap<>();
infoMap.put("productLaunchBizId", record.getStr("productLaunchBizId"));
infoMap.put("productName", record.getStr("productName"));
infoMap.put("title", record.getStr("title"));
infoMap.put("shortTitle", record.getStr("shortTitle"));
infoMap.put("status", record.getStr("status"));
PolicyProductInfo productInfo = new PolicyProductInfo();
productInfo.setProductLaunchBizId(record.getStr("productLaunchBizId"));
productInfo.setProductName(record.getStr("productName"));
productInfo.setTitle(record.getStr("title"));
productInfo.setShortTitle(record.getStr("shortTitle"));
productInfo.setStatus(record.getStr("status"));
// 解析自定义属性
JSONArray attributeSettingArray = record.getJSONArray("apiAttributeSettingDtoList");
if (attributeSettingArray != null) {
getInfoFromJsonArray(attributeSettingArray, infoMap);
getInfoFromJsonArray(attributeSettingArray, productInfo);
}
policyProductInfoList.add(infoMap);
policyProductInfoList.add(productInfo);
}
}
......@@ -237,10 +238,22 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
}
}
@Override
public Map<String, PolicyProductInfo> getPolicyProductInfoMap(Collection<String> productLaunchBizIdList) {
// 校验参数
if (CollectionUtils.isEmpty(productLaunchBizIdList)) {
return Collections.emptyMap();
}
List<PolicyProductInfo> policyProductInfoList = getPolicyProductInfo(new ArrayList<>(productLaunchBizIdList));
return policyProductInfoList.stream()
.collect(Collectors.toMap(PolicyProductInfo::getProductLaunchBizId, Function.identity()));
}
/**
* 从JSON数组中解析自定义属性
*/
private void getInfoFromJsonArray(JSONArray attributeSettingArray, Map<String, Object> infoMap) {
private void getInfoFromJsonArray(JSONArray attributeSettingArray, PolicyProductInfo productInfo) {
if (attributeSettingArray == null || attributeSettingArray.isEmpty()) {
return;
}
......@@ -253,22 +266,21 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
// 根据属性名称设置对应的字段
switch (name) {
case "保险公司":
infoMap.put("insuranceCompany", value);
infoMap.put("insuranceCompanyBizId", attribute.getStr("fieldValueBizId"));
productInfo.setInsuranceCompany(value);
productInfo.setInsuranceCompanyBizId(attribute.getStr("fieldValueBizId"));
break;
case "对账公司":
infoMap.put("reconciliationCompany", value);
infoMap.put("reconciliationCompanyBizId", attribute.getStr("fieldValueBizId"));
productInfo.setReconciliationCompany(value);
productInfo.setReconciliationCompanyBizId(attribute.getStr("fieldValueBizId"));
break;
case "产品计划类型":
infoMap.put("productPlanType", value);
productInfo.setProductPlanType(value);
break;
case "是否区分吸烟":
infoMap.put("isSmokingDistinguish", value);
productInfo.setIsSmokingDistinguish(value);
break;
default:
// 其他自定义属性
infoMap.put(name, value);
break;
}
}
......
......@@ -7,6 +7,7 @@ import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.yd.csf.service.model.CommissionExpected;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import java.math.BigDecimal;
import java.util.Date;
......@@ -14,7 +15,7 @@ import java.util.Date;
@Data
@ContentRowHeight(15)
@HeadRowHeight(20)
@ColumnWidth(15)
@ColumnWidth(25)
public class CommissionExpectedExportDTO {
@ExcelProperty("应收账款编号")
......@@ -71,10 +72,18 @@ public class CommissionExpectedExportDTO {
@ColumnWidth(20)
private BigDecimal paidAmount;
@ExcelProperty("已入账比例(%)")
@ColumnWidth(20)
private BigDecimal paidRatio;
@ExcelProperty("待入账金额(HKD)")
@ColumnWidth(20)
private BigDecimal pendingAmount;
@ExcelProperty("待入账比例(%)")
@ColumnWidth(20)
private BigDecimal pendingRatio;
@ExcelProperty("备注")
@ColumnWidth(30)
private String remark;
......@@ -108,12 +117,22 @@ public class CommissionExpectedExportDTO {
dto.setStatus(getStatusText(vo.getStatus()));
dto.setExpectedAmount(vo.getExpectedAmount());
dto.setPaidAmount(vo.getPaidAmount());
// 计算待入账金额
BigDecimal pendingAmount = vo.getExpectedAmount() != null && vo.getPaidAmount() != null
? vo.getExpectedAmount().subtract(vo.getPaidAmount())
: BigDecimal.ZERO;
dto.setPendingAmount(pendingAmount);
dto.setPaidRatio(vo.getPaidRatio());
BigDecimal paidAmount1 = ObjectUtils.defaultIfNull(vo.getPaidAmount(), BigDecimal.ZERO);
BigDecimal paidRatio1 = ObjectUtils.defaultIfNull(vo.getPaidRatio(), BigDecimal.ZERO);
// 待入账比例、待入账金额
if (vo.getCommissionRatio() != null) {
dto.setPaidRatio(paidRatio1);
dto.setPendingRatio(vo.getCommissionRatio().subtract(paidRatio1));
if (vo.getExpectedAmount() != null) {
dto.setPaidAmount(paidAmount1);
dto.setPendingAmount(vo.getExpectedAmount().subtract(paidAmount1));
}
} else if (vo.getAmount() != null) {
dto.setPaidAmount(paidAmount1);
dto.setPendingAmount(vo.getAmount().subtract(paidAmount1));
}
dto.setRemark(vo.getRemark());
dto.setCreateTime(vo.getCreateTime());
......
......@@ -5,6 +5,7 @@ import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
......@@ -83,6 +84,12 @@ public class CommissionExpectedVO implements Serializable {
private String reconciliationCompany;
/**
* 对账公司业务ID
*/
@Schema(description = "对账公司业务ID")
private String reconciliationCompanyBizId;
/**
* 佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)")
......@@ -168,6 +175,18 @@ public class CommissionExpectedVO implements Serializable {
private BigDecimal paidRatio;
/**
* 待入账金额
*/
@Schema(description = "待入账金额")
private BigDecimal pendingAmount;
/**
* 待入账比例
*/
@Schema(description = "待入账比例")
private BigDecimal pendingRatio;
/**
* 已入账来佣列表
*/
@Schema(description = "已入账来佣列表")
......@@ -220,6 +239,22 @@ public class CommissionExpectedVO implements Serializable {
CommissionExpectedVO commissionVO = new CommissionExpectedVO();
BeanUtils.copyProperties(commissionExpected, commissionVO);
BigDecimal paidAmount1 = ObjectUtils.defaultIfNull(commissionExpected.getPaidAmount(), BigDecimal.ZERO);
BigDecimal paidRatio1 = ObjectUtils.defaultIfNull(commissionExpected.getPaidRatio(), BigDecimal.ZERO);
// 待入账比例、待入账金额
if (commissionExpected.getCommissionRatio() != null) {
commissionVO.setPaidRatio(paidRatio1);
commissionVO.setPendingRatio(commissionExpected.getCommissionRatio().subtract(paidRatio1));
if (commissionExpected.getExpectedAmount() != null) {
commissionVO.setPaidAmount(paidAmount1);
commissionVO.setPendingAmount(commissionExpected.getExpectedAmount().subtract(paidAmount1));
}
} else if (commissionExpected.getAmount() != null) {
commissionVO.setPaidAmount(paidAmount1);
commissionVO.setPendingAmount(commissionExpected.getAmount().subtract(paidAmount1));
}
return commissionVO;
}
}
......@@ -153,18 +153,6 @@ public class CommissionVO implements Serializable {
private BigDecimal currentCommissionRatio;
/**
* 当期已入账比例
*/
@Schema(description = "已入账来佣比例")
private BigDecimal periodPaidRatio;
/**
* 待入账来佣比例
*/
@Schema(description = "当期剩余来佣比例")
private BigDecimal periodPendingRatio;
/**
* 比对状态
*/
@Schema(description = "比对状态 0=未比对 1=比对成功 2=比对失败 3=未匹配到预计入账记录 字典值: csf_commission_status")
......@@ -189,16 +177,16 @@ public class CommissionVO implements Serializable {
private String expectedAmount;
/**
* 已入账金额
* 累计入账比例
*/
@Schema(description = "已入账金额")
private String paidAmount;
@Schema(description = "累计入账比例")
private BigDecimal paidRatio;
/**
* 待入账金额
* 待入账比例
*/
@Schema(description = "待入账金额")
private String pendingAmount;
@Schema(description = "待入账比例")
private BigDecimal pendingRatio;
/**
* 通用备注
......
......@@ -26,8 +26,7 @@
<result property="currency" column="currency" />
<result property="commissionDate" column="commission_date" />
<result property="currentCommissionRatio" column="current_commission_ratio" />
<result property="periodPaidRatio" column="period_paid_ratio" />
<result property="periodPendingRatio" column="period_pending_ratio" />
<result property="commissionExpectedBizId" column="commission_expected_biz_id" />
<result property="status" column="status" />
<result property="statusDesc" column="status_desc" />
<result property="remark" column="remark" />
......@@ -43,7 +42,7 @@
insurance_company_biz_id,product_launch_biz_id,
reconciliation_company,reconciliation_company_code,reconciliation_company_biz_id,commission_period,
total_period,commission_name,commission_type,exchange_rate,amount,currency,
commission_date,current_commission_ratio,period_paid_ratio,period_pending_ratio,
commission_date,current_commission_ratio,commission_expected_biz_id,
status,status_desc,remark,is_deleted,creator_id,
updater_id,create_time,update_time
</sql>
......
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