Browse Source

12月2日现金管理多语言配置,反向查询中文

milestone-20251125-多语言
wangguorui 1 month ago
parent
commit
2464be7348
  1. 190
      src/main/java/com/example/demo/controller/coin/ExportController.java
  2. 3
      src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
  3. 33
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  4. 27
      src/main/java/com/example/demo/serviceImpl/coin/GoldDetailServiceImpl.java

190
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);
}
}
}
/**
* 解析语言代码
*/
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);
// }
}
}
}

3
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; // 总金币

33
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<GoldDetail>) 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<GoldDetail> 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 "未知类型";
}
}
}

27
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<GoldDetail> goldDetails) {
if (goldDetails != null && !goldDetails.isEmpty()) {
for (GoldDetail detail : goldDetails) {
if (detail.getType() != null) {
detail.setTypeDesc(convertTypeToString(detail.getType()));
}
}
}
}
//更新用户消费次数
@Override
public Result updateConsumeNum() {

Loading…
Cancel
Save