Commit 2b848e16 by zhangxingmin

Merge remote-tracking branch 'origin/dev' into prod

parents b8806919 bc0ae7c6
......@@ -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
......
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);
......
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
......
......@@ -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
......
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;
}
......@@ -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;
}
......
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;
}
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;
}
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