Browse Source

Merge branch 'refs/heads/milestone-20251203-冲刺计划' into huangqizheng/feature-20251203174217-冲刺计划

huangqizheng/feature-20251203174217-冲刺计划
huangqizhen 3 months ago
parent
commit
823c1ed420
  1. 2
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  2. 104
      src/main/java/com/example/demo/Util/LanguageTranslationUtil.java
  3. 5
      src/main/java/com/example/demo/controller/bean/BeanConsumeController.java
  4. 2
      src/main/java/com/example/demo/controller/cash/Bank.java
  5. 136
      src/main/java/com/example/demo/controller/coin/AdminController.java
  6. 225
      src/main/java/com/example/demo/controller/coin/AuditController.java
  7. 132
      src/main/java/com/example/demo/controller/coin/ConsumeController.java
  8. 188
      src/main/java/com/example/demo/controller/coin/ExportController.java
  9. 155
      src/main/java/com/example/demo/controller/coin/GeneralController.java
  10. 186
      src/main/java/com/example/demo/controller/coin/GoldDetailController.java
  11. 4
      src/main/java/com/example/demo/controller/coin/HistoryRecordController.java
  12. 96
      src/main/java/com/example/demo/controller/coin/MarketController.java
  13. 80
      src/main/java/com/example/demo/controller/coin/MenuController.java
  14. 56
      src/main/java/com/example/demo/controller/coin/RateController.java
  15. 158
      src/main/java/com/example/demo/controller/coin/RechargeController.java
  16. 265
      src/main/java/com/example/demo/controller/coin/RefundController.java
  17. 2
      src/main/java/com/example/demo/controller/coin/RoleController.java
  18. 153
      src/main/java/com/example/demo/controller/coin/TranslationController.java
  19. 73
      src/main/java/com/example/demo/controller/coin/UserController.java
  20. 201
      src/main/java/com/example/demo/controller/coin/WorkbenchController.java
  21. 11
      src/main/java/com/example/demo/domain/DTO/TranslationQueryRequest.java
  22. 3
      src/main/java/com/example/demo/domain/entity/CashRecord.java
  23. 2
      src/main/java/com/example/demo/domain/entity/GOrder.java
  24. 25
      src/main/java/com/example/demo/domain/entity/Translation.java
  25. 1
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  26. 4
      src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
  27. 1
      src/main/java/com/example/demo/domain/vo/coin/RefundAudit.java
  28. 4
      src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
  29. 48
      src/main/java/com/example/demo/mapper/coin/TranslationMapper.java
  30. 5
      src/main/java/com/example/demo/service/coin/AdminService.java
  31. 7
      src/main/java/com/example/demo/service/coin/RefundService.java
  32. 39
      src/main/java/com/example/demo/service/coin/TranslationService.java
  33. 33
      src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java
  34. 45
      src/main/java/com/example/demo/serviceImpl/coin/AdminServiceImpl.java
  35. 84
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  36. 27
      src/main/java/com/example/demo/serviceImpl/coin/GoldDetailServiceImpl.java
  37. 78
      src/main/java/com/example/demo/serviceImpl/coin/RefundServiceImpl.java
  38. 122
      src/main/java/com/example/demo/serviceImpl/coin/TranslationServiceImpl.java
  39. 13
      src/main/resources/cashMapper/CashCollectionMapper.xml
  40. 19
      src/main/resources/mapper/AuditMapper.xml
  41. 2
      src/main/resources/mapper/BeanAuditMapper.xml
  42. 4
      src/main/resources/mapper/BeanRechargeMapper1.xml
  43. 127
      src/main/resources/mapper/TranslationMapper.xml

2
src/main/java/com/example/demo/Export/ExportServiceImpl.java

@ -306,7 +306,7 @@ public class ExportServiceImpl implements ExportService {
@Override @Override
public Result addExportLive(LiveDTO dto) { public Result addExportLive(LiveDTO dto) {
return addExport(dto, "直播明细", "lives:queue:export_queue", "beanConsumeLive");
return addExport(dto, "打赏明细", "lives:queue:export_queue", "beanConsumeLive");
} }
@Override @Override

104
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<String, Translation> 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);
}
}
}

5
src/main/java/com/example/demo/controller/bean/BeanConsumeController.java

@ -1,5 +1,6 @@
package com.example.demo.controller.bean; package com.example.demo.controller.bean;
import com.example.demo.config.interfac.Log;
import com.example.demo.domain.vo.bean.BeanConsume; import com.example.demo.domain.vo.bean.BeanConsume;
import com.example.demo.domain.vo.bean.BeanConsumeGold; import com.example.demo.domain.vo.bean.BeanConsumeGold;
import com.example.demo.domain.vo.bean.BeanRecharge; import com.example.demo.domain.vo.bean.BeanRecharge;
@ -58,6 +59,7 @@ public class BeanConsumeController {
} }
} }
//筛选查询直播消费记录 //筛选查询直播消费记录
@Log("查询直播消费记录")
@PostMapping("/selectLiveBy") @PostMapping("/selectLiveBy")
public Result selectLiveBy(@RequestBody Page page){ public Result selectLiveBy(@RequestBody Page page){
try { try {
@ -76,6 +78,7 @@ public class BeanConsumeController {
return Result.error(e.toString()); return Result.error(e.toString());
}} }}
//筛选查询铁粉消费记录 //筛选查询铁粉消费记录
@Log("查询铁粉消费记录")
@PostMapping("/selectFanBy") @PostMapping("/selectFanBy")
public Result selectFanBy(@RequestBody Page page){ public Result selectFanBy(@RequestBody Page page){
try { try {
@ -94,6 +97,7 @@ public class BeanConsumeController {
}} }}
//筛选查询文章消费记录 //筛选查询文章消费记录
@Log("查询文章消费记录")
@PostMapping("/selectArticleBy") @PostMapping("/selectArticleBy")
public Result selectArticleBy(@RequestBody Page page){ public Result selectArticleBy(@RequestBody Page page){
try { try {
@ -112,6 +116,7 @@ public class BeanConsumeController {
}} }}
//筛选查询小黄车消费记录 //筛选查询小黄车消费记录
@Log("查询小黄车消费记录")
@PostMapping("/selectCartBy") @PostMapping("/selectCartBy")
public Result selectCartBy(@RequestBody Page page){ public Result selectCartBy(@RequestBody Page page){
try { try {

2
src/main/java/com/example/demo/controller/cash/Bank.java

@ -11,4 +11,6 @@ package com.example.demo.controller.cash;
public class Bank { public class Bank {
} }

136
src/main/java/com/example/demo/controller/coin/AdminController.java

@ -1,12 +1,14 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.coin.Password; import com.example.demo.domain.vo.coin.Password;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.coin.AdminMapper; import com.example.demo.mapper.coin.AdminMapper;
import com.example.demo.service.coin.AdminService; import com.example.demo.service.coin.AdminService;
import com.example.demo.service.coin.TranslationService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -32,6 +34,13 @@ public class AdminController {
@Autowired @Autowired
private AdminMapper adminMapper; private AdminMapper adminMapper;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private TranslationService translationService;
@PostMapping("/test") @PostMapping("/test")
public void testGetAdmin() { public void testGetAdmin() {
Admin admin = adminMapper.getAdmin("14518"); Admin admin = adminMapper.getAdmin("14518");
@ -41,7 +50,7 @@ public class AdminController {
@Log("用户登录") @Log("用户登录")
@PostMapping("/login") @PostMapping("/login")
public Result login(@RequestBody Admin admin) {
public Result login(@RequestBody Admin admin, @RequestHeader(defaultValue = "zh") String lang) {
try { try {
admin = adminService.login(admin); admin = adminService.login(admin);
@ -53,47 +62,61 @@ public class AdminController {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
log.error(e.getMessage()); log.error(e.getMessage());
return Result.error(e.getMessage());
String translatedErrorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
return Result.error(translatedErrorMsg);
} }
} }
@Log("查看用户信息") @Log("查看用户信息")
@PostMapping("/userinfo") @PostMapping("/userinfo")
public UserDetails getUserInfo(@RequestHeader("token") String token1) {
//String token = token1.getToken();
public UserDetails getUserInfo(@RequestHeader("token") String token1,
@RequestHeader(defaultValue = "zh") String lang) {
String token = token1; String token = token1;
try { 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;
// 如果不是中文环境先将翻译后的文本转换回中文进行处理
String languageCode = parseLanguageCode(lang);
if (!"zh".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(admin, languageCode);
}
translateAdminInfo(admin, lang);
}
return userDetails;
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
//获取管理员ID //获取管理员ID
@Log("获取用户ID") @Log("获取用户ID")
@PostMapping("/adminId") @PostMapping("/adminId")
public Result selectId(@RequestBody Admin admin) {
public Result selectId(@RequestBody Admin admin, @RequestHeader(defaultValue = "zh") String lang) {
try { try {
String ID = adminService.getId(admin.getAccount()); String ID = adminService.getId(admin.getAccount());
return Result.success(ID); return Result.success(ID);
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage()); log.error(e.getMessage());
return Result.error(e.getMessage());
String translatedErrorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
return Result.error(translatedErrorMsg);
} }
} }
//更新用户密码 //更新用户密码
@Log("更新用户密码") @Log("更新用户密码")
@PostMapping("/password") @PostMapping("/password")
public Result updatePassword(@RequestBody Password password){
public Result updatePassword(@RequestBody Password password, @RequestHeader(defaultValue = "zh") String lang){
try { try {
return adminService.updatePassword(password);
return adminService.updatePassword(password, lang);
} catch (Exception e) { } catch (Exception e) {
return Result.error("服务器波动,请稍作等待");
String translatedErrorMsg = languageTranslationUtil.translate("服务器波动,请稍作等待", lang);
return Result.error(translatedErrorMsg);
} }
} }
@ -101,14 +124,99 @@ public class AdminController {
//更新用户密码 //更新用户密码
@Log("重置用户密码") @Log("重置用户密码")
@PostMapping("/reset") @PostMapping("/reset")
public Result resetPassword(@RequestBody Password password){
public Result resetPassword(@RequestBody Password password, @RequestHeader(defaultValue = "zh") String lang){
try { try {
return adminService.resetPassword(password);
return adminService.resetPassword(password, lang);
} catch (Exception e) { } catch (Exception e) {
return Result.error("重置失败");
String translatedErrorMsg = languageTranslationUtil.translate("重置失败", lang);
return Result.error(translatedErrorMsg);
} }
} }
/**
* 转换管理员信息的多语言字段
*/
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);
}
}
}
/**
* 解析语言代码
*/
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 convertTranslatedFieldsToChinese(Admin admin, String languageCode) {
if (admin != null) {
// 转换市场权限信息
if (admin.getMarkets() != null && !admin.getMarkets().isEmpty()) {
String[] markets = admin.getMarkets().split(",");
StringBuilder convertedMarkets = new StringBuilder();
for (int i = 0; i < markets.length; i++) {
if (i > 0) {
convertedMarkets.append(",");
}
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
markets[i].trim(), languageCode);
convertedMarkets.append(chineseMarket);
}
admin.setMarkets(convertedMarkets.toString());
}
// 转换职位信息
if (admin.getPostiton() != null && !admin.getPostiton().isEmpty()) {
String chinesePosition = translationService.findChineseSimplifiedByTranslation(
admin.getPostiton(), languageCode);
admin.setPostiton(chinesePosition);
}
// 转换备注
if (admin.getRemark() != null && !admin.getRemark().isEmpty()) {
String chineseRemark = translationService.findChineseSimplifiedByTranslation(
admin.getRemark(), languageCode);
admin.setRemark(chineseRemark);
}
}
}
} }

225
src/main/java/com/example/demo/controller/coin/AuditController.java

@ -1,9 +1,11 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.service.coin.AuditService; import com.example.demo.service.coin.AuditService;
import com.example.demo.service.coin.TranslationService;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -37,22 +39,40 @@ public class AuditController {
@Autowired @Autowired
private AuditService auditService; private AuditService auditService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private TranslationService translationService;
//审核订单 //审核订单
@Log("审核订单") @Log("审核订单")
@PostMapping("audit") @PostMapping("audit")
public ResponseEntity<Boolean> auditOrder( public ResponseEntity<Boolean> auditOrder(
@RequestBody AuditRequest request) { @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); return ResponseEntity.ok(result);
}
}
//多条件查询充值审核订单列表 //多条件查询充值审核订单列表
@Log("查询充值审核订单列表") @Log("查询充值审核订单列表")
@PostMapping("selectRecharge") @PostMapping("selectRecharge")
public PageInfo<RechargeAudit> searchRechargeAudit (
@RequestBody Page page) throws Exception {
public PageInfo<RechargeAudit> searchRechargeAudit(
@RequestBody Page page,
@RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
Integer pageNum = page.getPageNum(); Integer pageNum = page.getPageNum();
Integer pageSize = page.getPageSize(); Integer pageSize = page.getPageSize();
RechargeAudit rechargeAudit = page.getRechargeAudit(); RechargeAudit rechargeAudit = page.getRechargeAudit();
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRechargeTranslatedFieldsToChinese(rechargeAudit, languageCode);
}
//解token权限 //解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token"); String token = request.getHeader("token");
@ -62,14 +82,31 @@ public class AuditController {
rechargeAudit.setMarkets(list); rechargeAudit.setMarkets(list);
} }
return auditService.selectRechargeBy(pageNum, pageSize, rechargeAudit);
} //多条件查询退款审核订单列表
PageInfo<RechargeAudit> pageInfo = auditService.selectRechargeBy(pageNum, pageSize, rechargeAudit);
// 对结果进行多语言转换
translateRechargeAuditResults(pageInfo, lang);
return pageInfo;
}
//多条件查询退款审核订单列表
@Log("查询退款审核订单列表") @Log("查询退款审核订单列表")
@PostMapping("selectRefund") @PostMapping("selectRefund")
public PageInfo<RefundAudit> searchRefundAudit(@RequestBody Page page) throws Exception {
public PageInfo<RefundAudit> searchRefundAudit(
@RequestBody Page page,
@RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
Integer pageNum = page.getPageNum(); Integer pageNum = page.getPageNum();
Integer pageSize = page.getPageSize(); Integer pageSize = page.getPageSize();
RefundAudit refundAudit = page.getRefundAudit(); RefundAudit refundAudit = page.getRefundAudit();
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(refundAudit, languageCode);
}
//解token权限 //解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token"); String token = request.getHeader("token");
@ -79,8 +116,12 @@ public class AuditController {
refundAudit.setMarkets(list); refundAudit.setMarkets(list);
} }
return auditService.selectRefundBy(pageNum, pageSize, refundAudit);
}
PageInfo<RefundAudit> pageInfo = auditService.selectRefundBy(pageNum, pageSize, refundAudit);
// 对结果进行多语言转换
translateRefundAuditResults(pageInfo, lang);
return pageInfo;
}
//充值审核合计数 //充值审核合计数
@Log("充值审核合计数") @Log("充值审核合计数")
@PostMapping("sumRechargeGold") @PostMapping("sumRechargeGold")
@ -115,4 +156,170 @@ public class AuditController {
} }
return auditService.sumRefundGold(pageNum, pageSize, refundAudit); return auditService.sumRefundGold(pageNum, pageSize, refundAudit);
} }
/**
* 转换充值审核结果的多语言字段
*/
private void translateRechargeAuditResults(PageInfo<RechargeAudit> 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<RefundAudit> 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 "未知退款方式";
}
}
/**
* 解析语言代码
*/
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(RechargeAudit rechargeAudit, String languageCode) {
if (rechargeAudit != null) {
// 转换市场名称
if (rechargeAudit.getMarket() != null && !rechargeAudit.getMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
rechargeAudit.getMarket(), languageCode);
rechargeAudit.setMarket(chineseMarket);
}
// 转换汇率名称
if (rechargeAudit.getRateName() != null && !rechargeAudit.getRateName().isEmpty()) {
String chineseRateName = translationService.findChineseSimplifiedByTranslation(
rechargeAudit.getRateName(), languageCode);
rechargeAudit.setRateName(chineseRateName);
}
// 转换支付方式
if (rechargeAudit.getPayModel() != null && !rechargeAudit.getPayModel().isEmpty()) {
String chinesePayModel = translationService.findChineseSimplifiedByTranslation(
rechargeAudit.getPayModel(), languageCode);
rechargeAudit.setPayModel(chinesePayModel);
}
// 转换备注
if (rechargeAudit.getRemark() != null && !rechargeAudit.getRemark().isEmpty()) {
String chineseRemark = translationService.findChineseSimplifiedByTranslation(
rechargeAudit.getRemark(), languageCode);
rechargeAudit.setRemark(chineseRemark);
}
}
}
/**
* 将退款审核查询条件中的翻译字段转换为中文简体
*/
private void convertRefundTranslatedFieldsToChinese(RefundAudit refundAudit, String languageCode) {
if (refundAudit != null) {
// 转换市场名称
if (refundAudit.getMarket() != null && !refundAudit.getMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
refundAudit.getMarket(), languageCode);
refundAudit.setMarket(chineseMarket);
}
// 转换商品名称
if (refundAudit.getGoodsName() != null && !refundAudit.getGoodsName().isEmpty()) {
String chineseGoodsName = translationService.findChineseSimplifiedByTranslation(
refundAudit.getGoodsName(), languageCode);
refundAudit.setGoodsName(chineseGoodsName);
}
// 转换退款类型
if (refundAudit.getRefundType() != null && !refundAudit.getRefundType().isEmpty()) {
String chineseRefundType = translationService.findChineseSimplifiedByTranslation(
refundAudit.getRefundType(), languageCode);
refundAudit.setRefundType(chineseRefundType);
}
// 转换备注
if (refundAudit.getRemark() != null && !refundAudit.getRemark().isEmpty()) {
String chineseRemark = translationService.findChineseSimplifiedByTranslation(
refundAudit.getRemark(), languageCode);
refundAudit.setRemark(chineseRemark);
}
}
}
} }

132
src/main/java/com/example/demo/controller/coin/ConsumeController.java

@ -1,6 +1,7 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.coin.ConsumeUser; import com.example.demo.domain.vo.coin.ConsumeUser;
@ -8,6 +9,8 @@ import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.service.coin.ConsumeService; import com.example.demo.service.coin.ConsumeService;
import com.example.demo.service.coin.TranslationService;
import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -40,6 +43,13 @@ public class ConsumeController {
@Autowired @Autowired
private ConsumeService consumeService; private ConsumeService consumeService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private TranslationService translationService;
//消耗明细 //消耗明细
@Log("查看所有消耗明细") @Log("查看所有消耗明细")
@PostMapping("/selectAll") @PostMapping("/selectAll")
@ -74,11 +84,9 @@ public class ConsumeController {
} }
//消耗明细筛选
@Log("筛选查询消耗明细") @Log("筛选查询消耗明细")
@PostMapping("/selectBy") @PostMapping("/selectBy")
public Result selectBy(@RequestBody Page page) {
public Result selectBy(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) {
try { try {
//页码校验 //页码校验
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
@ -88,6 +96,14 @@ public class ConsumeController {
if (ObjectUtils.isEmpty(page.getPageSize())) { if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!"); return Result.error("页大小为空!");
} else { } else {
// 解析语言参数提取语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文则尝试将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(page.getConsumeUser(), languageCode);
}
//解token权限 //解token权限
if(page.getConsumeUser().getMarkets()==null||page.getConsumeUser().getMarkets().isEmpty()) { if(page.getConsumeUser().getMarkets()==null||page.getConsumeUser().getMarkets().isEmpty()) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
@ -101,15 +117,21 @@ public class ConsumeController {
return Result.error("角色为空"); 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<ConsumeUser> pageInfo = (PageInfo<ConsumeUser>) result.getData();
translateConsumeUsers(pageInfo, lang);
}
return result;
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error("请检查筛选数据的格式"); return Result.error("请检查筛选数据的格式");
} }
} }
//消耗金币统计 //消耗金币统计
@Log("消耗金币合计数统计") @Log("消耗金币合计数统计")
@PostMapping("/statsGold") @PostMapping("/statsGold")
@ -138,9 +160,27 @@ public class ConsumeController {
//消耗金币增加 //消耗金币增加
@Log("新增金币消耗") @Log("新增金币消耗")
@PostMapping("/add") @PostMapping("/add")
public Result add(@RequestBody ConsumeUser consumeUser) {
public Result add(@RequestBody ConsumeUser consumeUser, @RequestHeader(defaultValue = "zh_CN") String lang) {
try { try {
return consumeService.add(consumeUser);
// 解析语言参数提取语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文则尝试将输入的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(consumeUser, languageCode);
}
Result result = consumeService.add(consumeUser);
// 如果操作成功对返回消息进行多语言转换
if (result.getCode() == 200) {
String translatedMsg = languageTranslationUtil.translate("添加成功", lang);
return Result.success(translatedMsg);
} else {
// 对错误消息进行多语言转换
String translatedErrorMsg = languageTranslationUtil.translate(result.getMsg(), lang);
return Result.error(translatedErrorMsg);
}
// if(consumeUser.getJwcode().equals(94226013)) // if(consumeUser.getJwcode().equals(94226013))
// { // {
// return consumeService.add(consumeUser); // return consumeService.add(consumeUser);
@ -150,7 +190,8 @@ public class ConsumeController {
// //
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error("请查看后端报错信息");
String translatedErrorMsg = languageTranslationUtil.translate("请查看后端报错信息", lang);
return Result.error(translatedErrorMsg);
} }
} }
@ -193,5 +234,80 @@ public class ConsumeController {
} }
/**
* 转换消费用户信息的多语言字段
*/
private void translateConsumeUsers(PageInfo<ConsumeUser> 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));
}
}
}
}
}
/**
* 解析语言代码
*/
private String parseLanguageCode(String langHeader) {
if (langHeader == null || langHeader.isEmpty()) {
return "zh_CN";
}
// 处理类似 "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 convertTranslatedFieldsToChinese(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);
// }
}
}
} }

188
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.BusinessException;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.Util.RedisLockUtil; import com.example.demo.Util.RedisLockUtil;
import com.example.demo.domain.DTO.*; import com.example.demo.domain.DTO.*;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.Export; import com.example.demo.domain.entity.Export;
import com.example.demo.domain.DTO.CashDTO; 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.domain.vo.coin.Result;
import com.example.demo.service.coin.ExportExcelService; import com.example.demo.service.coin.ExportExcelService;
import com.example.demo.service.coin.GoldDetailService; import com.example.demo.service.coin.GoldDetailService;
import com.example.demo.Export.ExportService; import com.example.demo.Export.ExportService;
import com.example.demo.service.coin.TranslationService;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -45,6 +50,15 @@ public class ExportController {
private GoldDetailService goldDetailService; private GoldDetailService goldDetailService;
@Autowired @Autowired
private ExportService exportService; private ExportService exportService;
// 注入 TranslationService
@Autowired
private TranslationService translationService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@PostMapping("/export") @PostMapping("/export")
public Result export(@Valid @RequestBody Export export, @RequestHeader("token") String token) throws Exception { public Result export(@Valid @RequestBody Export export, @RequestHeader("token") String token) throws Exception {
try { try {
@ -56,14 +70,24 @@ public class ExportController {
return Result.error("导出失败" + e.getMessage()); return Result.error("导出失败" + e.getMessage());
} }
} }
@PostMapping("/exportRecharge") @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 lockKey = "export:lock:" + dto.getToken(); // 锁的 Key可按用户/业务区分
String requestId = UUID.randomUUID().toString(); // 请求 ID防止误删锁 String requestId = UUID.randomUUID().toString(); // 请求 ID防止误删锁
long expireTime = 5000; // 锁过期时间5秒s long expireTime = 5000; // 锁过期时间5秒s
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token"); String token = request.getHeader("token");
dto.setToken(token); dto.setToken(token);
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRechargeTranslatedFieldsToChinese(dto.getRechargeUser(), languageCode);
}
try { try {
// 尝试获取锁 // 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) { if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
@ -76,14 +100,24 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportRefund") @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 lockKey = "export:lock:" + dto.getToken(); // 锁的 Key可按用户/业务区分
String requestId = UUID.randomUUID().toString(); // 请求 ID防止误删锁 String requestId = UUID.randomUUID().toString(); // 请求 ID防止误删锁
long expireTime = 5000; // 锁过期时间5秒s long expireTime = 5000; // 锁过期时间5秒s
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token"); String token = request.getHeader("token");
dto.setToken(token); dto.setToken(token);
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(dto.getRefundUser(), languageCode);
}
try { try {
// 尝试获取锁 // 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) { if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
@ -96,14 +130,24 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportConsume") @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 lockKey = "export:lock:" + dto.getToken(); // 锁的 Key可按用户/业务区分
String requestId = UUID.randomUUID().toString(); // 请求 ID防止误删锁 String requestId = UUID.randomUUID().toString(); // 请求 ID防止误删锁
long expireTime = 5000; // 锁过期时间5秒s long expireTime = 5000; // 锁过期时间5秒s
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token"); String token = request.getHeader("token");
dto.setToken(token); dto.setToken(token);
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertConsumeTranslatedFieldsToChinese(dto.getConsumeUser(), languageCode);
}
try { try {
return exportService.addExportConsume(dto); return exportService.addExportConsume(dto);
} finally { } finally {
@ -111,6 +155,7 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportLive") @PostMapping("/exportLive")
public Result export(@Valid @RequestBody LiveDTO dto) { public Result export(@Valid @RequestBody LiveDTO dto) {
String lockKey = "export:lock:" + dto.getToken(); String lockKey = "export:lock:" + dto.getToken();
@ -128,6 +173,7 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportFan") @PostMapping("/exportFan")
public Result export(@Valid @RequestBody FanDTO dto){ public Result export(@Valid @RequestBody FanDTO dto){
String lockKey = "export:lock:" + dto.getToken(); String lockKey = "export:lock:" + dto.getToken();
@ -145,6 +191,7 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportArticle") @PostMapping("/exportArticle")
public Result export(@Valid @RequestBody ArticleDTO dto){ public Result export(@Valid @RequestBody ArticleDTO dto){
String lockKey = "export:lock:" + dto.getToken(); String lockKey = "export:lock:" + dto.getToken();
@ -162,6 +209,7 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportBean") @PostMapping("/exportBean")
public Result export(@Valid @RequestBody BeanRechargeDTO dto){ public Result export(@Valid @RequestBody BeanRechargeDTO dto){
String lockKey = "export:lock:" + dto.getToken(); String lockKey = "export:lock:" + dto.getToken();
@ -179,6 +227,7 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportol") @PostMapping("/exportol")
public Result exportol(@Valid @RequestBody OnlineDTO dto) throws Exception { public Result exportol(@Valid @RequestBody OnlineDTO dto) throws Exception {
String lockKey = "export:lock:" + dto.getToken(); String lockKey = "export:lock:" + dto.getToken();
@ -196,6 +245,7 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
/** /**
* 负责人退款导出 * 负责人退款导出
*/ */
@ -216,6 +266,7 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); redisLockUtil.unlock(lockKey, requestId);
} }
} }
@PostMapping("/exportCash") @PostMapping("/exportCash")
public Result exportCash(@Valid @RequestBody CashDTO dto) { public Result exportCash(@Valid @RequestBody CashDTO dto) {
String lockKey = "export:lock:" + dto.getToken(); String lockKey = "export:lock:" + dto.getToken();
@ -233,4 +284,135 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId); 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);
// }
}
}
} }

155
src/main/java/com/example/demo/controller/coin/GeneralController.java

@ -1,10 +1,13 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.config.interfac.Log; 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.AdminVo;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.domain.vo.coin.RoleVo; import com.example.demo.domain.vo.coin.RoleVo;
import com.example.demo.service.coin.GeneralService; import com.example.demo.service.coin.GeneralService;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.service.coin.TranslationService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -29,7 +32,15 @@ public class GeneralController {
@Autowired @Autowired
private GeneralService generalService; private GeneralService generalService;
// @Log("获取全部地区")
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private TranslationService translationService;
// @Log("获取全部地区")
@PostMapping("/market") @PostMapping("/market")
public Result getMarket() public Result getMarket()
{ {
@ -58,38 +69,164 @@ public class GeneralController {
List<String> list = generalService.getAllRoleMarket(); List<String> list = generalService.getAllRoleMarket();
return Result.success(list); return Result.success(list);
} }
// @Log("获取平台信息")
// @Log("获取平台信息")
@PostMapping("/platform") @PostMapping("/platform")
public Result getPlatform()
public Result getPlatform(@RequestHeader(defaultValue = "zh_CN") String lang)
{ {
List<String> list = generalService.getPlatform(); List<String> list = generalService.getPlatform();
// // 对平台名称进行多语言转换
// translatePlatformNames(list, lang);
return Result.success(list); return Result.success(list);
} }
//获取商品名称 //获取商品名称
// @Log("获取商品名称")
// @Log("获取商品名称")
@PostMapping("/goods") @PostMapping("/goods")
public Result getGoods()
public Result getGoods(@RequestHeader(defaultValue = "zh_CN") String lang)
{ {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
List<String> list = generalService.getGoods(); List<String> list = generalService.getGoods();
// 如果不是中文环境先将翻译后的商品名称转换为中文简体进行处理
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedGoodsNamesToChinese(list, languageCode);
}
// 对商品名称进行多语言转换
translateGoodsNames(list, lang);
return Result.success(list); return Result.success(list);
} }
//获取活动名称 //获取活动名称
// @Log("获取活动名称")
// @Log("获取活动名称")
@PostMapping("/activity") @PostMapping("/activity")
public Result getActivity()
public Result getActivity(@RequestHeader(defaultValue = "zh_CN") String lang)
{ {
List<String> list = generalService.getActivity(); List<String> list = generalService.getActivity();
// // 对活动名称进行多语言转换
// translateActivityNames(list, lang);
return Result.success(list); return Result.success(list);
} }
//获取汇率
@PostMapping("/getRate") @PostMapping("/getRate")
public Result getRate()
public Result getRate(@RequestHeader(defaultValue = "zh_CN") String lang)
{ {
return Result.success(generalService.getRate());
// 解析语言代码
String languageCode = parseLanguageCode(lang);
List<Rate> rates = generalService.getRate();
// 如果不是中文环境先将翻译后的汇率名称转换为中文简体进行处理
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedRateNamesToChinese(rates, languageCode);
}
// 对汇率名称进行多语言转换
translateRateNames(rates, lang);
return Result.success(rates);
} }
//手动同步link商品表 //手动同步link商品表
@PostMapping("/syncLinkProducts") @PostMapping("/syncLinkProducts")
public void syncLinkProducts(){ public void syncLinkProducts(){
generalService.fullSyncProducts(); generalService.fullSyncProducts();
} }
/**
* 转换商品名称为指定语言
*/
private void translateGoodsNames(List<String> 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<String> 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<String> 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<Rate> 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);
}
}
}
}
/**
* 解析语言代码
*/
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 convertTranslatedGoodsNamesToChinese(List<String> goodsNames, String languageCode) {
if (goodsNames != null && !goodsNames.isEmpty()) {
for (int i = 0; i < goodsNames.size(); i++) {
String chineseName = translationService.findChineseSimplifiedByTranslation(
goodsNames.get(i), languageCode);
goodsNames.set(i, chineseName);
}
}
}
/**
* 将翻译后的汇率名称转换为中文简体
*/
private void convertTranslatedRateNamesToChinese(List<Rate> rates, String languageCode) {
if (rates != null && !rates.isEmpty()) {
for (Rate rate : rates) {
if (rate.getRateName() != null && !rate.getRateName().isEmpty()) {
String chineseName = translationService.findChineseSimplifiedByTranslation(
rate.getRateName(), languageCode);
rate.setRateName(chineseName);
}
}
}
}
} }

186
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.BusinessException;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.Util.RedisLockUtil; import com.example.demo.Util.RedisLockUtil;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.DTO.GoldDetailDTO; import com.example.demo.domain.DTO.GoldDetailDTO;
@ -14,7 +15,9 @@ import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.service.coin.GoldDetailService; import com.example.demo.service.coin.GoldDetailService;
import com.example.demo.service.coin.MarketService; import com.example.demo.service.coin.MarketService;
import com.example.demo.service.coin.TranslationService;
import com.example.demo.serviceImpl.coin.AiEmotionServiceImpl; import com.example.demo.serviceImpl.coin.AiEmotionServiceImpl;
import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -48,6 +51,9 @@ public class GoldDetailController {
@Autowired @Autowired
private GoldDetailService goldDetailService; private GoldDetailService goldDetailService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired @Autowired
private RedisLockUtil redisLockUtil; private RedisLockUtil redisLockUtil;
@ -55,21 +61,30 @@ public class GoldDetailController {
private AiEmotionServiceImpl aiEmotionServiceImpl; private AiEmotionServiceImpl aiEmotionServiceImpl;
@Autowired @Autowired
MarketService marketService; MarketService marketService;
@Autowired
private TranslationService translationService;
@Log("获取金币明细") @Log("获取金币明细")
@PostMapping("/getGoldDetail") @PostMapping("/getGoldDetail")
public Result getGoldDetail(@RequestBody Page page) throws Exception {
public Result getGoldDetail(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertGoldDetailTranslatedFieldsToChinese(page.getGoldDetail(), languageCode);
}
// 获取当前请求对象 // 获取当前请求对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token"); String token = request.getHeader("token");
// 解析 token 获取用户信息
// 解析 token 获取用户信息
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets); List<String> markets = marketService.getMarketIds(userMarkets);
// 校验分页参数
// 校验分页参数
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!"); return Result.error("页码数为空!");
} }
@ -77,10 +92,10 @@ public class GoldDetailController {
return Result.error("页大小为空!"); return Result.error("页大小为空!");
} }
// 获取传入的市场列表
// 获取传入的市场列表
List<String> requestedMarkets = page.getGoldDetail() != null ? page.getGoldDetail().getMarkets() : null; List<String> requestedMarkets = page.getGoldDetail() != null ? page.getGoldDetail().getMarkets() : null;
// 权限校验逻辑
// 权限校验逻辑
if (markets.contains("9") || markets.contains("9999")) { if (markets.contains("9") || markets.contains("9999")) {
// 特权市场9 9999跳过权限校验直接放行传入的 markets // 特权市场9 9999跳过权限校验直接放行传入的 markets
// 如果业务需要也可以在这里做空值处理 // 如果业务需要也可以在这里做空值处理
@ -99,13 +114,23 @@ public class GoldDetailController {
// 校验通过保持 requestedMarkets 不变 // 校验通过保持 requestedMarkets 不变
} }
// 返回详情数据
return Result.success(goldDetailService.getGoldDetail(
// 返回详情数据
Result result = Result.success(goldDetailService.getGoldDetail(
page.getPageNum(), page.getPageNum(),
page.getPageSize(), page.getPageSize(),
page.getGoldDetail() page.getGoldDetail()
)); ));
// 对返回结果进行多语言转换
if (result.getCode() == 200 && result.getData() instanceof PageInfo) {
PageInfo<GoldDetail> pageInfo = (PageInfo<GoldDetail>) result.getData();
translateGoldDetails(pageInfo, lang);
}
return result;
} }
@Log("客户金币明细金币合计数统计") @Log("客户金币明细金币合计数统计")
@PostMapping("/getTotal") @PostMapping("/getTotal")
public Result getTotal(@RequestBody Page page) throws Exception { public Result getTotal(@RequestBody Page page) throws Exception {
@ -183,17 +208,25 @@ public class GoldDetailController {
} }
@Log("获取客户金币余额记录") @Log("获取客户金币余额记录")
@PostMapping("/getGold") @PostMapping("/getGold")
public Result getGold(@RequestBody Page page) throws Exception {
// 获取当前请求对象
public Result getGold(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertUserTranslatedFieldsToChinese(page.getUser(), languageCode);
}
// 获取当前请求对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token"); String token = request.getHeader("token");
// 解析 token 获取用户信息
// 解析 token 获取用户信息
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets); List<String> markets = marketService.getMarketIds(userMarkets);
// 校验分页参数
// 校验分页参数
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!"); return Result.error("页码数为空!");
} }
@ -201,10 +234,10 @@ public class GoldDetailController {
return Result.error("页大小为空!"); return Result.error("页大小为空!");
} }
// 获取传入的市场列表
// 获取传入的市场列表
List<String> requestedMarkets = page.getUser() != null ? page.getUser().getMarkets() : null; List<String> requestedMarkets = page.getUser() != null ? page.getUser().getMarkets() : null;
// 权限校验逻辑
// 权限校验逻辑
if (markets.contains("9") || markets.contains("9999")) { if (markets.contains("9") || markets.contains("9999")) {
// 特权市场9 9999跳过权限校验直接放行传入的 markets // 特权市场9 9999跳过权限校验直接放行传入的 markets
// 如果业务需要也可以在这里做空值处理 // 如果业务需要也可以在这里做空值处理
@ -223,8 +256,18 @@ public class GoldDetailController {
// 校验通过保持 requestedMarkets 不变 // 校验通过保持 requestedMarkets 不变
} }
return Result.success(goldDetailService.getGold(page.getPageNum(), page.getPageSize(), page.getUser()));
Result result = Result.success(goldDetailService.getGold(page.getPageNum(), page.getPageSize(), page.getUser()));
// 对返回结果进行多语言转换
if (result.getCode() == 200 && result.getData() instanceof PageInfo) {
PageInfo<User> pageInfo = (PageInfo<User>) result.getData();
translateUsers(pageInfo, lang);
}
return result;
} }
@PostMapping("/export") @PostMapping("/export")
public Result export(@Valid @RequestBody GoldDetailDTO dto) { public Result export(@Valid @RequestBody GoldDetailDTO dto) {
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key可按用户/业务区分 String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key可按用户/业务区分
@ -292,4 +335,117 @@ public class GoldDetailController {
public Result updateConsumeNum() { public Result updateConsumeNum() {
return goldDetailService.updateConsumeNum(); return goldDetailService.updateConsumeNum();
} }
/**
* 转换金币明细信息的多语言字段
*/
private void translateGoldDetails(PageInfo<GoldDetail> 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 "未知类型";
}
}
/**
* 转换用户信息的多语言字段
*/
private void translateUsers(PageInfo<User> pageInfo, String lang) {
if (pageInfo != null && pageInfo.getList() != null) {
for (User user : pageInfo.getList()) {
// 翻译市场名称
if (user.getMarket() != null) {
user.setMarket(languageTranslationUtil.translate(user.getMarket(), lang));
}
}
}
}
/**
* 解析语言代码
*/
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 convertGoldDetailTranslatedFieldsToChinese(GoldDetail goldDetail, String languageCode) {
if (goldDetail != null) {
// 转换市场名称
if (goldDetail.getMarket() != null && !goldDetail.getMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
goldDetail.getMarket(), languageCode);
goldDetail.setMarket(chineseMarket);
}
// 转换商品名称
if (goldDetail.getGoodsName() != null && !goldDetail.getGoodsName().isEmpty()) {
String chineseGoodsName = translationService.findChineseSimplifiedByTranslation(
goldDetail.getGoodsName(), languageCode);
goldDetail.setGoodsName(chineseGoodsName);
}
// 转换支付平台
if (goldDetail.getPayPlatform() != null && !goldDetail.getPayPlatform().isEmpty()) {
String chinesePayPlatform = translationService.findChineseSimplifiedByTranslation(
goldDetail.getPayPlatform(), languageCode);
goldDetail.setPayPlatform(chinesePayPlatform);
}
}
}
/**
* 将用户查询条件中的翻译字段转换为中文简体
*/
private void convertUserTranslatedFieldsToChinese(User user, String languageCode) {
if (user != null) {
// 转换市场名称
if (user.getMarket() != null && !user.getMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
user.getMarket(), languageCode);
user.setMarket(chineseMarket);
}
}
}
} }

4
src/main/java/com/example/demo/controller/coin/HistoryRecordController.java

@ -62,7 +62,7 @@ public class HistoryRecordController {
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error("请检查筛选数据的格式");
return Result.error(e.getMessage());
} }
} }
//获取新的历史记录 //获取新的历史记录
@ -87,7 +87,7 @@ public class HistoryRecordController {
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error("请检查筛选数据的格式");
return Result.error(e.getMessage());
} }
} }
} }

96
src/main/java/com/example/demo/controller/coin/MarketController.java

@ -1,14 +1,17 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.config.interfac.Log; 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.domain.vo.coin.Result;
import com.example.demo.service.coin.MarketService; import com.example.demo.service.coin.MarketService;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.service.coin.TranslationService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; 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 @RestController
@RequestMapping("/market") @RequestMapping("/market")
@ -19,10 +22,89 @@ public class MarketController {
@Autowired @Autowired
private MarketService marketService; private MarketService marketService;
// @Log("获取市场")
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private TranslationService translationService;
// @Log("获取市场")
@RequestMapping("/selectMarket") @RequestMapping("/selectMarket")
public Result selectMarket()
{
return Result.success(marketService.selectMarket());
public Result selectMarket(@RequestHeader(defaultValue = "zh_CN") String lang) {
try {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
List<Market> markets = marketService.selectMarket();
// 如果不是中文环境先将翻译后的市场名称转换为中文简体进行处理
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedMarketNamesToChinese(markets, languageCode);
}
// 对市场名称进行多语言转换
translateMarketNames(markets, lang);
return Result.success(markets);
} catch (Exception e) {
log.error("获取市场列表失败", e);
return Result.error("获取市场列表失败");
}
} }
/**
* 递归转换市场名称为指定语言
*/
private void translateMarketNames(List<Market> 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);
}
}
}
}
/**
* 解析语言代码
*/
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 convertTranslatedMarketNamesToChinese(List<Market> markets, String languageCode) {
if (markets != null) {
for (Market market : markets) {
if (market.getName() != null && !market.getName().isEmpty()) {
String chineseName = translationService.findChineseSimplifiedByTranslation(
market.getName(), languageCode);
market.setName(chineseName);
}
// 递归处理子市场
if (market.getChildren() != null && !market.getChildren().isEmpty()) {
convertTranslatedMarketNamesToChinese(market.getChildren(), languageCode);
}
}
}
}
} }

80
src/main/java/com/example/demo/controller/coin/MenuController.java

@ -5,6 +5,8 @@ import com.example.demo.domain.vo.coin.MenuVo;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.domain.vo.coin.RoleVo; import com.example.demo.domain.vo.coin.RoleVo;
import com.example.demo.service.coin.MenuService; import com.example.demo.service.coin.MenuService;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.service.coin.TranslationService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -31,14 +33,31 @@ public class MenuController {
@Autowired @Autowired
private MenuService menuService; private MenuService menuService;
//获取权限树
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private TranslationService translationService;
//获取权限树
// @Log("获取权限树") // @Log("获取权限树")
@PostMapping("/tree") @PostMapping("/tree")
public Result getPermissionTree(@RequestBody RoleVo roleVo) {
public Result getPermissionTree(@RequestBody RoleVo roleVo, @RequestHeader(defaultValue = "zh_CN") String lang) {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
List<MenuVo> permissionTree = menuService.getPermissionTree(roleVo.getId()); List<MenuVo> permissionTree = menuService.getPermissionTree(roleVo.getId());
// 如果不是中文环境先将翻译后的菜单名称转换为中文简体进行处理
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedMenuNamesToChinese(permissionTree, languageCode);
}
// 对菜单名称进行多语言转换
translateMenuNames(permissionTree, lang);
return Result.success(permissionTree); return Result.success(permissionTree);
} }
//新增权限 //新增权限
@Log("新增权限") @Log("新增权限")
@PostMapping("/add") @PostMapping("/add")
@ -52,4 +71,61 @@ public class MenuController {
public Result updatePermission(@RequestBody RoleVo roleVo) { public Result updatePermission(@RequestBody RoleVo roleVo) {
return menuService.updatePermission(roleVo); return menuService.updatePermission(roleVo);
} }
/**
* 递归转换菜单名称为指定语言
*/
private void translateMenuNames(List<MenuVo> 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);
}
}
}
}
/**
* 解析语言代码
*/
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 convertTranslatedMenuNamesToChinese(List<MenuVo> menus, String languageCode) {
if (menus != null) {
for (MenuVo menu : menus) {
if (menu.getMenuName() != null && !menu.getMenuName().isEmpty()) {
String chineseName = translationService.findChineseSimplifiedByTranslation(
menu.getMenuName(), languageCode);
menu.setMenuName(chineseName);
}
// 递归处理子菜单
if (menu.getChildren() != null && !menu.getChildren().isEmpty()) {
convertTranslatedMenuNamesToChinese(menu.getChildren(), languageCode);
}
}
}
}
} }

56
src/main/java/com/example/demo/controller/coin/RateController.java

@ -1,6 +1,6 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.Rate; import com.example.demo.domain.entity.Rate;
import com.example.demo.domain.vo.coin.Page; import com.example.demo.domain.vo.coin.Page;
@ -17,7 +17,6 @@ import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@RestController @RestController
@RequestMapping("/rate") @RequestMapping("/rate")
@RequiredArgsConstructor @RequiredArgsConstructor
@ -28,17 +27,28 @@ public class RateController {
@Autowired @Autowired
private RateService rateService; private RateService rateService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
//货币汇率列表 //货币汇率列表
@Log("获取汇率列表") @Log("获取汇率列表")
@PostMapping("/selectAll") @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())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!"); return Result.error("页码数为空!");
} }
if (ObjectUtils.isEmpty(page.getPageSize())) { if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!"); return Result.error("页大小为空!");
} else { } 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<com.example.demo.domain.vo.coin.RateDetail> pageInfo =
(com.github.pagehelper.PageInfo<com.example.demo.domain.vo.coin.RateDetail>) result.getData();
translateRateDetails(pageInfo, lang);
}
return result;
} }
} }
@ -71,17 +81,47 @@ public class RateController {
if (rate.getNum() == null || rate.getNum().equals(BigDecimal.ZERO)) { if (rate.getNum() == null || rate.getNum().equals(BigDecimal.ZERO)) {
return Result.error("汇率数值存在异常"); return Result.error("汇率数值存在异常");
}else }else
return Result.success("编辑成功");
return Result.success("编辑成功");
} }
//查询货币名称列表 //查询货币名称列表
@PostMapping("/listRateName") @PostMapping("/listRateName")
public Result listRateName(){
public Result listRateName(@RequestHeader(defaultValue = "zh_CN") String lang){
try { try {
List<Rate> rate= rateService.listRateName();
return Result.success(rate);
List<Rate> rates = rateService.listRateName();
// 对返回结果进行多语言转换
translateRates(rates, lang);
return Result.success(rates);
} catch (Exception e) { } catch (Exception e) {
return Result.error("获取货币列表失败"); return Result.error("获取货币列表失败");
} }
} }
/**
* 转换汇率详情列表的多语言字段
*/
private void translateRateDetails(com.github.pagehelper.PageInfo<com.example.demo.domain.vo.coin.RateDetail> 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<Rate> 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);
}
}
}
}
} }

158
src/main/java/com/example/demo/controller/coin/RechargeController.java

@ -1,10 +1,13 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.coin.*; import com.example.demo.domain.vo.coin.*;
import com.example.demo.service.coin.RechargeService; import com.example.demo.service.coin.RechargeService;
import com.example.demo.service.coin.TranslationService;
import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -38,10 +41,15 @@ public class RechargeController {
@Autowired @Autowired
private RechargeService rechargeService; private RechargeService rechargeService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private TranslationService translationService;
//充值明细 //充值明细
@Log("获取全部充值明细") @Log("获取全部充值明细")
@PostMapping("/selectAll") @PostMapping("/selectAll")
public Result selcetAll(@RequestBody Page page) {
public Result selectAll(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) {
try { try {
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!"); return Result.error("页码数为空!");
@ -49,6 +57,14 @@ public class RechargeController {
if (ObjectUtils.isEmpty(page.getPageSize())) { if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!"); return Result.error("页大小为空!");
} else { } else {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRechargeTranslatedFieldsToChinese(page.getRechargeUser(), languageCode);
}
//解token权限 //解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token"); String token = request.getHeader("token");
@ -60,20 +76,23 @@ public class RechargeController {
else{ else{
return Result.error("角色为空"); 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<RechargeUser> pageInfo = (PageInfo<RechargeUser>) result.getData();
translateRechargeUsers(pageInfo, lang);
}
return result;
} }
} catch (Exception e) { } catch (Exception e) {
return Result.error(e.getMessage()); return Result.error(e.getMessage());
} }
} }
//充值明细筛选 //充值明细筛选
@Log("充值明细筛选") @Log("充值明细筛选")
@PostMapping("/selectBy") @PostMapping("/selectBy")
public Result selcetBy(@RequestBody Page page) {
public Result selectBy(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) {
try { try {
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!"); return Result.error("页码数为空!");
@ -81,6 +100,14 @@ public class RechargeController {
if (ObjectUtils.isEmpty(page.getPageSize())) { if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!"); return Result.error("页大小为空!");
} else { } else {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRechargeTranslatedFieldsToChinese(page.getRechargeUser(), languageCode);
}
//解token权限 //解token权限
if(page.getRechargeUser().getMarkets()==null||page.getRechargeUser().getMarkets().isEmpty()){ if(page.getRechargeUser().getMarkets()==null||page.getRechargeUser().getMarkets().isEmpty()){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
@ -91,11 +118,17 @@ public class RechargeController {
page.getRechargeUser().setMarkets(markets); 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<RechargeUser> pageInfo = (PageInfo<RechargeUser>) result.getData();
translateRechargeUsers(pageInfo, lang);
}
return result;
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error("请检查筛选数据的格式");
return Result.error(e.getMessage());
} }
} }
@ -116,7 +149,7 @@ public class RechargeController {
Gold gold = rechargeService.statsGold(rechargeUser); Gold gold = rechargeService.statsGold(rechargeUser);
return Result.success(gold); return Result.success(gold);
} catch (Exception e) { } catch (Exception e) {
return Result.error("请检查数据的格式");
return Result.error(e.getMessage());
} }
} }
@ -127,12 +160,12 @@ public class RechargeController {
try { try {
return rechargeService.add(rechargeUser); return rechargeService.add(rechargeUser);
} catch (Exception e) { } catch (Exception e) {
return Result.error("请检查数据的格式");
return Result.error(e.getMessage());
} }
} }
public Result selcet(@RequestBody Page page) {
public Result select(@RequestBody Page page) {
try { try {
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!"); return Result.error("页码数为空!");
@ -144,9 +177,110 @@ public class RechargeController {
return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser())); return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser()));
} }
} catch (Exception e) { } catch (Exception e) {
return Result.error("请检查筛选数据的格式");
return Result.error(e.getMessage());
}
}
/**
* 转换充值用户信息的多语言字段
*/
private void translateRechargeUsers(PageInfo<RechargeUser> 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));
}
}
} }
}
/**
* 解析语言代码
*/
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);
}
}
} }
} }

265
src/main/java/com/example/demo/controller/coin/RefundController.java

@ -1,9 +1,12 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.service.coin.RefundService; import com.example.demo.service.coin.RefundService;
import com.example.demo.service.coin.TranslationService;
import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -36,16 +39,34 @@ public class RefundController {
@Autowired @Autowired
private RefundService refundService; private RefundService refundService;
// 注入 TranslationService
@Autowired
private TranslationService translationService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
//退款明细 //退款明细
@Log("获取全部退款明细") @Log("获取全部退款明细")
@PostMapping("/selectAll") @PostMapping("/selectAll")
public Result selcetAll(@RequestBody Page page) {
public Result selectAll(@RequestBody Page page, @RequestHeader(defaultValue = "zh") String lang) {
try { try {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(page.getRefundUser(), languageCode);
}
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
String errorMsg = languageTranslationUtil.translate("页码数为空!", lang);
return Result.error(errorMsg);
} }
if (ObjectUtils.isEmpty(page.getPageSize())) { if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
String errorMsg = languageTranslationUtil.translate("页大小为空!", lang);
return Result.error(errorMsg);
} else { } else {
//解token权限 //解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
@ -55,12 +76,22 @@ public class RefundController {
List<String> list = Arrays.asList(admin.getMarkets().split(",")); List<String> list = Arrays.asList(admin.getMarkets().split(","));
page.getRefundUser().setMarkets(list); page.getRefundUser().setMarkets(list);
} else { } else {
return Result.error("角色为空");
String errorMsg = languageTranslationUtil.translate("角色为空", lang);
return Result.error(errorMsg);
}
Result result = Result.success(refundService.selectAll(page.getPageNum(), page.getPageSize(), page.getRefundUser()));
// 对返回结果进行多语言转换
if (result.getCode() == 200 && result.getData() instanceof PageInfo) {
PageInfo<RefundUser> pageInfo = (PageInfo<RefundUser>) result.getData();
translateRefundUsers(pageInfo, lang);
} }
return Result.success(refundService.selectAll(page.getPageNum(), page.getPageSize(), page.getRefundUser()));
return result;
} }
} catch (Exception e) { } catch (Exception e) {
return Result.error("请检查筛选数据的格式");
String errorMsg = languageTranslationUtil.translate("请检查筛选数据的格式", lang);
return Result.error(errorMsg);
} }
} }
@ -68,13 +99,23 @@ public class RefundController {
//退款筛选 //退款筛选
@Log("退款明细筛选") @Log("退款明细筛选")
@PostMapping("/selectBy") @PostMapping("/selectBy")
public Result selcetBy(@RequestBody Page page) {
public Result selectBy(@RequestBody Page page, @RequestHeader(defaultValue = "zh") String lang) {
try { try {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(page.getRefundUser(), languageCode);
}
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
String errorMsg = languageTranslationUtil.translate("页码数为空!", lang);
return Result.error(errorMsg);
} }
if (ObjectUtils.isEmpty(page.getPageSize())) { if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
String errorMsg = languageTranslationUtil.translate("页大小为空!", lang);
return Result.error(errorMsg);
} else { } else {
//解token权限 //解token权限
if(page.getRefundUser().getMarkets()==null||page.getRefundUser().getMarkets().isEmpty()) { if(page.getRefundUser().getMarkets()==null||page.getRefundUser().getMarkets().isEmpty()) {
@ -84,10 +125,17 @@ public class RefundController {
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
page.getRefundUser().setMarkets(markets); 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<RefundUser> pageInfo = (PageInfo<RefundUser>) result.getData();
translateRefundUsers(pageInfo, lang);
}
return result;
} }
} catch (Exception e) { } catch (Exception e) {
return Result.error("请检查筛选数据的格式");
String errorMsg = languageTranslationUtil.translate("请检查筛选数据的格式", lang);
return Result.error(errorMsg);
} }
} }
@ -95,8 +143,16 @@ public class RefundController {
//退款金币统计 //退款金币统计
@Log("退款金币合计数统计") @Log("退款金币合计数统计")
@PostMapping("/statsGold") @PostMapping("/statsGold")
public Result statsGold(@RequestBody RefundUser refundUser) {
public Result statsGold(@RequestBody RefundUser refundUser, @RequestHeader(defaultValue = "zh") String lang) {
try { try {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(refundUser, languageCode);
}
//解token权限 //解token权限
if(refundUser.getMarkets()==null||refundUser.getMarkets().isEmpty()) { if(refundUser.getMarkets()==null||refundUser.getMarkets().isEmpty()) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
@ -108,52 +164,211 @@ public class RefundController {
Gold gold = refundService.statsGold(refundUser); Gold gold = refundService.statsGold(refundUser);
return Result.success(gold); return Result.success(gold);
} catch (Exception e) { } catch (Exception e) {
return Result.error("请检查数据的格式");
String errorMsg = languageTranslationUtil.translate("请检查数据的格式", lang);
return Result.error(errorMsg);
} }
} }
//获取退款类型 //获取退款类型
@Log("获取退款类型") @Log("获取退款类型")
@PostMapping("/refundType") @PostMapping("/refundType")
public Result getRefundType() {
List<String> list = refundService.getRefundType();
public Result getRefundType(@RequestHeader(defaultValue = "zh") String lang) {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
List<String> list = refundService.getRefundType(lang);
// 如果不是中文环境先将翻译后的退款类型转换为中文简体进行处理
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedRefundTypesToChinese(list, languageCode);
}
// 对退款类型进行多语言转换
translateRefundTypes(list, lang);
return Result.success(list); return Result.success(list);
} }
//筛选产品 //筛选产品
// @Log("筛选商品") // @Log("筛选商品")
@PostMapping("/selectGoods") @PostMapping("/selectGoods")
public Result getSelectGoods(@RequestBody RefundUser refundUser) {
List<RefundUser> list = refundService.selectGoods(refundUser);
public Result getSelectGoods(@RequestBody RefundUser refundUser, @RequestHeader(defaultValue = "zh") String lang) {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(refundUser, languageCode);
}
List<RefundUser> list = refundService.selectGoods(refundUser, lang);
return Result.success(list); return Result.success(list);
} }
//消耗金币退款 //消耗金币退款
@Log("新增金币退款") @Log("新增金币退款")
@PostMapping("/add") @PostMapping("/add")
public Result add(@RequestBody RefundUser refundUser) {
public Result add(@RequestBody RefundUser refundUser, @RequestHeader(defaultValue = "zh") String lang) {
try { try {
return refundService.add(refundUser);
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(refundUser, languageCode);
}
return refundService.add(refundUser, lang);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error(e.getMessage());
String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
return Result.error(errorMsg);
} }
} }
public Result selcet(@RequestBody Page page) {
public Result select(@RequestBody Page page, @RequestHeader(defaultValue = "zh") String lang) {
try { try {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(page.getRefundUser(), languageCode);
}
if (ObjectUtils.isEmpty(page.getPageNum())) { if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
String errorMsg = languageTranslationUtil.translate("页码数为空!", lang);
return Result.error(errorMsg);
} }
if (ObjectUtils.isEmpty(page.getPageSize())) { if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
String errorMsg = languageTranslationUtil.translate("页大小为空!", lang);
return Result.error(errorMsg);
} else { } else {
Result result = Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser()));
// 对返回结果进行多语言转换
if (result.getCode() == 200 && result.getData() instanceof PageInfo) {
PageInfo<RefundUser> pageInfo = (PageInfo<RefundUser>) result.getData();
translateRefundUsers(pageInfo, lang);
}
return Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser()));
return result;
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error("请检查筛选数据的格式");
String errorMsg = languageTranslationUtil.translate("请检查筛选数据的格式", lang);
return Result.error(errorMsg);
} }
} }
/**
* 解析语言代码
*/
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 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);
}
}
}
/**
* 将翻译后的退款类型转换为中文简体
*/
private void convertTranslatedRefundTypesToChinese(List<String> refundTypes, String languageCode) {
if (refundTypes != null && !refundTypes.isEmpty()) {
for (int i = 0; i < refundTypes.size(); i++) {
String chineseType = translationService.findChineseSimplifiedByTranslation(
refundTypes.get(i), languageCode);
refundTypes.set(i, chineseType);
}
}
}
/**
* 转换退款用户信息的多语言字段
*/
private void translateRefundUsers(PageInfo<RefundUser> 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<String> 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 "未知退款方式";
}
}
} }

2
src/main/java/com/example/demo/controller/coin/RoleController.java

@ -111,7 +111,7 @@ public class RoleController {
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error("请检查筛选数据的格式");
return Result.error(e.getMessage());
} }
} }

153
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<Translation> 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<Translation> pageInfo = new PageInfo<>(translations);
// 构造返回数据
Map<String, Object> 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("删除翻译记录失败");
}
}
}

73
src/main/java/com/example/demo/controller/coin/UserController.java

@ -5,6 +5,8 @@ import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.coin.GoldUser; import com.example.demo.domain.vo.coin.GoldUser;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.service.coin.UserService; import com.example.demo.service.coin.UserService;
import com.example.demo.service.coin.TranslationService;
import com.example.demo.Util.LanguageTranslationUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -29,12 +31,34 @@ public class UserController {
@Autowired @Autowired
private UserService userService; private UserService userService;
// 注入 TranslationService
@Autowired
private TranslationService translationService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
//查找用户 //查找用户
@Log("查找客户") @Log("查找客户")
@PostMapping("/selectUser") @PostMapping("/selectUser")
public Result selectUser(@RequestBody GoldUser user) {
public Result selectUser(@RequestBody GoldUser user, @RequestHeader(defaultValue = "zh_CN") String lang) {
try { try {
return userService.selectUser(user.getJwcode().toString());
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(user, languageCode);
}
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) { } catch (Exception e) {
return Result.error("请检查输入精网号"); return Result.error("请检查输入精网号");
} }
@ -83,4 +107,49 @@ public class UserController {
return Result.error("更新失败"); return Result.error("更新失败");
} }
} }
/**
* 解析语言代码
*/
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 convertTranslatedFieldsToChinese(GoldUser user, String languageCode) {
if (user != null) {
// 转换市场名称
if (user.getMarket() != null && !user.getMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
user.getMarket(), languageCode);
user.setMarket(chineseMarket);
}
}
}
/**
* 转换用户信息的多语言字段
*/
private void translateGoldUser(GoldUser goldUser, String lang) {
if (goldUser != null) {
// 翻译市场名称
if (goldUser.getMarket() != null) {
goldUser.setMarket(languageTranslationUtil.translate(goldUser.getMarket(), lang));
}
}
}
} }

201
src/main/java/com/example/demo/controller/coin/WorkbenchController.java

@ -1,6 +1,7 @@
package com.example.demo.controller.coin; package com.example.demo.controller.coin;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.config.interfac.Log; import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.coin.WorkbenchCard; import com.example.demo.domain.vo.coin.WorkbenchCard;
@ -9,6 +10,7 @@ import com.example.demo.mapper.coin.StatisticsMapper;
import com.example.demo.service.coin.GeneralService; import com.example.demo.service.coin.GeneralService;
import com.example.demo.service.coin.StatisticsService; import com.example.demo.service.coin.StatisticsService;
import com.example.demo.service.coin.WorkbenchService; import com.example.demo.service.coin.WorkbenchService;
import com.example.demo.service.coin.TranslationService;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -21,15 +23,6 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.List; import java.util.List;
/**
* @program: gold-java
* @ClassName WorkbenchController
* @description: 工作台相关
* @author: Ethan
* @create: 202506-17 17:13
* @Version 1.0
**/
@RestController @RestController
@RequestMapping("/workbench") @RequestMapping("/workbench")
@RequiredArgsConstructor @RequiredArgsConstructor
@ -38,7 +31,7 @@ import java.util.List;
public class WorkbenchController { public class WorkbenchController {
@Autowired @Autowired
private WorkbenchService workbenchService;
private WorkbenchService workbenchService;
@Autowired @Autowired
private StatisticsService statisticsService; private StatisticsService statisticsService;
@Autowired @Autowired
@ -46,63 +39,207 @@ public class WorkbenchController {
@Autowired @Autowired
private StatisticsMapper statisticsMapper; private StatisticsMapper statisticsMapper;
/*
获取各地区工作台卡片的数据
// 注入 TranslationService
@Autowired
private TranslationService translationService;
// 注入多语言转换工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
/**
获取各地区工作台卡片的数据
*/ */
@Log("获取工作台卡片数据") @Log("获取工作台卡片数据")
@PostMapping("/getCard") @PostMapping("/getCard")
public ResponseEntity<WorkbenchCard> 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<WorkbenchCard> card1(@RequestBody WorkbenchCard workbench,
@RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(workbench, languageCode);
}
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<String> markets = workbenchService.getAdminMarket(account); List<String> markets = workbenchService.getAdminMarket(account);
WorkbenchCard result; WorkbenchCard result;
//判断是否是总部 //判断是否是总部
if (markets != null && markets.contains("总部")||markets.contains("研发部")) {
if (markets != null && (markets.contains("总部") || markets.contains("研发部"))) {
result = workbenchService.getCardCache(markets);//走缓存拿全部市场的缓存数据 result = workbenchService.getCardCache(markets);//走缓存拿全部市场的缓存数据
} else { } else {
result = workbenchService.getCard(markets);//不走缓存计算卡片属性 result = workbenchService.getCard(markets);//不走缓存计算卡片属性
} }
// 对结果进行多语言转换
translateWorkbenchCard(result, lang);
return ResponseEntity.ok(result); return ResponseEntity.ok(result);
} }
/*
获取各地区工作台图表的数据
/**
获取各地区工作台图表的数据
*/ */
@Log("获取工作台图表数据") @Log("获取工作台图表数据")
@PostMapping("/getGraph") @PostMapping("/getGraph")
public ResponseEntity<WorkbenchCard> graph1(@RequestBody WorkbenchCard workbench, @AuthenticationPrincipal Admin admin) {
public ResponseEntity<WorkbenchCard> graph1(@RequestBody WorkbenchCard workbench,
@AuthenticationPrincipal Admin admin,
@RequestHeader(defaultValue = "zh_CN") String lang) {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(workbench, languageCode);
}
String account = admin.getAccount(); String account = admin.getAccount();
List<String> markets = workbenchService.getAdminMarket(account); List<String> 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<List<WorkbenchRevenue>> getTotalRevenue(@RequestBody WorkbenchCard workbench,
@AuthenticationPrincipal Admin admin,
@RequestHeader(defaultValue = "zh_CN") String lang) {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(workbench, languageCode);
}
String account = admin.getAccount();
List<String> markets = workbenchService.getRevenueMarket(account);
workbench.setMarkets(markets); workbench.setMarkets(markets);
WorkbenchCard result =workbenchService.getGraph(workbench.getStartDate(),workbench.getEndDate(),workbench.getMarkets());
List<WorkbenchRevenue> result = workbenchService.getTotalRevenue(workbench.getStartDate(), workbench.getEndDate(), workbench.getMarkets());
// 对结果进行多语言转换
translateWorkbenchRevenue(result, lang);
return ResponseEntity.ok(result); return ResponseEntity.ok(result);
} }
//单个地区工作台图表 //单个地区工作台图表
@Log("获取单个地区工作台图表数据") @Log("获取单个地区工作台图表数据")
@PostMapping("/getSingleGraph") @PostMapping("/getSingleGraph")
public ResponseEntity<WorkbenchCard> singleGraph1(@RequestBody WorkbenchCard workbench, @AuthenticationPrincipal Admin admin) {
public ResponseEntity<WorkbenchCard> singleGraph1(@RequestBody WorkbenchCard workbench,
@AuthenticationPrincipal Admin admin,
@RequestHeader(defaultValue = "zh_CN") String lang) {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(workbench, languageCode);
}
String account = admin.getAccount(); String account = admin.getAccount();
List<String> markets = workbenchService.getAdminMarket(account); List<String> markets = workbenchService.getAdminMarket(account);
workbench.setMarkets(markets); 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); return ResponseEntity.ok(result);
} }
//总营收
@PostMapping("/getTotalRevenue")
public ResponseEntity<List<WorkbenchRevenue>> getTotalRevenue(@RequestBody WorkbenchCard workbench, @AuthenticationPrincipal Admin admin) {
String account = admin.getAccount();
List<String> markets = workbenchService.getRevenueMarket(account);
workbench.setMarkets(markets);
List<WorkbenchRevenue> result =workbenchService.getTotalRevenue(workbench.getStartDate(),workbench.getEndDate(),workbench.getMarkets());
return ResponseEntity.ok(result);
/**
* 解析语言代码
*/
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 convertTranslatedFieldsToChinese(WorkbenchCard workbenchCard, String languageCode) {
if (workbenchCard != null) {
// 转换市场列表中的市场名称
if (workbenchCard.getMarkets() != null) {
for (int i = 0; i < workbenchCard.getMarkets().size(); i++) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
workbenchCard.getMarkets().get(i), languageCode);
workbenchCard.getMarkets().set(i, chineseMarket);
}
}
}
} }
/**
* 转换工作台卡片的多语言字段
*/
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<WorkbenchRevenue> revenueList, String lang) {
if (revenueList != null) {
for (WorkbenchRevenue revenue : revenueList) {
if (revenue.getMarket() != null) {
String translatedMarket = languageTranslationUtil.translate(revenue.getMarket(), lang);
revenue.setMarket(translatedMarket);
}
}
}
}
} }

11
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"
}

3
src/main/java/com/example/demo/domain/entity/CashRecord.java

@ -36,9 +36,10 @@ public class CashRecord implements Serializable {
private String bankCode; // 银行流水订单号 private String bankCode; // 银行流水订单号
private String goodsName; // 商品名称 private String goodsName; // 商品名称
private Integer goodNum; // 产品数量 private Integer goodNum; // 产品数量
private String NumUnit; // 数量单位 //
private String numUnit; // 数量单位 //
private Integer permanentGold; // 永久金币数量 private Integer permanentGold; // 永久金币数量
private Integer freeGold; // 免费金币数量 private Integer freeGold; // 免费金币数量
private String payload; //平台
// 金额信息 // 金额信息
private String paymentCurrency; // 付款币种 private String paymentCurrency; // 付款币种

2
src/main/java/com/example/demo/domain/entity/GOrder.java

@ -33,4 +33,6 @@ public class GOrder {
private Integer addTime; // 创建时间 private Integer addTime; // 创建时间
private Integer updTime; // 更新时间 private Integer updTime; // 更新时间
private Integer isSynced; // 0未同步 1已同步 private Integer isSynced; // 0未同步 1已同步
private String firstdataIpgTransactionId; // FirstData订单号
} }

25
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; // 更新时间
}

1
src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java

@ -59,6 +59,7 @@ public class ConsumeUser implements Serializable {
private String adminName; //提交人姓名 private String adminName; //提交人姓名
@ExcelProperty(value = "是否退款", converter = RefundConverter.class) @ExcelProperty(value = "是否退款", converter = RefundConverter.class)
private Integer isRefund; //是否退款 private Integer isRefund; //是否退款
private String isRefundDesc; // 退款状态描述用于多语言翻译
@ExcelProperty("消耗时间") @ExcelProperty("消耗时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 消费时间 private Date createTime; // 消费时间

4
src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java

@ -34,8 +34,10 @@ public class GoldDetail {
private String market; // 所属地区 private String market; // 所属地区
@ExcelProperty("平台信息") @ExcelProperty("平台信息")
private String payPlatform; // 支付平台 private String payPlatform; // 支付平台
@ExcelProperty("更新类型")
@ExcelIgnore
private Integer type; // 类型 private Integer type; // 类型
@ExcelProperty("更新类型")
private String typeDesc; // 类型描述用于多语言翻译
@ExcelProperty("金币数量") @ExcelProperty("金币数量")
private BigDecimal sumGold; // 总金币 private BigDecimal sumGold; // 总金币
@ExcelProperty("永久金币") @ExcelProperty("永久金币")

1
src/main/java/com/example/demo/domain/vo/coin/RefundAudit.java

@ -30,6 +30,7 @@ public class RefundAudit {
private String market; // 所属地区 private String market; // 所属地区
private List<String> markets; // 所属地区 private List<String> markets; // 所属地区
private Integer refundModel; // 退款方式-全额 部分 private Integer refundModel; // 退款方式-全额 部分
private String refundModelDesc; // 退款方式描述用于多语言翻译
private String goodsName; // 商品名称 private String goodsName; // 商品名称
private Integer rateId; // 汇率ID private Integer rateId; // 汇率ID

4
src/main/java/com/example/demo/domain/vo/coin/RefundUser.java

@ -39,8 +39,10 @@ public class RefundUser {
private String goodsName; // 商品名称 private String goodsName; // 商品名称
@ExcelProperty("退款类型") @ExcelProperty("退款类型")
private String refundType; // 退款类型 private String refundType; // 退款类型
@ExcelProperty("退款方式")
@ExcelIgnore
private Byte refundModel; // 退款方式0全部/1部分退款 private Byte refundModel; // 退款方式0全部/1部分退款
@ExcelProperty("退款方式")
private String refundModelDesc; // 退款方式描述用于多语言翻译
@ExcelProperty("退款金币总数") @ExcelProperty("退款金币总数")
private BigDecimal sumGold; // 金币总数 private BigDecimal sumGold; // 金币总数
@ExcelProperty("永久金币") @ExcelProperty("永久金币")

48
src/main/java/com/example/demo/mapper/coin/TranslationMapper.java

@ -0,0 +1,48 @@
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<Translation> findAll();
// 插入新的翻译记录
int insert(Translation translation);
// 更新翻译记录
int update(Translation translation);
// 删除翻译记录
int deleteById(Integer id);
// 根据部分中文简体内容模糊查询翻译记录
List<Translation> findByChineseSimplifiedLike(@Param("chineseSimplified") String chineseSimplified);
// 根据中文简体内容精确查询翻译记录
Translation findByChineseSimplified(@Param("chineseSimplified") String chineseSimplified);
// 根据语言和翻译状态查询翻译记录
List<Translation> findByLanguageAndTranslationStatus(
@Param("languageColumn") String languageColumn,
@Param("isTranslated") boolean isTranslated
);
List<Translation> findByChineseSimplifiedAndLanguageStatus(
@Param("chineseSimplified") String chineseSimplified,
@Param("languageColumn") String languageColumn,
@Param("isTranslated") boolean isTranslated
);
Translation findById(Integer id);
Translation findByEnglish(String english);
Translation findByThai(String thai);
Translation findByChineseTraditional(String chineseTraditional);
Translation findByMalay(String malay);
Translation findByVietnamese(String vietnamese);
}

5
src/main/java/com/example/demo/service/coin/AdminService.java

@ -20,12 +20,11 @@ public interface AdminService {
String getName(String account); String getName(String account);
//更新密码 //更新密码
Result updatePassword(Password password);
Result updatePassword(Password password, String lang);
//重置密码 //重置密码
Result resetPassword(Password password);
Result resetPassword(Password password, String lang);
//获取当前登录的管理员账号 //获取当前登录的管理员账号
String getCurrentAdminAccount(); String getCurrentAdminAccount();
} }

7
src/main/java/com/example/demo/service/coin/RefundService.java

@ -1,6 +1,5 @@
package com.example.demo.service.coin; package com.example.demo.service.coin;
import com.example.demo.domain.vo.coin.ConsumeUser; import com.example.demo.domain.vo.coin.ConsumeUser;
import com.example.demo.domain.vo.coin.Gold; import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.RefundUser; import com.example.demo.domain.vo.coin.RefundUser;
@ -30,12 +29,12 @@ public interface RefundService {
PageInfo<RefundUser> selectBy(Integer pageNum, Integer pageSize, RefundUser refundUser)throws Exception; PageInfo<RefundUser> selectBy(Integer pageNum, Integer pageSize, RefundUser refundUser)throws Exception;
//添加退款记录 //添加退款记录
Result add(RefundUser refundUser);
Result add(RefundUser refundUser, String lang);
//获取退款类型 //获取退款类型
List<String> getRefundType();
List<String> getRefundType(String lang);
//查找退款商品 //查找退款商品
List<RefundUser> selectGoods(RefundUser refundUser);
List<RefundUser> selectGoods(RefundUser refundUser, String lang);
} }

39
src/main/java/com/example/demo/service/coin/TranslationService.java

@ -0,0 +1,39 @@
package com.example.demo.service.coin;
import com.example.demo.domain.entity.Translation;
import java.util.List;
public interface TranslationService {
// 查询所有翻译记录
List<Translation> findAll();
// 添加新的翻译记录
boolean add(Translation translation);
// 更新翻译记录
boolean update(Translation translation);
// 删除翻译记录
boolean deleteById(Integer id);
// 根据部分中文简体内容模糊查询翻译记录
List<Translation> findByChineseSimplifiedLike(String chineseSimplified);
// 根据中文简体内容精确查询翻译记录
Translation findByChineseSimplified(String chineseSimplified);
// 根据语言和翻译状态查询翻译记录
List<Translation> findByLanguageAndTranslationStatus(String language, boolean isTranslated);
List<Translation> findByChineseSimplifiedAndLanguageStatus(
String chineseSimplified,
String language,
boolean isTranslated
);
Translation findById(Integer id);
// TranslationService.java
String findChineseSimplifiedByTranslation(String translatedText, String language);
}

33
src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java

@ -341,11 +341,32 @@ public User getNameAndMarket(Integer jwcode) {
} }
for (GOrder gOrder : gOrders) { for (GOrder gOrder : gOrders) {
CashRecord cashRecord = new CashRecord(); CashRecord cashRecord = new CashRecord();
//构建基础信息
cashRecord.setOrderType(1); cashRecord.setOrderType(1);
cashRecord.setJwcode(gOrder.getJwcode()); cashRecord.setJwcode(gOrder.getJwcode());
cashRecord.setName(cashCollectionMapper.getNameByJwcode(gOrder.getJwcode()));
String name=cashCollectionMapper.getNameByJwcode(gOrder.getJwcode());
if (name!=null){
cashRecord.setName(name);
}else cashRecord.setName("未知");
cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(gOrder.getJwcode())); cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(gOrder.getJwcode()));
if (gOrder.getType().equals("gold")){ //充金豆
cashRecord.setActivity("Link日常充值"); cashRecord.setActivity("Link日常充值");
cashRecord.setGoodsName("Link充值金豆");
cashRecord.setRemark("Link充值金豆");
cashRecord.setNumUnit("个");
cashRecord.setPermanentGold(0);
cashRecord.setGoodNum(gOrder.getCount());
}
if (gOrder.getType().equals("gold_coin")){//充金币
cashRecord.setActivity("Link日常充值");
cashRecord.setGoodsName("Link充值金币");
cashRecord.setRemark("Link充值金币");
cashRecord.setPermanentGold(gOrder.getCount());
cashRecord.setGoodNum(0);
}
cashRecord.setOrderCode(gOrder.getOrderNo()); cashRecord.setOrderCode(gOrder.getOrderNo());
if (gOrder != null) { if (gOrder != null) {
switch (gOrder.getPayStyle()) { switch (gOrder.getPayStyle()) {
@ -353,37 +374,39 @@ public User getNameAndMarket(Integer jwcode) {
cashRecord.setPayType("IOS内购"); cashRecord.setPayType("IOS内购");
cashRecord.setBankCode(gOrder.getIosTransactionId()); cashRecord.setBankCode(gOrder.getIosTransactionId());
cashRecord.setReceivedMarket("3"); cashRecord.setReceivedMarket("3");
cashRecord.setPayload("IOS");
break; break;
case 5: case 5:
cashRecord.setPayType("Stripe-链接收款"); cashRecord.setPayType("Stripe-链接收款");
cashRecord.setReceivedMarket("13"); cashRecord.setReceivedMarket("13");
cashRecord.setPayload("Stripe");
break; break;
case 6: case 6:
cashRecord.setPayType("PaymentAsia-链接收款"); cashRecord.setPayType("PaymentAsia-链接收款");
cashRecord.setReceivedMarket("13"); cashRecord.setReceivedMarket("13");
cashRecord.setPayload("PaymentAsia");
break; break;
case 7: case 7:
cashRecord.setPayType("Ipay88-链接收款"); cashRecord.setPayType("Ipay88-链接收款");
cashRecord.setReceivedMarket("5"); cashRecord.setReceivedMarket("5");
cashRecord.setPayload("Ipay88");
break; break;
case 9: case 9:
cashRecord.setPayType("FistData"); cashRecord.setPayType("FistData");
cashRecord.setReceivedMarket("4"); cashRecord.setReceivedMarket("4");
cashRecord.setBankCode(gOrder.getFirstdataIpgTransactionId());
cashRecord.setPayload("FistData");
break; break;
default: default:
break; break;
} }
} }
cashRecord.setGoodsName("Link充值金币");
cashRecord.setGoodNum(0);
cashRecord.setPermanentGold(gOrder.getCount());
cashRecord.setFreeGold(0); cashRecord.setFreeGold(0);
cashRecord.setPaymentCurrency(""); cashRecord.setPaymentCurrency("");
cashRecord.setPaymentAmount(BigDecimal.valueOf(0)); cashRecord.setPaymentAmount(BigDecimal.valueOf(0));
cashRecord.setPayTime(LocalDateTime.ofEpochSecond(gOrder.getSuccessTime(), 0, ZoneOffset.UTC)); cashRecord.setPayTime(LocalDateTime.ofEpochSecond(gOrder.getSuccessTime(), 0, ZoneOffset.UTC));
cashRecord.setStatus(3); cashRecord.setStatus(3);
cashRecord.setSubmitterId(99999); cashRecord.setSubmitterId(99999);
cashRecord.setRemark("Link充值金币");
//存入现金库 //存入现金库
cashCollectionMapper.add(cashRecord); cashCollectionMapper.add(cashRecord);
cashCollectionMapper.markSynced(gOrder.getId()); cashCollectionMapper.markSynced(gOrder.getId());

45
src/main/java/com/example/demo/serviceImpl/coin/AdminServiceImpl.java

@ -5,6 +5,7 @@ import com.example.demo.domain.vo.coin.Password;
import com.example.demo.domain.vo.coin.Result; import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.coin.AdminMapper; import com.example.demo.mapper.coin.AdminMapper;
import com.example.demo.service.coin.AdminService; import com.example.demo.service.coin.AdminService;
import com.example.demo.Util.LanguageTranslationUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
@ -27,6 +28,10 @@ public class AdminServiceImpl implements AdminService {
private AuthenticationManager authenticationManager; private AuthenticationManager authenticationManager;
private final AdminMapper adminMapper; private final AdminMapper adminMapper;
// 注入多语言工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Override @Override
public Admin login(Admin admin) throws Exception { public Admin login(Admin admin) throws Exception {
String account = admin.getAccount(); String account = admin.getAccount();
@ -93,29 +98,34 @@ public class AdminServiceImpl implements AdminService {
//更新密码 //更新密码
@Override @Override
public Result updatePassword(Password password) {
public Result updatePassword(Password password, String lang) {
String oldPassword = password.getOldPassword(); String oldPassword = password.getOldPassword();
String newPassword = password.getNewPassword(); String newPassword = password.getNewPassword();
String againPassword = password.getAgainPassword(); String againPassword = password.getAgainPassword();
// 校验输入参数是否为空账号旧密码新密码确认密码均不可为空 // 校验输入参数是否为空账号旧密码新密码确认密码均不可为空
if(oldPassword == null || newPassword == null || againPassword == null ||password.getAccount() == null) { if(oldPassword == null || newPassword == null || againPassword == null ||password.getAccount() == null) {
return Result.error("输入不能为空");
String errorMsg = languageTranslationUtil.translate("输入不能为空", lang);
return Result.error(errorMsg);
} }
// 检查两次输入的新密码是否一致 // 检查两次输入的新密码是否一致
if (!newPassword.equals(againPassword)) { if (!newPassword.equals(againPassword)) {
return Result.error("两次输入的新密码不一致,请核对后重新输入");
String errorMsg = languageTranslationUtil.translate("两次输入的新密码不一致,请核对后重新输入", lang);
return Result.error(errorMsg);
} }
// 检查新密码是否符合复杂度要求 // 检查新密码是否符合复杂度要求
if (!PASSWORD_PATTERN.matcher(newPassword).matches()) { if (!PASSWORD_PATTERN.matcher(newPassword).matches()) {
return Result.error("新密码必须为8-16位数字、字母或符号组成,且至少包含其中两种");
String errorMsg = languageTranslationUtil.translate("新密码必须为8-16位数字、字母或符号组成,且至少包含其中两种", lang);
return Result.error(errorMsg);
} }
if(adminMapper.getAdmin(password.getAccount())==null) if(adminMapper.getAdmin(password.getAccount())==null)
{ {
return Result.error("用户不存在");
String errorMsg = languageTranslationUtil.translate("用户不存在", lang);
return Result.error(errorMsg);
} }
// 校验新密码是否与旧密码相同不允许相同 // 校验新密码是否与旧密码相同不允许相同
if (oldPassword.equals(newPassword)) { if (oldPassword.equals(newPassword)) {
return Result.error("新密码与历史密码重复");
String errorMsg = languageTranslationUtil.translate("新密码与历史密码重复", lang);
return Result.error(errorMsg);
} }
try { try {
// 创建认证令牌并验证旧密码 // 创建认证令牌并验证旧密码
@ -136,29 +146,34 @@ public class AdminServiceImpl implements AdminService {
admin.setPassword(encodedPassword); admin.setPassword(encodedPassword);
admin.setUpdateTime(new Date()); // 更新修改时间 admin.setUpdateTime(new Date()); // 更新修改时间
adminMapper.updatePassword(admin); adminMapper.updatePassword(admin);
return Result.success("密码修改成功");
String successMsg = languageTranslationUtil.translate("密码修改成功", lang);
return Result.success(successMsg);
} catch (BadCredentialsException e) { } catch (BadCredentialsException e) {
// 旧密码验证失败 // 旧密码验证失败
return Result.error("原密码错误,请重新输入");
String errorMsg = languageTranslationUtil.translate("原密码错误,请重新输入", lang);
return Result.error(errorMsg);
} }
catch (Exception e) { catch (Exception e) {
return Result.error("密码更新失败");
String errorMsg = languageTranslationUtil.translate("密码更新失败", lang);
return Result.error(errorMsg);
} }
} }
//重置密码 //重置密码
@Override @Override
public Result resetPassword(Password password) {
public Result resetPassword(Password password, String lang) {
String newPassword = "123456"; String newPassword = "123456";
if(password.getAccount() == null) { if(password.getAccount() == null) {
return Result.error("账户未输入");
String errorMsg = languageTranslationUtil.translate("账户未输入", lang);
return Result.error(errorMsg);
} }
if(adminMapper.getAdmin(password.getAccount())==null) if(adminMapper.getAdmin(password.getAccount())==null)
{ {
return Result.error("账户查找不到");
String errorMsg = languageTranslationUtil.translate("账户查找不到", lang);
return Result.error(errorMsg);
} }
try { try {
// 获取认证后的用户信息 // 获取认证后的用户信息
@ -173,10 +188,12 @@ public class AdminServiceImpl implements AdminService {
admin.setUpdateTime(new Date()); // 更新修改时间 admin.setUpdateTime(new Date()); // 更新修改时间
adminMapper.updatePassword(admin); adminMapper.updatePassword(admin);
return Result.success("密码重置成功");
String successMsg = languageTranslationUtil.translate("密码重置成功", lang);
return Result.success(successMsg);
} }
catch (Exception e) { catch (Exception e) {
return Result.error("其他错误");
String errorMsg = languageTranslationUtil.translate("其他错误", lang);
return Result.error(errorMsg);
} }
} }

84
src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java

@ -32,8 +32,6 @@ import com.example.demo.serviceImpl.cash.CashRefundServiceImpl;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.example.demo.service.coin.AiEmotionService; import com.example.demo.service.coin.AiEmotionService;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -57,7 +55,6 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.function.Function; import java.util.function.Function;
@Service @Service
@Slf4j @Slf4j
public class ExportExcelServiceImpl implements ExportExcelService { public class ExportExcelServiceImpl implements ExportExcelService {
@ -93,8 +90,6 @@ public class ExportExcelServiceImpl implements ExportExcelService {
@Autowired @Autowired
private ExportMapper exportMapper; private ExportMapper exportMapper;
@Transactional @Transactional
@Override @Override
public Exception handleExcelExportData(String message) throws Exception { public Exception handleExcelExportData(String message) throws Exception {
@ -144,12 +139,13 @@ public class ExportExcelServiceImpl implements ExportExcelService {
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
rechargeUser.setMarkets(markets); rechargeUser.setMarkets(markets);
page.setRechargeUser(rechargeUser); page.setRechargeUser(rechargeUser);
return rechargeController.selcet(page);
return rechargeController.select(page);
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
}); });
} }
@Transactional @Transactional
@Override @Override
public Exception consumeExcel(String message) throws Exception { public Exception consumeExcel(String message) throws Exception {
@ -187,7 +183,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
refundUser.setMarkets(markets); refundUser.setMarkets(markets);
page.setRefundUser(refundUser); page.setRefundUser(refundUser);
return refundController.selcet(page);
return refundController.select(page, String.join(",", markets));
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -241,6 +237,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
} }
}); });
} }
@Override @Override
public Exception BeanExcel(String message) throws Exception { public Exception BeanExcel(String message) throws Exception {
return exportExcelGeneric(message, "beanUser", page -> { return exportExcelGeneric(message, "beanUser", page -> {
@ -256,6 +253,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
} }
}); });
} }
@Override @Override
public Exception OnlineExcel(String message) throws Exception { public Exception OnlineExcel(String message) throws Exception {
return exportExcelGeneric(message, "onlineUser", page -> { return exportExcelGeneric(message, "onlineUser", page -> {
@ -306,13 +304,11 @@ public class ExportExcelServiceImpl implements ExportExcelService {
@Override @Override
public List<Export> getExcel(Export export) { public List<Export> getExcel(Export export) {
List<Export> list = exportMapper.getExportRecord(export.getAccount(),export.getType());
List<Export> list = exportMapper.getExportRecord(export.getAccount(),export.getType());
System.out.println(list+"-------------------------------"); System.out.println(list+"-------------------------------");
return list;
return list;
} }
/** /**
* 验证导出记录 * 验证导出记录
*/ */
@ -374,6 +370,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
Integer totalCount = 0; Integer totalCount = 0;
boolean hasMore = true; boolean hasMore = true;
// exportExcelGeneric 方法中的适当位置添加类型转换
while (hasMore) { while (hasMore) {
Result pageResult = dataFetcher.apply(page); Result pageResult = dataFetcher.apply(page);
Integer code = pageResult.getCode(); Integer code = pageResult.getCode();
@ -394,6 +391,16 @@ public class ExportExcelServiceImpl implements ExportExcelService {
if (list == null || list.isEmpty()) { if (list == null || list.isEmpty()) {
hasMore = false; hasMore = false;
} else { } else {
// 在这里添加类型转换逻辑
if ("goldDetail".equals(exportType) && list.get(0) instanceof GoldDetail) {
fillGoldDetailTypeDescriptions((List<GoldDetail>) list);
}
// 添加退款方式转换逻辑
if ("refundUser".equals(exportType) && list.get(0) instanceof RefundUser) {
fillRefundUserModelDescriptions((List<RefundUser>) list);
}
excelWriter.write(list, writeSheet); excelWriter.write(list, writeSheet);
page.setPageNum(page.getPageNum() + 1); page.setPageNum(page.getPageNum() + 1);
totalCount += list.size(); totalCount += list.size();
@ -516,9 +523,6 @@ public class ExportExcelServiceImpl implements ExportExcelService {
return null; return null;
} }
private Class<?> getExportClass(String exportType) { private Class<?> getExportClass(String exportType) {
switch (exportType) { switch (exportType) {
case "goldDetail": case "goldDetail":
@ -549,4 +553,56 @@ public class ExportExcelServiceImpl implements ExportExcelService {
throw new IllegalArgumentException("不支持的导出类型: " + exportType); 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 "未知类型";
}
}
/**
* 填充退款用户数据的退款方式描述
*/
private void fillRefundUserModelDescriptions(List<RefundUser> refundUsers) {
if (refundUsers != null && !refundUsers.isEmpty()) {
for (RefundUser user : refundUsers) {
if (user.getRefundModel() != null) {
String modelDesc = convertRefundModelToString(user.getRefundModel());
user.setRefundModelDesc(modelDesc);
}
}
}
}
/**
* 将退款模型数字转换为中文描述
*/
private String convertRefundModelToString(Byte refundModel) {
if (refundModel == null) return "";
switch (refundModel) {
case 0: return "全部退款";
case 1: 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(); 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 @Override
public Result updateConsumeNum() { public Result updateConsumeNum() {

78
src/main/java/com/example/demo/serviceImpl/coin/RefundServiceImpl.java

@ -4,6 +4,7 @@ import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.mapper.coin.*; import com.example.demo.mapper.coin.*;
import com.example.demo.service.coin.MarketService; import com.example.demo.service.coin.MarketService;
import com.example.demo.service.coin.RefundService; import com.example.demo.service.coin.RefundService;
import com.example.demo.Util.LanguageTranslationUtil;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -40,12 +41,16 @@ public class RefundServiceImpl implements RefundService {
@Autowired @Autowired
private UserMapper userMapper; private UserMapper userMapper;
@Autowired @Autowired
private MarketMapper marketMapper; private MarketMapper marketMapper;
@Autowired @Autowired
private RechargeMapper rechargeMapper; private RechargeMapper rechargeMapper;
// 注入多语言工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
//查找全部退款 //查找全部退款
@Override @Override
public PageInfo<RefundUser> selectAll(Integer pageNum, Integer pageSize, RefundUser refundUser) throws Exception { public PageInfo<RefundUser> selectAll(Integer pageNum, Integer pageSize, RefundUser refundUser) throws Exception {
@ -84,29 +89,34 @@ public class RefundServiceImpl implements RefundService {
//添加退款记录 //添加退款记录
@Transactional @Transactional
@Override @Override
public Result add(RefundUser refundUser) {
public Result add(RefundUser refundUser, String lang) {
if (refundUser.getTaskGold() == null || refundUser.getFreeGold() == null || refundUser.getPermanentGold() == null) { if (refundUser.getTaskGold() == null || refundUser.getFreeGold() == null || refundUser.getPermanentGold() == null) {
return Result.error("金币不能为空");
String errorMsg = languageTranslationUtil.translate("金币不能为空", lang);
return Result.error(errorMsg);
} }
if (refundUser.getTaskGold().compareTo(BigDecimal.ZERO) < 0 || if (refundUser.getTaskGold().compareTo(BigDecimal.ZERO) < 0 ||
refundUser.getFreeGold().compareTo(BigDecimal.ZERO) < 0 || refundUser.getFreeGold().compareTo(BigDecimal.ZERO) < 0 ||
refundUser.getPermanentGold().compareTo(BigDecimal.ZERO) < 0) { refundUser.getPermanentGold().compareTo(BigDecimal.ZERO) < 0) {
return Result.error("金币不能为负数");
String errorMsg = languageTranslationUtil.translate("金币不能为负数", lang);
return Result.error(errorMsg);
} }
if (refundUser.getJwcode() < 10000000 || refundUser.getJwcode() > 99999999) { if (refundUser.getJwcode() < 10000000 || refundUser.getJwcode() > 99999999) {
return Result.error("精网号位数小于8位或大于8位");
String errorMsg = languageTranslationUtil.translate("精网号位数小于8位或大于8位", lang);
return Result.error(errorMsg);
} }
GoldUser goldUser = userMapper.selectUser(refundUser.getJwcode().toString()); GoldUser goldUser = userMapper.selectUser(refundUser.getJwcode().toString());
if (goldUser == null) { if (goldUser == null) {
return Result.error("用户不存在");
String errorMsg = languageTranslationUtil.translate("用户不存在", lang);
return Result.error(errorMsg);
} }
UserGoldRecord userGoldRecord = new UserGoldRecord(); UserGoldRecord userGoldRecord = new UserGoldRecord();
if(refundUser.getOrderCode()==null|| refundUser.getOrderCode().isEmpty()){ if(refundUser.getOrderCode()==null|| refundUser.getOrderCode().isEmpty()){
return Result.error("订单号不能为空");
String errorMsg = languageTranslationUtil.translate("订单号不能为空", lang);
return Result.error(errorMsg);
} }
String goodsName = ""; String goodsName = "";
if(refundUser.getGoodsName()==null|| refundUser.getGoodsName().isEmpty()){ if(refundUser.getGoodsName()==null|| refundUser.getGoodsName().isEmpty()){
goodsName = "空";
goodsName = languageTranslationUtil.translate("空", lang);
}else { }else {
goodsName = refundUser.getGoodsName(); goodsName = refundUser.getGoodsName();
} }
@ -138,7 +148,8 @@ public class RefundServiceImpl implements RefundService {
if (refundUser.getFreeGold().compareTo(gold.getNowFreeDecember().add(gold.getNowFreeJune())) > 0 if (refundUser.getFreeGold().compareTo(gold.getNowFreeDecember().add(gold.getNowFreeJune())) > 0
|| refundUser.getPermanentGold().compareTo(gold.getNowPermanentGold()) > 0 || refundUser.getPermanentGold().compareTo(gold.getNowPermanentGold()) > 0
|| refundUser.getTaskGold().compareTo(gold.getNowTaskGold()) > 0) { || refundUser.getTaskGold().compareTo(gold.getNowTaskGold()) > 0) {
return Result.error("金币数量不足");
String errorMsg = languageTranslationUtil.translate("金币数量不足", lang);
return Result.error(errorMsg);
} }
// 根据当前月份设置对应字段 // 根据当前月份设置对应字段
if (currentMonth >= 1 && currentMonth <= 6) { if (currentMonth >= 1 && currentMonth <= 6) {
@ -166,8 +177,6 @@ public class RefundServiceImpl implements RefundService {
userGoldRecord.setSumGold(-refundUser.getSumGold().intValue()); userGoldRecord.setSumGold(-refundUser.getSumGold().intValue());
} }
userGoldRecord.setPayPlatform("金币系统"); userGoldRecord.setPayPlatform("金币系统");
userGoldRecord.setRemark(refundUser.getRemark()); userGoldRecord.setRemark(refundUser.getRemark());
userGoldRecord.setAdminId(refundUser.getAdminId()); userGoldRecord.setAdminId(refundUser.getAdminId());
@ -178,49 +187,57 @@ public class RefundServiceImpl implements RefundService {
List<ConsumeUser> list1 = consumeMapper.selectOrderCodeByJwcode(refundUser); List<ConsumeUser> list1 = consumeMapper.selectOrderCodeByJwcode(refundUser);
List<RechargeUser> list2 = rechargeMapper.selectOrderCodeByJwcode(refundUser); List<RechargeUser> list2 = rechargeMapper.selectOrderCodeByJwcode(refundUser);
if(Objects.equals(refundUser.getRefundType(), "商品退款")){ if(Objects.equals(refundUser.getRefundType(), "商品退款")){
//消费订单号校验
if (list1 == null || list1.isEmpty()) {
return Result.error("该用户没有该订单号");
} else if (list1.size() == 1) {
ConsumeUser consumeUser = list1.getFirst();
if (consumeUser.getIsRefund().equals(1)) {
return Result.error("该订单已被退款或待审核");
//消费订单号校验
if (list1 == null || list1.isEmpty()) {
String errorMsg = languageTranslationUtil.translate("该用户没有该订单号", lang);
return Result.error(errorMsg);
} else if (list1.size() == 1) {
ConsumeUser consumeUser = list1.getFirst();
if (consumeUser.getIsRefund().equals(1)) {
String errorMsg = languageTranslationUtil.translate("该订单已被退款或待审核", lang);
return Result.error(errorMsg);
}
} else {
String errorMsg = languageTranslationUtil.translate("订单重复", lang);
return Result.error(errorMsg);
} }
} else {
return Result.error("订单重复");
}
}else{ }else{
//充值订单号校验 //充值订单号校验
if (list2 == null || list2.isEmpty()) { if (list2 == null || list2.isEmpty()) {
return Result.error("该用户没有该订单号");
String errorMsg = languageTranslationUtil.translate("该用户没有该订单号", lang);
return Result.error(errorMsg);
} else if (list2.size() == 1) { } else if (list2.size() == 1) {
RechargeUser rechargeUser = list2.getFirst(); RechargeUser rechargeUser = list2.getFirst();
if (rechargeUser.getIsRefund().equals(1)) { if (rechargeUser.getIsRefund().equals(1)) {
return Result.error("该订单已被退款或待审核");
String errorMsg = languageTranslationUtil.translate("该订单已被退款或待审核", lang);
return Result.error(errorMsg);
} }
} else { } else {
return Result.error("订单重复");
String errorMsg = languageTranslationUtil.translate("订单重复", lang);
return Result.error(errorMsg);
} }
} }
refundMapper.add(userGoldRecord); refundMapper.add(userGoldRecord);
consumeMapper.updateIsRefund(orderCode); consumeMapper.updateIsRefund(orderCode);
return Result.success();
String successMsg = languageTranslationUtil.translate("操作成功", lang);
return Result.success(successMsg);
} }
//获取退款类型 //获取退款类型
@Override @Override
public List<String> getRefundType() {
public List<String> getRefundType(String lang) {
List<String> list = refundMapper.getRefundType(); List<String> list = refundMapper.getRefundType();
List<String> filteredList = list.stream() List<String> filteredList = list.stream()
.filter(Objects::nonNull) // 过滤掉 null .filter(Objects::nonNull) // 过滤掉 null
.filter(str -> !str.trim().isEmpty()) // 过滤掉空字符串和仅包含空白字符的字符串 .filter(str -> !str.trim().isEmpty()) // 过滤掉空字符串和仅包含空白字符的字符串
.map(type -> languageTranslationUtil.translate(type, lang)) // 翻译每个类型
.collect(Collectors.toList()); .collect(Collectors.toList());
return filteredList; return filteredList;
} }
//查找退款商品 //查找退款商品
@Override @Override
public List<RefundUser> selectGoods(RefundUser refundUser) {
public List<RefundUser> selectGoods(RefundUser refundUser, String lang) {
List<RefundUser> refundUsers = refundMapper.selectGoods(refundUser); List<RefundUser> refundUsers = refundMapper.selectGoods(refundUser);
List<RefundUser> list = new ArrayList<>(); List<RefundUser> list = new ArrayList<>();
for (RefundUser record : refundUsers) { for (RefundUser record : refundUsers) {
@ -228,16 +245,13 @@ public class RefundServiceImpl implements RefundService {
continue; continue;
} }
String orderCode = record.getOrderCode() != null ? record.getOrderCode() : "无订单号";
String goodsName = record.getGoodsName() != null ? record.getGoodsName() : "无商品名";
String orderCode = record.getOrderCode() != null ? record.getOrderCode() : languageTranslationUtil.translate("无订单号", lang);
String goodsName = record.getGoodsName() != null ? record.getGoodsName() : languageTranslationUtil.translate("无商品名", lang);
BigDecimal permanentGold = record.getPermanentGold() != null ? record.getPermanentGold() : BigDecimal.ZERO; BigDecimal permanentGold = record.getPermanentGold() != null ? record.getPermanentGold() : BigDecimal.ZERO;
BigDecimal freeGold = record.getFreeGold() != null ? record.getFreeGold() : BigDecimal.ZERO; BigDecimal freeGold = record.getFreeGold() != null ? record.getFreeGold() : BigDecimal.ZERO;
BigDecimal taskGold = record.getTaskGold() != null ? record.getTaskGold() : BigDecimal.ZERO; BigDecimal taskGold = record.getTaskGold() != null ? record.getTaskGold() : BigDecimal.ZERO;
// 计算总和
// 拼接格式订单号_商品名例如XF20250629_商品BC
String combined = orderCode + "_" + goodsName;
RefundUser newRefundUser = new RefundUser(); RefundUser newRefundUser = new RefundUser();
newRefundUser.setOrderCode(orderCode); newRefundUser.setOrderCode(orderCode);
newRefundUser.setGoodsName(goodsName); newRefundUser.setGoodsName(goodsName);

122
src/main/java/com/example/demo/serviceImpl/coin/TranslationServiceImpl.java

@ -0,0 +1,122 @@
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<Translation> 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<Translation> findByChineseSimplifiedLike(String chineseSimplified) {
return translationMapper.findByChineseSimplifiedLike(chineseSimplified);
}
@Override
public Translation findByChineseSimplified(String chineseSimplified) {
return translationMapper.findByChineseSimplified(chineseSimplified);
}
@Override
public List<Translation> findByLanguageAndTranslationStatus(String language, boolean isTranslated) {
// 语言字段映射关系
Map<String, String> 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<Translation> findByChineseSimplifiedAndLanguageStatus(
String chineseSimplified,
String language,
boolean isTranslated) {
// 语言字段映射关系
Map<String, String> 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);
}
@Override
public String findChineseSimplifiedByTranslation(String translatedText, String language) {
Translation translation = null;
switch (language.toLowerCase()) {
case "en":
translation = translationMapper.findByEnglish(translatedText);
break;
case "th":
translation = translationMapper.findByThai(translatedText);
break;
case "zh_tw":
translation = translationMapper.findByChineseTraditional(translatedText);
break;
case "ms":
translation = translationMapper.findByMalay(translatedText);
break;
case "vi":
translation = translationMapper.findByVietnamese(translatedText);
break;
default:
return translatedText; // 如果不是支持的语言默认原样返回
}
return translation != null ? translation.getChineseSimplified() : translatedText;
}
}

13
src/main/resources/cashMapper/CashCollectionMapper.xml

@ -7,14 +7,14 @@
useGeneratedKeys="true" keyProperty="id"> useGeneratedKeys="true" keyProperty="id">
insert into insert into
cash_record_collection(order_type,jwcode,name,market,activity, cash_record_collection(order_type,jwcode,name,market,activity,
order_code,goods_name,good_num,num_unit,permanent_gold,free_gold,
order_code,bank_code,goods_name,good_num,num_unit,permanent_gold,free_gold,
payment_currency,payment_amount,received_market, payment_currency,payment_amount,received_market,
pay_type,pay_time,status,submitter_id,submitter_market,
pay_type,pay_time,status,submitter_id,submitter_market,payload,
voucher,remark) voucher,remark)
values(#{orderType},#{jwcode},#{name},#{market},#{activity}, values(#{orderType},#{jwcode},#{name},#{market},#{activity},
#{orderCode},#{goodsName},#{goodNum},#{numUnit},#{permanentGold},#{freeGold},#{paymentCurrency},
#{orderCode},#{bankCode},#{goodsName},#{goodNum},#{numUnit},#{permanentGold},#{freeGold},#{paymentCurrency},
#{paymentAmount},#{receivedMarket},#{payType},#{payTime}, #{paymentAmount},#{receivedMarket},#{payType},#{payTime},
#{status},#{submitterId},#{submitterMarket},#{voucher},#{remark})
#{status},#{submitterId},#{submitterMarket},#{payload},#{voucher},#{remark})
</insert> </insert>
<!-- <insert id="syncToCashRecord"> <!-- <insert id="syncToCashRecord">
insert into cash_record(order_type,jwcode,name,market,activity, insert into cash_record(order_type,jwcode,name,market,activity,
@ -227,10 +227,11 @@
<!--查找未同步的订单--> <!--查找未同步的订单-->
<select id="getUnSync" resultType="com.example.demo.domain.entity.GOrder"> <select id="getUnSync" resultType="com.example.demo.domain.entity.GOrder">
select id,jwcode,order_no,type,price,count,pay_style,state, select id,jwcode,order_no,type,price,count,pay_style,state,
success_time,ios_environment,ios_transaction_id,ios_receipt_data,
success_time,ios_environment,ios_transaction_id,ios_receipt_data,firstdata_ipgTransactionId,
add_time,is_synced add_time,is_synced
from g_order from g_order
where is_synced=0 and state=1 and type='gold_coin' and pay_style in(3,5,6,7,9)
where is_synced=0 and state=1 and pay_style in(3,5,6,7,9)
and success_time>1665246960
limit #{size} limit #{size}
</select> </select>
<select id="selectById" resultType="com.example.demo.domain.vo.cash.CashCollection"> <select id="selectById" resultType="com.example.demo.domain.vo.cash.CashCollection">

19
src/main/resources/mapper/AuditMapper.xml

@ -35,7 +35,12 @@
where order_code = #{orderCode} and type in (0,1) where order_code = #{orderCode} and type in (0,1)
</update> </update>
<select id="selectRechargeBy" resultType="com.example.demo.domain.vo.coin.RechargeAudit"> <select id="selectRechargeBy" resultType="com.example.demo.domain.vo.coin.RechargeAudit">
SELECT ugr.*,
SELECT ugr.id,ugr.order_code,ugr.jwcode,ugr.activity,
ugr.rate_id,ugr.money,ugr.sum_gold,ugr.permanent_gold,ugr.free_june,ugr.free_december,
ugr.task_gold,ugr.remark,ugr.pay_model,ugr.pay_platform,ugr.voucher,
ugr.goods_name,ugr.type,ugr.is_refund,ugr.admin_id,ugr.audit_id,
ugr.audit_status,ugr.reject_reason,ugr.pay_time,
ugr.create_time,ugr.audit_time,ugr.update_time,
(COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0)) AS freeGold, (COALESCE(ugr.free_june, 0) + COALESCE(ugr.free_december, 0)) AS freeGold,
u.name as name, u.name as name,
m.name as market, m.name as market,
@ -63,12 +68,18 @@
AND ugr.activity = #{rechargeAudit.activity} AND ugr.activity = #{rechargeAudit.activity}
</if> </if>
<!-- 判断 market 是否不为总部且 markets 不为空 --> <!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="rechargeAudit.markets != null and rechargeAudit.markets.size() > 0">
<!-- <if test="rechargeAudit.markets != null and rechargeAudit.markets.size() > 0">
AND ( AND (
<foreach collection="rechargeAudit.markets" item="market" open="" close="" separator=" OR "> <foreach collection="rechargeAudit.markets" item="market" open="" close="" separator=" OR ">
u.market = #{market} u.market = #{market}
</foreach> </foreach>
) )
</if>-->
<if test="rechargeAudit.markets != null and rechargeAudit.markets.size() > 0">
AND u.market IN
<foreach collection="rechargeAudit.markets" item="market" open="(" separator="," close=")">
#{market}
</foreach>
</if> </if>
<if test="rechargeAudit.payModel != null and rechargeAudit.payModel != ''"> <if test="rechargeAudit.payModel != null and rechargeAudit.payModel != ''">
AND ugr.pay_model = #{rechargeAudit.payModel} AND ugr.pay_model = #{rechargeAudit.payModel}
@ -77,7 +88,7 @@
AND ugr.rate_id = #{rechargeAudit.rateId} AND ugr.rate_id = #{rechargeAudit.rateId}
</if>--> </if>-->
<if test="rechargeAudit.market != null and rechargeAudit.market != ''"> <if test="rechargeAudit.market != null and rechargeAudit.market != ''">
AND m.name = #{rechargeAudit.market}
AND m.id = #{rechargeAudit.market}
</if> </if>
<if test="rechargeAudit.startTime != null and rechargeAudit.endTime != null "> <if test="rechargeAudit.startTime != null and rechargeAudit.endTime != null ">
AND ugr.audit_time between #{rechargeAudit.startTime} and #{rechargeAudit.endTime} AND ugr.audit_time between #{rechargeAudit.startTime} and #{rechargeAudit.endTime}
@ -145,7 +156,7 @@
AND ugr.audit_time between #{refundAudit.startTime} and #{refundAudit.endTime} AND ugr.audit_time between #{refundAudit.startTime} and #{refundAudit.endTime}
</if> </if>
<if test="refundAudit.market != null and refundAudit.market != ''"> <if test="refundAudit.market != null and refundAudit.market != ''">
AND m.name = #{refundAudit.market}
AND m.id = #{refundAudit.market}
</if> </if>
<if test="refundAudit.auditStatus != null and refundAudit.auditStatus != ''"> <if test="refundAudit.auditStatus != null and refundAudit.auditStatus != ''">

2
src/main/resources/mapper/BeanAuditMapper.xml

@ -27,7 +27,7 @@
AND a.jwcode = #{jwcode} AND a.jwcode = #{jwcode}
</if> </if>
<if test="market != null and market != ''"> <if test="market != null and market != ''">
AND m.name = #{market}
AND m.id = #{market}
</if> </if>
<if test="createStartTime != null and createEndTime != null"> <if test="createStartTime != null and createEndTime != null">
AND a.create_time BETWEEN #{createStartTime} AND #{createEndTime} AND a.create_time BETWEEN #{createStartTime} AND #{createEndTime}

4
src/main/resources/mapper/BeanRechargeMapper1.xml

@ -30,7 +30,7 @@
<select id="selectCartBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeCartVo"> <select id="selectCartBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeCartVo">
select select
co.id, co.nickname,co.jwcode,m.name AS market,pd.name AS productName,co.total_money,co.source_name,co.live_name, FROM_UNIXTIME(co.created_at) AS createdAt co.id, co.nickname,co.jwcode,m.name AS market,pd.name AS productName,co.total_money,co.source_name,co.live_name, FROM_UNIXTIME(co.created_at) AS createdAt
from cart_order co
from `order` co
left join user u on u.jwcode = co.jwcode left join user u on u.jwcode = co.jwcode
left join market m on m.id = u.market left join market m on m.id = u.market
left join product_dict pd on pd.id = co.product_id left join product_dict pd on pd.id = co.product_id
@ -39,7 +39,7 @@
and co.jwcode =#{jwcode} and co.jwcode =#{jwcode}
</if> </if>
<if test="market!= null and market!=''"> <if test="market!= null and market!=''">
and m.name = #{market}
and m.id = #{market}
</if> </if>
<if test="productName!= null and productName!=''"> <if test="productName!= null and productName!=''">
and pd.name = #{productName} and pd.name = #{productName}

127
src/main/resources/mapper/TranslationMapper.xml

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.coin.TranslationMapper">
<resultMap id="TranslationMap" type="com.example.demo.domain.entity.Translation">
<id property="id" column="id"/>
<result property="chineseSimplified" column="chinese_simplified"/>
<result property="english" column="english"/>
<result property="thai" column="thai"/>
<result property="chineseTraditional" column="chinese_traditional"/>
<result property="malay" column="malay"/>
<result property="vietnamese" column="vietnamese"/>
<result property="configTime" column="config_time"/>
</resultMap>
<!-- 查询所有翻译记录 -->
<select id="findAll" resultMap="TranslationMap">
SELECT * FROM translation ORDER BY config_time DESC
</select>
<!-- 插入新的翻译记录 -->
<insert id="insert" parameterType="com.example.demo.domain.entity.Translation">
INSERT INTO translation (
chinese_simplified,
english,
thai,
chinese_traditional,
malay,
vietnamese,
config_time
) VALUES (
#{chineseSimplified},
#{english},
#{thai},
#{chineseTraditional},
#{malay},
#{vietnamese},
NOW()
)
</insert>
<!-- 更新翻译记录 -->
<update id="update" parameterType="com.example.demo.domain.entity.Translation">
UPDATE translation
<set>
<if test="chineseSimplified != null">chinese_simplified = #{chineseSimplified},</if>
<if test="english != null">english = #{english},</if>
<if test="thai != null">thai = #{thai},</if>
<if test="chineseTraditional != null">chinese_traditional = #{chineseTraditional},</if>
<if test="malay != null">malay = #{malay},</if>
<if test="vietnamese != null">vietnamese = #{vietnamese},</if>
config_time = NOW()
</set>
WHERE id = #{id}
</update>
<!-- 删除翻译记录 -->
<delete id="deleteById">
DELETE FROM translation WHERE id = #{id}
</delete>
<!-- 根据部分中文简体内容模糊查询翻译记录 -->
<select id="findByChineseSimplifiedLike" resultMap="TranslationMap">
SELECT * FROM translation
WHERE chinese_simplified LIKE CONCAT('%', #{chineseSimplified}, '%')
ORDER BY config_time DESC
</select>
<select id="findByChineseSimplified" parameterType="string" resultType="com.example.demo.domain.entity.Translation">
SELECT * FROM translation WHERE chinese_simplified = #{chineseSimplified}
ORDER BY config_time DESC
</select>
<select id="findByLanguageAndTranslationStatus" resultMap="TranslationMap">
SELECT * FROM translation
<where>
<choose>
<when test="isTranslated == true">
${languageColumn} IS NOT NULL AND ${languageColumn} != ''
</when>
<otherwise>
${languageColumn} IS NULL OR ${languageColumn} = ''
</otherwise>
</choose>
</where>
ORDER BY config_time DESC
</select>
<select id="findByChineseSimplifiedAndLanguageStatus" resultMap="TranslationMap">
SELECT * FROM translation
WHERE chinese_simplified LIKE CONCAT('%', #{chineseSimplified}, '%')
<choose>
<when test="isTranslated == true">
AND ${languageColumn} IS NOT NULL AND ${languageColumn} != ''
</when>
<otherwise>
AND (${languageColumn} IS NULL OR ${languageColumn} = '')
</otherwise>
</choose>
ORDER BY config_time DESC
</select>
<select id="findById" parameterType="int" resultType="com.example.demo.domain.entity.Translation">
SELECT * FROM translation WHERE id = #{id}
</select>
<select id="findByEnglish" parameterType="string" resultType="com.example.demo.domain.entity.Translation">
SELECT * FROM translation WHERE english = #{english}
</select>
<select id="findByThai" parameterType="string" resultType="com.example.demo.domain.entity.Translation">
SELECT * FROM translation WHERE thai = #{thai}
</select>
<select id="findByChineseTraditional" parameterType="string" resultType="com.example.demo.domain.entity.Translation">
SELECT * FROM translation WHERE chinese_traditional = #{chineseTraditional}
</select>
<select id="findByMalay" parameterType="string" resultType="com.example.demo.domain.entity.Translation">
SELECT * FROM translation WHERE malay = #{malay}
</select>
<select id="findByVietnamese" parameterType="string" resultType="com.example.demo.domain.entity.Translation">
SELECT * FROM translation WHERE vietnamese = #{vietnamese}
</select>
</mapper>
Loading…
Cancel
Save