From 33af852ebd2aa097b5b76e86e7540e02d7f0ad77 Mon Sep 17 00:00:00 2001 From: wangguorui <2069821375@qq.com> Date: Mon, 1 Dec 2025 13:32:08 +0800 Subject: [PATCH] =?UTF-8?q?12=E6=9C=881=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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/Util/LanguageTranslationUtil.java | 104 ++++++++++++++ .../demo/controller/coin/AdminController.java | 46 ++++++- .../demo/controller/coin/AuditController.java | 113 +++++++++++++-- .../demo/controller/coin/ConsumeController.java | 45 +++++- .../demo/controller/coin/GeneralController.java | 85 ++++++++++-- .../demo/controller/coin/GoldDetailController.java | 58 +++++++- .../demo/controller/coin/MarketController.java | 45 +++++- .../demo/controller/coin/MenuController.java | 30 +++- .../demo/controller/coin/RateController.java | 56 ++++++-- .../demo/controller/coin/RechargeController.java | 64 +++++++-- .../demo/controller/coin/RefundController.java | 71 +++++++++- .../controller/coin/TranslationController.java | 153 +++++++++++++++++++++ .../demo/controller/coin/UserController.java | 27 +++- .../demo/controller/coin/WorkbenchController.java | 127 ++++++++++++----- .../demo/domain/DTO/TranslationQueryRequest.java | 11 ++ .../example/demo/domain/entity/Translation.java | 25 ++++ .../example/demo/domain/vo/coin/ConsumeUser.java | 1 + .../example/demo/domain/vo/coin/GoldDetail.java | 1 + .../example/demo/domain/vo/coin/RefundAudit.java | 1 + .../example/demo/domain/vo/coin/RefundUser.java | 1 + .../demo/mapper/coin/TranslationMapper.java | 42 ++++++ .../demo/service/coin/TranslationService.java | 36 +++++ .../serviceImpl/coin/ExportExcelServiceImpl.java | 2 +- .../serviceImpl/coin/TranslationServiceImpl.java | 97 +++++++++++++ src/main/resources/mapper/TranslationMapper.xml | 106 ++++++++++++++ 25 files changed, 1260 insertions(+), 87 deletions(-) create mode 100644 src/main/java/com/example/demo/Util/LanguageTranslationUtil.java create mode 100644 src/main/java/com/example/demo/controller/coin/TranslationController.java create mode 100644 src/main/java/com/example/demo/domain/DTO/TranslationQueryRequest.java create mode 100644 src/main/java/com/example/demo/domain/entity/Translation.java create mode 100644 src/main/java/com/example/demo/mapper/coin/TranslationMapper.java create mode 100644 src/main/java/com/example/demo/service/coin/TranslationService.java create mode 100644 src/main/java/com/example/demo/serviceImpl/coin/TranslationServiceImpl.java create mode 100644 src/main/resources/mapper/TranslationMapper.xml diff --git a/src/main/java/com/example/demo/Util/LanguageTranslationUtil.java b/src/main/java/com/example/demo/Util/LanguageTranslationUtil.java new file mode 100644 index 0000000..4789031 --- /dev/null +++ b/src/main/java/com/example/demo/Util/LanguageTranslationUtil.java @@ -0,0 +1,104 @@ +package com.example.demo.Util; + +import com.example.demo.domain.entity.Translation; +import com.example.demo.service.coin.TranslationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 多语言转换工具类 + */ +@Component +public class LanguageTranslationUtil { + + @Autowired + private TranslationService translationService; + + // 缓存翻译数据,提高性能 + private final Map translationCache = new ConcurrentHashMap<>(); + + /** + * 根据中文简体获取指定语言的翻译 + * + * @param chineseSimplified 中文简体内容 + * @param language 目标语言 (en/th/zh_TW/ms/vi) + * @return 对应语言的翻译内容 + */ + public String translate(String chineseSimplified, String language) { + System.out.println("Translate request - Text: " + chineseSimplified + ", Language: " + language); + + Translation translation = findTranslationByChinese(chineseSimplified); + if (translation == null) { + System.out.println("No translation found for: " + chineseSimplified); + return chineseSimplified; + } + + String result; + switch (language.toLowerCase()) { + case "en": + result = translation.getEnglish() != null ? translation.getEnglish() : chineseSimplified; + break; + case "th": + result = translation.getThai() != null ? translation.getThai() : chineseSimplified; + break; + case "zh_tw": + result = translation.getChineseTraditional() != null ? translation.getChineseTraditional() : chineseSimplified; + break; + case "ms": + result = translation.getMalay() != null ? translation.getMalay() : chineseSimplified; + break; + case "vi": + result = translation.getVietnamese() != null ? translation.getVietnamese() : chineseSimplified; + break; + default: + result = chineseSimplified; + } + + System.out.println("Translation result: " + result); + return result; + } + + + /** + * 根据中文简体查找翻译对象 + * + * @param chineseSimplified 中文简体内容 + * @return 翻译对象 + */ + private Translation findTranslationByChinese(String chineseSimplified) { + // 先从缓存中查找 + if (translationCache.containsKey(chineseSimplified)) { + return translationCache.get(chineseSimplified); + } + + // 从数据库中精确查找 + Translation translation = translationService.findByChineseSimplified(chineseSimplified); + + if (translation != null) { + translationCache.put(chineseSimplified, translation); + return translation; + } + + return null; + } + + /** + * 刷新整个缓存(当翻译数据有更新时调用) + */ + public void refreshAllCache() { + translationCache.clear(); + } + + /** + * 从缓存中移除指定的翻译条目 + * @param chineseSimplified 简体中文原文 + */ + public void removeFromCache(String chineseSimplified) { + if (chineseSimplified != null) { + translationCache.remove(chineseSimplified); + } + } +} diff --git a/src/main/java/com/example/demo/controller/coin/AdminController.java b/src/main/java/com/example/demo/controller/coin/AdminController.java index b009aa0..b821128 100644 --- a/src/main/java/com/example/demo/controller/coin/AdminController.java +++ b/src/main/java/com/example/demo/controller/coin/AdminController.java @@ -1,6 +1,7 @@ package com.example.demo.controller.coin; import com.example.demo.Util.JWTUtil; +import com.example.demo.Util.LanguageTranslationUtil; import com.example.demo.config.interfac.Log; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.coin.Password; @@ -32,6 +33,10 @@ public class AdminController { @Autowired private AdminMapper adminMapper; + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + @PostMapping("/test") public void testGetAdmin() { Admin admin = adminMapper.getAdmin("14518"); @@ -59,13 +64,20 @@ public class AdminController { @Log("查看用户信息") @PostMapping("/userinfo") - public UserDetails getUserInfo(@RequestHeader("token") String token1) { + public UserDetails getUserInfo(@RequestHeader("token") String token1, + @RequestHeader(defaultValue = "zh_CN") String lang) { //String token = token1.getToken(); String token = token1; try { - return JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + UserDetails userDetails = JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + // 对用户信息进行多语言转换 + if (userDetails instanceof Admin) { + Admin admin = (Admin) userDetails; + translateAdminInfo(admin, lang); + } + return userDetails; } catch (Exception e) { throw new RuntimeException(e); } @@ -111,4 +123,34 @@ public class AdminController { } + /** + * 转换管理员信息的多语言字段 + */ + private void translateAdminInfo(Admin admin, String lang) { + if (admin != null) { + // 翻译市场权限信息(如果markets是逗号分隔的多个市场) + if (admin.getMarkets() != null && !admin.getMarkets().isEmpty()) { + String[] markets = admin.getMarkets().split(","); + StringBuilder translatedMarkets = new StringBuilder(); + for (int i = 0; i < markets.length; i++) { + if (i > 0) { + translatedMarkets.append(","); + } + String translatedMarket = languageTranslationUtil.translate(markets[i].trim(), lang); + translatedMarkets.append(translatedMarket); + } + admin.setMarkets(translatedMarkets.toString()); + } + // 翻译职位信息 + if (admin.getPostiton() != null && !admin.getPostiton().isEmpty()) { + String translatedPosition = languageTranslationUtil.translate(admin.getPostiton(), lang); + admin.setPostiton(translatedPosition); + } + // 翻译备注 + if (admin.getRemark() != null && !admin.getRemark().isEmpty()) { + String translatedRemark = languageTranslationUtil.translate(admin.getRemark(), lang); + admin.setRemark(translatedRemark); + } + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/AuditController.java b/src/main/java/com/example/demo/controller/coin/AuditController.java index be9821d..f393799 100644 --- a/src/main/java/com/example/demo/controller/coin/AuditController.java +++ b/src/main/java/com/example/demo/controller/coin/AuditController.java @@ -1,6 +1,7 @@ package com.example.demo.controller.coin; import com.example.demo.Util.JWTUtil; +import com.example.demo.Util.LanguageTranslationUtil; import com.example.demo.config.interfac.Log; import com.example.demo.domain.entity.Admin; import com.example.demo.service.coin.AuditService; @@ -37,19 +38,25 @@ public class AuditController { @Autowired private AuditService auditService; + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + //审核订单 @Log("审核订单") @PostMapping("audit") public ResponseEntity auditOrder( @RequestBody AuditRequest request) { - boolean result = auditService.auditOrder(request.getToken(),request.getOrderCode(), request.getAuditId(), request.getAction(),request.getRejectReason()); + boolean result = auditService.auditOrder(request.getToken(), request.getOrderCode(), request.getAuditId(), request.getAction(), request.getRejectReason()); return ResponseEntity.ok(result); -} + } + //多条件查询充值审核订单列表 @Log("查询充值审核订单列表") @PostMapping("selectRecharge") - public PageInfo searchRechargeAudit ( - @RequestBody Page page) throws Exception { + public PageInfo searchRechargeAudit( + @RequestBody Page page, + @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception { Integer pageNum = page.getPageNum(); Integer pageSize = page.getPageSize(); RechargeAudit rechargeAudit = page.getRechargeAudit(); @@ -62,11 +69,18 @@ public class AuditController { rechargeAudit.setMarkets(list); } - return auditService.selectRechargeBy(pageNum, pageSize, rechargeAudit); -} //多条件查询退款审核订单列表 + PageInfo pageInfo = auditService.selectRechargeBy(pageNum, pageSize, rechargeAudit); + // 对结果进行多语言转换 + translateRechargeAuditResults(pageInfo, lang); + return pageInfo; + } + + //多条件查询退款审核订单列表 @Log("查询退款审核订单列表") @PostMapping("selectRefund") - public PageInfo searchRefundAudit(@RequestBody Page page) throws Exception { + public PageInfo searchRefundAudit( + @RequestBody Page page, + @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception { Integer pageNum = page.getPageNum(); Integer pageSize = page.getPageSize(); RefundAudit refundAudit = page.getRefundAudit(); @@ -79,8 +93,11 @@ public class AuditController { refundAudit.setMarkets(list); } - return auditService.selectRefundBy(pageNum, pageSize, refundAudit); -} + PageInfo pageInfo = auditService.selectRefundBy(pageNum, pageSize, refundAudit); + // 对结果进行多语言转换 + translateRefundAuditResults(pageInfo, lang); + return pageInfo; + } //充值审核合计数 @Log("充值审核合计数") @PostMapping("sumRechargeGold") @@ -115,4 +132,80 @@ public class AuditController { } return auditService.sumRefundGold(pageNum, pageSize, refundAudit); } -} + /** + * 转换充值审核结果的多语言字段 + */ + private void translateRechargeAuditResults(PageInfo pageInfo, String lang) { + if (pageInfo != null && pageInfo.getList() != null) { + for (RechargeAudit audit : pageInfo.getList()) { + // 翻译市场名称 + if (audit.getMarket() != null) { + audit.setMarket(languageTranslationUtil.translate(audit.getMarket(), lang)); + } + // 翻译汇率名称 + if (audit.getRateName() != null) { + audit.setRateName(languageTranslationUtil.translate(audit.getRateName(), lang)); + } + // 翻译支付方式 + if (audit.getPayModel() != null) { + audit.setPayModel(languageTranslationUtil.translate(audit.getPayModel(), lang)); + } + // 翻译活动名称 + if (audit.getActivity() != null) { + audit.setActivity(languageTranslationUtil.translate(audit.getActivity(), lang)); + } + // 翻译备注 + if (audit.getRemark() != null) { + audit.setRemark(languageTranslationUtil.translate(audit.getRemark(), lang)); + } + } + } + } + + /** + * 转换退款审核结果的多语言字段 + */ + private void translateRefundAuditResults(PageInfo pageInfo, String lang) { + if (pageInfo != null && pageInfo.getList() != null) { + for (RefundAudit audit : pageInfo.getList()) { + // 翻译市场名称 + if (audit.getMarket() != null) { + audit.setMarket(languageTranslationUtil.translate(audit.getMarket(), lang)); + } + // 翻译商品名称 + if (audit.getGoodsName() != null) { + audit.setGoodsName(languageTranslationUtil.translate(audit.getGoodsName(), lang)); + } + // 翻译退款方式 + if (audit.getRefundModel() != null) { + // refundModel是数字,需要先转换为对应的中文描述再翻译 + String refundModelDesc = convertRefundModelToString(audit.getRefundModel()); + audit.setRefundModelDesc(languageTranslationUtil.translate(refundModelDesc, lang)); + } + // 翻译退款类型 + if (audit.getRefundType() != null) { + audit.setRefundType(languageTranslationUtil.translate(audit.getRefundType(), lang)); + } + // 翻译备注 + if (audit.getRemark() != null) { + audit.setRemark(languageTranslationUtil.translate(audit.getRemark(), lang)); + } + } + } + } + + /** + * 将退款方式数字转换为中文描述 + */ + private String convertRefundModelToString(Integer refundModel) { + if (refundModel == null) return ""; + switch (refundModel) { + case 0: + return "全部退款"; + case 1: + return "部分退款"; + default: + return "未知退款方式"; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/controller/coin/ConsumeController.java b/src/main/java/com/example/demo/controller/coin/ConsumeController.java index 0ac6caa..e1ae638 100644 --- a/src/main/java/com/example/demo/controller/coin/ConsumeController.java +++ b/src/main/java/com/example/demo/controller/coin/ConsumeController.java @@ -1,6 +1,7 @@ package com.example.demo.controller.coin; import com.example.demo.Util.JWTUtil; +import com.example.demo.Util.LanguageTranslationUtil; import com.example.demo.config.interfac.Log; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.coin.ConsumeUser; @@ -8,6 +9,7 @@ import com.example.demo.domain.vo.coin.Gold; import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.coin.ConsumeService; +import com.github.pagehelper.PageInfo; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -40,6 +42,10 @@ public class ConsumeController { @Autowired private ConsumeService consumeService; + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + //消耗明细 @Log("查看所有消耗明细") @PostMapping("/selectAll") @@ -78,7 +84,7 @@ public class ConsumeController { //消耗明细筛选 @Log("筛选查询消耗明细") @PostMapping("/selectBy") - public Result selectBy(@RequestBody Page page) { + public Result selectBy(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) { try { //页码校验 if (ObjectUtils.isEmpty(page.getPageNum())) { @@ -101,7 +107,13 @@ public class ConsumeController { return Result.error("角色为空"); } } - return Result.success(consumeService.selectBy(page.getPageNum(), page.getPageSize(), page.getConsumeUser())); + Result result = Result.success(consumeService.selectBy(page.getPageNum(), page.getPageSize(), page.getConsumeUser())); + // 对返回结果进行多语言转换 + if (result.getCode() == 200 && result.getData() instanceof PageInfo) { + PageInfo pageInfo = (PageInfo) result.getData(); + translateConsumeUsers(pageInfo, lang); + } + return result; } } catch (Exception e) { e.printStackTrace(); @@ -193,5 +205,34 @@ public class ConsumeController { } + /** + * 转换消费用户信息的多语言字段 + */ + private void translateConsumeUsers(PageInfo pageInfo, String lang) { + if (pageInfo != null && pageInfo.getList() != null) { + for (ConsumeUser user : pageInfo.getList()) { + // 翻译市场名称 + if (user.getMarket() != null) { + user.setMarket(languageTranslationUtil.translate(user.getMarket(), lang)); + } + // 翻译商品名称 + if (user.getGoodsName() != null) { + user.setGoodsName(languageTranslationUtil.translate(user.getGoodsName(), lang)); + } + // 翻译支付平台 + if (user.getPayPlatform() != null) { + user.setPayPlatform(languageTranslationUtil.translate(user.getPayPlatform(), lang)); + } + // 翻译退款状态 + if (user.getIsRefund() != null) { + if (user.getIsRefund() == 1) { + user.setIsRefundDesc(languageTranslationUtil.translate("已退款", lang)); + } else if (user.getIsRefund() == 0) { + user.setIsRefundDesc(languageTranslationUtil.translate("正常", lang)); + } + } + } + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/GeneralController.java b/src/main/java/com/example/demo/controller/coin/GeneralController.java index f1cecef..6e4985c 100644 --- a/src/main/java/com/example/demo/controller/coin/GeneralController.java +++ b/src/main/java/com/example/demo/controller/coin/GeneralController.java @@ -1,10 +1,12 @@ package com.example.demo.controller.coin; import com.example.demo.config.interfac.Log; +import com.example.demo.domain.entity.Rate; import com.example.demo.domain.vo.coin.AdminVo; import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.RoleVo; import com.example.demo.service.coin.GeneralService; +import com.example.demo.Util.LanguageTranslationUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -29,7 +31,12 @@ public class GeneralController { @Autowired private GeneralService generalService; -// @Log("获取全部地区") + + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + + // @Log("获取全部地区") @PostMapping("/market") public Result getMarket() { @@ -58,33 +65,43 @@ public class GeneralController { List list = generalService.getAllRoleMarket(); return Result.success(list); } -// @Log("获取平台信息") + // @Log("获取平台信息") @PostMapping("/platform") - public Result getPlatform() + public Result getPlatform(@RequestHeader(defaultValue = "zh_CN") String lang) { List list = generalService.getPlatform(); + // 对平台名称进行多语言转换 + translatePlatformNames(list, lang); return Result.success(list); } //获取商品名称 -// @Log("获取商品名称") + // @Log("获取商品名称") @PostMapping("/goods") - public Result getGoods() + public Result getGoods(@RequestHeader(defaultValue = "zh_CN") String lang) { List list = generalService.getGoods(); + // 对商品名称进行多语言转换 + translateGoodsNames(list, lang); return Result.success(list); } //获取活动名称 -// @Log("获取活动名称") + // @Log("获取活动名称") @PostMapping("/activity") - public Result getActivity() + public Result getActivity(@RequestHeader(defaultValue = "zh_CN") String lang) { List list = generalService.getActivity(); + // 对活动名称进行多语言转换 + translateActivityNames(list, lang); return Result.success(list); } + //获取汇率 @PostMapping("/getRate") - public Result getRate() + public Result getRate(@RequestHeader(defaultValue = "zh_CN") String lang) { - return Result.success(generalService.getRate()); + List rates = generalService.getRate(); + // 对汇率名称进行多语言转换 + translateRateNames(rates, lang); + return Result.success(rates); } //手动同步link商品表 @@ -92,4 +109,54 @@ public class GeneralController { public void syncLinkProducts(){ generalService.fullSyncProducts(); } + + /** + * 转换商品名称为指定语言 + */ + private void translateGoodsNames(List goodsNames, String lang) { + if (goodsNames != null && !goodsNames.isEmpty()) { + for (int i = 0; i < goodsNames.size(); i++) { + String translatedName = languageTranslationUtil.translate(goodsNames.get(i), lang); + goodsNames.set(i, translatedName); + } + } + } + + /** + * 转换平台名称为指定语言 + */ + private void translatePlatformNames(List platformNames, String lang) { + if (platformNames != null && !platformNames.isEmpty()) { + for (int i = 0; i < platformNames.size(); i++) { + String translatedName = languageTranslationUtil.translate(platformNames.get(i), lang); + platformNames.set(i, translatedName); + } + } + } + + /** + * 转换活动名称为指定语言 + */ + private void translateActivityNames(List activityNames, String lang) { + if (activityNames != null && !activityNames.isEmpty()) { + for (int i = 0; i < activityNames.size(); i++) { + String translatedName = languageTranslationUtil.translate(activityNames.get(i), lang); + activityNames.set(i, translatedName); + } + } + } + + /** + * 转换汇率名称为指定语言 + */ + private void translateRateNames(List rates, String lang) { + if (rates != null && !rates.isEmpty()) { + for (Rate rate : rates) { + if (rate.getRateName() != null) { + String translatedName = languageTranslationUtil.translate(rate.getRateName(), lang); + rate.setRateName(translatedName); + } + } + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/GoldDetailController.java b/src/main/java/com/example/demo/controller/coin/GoldDetailController.java index 6ded2c4..baabf84 100644 --- a/src/main/java/com/example/demo/controller/coin/GoldDetailController.java +++ b/src/main/java/com/example/demo/controller/coin/GoldDetailController.java @@ -2,6 +2,7 @@ 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.config.interfac.Log; import com.example.demo.domain.DTO.GoldDetailDTO; @@ -15,6 +16,7 @@ import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.coin.GoldDetailService; import com.example.demo.service.coin.MarketService; import com.example.demo.serviceImpl.coin.AiEmotionServiceImpl; +import com.github.pagehelper.PageInfo; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -48,6 +50,9 @@ public class GoldDetailController { @Autowired private GoldDetailService goldDetailService; + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; @Autowired private RedisLockUtil redisLockUtil; @@ -58,7 +63,7 @@ public class GoldDetailController { @Log("获取金币明细") @PostMapping("/getGoldDetail") - public Result getGoldDetail(@RequestBody Page page) throws Exception { + public Result getGoldDetail(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception { // 获取当前请求对象 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); @@ -100,12 +105,21 @@ public class GoldDetailController { } // 返回详情数据 - return Result.success(goldDetailService.getGoldDetail( + Result result = Result.success(goldDetailService.getGoldDetail( page.getPageNum(), page.getPageSize(), page.getGoldDetail() )); + + // 对返回结果进行多语言转换 + if (result.getCode() == 200 && result.getData() instanceof PageInfo) { + PageInfo pageInfo = (PageInfo) result.getData(); + translateGoldDetails(pageInfo, lang); + } + + return result; } + @Log("客户金币明细金币合计数统计") @PostMapping("/getTotal") public Result getTotal(@RequestBody Page page) throws Exception { @@ -292,4 +306,44 @@ public class GoldDetailController { public Result updateConsumeNum() { return goldDetailService.updateConsumeNum(); } + + /** + * 转换金币明细信息的多语言字段 + */ + private void translateGoldDetails(PageInfo pageInfo, String lang) { + if (pageInfo != null && pageInfo.getList() != null) { + for (GoldDetail detail : pageInfo.getList()) { + // 翻译市场名称("所属地区") + if (detail.getMarket() != null) { + detail.setMarket(languageTranslationUtil.translate(detail.getMarket(), lang)); + } + // 翻译支付平台("平台信息") + if (detail.getPayPlatform() != null) { + detail.setPayPlatform(languageTranslationUtil.translate(detail.getPayPlatform(), lang)); + } + // 翻译类型("更新类型") - 需要根据type的值进行转换 + if (detail.getType() != null) { + String typeDesc = convertTypeToString(detail.getType()); + detail.setTypeDesc(languageTranslationUtil.translate(typeDesc, lang)); + } + // 翻译商品名称("商品名称") + if (detail.getGoodsName() != null) { + detail.setGoodsName(languageTranslationUtil.translate(detail.getGoodsName(), lang)); + } + } + } + } + + /** + * 将类型数字转换为中文描述 + */ + private String convertTypeToString(Integer type) { + if (type == null) return ""; + switch (type) { + case 0: return "充值"; + case 1: return "消耗"; + case 2: return "退款"; + default: return "未知类型"; + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/MarketController.java b/src/main/java/com/example/demo/controller/coin/MarketController.java index ed61a6f..127f19d 100644 --- a/src/main/java/com/example/demo/controller/coin/MarketController.java +++ b/src/main/java/com/example/demo/controller/coin/MarketController.java @@ -1,14 +1,16 @@ package com.example.demo.controller.coin; import com.example.demo.config.interfac.Log; +import com.example.demo.domain.entity.Market; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.coin.MarketService; +import com.example.demo.Util.LanguageTranslationUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/market") @@ -19,10 +21,39 @@ public class MarketController { @Autowired private MarketService marketService; -// @Log("获取市场") + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + + // @Log("获取市场") @RequestMapping("/selectMarket") - public Result selectMarket() - { - return Result.success(marketService.selectMarket()); + public Result selectMarket(@RequestHeader(defaultValue = "zh_CN") String lang) { + try { + List markets = marketService.selectMarket(); + // 对市场名称进行多语言转换 + translateMarketNames(markets, lang); + return Result.success(markets); + } catch (Exception e) { + log.error("获取市场列表失败", e); + return Result.error("获取市场列表失败"); + } + } + + /** + * 递归转换市场名称为指定语言 + */ + private void translateMarketNames(List markets, String lang) { + if (markets != null) { + for (Market market : markets) { + // 将市场名称转换为目标语言 + String translatedName = languageTranslationUtil.translate(market.getName(), lang); + market.setName(translatedName); + + // 递归处理子市场 + if (market.getChildren() != null && !market.getChildren().isEmpty()) { + translateMarketNames(market.getChildren(), lang); + } + } + } } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/controller/coin/MenuController.java b/src/main/java/com/example/demo/controller/coin/MenuController.java index 021489b..bd7d186 100644 --- a/src/main/java/com/example/demo/controller/coin/MenuController.java +++ b/src/main/java/com/example/demo/controller/coin/MenuController.java @@ -5,6 +5,7 @@ import com.example.demo.domain.vo.coin.MenuVo; import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.RoleVo; import com.example.demo.service.coin.MenuService; +import com.example.demo.Util.LanguageTranslationUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -31,11 +32,17 @@ public class MenuController { @Autowired private MenuService menuService; - //获取权限树 + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + + //获取权限树 // @Log("获取权限树") @PostMapping("/tree") - public Result getPermissionTree(@RequestBody RoleVo roleVo) { + public Result getPermissionTree(@RequestBody RoleVo roleVo, @RequestHeader(defaultValue = "zh_CN") String lang) { List permissionTree = menuService.getPermissionTree(roleVo.getId()); + // 对菜单名称进行多语言转换 + translateMenuNames(permissionTree, lang); return Result.success(permissionTree); } @@ -52,4 +59,23 @@ public class MenuController { public Result updatePermission(@RequestBody RoleVo roleVo) { return menuService.updatePermission(roleVo); } + + /** + * 递归转换菜单名称为指定语言 + */ + private void translateMenuNames(List menus, String lang) { + if (menus != null) { + for (MenuVo menu : menus) { + // 将菜单名称转换为目标语言 + if (menu.getMenuName() != null) { + String translatedName = languageTranslationUtil.translate(menu.getMenuName(), lang); + menu.setMenuName(translatedName); + } + // 递归处理子菜单 + if (menu.getChildren() != null && !menu.getChildren().isEmpty()) { + translateMenuNames(menu.getChildren(), lang); + } + } + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/RateController.java b/src/main/java/com/example/demo/controller/coin/RateController.java index 859f272..7f2dca5 100644 --- a/src/main/java/com/example/demo/controller/coin/RateController.java +++ b/src/main/java/com/example/demo/controller/coin/RateController.java @@ -1,6 +1,6 @@ package com.example.demo.controller.coin; - +import com.example.demo.Util.LanguageTranslationUtil; import com.example.demo.config.interfac.Log; import com.example.demo.domain.entity.Rate; import com.example.demo.domain.vo.coin.Page; @@ -17,7 +17,6 @@ import java.math.BigDecimal; import java.util.List; import java.util.Map; - @RestController @RequestMapping("/rate") @RequiredArgsConstructor @@ -28,17 +27,28 @@ public class RateController { @Autowired private RateService rateService; + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + //货币汇率列表 @Log("获取汇率列表") @PostMapping("/selectAll") - public Result selectAll(@RequestBody Page page){ + public Result selectAll(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang){ if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); } if (ObjectUtils.isEmpty(page.getPageSize())) { return Result.error("页大小为空!"); } else { - return Result.success(rateService.selectAll(page.getPageNum(), page.getPageSize())); + Result result = Result.success(rateService.selectAll(page.getPageNum(), page.getPageSize())); + // 对返回结果进行多语言转换 + if (result.getCode() == 200 && result.getData() instanceof com.github.pagehelper.PageInfo) { + com.github.pagehelper.PageInfo pageInfo = + (com.github.pagehelper.PageInfo) result.getData(); + translateRateDetails(pageInfo, lang); + } + return result; } } @@ -71,17 +81,47 @@ public class RateController { if (rate.getNum() == null || rate.getNum().equals(BigDecimal.ZERO)) { return Result.error("汇率数值存在异常"); }else - return Result.success("编辑成功"); + return Result.success("编辑成功"); } //查询货币名称列表 @PostMapping("/listRateName") - public Result listRateName(){ + public Result listRateName(@RequestHeader(defaultValue = "zh_CN") String lang){ try { - List rate= rateService.listRateName(); - return Result.success(rate); + List rates = rateService.listRateName(); + // 对返回结果进行多语言转换 + translateRates(rates, lang); + return Result.success(rates); } catch (Exception e) { return Result.error("获取货币列表失败"); } } + + /** + * 转换汇率详情列表的多语言字段 + */ + private void translateRateDetails(com.github.pagehelper.PageInfo pageInfo, String lang) { + if (pageInfo != null && pageInfo.getList() != null) { + for (com.example.demo.domain.vo.coin.RateDetail rateDetail : pageInfo.getList()) { + if (rateDetail.getRateName() != null) { + String translatedName = languageTranslationUtil.translate(rateDetail.getRateName(), lang); + rateDetail.setRateName(translatedName); + } + } + } + } + + /** + * 转换汇率列表的多语言字段 + */ + private void translateRates(List rates, String lang) { + if (rates != null && !rates.isEmpty()) { + for (Rate rate : rates) { + if (rate.getRateName() != null) { + String translatedName = languageTranslationUtil.translate(rate.getRateName(), lang); + rate.setRateName(translatedName); + } + } + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/RechargeController.java b/src/main/java/com/example/demo/controller/coin/RechargeController.java index f3c773a..44dd4de 100644 --- a/src/main/java/com/example/demo/controller/coin/RechargeController.java +++ b/src/main/java/com/example/demo/controller/coin/RechargeController.java @@ -1,10 +1,12 @@ package com.example.demo.controller.coin; import com.example.demo.Util.JWTUtil; +import com.example.demo.Util.LanguageTranslationUtil; import com.example.demo.config.interfac.Log; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.coin.*; import com.example.demo.service.coin.RechargeService; +import com.github.pagehelper.PageInfo; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -38,10 +40,14 @@ public class RechargeController { @Autowired private RechargeService rechargeService; + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + //充值明细 @Log("获取全部充值明细") @PostMapping("/selectAll") - public Result selcetAll(@RequestBody Page page) { + public Result selectAll(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) { try { if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); @@ -60,20 +66,23 @@ public class RechargeController { else{ return Result.error("角色为空"); } - return Result.success(rechargeService.selectAll(page.getPageNum(), page.getPageSize(),page.getRechargeUser())); + Result result = Result.success(rechargeService.selectAll(page.getPageNum(), page.getPageSize(),page.getRechargeUser())); + // 对返回结果进行多语言转换 + if (result.getCode() == 200 && result.getData() instanceof PageInfo) { + PageInfo pageInfo = (PageInfo) result.getData(); + translateRechargeUsers(pageInfo, lang); + } + return result; } } catch (Exception e) { return Result.error(e.getMessage()); - } - } - //充值明细筛选 @Log("充值明细筛选") @PostMapping("/selectBy") - public Result selcetBy(@RequestBody Page page) { + public Result selectBy(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) { try { if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); @@ -91,7 +100,13 @@ public class RechargeController { page.getRechargeUser().setMarkets(markets); } } - return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser())); + Result result = Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser())); + // 对返回结果进行多语言转换 + if (result.getCode() == 200 && result.getData() instanceof PageInfo) { + PageInfo pageInfo = (PageInfo) result.getData(); + translateRechargeUsers(pageInfo, lang); + } + return result; } } catch (Exception e) { e.printStackTrace(); @@ -132,7 +147,7 @@ public class RechargeController { } - public Result selcet(@RequestBody Page page) { + public Result select(@RequestBody Page page) { try { if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); @@ -149,4 +164,37 @@ public class RechargeController { } + /** + * 转换充值用户信息的多语言字段 + */ + private void translateRechargeUsers(PageInfo pageInfo, String lang) { + if (pageInfo != null && pageInfo.getList() != null) { + for (RechargeUser user : pageInfo.getList()) { + // 翻译市场名称 + if (user.getMarket() != null) { + user.setMarket(languageTranslationUtil.translate(user.getMarket(), lang)); + } + // 翻译活动名称 + if (user.getActivity() != null) { + user.setActivity(languageTranslationUtil.translate(user.getActivity(), lang)); + } + // 翻译汇率名称 + if (user.getRateName() != null) { + user.setRateName(languageTranslationUtil.translate(user.getRateName(), lang)); + } + // 翻译支付方式 + if (user.getPayModel() != null) { + user.setPayModel(languageTranslationUtil.translate(user.getPayModel(), lang)); + } + // 翻译支付平台 + if (user.getPayPlatform() != null) { + user.setPayPlatform(languageTranslationUtil.translate(user.getPayPlatform(), lang)); + } + // 翻译备注 + if (user.getRemark() != null) { + user.setRemark(languageTranslationUtil.translate(user.getRemark(), lang)); + } + } + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/RefundController.java b/src/main/java/com/example/demo/controller/coin/RefundController.java index 1a82402..a912810 100644 --- a/src/main/java/com/example/demo/controller/coin/RefundController.java +++ b/src/main/java/com/example/demo/controller/coin/RefundController.java @@ -1,9 +1,11 @@ package com.example.demo.controller.coin; import com.example.demo.Util.JWTUtil; +import com.example.demo.Util.LanguageTranslationUtil; import com.example.demo.config.interfac.Log; import com.example.demo.domain.entity.Admin; import com.example.demo.service.coin.RefundService; +import com.github.pagehelper.PageInfo; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -36,6 +38,10 @@ public class RefundController { @Autowired private RefundService refundService; + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + //退款明细 @Log("获取全部退款明细") @PostMapping("/selectAll") @@ -68,7 +74,7 @@ public class RefundController { //退款筛选 @Log("退款明细筛选") @PostMapping("/selectBy") - public Result selcetBy(@RequestBody Page page) { + public Result selcetBy(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) { try { if (ObjectUtils.isEmpty(page.getPageNum())) { return Result.error("页码数为空!"); @@ -84,7 +90,13 @@ public class RefundController { List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); page.getRefundUser().setMarkets(markets); } - return Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser())); + Result result = Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser())); + // 对返回结果进行多语言转换 + if (result.getCode() == 200 && result.getData() instanceof PageInfo) { + PageInfo pageInfo = (PageInfo) result.getData(); + translateRefundUsers(pageInfo, lang); + } + return result; } } catch (Exception e) { return Result.error("请检查筛选数据的格式"); @@ -115,8 +127,10 @@ public class RefundController { //获取退款类型 @Log("获取退款类型") @PostMapping("/refundType") - public Result getRefundType() { + public Result getRefundType(@RequestHeader(defaultValue = "zh_CN") String lang) { List list = refundService.getRefundType(); + // 对退款类型进行多语言转换 + translateRefundTypes(list, lang); return Result.success(list); } @@ -156,4 +170,55 @@ public class RefundController { } } + + /** + * 转换退款用户信息的多语言字段 + */ + private void translateRefundUsers(PageInfo pageInfo, String lang) { + if (pageInfo != null && pageInfo.getList() != null) { + for (RefundUser user : pageInfo.getList()) { + // 翻译市场名称 + if (user.getMarket() != null) { + user.setMarket(languageTranslationUtil.translate(user.getMarket(), lang)); + } + // 翻译商品名称 + if (user.getGoodsName() != null) { + user.setGoodsName(languageTranslationUtil.translate(user.getGoodsName(), lang)); + } + // 翻译退款类型 + if (user.getRefundType() != null) { + user.setRefundType(languageTranslationUtil.translate(user.getRefundType(), lang)); + } + // 翻译退款模型描述 + if (user.getRefundModel() != null) { + String refundModelDesc = convertRefundModelToString(user.getRefundModel()); + user.setRefundModelDesc(languageTranslationUtil.translate(refundModelDesc, lang)); + } + } + } + } + + /** + * 转换退款类型列表的多语言字段 + */ + private void translateRefundTypes(List refundTypes, String lang) { + if (refundTypes != null && !refundTypes.isEmpty()) { + for (int i = 0; i < refundTypes.size(); i++) { + String translatedType = languageTranslationUtil.translate(refundTypes.get(i), lang); + refundTypes.set(i, translatedType); + } + } + } + + /** + * 将退款模型数字转换为中文描述 + */ + private String convertRefundModelToString(Byte refundModel) { + if (refundModel == null) return ""; + switch (refundModel) { + case 0: return "全部退款"; + case 1: return "部分退款"; + default: return "未知退款方式"; + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/TranslationController.java b/src/main/java/com/example/demo/controller/coin/TranslationController.java new file mode 100644 index 0000000..6a796b9 --- /dev/null +++ b/src/main/java/com/example/demo/controller/coin/TranslationController.java @@ -0,0 +1,153 @@ +package com.example.demo.controller.coin; + +import com.example.demo.config.interfac.Log; +import com.example.demo.domain.DTO.TranslationQueryRequest; +import com.example.demo.domain.entity.Translation; +import com.example.demo.domain.vo.coin.Result; +import com.example.demo.service.coin.TranslationService; +import com.example.demo.Util.LanguageTranslationUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/language") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class TranslationController { + + private final TranslationService translationService; + private final LanguageTranslationUtil languageTranslationUtil; + + // 查询所有翻译记录(可加条件) + @PostMapping("/getTranslation") + public Result getTranslations(@RequestBody TranslationQueryRequest request) { + try { + // 设置分页参数 + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + + String chineseSimplified = request.getChineseSimplified(); + String languageStatus = request.getLanguageStatus(); + + List translations; + + if (chineseSimplified != null && !chineseSimplified.isEmpty() && + languageStatus != null && !languageStatus.isEmpty()) { + // 同时存在模糊查询和语言状态查询 + String[] parts = languageStatus.split("/"); + if (parts.length != 2) { + return Result.error("languageStatus 参数格式错误,应为 'language/isTranslated'"); + } + String language = parts[0]; + boolean isTranslated = Boolean.parseBoolean(parts[1]); + translations = translationService.findByChineseSimplifiedAndLanguageStatus( + chineseSimplified, language, isTranslated); + } else if (chineseSimplified != null && !chineseSimplified.isEmpty()) { + // 只进行模糊查询 + translations = translationService.findByChineseSimplifiedLike(chineseSimplified); + } else if (languageStatus != null && !languageStatus.isEmpty()) { + // 只进行语言状态查询 + String[] parts = languageStatus.split("/"); + if (parts.length != 2) { + return Result.error("languageStatus 参数格式错误,应为 'language/isTranslated'"); + } + String language = parts[0]; + boolean isTranslated = Boolean.parseBoolean(parts[1]); + translations = translationService.findByLanguageAndTranslationStatus(language, isTranslated); + } else { + // 查询所有 + translations = translationService.findAll(); + } + + // 使用 PageInfo 封装分页结果 + PageInfo pageInfo = new PageInfo<>(translations); + + // 构造返回数据 + Map resultData = new HashMap<>(); + resultData.put("list", pageInfo.getList()); + resultData.put("total", pageInfo.getTotal()); + resultData.put("pageNum", pageInfo.getPageNum()); + resultData.put("pageSize", pageInfo.getPageSize()); + + return Result.success(resultData); + } catch (IllegalArgumentException e) { + return Result.error("参数错误:" + e.getMessage()); + } catch (Exception e) { + log.error("查询翻译记录失败", e); + return Result.error("查询翻译记录失败"); + } + } + + // 添加新的翻译记录 + @Log("添加翻译记录") + @PostMapping("/addTranslation") + public Result addTranslation(@RequestBody Translation translation) { + try { + boolean result = translationService.add(translation); + if (result) { + return Result.success("添加翻译记录成功"); + } else { + return Result.error("添加翻译记录失败"); + } + } catch (RuntimeException e) { + // 捕获重复插入异常 + if ("简体中文已存在".equals(e.getMessage())) { + return Result.error("添加翻译记录失败:简体中文已存在"); + } else { + log.error("添加翻译记录失败", e); + return Result.error("添加翻译记录失败"); + } + } + } + + // 更新翻译记录 + @Log("更新翻译记录") + @PostMapping("/updateTranslation") + public Result updateTranslation(@RequestBody Translation translation) { + try { + boolean result = translationService.update(translation); + if (result) { + // 更新成功后刷新缓存 + languageTranslationUtil.refreshAllCache(); + return Result.success("更新翻译记录成功"); + } else { + return Result.error("更新翻译记录失败"); + } + } catch (Exception e) { + log.error("更新翻译记录失败", e); + return Result.error("更新翻译记录失败"); + } + } + + // 删除翻译记录 + @Log("删除翻译记录") + @PostMapping("/deleteTranslation") + public Result deleteTranslation(@RequestBody Translation request) { + try { + // 先获取要删除的记录,用于后续清理缓存 + Translation translationToDelete = translationService.findById(request.getId()); + + boolean result = translationService.deleteById(request.getId()); + if (result) { + // 删除成功后清理相关缓存 + if (translationToDelete != null) { + languageTranslationUtil.removeFromCache(translationToDelete.getChineseSimplified()); + } + return Result.success("删除翻译记录成功"); + } else { + return Result.error("删除翻译记录失败"); + } + } catch (Exception e) { + log.error("删除翻译记录失败", e); + return Result.error("删除翻译记录失败"); + } + } + +} diff --git a/src/main/java/com/example/demo/controller/coin/UserController.java b/src/main/java/com/example/demo/controller/coin/UserController.java index 8cb7168..66b915b 100644 --- a/src/main/java/com/example/demo/controller/coin/UserController.java +++ b/src/main/java/com/example/demo/controller/coin/UserController.java @@ -5,6 +5,7 @@ import com.example.demo.domain.entity.User; import com.example.demo.domain.vo.coin.GoldUser; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.coin.UserService; +import com.example.demo.Util.LanguageTranslationUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -29,12 +30,22 @@ public class UserController { @Autowired private UserService userService; + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + //查找用户 @Log("查找客户") @PostMapping("/selectUser") - public Result selectUser(@RequestBody GoldUser user) { + public Result selectUser(@RequestBody GoldUser user, @RequestHeader(defaultValue = "zh_CN") String lang) { try { - return userService.selectUser(user.getJwcode().toString()); + Result result = userService.selectUser(user.getJwcode().toString()); + // 对返回结果进行多语言转换 + if (result.getCode() == 200 && result.getData() instanceof GoldUser) { + GoldUser goldUser = (GoldUser) result.getData(); + translateGoldUser(goldUser, lang); + } + return result; } catch (Exception e) { return Result.error("请检查输入精网号"); } @@ -83,4 +94,16 @@ public class UserController { return Result.error("更新失败"); } } + + /** + * 转换用户信息的多语言字段 + */ + private void translateGoldUser(GoldUser goldUser, String lang) { + if (goldUser != null) { + // 翻译市场名称 + if (goldUser.getMarket() != null) { + goldUser.setMarket(languageTranslationUtil.translate(goldUser.getMarket(), lang)); + } + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/WorkbenchController.java b/src/main/java/com/example/demo/controller/coin/WorkbenchController.java index 11f43a9..bbb9464 100644 --- a/src/main/java/com/example/demo/controller/coin/WorkbenchController.java +++ b/src/main/java/com/example/demo/controller/coin/WorkbenchController.java @@ -1,6 +1,7 @@ package com.example.demo.controller.coin; import com.example.demo.Util.JWTUtil; +import com.example.demo.Util.LanguageTranslationUtil; import com.example.demo.config.interfac.Log; import com.example.demo.domain.entity.Admin; import com.example.demo.domain.vo.coin.WorkbenchCard; @@ -21,15 +22,6 @@ import org.springframework.web.context.request.ServletRequestAttributes; import java.util.List; -/** - * @program: gold-java - * @ClassName WorkbenchController - * @description: 工作台相关 - * @author: Ethan - * @create: 2025−06-17 17:13 - * @Version 1.0 - **/ - @RestController @RequestMapping("/workbench") @RequiredArgsConstructor @@ -38,7 +30,7 @@ import java.util.List; public class WorkbenchController { @Autowired - private WorkbenchService workbenchService; + private WorkbenchService workbenchService; @Autowired private StatisticsService statisticsService; @Autowired @@ -46,63 +38,136 @@ public class WorkbenchController { @Autowired private StatisticsMapper statisticsMapper; - /* + // 注入多语言转换工具类 + @Autowired + private LanguageTranslationUtil languageTranslationUtil; + + /** 获取各地区工作台卡片的数据 */ @Log("获取工作台卡片数据") @PostMapping("/getCard") - public ResponseEntity card1(@RequestBody WorkbenchCard workbench) throws Exception{ - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - String account = admin.getAccount(); + public ResponseEntity card1(@RequestBody WorkbenchCard workbench, + @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + String account = admin.getAccount(); //获取当前用户的市场列表 List markets = workbenchService.getAdminMarket(account); WorkbenchCard result; //判断是否是总部 - if (markets != null && markets.contains("总部")||markets.contains("研发部")) { + if (markets != null && (markets.contains("总部") || markets.contains("研发部"))) { result = workbenchService.getCardCache(markets);//走缓存,拿全部市场的缓存数据 } else { result = workbenchService.getCard(markets);//不走缓存,计算卡片属性 } - + + // 对结果进行多语言转换 + translateWorkbenchCard(result, lang); + return ResponseEntity.ok(result); } - /* + + /** 获取各地区工作台图表的数据 */ @Log("获取工作台图表数据") @PostMapping("/getGraph") - public ResponseEntity graph1(@RequestBody WorkbenchCard workbench, @AuthenticationPrincipal Admin admin) { + public ResponseEntity graph1(@RequestBody WorkbenchCard workbench, + @AuthenticationPrincipal Admin admin, + @RequestHeader(defaultValue = "zh_CN") String lang) { String account = admin.getAccount(); List markets = workbenchService.getAdminMarket(account); + workbench.setMarkets(markets); + WorkbenchCard result = workbenchService.getGraph(workbench.getStartDate(), workbench.getEndDate(), workbench.getMarkets()); + + // 对结果进行多语言转换 + translateWorkbenchCard(result, lang); + + return ResponseEntity.ok(result); + } + + //总营收 + @PostMapping("/getTotalRevenue") + public ResponseEntity> getTotalRevenue(@RequestBody WorkbenchCard workbench, + @AuthenticationPrincipal Admin admin, + @RequestHeader(defaultValue = "zh_CN") String lang) { + String account = admin.getAccount(); + List markets = workbenchService.getRevenueMarket(account); workbench.setMarkets(markets); - WorkbenchCard result =workbenchService.getGraph(workbench.getStartDate(),workbench.getEndDate(),workbench.getMarkets()); + List result = workbenchService.getTotalRevenue(workbench.getStartDate(), workbench.getEndDate(), workbench.getMarkets()); + + // 对结果进行多语言转换 + translateWorkbenchRevenue(result, lang); + return ResponseEntity.ok(result); } + //单个地区工作台图表 @Log("获取单个地区工作台图表数据") @PostMapping("/getSingleGraph") - public ResponseEntity singleGraph1(@RequestBody WorkbenchCard workbench, @AuthenticationPrincipal Admin admin) { + public ResponseEntity singleGraph1(@RequestBody WorkbenchCard workbench, + @AuthenticationPrincipal Admin admin, + @RequestHeader(defaultValue = "zh_CN") String lang) { String account = admin.getAccount(); List markets = workbenchService.getAdminMarket(account); workbench.setMarkets(markets); - WorkbenchCard result =workbenchService.getSingleGraph(workbench.getStartDate(),workbench.getEndDate(),workbench.getMarkets()); + WorkbenchCard result = workbenchService.getSingleGraph(workbench.getStartDate(), workbench.getEndDate(), workbench.getMarkets()); + // 对结果进行多语言转换 + translateWorkbenchCard(result, lang); return ResponseEntity.ok(result); } - //总营收 - @PostMapping("/getTotalRevenue") - public ResponseEntity> getTotalRevenue(@RequestBody WorkbenchCard workbench, @AuthenticationPrincipal Admin admin) { - String account = admin.getAccount(); - List markets = workbenchService.getRevenueMarket(account); - workbench.setMarkets(markets); - List result =workbenchService.getTotalRevenue(workbench.getStartDate(),workbench.getEndDate(),workbench.getMarkets()); - return ResponseEntity.ok(result); + /** + * 转换工作台卡片的多语言字段 + */ + private void translateWorkbenchCard(WorkbenchCard workbenchCard, String lang) { + if (workbenchCard != null) { + // 翻译市场卡片中的市场名称 + if (workbenchCard.getMarketCards() != null) { + for (com.example.demo.domain.vo.coin.WorkbenchMarketCard marketCard : workbenchCard.getMarketCards()) { + if (marketCard.getMarket() != null) { + String translatedMarket = languageTranslationUtil.translate(marketCard.getMarket(), lang); + marketCard.setMarket(translatedMarket); + } + } + } + + // 翻译图表数据中的市场名称 + if (workbenchCard.getMarketGraphs() != null) { + for (com.example.demo.domain.vo.coin.WorkbenchMarketGraph marketGraph : workbenchCard.getMarketGraphs()) { + if (marketGraph.getMarket() != null) { + String translatedMarket = languageTranslationUtil.translate(marketGraph.getMarket(), lang); + marketGraph.setMarket(translatedMarket); + } + } + } + // 翻译市场列表中的市场名称 + if (workbenchCard.getMarkets() != null) { + for (int i = 0; i < workbenchCard.getMarkets().size(); i++) { + String translatedMarket = languageTranslationUtil.translate(workbenchCard.getMarkets().get(i), lang); + workbenchCard.getMarkets().set(i, translatedMarket); + } + } + } } + /** + * 转换工作台营收数据的多语言字段 + */ + private void translateWorkbenchRevenue(List revenueList, String lang) { + if (revenueList != null) { + for (WorkbenchRevenue revenue : revenueList) { + if (revenue.getMarket() != null) { + String translatedMarket = languageTranslationUtil.translate(revenue.getMarket(), lang); + revenue.setMarket(translatedMarket); + } + } + } + } } diff --git a/src/main/java/com/example/demo/domain/DTO/TranslationQueryRequest.java b/src/main/java/com/example/demo/domain/DTO/TranslationQueryRequest.java new file mode 100644 index 0000000..dae82ed --- /dev/null +++ b/src/main/java/com/example/demo/domain/DTO/TranslationQueryRequest.java @@ -0,0 +1,11 @@ +package com.example.demo.domain.DTO; + +import lombok.Data; + +@Data +public class TranslationQueryRequest { + private int pageNum = 1; + private int pageSize = 10; + private String chineseSimplified; + private String languageStatus; // format: "language/isTranslated" e.g. "en/true" +} diff --git a/src/main/java/com/example/demo/domain/entity/Translation.java b/src/main/java/com/example/demo/domain/entity/Translation.java new file mode 100644 index 0000000..1da367e --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/Translation.java @@ -0,0 +1,25 @@ +package com.example.demo.domain.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 多语言配置实体类 + */ +@Data +@NoArgsConstructor +public class Translation implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id; + private String chineseSimplified; // 中文(简体原文) + private String english; // 英语 + private String thai; // 泰语 + private String chineseTraditional; // 中文(繁体) + private String malay; // 马来语 + private String vietnamese; // 越南语 + private Date configTime; // 更新时间 +} diff --git a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java index 433feac..e5f33cc 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java @@ -59,6 +59,7 @@ public class ConsumeUser implements Serializable { private String adminName; //提交人姓名 @ExcelProperty(value = "是否退款", converter = RefundConverter.class) private Integer isRefund; //是否退款 + private String isRefundDesc; // 退款状态描述(用于多语言翻译) @ExcelProperty("消耗时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date createTime; // 消费时间 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 797eaca..63314ed 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 @@ -36,6 +36,7 @@ public class GoldDetail { private String payPlatform; // 支付平台 @ExcelProperty("更新类型") private Integer type; // 类型 + private String typeDesc; // 类型描述(用于多语言翻译) @ExcelProperty("金币数量") private BigDecimal sumGold; // 总金币 @ExcelProperty("永久金币") diff --git a/src/main/java/com/example/demo/domain/vo/coin/RefundAudit.java b/src/main/java/com/example/demo/domain/vo/coin/RefundAudit.java index 1d04c13..ed8172b 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RefundAudit.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RefundAudit.java @@ -30,6 +30,7 @@ public class RefundAudit { private String market; // 所属地区 private List markets; // 所属地区 private Integer refundModel; // 退款方式-全额 部分 + private String refundModelDesc; // 退款方式描述(用于多语言翻译) private String goodsName; // 商品名称 private Integer rateId; // 汇率ID diff --git a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java index a979e94..4c19cf7 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java @@ -41,6 +41,7 @@ public class RefundUser { private String refundType; // 退款类型 @ExcelProperty("退款方式") private Byte refundModel; // 退款方式(0全部/1部分退款) + private String refundModelDesc; @ExcelProperty("退款金币总数") private BigDecimal sumGold; // 金币总数 @ExcelProperty("永久金币") diff --git a/src/main/java/com/example/demo/mapper/coin/TranslationMapper.java b/src/main/java/com/example/demo/mapper/coin/TranslationMapper.java new file mode 100644 index 0000000..ea369a6 --- /dev/null +++ b/src/main/java/com/example/demo/mapper/coin/TranslationMapper.java @@ -0,0 +1,42 @@ +package com.example.demo.mapper.coin; + +import com.example.demo.domain.entity.Translation; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface TranslationMapper { + // 查询所有翻译记录 + List findAll(); + + // 插入新的翻译记录 + int insert(Translation translation); + + // 更新翻译记录 + int update(Translation translation); + + // 删除翻译记录 + int deleteById(Integer id); + + // 根据部分中文简体内容模糊查询翻译记录 + List findByChineseSimplifiedLike(@Param("chineseSimplified") String chineseSimplified); + + // 根据中文简体内容精确查询翻译记录 + Translation findByChineseSimplified(@Param("chineseSimplified") String chineseSimplified); + + // 根据语言和翻译状态查询翻译记录 + List findByLanguageAndTranslationStatus( + @Param("languageColumn") String languageColumn, + @Param("isTranslated") boolean isTranslated + ); + + List findByChineseSimplifiedAndLanguageStatus( + @Param("chineseSimplified") String chineseSimplified, + @Param("languageColumn") String languageColumn, + @Param("isTranslated") boolean isTranslated + ); + + Translation findById(Integer id); +} diff --git a/src/main/java/com/example/demo/service/coin/TranslationService.java b/src/main/java/com/example/demo/service/coin/TranslationService.java new file mode 100644 index 0000000..867b036 --- /dev/null +++ b/src/main/java/com/example/demo/service/coin/TranslationService.java @@ -0,0 +1,36 @@ +package com.example.demo.service.coin; + +import com.example.demo.domain.entity.Translation; + +import java.util.List; + +public interface TranslationService { + // 查询所有翻译记录 + List findAll(); + + // 添加新的翻译记录 + boolean add(Translation translation); + + // 更新翻译记录 + boolean update(Translation translation); + + // 删除翻译记录 + boolean deleteById(Integer id); + + // 根据部分中文简体内容模糊查询翻译记录 + List findByChineseSimplifiedLike(String chineseSimplified); + + // 根据中文简体内容精确查询翻译记录 + Translation findByChineseSimplified(String chineseSimplified); + + // 根据语言和翻译状态查询翻译记录 + List findByLanguageAndTranslationStatus(String language, boolean isTranslated); + + List findByChineseSimplifiedAndLanguageStatus( + String chineseSimplified, + String language, + boolean isTranslated + ); + + Translation findById(Integer id); +} 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 085b42a..c5ed708 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java @@ -144,7 +144,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { List markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); rechargeUser.setMarkets(markets); page.setRechargeUser(rechargeUser); - return rechargeController.selcet(page); + return rechargeController.select(page); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/main/java/com/example/demo/serviceImpl/coin/TranslationServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/TranslationServiceImpl.java new file mode 100644 index 0000000..a0bfdb3 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/coin/TranslationServiceImpl.java @@ -0,0 +1,97 @@ +package com.example.demo.serviceImpl.coin; + +import com.example.demo.domain.entity.Translation; +import com.example.demo.mapper.coin.TranslationMapper; +import com.example.demo.service.coin.TranslationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class TranslationServiceImpl implements TranslationService { + + @Autowired + private TranslationMapper translationMapper; + + @Override + public List findAll() { + return translationMapper.findAll(); + } + + @Override + public boolean add(Translation translation) { + // 使用精确匹配检查是否存在相同的 chineseSimplified + Translation existingTranslation = translationMapper.findByChineseSimplified(translation.getChineseSimplified()); + if (existingTranslation != null) { + throw new RuntimeException("简体中文已存在"); + } + return translationMapper.insert(translation) > 0; + } + + @Override + public boolean update(Translation translation) { + return translationMapper.update(translation) > 0; + } + + @Override + public boolean deleteById(Integer id) { + return translationMapper.deleteById(id) > 0; + } + + @Override + public List findByChineseSimplifiedLike(String chineseSimplified) { + return translationMapper.findByChineseSimplifiedLike(chineseSimplified); + } + + @Override + public Translation findByChineseSimplified(String chineseSimplified) { + return translationMapper.findByChineseSimplified(chineseSimplified); + } + + @Override + public List findByLanguageAndTranslationStatus(String language, boolean isTranslated) { + // 语言字段映射关系 + Map languageColumnMap = new HashMap<>(); + languageColumnMap.put("en", "english"); // 英语 + languageColumnMap.put("th", "thai"); // 泰语 + languageColumnMap.put("zh_TW", "chinese_traditional"); // 繁体中文 + languageColumnMap.put("ms", "malay"); // 马来语 + languageColumnMap.put("vi", "vietnamese"); // 越南语 + + String columnName = languageColumnMap.get(language.toLowerCase()); + if (columnName == null) { + throw new IllegalArgumentException("不支持的语言类型: " + language); + } + + return translationMapper.findByLanguageAndTranslationStatus(columnName, isTranslated); + } + + @Override + public List findByChineseSimplifiedAndLanguageStatus( + String chineseSimplified, + String language, + boolean isTranslated) { + // 语言字段映射关系 + Map languageColumnMap = new HashMap<>(); + languageColumnMap.put("en", "english"); // 英语 + languageColumnMap.put("th", "thai"); // 泰语 + languageColumnMap.put("zh_TW", "chinese_traditional"); // 繁体中文 + languageColumnMap.put("ms", "malay"); // 马来语 + languageColumnMap.put("vi", "vietnamese"); // 越南语 + + String columnName = languageColumnMap.get(language.toLowerCase()); + if (columnName == null) { + throw new IllegalArgumentException("不支持的语言类型: " + language); + } + return translationMapper.findByChineseSimplifiedAndLanguageStatus( + chineseSimplified, columnName, isTranslated); + } + + @Override + public Translation findById(Integer id) { + return translationMapper.findById(id); + } +} diff --git a/src/main/resources/mapper/TranslationMapper.xml b/src/main/resources/mapper/TranslationMapper.xml new file mode 100644 index 0000000..15ab516 --- /dev/null +++ b/src/main/resources/mapper/TranslationMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + INSERT INTO translation ( + chinese_simplified, + english, + thai, + chinese_traditional, + malay, + vietnamese, + config_time + ) VALUES ( + #{chineseSimplified}, + #{english}, + #{thai}, + #{chineseTraditional}, + #{malay}, + #{vietnamese}, + NOW() + ) + + + + + UPDATE translation + + chinese_simplified = #{chineseSimplified}, + english = #{english}, + thai = #{thai}, + chinese_traditional = #{chineseTraditional}, + malay = #{malay}, + vietnamese = #{vietnamese}, + config_time = NOW() + + WHERE id = #{id} + + + + + DELETE FROM translation WHERE id = #{id} + + + + + + + + + + + + +