Browse Source

20260308 钱包明细导出

huangqizheng/feature-20260309142559-钱包退款
wangguorui 1 month ago
parent
commit
896e4ed59b
  1. 3
      src/main/java/com/example/demo/Export/ExportService.java
  2. 38
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  3. 37
      src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java
  4. 586
      src/main/java/com/example/demo/controller/coin/ExportController.java
  5. 30
      src/main/java/com/example/demo/domain/DTO/UserWalletDTO.java
  6. 1
      src/main/java/com/example/demo/domain/vo/cash/CashCollection.java
  7. 12
      src/main/java/com/example/demo/domain/vo/cash/UserWalletRecordVO.java
  8. 2
      src/main/java/com/example/demo/domain/vo/coin/Page.java
  9. 1
      src/main/java/com/example/demo/service/coin/ExportExcelService.java
  10. 27
      src/main/java/com/example/demo/service/listen/UserWalletRecordListener.java
  11. 97
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java

3
src/main/java/com/example/demo/Export/ExportService.java

@ -36,4 +36,7 @@ public interface ExportService {
Result addExportPerformance(PerformanceDTO dto);
Result addExportFundDTO(FundDTO dto);
// 用户钱包明细导出
Result addExportUserWallet(UserWalletDTO dto);
}

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

@ -144,11 +144,16 @@ public class ExportServiceImpl implements ExportService {
performanceDTO.setUrl("");
performanceDTO.setFileName(generateFileName("业绩归属明细", adminName, lang));
performanceDTO.setDataNum(0);
}else if (dto instanceof FundDTO fundDTO){
} else if (dto instanceof FundDTO fundDTO){
fundDTO.setAccount(Integer.valueOf(account));
fundDTO.setUrl("");
fundDTO.setFileName(generateFileName("资金明细", adminName, lang));
fundDTO.setDataNum(0);
} else if(dto instanceof UserWalletDTO userWalletDTO){
userWalletDTO.setAccount(Integer.valueOf(account));
userWalletDTO.setUrl("");
userWalletDTO.setFileName(generateFileName("用户钱包明细", adminName, lang));
userWalletDTO.setDataNum(0);
}
}
@ -276,6 +281,16 @@ public class ExportServiceImpl implements ExportService {
fundDTO.getFileName(),
fundDTO.getDataNum()
);
}else if (dto instanceof UserWalletDTO userWalletDTO){
goldDetailMapper.insertExportRecord(
idHolder,
account,
userWalletDTO.getType(),
userWalletDTO.getState(),
userWalletDTO.getUrl(),
userWalletDTO.getFileName(),
userWalletDTO.getDataNum()
);
}
}
@ -313,6 +328,21 @@ public class ExportServiceImpl implements ExportService {
requestData.put(requestDataKey, performanceDTO);
}else if (dto instanceof FundDTO fundDTO){
requestData.put(requestDataKey, fundDTO.getFundsDTO());
}else if (dto instanceof UserWalletDTO userWalletDTO){
// 特殊处理优先使用 userWalletRecordVO如果为空则尝试从其他字段获取
if (userWalletDTO.getUserWalletRecordVO() != null) {
requestData.put("userWalletRecordVO", userWalletDTO.getUserWalletRecordVO());
} else if (userWalletDTO.getUserWalletRecord() != null) {
// 如果前端传的是 userWalletRecord转换为 VO
com.example.demo.domain.entity.UserWalletRecord record = userWalletDTO.getUserWalletRecord();
com.example.demo.domain.vo.cash.UserWalletRecordVO vo = new com.example.demo.domain.vo.cash.UserWalletRecordVO();
vo.setJwcode(record.getJwcode());
vo.setWalletId(record.getWalletId());
requestData.put("userWalletRecordVO", vo);
} else {
// 都为空放一个空的 VO 对象
requestData.put("userWalletRecordVO", new com.example.demo.domain.vo.cash.UserWalletRecordVO());
}
}
exportData.put("requestData", requestData);
@ -390,4 +420,10 @@ public class ExportServiceImpl implements ExportService {
public Result addExportFundDTO(FundDTO dto) {
return addExport(dto, "资金流水明细", "fund:queue:export_queue", "fundsDTO", dto.getLang());
}
@Override
public Result addExportUserWallet(UserWalletDTO dto) {
return addExport(dto, "用户钱包明细", "user_wallet_record:queue:export_queue", "userWalletRecordVO", dto.getLang());
}
}

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

@ -592,6 +592,43 @@ public class ExcelHeaderTranslator {
}
/**
* 获取用户钱包明细的 Excel 表头映射
* 返回 Map<字段名中文表头>
*/
public Map<String, String> getUserWalletHeaders(String lang) {
Map<String, String> headers = new LinkedHashMap<>();
// 定义所有表头的原始中文名称对应 UserWalletRecordVO 类的字段
headers.put("jwcode", "精网号");
headers.put("userName", "姓名");
headers.put("marketName", "所属地区");
headers.put("walletName", "钱包名称");
headers.put("typeText", "交易类型");
headers.put("amount", "交易金额");
headers.put("orderCode", "订单号");
headers.put("description", "交易说明");
headers.put("statusText", "状态");
headers.put("createTime", "创建时间");
// 如果需要翻译则翻译表头
if (!isChineseLanguage(lang)) {
return translateHeaders(headers, lang);
}
return headers;
}
/**
* 获取用户钱包明细表头顺序
*/
public List<String> getUserWalletColumnOrder() {
return Arrays.asList(
"jwcode", "userName", "marketName", "walletName", "typeText", "amount",
"orderCode", "description", "statusText", "createTime"
);
}
/**
* 翻译表头
*/
private Map<String, String> translateHeaders(Map<String, String> headers, String lang) {

586
src/main/java/com/example/demo/controller/coin/ExportController.java

@ -9,10 +9,7 @@ import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.Export;
import com.example.demo.domain.DTO.CashDTO;
import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.FundsDTO;
import com.example.demo.domain.vo.cash.PerformanceVO;
import com.example.demo.domain.vo.cash.*;
import com.example.demo.domain.vo.coin.*;
import com.example.demo.service.coin.ExportExcelService;
import com.example.demo.Export.ExportService;
@ -57,7 +54,7 @@ public class ExportController {
@PostMapping("/export")
public Result export(@Valid @RequestBody Export export, @RequestHeader("token") String token) throws Exception {
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
UserDetails token1 = JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
export.setAccount(Integer.valueOf(token1.getUsername()));
return Result.success(exportExcelService.getExcel(export));
} catch (Exception e) {
@ -75,20 +72,10 @@ public class ExportController {
String token = request.getHeader("token");
dto.setToken(token);
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRechargeTranslatedFieldsToChinese(dto.getRechargeUser(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportRecharge(dto);
@ -107,20 +94,10 @@ public class ExportController {
String token = request.getHeader("token");
dto.setToken(token);
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertRefundTranslatedFieldsToChinese(dto.getRefundUser(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportRefund(dto);
@ -139,20 +116,10 @@ public class ExportController {
String token = request.getHeader("token");
dto.setToken(token);
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertConsumeTranslatedFieldsToChinese(dto.getConsumeUser(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportConsume(dto);
@ -168,20 +135,10 @@ public class ExportController {
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertLiveTranslatedFieldsToChinese(dto.getBeanConsumeLive(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportLive(dto);
@ -192,25 +149,15 @@ public class ExportController {
}
@PostMapping("/exportFan")
public Result export(@Valid @RequestBody FanDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang){
public Result export(@Valid @RequestBody FanDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) {
String lockKey = "export:lock:" + dto.getToken();
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertFanTranslatedFieldsToChinese(dto.getBeanConsumeFan(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportFan(dto);
@ -221,25 +168,15 @@ public class ExportController {
}
@PostMapping("/exportArticle")
public Result export(@Valid @RequestBody ArticleDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang){
public Result export(@Valid @RequestBody ArticleDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) {
String lockKey = "export:lock:" + dto.getToken();
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertArticleTranslatedFieldsToChinese(dto.getBeanConsumeArticle(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportArticle(dto);
@ -250,25 +187,15 @@ public class ExportController {
}
@PostMapping("/exportBean")
public Result export(@Valid @RequestBody BeanRechargeDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang){
public Result export(@Valid @RequestBody BeanRechargeDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) {
String lockKey = "export:lock:" + dto.getToken();
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertBeanTranslatedFieldsToChinese(dto.getBeanSystemRechargeInfo(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportBean(dto);
@ -279,25 +206,15 @@ public class ExportController {
}
@PostMapping("/exportol")
public Result exportol(@Valid @RequestBody OnlineDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
public Result exportol(@Valid @RequestBody OnlineDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) {
String lockKey = "export:lock:" + dto.getToken();
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertOnlineTranslatedFieldsToChinese(dto.getBeanOnlineRechargeInfo(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportOnline(dto);
@ -316,20 +233,10 @@ public class ExportController {
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertFinanceTranslatedFieldsToChinese(dto.getCashRecordDTO(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportFinance(dto);
@ -345,24 +252,14 @@ public class ExportController {
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang); // 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertCashTranslatedFieldsToChinese(dto.getCashCollection(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportCash(dto);
}finally {
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
@ -374,20 +271,10 @@ public class ExportController {
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
page.getPerformanceDTO().setLang(lang);// 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果非中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertPerformanceTranslatedFieldsToChinese(page.getPerformanceDTO().getPerformanceVO(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportPerformance(page.getPerformanceDTO());
@ -396,6 +283,7 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId);
}
}
/**
* 资金导出
*/
@ -405,20 +293,10 @@ public class ExportController {
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang);// 设置语言参数
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果非中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertFundsTranslatedFieldsToChinese(dto.getFundsDTO(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportFundDTO(dto);
@ -428,417 +306,25 @@ public class ExportController {
}
}
/**
* 解析语言代码
*/
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.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.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);
}
}
}
/**
* 将直播查询条件中的翻译字段转换为中文简体
*/
private void convertLiveTranslatedFieldsToChinese(BeanConsumeLive beanConsumeLive, String languageCode) {
if (beanConsumeLive != null) {
//转换地区
if (beanConsumeLive.getDept() != null && !beanConsumeLive.getDept().isEmpty()) {
String chineseDept = translationService.findChineseSimplifiedByTranslation(
beanConsumeLive.getDept(), languageCode);
beanConsumeLive.setDept(chineseDept);
}
//转换礼物名称
if (beanConsumeLive.getGift() != null && !beanConsumeLive.getGift().isEmpty()) {
String chineseGift = translationService.findChineseSimplifiedByTranslation(
beanConsumeLive.getGift(), languageCode);
beanConsumeLive.setGift(chineseGift);
}
//转换直播频道
if (beanConsumeLive.getLiveChannel() != null && !beanConsumeLive.getLiveChannel().isEmpty()) {
String chineseChannel = translationService.findChineseSimplifiedByTranslation(
beanConsumeLive.getLiveChannel(), languageCode);
beanConsumeLive.setLiveChannel(chineseChannel);
}
//转换直播名称
if (beanConsumeLive.getLiveName() != null && !beanConsumeLive.getLiveName().isEmpty()) {
String chineseName = translationService.findChineseSimplifiedByTranslation(
beanConsumeLive.getLiveName(), languageCode);
beanConsumeLive.setLiveName(chineseName);
}
}
}
/**
* 将粉丝查询条件中的翻译字段转换为中文简体
*/
private void convertFanTranslatedFieldsToChinese(BeanConsumeFan beanConsumeFan, String languageCode) {
if (beanConsumeFan != null) {
// 转换地区
if (beanConsumeFan.getDept() != null && !beanConsumeFan.getDept().isEmpty()) {
String chineseDept = translationService.findChineseSimplifiedByTranslation(
beanConsumeFan.getDept(), languageCode);
beanConsumeFan.setDept(chineseDept);
}
// 转换频道
if (beanConsumeFan.getChannel() != null && !beanConsumeFan.getChannel().isEmpty()) {
String chineseChannel = translationService.findChineseSimplifiedByTranslation(
beanConsumeFan.getChannel(), languageCode);
beanConsumeFan.setChannel(chineseChannel);
}
// 转换会员类型
if (beanConsumeFan.getTypeDesc() != null && !beanConsumeFan.getTypeDesc().isEmpty()) {
String chineseType = translationService.findChineseSimplifiedByTranslation(
beanConsumeFan.getTypeDesc(), languageCode);
beanConsumeFan.setTypeDesc(chineseType);
}
}
}
/**
* 将文章查询条件中的翻译字段转换为中文简体
*/
private void convertArticleTranslatedFieldsToChinese(BeanConsumeArticle beanConsumeArticle, String languageCode) {
if (beanConsumeArticle != null) {
// 转换文章名称
if (beanConsumeArticle.getArticleName() != null && !beanConsumeArticle.getArticleName().isEmpty()) {
String chineseName = translationService.findChineseSimplifiedByTranslation(
beanConsumeArticle.getArticleName(), languageCode);
beanConsumeArticle.setArticleName(chineseName);
}
// 转换地区
if (beanConsumeArticle.getDept() != null && !beanConsumeArticle.getDept().isEmpty()) {
String chineseDept = translationService.findChineseSimplifiedByTranslation(
beanConsumeArticle.getDept(), languageCode);
beanConsumeArticle.setDept(chineseDept);
}
// 转换类型
if (beanConsumeArticle.getTypeDesc() != null && !beanConsumeArticle.getTypeDesc().isEmpty()) {
String chineseType = translationService.findChineseSimplifiedByTranslation(
beanConsumeArticle.getTypeDesc(), languageCode);
beanConsumeArticle.setTypeDesc(chineseType);
}
}
}
/**
* 将金豆充值查询条件中的翻译字段转换为中文简体
*/
private void convertBeanTranslatedFieldsToChinese(BeanSystemRechargeInfo beanSystemRechargeInfo, String languageCode) {
if (beanSystemRechargeInfo != null) {
// 转换市场
if (beanSystemRechargeInfo.getMarket() != null && !beanSystemRechargeInfo.getMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
beanSystemRechargeInfo.getMarket(), languageCode);
beanSystemRechargeInfo.setMarket(chineseMarket);
}
// 转换备注
if (beanSystemRechargeInfo.getRemark() != null && !beanSystemRechargeInfo.getRemark().isEmpty()) {
String chineseRemark = translationService.findChineseSimplifiedByTranslation(
beanSystemRechargeInfo.getRemark(), languageCode);
beanSystemRechargeInfo.setRemark(chineseRemark);
}
}
}
/**
* 将导出查询条件中的翻译字段转换为中文简体
*/
private void convertOnlineTranslatedFieldsToChinese(BeanOnlineRechargeInfo beanOnlineRechargeInfo, String languageCode) {
if (beanOnlineRechargeInfo != null) {
// 转换市场
if (beanOnlineRechargeInfo.getMarket() != null && !beanOnlineRechargeInfo.getMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
beanOnlineRechargeInfo.getMarket(), languageCode);
beanOnlineRechargeInfo.setMarket(chineseMarket);
}
// 转换充值平台
if (beanOnlineRechargeInfo.getPlatformDesc() != null && !beanOnlineRechargeInfo.getPlatformDesc().isEmpty()) {
String chinesePlatform = translationService.findChineseSimplifiedByTranslation(
beanOnlineRechargeInfo.getPlatformDesc(), languageCode);
beanOnlineRechargeInfo.setPlatformDesc(chinesePlatform);
}
}
}
/**
* 将负责人导出查询条件中的翻译字段转换为中文简体
* 用户钱包明细导出
*/
private void convertFinanceTranslatedFieldsToChinese(CashRecordDTO cashRecordDTO, String languageCode) {
if (cashRecordDTO != null) {
// 转换商品名称
if (cashRecordDTO.getGoodsName() != null && !cashRecordDTO.getGoodsName().isEmpty()) {
String chineseGoodsName = translationService.findChineseSimplifiedByTranslation(
cashRecordDTO.getGoodsName(), languageCode);
cashRecordDTO.setGoodsName(chineseGoodsName);
}
// 转换备注
if (cashRecordDTO.getRemark() != null && !cashRecordDTO.getRemark().isEmpty()) {
String chineseRemark = translationService.findChineseSimplifiedByTranslation(
cashRecordDTO.getRemark(), languageCode);
cashRecordDTO.setRemark(chineseRemark);
}
// 转换退款理由
if (cashRecordDTO.getRefundReason() != null && !cashRecordDTO.getRefundReason().isEmpty()) {
String chineseRefundReason = translationService.findChineseSimplifiedByTranslation(
cashRecordDTO.getRefundReason(), languageCode);
cashRecordDTO.setRefundReason(chineseRefundReason);
}
// 转换驳回理由
if (cashRecordDTO.getRejectReason() != null && !cashRecordDTO.getRejectReason().isEmpty()) {
String chineseRejectReason = translationService.findChineseSimplifiedByTranslation(
cashRecordDTO.getRejectReason(), languageCode);
cashRecordDTO.setRejectReason(chineseRejectReason);
}
}
}
/**
* 将现金导出查询条件中的翻译字段转换为中文简体
*/
private void convertCashTranslatedFieldsToChinese(CashCollection cashCollection, String languageCode) {
if (cashCollection != null) {
// 转换地区
if (cashCollection.getMarket() != null && !cashCollection.getMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
cashCollection.getMarket(), languageCode);
cashCollection.setMarket(chineseMarket);
}
// 转换活动名称
if (cashCollection.getActivity() != null && !cashCollection.getActivity().isEmpty()) {
String chineseActivity = translationService.findChineseSimplifiedByTranslation(
cashCollection.getActivity(), languageCode);
cashCollection.setActivity(chineseActivity);
}
// 转换商品名称
if (cashCollection.getGoodsName() != null && !cashCollection.getGoodsName().isEmpty()) {
String chineseGoodsName = translationService.findChineseSimplifiedByTranslation(
cashCollection.getGoodsName(), languageCode);
cashCollection.setGoodsName(chineseGoodsName);
}
// 转换单位
if (cashCollection.getNumUnit() != null && !cashCollection.getNumUnit().isEmpty()) {
String chineseNumUnit = translationService.findChineseSimplifiedByTranslation(
cashCollection.getNumUnit(), languageCode);
cashCollection.setNumUnit(chineseNumUnit);
}
// 转换支付方式
if (cashCollection.getPayType() != null && !cashCollection.getPayType().isEmpty()) {
String chinesePayType = translationService.findChineseSimplifiedByTranslation(
cashCollection.getPayType(), languageCode);
cashCollection.setPayType(chinesePayType);
}
// 转换到账地区
if (cashCollection.getReceivedMarket() != null && !cashCollection.getReceivedMarket().isEmpty()) {
String chineseReceivedMarket = translationService.findChineseSimplifiedByTranslation(
cashCollection.getReceivedMarket(), languageCode);
cashCollection.setReceivedMarket(chineseReceivedMarket);
}
// 转换币种
if (cashCollection.getPaymentCurrency() != null && !cashCollection.getPaymentCurrency().isEmpty()) {
String chineseCurrency = translationService.findChineseSimplifiedByTranslation(
cashCollection.getPaymentCurrency(), languageCode);
cashCollection.setPaymentCurrency(chineseCurrency);
}
// 转换币种
if (cashCollection.getReceivedCurrency() != null && !cashCollection.getReceivedCurrency().isEmpty()) {
String chineseCurrency = translationService.findChineseSimplifiedByTranslation(
cashCollection.getReceivedCurrency(), languageCode);
cashCollection.setReceivedCurrency(chineseCurrency);
}
// 转换备注
if (cashCollection.getRemark() != null && !cashCollection.getRemark().isEmpty()) {
String chineseRemark = translationService.findChineseSimplifiedByTranslation(
cashCollection.getRemark(), languageCode);
cashCollection.setRemark(chineseRemark);
}
// 转换拒绝理由
if (cashCollection.getRejectReason() != null && !cashCollection.getRejectReason().isEmpty()) {
String chineseRejectReason = translationService.findChineseSimplifiedByTranslation(
cashCollection.getRejectReason(), languageCode);
cashCollection.setRejectReason(chineseRejectReason);
}
// 转换提交人地区
if (cashCollection.getSubmitterMarket() != null && !cashCollection.getSubmitterMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
cashCollection.getSubmitterMarket(), languageCode);
cashCollection.setSubmitterMarket(chineseMarket);
}
}
}
/**
* 将业绩归属条件中的翻译字段转换为中文简体
*/
private void convertPerformanceTranslatedFieldsToChinese(PerformanceVO performanceVO, String languageCode) {
if (performanceVO != null) {
// 翻译地区
if (performanceVO.getMarketName() != null && !performanceVO.getMarketName().isEmpty()) {
String chineseMarketName = translationService.findChineseSimplifiedByTranslation(
performanceVO.getMarketName(), languageCode);
performanceVO.setMarketName(chineseMarketName);
}
// 翻译付款币种
if (performanceVO.getPaymentCurrency() != null && !performanceVO.getPaymentCurrency().isEmpty()) {
String chinesePaymentCurrency = translationService.findChineseSimplifiedByTranslation(
performanceVO.getPaymentCurrency(), languageCode);
performanceVO.setPaymentCurrency(chinesePaymentCurrency);
}
// 翻译到账币种
if (performanceVO.getReceivedCurrency() != null && !performanceVO.getReceivedCurrency().isEmpty()) {
String chineseReceivedCurrency = translationService.findChineseSimplifiedByTranslation(
performanceVO.getReceivedCurrency(), languageCode);
performanceVO.setReceivedCurrency(chineseReceivedCurrency);
@PostMapping("/exportUserWallet")
public Result exportUserWallet(@Valid @RequestBody UserWalletDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) {
String lockKey = "export:lock:" + dto.getToken();
String requestId = UUID.randomUUID().toString();
long expireTime = 5000;
dto.setLang(lang);// 设置语言参数
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportUserWallet(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
/**
* 将资金流水账中的翻译字段转换为中文简体
*/
private void convertFundsTranslatedFieldsToChinese(FundsDTO fundsDTO, String languageCode) {
if (fundsDTO != null) {
// 翻译地区
if (fundsDTO.getMarketName() != null && !fundsDTO.getMarketName().isEmpty()) {
String chineseMarketName = translationService.findChineseSimplifiedByTranslation(
fundsDTO.getMarketName(), languageCode);
fundsDTO.setMarketName(chineseMarketName);
}
// 翻译付款币种
if (fundsDTO.getPaymentCurrencyName() != null && !fundsDTO.getPaymentCurrencyName().isEmpty()) {
String chinesePaymentCurrency = translationService.findChineseSimplifiedByTranslation(
fundsDTO.getPaymentCurrencyName(), languageCode);
fundsDTO.setPaymentCurrencyName(chinesePaymentCurrency);
}
// 翻译到账币种
if (fundsDTO.getReceivedCurrencyName() != null && !fundsDTO.getReceivedCurrencyName().isEmpty()) {
String chineseReceivedCurrency = translationService.findChineseSimplifiedByTranslation(
fundsDTO.getReceivedCurrencyName(), languageCode);
fundsDTO.setReceivedCurrencyName(chineseReceivedCurrency);
}
}
}
}

30
src/main/java/com/example/demo/domain/DTO/UserWalletDTO.java

@ -0,0 +1,30 @@
package com.example.demo.domain.DTO;
import com.example.demo.domain.entity.UserWalletRecord;
import com.example.demo.domain.vo.cash.UserWalletRecordVO;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
// 用户钱包明细导出
@Data
public class UserWalletDTO {
private String token;
private String url = "";
private String fileName = "";
private Integer sort = 0;
private String field = "";
private Integer account;
private Integer type = 16; //类型
private Integer state = 0; //状态
private String text = ""; //关键词搜索
private Integer dataNum = 0;
private String deptid = "";
private String lang;
private UserWalletRecordVO userWalletRecordVO;
private UserWalletRecord userWalletRecord;
@NotNull(message = "page不能为空")
private Integer page = 1;
@NotNull(message = "pageSize不能为空")
private Integer pageSize = 20;
}

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

@ -47,6 +47,7 @@ public class CashCollection implements Serializable {
private String numUnit; //数量单位 //
private Integer permanentGold; // 永久金币数量
private Integer freeGold; // 免费金币数量
@ExcelIgnore
private Integer walletId; // 钱包 ID
private String paymentCurrency; // 付款币种
private BigDecimal paymentAmount; // 付款金额

12
src/main/java/com/example/demo/domain/vo/cash/UserWalletRecordVO.java

@ -1,5 +1,7 @@
package com.example.demo.domain.vo.cash;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -11,19 +13,25 @@ import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
public class UserWalletRecordVO {
@ExcelIgnore
private Integer id; // 明细 ID
private Integer jwcode; // 精网号
private String userName; // 用户名
@ExcelIgnore
private String market; // 地区 ID
private String marketName; // 地区名称
@ExcelIgnore
private Integer walletId; // 钱包 ID
private String walletName; // 钱包名称
@ExcelIgnore
private Integer type; // 交易类型0=充值1=消耗2=退款
private String typeText; // 交易类型文本多语言
private Integer amount; // 交易金额
private String orderCode; // 交易单号
private String description; // 交易说明
@ExcelIgnore
private Integer status; // 状态0=正常1=已退款
private Date createTime; // 创建时间
private String typeText; // 交易类型文本多语言
private String statusText; // 状态文本多语言
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 创建时间
}

2
src/main/java/com/example/demo/domain/vo/coin/Page.java

@ -2,6 +2,7 @@ package com.example.demo.domain.vo.coin;
import com.example.demo.domain.DTO.BeanConsumeCartDTO;
import com.example.demo.domain.DTO.PerformanceDTO;
import com.example.demo.domain.DTO.UserWalletDTO;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.entity.UserWalletRecord;
import com.example.demo.domain.vo.bean.*;
@ -57,5 +58,6 @@ public class Page {
private PerformanceDTO performanceDTO;//业绩归属
private FundsDTO fundsDTO;//现金收款
private PerformanceVO performanceVO;//业绩归属
private UserWalletDTO userWalletDTO; //用户钱包明细查询条件
private UserWalletRecord userWalletRecord; //用户钱包明细查询条件
}

1
src/main/java/com/example/demo/service/coin/ExportExcelService.java

@ -27,6 +27,7 @@ public interface ExportExcelService {
Exception FanExcel(String message) throws Exception;
Exception ArticleExcel(String message) throws Exception;
Exception PerformanceExcel(String message) throws Exception;
Exception UserWalletRecordExcel(String message) throws Exception;
List<Export> getExcel(Export export);
Exception BeanExcel(String message) throws Exception;

27
src/main/java/com/example/demo/service/listen/UserWalletRecordListener.java

@ -0,0 +1,27 @@
package com.example.demo.service.listen;
import com.example.demo.Util.RedisUtil;
import com.example.demo.service.coin.ExportExcelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class UserWalletRecordListener extends BaseMessageListener<String>{
@Autowired
private ExportExcelService exportExcelService;
protected UserWalletRecordListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil,"user_wallet_record:queue:export_queue");
}
@Override
protected void handleMessage(String message) {
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.UserWalletRecordExcel(message);
} catch (Exception e) {
handleException(e, message);
}
}
}

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

@ -17,15 +17,13 @@ import com.example.demo.controller.coin.GoldDetailController;
import com.example.demo.controller.coin.RechargeController;
import com.example.demo.controller.coin.RefundController;
import com.example.demo.domain.DTO.PerformanceDTO;
import com.example.demo.domain.DTO.UserWalletDTO;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.Export;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.FundsDTO;
import com.example.demo.domain.vo.cash.PerformanceVO;
import com.example.demo.domain.vo.cash.*;
import com.example.demo.domain.vo.coin.*;
import com.example.demo.mapper.coin.ExportMapper;
@ -499,6 +497,36 @@ public class ExportExcelServiceImpl implements ExportExcelService {
});
}
@Transactional
@Override
public Exception UserWalletRecordExcel(String message) throws Exception {
return exportExcelGeneric(message, "userWalletRecord", page -> {
try {
JsonNode rootNode = objectMapper.readTree(message);
JsonNode requestDataNode = rootNode.path("requestData");
JsonNode userWalletRecordVONode = requestDataNode.path("userWalletRecordVO");
com.example.demo.domain.vo.cash.UserWalletRecordVO userWalletRecordVO =
objectMapper.treeToValue(userWalletRecordVONode, com.example.demo.domain.vo.cash.UserWalletRecordVO.class);
com.example.demo.domain.entity.UserWalletRecord userWalletRecord = new com.example.demo.domain.entity.UserWalletRecord();
if (userWalletRecordVO != null) {
userWalletRecord.setJwcode(userWalletRecordVO.getJwcode());
userWalletRecord.setWalletId(userWalletRecordVO.getWalletId());
}
page.setUserWalletRecord(userWalletRecord);
// 从请求数据中获取语言设置如果没有则使用默认值
String lang = "zh_CN";
JsonNode langNode = rootNode.path("lang");
if (langNode != null && !langNode.asText().isEmpty()) {
lang = langNode.asText();
}
return cashCollectionController.selectWalletRecords(page, lang);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
@Override
public List<Export> getExcel(Export export) {
List<Export> list = exportMapper.getExportRecord(export.getAccount(),export.getType());
@ -849,6 +877,26 @@ public class ExportExcelServiceImpl implements ExportExcelService {
.head(head)
.build();
}
// 如果是钱包明细表添加动态表头处理器
else if ("userWalletRecord".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getUserWalletHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getUserWalletColumnOrder();
// 构建自定义表头
List<List<String>> head = new ArrayList<>();
for (String fieldName : columnOrder) {
String headerText = headers.get(fieldName);
if (headerText != null) {
List<String> headItems = new ArrayList<>();
headItems.add(headerText);
head.add(headItems);
}
}
writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head)
.build();
}
else {
writeSheet = EasyExcel.writerSheet("Sheet1").build();
}
@ -964,6 +1012,11 @@ public class ExportExcelServiceImpl implements ExportExcelService {
translateFundsList((List<FundsDTO>) list, lang);
}
// 添加钱包明细翻译支持
if ("userWalletRecord".equals(exportType) && list.get(0) instanceof UserWalletRecordVO) {
translateUserWalletRecordList((List<UserWalletRecordVO>) list, lang);
}
excelWriter.write(list, writeSheet);
page.setPageNum(page.getPageNum() + 1);
totalCount += list.size();
@ -1116,6 +1169,8 @@ public class ExportExcelServiceImpl implements ExportExcelService {
return PerformanceVO.class;
case "fundUser":
return FundsDTO.class;
case "userWalletRecord":
return UserWalletRecordVO.class;
default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType);
}
@ -1207,6 +1262,10 @@ public class ExportExcelServiceImpl implements ExportExcelService {
String modelDesc = convertRefundModelToString(cashRecord.getRefundModel());
cashRecord.setRefundModelDesc(modelDesc);
}
if (cashRecord.getStatus() != null) {
String statusDesc = getStatusDescription(cashRecord.getStatus());
cashRecord.setStatusDesc(statusDesc);
}
}
}
}
@ -1855,4 +1914,34 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}
}
}
/**
* 翻译钱包明细列表
*/
private void translateUserWalletRecordList(List<UserWalletRecordVO> list, String lang) {
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) {
return;
}
for (UserWalletRecordVO item : list) {
// 翻译所属地区名称
if (item.getMarketName() != null && !item.getMarketName().isEmpty()) {
item.setMarketName(languageTranslationUtil.translate(item.getMarketName(), lang));
}
// 翻译钱包名称
if (item.getWalletName() != null && !item.getWalletName().isEmpty()) {
item.setWalletName(languageTranslationUtil.translate(item.getWalletName(), lang));
}
// 翻译交易类型
if (item.getTypeText() != null && !item.getTypeText().isEmpty()) {
item.setTypeText(languageTranslationUtil.translate(item.getTypeText(), lang));
}
// 翻译状态
if (item.getStatusText() != null && !item.getStatusText().isEmpty()) {
item.setStatusText(languageTranslationUtil.translate(item.getStatusText(), lang));
}
// 翻译交易说明
if (item.getDescription() != null && !item.getDescription().isEmpty()) {
item.setDescription(languageTranslationUtil.translate(item.getDescription(), lang));
}
}
}
}
Loading…
Cancel
Save