Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-base
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-base
Commits
2b848e16
Commit
2b848e16
authored
Jun 11, 2026
by
zhangxingmin
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/dev' into prod
parents
b8806919
bc0ae7c6
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
161 additions
and
0 deletions
+161
-0
yd-base-api/src/main/java/com/yd/base/api/controller/ApiExchangeRateController.java
+12
-0
yd-base-api/src/main/java/com/yd/base/api/service/ApiExchangeRateService.java
+4
-0
yd-base-api/src/main/java/com/yd/base/api/service/impl/ApiExchangeRateServiceImpl.java
+80
-0
yd-base-feign/src/main/java/com/yd/base/feign/client/exchangerate/ApiExchangeRateFeignClient.java
+10
-0
yd-base-feign/src/main/java/com/yd/base/feign/dto/ApiQueryBatchExchangeRateDTO.java
+24
-0
yd-base-feign/src/main/java/com/yd/base/feign/fallback/exchangerate/ApiExchangeRateFeignFallbackFactory.java
+7
-0
yd-base-feign/src/main/java/com/yd/base/feign/request/exchangerate/ApiQueryBatchExchangeRateRequest.java
+12
-0
yd-base-feign/src/main/java/com/yd/base/feign/response/exchangerate/ApiQueryBatchExchangeRateResponse.java
+12
-0
No files found.
yd-base-api/src/main/java/com/yd/base/api/controller/ApiExchangeRateController.java
View file @
2b848e16
...
...
@@ -3,7 +3,9 @@ package com.yd.base.api.controller;
import
com.yd.base.api.service.ApiExchangeRateService
;
import
com.yd.base.feign.client.exchangerate.ApiExchangeRateFeignClient
;
import
com.yd.base.feign.request.exchangerate.ApiExchangeRateConvertRequest
;
import
com.yd.base.feign.request.exchangerate.ApiQueryBatchExchangeRateRequest
;
import
com.yd.base.feign.response.exchangerate.ApiExchangeRateConvertResponse
;
import
com.yd.base.feign.response.exchangerate.ApiQueryBatchExchangeRateResponse
;
import
com.yd.common.result.Result
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.validation.annotation.Validated
;
...
...
@@ -12,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController;
import
java.math.BigDecimal
;
import
java.util.List
;
/**
* 汇率信息
*
...
...
@@ -49,6 +52,15 @@ public class ApiExchangeRateController implements ApiExchangeRateFeignClient {
}
/**
* 批量获取汇率
* @return
*/
@Override
public
Result
<
ApiQueryBatchExchangeRateResponse
>
queryBatchExchangeRate
(
ApiQueryBatchExchangeRateRequest
request
)
{
return
apiExchangeRateService
.
queryBatchExchangeRate
(
request
);
}
/**
* 批量转换
* @param requests
* @return
...
...
yd-base-api/src/main/java/com/yd/base/api/service/ApiExchangeRateService.java
View file @
2b848e16
package
com
.
yd
.
base
.
api
.
service
;
import
com.yd.base.feign.request.exchangerate.ApiExchangeRateConvertRequest
;
import
com.yd.base.feign.request.exchangerate.ApiQueryBatchExchangeRateRequest
;
import
com.yd.base.feign.response.exchangerate.ApiExchangeRateConvertResponse
;
import
com.yd.base.feign.response.exchangerate.ApiQueryBatchExchangeRateResponse
;
import
com.yd.common.result.Result
;
import
java.math.BigDecimal
;
...
...
@@ -15,6 +17,8 @@ public interface ApiExchangeRateService {
Result
<
BigDecimal
>
getExchangeRate
(
String
baseCurrency
,
String
targetCurrency
,
String
date
);
Result
<
ApiQueryBatchExchangeRateResponse
>
queryBatchExchangeRate
(
ApiQueryBatchExchangeRateRequest
request
);
Result
<
List
<
ApiExchangeRateConvertResponse
>>
batchConvert
(
List
<
ApiExchangeRateConvertRequest
>
requests
);
Result
<
Boolean
>
isCurrencySupportedResult
(
String
currency
);
...
...
yd-base-api/src/main/java/com/yd/base/api/service/impl/ApiExchangeRateServiceImpl.java
View file @
2b848e16
package
com
.
yd
.
base
.
api
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.yd.base.api.service.ApiExchangeRateService
;
import
com.yd.base.feign.dto.ApiQueryBatchExchangeRateDTO
;
import
com.yd.base.feign.request.exchangerate.ApiExchangeRateConvertRequest
;
import
com.yd.base.feign.request.exchangerate.ApiQueryBatchExchangeRateRequest
;
import
com.yd.base.feign.response.exchangerate.ApiExchangeRateConvertResponse
;
import
com.yd.base.feign.response.exchangerate.ApiQueryBatchExchangeRateResponse
;
import
com.yd.base.service.model.ExchangeRate
;
import
com.yd.base.service.service.IExchangeRateService
;
import
com.yd.common.exception.BusinessException
;
...
...
@@ -19,6 +23,7 @@ import java.time.LocalDate;
import
java.time.format.DateTimeFormatter
;
import
java.time.format.DateTimeParseException
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Slf4j
@Service
...
...
@@ -140,6 +145,81 @@ public class ApiExchangeRateServiceImpl implements ApiExchangeRateService {
}
/**
* 批量获取汇率
* @param request
* @return
*/
@Override
public
Result
<
ApiQueryBatchExchangeRateResponse
>
queryBatchExchangeRate
(
ApiQueryBatchExchangeRateRequest
request
)
{
// 参数校验
if
(
request
==
null
||
CollectionUtils
.
isEmpty
(
request
.
getRateDTOList
()))
{
return
Result
.
success
(
new
ApiQueryBatchExchangeRateResponse
());
}
List
<
ApiQueryBatchExchangeRateDTO
>
requestList
=
request
.
getRateDTOList
();
// 1. 收集所有币种对,构建批量查询条件
List
<
Map
<
String
,
Object
>>
conditions
=
new
ArrayList
<>();
for
(
ApiQueryBatchExchangeRateDTO
dto
:
requestList
)
{
if
(
StringUtils
.
isNotBlank
(
dto
.
getBaseCurrency
())
&&
StringUtils
.
isNotBlank
(
dto
.
getTargetCurrency
()))
{
Map
<
String
,
Object
>
pair
=
new
HashMap
<>();
pair
.
put
(
"baseCurrency"
,
dto
.
getBaseCurrency
());
pair
.
put
(
"targetCurrency"
,
dto
.
getTargetCurrency
());
conditions
.
add
(
pair
);
}
}
// 2. 批量查询数据库(每个币种对取最新一条有效汇率)
Map
<
String
,
BigDecimal
>
rateMap
=
new
HashMap
<>();
if
(!
conditions
.
isEmpty
())
{
QueryWrapper
<
ExchangeRate
>
wrapper
=
new
QueryWrapper
<>();
wrapper
.
eq
(
"is_deleted"
,
0
)
.
eq
(
"is_active"
,
1
)
.
isNull
(
"expiration_date"
)
.
and
(
w
->
{
for
(
int
i
=
0
;
i
<
conditions
.
size
();
i
++)
{
Map
<
String
,
Object
>
pair
=
conditions
.
get
(
i
);
if
(
i
==
0
)
{
w
.
eq
(
"base_currency"
,
pair
.
get
(
"baseCurrency"
))
.
eq
(
"target_currency"
,
pair
.
get
(
"targetCurrency"
));
}
else
{
w
.
or
().
eq
(
"base_currency"
,
pair
.
get
(
"baseCurrency"
))
.
eq
(
"target_currency"
,
pair
.
get
(
"targetCurrency"
));
}
}
})
.
orderByDesc
(
"effective_date"
);
List
<
ExchangeRate
>
rates
=
iExchangeRateService
.
list
(
wrapper
);
// 每个币种对取最新一条
Map
<
String
,
ExchangeRate
>
latestMap
=
new
HashMap
<>();
for
(
ExchangeRate
rate
:
rates
)
{
String
key
=
rate
.
getBaseCurrency
()
+
":"
+
rate
.
getTargetCurrency
();
ExchangeRate
existing
=
latestMap
.
get
(
key
);
if
(
existing
==
null
||
rate
.
getEffectiveDate
().
isAfter
(
existing
.
getEffectiveDate
()))
{
latestMap
.
put
(
key
,
rate
);
}
}
latestMap
.
forEach
((
k
,
v
)
->
rateMap
.
put
(
k
,
v
.
getExchangeRate
()));
}
// 3. 构建响应
List
<
ApiQueryBatchExchangeRateDTO
>
resultList
=
new
ArrayList
<>();
for
(
ApiQueryBatchExchangeRateDTO
dto
:
requestList
)
{
String
key
=
dto
.
getBaseCurrency
()
+
":"
+
dto
.
getTargetCurrency
();
ApiQueryBatchExchangeRateDTO
result
=
new
ApiQueryBatchExchangeRateDTO
();
result
.
setBaseCurrency
(
dto
.
getBaseCurrency
());
result
.
setTargetCurrency
(
dto
.
getTargetCurrency
());
result
.
setExchangeRate
(
rateMap
.
get
(
key
));
// 未查到则为null
resultList
.
add
(
result
);
}
ApiQueryBatchExchangeRateResponse
response
=
new
ApiQueryBatchExchangeRateResponse
();
response
.
setRateDTOList
(
resultList
);
return
Result
.
success
(
response
);
}
/**
* 批量转换
* @param requests
* @return
...
...
yd-base-feign/src/main/java/com/yd/base/feign/client/exchangerate/ApiExchangeRateFeignClient.java
View file @
2b848e16
...
...
@@ -2,9 +2,12 @@ package com.yd.base.feign.client.exchangerate;
import
com.yd.base.feign.fallback.exchangerate.ApiExchangeRateFeignFallbackFactory
;
import
com.yd.base.feign.request.exchangerate.ApiExchangeRateConvertRequest
;
import
com.yd.base.feign.request.exchangerate.ApiQueryBatchExchangeRateRequest
;
import
com.yd.base.feign.response.exchangerate.ApiExchangeRateConvertResponse
;
import
com.yd.base.feign.response.exchangerate.ApiQueryBatchExchangeRateResponse
;
import
com.yd.common.result.Result
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
...
...
@@ -41,6 +44,13 @@ public interface ApiExchangeRateFeignClient {
);
/**
* 批量获取汇率
* @return
*/
@PostMapping
(
"/query/batch/rate"
)
Result
<
ApiQueryBatchExchangeRateResponse
>
queryBatchExchangeRate
(
@Validated
@RequestBody
ApiQueryBatchExchangeRateRequest
request
);
/**
* 批量转换
* @param requests
* @return
...
...
yd-base-feign/src/main/java/com/yd/base/feign/dto/ApiQueryBatchExchangeRateDTO.java
0 → 100644
View file @
2b848e16
package
com
.
yd
.
base
.
feign
.
dto
;
import
lombok.Data
;
import
java.math.BigDecimal
;
@Data
public
class
ApiQueryBatchExchangeRateDTO
{
/**
* 基础币种代码(ISO 4217标准)
*/
private
String
baseCurrency
;
/**
* 目标币种代码(ISO 4217标准)
*/
private
String
targetCurrency
;
/**
* 汇率(1单位基础币种可兑换的目标币种数量)
*/
private
BigDecimal
exchangeRate
;
}
yd-base-feign/src/main/java/com/yd/base/feign/fallback/exchangerate/ApiExchangeRateFeignFallbackFactory.java
View file @
2b848e16
...
...
@@ -2,7 +2,9 @@ package com.yd.base.feign.fallback.exchangerate;
import
com.yd.base.feign.client.exchangerate.ApiExchangeRateFeignClient
;
import
com.yd.base.feign.request.exchangerate.ApiExchangeRateConvertRequest
;
import
com.yd.base.feign.request.exchangerate.ApiQueryBatchExchangeRateRequest
;
import
com.yd.base.feign.response.exchangerate.ApiExchangeRateConvertResponse
;
import
com.yd.base.feign.response.exchangerate.ApiQueryBatchExchangeRateResponse
;
import
com.yd.common.result.Result
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.cloud.openfeign.FallbackFactory
;
...
...
@@ -31,6 +33,11 @@ public class ApiExchangeRateFeignFallbackFactory implements FallbackFactory<ApiE
}
@Override
public
Result
<
ApiQueryBatchExchangeRateResponse
>
queryBatchExchangeRate
(
ApiQueryBatchExchangeRateRequest
request
)
{
return
null
;
}
@Override
public
Result
<
List
<
ApiExchangeRateConvertResponse
>>
batchConvert
(
List
<
ApiExchangeRateConvertRequest
>
requests
)
{
return
null
;
}
...
...
yd-base-feign/src/main/java/com/yd/base/feign/request/exchangerate/ApiQueryBatchExchangeRateRequest.java
0 → 100644
View file @
2b848e16
package
com
.
yd
.
base
.
feign
.
request
.
exchangerate
;
import
com.yd.base.feign.dto.ApiQueryBatchExchangeRateDTO
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
ApiQueryBatchExchangeRateRequest
{
private
List
<
ApiQueryBatchExchangeRateDTO
>
rateDTOList
;
}
yd-base-feign/src/main/java/com/yd/base/feign/response/exchangerate/ApiQueryBatchExchangeRateResponse.java
0 → 100644
View file @
2b848e16
package
com
.
yd
.
base
.
feign
.
response
.
exchangerate
;
import
com.yd.base.feign.dto.ApiQueryBatchExchangeRateDTO
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
ApiQueryBatchExchangeRateResponse
{
private
List
<
ApiQueryBatchExchangeRateDTO
>
rateDTOList
;
}
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