Browse Source

1月7日现金管理多语言配置,导出文件的名称进行多语言配置以及各模块优化

milestone-20251209-多语言二期
wangguorui 3 days ago
parent
commit
e0aaa582d7
  1. 33
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  2. 3
      src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java
  3. 27
      src/main/java/com/example/demo/controller/coin/GoldDetailController.java
  4. 2
      src/main/java/com/example/demo/domain/entity/User.java
  5. 6
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java
  6. 5
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java
  7. 2
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java
  8. 2
      src/main/java/com/example/demo/domain/vo/cash/CashCollection.java
  9. 3
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  10. 5
      src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
  11. 3
      src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java
  12. 4
      src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
  13. 2
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  14. 17
      src/main/java/com/example/demo/serviceImpl/coin/GoldDetailServiceImpl.java

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

@ -1,6 +1,7 @@
package com.example.demo.Export;
import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.domain.DTO.*;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.coin.Result;
@ -37,6 +38,8 @@ public class ExportServiceImpl implements ExportService {
private RedisUtil redisUtil;
@Autowired
private AdminService adminService;
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
/**
* 通用导出逻辑
@ -59,7 +62,7 @@ public class ExportServiceImpl implements ExportService {
String adminName = admin.getAdminName();
// 设置 DTO 的通用字段
setCommonFields(dto, account, adminName);
setCommonFields(dto, account, adminName, exportType, lang);
// 插入导出记录并获取主键
GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder();
@ -84,56 +87,56 @@ public class ExportServiceImpl implements ExportService {
/**
* 设置 DTO 的通用字段
*/
private void setCommonFields(Object dto, Integer account,String adminName) throws Exception {
private void setCommonFields(Object dto, Integer account,String adminName, String exportType, String lang) throws Exception {
if (dto instanceof RechargeDTO rechargeDTO) {
rechargeDTO.setAccount(Integer.valueOf(account));
rechargeDTO.setUrl("");
rechargeDTO.setFileName(generateFileName("充值明细", adminName));
rechargeDTO.setFileName(generateFileName("充值明细", adminName, lang));
rechargeDTO.setDataNum(0);
} else if (dto instanceof RefundDTO refundDTO) {
refundDTO.setAccount(Integer.valueOf(account));
refundDTO.setUrl("");
refundDTO.setFileName(generateFileName("退款明细", adminName));
refundDTO.setFileName(generateFileName("退款明细", adminName, lang));
refundDTO.setDataNum(0);
} else if (dto instanceof ConsumeDTO consumeDTO) {
consumeDTO.setAccount(Integer.valueOf(account));
consumeDTO.setUrl("");
consumeDTO.setFileName(generateFileName("消耗明细", adminName));
consumeDTO.setFileName(generateFileName("消耗明细", adminName, lang));
consumeDTO.setDataNum(0);
} else if (dto instanceof LiveDTO liveDTO) {
liveDTO.setAccount(Integer.valueOf(account));
liveDTO.setUrl("");
liveDTO.setFileName(generateFileName("直播明细", adminName));
liveDTO.setFileName(generateFileName("直播明细", adminName, lang));
liveDTO.setDataNum(0);
} else if (dto instanceof FanDTO fanDTO) {
fanDTO.setAccount(Integer.valueOf(account));
fanDTO.setUrl("");
fanDTO.setFileName(generateFileName("铁粉明细", adminName));
fanDTO.setFileName(generateFileName("铁粉明细", adminName, lang));
fanDTO.setDataNum(0);
} else if (dto instanceof BeanRechargeDTO beanRechargeDTO){
beanRechargeDTO.setAccount(Integer.valueOf(account));
beanRechargeDTO.setUrl("");
beanRechargeDTO.setFileName(generateFileName("金豆充值明细", adminName));
beanRechargeDTO.setFileName(generateFileName("金豆充值明细", adminName, lang));
beanRechargeDTO.setDataNum(0);
} else if(dto instanceof OnlineDTO onlineDTO){
onlineDTO.setAccount(Integer.valueOf(account));
onlineDTO.setUrl("");
onlineDTO.setFileName(generateFileName("在线明细", adminName));
onlineDTO.setFileName(generateFileName("在线明细", adminName, lang));
onlineDTO.setDataNum(0);
} else if(dto instanceof ArticleDTO articleDTO){
articleDTO.setAccount(Integer.valueOf(account));
articleDTO.setUrl("");
articleDTO.setFileName(generateFileName("文章明细", adminName));
articleDTO.setFileName(generateFileName("文章明细", adminName, lang));
articleDTO.setDataNum(0);
} else if(dto instanceof FinanceDTO financeDTO){
financeDTO.setAccount(Integer.valueOf(account));
financeDTO.setUrl("");
financeDTO.setFileName(generateFileName("现金退款明细", adminName));
financeDTO.setFileName(generateFileName("现金退款明细", adminName, lang));
financeDTO.setDataNum(0);
} else if(dto instanceof CashDTO cashDTO){
cashDTO.setAccount(Integer.valueOf(account));
cashDTO.setUrl("");
cashDTO.setFileName(generateFileName("现金收款明细", adminName));
cashDTO.setFileName(generateFileName("现金收款明细", adminName, lang));
cashDTO.setDataNum(0);
}
}
@ -284,9 +287,11 @@ public class ExportServiceImpl implements ExportService {
/**
* 生成文件名
*/
private String generateFileName(String exportType, String adminName) {
private String generateFileName(String exportType, String adminName,String lang) {
// 对导出类型进行多语言转换
String translatedExportType = languageTranslationUtil.translate(exportType, lang);
return String.format("%s_%s_%s.xlsx",
exportType,
translatedExportType,
adminName,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
}

3
src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java

@ -192,6 +192,7 @@ public class ExcelHeaderTranslator {
Map<String, String> headers = new LinkedHashMap<>();
// 定义所有表头的原始中文名称对应 BeanOnlineRechargeInfo 类的字段
headers.put("id", "ID");
headers.put("jwcode", "精网号");
headers.put("name", "姓名");
headers.put("market", "所属地区");
@ -214,7 +215,7 @@ public class ExcelHeaderTranslator {
*/
public List<String> getBeanOnlineRechargeColumnOrder() {
return Arrays.asList(
"jwcode", "name", "market", "money", "num", "orderNo", "platform", "rechargeTime"
"id","jwcode", "name", "market", "money", "num", "orderNo", "platform", "rechargeTime"
);
}

27
src/main/java/com/example/demo/controller/coin/GoldDetailController.java

@ -127,7 +127,6 @@ public class GoldDetailController {
return result;
}
@Log("客户金币明细金币合计数统计")
@PostMapping("/getTotal")
public Result getTotal(@RequestBody Page page) throws Exception {
@ -138,14 +137,14 @@ public class GoldDetailController {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
// 解析 token 获取用户信息
// 解析 token 获取用户信息
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets);
// 获取传入的市场列表
// 获取传入的市场列表
List<String> requestedMarkets = page.getGoldDetail() != null ? page.getGoldDetail().getMarkets() : null;
// 权限校验逻辑
// 权限校验逻辑
if (markets.contains("9") || markets.contains("9999")) {
// 特权市场9 9999跳过权限校验直接放行传入的 markets
// 如果业务需要也可以在这里做空值处理
@ -166,6 +165,7 @@ public class GoldDetailController {
return Result.success(goldDetailService.sumGold(pageNum,pageSize,goldDetail));
}
@Log("客户金币余额金币合计数统计")
@PostMapping("/goldTotal")
public Result GoldTotal(@RequestBody User user) throws Exception {
@ -173,16 +173,16 @@ public class GoldDetailController {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
// 解析 token 获取用户信息
// 解析 token 获取用户信息
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets);
// 获取传入的市场列表
// 获取传入的市场列表
List<String> requestedMarkets = user != null ? user.getMarkets() : null;
// 权限校验逻辑
// 权限校验逻辑
if (markets.contains("9") || markets.contains("9999")) {
// 特权市场9 9999跳过权限校验直接放行传入的 markets
// 如果业务需要也可以在这里做空值处理
@ -203,6 +203,7 @@ public class GoldDetailController {
return Result.success(goldDetailService.GoldTotal(user));
}
@Log("获取客户金币余额记录")
@PostMapping("/getGold")
public Result getGold(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
@ -264,7 +265,6 @@ public class GoldDetailController {
return result;
}
@PostMapping("/export")
public Result export(@Valid @RequestBody GoldDetailDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) {
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key可按用户/业务区分
@ -292,6 +292,7 @@ public class GoldDetailController {
redisLockUtil.unlock(lockKey, requestId);
}
}
@PostMapping("/exportGold")
public Result export(@Valid @RequestBody GoldUserDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) {
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key可按用户/业务区分
@ -319,6 +320,7 @@ public class GoldDetailController {
redisLockUtil.unlock(lockKey, requestId);
}
}
@PostMapping("/exportqqq")
public Result ExcelGoldDetail(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
// 解析语言代码
@ -350,7 +352,6 @@ public class GoldDetailController {
}
}
public Result ExcelGold(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
@ -380,9 +381,7 @@ public class GoldDetailController {
return result;
}
/*
更新用户消费次数
*/
//更新用户消费次数
@PostMapping("/updateConsumeNum")
public Result updateConsumeNum() {
return goldDetailService.updateConsumeNum();
@ -420,9 +419,10 @@ public class GoldDetailController {
case 0: return "充值";
case 1: return "消耗";
case 2: return "退款";
default: return "未知类型";
default: return "其他";
}
}
/**
* 转换用户信息的多语言字段
*/
@ -436,6 +436,7 @@ public class GoldDetailController {
}
}
}
/**
* 解析语言代码
*/

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

@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -18,6 +19,7 @@ import java.util.Set;
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class User implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer id; // 客户id

6
src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java

@ -1,12 +1,13 @@
package com.example.demo.domain.vo.bean;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
@ -20,7 +21,8 @@ import java.util.Date;
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeArticle {
public class BeanConsumeArticle implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer id;
private String name; //姓名

5
src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java

@ -8,6 +8,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
@ -21,7 +23,8 @@ import java.util.Date;
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeFan {
public class BeanConsumeFan implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer id;
private String name; //姓名

2
src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java

@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@ -26,6 +27,7 @@ import java.util.List;
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeLive implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer id;
@ExcelIgnore

2
src/main/java/com/example/demo/domain/vo/cash/CashCollection.java

@ -8,6 +8,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ -26,6 +27,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
public class CashCollection implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer id;
@ExcelIgnore

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

@ -9,6 +9,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -27,7 +28,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
public class ConsumeUser implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private String name; // 客户姓名

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

@ -7,6 +7,8 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@ -21,7 +23,8 @@ import java.util.List;
**/
@Data
@NoArgsConstructor
public class GoldDetail {
public class GoldDetail implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@ExcelIgnore

3
src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java

@ -7,6 +7,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -24,7 +25,7 @@ import java.util.List;
@Data
@NoArgsConstructor
public class RechargeUser implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private String name; // 客户姓名

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

@ -1,12 +1,12 @@
package com.example.demo.domain.vo.coin;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -25,7 +25,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
public class RefundUser implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private String orderCode; // 订单号

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

@ -972,7 +972,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
case 0: return "充值";
case 1: return "消耗";
case 2: return "退款";
default: return "未知类型";
default: return "其他";
}
}

17
src/main/java/com/example/demo/serviceImpl/coin/GoldDetailServiceImpl.java

@ -1,6 +1,7 @@
package com.example.demo.serviceImpl.coin;
import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.Util.RedisUtil;
import com.example.demo.domain.DTO.GoldDetailDTO;
import com.example.demo.domain.DTO.GoldUserDTO;
@ -45,6 +46,8 @@ public class GoldDetailServiceImpl implements GoldDetailService {
private RedisUtil redisUtil;
@Autowired
private AdminService adminService;
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Override
public PageInfo<GoldDetail> getGoldDetail(Integer pageNum, Integer pageSize, GoldDetail goldDetail) {
@ -95,9 +98,11 @@ public class GoldDetailServiceImpl implements GoldDetailService {
throw new RuntimeException(e.getMessage());
}
String admin = adminService.getName(String.valueOf(dto.getAccount()));
// 生成文件名
// 生成文件名多语言转换
String exportType = "客户金币明细";
String translatedExportType = languageTranslationUtil.translate(exportType, dto.getLang());
String fileName = String.format("%s_%s_%s.xlsx",
"客户金币明细",
translatedExportType,
admin,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
@ -153,9 +158,11 @@ public class GoldDetailServiceImpl implements GoldDetailService {
throw new RuntimeException(e.getMessage());
}
String admin = adminService.getName(String.valueOf(dto.getAccount()));
// 生成文件名
// 生成文件名(多语言转换)
String exportType = "金币余额明细";
String translatedExportType = languageTranslationUtil.translate(exportType, dto.getLang());
String fileName = String.format("%s_%s_%s.xlsx",
"金币余额明细",
translatedExportType,
admin,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
@ -207,7 +214,7 @@ public class GoldDetailServiceImpl implements GoldDetailService {
case 0: return "充值";
case 1: return "消耗";
case 2: return "退款";
default: return "未知类型";
default: return "其他";
}
}

Loading…
Cancel
Save