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
a1094323
Commit
a1094323
authored
Jan 14, 2026
by
zhangxingmin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
push
parent
7aad1b01
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
294 additions
and
4 deletions
+294
-4
yd-csf-api/src/main/java/com/yd/csf/api/service/ApiPremiumRemittanceService.java
+2
-0
yd-csf-api/src/main/java/com/yd/csf/api/service/impl/ApiPremiumReconciliationServiceImpl.java
+266
-3
yd-csf-api/src/main/java/com/yd/csf/api/service/impl/ApiPremiumRemittanceServiceImpl.java
+19
-0
yd-csf-service/src/main/java/com/yd/csf/service/dto/PremiumRemittanceDto.java
+6
-1
yd-csf-service/src/main/java/com/yd/csf/service/service/impl/PremiumRemittanceServiceImpl.java
+1
-0
No files found.
yd-csf-api/src/main/java/com/yd/csf/api/service/ApiPremiumRemittanceService.java
View file @
a1094323
...
...
@@ -26,4 +26,6 @@ public interface ApiPremiumRemittanceService {
List
<
ApiPremiumRemittanceDto
>
apiPremiumRemittanceDtoList
(
String
premiumReconciliationBizId
);
Result
<
PremiumRemittance
>
checkPremiumRemittanceIsExist
(
String
premiumRemittanceBizId
);
List
<
ApiPremiumRemittanceDto
>
list
(
List
<
String
>
premiumReconciliationBizIdList
);
}
yd-csf-api/src/main/java/com/yd/csf/api/service/impl/ApiPremiumReconciliationServiceImpl.java
View file @
a1094323
...
...
@@ -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
.
getBank
Short
Name
())
?
bankDetail
.
getBank
Short
Name
()
:
bankDetail
.
getBankName
();
String
bankName
=
StringUtils
.
isNotBlank
(
bankDetail
.
getBankName
())
?
bankDetail
.
getBankName
()
:
bankDetail
.
getBank
Short
Name
();
bankNameMap
.
put
(
bankDetail
.
getBankBizId
(),
bankName
);
}
}
...
...
yd-csf-api/src/main/java/com/yd/csf/api/service/impl/ApiPremiumRemittanceServiceImpl.java
View file @
a1094323
...
...
@@ -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
;
}
}
yd-csf-service/src/main/java/com/yd/csf/service/dto/PremiumRemittanceDto.java
View file @
a1094323
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
;
}
yd-csf-service/src/main/java/com/yd/csf/service/service/impl/PremiumRemittanceServiceImpl.java
View file @
a1094323
...
...
@@ -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
;
}
...
...
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