Commit a1094323 by zhangxingmin

push

parent 7aad1b01
......@@ -26,4 +26,6 @@ public interface ApiPremiumRemittanceService {
List<ApiPremiumRemittanceDto> apiPremiumRemittanceDtoList(String premiumReconciliationBizId);
Result<PremiumRemittance> checkPremiumRemittanceIsExist(String premiumRemittanceBizId);
List<ApiPremiumRemittanceDto> list(List<String> premiumReconciliationBizIdList);
}
......@@ -26,6 +26,7 @@ import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationD
import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationPageResponse;
import com.yd.csf.feign.response.team.ApiTeamPageResponse;
import com.yd.csf.service.dto.PremiumReconciliationDto;
import com.yd.csf.service.dto.QueryPolicyDto;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.model.PremiumReconciliation;
......@@ -86,10 +87,17 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
// 获取所有银行ID,准备翻译银行名称
Set<String> bankBizIdSet = new HashSet<>();
//收集返回数据的保费对账记录表唯一业务ID列表
List<String> premiumReconciliationBizIdList = new ArrayList<>();
//收集保单号列表
List<String> policyNoList = new ArrayList<>();
// 收集所有银行ID并翻译缴费方式
if (iPage != null && !CollectionUtils.isEmpty(iPage.getRecords())) {
for (ApiPremiumReconciliationPageResponse item : iPage.getRecords()) {
//收集返回数据的保费对账记录表唯一业务ID列表
premiumReconciliationBizIdList.add(item.getPremiumReconciliationBizId());
policyNoList.add(item.getPolicyNo());
// 翻译缴费方式
if (StringUtils.isNotBlank(item.getPaymentMethod())) {
String translated = translatePaymentMethod(item.getPaymentMethod(), paymentMethodDictMap);
......@@ -122,9 +130,264 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
}
}
//汇总统计付款金额和付款币种
if (!CollectionUtils.isEmpty(premiumReconciliationBizIdList)) {
//收集返回数据的保费对账记录表唯一业务ID列表查询返回关联的汇款记录列表
List<ApiPremiumRemittanceDto> apiPremiumRemittanceDtoList = apiPremiumRemittanceService.list(premiumReconciliationBizIdList);
//查询保单列表信息
List<Policy> policyList = policyService.queryList(QueryPolicyDto.builder().policyNoList(policyNoList).build());
// 构建保单号到保单币种的映射
Map<String, String> policyNoToCurrencyMap = new HashMap<>();
if (!CollectionUtils.isEmpty(policyList)) {
for (Policy policy : policyList) {
if (StringUtils.isNotBlank(policy.getPolicyNo()) && StringUtils.isNotBlank(policy.getCurrency())) {
policyNoToCurrencyMap.put(policy.getPolicyNo(), policy.getCurrency());
}
}
}
// 构建对账记录ID到保单号的映射
Map<String, String> reconciliationBizIdToPolicyNoMap = new HashMap<>();
if (!CollectionUtils.isEmpty(iPage.getRecords())) {
for (ApiPremiumReconciliationPageResponse item : iPage.getRecords()) {
reconciliationBizIdToPolicyNoMap.put(item.getPremiumReconciliationBizId(), item.getPolicyNo());
}
}
// 按对账记录ID分组汇款记录
Map<String, List<ApiPremiumRemittanceDto>> reconciliationRemittanceMap = new HashMap<>();
if (!CollectionUtils.isEmpty(apiPremiumRemittanceDtoList)) {
for (ApiPremiumRemittanceDto remittanceDto : apiPremiumRemittanceDtoList) {
String reconciliationBizId = remittanceDto.getPremiumReconciliationBizId();
if (StringUtils.isNotBlank(reconciliationBizId)) {
reconciliationRemittanceMap
.computeIfAbsent(reconciliationBizId, k -> new ArrayList<>())
.add(remittanceDto);
}
}
}
// 批量处理汇率转换请求
List<ApiExchangeRateConvertRequest> convertRequests = new ArrayList<>();
Map<String, ConvertRequestInfo> requestInfoMap = new HashMap<>(); // key: requestId, value: 转换信息
if (!CollectionUtils.isEmpty(reconciliationRemittanceMap)) {
for (Map.Entry<String, List<ApiPremiumRemittanceDto>> entry : reconciliationRemittanceMap.entrySet()) {
String reconciliationBizId = entry.getKey();
List<ApiPremiumRemittanceDto> remittanceDtos = entry.getValue();
String policyNo = reconciliationBizIdToPolicyNoMap.get(reconciliationBizId);
if (StringUtils.isBlank(policyNo)) {
log.warn("找不到对账记录ID: {} 对应的保单号", reconciliationBizId);
continue;
}
String policyCurrency = policyNoToCurrencyMap.get(policyNo);
if (StringUtils.isBlank(policyCurrency)) {
log.warn("保单号: {} 的币种信息为空", policyNo);
continue;
}
// 为每条汇款记录构建转换请求
for (ApiPremiumRemittanceDto remittanceDto : remittanceDtos) {
if (remittanceDto.getPaymentAmount() == null ||
StringUtils.isBlank(remittanceDto.getPaymentCurrency())) {
log.warn("汇款记录金额或币种为空,跳过转换");
continue;
}
// 如果汇款币种与保单币种相同,不需要转换
if (policyCurrency.equalsIgnoreCase(remittanceDto.getPaymentCurrency())) {
continue;
}
// 构建转换请求
ApiExchangeRateConvertRequest convertRequest = new ApiExchangeRateConvertRequest();
convertRequest.setAmount(remittanceDto.getPaymentAmount());
convertRequest.setFromCurrency(remittanceDto.getPaymentCurrency());
convertRequest.setToCurrency(policyCurrency);
// 如果有付款日期,使用付款日期作为交易日期
// if (remittanceDto.getPaymentDate() != null) {
// // LocalDateTime 转换为 Date
// Date paymentDate = Date.from(remittanceDto.getPaymentDate()
// .atZone(java.time.ZoneId.systemDefault()).toInstant());
// convertRequest.setTransactionDate(paymentDate);
// }
// 生成请求ID用于匹配结果
String requestId = reconciliationBizId + "_" + remittanceDto.getPremiumRemittanceBizId();
convertRequest.setRequestId(requestId);
// 保存转换请求信息
ConvertRequestInfo requestInfo = new ConvertRequestInfo();
requestInfo.setReconciliationBizId(reconciliationBizId);
requestInfo.setRemittanceBizId(remittanceDto.getPremiumRemittanceBizId());
requestInfo.setOriginalAmount(remittanceDto.getPaymentAmount());
requestInfo.setOriginalCurrency(remittanceDto.getPaymentCurrency());
requestInfo.setTargetCurrency(policyCurrency);
requestInfoMap.put(requestId, requestInfo);
convertRequests.add(convertRequest);
}
}
}
// 调用批量转换接口
Map<String, BigDecimal> conversionResults = new HashMap<>(); // key: reconciliationBizId, value: 转换后的总金额
Map<String, String> conversionCurrencies = new HashMap<>(); // key: reconciliationBizId, value: 目标币种
if (!CollectionUtils.isEmpty(convertRequests)) {
try {
Result<List<ApiExchangeRateConvertResponse>> batchConvertResult =
apiExchangeRateFeignClient.batchConvert(convertRequests);
if (batchConvertResult != null && batchConvertResult.getCode() == 200 &&
!CollectionUtils.isEmpty(batchConvertResult.getData())) {
// 处理批量转换结果
Map<String, BigDecimal> conversionAmounts = new HashMap<>();
for (ApiExchangeRateConvertResponse convertResponse : batchConvertResult.getData()) {
String requestId = convertResponse.getRequestId();
ConvertRequestInfo requestInfo = requestInfoMap.get(requestId);
if (requestInfo != null && convertResponse.getConvertedAmount() != null) {
// 累加转换后的金额到对应的对账记录
String reconBizId = requestInfo.getReconciliationBizId();
BigDecimal currentAmount = conversionAmounts.getOrDefault(reconBizId, BigDecimal.ZERO);
conversionAmounts.put(reconBizId, currentAmount.add(convertResponse.getConvertedAmount()));
conversionCurrencies.put(reconBizId, convertResponse.getTargetCurrency());
}
}
conversionResults.putAll(conversionAmounts);
} else {
log.error("批量汇率转换失败,code: {}, msg: {}",
batchConvertResult != null ? batchConvertResult.getCode() : "null",
batchConvertResult != null ? batchConvertResult.getMsg() : "null");
}
} catch (Exception e) {
log.error("调用汇率批量转换接口异常", e);
}
}
// 汇总计算每个对账记录的总付款金额
Map<String, BigDecimal> totalPaymentAmounts = new HashMap<>();
Map<String, String> totalPaymentCurrencies = new HashMap<>();
for (Map.Entry<String, List<ApiPremiumRemittanceDto>> entry : reconciliationRemittanceMap.entrySet()) {
String reconciliationBizId = entry.getKey();
List<ApiPremiumRemittanceDto> remittanceDtos = entry.getValue();
String policyNo = reconciliationBizIdToPolicyNoMap.get(reconciliationBizId);
String policyCurrency = policyNoToCurrencyMap.get(policyNo);
if (StringUtils.isBlank(policyCurrency)) {
continue;
}
BigDecimal totalAmount = BigDecimal.ZERO;
// 汇总所有汇款记录
for (ApiPremiumRemittanceDto remittanceDto : remittanceDtos) {
if (remittanceDto.getPaymentAmount() == null) {
continue;
}
String remittanceCurrency = remittanceDto.getPaymentCurrency();
// 如果汇款币种与保单币种相同,直接累加
if (policyCurrency.equalsIgnoreCase(remittanceCurrency)) {
totalAmount = totalAmount.add(remittanceDto.getPaymentAmount());
} else {
// 查找转换结果
String conversionKey = reconciliationBizId + "_" + remittanceDto.getPremiumRemittanceBizId();
// 如果批量转换结果中有这条记录,使用转换后的金额
if (conversionResults.containsKey(reconciliationBizId)) {
// 注意:conversionResults中已经是对账记录级别的汇总金额,这里需要重新计算
// 我们改为按汇款记录单独处理
}
}
}
// 加上批量转换的金额(如果有)
if (conversionResults.containsKey(reconciliationBizId)) {
totalAmount = totalAmount.add(conversionResults.get(reconciliationBizId));
}
// 设置精度
totalAmount = totalAmount.setScale(2, RoundingMode.HALF_EVEN);
totalPaymentAmounts.put(reconciliationBizId, totalAmount);
totalPaymentCurrencies.put(reconciliationBizId, policyCurrency);
}
// 更新分页响应中的付款金额和币种
if (!CollectionUtils.isEmpty(iPage.getRecords())) {
for (ApiPremiumReconciliationPageResponse item : iPage.getRecords()) {
String reconciliationBizId = item.getPremiumReconciliationBizId();
if (totalPaymentAmounts.containsKey(reconciliationBizId)) {
item.setPaymentAmount(totalPaymentAmounts.get(reconciliationBizId));
item.setPaymentCurrency(totalPaymentCurrencies.get(reconciliationBizId));
}
}
}
}
return Result.success(iPage);
}
// 内部类,用于保存转换请求信息
private static class ConvertRequestInfo {
private String reconciliationBizId;
private String remittanceBizId;
private BigDecimal originalAmount;
private String originalCurrency;
private String targetCurrency;
// getters and setters
public String getReconciliationBizId() {
return reconciliationBizId;
}
public void setReconciliationBizId(String reconciliationBizId) {
this.reconciliationBizId = reconciliationBizId;
}
public String getRemittanceBizId() {
return remittanceBizId;
}
public void setRemittanceBizId(String remittanceBizId) {
this.remittanceBizId = remittanceBizId;
}
public BigDecimal getOriginalAmount() {
return originalAmount;
}
public void setOriginalAmount(BigDecimal originalAmount) {
this.originalAmount = originalAmount;
}
public String getOriginalCurrency() {
return originalCurrency;
}
public void setOriginalCurrency(String originalCurrency) {
this.originalCurrency = originalCurrency;
}
public String getTargetCurrency() {
return targetCurrency;
}
public void setTargetCurrency(String targetCurrency) {
this.targetCurrency = targetCurrency;
}
}
/**
* 获取缴费方式字典数据
*/
......@@ -165,9 +428,9 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
if (bankResult != null && bankResult.getCode() == 200 && !CollectionUtils.isEmpty(bankResult.getData())) {
for (ApiBankDetailResponse bankDetail : bankResult.getData()) {
// 优先使用银行简称,如果没有则使用银行全称
String bankName = StringUtils.isNotBlank(bankDetail.getBankShortName())
? bankDetail.getBankShortName()
: bankDetail.getBankName();
String bankName = StringUtils.isNotBlank(bankDetail.getBankName())
? bankDetail.getBankName()
: bankDetail.getBankShortName();
bankNameMap.put(bankDetail.getBankBizId(), bankName);
}
}
......
......@@ -197,4 +197,23 @@ public class ApiPremiumRemittanceServiceImpl implements ApiPremiumRemittanceServ
}
return Result.success(premiumRemittance);
}
/**
* 查询列表
* @param premiumReconciliationBizIdList
* @return
*/
@Override
public List<ApiPremiumRemittanceDto> list(List<String> premiumReconciliationBizIdList) {
List<ApiPremiumRemittanceDto> apiPremiumRemittanceDtoList = new ArrayList<>();
List<PremiumRemittance> list = iPremiumRemittanceService.queryList(PremiumRemittanceDto.builder().premiumReconciliationBizIdList(premiumReconciliationBizIdList).build());
if (!CollectionUtils.isEmpty(list)) {
apiPremiumRemittanceDtoList = list.stream().map(dto -> {
ApiPremiumRemittanceDto remittanceDto = new ApiPremiumRemittanceDto();
BeanUtils.copyProperties(dto,remittanceDto);
return remittanceDto;
}).collect(Collectors.toList());
}
return apiPremiumRemittanceDtoList;
}
}
package com.yd.csf.service.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
......@@ -16,4 +16,9 @@ public class PremiumRemittanceDto {
* 保费对账记录表唯一业务ID
*/
private String premiumReconciliationBizId;
/**
* 保费对账记录表唯一业务ID列表
*/
private List<String> premiumReconciliationBizIdList;
}
......@@ -42,6 +42,7 @@ public class PremiumRemittanceServiceImpl extends ServiceImpl<PremiumRemittanceM
public List<PremiumRemittance> queryList(PremiumRemittanceDto dto) {
List<PremiumRemittance> list = baseMapper.selectList(new LambdaQueryWrapper<PremiumRemittance>()
.eq(StringUtils.isNotBlank(dto.getPremiumReconciliationBizId()),PremiumRemittance::getPremiumReconciliationBizId,dto.getPremiumReconciliationBizId())
.in(!CollectionUtils.isEmpty(dto.getPremiumReconciliationBizIdList()),PremiumRemittance::getPremiumReconciliationBizId,dto.getPremiumReconciliationBizIdList())
);
return list;
}
......
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