Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-csf
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xingmin
yd-csf
Commits
e66789f0
Commit
e66789f0
authored
Jan 14, 2026
by
zhangxingmin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
push
parent
a1094323
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
119 additions
and
130 deletions
+119
-130
yd-csf-api/src/main/java/com/yd/csf/api/service/impl/ApiPremiumReconciliationServiceImpl.java
+119
-130
No files found.
yd-csf-api/src/main/java/com/yd/csf/api/service/impl/ApiPremiumReconciliationServiceImpl.java
View file @
e66789f0
...
...
@@ -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,169 +173,145 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
}
}
// 批量处理汇率转换请求
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
<>();
// 首先收集所有需要转换的请求
List
<
ApiExchangeRateConvertRequest
>
convertRequests
=
new
ArrayList
<>();
Map
<
String
,
ConvertInfo
>
convertInfoMap
=
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
(
policyNo
))
{
log
.
warn
(
"找不到对账记录ID: {} 对应的保单号"
,
reconciliationBizId
);
continue
;
}
String
policyCurrency
=
policyNoToCurrencyMap
.
get
(
policyNo
);
if
(
StringUtils
.
isBlank
(
policyCurrency
))
{
log
.
warn
(
"保单号: {} 的币种信息为空"
,
policyNo
);
continue
;
}
// 初始化总金额
BigDecimal
totalAmount
=
BigDecimal
.
ZERO
;
//
汇总所有
汇款记录
//
首先处理相同币种的
汇款记录
for
(
ApiPremiumRemittanceDto
remittanceDto
:
remittanceDtos
)
{
if
(
remittanceDto
.
getPaymentAmount
()
==
null
)
{
continue
;
String
remittanceCurrency
=
remittanceDto
.
getPaymentCurrency
();
BigDecimal
amount
=
remittanceDto
.
getPaymentAmount
();
if
(
policyCurrency
.
equalsIgnoreCase
(
remittanceCurrency
))
{
totalAmount
=
totalAmount
.
add
(
amount
);
}
}
// 然后处理需要转换的汇款记录
for
(
ApiPremiumRemittanceDto
remittanceDto
:
remittanceDtos
)
{
String
remittanceCurrency
=
remittanceDto
.
getPaymentCurrency
();
BigDecimal
amount
=
remittanceDto
.
getPaymentAmount
();
// 如果
汇款币种与保单币种相同,直接累加
// 如果
币种相同,已经在上面处理过了
if
(
policyCurrency
.
equalsIgnoreCase
(
remittanceCurrency
))
{
totalAmount
=
totalAmount
.
add
(
remittanceDto
.
getPaymentAmount
());
}
else
{
// 查找转换结果
String
conversionKey
=
reconciliationBizId
+
"_"
+
remittanceDto
.
getPremiumRemittanceBizId
();
continue
;
}
// 如果批量转换结果中有这条记录,使用转换后的金额
if
(
conversionResults
.
containsKey
(
reconciliationBizId
))
{
// 注意:conversionResults中已经是对账记录级别的汇总金额,这里需要重新计算
// 我们改为按汇款记录单独处理
// 构建转换请求
ApiExchangeRateConvertRequest
convertRequest
=
new
ApiExchangeRateConvertRequest
();
convertRequest
.
setAmount
(
amount
);
convertRequest
.
setFromCurrency
(
remittanceCurrency
);
convertRequest
.
setToCurrency
(
policyCurrency
);
// 如果有付款日期,使用付款日期
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
);
}
}
}
// 加上批量转换的金额(如果有)
if
(
conversionResults
.
containsKey
(
reconciliationBizId
))
{
totalAmount
=
totalAmount
.
add
(
conversionResults
.
get
(
reconciliationBizId
));
// 生成唯一请求ID
String
requestId
=
reconciliationBizId
+
"_"
+
(
StringUtils
.
isNotBlank
(
remittanceDto
.
getPremiumRemittanceBizId
())
?
remittanceDto
.
getPremiumRemittanceBizId
()
:
UUID
.
randomUUID
().
toString
());
convertRequest
.
setRequestId
(
requestId
);
convertRequests
.
add
(
convertRequest
);
// 保存转换信息
ConvertInfo
info
=
new
ConvertInfo
();
info
.
reconciliationBizId
=
reconciliationBizId
;
info
.
originalAmount
=
amount
;
info
.
originalCurrency
=
remittanceCurrency
;
info
.
targetCurrency
=
policyCurrency
;
convertInfoMap
.
put
(
requestId
,
info
);
}
//
设置精度
//
先保存相同币种的累计金额
totalAmount
=
totalAmount
.
setScale
(
2
,
RoundingMode
.
HALF_EVEN
);
totalPaymentAmounts
.
put
(
reconciliationBizId
,
totalAmount
);
totalPaymentCurrencies
.
put
(
reconciliationBizId
,
policyCurrency
);
}
// 更新分页响应中的付款金额和币种
// 批量处理汇率转换
if
(!
CollectionUtils
.
isEmpty
(
convertRequests
))
{
try
{
// 分批处理,避免请求过大
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
);
Result
<
List
<
ApiExchangeRateConvertResponse
>>
batchResult
=
apiExchangeRateFeignClient
.
batchConvert
(
batch
);
if
(
batchResult
!=
null
&&
batchResult
.
getCode
()
==
200
&&
!
CollectionUtils
.
isEmpty
(
batchResult
.
getData
()))
{
// 处理转换结果
for
(
ApiExchangeRateConvertResponse
convertResponse
:
batchResult
.
getData
())
{
String
requestId
=
convertResponse
.
getRequestId
();
ConvertInfo
info
=
convertInfoMap
.
get
(
requestId
);
if
(
info
!=
null
&&
convertResponse
.
getConvertedAmount
()
!=
null
)
{
BigDecimal
currentTotal
=
totalPaymentAmounts
.
getOrDefault
(
info
.
reconciliationBizId
,
BigDecimal
.
ZERO
);
BigDecimal
convertedAmount
=
convertResponse
.
getConvertedAmount
();
// 设置精度并累加
convertedAmount
=
convertedAmount
.
setScale
(
2
,
RoundingMode
.
HALF_EVEN
);
totalPaymentAmounts
.
put
(
info
.
reconciliationBizId
,
currentTotal
.
add
(
convertedAmount
));
}
}
}
else
{
log
.
error
(
"批量汇率转换失败: {}"
,
batchResult
!=
null
?
batchResult
.
getMsg
()
:
"null"
);
}
}
}
catch
(
Exception
e
)
{
log
.
error
(
"汇率转换处理异常"
,
e
);
}
}
// 更新分页响应
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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment