From 2464be73485df83a125a3abee25701a173216b4a Mon Sep 17 00:00:00 2001 From: wangguorui <2069821375@qq.com> Date: Tue, 2 Dec 2025 19:56:23 +0800 Subject: [PATCH] =?UTF-8?q?12=E6=9C=882=E6=97=A5=E7=8E=B0=E9=87=91?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=A4=9A=E8=AF=AD=E8=A8=80=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E5=8F=8D=E5=90=91=E6=9F=A5=E8=AF=A2=E4=B8=AD=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/coin/ExportController.java | 190 ++++++++++++++++++++- .../example/demo/domain/vo/coin/GoldDetail.java | 3 +- .../serviceImpl/coin/ExportExcelServiceImpl.java | 33 ++++ .../serviceImpl/coin/GoldDetailServiceImpl.java | 27 +++ 4 files changed, 248 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/demo/controller/coin/ExportController.java b/src/main/java/com/example/demo/controller/coin/ExportController.java index 07b9eca..639fe22 100644 --- a/src/main/java/com/example/demo/controller/coin/ExportController.java +++ b/src/main/java/com/example/demo/controller/coin/ExportController.java @@ -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); } } -} \ No newline at end of file + + /** + * 解析语言代码 + */ + 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); +// } + } + } +} diff --git a/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java b/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java index 63314ed..467cefe 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java +++ b/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java @@ -34,8 +34,9 @@ public class GoldDetail { private String market; // 所属地区 @ExcelProperty("平台信息") private String payPlatform; // 支付平台 - @ExcelProperty("更新类型") + @ExcelIgnore private Integer type; // 类型 + @ExcelProperty("更新类型") private String typeDesc; // 类型描述(用于多语言翻译) @ExcelProperty("金币数量") private BigDecimal sumGold; // 总金币 diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java index efefdaa..d38878d 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java @@ -374,6 +374,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { Integer totalCount = 0; boolean hasMore = true; + // 在 exportExcelGeneric 方法中的适当位置添加类型转换 while (hasMore) { Result pageResult = dataFetcher.apply(page); Integer code = pageResult.getCode(); @@ -394,6 +395,11 @@ public class ExportExcelServiceImpl implements ExportExcelService { if (list == null || list.isEmpty()) { hasMore = false; } else { + // 在这里添加类型转换逻辑 + if ("goldDetail".equals(exportType) && list.get(0) instanceof GoldDetail) { + fillGoldDetailTypeDescriptions((List) list); + } + excelWriter.write(list, writeSheet); page.setPageNum(page.getPageNum() + 1); totalCount += list.size(); @@ -406,6 +412,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { } } + // 7. 完成Excel写入 if (excelWriter != null) { excelWriter.finish(); @@ -549,4 +556,30 @@ public class ExportExcelServiceImpl implements ExportExcelService { throw new IllegalArgumentException("不支持的导出类型: " + exportType); } } + /** + * 填充金币明细数据的类型描述 + */ + private void fillGoldDetailTypeDescriptions(List goldDetails) { + if (goldDetails != null && !goldDetails.isEmpty()) { + for (GoldDetail detail : goldDetails) { + if (detail.getType() != null) { + detail.setTypeDesc(convertTypeToString(detail.getType())); + } + } + } + } + + /** + * 将类型数字转换为中文描述 + */ + private String convertTypeToString(Integer type) { + if (type == null) return ""; + switch (type) { + case 0: return "充值"; + case 1: return "消耗"; + case 2: return "退款"; + default: return "未知类型"; + } + } + } \ No newline at end of file diff --git a/src/main/java/com/example/demo/serviceImpl/coin/GoldDetailServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/GoldDetailServiceImpl.java index e8cf03b..8c5c12e 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/GoldDetailServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/GoldDetailServiceImpl.java @@ -194,6 +194,33 @@ public class GoldDetailServiceImpl implements GoldDetailService { } return Result.success(); } + // 在 GoldDetailServiceImpl.java 中添加以下方法 + /** + * 将类型数字转换为中文描述 + */ + private String convertTypeToString(Integer type) { + if (type == null) return ""; + switch (type) { + case 0: return "充值"; + case 1: return "消耗"; + case 2: return "退款"; + default: return "未知类型"; + } + } + + /** + * 填充金币明细数据的类型描述 + */ + private void fillTypeDescriptions(List goldDetails) { + if (goldDetails != null && !goldDetails.isEmpty()) { + for (GoldDetail detail : goldDetails) { + if (detail.getType() != null) { + detail.setTypeDesc(convertTypeToString(detail.getType())); + } + } + } + } + //更新用户消费次数 @Override public Result updateConsumeNum() {