Commit e66789f0 by zhangxingmin

push

parent a1094323
......@@ -149,9 +149,12 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
// 构建对账记录ID到保单号的映射
Map<String, String> reconciliationBizIdToPolicyNoMap = new HashMap<>();
// 构建对账记录ID到响应对象的映射
Map<String, ApiPremiumReconciliationPageResponse> reconciliationMap = new HashMap<>();
if (!CollectionUtils.isEmpty(iPage.getRecords())) {
for (ApiPremiumReconciliationPageResponse item : iPage.getRecords()) {
reconciliationBizIdToPolicyNoMap.put(item.getPremiumReconciliationBizId(), item.getPolicyNo());
reconciliationMap.put(item.getPremiumReconciliationBizId(), item);
}
}
......@@ -160,7 +163,9 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
if (!CollectionUtils.isEmpty(apiPremiumRemittanceDtoList)) {
for (ApiPremiumRemittanceDto remittanceDto : apiPremiumRemittanceDtoList) {
String reconciliationBizId = remittanceDto.getPremiumReconciliationBizId();
if (StringUtils.isNotBlank(reconciliationBizId)) {
if (StringUtils.isNotBlank(reconciliationBizId) &&
StringUtils.isNotBlank(remittanceDto.getPaymentCurrency()) &&
remittanceDto.getPaymentAmount() != null) {
reconciliationRemittanceMap
.computeIfAbsent(reconciliationBizId, k -> new ArrayList<>())
.add(remittanceDto);
......@@ -168,11 +173,13 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
}
}
// 批量处理汇率转换请求
// 为每个对账记录计算总付款金额(转换为保单币种)
Map<String, BigDecimal> totalPaymentAmounts = new HashMap<>();
// 首先收集所有需要转换的请求
List<ApiExchangeRateConvertRequest> convertRequests = new ArrayList<>();
Map<String, ConvertRequestInfo> requestInfoMap = new HashMap<>(); // key: requestId, value: 转换信息
Map<String, ConvertInfo> convertInfoMap = new HashMap<>();
if (!CollectionUtils.isEmpty(reconciliationRemittanceMap)) {
for (Map.Entry<String, List<ApiPremiumRemittanceDto>> entry : reconciliationRemittanceMap.entrySet()) {
String reconciliationBizId = entry.getKey();
List<ApiPremiumRemittanceDto> remittanceDtos = entry.getValue();
......@@ -189,148 +196,122 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
continue;
}
// 为每条汇款记录构建转换请求
// 初始化总金额
BigDecimal totalAmount = BigDecimal.ZERO;
// 首先处理相同币种的汇款记录
for (ApiPremiumRemittanceDto remittanceDto : remittanceDtos) {
if (remittanceDto.getPaymentAmount() == null ||
StringUtils.isBlank(remittanceDto.getPaymentCurrency())) {
log.warn("汇款记录金额或币种为空,跳过转换");
continue;
String remittanceCurrency = remittanceDto.getPaymentCurrency();
BigDecimal amount = remittanceDto.getPaymentAmount();
if (policyCurrency.equalsIgnoreCase(remittanceCurrency)) {
totalAmount = totalAmount.add(amount);
}
}
// 如果汇款币种与保单币种相同,不需要转换
if (policyCurrency.equalsIgnoreCase(remittanceDto.getPaymentCurrency())) {
// 然后处理需要转换的汇款记录
for (ApiPremiumRemittanceDto remittanceDto : remittanceDtos) {
String remittanceCurrency = remittanceDto.getPaymentCurrency();
BigDecimal amount = remittanceDto.getPaymentAmount();
// 如果币种相同,已经在上面处理过了
if (policyCurrency.equalsIgnoreCase(remittanceCurrency)) {
continue;
}
// 构建转换请求
ApiExchangeRateConvertRequest convertRequest = new ApiExchangeRateConvertRequest();
convertRequest.setAmount(remittanceDto.getPaymentAmount());
convertRequest.setFromCurrency(remittanceDto.getPaymentCurrency());
convertRequest.setAmount(amount);
convertRequest.setFromCurrency(remittanceCurrency);
convertRequest.setToCurrency(policyCurrency);
// 如果有付款日期,使用付款日期作为交易日期
// if (remittanceDto.getPaymentDate() != null) {
// // LocalDateTime 转换为 Date
// Date paymentDate = Date.from(remittanceDto.getPaymentDate()
// .atZone(java.time.ZoneId.systemDefault()).toInstant());
// convertRequest.setTransactionDate(paymentDate);
// }
// 如果有付款日期,使用付款日期
if (remittanceDto.getPaymentDate() != null) {
try {
Date paymentDate = Date.from(remittanceDto.getPaymentDate()
.atZone(java.time.ZoneId.systemDefault()).toInstant());
convertRequest.setTransactionDate(paymentDate);
} catch (Exception e) {
log.warn("转换付款日期失败: {}", remittanceDto.getPaymentDate(), e);
}
}
// 生成请求ID用于匹配结果
String requestId = reconciliationBizId + "_" + remittanceDto.getPremiumRemittanceBizId();
// 生成唯一请求ID
String requestId = reconciliationBizId + "_" +
(StringUtils.isNotBlank(remittanceDto.getPremiumRemittanceBizId()) ?
remittanceDto.getPremiumRemittanceBizId() : UUID.randomUUID().toString());
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);
}
}
// 保存转换信息
ConvertInfo info = new ConvertInfo();
info.reconciliationBizId = reconciliationBizId;
info.originalAmount = amount;
info.originalCurrency = remittanceCurrency;
info.targetCurrency = policyCurrency;
convertInfoMap.put(requestId, info);
}
// 调用批量转换接口
Map<String, BigDecimal> conversionResults = new HashMap<>(); // key: reconciliationBizId, value: 转换后的总金额
Map<String, String> conversionCurrencies = new HashMap<>(); // key: reconciliationBizId, value: 目标币种
// 先保存相同币种的累计金额
totalAmount = totalAmount.setScale(2, RoundingMode.HALF_EVEN);
totalPaymentAmounts.put(reconciliationBizId, totalAmount);
}
// 批量处理汇率转换
if (!CollectionUtils.isEmpty(convertRequests)) {
try {
Result<List<ApiExchangeRateConvertResponse>> batchConvertResult =
apiExchangeRateFeignClient.batchConvert(convertRequests);
// 分批处理,避免请求过大
int batchSize = 50;
for (int i = 0; i < convertRequests.size(); i += batchSize) {
int end = Math.min(convertRequests.size(), i + batchSize);
List<ApiExchangeRateConvertRequest> batch = convertRequests.subList(i, end);
if (batchConvertResult != null && batchConvertResult.getCode() == 200 &&
!CollectionUtils.isEmpty(batchConvertResult.getData())) {
Result<List<ApiExchangeRateConvertResponse>> batchResult =
apiExchangeRateFeignClient.batchConvert(batch);
// 处理批量转换结果
Map<String, BigDecimal> conversionAmounts = new HashMap<>();
if (batchResult != null && batchResult.getCode() == 200 &&
!CollectionUtils.isEmpty(batchResult.getData())) {
for (ApiExchangeRateConvertResponse convertResponse : batchConvertResult.getData()) {
// 处理转换结果
for (ApiExchangeRateConvertResponse convertResponse : batchResult.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);
}
}
ConvertInfo info = convertInfoMap.get(requestId);
// 汇总计算每个对账记录的总付款金额
Map<String, BigDecimal> totalPaymentAmounts = new HashMap<>();
Map<String, String> totalPaymentCurrencies = new HashMap<>();
if (info != null && convertResponse.getConvertedAmount() != null) {
BigDecimal currentTotal = totalPaymentAmounts.getOrDefault(info.reconciliationBizId, BigDecimal.ZERO);
BigDecimal convertedAmount = convertResponse.getConvertedAmount();
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;
// 设置精度并累加
convertedAmount = convertedAmount.setScale(2, RoundingMode.HALF_EVEN);
totalPaymentAmounts.put(info.reconciliationBizId, currentTotal.add(convertedAmount));
}
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中已经是对账记录级别的汇总金额,这里需要重新计算
// 我们改为按汇款记录单独处理
}
log.error("批量汇率转换失败: {}", batchResult != null ? batchResult.getMsg() : "null");
}
}
// 加上批量转换的金额(如果有)
if (conversionResults.containsKey(reconciliationBizId)) {
totalAmount = totalAmount.add(conversionResults.get(reconciliationBizId));
} catch (Exception e) {
log.error("汇率转换处理异常", e);
}
// 设置精度
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));
BigDecimal totalAmount = totalPaymentAmounts.get(reconciliationBizId);
item.setPaymentAmount(totalAmount);
String policyNo = reconciliationBizIdToPolicyNoMap.get(reconciliationBizId);
if (StringUtils.isNotBlank(policyNo)) {
String policyCurrency = policyNoToCurrencyMap.get(policyNo);
if (StringUtils.isNotBlank(policyCurrency)) {
item.setPaymentCurrency(policyCurrency);
}
}
}
}
}
......@@ -339,6 +320,14 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
return Result.success(iPage);
}
// 辅助类
private static class ConvertInfo {
String reconciliationBizId;
BigDecimal originalAmount;
String originalCurrency;
String targetCurrency;
}
// 内部类,用于保存转换请求信息
private static class ConvertRequestInfo {
private String reconciliationBizId;
......
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