diff --git a/src/main/java/com/example/demo/Export/ExportService.java b/src/main/java/com/example/demo/Export/ExportService.java index f190b38..b444be6 100644 --- a/src/main/java/com/example/demo/Export/ExportService.java +++ b/src/main/java/com/example/demo/Export/ExportService.java @@ -32,4 +32,6 @@ public interface ExportService { Result addExportFinance(FinanceDTO dto); Result addExportCash(CashDTO dto); + //业绩归属导出 + Result addExportPerformance(PerformanceDTO dto); } diff --git a/src/main/java/com/example/demo/Export/ExportServiceImpl.java b/src/main/java/com/example/demo/Export/ExportServiceImpl.java index 265a339..2ca9580 100644 --- a/src/main/java/com/example/demo/Export/ExportServiceImpl.java +++ b/src/main/java/com/example/demo/Export/ExportServiceImpl.java @@ -138,6 +138,11 @@ public class ExportServiceImpl implements ExportService { cashDTO.setUrl(""); cashDTO.setFileName(generateFileName("现金收款明细", adminName, lang)); 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.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()); }else if (dto instanceof CashDTO cashDTO){ requestData.put(requestDataKey, cashDTO.getCashCollection()); + }else if (dto instanceof PerformanceDTO performanceDTO){ + requestData.put(requestDataKey, performanceDTO.getPerformanceVO()); } exportData.put("requestData", requestData); @@ -345,4 +362,9 @@ public class ExportServiceImpl implements ExportService { public Result addExportCash(CashDTO dto) { 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()); + } } diff --git a/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java b/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java index 66c9b8c..1ab7269 100644 --- a/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java +++ b/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java @@ -513,6 +513,42 @@ public class ExcelHeaderTranslator { } /** + * 获取业绩归属的Excel表头映射 + * 返回 Map<字段名, 中文表头> + */ + public Map getPerformanceHeaders(String lang) { + Map 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 getPerformanceColumnOrder() { + return Arrays.asList( + "jwcode", "name", "marketName", "orderCode", "paymentCurrency", "paymentAmount", + "receivedCurrency", "receivedAmount", "handlingCharge" + ); + } + + /** * 翻译表头 */ private Map translateHeaders(Map headers, String lang) { diff --git a/src/main/java/com/example/demo/controller/cash/CashCollectionController.java b/src/main/java/com/example/demo/controller/cash/CashCollectionController.java index e2266ce..5edd41f 100644 --- a/src/main/java/com/example/demo/controller/cash/CashCollectionController.java +++ b/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.User; 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.Result; import com.example.demo.service.cash.CashCollectionService; @@ -275,16 +276,34 @@ public class CashCollectionController { //根据id查询收款订单 @PostMapping("/performanceSelect") - public Result performanceSelect(@RequestBody Page page) { + public Result performanceSelect(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) { 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 pageInfo = (PageInfo) result.getData(); + translatePerformanceVOs(pageInfo, lang); + } + + return result; } catch (Exception e) { // 推送异常到飞书(核心:调用工具类) System.out.println(e.getMessage()); + String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang); throw new SecurityException(); } } + /** * 转换现金收款订单的多语言字段 */ @@ -325,6 +344,37 @@ public class CashCollectionController { } /** + * 转换绩效数据的多语言字段 + */ + private void translatePerformanceVOs(PageInfo 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) { @@ -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); + } + } + } + } diff --git a/src/main/java/com/example/demo/controller/cash/CashRefundController.java b/src/main/java/com/example/demo/controller/cash/CashRefundController.java index ad91766..355f73d 100644 --- a/src/main/java/com/example/demo/controller/cash/CashRefundController.java +++ b/src/main/java/com/example/demo/controller/cash/CashRefundController.java @@ -401,6 +401,12 @@ public class CashRefundController { 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(处理反向代理/负载均衡场景) */ diff --git a/src/main/java/com/example/demo/controller/coin/ExportController.java b/src/main/java/com/example/demo/controller/coin/ExportController.java index 8fe9993..babbba4 100644 --- a/src/main/java/com/example/demo/controller/coin/ExportController.java +++ b/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.cash.CashCollection; 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.RechargeUser; import com.example.demo.domain.vo.coin.RefundUser; import com.example.demo.domain.vo.coin.Result; import com.example.demo.service.coin.ExportExcelService; -import com.example.demo.service.coin.GoldDetailService; import com.example.demo.Export.ExportService; import com.example.demo.service.coin.TranslationService; import jakarta.servlet.http.HttpServletRequest; @@ -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); + } + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/UserController.java b/src/main/java/com/example/demo/controller/coin/UserController.java index d44c2c4..439cd30 100644 --- a/src/main/java/com/example/demo/controller/coin/UserController.java +++ b/src/main/java/com/example/demo/controller/coin/UserController.java @@ -50,7 +50,7 @@ public class UserController { 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) { GoldUser goldUser = (GoldUser) result.getData(); diff --git a/src/main/java/com/example/demo/domain/DTO/PerformanceDTO.java b/src/main/java/com/example/demo/domain/DTO/PerformanceDTO.java index 4ab48ff..c6ba52f 100644 --- a/src/main/java/com/example/demo/domain/DTO/PerformanceDTO.java +++ b/src/main/java/com/example/demo/domain/DTO/PerformanceDTO.java @@ -1,5 +1,6 @@ package com.example.demo.domain.DTO; +import com.example.demo.domain.vo.cash.PerformanceVO; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @@ -18,6 +19,14 @@ import java.util.List; @Data 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 adminMarket; String jwcode; List customerMarket; @@ -25,5 +34,6 @@ public class PerformanceDTO { private Date startTime; // 支付时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date endTime; // 支付时间 - + private String lang; + private PerformanceVO performanceVO; } diff --git a/src/main/java/com/example/demo/domain/vo/cash/FundsDTO.java b/src/main/java/com/example/demo/domain/vo/cash/FundsDTO.java new file mode 100644 index 0000000..fa51be4 --- /dev/null +++ b/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: 2026−01-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 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 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; +} diff --git a/src/main/java/com/example/demo/domain/vo/cash/PerformanceVO.java b/src/main/java/com/example/demo/domain/vo/cash/PerformanceVO.java index 5161c72..bbcf9de 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/PerformanceVO.java +++ b/src/main/java/com/example/demo/domain/vo/cash/PerformanceVO.java @@ -25,7 +25,7 @@ public class PerformanceVO { private Integer jwcode; // 精网号 private String name; // 姓名 @ExcelIgnore - private String market; // 所属地区 + private Integer market; // 所属地区 private String marketName; // 所属地区 private String orderCode; // 金币订单号 private String paymentCurrency; // 付款币种 diff --git a/src/main/java/com/example/demo/domain/vo/coin/Page.java b/src/main/java/com/example/demo/domain/vo/coin/Page.java index 5317271..b320ee6 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/Page.java +++ b/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.CashRecordDTO; 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.NoArgsConstructor; @@ -52,5 +54,7 @@ public class Page { private RechargeActivity rechargeActivity; //充值活动 private CashRecordDTO cashRecordDTO; private PerformanceDTO performanceDTO;//业绩归属 + private FundsDTO fundsDTO;//现金收款 + private PerformanceVO performanceVO;//业绩归属 } diff --git a/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java b/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java index e298016..72f5e79 100644 --- a/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java +++ b/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java @@ -71,6 +71,7 @@ public interface CashCollectionMapper { @Param("auditId") Integer auditId, @Param("version") Integer version); + List performanceSelect(PerformanceVO performanceDTO); List performanceSelect(PerformanceDTO performanceDTO); diff --git a/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java b/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java index f5b4e4a..ebedef9 100644 --- a/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java +++ b/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java @@ -38,4 +38,8 @@ public interface CashRefundMapper { List getAuditBatch(Set auditIds); //根据id查订单信息 CashRecordDTO selectById(Integer id); + + List selectfunds(FundsDTO fundsDTO); + + List selectRefundCount(List needQueryIds); } \ No newline at end of file diff --git a/src/main/java/com/example/demo/service/cash/CashCollectionService.java b/src/main/java/com/example/demo/service/cash/CashCollectionService.java index 56e960b..f4146e6 100644 --- a/src/main/java/com/example/demo/service/cash/CashCollectionService.java +++ b/src/main/java/com/example/demo/service/cash/CashCollectionService.java @@ -1,13 +1,11 @@ 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.GOrder; import com.example.demo.domain.entity.RechargeActivity; import com.example.demo.domain.entity.User; import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.PerformanceVO; -import com.example.demo.domain.vo.coin.Result; import com.github.pagehelper.PageInfo; import java.util.List; @@ -47,6 +45,6 @@ public interface CashCollectionService { //同步事务方法 void processBatch(List gOrders); - PageInfo performanceSelect(Integer pageNum, Integer pageSize, PerformanceDTO performanceDTO); + PageInfo performanceSelect(Integer pageNum, Integer pageSize, PerformanceVO performanceDTO); } diff --git a/src/main/java/com/example/demo/service/cash/RefundService.java b/src/main/java/com/example/demo/service/cash/RefundService.java index 238a826..608f32c 100644 --- a/src/main/java/com/example/demo/service/cash/RefundService.java +++ b/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.CashRecordDone; 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; /** @@ -36,4 +36,6 @@ public interface RefundService { PageInfo exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO); //新增线上退款记录 void addOnline(CashRecordRefund cashRecordRefund); + + PageInfo funds(Integer pageNum, Integer pageSize, FundsDTO fundsDTO); } diff --git a/src/main/java/com/example/demo/service/coin/ExportExcelService.java b/src/main/java/com/example/demo/service/coin/ExportExcelService.java index c65b87e..23fd163 100644 --- a/src/main/java/com/example/demo/service/coin/ExportExcelService.java +++ b/src/main/java/com/example/demo/service/coin/ExportExcelService.java @@ -26,6 +26,7 @@ public interface ExportExcelService { Exception LiveExcel(String message) throws Exception; Exception FanExcel(String message) throws Exception; Exception ArticleExcel(String message) throws Exception; + Exception PerformanceExcel(String message) throws Exception; List getExcel(Export export); Exception BeanExcel(String message) throws Exception; diff --git a/src/main/java/com/example/demo/service/coin/UserService.java b/src/main/java/com/example/demo/service/coin/UserService.java index 917682f..7d0be9c 100644 --- a/src/main/java/com/example/demo/service/coin/UserService.java +++ b/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 { //查找用户部分信息 - Result selectUser(String jwcode); + Result selectUser(String jwcode,String lang); //查找用户金币 GoldUser selectgold(String jwcode); diff --git a/src/main/java/com/example/demo/service/listen/PerformanceListener.java b/src/main/java/com/example/demo/service/listen/PerformanceListener.java new file mode 100644 index 0000000..03d61ed --- /dev/null +++ b/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{ + @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); + } + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java index 1751c1e..7790a5d 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java +++ b/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.LanguageTranslationUtil; import com.example.demo.config.RabbitMQConfig; -import com.example.demo.domain.DTO.PerformanceDTO; import com.example.demo.domain.entity.*; import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashCollectionMessage; import com.example.demo.domain.vo.cash.PerformanceVO; import com.example.demo.domain.vo.coin.GoldUser; 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.coin.MarketMapper; import com.example.demo.mapper.coin.UserMapper; @@ -516,9 +514,9 @@ public User getNameAndMarket(Integer jwcode) { //多条件查询收款订单列表 @Override - public PageInfo performanceSelect(Integer pageNum, Integer pageSize, PerformanceDTO performanceDTO) { + public PageInfo performanceSelect(Integer pageNum, Integer pageSize, PerformanceVO performanceVO) { PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper - List performanceVOs = cashCollectionMapper.performanceSelect(performanceDTO); + List performanceVOs = cashCollectionMapper.performanceSelect(performanceVO); return new PageInfo<>(performanceVOs); } diff --git a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java index c835afa..7e8f950 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java @@ -579,4 +579,56 @@ CashRecordDone cashRecordDone1 = new CashRecordDone(); cashRefundMapper.updateStatus(cashRecordDone1); else throw new SystemException("提交失败") ; } + + @Override + public PageInfo funds(Integer pageNum, Integer pageSize, FundsDTO fundsDTO) { + // 1. 分页查询主数据 + PageHelper.startPage(pageNum, pageSize); + if(fundsDTO.getStatuses()==null||fundsDTO.getStatuses().isEmpty()){ + List list_a = Arrays.asList(4,6); + fundsDTO.setStatuses(list_a); + } + List list = cashRefundMapper.selectfunds(fundsDTO); + +// 2. 收集 status == 6 的记录 ID(注意:status 是 int) + List needQueryIds = new ArrayList<>(); + for (FundsDTO dto : list) { + if (dto.getStatus() != null && dto.getStatus()==6) { + needQueryIds.add(dto.getId()); + } + } + +// 3. 批量查询额外信息(关键:必须有返回对象的方法!) + if (!needQueryIds.isEmpty()) { + // 👇 请替换为你的实际 Mapper 方法(返回 List) + List detailList = cashRefundMapper.selectRefundCount(needQueryIds); + + // 4. 构建 HashMap: id -> RefundDetailDTO + Map 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); + } + } diff --git a/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java index b25f2d1..2c313c7 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java @@ -198,6 +198,70 @@ public class AuditServiceImpl implements AuditService { //erp增加退款数据 if(oldOrder.getType()==1){ 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){ GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费-商品 (double) (order.getFreeDecember()+order.getFreeJune()) /100,SimpleIdGenerator.generateId(), @@ -213,23 +277,12 @@ public class AuditServiceImpl implements AuditService { 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){ //判断够不够扣 - 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){ log.error("用户余额不足,无法退款"); throw new IllegalArgumentException("用户余额不足,无法退款"); @@ -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("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}", order.getRedDiff(), userNow.getNowSumGold()); throw new IllegalArgumentException("用户余额不足,无法抵扣红包"); @@ -279,7 +332,7 @@ public class AuditServiceImpl implements AuditService { consumeUser.setSumGold(order.getRedDiff()); consumeUser.setAdminId(order.getAdminId()); consumeUser.setRemark(order.getRemark()); - consumeUser.setPrice(order.getPrice()); + consumeUser.setPrice(price); // 执行金币抵扣红包 redService.updateRed(consumeUser); //link扣除已有红包 diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java index ccd0e2e..b84e6ca 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/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 com.alibaba.excel.EasyExcel; 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.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import com.example.demo.Util.ExcelHeaderTranslator; import com.example.demo.Util.ExcelUploadUtil; 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.Export; 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.cash.CashCollection; 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.mapper.cash.CashRefundMapper; 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.serviceImpl.cash.CashRefundServiceImpl; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -42,19 +36,13 @@ import com.example.demo.service.coin.AiEmotionService; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; 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.Value; 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.transaction.annotation.Transactional; import java.io.*; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Function; @@ -239,6 +227,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { }); } + @Transactional @Override public Exception LiveExcel(String message) throws Exception { return exportExcelGeneric(message, "liveUser", page -> { @@ -261,6 +250,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { }); } + @Transactional @Override public Exception FanExcel(String message) throws Exception { return exportExcelGeneric(message, "fanUser", page -> { @@ -283,6 +273,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { }); } + @Transactional @Override public Exception ArticleExcel(String message) throws Exception { return exportExcelGeneric(message, "articleUser", page -> { @@ -305,6 +296,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { }); } + @Transactional @Override public Exception BeanExcel(String message) throws Exception { return exportExcelGeneric(message, "beanUser", page -> { @@ -327,6 +319,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { }); } + @Transactional @Override public Exception OnlineExcel(String message) throws Exception { return exportExcelGeneric(message, "onlineUser", page -> { @@ -349,6 +342,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { }); } + @Transactional @Override public Exception FinanceExcel(String message) throws Exception { return exportExcelGeneric(message, "financeUser", page -> { @@ -371,6 +365,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { }); } + @Transactional @Override public Exception CashExcel(String message) throws Exception { 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 public List getExcel(Export export) { List list = exportMapper.getExportRecord(export.getAccount(),export.getType()); @@ -702,6 +720,26 @@ public class ExportExcelServiceImpl implements ExportExcelService { writeSheet = EasyExcel.writerSheet("Sheet1") .head(head) .build(); + } + // 如果是业绩归属表,添加动态表头处理器 + else if ("performanceUser".equals(exportType)) { + Map headers = excelHeaderTranslator.getPerformanceHeaders(lang); + List columnOrder = excelHeaderTranslator.getPerformanceColumnOrder(); + + // 构建自定义表头 + List> head = new ArrayList<>(); + for (String fieldName : columnOrder) { + String headerText = headers.get(fieldName); + if (headerText != null) { + List headItems = new ArrayList<>(); + headItems.add(headerText); + head.add(headItems); + } + } + + writeSheet = EasyExcel.writerSheet("Sheet1") + .head(head) + .build(); } else { writeSheet = EasyExcel.writerSheet("Sheet1").build(); } @@ -804,6 +842,11 @@ public class ExportExcelServiceImpl implements ExportExcelService { translateUserList((List) list, lang); } + // 添加业绩归属翻译支持 + if ("performanceUser".equals(exportType) && list.get(0) instanceof PerformanceVO) { + translatePerformanceList((List) list, lang); + } + excelWriter.write(list, writeSheet); page.setPageNum(page.getPageNum() + 1); totalCount += list.size(); @@ -952,6 +995,8 @@ public class ExportExcelServiceImpl implements ExportExcelService { return CashRecordDTO.class; case "cashUser": return CashCollection.class; + case "performanceUser": + return PerformanceVO.class; default: throw new IllegalArgumentException("不支持的导出类型: " + exportType); } @@ -1516,4 +1561,29 @@ public class ExportExcelServiceImpl implements ExportExcelService { } } } + + /** + * 翻译业绩归属列表 + */ + private void translatePerformanceList(List 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)); + } + } + } } diff --git a/src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java index 826d2b1..b88dafd 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.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.domain.entity.Admin; import com.example.demo.domain.entity.User; import com.example.demo.domain.vo.coin.Gold; @@ -41,14 +42,17 @@ public class UserServiceImpl implements UserService { private MarketMapper marketMapper; @Autowired private RedService redService; + @Autowired + private LanguageTranslationUtil languageTranslationUtil; //查找用户部分信息 @Override - public Result selectUser(String jwcode) { + public Result selectUser(String jwcode, String lang) { // 添加语言参数 // 检查用户是否存在 int userCount = userMapper.checkUserExists(jwcode); if (userCount == 0) { - return Result.error("精网号有误!请检查"); + String errorMsg = languageTranslationUtil.translate("精网号有误!请检查", lang); + return Result.error(errorMsg); } // 解token权限 @@ -85,20 +89,27 @@ public class UserServiceImpl implements UserService { user.setRed(redSum); return Result.success(user); } 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 { - return Result.error("用户市场信息不存在"); + String errorMsg = languageTranslationUtil.translate("用户市场信息不存在", lang); + return Result.error(errorMsg); } } } else { - return Result.error("用户权限验证失败"); + String errorMsg = languageTranslationUtil.translate("用户权限验证失败", lang); + return Result.error(errorMsg); } } catch (Exception e) { e.printStackTrace(); - return Result.error("精网号有误!请检查"); + String errorMsg = languageTranslationUtil.translate("精网号有误!请检查", lang); + return Result.error(errorMsg); } } diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index 5ee0f15..e626810 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -415,6 +415,62 @@ from cash_record_refund crr where crr.id = #{id} + + \ No newline at end of file diff --git a/src/main/resources/mapper/AuditMapper.xml b/src/main/resources/mapper/AuditMapper.xml index 9db578c..914fdf8 100644 --- a/src/main/resources/mapper/AuditMapper.xml +++ b/src/main/resources/mapper/AuditMapper.xml @@ -3,11 +3,13 @@ update user_gold_record - set audit_id = #{auditId}, + + audit_id = #{auditId}, audit_status = #{auditStatus}, - red_diff = #{redDiff}, + red_diff = #{redDiff}, reject_reason = #{rejectReason}, audit_time = #{auditTime} + where order_code = #{orderCode} and audit_status in (0,4) order by create_time DESC limit 1