Browse Source

Merge remote-tracking branch 'origin/milestone-20260113-现金管理0109' into milestone-20260113-现金管理0109

# Conflicts:
#	src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java
lijianlin/feature-20260113-现金管理0109
sunjiabei 1 month ago
parent
commit
a36ea85576
  1. 2
      src/main/java/com/example/demo/Export/ExportService.java
  2. 22
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  3. 36
      src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java
  4. 83
      src/main/java/com/example/demo/controller/cash/CashCollectionController.java
  5. 6
      src/main/java/com/example/demo/controller/cash/CashRefundController.java
  6. 57
      src/main/java/com/example/demo/controller/coin/ExportController.java
  7. 2
      src/main/java/com/example/demo/controller/coin/UserController.java
  8. 12
      src/main/java/com/example/demo/domain/DTO/PerformanceDTO.java
  9. 51
      src/main/java/com/example/demo/domain/vo/cash/FundsDTO.java
  10. 2
      src/main/java/com/example/demo/domain/vo/cash/PerformanceVO.java
  11. 4
      src/main/java/com/example/demo/domain/vo/coin/Page.java
  12. 1
      src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java
  13. 4
      src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java
  14. 4
      src/main/java/com/example/demo/service/cash/CashCollectionService.java
  15. 4
      src/main/java/com/example/demo/service/cash/RefundService.java
  16. 1
      src/main/java/com/example/demo/service/coin/ExportExcelService.java
  17. 2
      src/main/java/com/example/demo/service/coin/UserService.java
  18. 27
      src/main/java/com/example/demo/service/listen/PerformanceListener.java
  19. 6
      src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java
  20. 52
      src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java
  21. 81
      src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java
  22. 96
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  23. 27
      src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java
  24. 56
      src/main/resources/cashMapper/CashRefundMapper.xml
  25. 6
      src/main/resources/mapper/AuditMapper.xml

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

@ -32,4 +32,6 @@ public interface ExportService {
Result addExportFinance(FinanceDTO dto); Result addExportFinance(FinanceDTO dto);
Result addExportCash(CashDTO dto); Result addExportCash(CashDTO dto);
//业绩归属导出
Result addExportPerformance(PerformanceDTO dto);
} }

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

@ -138,6 +138,11 @@ public class ExportServiceImpl implements ExportService {
cashDTO.setUrl(""); cashDTO.setUrl("");
cashDTO.setFileName(generateFileName("现金收款明细", adminName, lang)); cashDTO.setFileName(generateFileName("现金收款明细", adminName, lang));
cashDTO.setDataNum(0); cashDTO.setDataNum(0);
} else if(dto instanceof PerformanceDTO performanceDTO){
performanceDTO.setAccount(Integer.valueOf(account));
performanceDTO.setUrl("");
performanceDTO.setFileName(generateFileName("业绩归属明细", adminName, lang));
performanceDTO.setDataNum(0);
} }
} }
@ -245,6 +250,16 @@ public class ExportServiceImpl implements ExportService {
cashDTO.getFileName(), cashDTO.getFileName(),
cashDTO.getDataNum() cashDTO.getDataNum()
); );
}else if (dto instanceof PerformanceDTO performanceDTO){
goldDetailMapper.insertExportRecord(
idHolder,
account,
performanceDTO.getType(),
performanceDTO.getState(),
performanceDTO.getUrl(),
performanceDTO.getFileName(),
performanceDTO.getDataNum()
);
} }
} }
@ -278,6 +293,8 @@ public class ExportServiceImpl implements ExportService {
requestData.put(requestDataKey, financeDTO.getCashRecordDTO()); requestData.put(requestDataKey, financeDTO.getCashRecordDTO());
}else if (dto instanceof CashDTO cashDTO){ }else if (dto instanceof CashDTO cashDTO){
requestData.put(requestDataKey, cashDTO.getCashCollection()); requestData.put(requestDataKey, cashDTO.getCashCollection());
}else if (dto instanceof PerformanceDTO performanceDTO){
requestData.put(requestDataKey, performanceDTO.getPerformanceVO());
} }
exportData.put("requestData", requestData); exportData.put("requestData", requestData);
@ -345,4 +362,9 @@ public class ExportServiceImpl implements ExportService {
public Result addExportCash(CashDTO dto) { public Result addExportCash(CashDTO dto) {
return addExport(dto, "现金收款明细", "cash:queue:export_queue", "cashCollection", dto.getLang()); return addExport(dto, "现金收款明细", "cash:queue:export_queue", "cashCollection", dto.getLang());
} }
@Override
public Result addExportPerformance(PerformanceDTO dto) {
return addExport(dto, "业绩明细", "performance:queue:export_queue", "performanceVO", dto.getLang());
}
} }

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

@ -513,6 +513,42 @@ public class ExcelHeaderTranslator {
} }
/** /**
* 获取业绩归属的Excel表头映射
* 返回 Map<字段名, 中文表头>
*/
public Map<String, String> getPerformanceHeaders(String lang) {
Map<String, String> headers = new LinkedHashMap<>();
// 定义所有表头的原始中文名称对应 PerformanceVO 类的字段
headers.put("jwcode", "精网号");
headers.put("name", "姓名");
headers.put("marketName", "所属地区");
headers.put("orderCode", "金币订单号");
headers.put("paymentCurrency", "付款币种");
headers.put("paymentAmount", "付款金额");
headers.put("receivedCurrency", "到账币种");
headers.put("receivedAmount", "到账金额");
headers.put("handlingCharge", "手续费");
// 如果需要翻译则翻译表头
if (!isChineseLanguage(lang)) {
return translateHeaders(headers, lang);
}
return headers;
}
/**
* 获取业绩归属表头顺序
*/
public List<String> getPerformanceColumnOrder() {
return Arrays.asList(
"jwcode", "name", "marketName", "orderCode", "paymentCurrency", "paymentAmount",
"receivedCurrency", "receivedAmount", "handlingCharge"
);
}
/**
* 翻译表头 * 翻译表头
*/ */
private Map<String, String> translateHeaders(Map<String, String> headers, String lang) { private Map<String, String> translateHeaders(Map<String, String> headers, String lang) {

83
src/main/java/com/example/demo/controller/cash/CashCollectionController.java

@ -8,6 +8,7 @@ import com.example.demo.domain.entity.CashRecord;
import com.example.demo.domain.entity.RechargeActivity; import com.example.demo.domain.entity.RechargeActivity;
import com.example.demo.domain.entity.User; import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.PerformanceVO;
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.cash.CashCollectionService; import com.example.demo.service.cash.CashCollectionService;
@ -275,16 +276,34 @@ public class CashCollectionController {
//根据id查询收款订单 //根据id查询收款订单
@PostMapping("/performanceSelect") @PostMapping("/performanceSelect")
public Result performanceSelect(@RequestBody Page page) {
public Result performanceSelect(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) {
try { try {
return Result.success(cashCollectionService.performanceSelect(page.getPageNum(),page.getPageSize(),page.getPerformanceDTO()));
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedPerformanceFieldsToChinese(page.getPerformanceVO(), languageCode);
}
Result result = Result.success(cashCollectionService.performanceSelect(page.getPageNum(), page.getPageSize(), page.getPerformanceVO()));
// 对返回结果进行多语言转换
if (result.getCode() == 200 && result.getData() instanceof PageInfo) {
PageInfo<PerformanceVO> pageInfo = (PageInfo<PerformanceVO>) result.getData();
translatePerformanceVOs(pageInfo, lang);
}
return result;
} catch (Exception e) { } catch (Exception e) {
// 推送异常到飞书核心调用工具类 // 推送异常到飞书核心调用工具类
System.out.println(e.getMessage()); System.out.println(e.getMessage());
String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
throw new SecurityException(); throw new SecurityException();
} }
} }
/** /**
* 转换现金收款订单的多语言字段 * 转换现金收款订单的多语言字段
*/ */
@ -325,6 +344,37 @@ public class CashCollectionController {
} }
/** /**
* 转换绩效数据的多语言字段
*/
private void translatePerformanceVOs(PageInfo<PerformanceVO> pageInfo, String lang) {
if (pageInfo != null && pageInfo.getList() != null) {
for (PerformanceVO performance : pageInfo.getList()) {
translateSinglePerformanceVO(performance, lang);
}
}
}
/**
* 转换单个绩效数据的多语言字段
*/
private void translateSinglePerformanceVO(PerformanceVO performance, String lang) {
if (performance != null) {
// 翻译市场名称
if (performance.getMarketName() != null) {
performance.setMarketName(languageTranslationUtil.translate(performance.getMarketName(), lang));
}
// 翻译支付币种
if (performance.getPaymentCurrency() != null) {
performance.setPaymentCurrency(languageTranslationUtil.translate(performance.getPaymentCurrency(), lang));
}
// 翻译到账币种
if (performance.getReceivedCurrency() != null) {
performance.setReceivedCurrency(languageTranslationUtil.translate(performance.getReceivedCurrency(), lang));
}
}
}
/**
* 解析语言代码 * 解析语言代码
*/ */
private String parseLanguageCode(String langHeader) { private String parseLanguageCode(String langHeader) {
@ -433,4 +483,33 @@ public class CashCollectionController {
} }
} }
} }
/**
* 将绩效查询条件中的翻译字段转换为中文简体
*/
private void convertTranslatedPerformanceFieldsToChinese(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);
}
}
}
} }

6
src/main/java/com/example/demo/controller/cash/CashRefundController.java

@ -401,6 +401,12 @@ public class CashRefundController {
return Result.success(msg); return Result.success(msg);
} }
@PostMapping("/funds")
public Result funds(@RequestBody Page page){
refundService.funds(page.getPageNum(), page.getPageSize(), page.getFundsDTO());
return Result.success(refundService.funds(page.getPageNum(), page.getPageSize(), page.getFundsDTO()));
}
/** /**
* 辅助方法获取用户真实IP处理反向代理/负载均衡场景 * 辅助方法获取用户真实IP处理反向代理/负载均衡场景
*/ */

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

@ -11,12 +11,12 @@ import com.example.demo.domain.DTO.CashDTO;
import com.example.demo.domain.vo.bean.*; import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.CashRecordDTO; import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.PerformanceVO;
import com.example.demo.domain.vo.coin.ConsumeUser; import com.example.demo.domain.vo.coin.ConsumeUser;
import com.example.demo.domain.vo.coin.RechargeUser; import com.example.demo.domain.vo.coin.RechargeUser;
import com.example.demo.domain.vo.coin.RefundUser; 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.Export.ExportService; import com.example.demo.Export.ExportService;
import com.example.demo.service.coin.TranslationService; import com.example.demo.service.coin.TranslationService;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
@ -370,6 +370,35 @@ public class ExportController {
} }
} }
@PostMapping("/exportPerformance")
public Result exportPerformance(@Valid @RequestBody PerformanceDTO 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)) {
convertPerformanceTranslatedFieldsToChinese(dto.getPerformanceVO(), languageCode);
}
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
String errorMsg = languageTranslationUtil.translate("操作太频繁,请稍后重试", lang);
throw new BusinessException(errorMsg);
}
// 执行业务逻辑
return exportService.addExportPerformance(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
/** /**
* 解析语言代码 * 解析语言代码
*/ */
@ -724,4 +753,30 @@ public class ExportController {
} }
} }
} }
/**
* 将业绩归属条件中的翻译字段转换为中文简体
*/
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);
}
}
}
} }

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

@ -50,7 +50,7 @@ public class UserController {
convertTranslatedFieldsToChinese(user, languageCode); convertTranslatedFieldsToChinese(user, languageCode);
} }
Result result = userService.selectUser(user.getJwcode().toString());
Result result = userService.selectUser(user.getJwcode().toString(),lang);
// 对返回结果进行多语言转换 // 对返回结果进行多语言转换
if (result.getCode() == 200 && result.getData() instanceof GoldUser) { if (result.getCode() == 200 && result.getData() instanceof GoldUser) {
GoldUser goldUser = (GoldUser) result.getData(); GoldUser goldUser = (GoldUser) result.getData();

12
src/main/java/com/example/demo/domain/DTO/PerformanceDTO.java

@ -1,5 +1,6 @@
package com.example.demo.domain.DTO; package com.example.demo.domain.DTO;
import com.example.demo.domain.vo.cash.PerformanceVO;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
@ -18,6 +19,14 @@ import java.util.List;
@Data @Data
public class PerformanceDTO { public class PerformanceDTO {
private String token;
private Integer account;
private String url = "";
private String fileName = "";
private Integer dataNum = 0;
private Integer type = 14; //类型
private Integer state = 0; //状态
List<String> adminMarket; List<String> adminMarket;
String jwcode; String jwcode;
List<String> customerMarket; List<String> customerMarket;
@ -25,5 +34,6 @@ public class PerformanceDTO {
private Date startTime; // 支付时间 private Date startTime; // 支付时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 支付时间 private Date endTime; // 支付时间
private String lang;
private PerformanceVO performanceVO;
} }

51
src/main/java/com/example/demo/domain/vo/cash/FundsDTO.java

@ -0,0 +1,51 @@
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;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @program: GOLD
* @ClassName FundsDTO
* @description:
* @author: huangqizhen
* @create: 202601-15 09:21
* @Version 1.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FundsDTO {
private Integer id;
private Integer jwcode;
private String name;
private String market;
private List<String> markets;
private String orderCode;
private String paymentCurrency;
private BigDecimal paymentAmount;
private String receivedCurrency;
private BigDecimal receivedAmount;
private BigDecimal handlingCharge;
private String payType;
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date payTime;
private Integer status;
private List<Integer> statuses;
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startTime;
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime;
private String refundCurrency;
private BigDecimal refundAmount;
private Integer relatedId;
}

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

@ -25,7 +25,7 @@ public class PerformanceVO {
private Integer jwcode; // 精网号 private Integer jwcode; // 精网号
private String name; // 姓名 private String name; // 姓名
@ExcelIgnore @ExcelIgnore
private String market; // 所属地区
private Integer market; // 所属地区
private String marketName; // 所属地区 private String marketName; // 所属地区
private String orderCode; // 金币订单号 private String orderCode; // 金币订单号
private String paymentCurrency; // 付款币种 private String paymentCurrency; // 付款币种

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

@ -7,6 +7,8 @@ import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.CashRecordDTO; import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.domain.vo.cash.CashRecordDone;
import com.example.demo.domain.vo.cash.PerformanceVO;
import com.example.demo.domain.vo.cash.FundsDTO;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -52,5 +54,7 @@ public class Page {
private RechargeActivity rechargeActivity; //充值活动 private RechargeActivity rechargeActivity; //充值活动
private CashRecordDTO cashRecordDTO; private CashRecordDTO cashRecordDTO;
private PerformanceDTO performanceDTO;//业绩归属 private PerformanceDTO performanceDTO;//业绩归属
private FundsDTO fundsDTO;//现金收款
private PerformanceVO performanceVO;//业绩归属
} }

1
src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java

@ -71,6 +71,7 @@ public interface CashCollectionMapper {
@Param("auditId") Integer auditId, @Param("auditId") Integer auditId,
@Param("version") Integer version); @Param("version") Integer version);
List<PerformanceVO> performanceSelect(PerformanceVO performanceDTO);
List<PerformanceVO> performanceSelect(PerformanceDTO performanceDTO); List<PerformanceVO> performanceSelect(PerformanceDTO performanceDTO);

4
src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java

@ -38,4 +38,8 @@ public interface CashRefundMapper {
List<LhlAudit> getAuditBatch(Set<Integer> auditIds); List<LhlAudit> getAuditBatch(Set<Integer> auditIds);
//根据id查订单信息 //根据id查订单信息
CashRecordDTO selectById(Integer id); CashRecordDTO selectById(Integer id);
List<FundsDTO> selectfunds(FundsDTO fundsDTO);
List<FundsDTO> selectRefundCount(List<Integer> needQueryIds);
} }

4
src/main/java/com/example/demo/service/cash/CashCollectionService.java

@ -1,13 +1,11 @@
package com.example.demo.service.cash; package com.example.demo.service.cash;
import com.example.demo.domain.DTO.PerformanceDTO;
import com.example.demo.domain.entity.CashRecord; import com.example.demo.domain.entity.CashRecord;
import com.example.demo.domain.entity.GOrder; import com.example.demo.domain.entity.GOrder;
import com.example.demo.domain.entity.RechargeActivity; import com.example.demo.domain.entity.RechargeActivity;
import com.example.demo.domain.entity.User; import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.PerformanceVO; import com.example.demo.domain.vo.cash.PerformanceVO;
import com.example.demo.domain.vo.coin.Result;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import java.util.List; import java.util.List;
@ -47,6 +45,6 @@ public interface CashCollectionService {
//同步事务方法 //同步事务方法
void processBatch(List<GOrder> gOrders); void processBatch(List<GOrder> gOrders);
PageInfo<PerformanceVO> performanceSelect(Integer pageNum, Integer pageSize, PerformanceDTO performanceDTO);
PageInfo<PerformanceVO> performanceSelect(Integer pageNum, Integer pageSize, PerformanceVO performanceDTO);
} }

4
src/main/java/com/example/demo/service/cash/RefundService.java

@ -3,7 +3,7 @@ package com.example.demo.service.cash;
import com.example.demo.domain.vo.cash.CashRecordDTO; import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.domain.vo.cash.CashRecordDone;
import com.example.demo.domain.vo.cash.CashRecordRefund; import com.example.demo.domain.vo.cash.CashRecordRefund;
import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.cash.FundsDTO;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
/** /**
@ -36,4 +36,6 @@ public interface RefundService {
PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO); PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO);
//新增线上退款记录 //新增线上退款记录
void addOnline(CashRecordRefund cashRecordRefund); void addOnline(CashRecordRefund cashRecordRefund);
PageInfo<FundsDTO> funds(Integer pageNum, Integer pageSize, FundsDTO fundsDTO);
} }

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

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

2
src/main/java/com/example/demo/service/coin/UserService.java

@ -17,7 +17,7 @@ import com.example.demo.domain.vo.coin.Result;
public interface UserService { public interface UserService {
//查找用户部分信息 //查找用户部分信息
Result selectUser(String jwcode);
Result selectUser(String jwcode,String lang);
//查找用户金币 //查找用户金币
GoldUser selectgold(String jwcode); GoldUser selectgold(String jwcode);

27
src/main/java/com/example/demo/service/listen/PerformanceListener.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 PerformanceListener extends BaseMessageListener<String>{
@Autowired
private ExportExcelService exportExcelService;
protected PerformanceListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil,"performance:queue:export_queue");
}
@Override
protected void handleMessage(String message) {
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.PerformanceExcel(message);
} catch (Exception e) {
handleException(e, message);
}
}
}

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

@ -3,14 +3,12 @@ package com.example.demo.serviceImpl.cash;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil; import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.config.RabbitMQConfig; import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.DTO.PerformanceDTO;
import com.example.demo.domain.entity.*; import com.example.demo.domain.entity.*;
import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.CashCollectionMessage; import com.example.demo.domain.vo.cash.CashCollectionMessage;
import com.example.demo.domain.vo.cash.PerformanceVO; import com.example.demo.domain.vo.cash.PerformanceVO;
import com.example.demo.domain.vo.coin.GoldUser; import com.example.demo.domain.vo.coin.GoldUser;
import com.example.demo.domain.vo.coin.Messages; import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.cash.CashCollectionMapper; import com.example.demo.mapper.cash.CashCollectionMapper;
import com.example.demo.mapper.coin.MarketMapper; import com.example.demo.mapper.coin.MarketMapper;
import com.example.demo.mapper.coin.UserMapper; import com.example.demo.mapper.coin.UserMapper;
@ -516,9 +514,9 @@ public User getNameAndMarket(Integer jwcode) {
//多条件查询收款订单列表 //多条件查询收款订单列表
@Override @Override
public PageInfo<PerformanceVO> performanceSelect(Integer pageNum, Integer pageSize, PerformanceDTO performanceDTO) {
public PageInfo<PerformanceVO> performanceSelect(Integer pageNum, Integer pageSize, PerformanceVO performanceVO) {
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
List<PerformanceVO> performanceVOs = cashCollectionMapper.performanceSelect(performanceDTO);
List<PerformanceVO> performanceVOs = cashCollectionMapper.performanceSelect(performanceVO);
return new PageInfo<>(performanceVOs); return new PageInfo<>(performanceVOs);
} }

52
src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java

@ -579,4 +579,56 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
cashRefundMapper.updateStatus(cashRecordDone1); cashRefundMapper.updateStatus(cashRecordDone1);
else throw new SystemException("提交失败") ; else throw new SystemException("提交失败") ;
} }
@Override
public PageInfo<FundsDTO> funds(Integer pageNum, Integer pageSize, FundsDTO fundsDTO) {
// 1. 分页查询主数据
PageHelper.startPage(pageNum, pageSize);
if(fundsDTO.getStatuses()==null||fundsDTO.getStatuses().isEmpty()){
List<Integer> list_a = Arrays.asList(4,6);
fundsDTO.setStatuses(list_a);
}
List<FundsDTO> list = cashRefundMapper.selectfunds(fundsDTO);
// 2. 收集 status == 6 的记录 ID注意status int
List<Integer> needQueryIds = new ArrayList<>();
for (FundsDTO dto : list) {
if (dto.getStatus() != null && dto.getStatus()==6) {
needQueryIds.add(dto.getId());
}
}
// 3. 批量查询额外信息关键必须有返回对象的方法
if (!needQueryIds.isEmpty()) {
// 👇 请替换为你的实际 Mapper 方法返回 List<RefundDetailDTO>
List<FundsDTO> detailList = cashRefundMapper.selectRefundCount(needQueryIds);
// 4. 构建 HashMap: id -> RefundDetailDTO
Map<Integer, FundsDTO> detailMap = new HashMap<>();
for (FundsDTO detail : detailList) {
detailMap.put(detail.getRelatedId(), detail); // 假设 detail getId()
}
// 5. 回填到账金额和到账币种
for (FundsDTO dto : list) {
if (dto.getStatus() != null && dto.getStatus()==6) {
FundsDTO detail = detailMap.get(dto.getId());
if (detail != null) {
// 将到账金额转为负数正数 负数
BigDecimal amount = detail.getRefundAmount();
if (amount != null) {
dto.setRefundAmount(amount.negate()); // 👈 关键取负数
} else {
dto.setRefundAmount(null); // 或设为 BigDecimal.ZERO根据业务需求
}
// 币种保持不变
dto.setRefundCurrency(detail.getRefundCurrency());
}
}
}
}
return new PageInfo<>(list);
}
} }

81
src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java

@ -198,6 +198,70 @@ public class AuditServiceImpl implements AuditService {
//erp增加退款数据 //erp增加退款数据
if(oldOrder.getType()==1){ if(oldOrder.getType()==1){
int type = 2; int type = 2;
//额外扣金币抵扣红包
if (order.getAuditStatus()==4){
// 检查用户余额是否足够抵扣红包差额
if (price.add(order.getRedDiff()).compareTo(userNow.getNowSumGold()) > 0) {
log.error("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}",
order.getRedDiff(), userNow.getNowSumGold());
throw new IllegalArgumentException("用户余额不足,无法抵扣红包");
}
ConsumeUser consumeUser = new ConsumeUser();
// 1. 先扣除免费金币
if (order.getRedDiff().compareTo(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember()))) <= 0) {
// 红包差额小于等于免费金币只扣免费金币
consumeUser.setJwcode(order.getJwcode());
consumeUser.setFreeGold(order.getRedDiff());
consumeUser.setPermanentGold(BigDecimal.ZERO);
consumeUser.setTaskGold(BigDecimal.ZERO);
} else {
// 2. 免费金币不足扣除免费+永久金币
BigDecimal remainingAfterFree = order.getRedDiff().subtract(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
if (remainingAfterFree.compareTo(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold()))) <= 0) {
consumeUser.setJwcode(order.getJwcode());
consumeUser.setFreeGold(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
consumeUser.setPermanentGold(remainingAfterFree);
consumeUser.setTaskGold(BigDecimal.ZERO);
} else {
// 3. 免费+永久金币仍不足扣除全部免费+永久+部分任务金币
BigDecimal remainingAfterPermanent = remainingAfterFree.subtract(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold())));
if (remainingAfterPermanent.compareTo(userNow.getNowTaskGold().add(BigDecimal.valueOf(order.getTaskGold()))) <= 0) {
consumeUser.setJwcode(order.getJwcode());
consumeUser.setFreeGold(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
consumeUser.setPermanentGold(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold())));
consumeUser.setTaskGold(remainingAfterPermanent);
} else {
throw new IllegalArgumentException("用户金币不足,无法抵扣红包");
}
}
}
consumeUser.setSumGold(order.getRedDiff());
consumeUser.setAdminId(order.getAdminId());
consumeUser.setRemark(order.getRemark());
consumeUser.setPrice(price);
// 执行金币抵扣红包
redService.updateRed(consumeUser);
//link扣除已有红包
redService.consumeRed(linkId);
}
//link扣除已有红包
else if (AuditContext.getRedCheckResult()!=null &&!AuditContext.getRedCheckResult().equals("old")){
redService.consumeRed(linkId);
}
else {
Exception e = new Exception("旧订单退款");
String title = "旧订单退款";
String detail= ("精网号:"+order.getJwcode())+"\n金币订单号:"+orderCode+"\n永久金币:"+Math.abs(order.getPermanentGold())/100+
"\n免费金币:"+Math.abs((order.getFreeJune()+order.getFreeDecember()))/100+"\n任务金币:"+Math.abs(order.getTaskGold())/100+
"\n退款类型:"+order.getRefundType()+"\n商品名:"+order.getGoodsName()+"\n备注:"+order.getRemark();
GlobalExceptionHandler.sendFeishuAlert(e, title, detail);
}
// 执行审核更新
redMapper.update(order.getJwcode(),type,price.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
if (order.getPermanentGold()!=0||order.getFreeJune()!=0||order.getFreeDecember()!=0||order.getTaskGold()!=0){ if (order.getPermanentGold()!=0||order.getFreeJune()!=0||order.getFreeDecember()!=0||order.getTaskGold()!=0){
GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费-商品 GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费-商品
(double) (order.getFreeDecember()+order.getFreeJune()) /100,SimpleIdGenerator.generateId(), (double) (order.getFreeDecember()+order.getFreeJune()) /100,SimpleIdGenerator.generateId(),
@ -213,21 +277,10 @@ public class AuditServiceImpl implements AuditService {
GoldTistV2.addCoinRecordNew(String.valueOf(order.getJwcode()), order.getRemark(),auditName,order.getGoodsName()); GoldTistV2.addCoinRecordNew(String.valueOf(order.getJwcode()), order.getRemark(),auditName,order.getGoodsName());
} }
//如果是旧订单发送报警
if (AuditContext.getRedCheckResult()!=null &&AuditContext.getRedCheckResult().equals("old")){
Exception e = new Exception("旧订单退款");
String title = "旧订单退款";
String detail= ("精网号:"+order.getJwcode())+"\n金币订单号:"+orderCode+"\n永久金币:"+Math.abs(order.getPermanentGold())/100+
"\n免费金币:"+Math.abs((order.getFreeJune()+order.getFreeDecember()))/100+"\n任务金币:"+Math.abs(order.getTaskGold())/100+
"\n退款类型:"+order.getRefundType()+"\n商品名:"+order.getGoodsName()+"\n备注:"+order.getRemark();
GlobalExceptionHandler.sendFeishuAlert(e, title, detail);
}
// 执行审核更新
redMapper.update(order.getJwcode(),type,price.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
}//金币充值退款 }//金币充值退款
else if (oldOrder.getType()==0){ else if (oldOrder.getType()==0){
//判断够不够扣 //判断够不够扣
if(userNow.getNowPermanentGold().compareTo(BigDecimal.valueOf(Math.abs(order.getPermanentGold()))) < 0 if(userNow.getNowPermanentGold().compareTo(BigDecimal.valueOf(Math.abs(order.getPermanentGold()))) < 0
|| userNow.getNowFreeGold().compareTo(BigDecimal.valueOf(Math.abs(order.getFreeDecember() + order.getFreeJune()))) < 0 || userNow.getNowFreeGold().compareTo(BigDecimal.valueOf(Math.abs(order.getFreeDecember() + order.getFreeJune()))) < 0
|| userNow.getNowTaskGold().compareTo(BigDecimal.valueOf(Math.abs(order.getTaskGold()))) < 0){ || userNow.getNowTaskGold().compareTo(BigDecimal.valueOf(Math.abs(order.getTaskGold()))) < 0){
@ -242,7 +295,7 @@ public class AuditServiceImpl implements AuditService {
// 检查用户余额是否足够抵扣红包差额 // 检查用户余额是否足够抵扣红包差额
if (order.getPrice().add(order.getRedDiff()).compareTo(userNow.getNowSumGold()) > 0) {
if (price.add(order.getRedDiff()).compareTo(userNow.getNowSumGold()) > 0) {
log.error("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}", log.error("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}",
order.getRedDiff(), userNow.getNowSumGold()); order.getRedDiff(), userNow.getNowSumGold());
throw new IllegalArgumentException("用户余额不足,无法抵扣红包"); throw new IllegalArgumentException("用户余额不足,无法抵扣红包");
@ -279,7 +332,7 @@ public class AuditServiceImpl implements AuditService {
consumeUser.setSumGold(order.getRedDiff()); consumeUser.setSumGold(order.getRedDiff());
consumeUser.setAdminId(order.getAdminId()); consumeUser.setAdminId(order.getAdminId());
consumeUser.setRemark(order.getRemark()); consumeUser.setRemark(order.getRemark());
consumeUser.setPrice(order.getPrice());
consumeUser.setPrice(price);
// 执行金币抵扣红包 // 执行金币抵扣红包
redService.updateRed(consumeUser); redService.updateRed(consumeUser);
//link扣除已有红包 //link扣除已有红包

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

@ -3,10 +3,7 @@ package com.example.demo.serviceImpl.coin;
import cn.hutool.log.AbstractLog; import cn.hutool.log.AbstractLog;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.example.demo.Util.ExcelHeaderTranslator; import com.example.demo.Util.ExcelHeaderTranslator;
import com.example.demo.Util.ExcelUploadUtil; import com.example.demo.Util.ExcelUploadUtil;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
@ -22,18 +19,15 @@ import com.example.demo.controller.coin.RefundController;
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.entity.User; import com.example.demo.domain.entity.User;
import com.example.demo.domain.export.Goldmingxi;
import com.example.demo.domain.vo.bean.*; import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashCollection;
import com.example.demo.domain.vo.cash.CashRecordDTO; import com.example.demo.domain.vo.cash.CashRecordDTO;
import com.example.demo.domain.vo.cash.PerformanceVO;
import com.example.demo.domain.vo.coin.*; import com.example.demo.domain.vo.coin.*;
import com.example.demo.mapper.cash.CashRefundMapper;
import com.example.demo.mapper.coin.ExportMapper; import com.example.demo.mapper.coin.ExportMapper;
import com.example.demo.service.cash.RefundService;
import com.example.demo.service.coin.ExportExcelService; import com.example.demo.service.coin.ExportExcelService;
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;
@ -42,19 +36,13 @@ import com.example.demo.service.coin.AiEmotionService;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.Finance;
import org.apache.xmlbeans.impl.xb.xsdschema.Attribute;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.*; import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
@ -239,6 +227,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}); });
} }
@Transactional
@Override @Override
public Exception LiveExcel(String message) throws Exception { public Exception LiveExcel(String message) throws Exception {
return exportExcelGeneric(message, "liveUser", page -> { return exportExcelGeneric(message, "liveUser", page -> {
@ -261,6 +250,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}); });
} }
@Transactional
@Override @Override
public Exception FanExcel(String message) throws Exception { public Exception FanExcel(String message) throws Exception {
return exportExcelGeneric(message, "fanUser", page -> { return exportExcelGeneric(message, "fanUser", page -> {
@ -283,6 +273,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}); });
} }
@Transactional
@Override @Override
public Exception ArticleExcel(String message) throws Exception { public Exception ArticleExcel(String message) throws Exception {
return exportExcelGeneric(message, "articleUser", page -> { return exportExcelGeneric(message, "articleUser", page -> {
@ -305,6 +296,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}); });
} }
@Transactional
@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 -> {
@ -327,6 +319,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}); });
} }
@Transactional
@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 -> {
@ -349,6 +342,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}); });
} }
@Transactional
@Override @Override
public Exception FinanceExcel(String message) throws Exception { public Exception FinanceExcel(String message) throws Exception {
return exportExcelGeneric(message, "financeUser", page -> { return exportExcelGeneric(message, "financeUser", page -> {
@ -371,6 +365,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}); });
} }
@Transactional
@Override @Override
public Exception CashExcel(String message) throws Exception { public Exception CashExcel(String message) throws Exception {
return exportExcelGeneric(message, "cashUser", page -> { return exportExcelGeneric(message, "cashUser", page -> {
@ -393,6 +388,29 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}); });
} }
@Transactional
@Override
public Exception PerformanceExcel(String message) throws Exception {
return exportExcelGeneric(message, "performanceUser", page -> {
try {
JsonNode rootNode = objectMapper.readTree(message);
JsonNode requestDataNode = rootNode.path("requestData");
JsonNode beanRechargeNode = requestDataNode.path("performanceVO");
PerformanceVO performanceVO = objectMapper.treeToValue(beanRechargeNode, PerformanceVO.class);
page.setPerformanceVO(performanceVO);
// 从请求数据中获取语言设置如果没有则使用默认值
String lang = "zh_CN";
JsonNode langNode = requestDataNode.path("lang");
if (langNode != null && !langNode.asText().isEmpty()) {
lang = langNode.asText();
}
return cashCollectionController.performanceSelect(page, lang);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
@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());
@ -702,6 +720,26 @@ public class ExportExcelServiceImpl implements ExportExcelService {
writeSheet = EasyExcel.writerSheet("Sheet1") writeSheet = EasyExcel.writerSheet("Sheet1")
.head(head) .head(head)
.build(); .build();
}
// 如果是业绩归属表添加动态表头处理器
else if ("performanceUser".equals(exportType)) {
Map<String, String> headers = excelHeaderTranslator.getPerformanceHeaders(lang);
List<String> columnOrder = excelHeaderTranslator.getPerformanceColumnOrder();
// 构建自定义表头
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 { } else {
writeSheet = EasyExcel.writerSheet("Sheet1").build(); writeSheet = EasyExcel.writerSheet("Sheet1").build();
} }
@ -804,6 +842,11 @@ public class ExportExcelServiceImpl implements ExportExcelService {
translateUserList((List<User>) list, lang); translateUserList((List<User>) list, lang);
} }
// 添加业绩归属翻译支持
if ("performanceUser".equals(exportType) && list.get(0) instanceof PerformanceVO) {
translatePerformanceList((List<PerformanceVO>) list, lang);
}
excelWriter.write(list, writeSheet); excelWriter.write(list, writeSheet);
page.setPageNum(page.getPageNum() + 1); page.setPageNum(page.getPageNum() + 1);
totalCount += list.size(); totalCount += list.size();
@ -952,6 +995,8 @@ public class ExportExcelServiceImpl implements ExportExcelService {
return CashRecordDTO.class; return CashRecordDTO.class;
case "cashUser": case "cashUser":
return CashCollection.class; return CashCollection.class;
case "performanceUser":
return PerformanceVO.class;
default: default:
throw new IllegalArgumentException("不支持的导出类型: " + exportType); throw new IllegalArgumentException("不支持的导出类型: " + exportType);
} }
@ -1516,4 +1561,29 @@ public class ExportExcelServiceImpl implements ExportExcelService {
} }
} }
} }
/**
* 翻译业绩归属列表
*/
private void translatePerformanceList(List<PerformanceVO> list, String lang) {
if (list == null || list.isEmpty() || "zh_CN".equalsIgnoreCase(lang) || "zh".equalsIgnoreCase(lang)) {
return;
}
for (PerformanceVO item : list) {
// 翻译所属地区名称
if (item.getMarketName() != null && !item.getMarketName().isEmpty()) {
item.setMarketName(languageTranslationUtil.translate(item.getMarketName(), lang));
}
// 翻译付款币种
if (item.getPaymentCurrency() != null && !item.getPaymentCurrency().isEmpty()) {
item.setPaymentCurrency(languageTranslationUtil.translate(item.getPaymentCurrency(), lang));
}
// 翻译到账币种
if (item.getReceivedCurrency() != null && !item.getReceivedCurrency().isEmpty()) {
item.setReceivedCurrency(languageTranslationUtil.translate(item.getReceivedCurrency(), lang));
}
}
}
} }

27
src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java

@ -1,6 +1,7 @@
package com.example.demo.serviceImpl.coin; package com.example.demo.serviceImpl.coin;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.User; import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.coin.Gold; import com.example.demo.domain.vo.coin.Gold;
@ -41,14 +42,17 @@ public class UserServiceImpl implements UserService {
private MarketMapper marketMapper; private MarketMapper marketMapper;
@Autowired @Autowired
private RedService redService; private RedService redService;
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
//查找用户部分信息 //查找用户部分信息
@Override @Override
public Result selectUser(String jwcode) {
public Result selectUser(String jwcode, String lang) { // 添加语言参数
// 检查用户是否存在 // 检查用户是否存在
int userCount = userMapper.checkUserExists(jwcode); int userCount = userMapper.checkUserExists(jwcode);
if (userCount == 0) { if (userCount == 0) {
return Result.error("精网号有误!请检查");
String errorMsg = languageTranslationUtil.translate("精网号有误!请检查", lang);
return Result.error(errorMsg);
} }
// 解token权限 // 解token权限
@ -85,20 +89,27 @@ public class UserServiceImpl implements UserService {
user.setRed(redSum); user.setRed(redSum);
return Result.success(user); return Result.success(user);
} else { } else {
// 无权限返回用户所属地区名称到 data
return Result.errorWithData("无权限访问",
java.util.Map.of("market", userMarketName != null ? userMarketName : userMarketId));
// 无权限返回用户所属地区名称到 data 翻译地区名称
String originalMarketName = userMarketName != null ? userMarketName : userMarketId;
String translatedMarketName = languageTranslationUtil.translate(originalMarketName, lang);
String errorMessage = languageTranslationUtil.translate("无权限访问", lang);
return Result.errorWithData(errorMessage,
java.util.Map.of("market", translatedMarketName));
} }
} else { } else {
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);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Result.error("精网号有误!请检查");
String errorMsg = languageTranslationUtil.translate("精网号有误!请检查", lang);
return Result.error(errorMsg);
} }
} }

56
src/main/resources/cashMapper/CashRefundMapper.xml

@ -415,6 +415,62 @@
from cash_record_refund crr from cash_record_refund crr
where crr.id = #{id} where crr.id = #{id}
</select> </select>
<select id="selectfunds" resultType="com.example.demo.domain.vo.cash.FundsDTO">
select crc.id,
crc.jwcode,
crc.name,
crc.market,
crc.order_code,
crc.payment_currency,
crc.payment_amount,
crc.received_currency,
crc.received_amount,
crc.handling_charge,
crc.pay_type,
crc.pay_time,
crc.status
from cash_record_collection crc
<where>
<if test="jwcode != null">
and crc.jwcode = #{jwcode}
</if>
<if test="markets!= null and markets.size > 0">
AND crc.market IN
<foreach collection="markets" item="markets" open="(" separator="," close=")">
#{markets}
</foreach>
</if>
<if test="startTime != null and endTime != null">
and crc.`pay_time` BETWEEN #{startTime} AND #{endTime}
</if>
<if test="payType!= null and payType.length > 0">
AND crc.pay_type like CONCAT('%', #{payType}, '%')
</if>
<if test="orderCode!= null and orderCode.length > 0">
AND crc.order_code like CONCAT('%', #{orderCode}, '%')
</if>
<if test="statuses!=null and statuses.size()>0">
and crc.status IN
<foreach collection="statuses" item="statuses" open="(" separator="," close=")">
#{statuses}
</foreach>
</if>
</where>
</select>
<select id="selectRefundCount" resultType="com.example.demo.domain.vo.cash.FundsDTO">
select crr.refund_currency,
crr.refund_amount,
crr.related_id
from cash_record_refund crr
<where>
<if test="needQueryIds != null and needQueryIds.size() > 0">
and crr.related_id IN
<foreach collection="needQueryIds" item="needQueryId" open="(" separator="," close=")">
#{needQueryId}
</foreach>
</if>
</where>
</select>
</mapper> </mapper>

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

@ -3,11 +3,13 @@
<mapper namespace="com.example.demo.mapper.coin.AuditMapper"> <mapper namespace="com.example.demo.mapper.coin.AuditMapper">
<update id="updateOrder"> <update id="updateOrder">
update user_gold_record update user_gold_record
set audit_id = #{auditId},
<set>
audit_id = #{auditId},
audit_status = #{auditStatus}, audit_status = #{auditStatus},
red_diff = #{redDiff},
<if test="redDiff != null">red_diff = #{redDiff},</if>
reject_reason = #{rejectReason}, reject_reason = #{rejectReason},
audit_time = #{auditTime} audit_time = #{auditTime}
</set>
where order_code = #{orderCode} and audit_status in (0,4) where order_code = #{orderCode} and audit_status in (0,4)
order by create_time DESC order by create_time DESC
limit 1 limit 1

Loading…
Cancel
Save