|
|
|
@ -2,15 +2,20 @@ package com.example.demo.controller.coin; |
|
|
|
|
|
|
|
import com.example.demo.Util.BusinessException; |
|
|
|
import com.example.demo.Util.JWTUtil; |
|
|
|
import com.example.demo.Util.LanguageTranslationUtil; |
|
|
|
import com.example.demo.Util.RedisLockUtil; |
|
|
|
import com.example.demo.domain.DTO.*; |
|
|
|
import com.example.demo.domain.entity.Admin; |
|
|
|
import com.example.demo.domain.entity.Export; |
|
|
|
import com.example.demo.domain.DTO.CashDTO; |
|
|
|
import com.example.demo.domain.vo.coin.ConsumeUser; |
|
|
|
import com.example.demo.domain.vo.coin.RechargeUser; |
|
|
|
import com.example.demo.domain.vo.coin.RefundUser; |
|
|
|
import com.example.demo.domain.vo.coin.Result; |
|
|
|
import com.example.demo.service.coin.ExportExcelService; |
|
|
|
import com.example.demo.service.coin.GoldDetailService; |
|
|
|
import com.example.demo.Export.ExportService; |
|
|
|
import com.example.demo.service.coin.TranslationService; |
|
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
|
import jakarta.validation.Valid; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
@ -45,6 +50,15 @@ public class ExportController { |
|
|
|
private GoldDetailService goldDetailService; |
|
|
|
@Autowired |
|
|
|
private ExportService exportService; |
|
|
|
|
|
|
|
// 注入 TranslationService |
|
|
|
@Autowired |
|
|
|
private TranslationService translationService; |
|
|
|
|
|
|
|
// 注入多语言转换工具类 |
|
|
|
@Autowired |
|
|
|
private LanguageTranslationUtil languageTranslationUtil; |
|
|
|
|
|
|
|
@PostMapping("/export") |
|
|
|
public Result export(@Valid @RequestBody Export export, @RequestHeader("token") String token) throws Exception { |
|
|
|
try { |
|
|
|
@ -56,14 +70,24 @@ public class ExportController { |
|
|
|
return Result.error("导出失败" + e.getMessage()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportRecharge") |
|
|
|
public Result export(@Valid @RequestBody RechargeDTO dto) { |
|
|
|
public Result export(@Valid @RequestBody RechargeDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) { |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分) |
|
|
|
String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁) |
|
|
|
long expireTime = 5000; // 锁过期时间(5秒)s |
|
|
|
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); |
|
|
|
String token = request.getHeader("token"); |
|
|
|
dto.setToken(token); |
|
|
|
|
|
|
|
// 解析语言代码 |
|
|
|
String languageCode = parseLanguageCode(lang); |
|
|
|
|
|
|
|
// 如果不是中文环境,将查询条件中的翻译文本转换为中文简体 |
|
|
|
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) { |
|
|
|
convertRechargeTranslatedFieldsToChinese(dto.getRechargeUser(), languageCode); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
// 尝试获取锁 |
|
|
|
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) { |
|
|
|
@ -76,14 +100,24 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportRefund") |
|
|
|
public Result export(@Valid @RequestBody RefundDTO dto) { |
|
|
|
public Result export(@Valid @RequestBody RefundDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) { |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分) |
|
|
|
String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁) |
|
|
|
long expireTime = 5000; // 锁过期时间(5秒)s |
|
|
|
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); |
|
|
|
String token = request.getHeader("token"); |
|
|
|
dto.setToken(token); |
|
|
|
|
|
|
|
// 解析语言代码 |
|
|
|
String languageCode = parseLanguageCode(lang); |
|
|
|
|
|
|
|
// 如果不是中文环境,将查询条件中的翻译文本转换为中文简体 |
|
|
|
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) { |
|
|
|
convertRefundTranslatedFieldsToChinese(dto.getRefundUser(), languageCode); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
// 尝试获取锁 |
|
|
|
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) { |
|
|
|
@ -96,14 +130,24 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportConsume") |
|
|
|
public Result export(@Valid @RequestBody ConsumeDTO dto) { |
|
|
|
public Result export(@Valid @RequestBody ConsumeDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) { |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分) |
|
|
|
String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁) |
|
|
|
long expireTime = 5000; // 锁过期时间(5秒)s |
|
|
|
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); |
|
|
|
String token = request.getHeader("token"); |
|
|
|
dto.setToken(token); |
|
|
|
|
|
|
|
// 解析语言代码 |
|
|
|
String languageCode = parseLanguageCode(lang); |
|
|
|
|
|
|
|
// 如果不是中文环境,将查询条件中的翻译文本转换为中文简体 |
|
|
|
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) { |
|
|
|
convertConsumeTranslatedFieldsToChinese(dto.getConsumeUser(), languageCode); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
return exportService.addExportConsume(dto); |
|
|
|
} finally { |
|
|
|
@ -111,6 +155,7 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportLive") |
|
|
|
public Result export(@Valid @RequestBody LiveDTO dto) { |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); |
|
|
|
@ -128,6 +173,7 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportFan") |
|
|
|
public Result export(@Valid @RequestBody FanDTO dto){ |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); |
|
|
|
@ -145,6 +191,7 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportArticle") |
|
|
|
public Result export(@Valid @RequestBody ArticleDTO dto){ |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); |
|
|
|
@ -162,6 +209,7 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportBean") |
|
|
|
public Result export(@Valid @RequestBody BeanRechargeDTO dto){ |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); |
|
|
|
@ -179,6 +227,7 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportol") |
|
|
|
public Result exportol(@Valid @RequestBody OnlineDTO dto) throws Exception { |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); |
|
|
|
@ -196,6 +245,7 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 负责人退款导出 |
|
|
|
*/ |
|
|
|
@ -216,6 +266,7 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@PostMapping("/exportCash") |
|
|
|
public Result exportCash(@Valid @RequestBody CashDTO dto) { |
|
|
|
String lockKey = "export:lock:" + dto.getToken(); |
|
|
|
@ -233,4 +284,135 @@ public class ExportController { |
|
|
|
redisLockUtil.unlock(lockKey, requestId); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 解析语言代码 |
|
|
|
*/ |
|
|
|
private String parseLanguageCode(String langHeader) { |
|
|
|
if (langHeader == null || langHeader.isEmpty()) { |
|
|
|
return "zh"; |
|
|
|
} |
|
|
|
// 处理类似 "en-US" 或 "zh-TW" 的情况 |
|
|
|
if (langHeader.contains("-")) { |
|
|
|
String[] parts = langHeader.split("-"); |
|
|
|
// 特殊处理中文繁体 |
|
|
|
if ("zh".equalsIgnoreCase(parts[0]) && "TW".equalsIgnoreCase(parts[1])) { |
|
|
|
return "zh_TW"; |
|
|
|
} |
|
|
|
return parts[0].toLowerCase(); |
|
|
|
} |
|
|
|
return langHeader.toLowerCase(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 将充值查询条件中的翻译字段转换为中文简体 |
|
|
|
*/ |
|
|
|
private void convertRechargeTranslatedFieldsToChinese(RechargeUser rechargeUser, String languageCode) { |
|
|
|
if (rechargeUser != null) { |
|
|
|
// 转换市场名称 |
|
|
|
if (rechargeUser.getMarket() != null && !rechargeUser.getMarket().isEmpty()) { |
|
|
|
String chineseMarket = translationService.findChineseSimplifiedByTranslation( |
|
|
|
rechargeUser.getMarket(), languageCode); |
|
|
|
rechargeUser.setMarket(chineseMarket); |
|
|
|
} |
|
|
|
|
|
|
|
// 转换活动名称 |
|
|
|
if (rechargeUser.getActivity() != null && !rechargeUser.getActivity().isEmpty()) { |
|
|
|
String chineseActivity = translationService.findChineseSimplifiedByTranslation( |
|
|
|
rechargeUser.getActivity(), languageCode); |
|
|
|
rechargeUser.setActivity(chineseActivity); |
|
|
|
} |
|
|
|
|
|
|
|
// 转换汇率名称 |
|
|
|
if (rechargeUser.getRateName() != null && !rechargeUser.getRateName().isEmpty()) { |
|
|
|
String chineseRateName = translationService.findChineseSimplifiedByTranslation( |
|
|
|
rechargeUser.getRateName(), languageCode); |
|
|
|
rechargeUser.setRateName(chineseRateName); |
|
|
|
} |
|
|
|
|
|
|
|
// 转换支付方式 |
|
|
|
if (rechargeUser.getPayModel() != null && !rechargeUser.getPayModel().isEmpty()) { |
|
|
|
String chinesePayModel = translationService.findChineseSimplifiedByTranslation( |
|
|
|
rechargeUser.getPayModel(), languageCode); |
|
|
|
rechargeUser.setPayModel(chinesePayModel); |
|
|
|
} |
|
|
|
|
|
|
|
// // 转换支付平台 |
|
|
|
// if (rechargeUser.getPayPlatform() != null && !rechargeUser.getPayPlatform().isEmpty()) { |
|
|
|
// String chinesePayPlatform = translationService.findChineseSimplifiedByTranslation( |
|
|
|
// rechargeUser.getPayPlatform(), languageCode); |
|
|
|
// rechargeUser.setPayPlatform(chinesePayPlatform); |
|
|
|
// } |
|
|
|
|
|
|
|
// 转换备注 |
|
|
|
if (rechargeUser.getRemark() != null && !rechargeUser.getRemark().isEmpty()) { |
|
|
|
String chineseRemark = translationService.findChineseSimplifiedByTranslation( |
|
|
|
rechargeUser.getRemark(), languageCode); |
|
|
|
rechargeUser.setRemark(chineseRemark); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 将退款查询条件中的翻译字段转换为中文简体 |
|
|
|
*/ |
|
|
|
private void convertRefundTranslatedFieldsToChinese(RefundUser refundUser, String languageCode) { |
|
|
|
if (refundUser != null) { |
|
|
|
// 转换市场名称 |
|
|
|
if (refundUser.getMarket() != null && !refundUser.getMarket().isEmpty()) { |
|
|
|
String chineseMarket = translationService.findChineseSimplifiedByTranslation( |
|
|
|
refundUser.getMarket(), languageCode); |
|
|
|
refundUser.setMarket(chineseMarket); |
|
|
|
} |
|
|
|
|
|
|
|
// 转换商品名称 |
|
|
|
if (refundUser.getGoodsName() != null && !refundUser.getGoodsName().isEmpty()) { |
|
|
|
String chineseGoodsName = translationService.findChineseSimplifiedByTranslation( |
|
|
|
refundUser.getGoodsName(), languageCode); |
|
|
|
refundUser.setGoodsName(chineseGoodsName); |
|
|
|
} |
|
|
|
|
|
|
|
// 转换退款类型 |
|
|
|
if (refundUser.getRefundType() != null && !refundUser.getRefundType().isEmpty()) { |
|
|
|
String chineseRefundType = translationService.findChineseSimplifiedByTranslation( |
|
|
|
refundUser.getRefundType(), languageCode); |
|
|
|
refundUser.setRefundType(chineseRefundType); |
|
|
|
} |
|
|
|
|
|
|
|
// 转换备注 |
|
|
|
if (refundUser.getRemark() != null && !refundUser.getRemark().isEmpty()) { |
|
|
|
String chineseRemark = translationService.findChineseSimplifiedByTranslation( |
|
|
|
refundUser.getRemark(), languageCode); |
|
|
|
refundUser.setRemark(chineseRemark); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 将消费查询条件中的翻译字段转换为中文简体 |
|
|
|
*/ |
|
|
|
private void convertConsumeTranslatedFieldsToChinese(ConsumeUser consumeUser, String languageCode) { |
|
|
|
if (consumeUser != null) { |
|
|
|
// 转换商品名称 |
|
|
|
if (consumeUser.getGoodsName() != null && !consumeUser.getGoodsName().isEmpty()) { |
|
|
|
String chineseName = translationService.findChineseSimplifiedByTranslation( |
|
|
|
consumeUser.getGoodsName(), languageCode); |
|
|
|
consumeUser.setGoodsName(chineseName); |
|
|
|
} |
|
|
|
|
|
|
|
// 转换市场名称 |
|
|
|
if (consumeUser.getMarket() != null && !consumeUser.getMarket().isEmpty()) { |
|
|
|
String chineseMarket = translationService.findChineseSimplifiedByTranslation( |
|
|
|
consumeUser.getMarket(), languageCode); |
|
|
|
consumeUser.setMarket(chineseMarket); |
|
|
|
} |
|
|
|
|
|
|
|
// // 转换支付平台 |
|
|
|
// if (consumeUser.getPayPlatform() != null && !consumeUser.getPayPlatform().isEmpty()) { |
|
|
|
// String chinesePlatform = translationService.findChineseSimplifiedByTranslation( |
|
|
|
// consumeUser.getPayPlatform(), languageCode); |
|
|
|
// consumeUser.setPayPlatform(chinesePlatform); |
|
|
|
// } |
|
|
|
} |
|
|
|
} |
|
|
|
} |