diff --git a/src/main/java/com/example/demo/Export/ExportServiceImpl.java b/src/main/java/com/example/demo/Export/ExportServiceImpl.java index c94e4ed..ce3c536 100644 --- a/src/main/java/com/example/demo/Export/ExportServiceImpl.java +++ b/src/main/java/com/example/demo/Export/ExportServiceImpl.java @@ -11,6 +11,7 @@ import com.example.demo.Util.RedisUtil; import com.example.demo.service.coin.AdminService; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; @@ -309,7 +310,7 @@ public class ExportServiceImpl implements ExportService { }else if (dto instanceof CashDTO cashDTO){ requestData.put(requestDataKey, cashDTO.getCashCollection()); }else if (dto instanceof PerformanceDTO performanceDTO){ - requestData.put(requestDataKey, performanceDTO.getPerformanceVO()); + requestData.put(requestDataKey, performanceDTO); }else if (dto instanceof FundDTO fundDTO){ requestData.put(requestDataKey, fundDTO.getFundsDTO()); } diff --git a/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java b/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java index 30553a3..699ec38 100644 --- a/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java +++ b/src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java @@ -87,7 +87,7 @@ public class ExcelHeaderTranslator { headers.put("adminName", "提交人"); headers.put("isRefundDescription", "是否退款"); headers.put("createTime", "消耗时间"); - headers.put("price", "折扣金币"); + headers.put("price", "原价"); // 如果需要翻译,则翻译表头 if (!isChineseLanguage(lang)) { @@ -131,8 +131,6 @@ public class ExcelHeaderTranslator { headers.put("taskGold", "任务金币"); headers.put("remark", "备注"); headers.put("adminName", "提交人"); - headers.put("price", "原价"); - headers.put("linkId", "LinkId"); headers.put("auditTime", "退款时间"); // 如果需要翻译,则翻译表头 @@ -150,7 +148,7 @@ public class ExcelHeaderTranslator { return Arrays.asList( "orderCode", "name", "jwcode", "market", "goodsName", "refundType", "refundModelDesc", "sumGold", "permanentGold", - "freeGold", "taskGold", "remark", "adminName", "price", "linkId", "auditTime" + "freeGold", "taskGold", "remark", "adminName", "auditTime" ); } @@ -302,7 +300,7 @@ public class ExcelHeaderTranslator { headers.put("status", "订单状态"); headers.put("remark", "备注"); headers.put("refundReason", "退款理由"); - headers.put("refundModel", "退款方式"); + headers.put("refundModelDesc", "退款方式"); // 如果需要翻译,则翻译表头 if (!isChineseLanguage(lang)) { @@ -318,7 +316,7 @@ public class ExcelHeaderTranslator { public List getCashRecordColumnOrder() { return Arrays.asList( "goodsName", "goodsNum", "numUnit", "Submitter", "id", "jwcode", "name", "market", - "status", "remark", "refundReason", "refundModel" + "status", "remark", "refundReason", "refundModelDesc" ); } @@ -411,7 +409,7 @@ public class ExcelHeaderTranslator { headers.put("freeBean", "免费金豆数"); headers.put("buyBean", "付费金豆数"); headers.put("channel", "频道"); - headers.put("type", "会员类型"); + headers.put("typeDesc", "会员类型"); headers.put("consumeTime", "加入时间"); // 如果需要翻译,则翻译表头 @@ -428,7 +426,7 @@ public class ExcelHeaderTranslator { public List getBeanConsumeFanColumnOrder() { return Arrays.asList( "id", "name", "jwcode", "dept", "beanNum", "freeBean", "buyBean", - "channel", "type", "consumeTime" + "channel", "typeDesc", "consumeTime" ); } @@ -493,6 +491,7 @@ public class ExcelHeaderTranslator { headers.put("taskGold", "任务金币"); headers.put("adminName", "提交人"); headers.put("auditTime", "更新时间"); + headers.put("price", "原价"); // 如果需要翻译,则翻译表头 if (!isChineseLanguage(lang)) { @@ -508,7 +507,7 @@ public class ExcelHeaderTranslator { public List getGoldDetailColumnOrder() { return Arrays.asList( "name", "jwcode", "market", "payPlatform", "typeDesc", "sumGold", - "permanentGold", "freeGold", "taskGold", "adminName", "auditTime" + "permanentGold", "freeGold", "taskGold", "adminName", "auditTime","price" ); } diff --git a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java index 36c1f3f..b4d3f5a 100644 --- a/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java +++ b/src/main/java/com/example/demo/controller/bean/BeanConsumeController.java @@ -40,6 +40,11 @@ public class BeanConsumeController { @Autowired private TranslationService translationService; + //获取角色的权限 + @PostMapping("/getRoleChannel") + public Result getRoleChannel(@RequestBody Integer roleId){ + return Result.success(beanConsumeService.getRoleChannel(roleId)); + } //获取消费用户分部信息 @PostMapping("/getDept") public Result getDept(@RequestHeader(defaultValue = "zh_CN") 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 1cdfab4..7984bea 100644 --- a/src/main/java/com/example/demo/controller/cash/CashCollectionController.java +++ b/src/main/java/com/example/demo/controller/cash/CashCollectionController.java @@ -53,13 +53,26 @@ public class CashCollectionController { @PostMapping("/getNameAndMarket") public Result getNameAndMarket(@RequestBody Integer jwcode, @RequestHeader(defaultValue = "zh_CN") String lang) { try { - return Result.success(cashCollectionService.getNameAndMarket(jwcode)); + Result result = cashCollectionService.getNameAndMarket(jwcode, lang); + + // 对返回结果进行多语言转换 + if (result.getCode() == 200 && result.getData() instanceof User) { + User user = (User) result.getData(); + // 如果服务层未处理市场名称翻译,在这里进行处理 + if (user.getMarketName() != null) { + user.setMarketName(languageTranslationUtil.translate(user.getMarketName(), lang)); + } + } + + return result; } catch (Exception e) { - String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang); - return Result.error(errorMsg); + String errorMsg = languageTranslationUtil.translate("查询失败", lang); + return Result.error(errorMsg + ": " + e.getMessage()); } } + + //获取收款活动列表 @PostMapping("/getActivityList") public Result getActivityList() @@ -296,10 +309,8 @@ public class CashCollectionController { return result; } catch (Exception e) { - // 推送异常到飞书(核心:调用工具类) - System.out.println(e.getMessage()); String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang); - throw new SecurityException(); + return Result.error(errorMsg); } } @@ -418,6 +429,13 @@ public class CashCollectionController { cashCollection.getReceivedMarket(), languageCode); cashCollection.setReceivedMarket(chineseMarket); } + + // 转换所属地区名称 + if (cashCollection.getMarketName() != null && !cashCollection.getMarketName().isEmpty()) { + String chineseMarketName = translationService.findChineseSimplifiedByTranslation( + cashCollection.getMarketName(), languageCode); + cashCollection.setMarketName(chineseMarketName); + } } } @@ -481,6 +499,20 @@ public class CashCollectionController { cashCollection.getPaymentCurrency(), languageCode); cashCollection.setPaymentCurrency(chineseCurrency); } + + // 转换提交人地区 + if (cashCollection.getSubmitterMarket() != null && !cashCollection.getSubmitterMarket().isEmpty()) { + String chineseMarket = translationService.findChineseSimplifiedByTranslation( + cashCollection.getSubmitterMarket(), languageCode); + cashCollection.setSubmitterMarket(chineseMarket); + } + + // 转换所属地区名称 + if (cashCollection.getMarketName() != null && !cashCollection.getMarketName().isEmpty()) { + String chineseMarketName = translationService.findChineseSimplifiedByTranslation( + cashCollection.getMarketName(), languageCode); + cashCollection.setMarketName(chineseMarketName); + } } } 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 d3d956a..70ca611 100644 --- a/src/main/java/com/example/demo/controller/cash/CashRefundController.java +++ b/src/main/java/com/example/demo/controller/cash/CashRefundController.java @@ -543,6 +543,11 @@ public class CashRefundController { if (dto.getReceivedCurrency() != null) { dto.setReceivedCurrency(languageTranslationUtil.translate(dto.getReceivedCurrency(), lang)); } + // 翻译退款方式 + if (dto.getRefundModel() != null) { + String refundModelDesc = convertRefundModelToString(dto.getRefundModel()); + dto.setRefundModelDesc(languageTranslationUtil.translate(refundModelDesc, lang)); + } } } } @@ -726,4 +731,15 @@ public class CashRefundController { } } + /** + * 将退款模型数字转换为中文描述 + */ + private String convertRefundModelToString(Byte refundModel) { + if (refundModel == null) return ""; + switch (refundModel) { + case 0: return "全部退款"; + case 1: return "部分退款"; + default: return "未知退款方式"; + } + } } diff --git a/src/main/java/com/example/demo/controller/coin/AdminController.java b/src/main/java/com/example/demo/controller/coin/AdminController.java index c357d68..18ffba2 100644 --- a/src/main/java/com/example/demo/controller/coin/AdminController.java +++ b/src/main/java/com/example/demo/controller/coin/AdminController.java @@ -84,11 +84,16 @@ public class AdminController { // 对用户信息进行多语言转换 if (userDetails instanceof Admin) { Admin admin = (Admin) userDetails; - // 如果不是中文环境,先将翻译后的文本转换回中文进行处理 + + // 获取当前语言环境 String languageCode = parseLanguageCode(lang); - if (!"zh".equalsIgnoreCase(languageCode)) { - convertTranslatedFieldsToChinese(admin, languageCode); + + // 如果是中文环境,直接返回(无需转换) + if ("zh".equalsIgnoreCase(languageCode) || "zh_cn".equalsIgnoreCase(languageCode)) { + return userDetails; } + + // 非中文环境下:先将数据库中的中文市场信息转换为目标语言 translateAdminInfo(admin, lang); } return userDetails; @@ -97,7 +102,6 @@ public class AdminController { } } - //获取管理员ID @Log("获取用户ID") @PostMapping("/adminId") 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 c39fe10..b30b57c 100644 --- a/src/main/java/com/example/demo/controller/coin/ExportController.java +++ b/src/main/java/com/example/demo/controller/coin/ExportController.java @@ -13,10 +13,7 @@ import com.example.demo.domain.vo.cash.CashCollection; import com.example.demo.domain.vo.cash.CashRecordDTO; import com.example.demo.domain.vo.cash.FundsDTO; import com.example.demo.domain.vo.cash.PerformanceVO; -import com.example.demo.domain.vo.coin.ConsumeUser; -import com.example.demo.domain.vo.coin.RechargeUser; -import com.example.demo.domain.vo.coin.RefundUser; -import com.example.demo.domain.vo.coin.Result; +import com.example.demo.domain.vo.coin.*; import com.example.demo.service.coin.ExportExcelService; import com.example.demo.Export.ExportService; import com.example.demo.service.coin.TranslationService; @@ -372,18 +369,18 @@ public class ExportController { } @PostMapping("/exportPerformance") - public Result exportPerformance(@Valid @RequestBody PerformanceDTO dto, @RequestHeader(defaultValue = "zh_CN") String lang) { - String lockKey = "export:lock:" + dto.getToken(); + public Result exportPerformance(@Valid @RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) { + String lockKey = "export:lock:" + page.getPerformanceDTO().getToken(); String requestId = UUID.randomUUID().toString(); long expireTime = 5000; - dto.setLang(lang);// 设置语言参数 + page.getPerformanceDTO().setLang(lang);// 设置语言参数 // 解析语言代码 String languageCode = parseLanguageCode(lang); // 如果非中文环境,将查询条件中的翻译文本转换为中文简体 if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) { - convertPerformanceTranslatedFieldsToChinese(dto.getPerformanceVO(), languageCode); + convertPerformanceTranslatedFieldsToChinese(page.getPerformanceDTO().getPerformanceVO(), languageCode); } try { @@ -393,7 +390,7 @@ public class ExportController { throw new BusinessException(errorMsg); } // 执行业务逻辑 - return exportService.addExportPerformance(dto); + return exportService.addExportPerformance(page.getPerformanceDTO()); } finally { // 释放锁 redisLockUtil.unlock(lockKey, requestId); @@ -597,10 +594,10 @@ public class ExportController { } // 转换会员类型 - if (beanConsumeFan.getType() != null && !beanConsumeFan.getType().isEmpty()) { + if (beanConsumeFan.getTypeDesc() != null && !beanConsumeFan.getTypeDesc().isEmpty()) { String chineseType = translationService.findChineseSimplifiedByTranslation( - beanConsumeFan.getType(), languageCode); - beanConsumeFan.setType(chineseType); + beanConsumeFan.getTypeDesc(), languageCode); + beanConsumeFan.setTypeDesc(chineseType); } } } diff --git a/src/main/java/com/example/demo/controller/coin/PermissionController.java b/src/main/java/com/example/demo/controller/coin/PermissionController.java index e8923ad..820780b 100644 --- a/src/main/java/com/example/demo/controller/coin/PermissionController.java +++ b/src/main/java/com/example/demo/controller/coin/PermissionController.java @@ -227,9 +227,10 @@ public class PermissionController { private void translatePermissions(com.github.pagehelper.PageInfo pageInfo, String lang) { if (pageInfo != null && pageInfo.getList() != null) { for (com.example.demo.domain.vo.coin.Permission permission : pageInfo.getList()) { - // 翻译市场名称 + // 翻译市场名称(支持多个市场) if (permission.getMarket() != null) { - permission.setMarket(languageTranslationUtil.translate(permission.getMarket(), lang)); + String translatedMarket = translateMultipleMarkets(permission.getMarket(), lang); + permission.setMarket(translatedMarket); } // 翻译职位 if (permission.getPostiton() != null) { @@ -244,6 +245,34 @@ public class PermissionController { } /** + * 翻译多个市场名称 + */ + private String translateMultipleMarkets(String marketStr, String lang) { + if (marketStr == null || marketStr.trim().isEmpty()) { + return marketStr; + } + + // 按逗号分割市场名称 + String[] markets = marketStr.split(","); + StringBuilder translatedMarkets = new StringBuilder(); + + for (int i = 0; i < markets.length; i++) { + String market = markets[i].trim(); + if (!market.isEmpty()) { + // 对每个市场名称进行翻译 + String translatedMarket = languageTranslationUtil.translate(market, lang); + translatedMarkets.append(translatedMarket); + // 如果不是最后一个元素,添加逗号 + if (i < markets.length - 1) { + translatedMarkets.append(","); + } + } + } + + return translatedMarkets.toString(); + } + + /** * 转换职位名称为指定语言 */ private void translatePositions(List positions, String lang) { diff --git a/src/main/java/com/example/demo/controller/coin/WorkbenchController.java b/src/main/java/com/example/demo/controller/coin/WorkbenchController.java index 09fcacf..c95cbee 100644 --- a/src/main/java/com/example/demo/controller/coin/WorkbenchController.java +++ b/src/main/java/com/example/demo/controller/coin/WorkbenchController.java @@ -90,9 +90,9 @@ public class WorkbenchController { String languageCode = parseLanguageCode(lang); // 如果不是中文环境,将查询条件中的翻译文本转换为中文简体 - if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) { - convertTranslatedFieldsToChinese(workbench, languageCode); - } + // if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) { + // convertTranslatedFieldsToChinese(workbench, languageCode); +//} String account = admin.getAccount(); List markets = workbenchService.getAdminMarket(account); diff --git a/src/main/java/com/example/demo/domain/entity/Admin.java b/src/main/java/com/example/demo/domain/entity/Admin.java index 495193e..3630b1b 100644 --- a/src/main/java/com/example/demo/domain/entity/Admin.java +++ b/src/main/java/com/example/demo/domain/entity/Admin.java @@ -27,6 +27,7 @@ public class Admin implements UserDetails, Serializable { private Byte adminStatus; // 状态(启用/不启用) private List market; // 地区列表 private String markets; // 地区 + private String marketName; // 地区名称 private String roleKey; private String postiton; // 职位 private String remark; // 备注 diff --git a/src/main/java/com/example/demo/domain/entity/CashRecord.java b/src/main/java/com/example/demo/domain/entity/CashRecord.java index 37f9648..39ed86b 100644 --- a/src/main/java/com/example/demo/domain/entity/CashRecord.java +++ b/src/main/java/com/example/demo/domain/entity/CashRecord.java @@ -37,13 +37,15 @@ public class CashRecord implements Serializable { private String goodsName; // 商品名称 private Integer goodNum; // 产品数量 private String numUnit; // 数量单位 个/月/年 - private Integer permanentGold; // 永久金币数量 - private Integer freeGold; // 免费金币数量 - private String payload; //平台 + private Integer permanentGold; // 永久金币数量 + private Integer freeGold; // 免费金币数量 + private String payload; //平台 // 金额信息 private String paymentCurrency; // 付款币种 private BigDecimal paymentAmount; // 付款金额 + private String paymentCurrencyOrig; // 原始付款币种 + private BigDecimal paymentAmountOrig; // 原始付款金额 private String receivedCurrency; // 到账币种 private BigDecimal receivedAmount; // 到账金额 private BigDecimal handlingCharge; // 手续费 diff --git a/src/main/java/com/example/demo/domain/entity/User.java b/src/main/java/com/example/demo/domain/entity/User.java index 255bbc4..ecf3bfc 100644 --- a/src/main/java/com/example/demo/domain/entity/User.java +++ b/src/main/java/com/example/demo/domain/entity/User.java @@ -27,7 +27,7 @@ public class User implements Serializable { private String name; // 客户姓名 private String market; // 所属地区 @ExcelIgnore - private String marketName; // 所属地区 + private String marketName; // 所属地区 @ExcelIgnore private BigDecimal sumPermanentGold; // 历史永久金币 @ExcelIgnore diff --git a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java index 2ce82cb..87f2686 100644 --- a/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java +++ b/src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java @@ -1,8 +1,6 @@ package com.example.demo.domain.vo.bean; import com.alibaba.excel.annotation.ExcelIgnore; -import com.alibaba.excel.annotation.ExcelProperty; -import com.example.demo.config.MemberTypeStringConverter; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; @@ -36,8 +34,9 @@ public class BeanConsumeFan implements Serializable { private String freeBean; //免费金豆 private String buyBean; //付费金豆 private String channel; //频道名称(source_name) - @ExcelProperty(value = "", converter = MemberTypeStringConverter.class) - private String type; //类型source_type 7单月,8连续包月 + @ExcelIgnore + private Integer type; //类型source_type 7单月,8连续包月 + private String typeDesc; //@ExcelProperty("支付方式") @ExcelIgnore private Integer payType; //支付方式(直播:12345,铁粉:7,文章:8) diff --git a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java index c210608..dc38b45 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java +++ b/src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java @@ -4,7 +4,6 @@ import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.example.demo.config.MarketConverter; import com.example.demo.config.OrderStatusConverter; -import com.example.demo.config.RefundModelConverter; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; @@ -182,8 +181,9 @@ public class CashRecordDTO{ /** * 退款方式(0全额/1部分) */ - @ExcelProperty(value = "",converter = RefundModelConverter.class) - private Integer refundModel; + @ExcelIgnore + private Byte refundModel; + private String refundModelDesc; //退款方式转换 /** * 退款执行人OA号 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 index 5c6f7b8..295f683 100644 --- a/src/main/java/com/example/demo/domain/vo/cash/FundsDTO.java +++ b/src/main/java/com/example/demo/domain/vo/cash/FundsDTO.java @@ -67,4 +67,10 @@ public class FundsDTO { private BigDecimal permanentGold; @ExcelIgnore private BigDecimal freeGold; + @ExcelIgnore + private String sortField; + @ExcelIgnore + private String sortOrder; + @ExcelIgnore + private List localMarket; } 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 adc8832..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 @@ -33,7 +33,5 @@ public class PerformanceVO { private String receivedCurrency; // 到账币种 private BigDecimal receivedAmount; // 到账金额 private BigDecimal handlingCharge; // 手续费 - private String token; - private String lang; } diff --git a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java index 0f59c51..1b8215a 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java @@ -76,7 +76,7 @@ public class ConsumeUser implements Serializable { private List markets; // 地区列表 @ExcelIgnore private Integer flag; //是否为员工号 - private BigDecimal price; // 折扣金币 + private BigDecimal price; // 原价 @ExcelIgnore private Integer redMoney; //是否用红包 @ExcelIgnore diff --git a/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java b/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java index 0b67e1d..1b20620 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java +++ b/src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java @@ -68,6 +68,7 @@ public class GoldDetail implements Serializable { @ExcelIgnore private String goodsName; private BigDecimal price; + @ExcelIgnore private String linkId; } diff --git a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java index 3a258cc..66fdd3d 100644 --- a/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java +++ b/src/main/java/com/example/demo/domain/vo/coin/RefundUser.java @@ -45,7 +45,9 @@ public class RefundUser implements Serializable { @ExcelIgnore private Integer adminId; //提交人Id private String adminName; //提交人姓名 + @ExcelIgnore private BigDecimal price; //原价 + @ExcelIgnore private String linkId; //LinkId @ExcelIgnore 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 4ec2b21..967c83e 100644 --- a/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java +++ b/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java @@ -25,6 +25,8 @@ import java.util.Set; @Mapper public interface CashCollectionMapper { //ceshi + // 检查用户是否存在 + int checkUserExists(@Param("jwcode") Integer jwcode); //根据jwcode获取所属地区 String getMarketByJwcode(@Param("jwcode") Integer jwcode); //新增收款订单 diff --git a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java index 45c9faa..1116db2 100644 --- a/src/main/java/com/example/demo/service/bean/BeanConsumeService.java +++ b/src/main/java/com/example/demo/service/bean/BeanConsumeService.java @@ -39,4 +39,6 @@ public interface BeanConsumeService { //筛选查询小黄车消费 Object selectCartBy(Integer pageNum, Integer pageSize, BeanConsumeCartDTO beanConsumeCartDTO); + //根据角色id获取角色频道 + Object getRoleChannel(Integer roleId); } 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 30f5603..cce5238 100644 --- a/src/main/java/com/example/demo/service/cash/CashCollectionService.java +++ b/src/main/java/com/example/demo/service/cash/CashCollectionService.java @@ -4,9 +4,9 @@ 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; @@ -34,7 +34,7 @@ public interface CashCollectionService { //补全手续费等 String complete(CashRecord cashRecord); //根据精网号获取姓名和地区 - User getNameAndMarket(Integer jwcode); + Result getNameAndMarket(Integer jwcode,String lang); //获取活动列表 List getActivityList(); //同步g_order订单到cash_record表 diff --git a/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java index f04f402..3de69fc 100644 --- a/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java @@ -382,7 +382,7 @@ public class RedServiceImpl implements RedService { userGoldRecord.setTaskGold(-consumeUser.getTaskGold().intValue()); userGoldRecord.setRemark(consumeUser.getRemark()); userGoldRecord.setType((byte) 1); - userGoldRecord.setIsRefund((byte) 0); + userGoldRecord.setIsRefund((byte) 1); userGoldRecord.setPayPlatform("金币系统"); userGoldRecord.setAdminId(consumeUser.getAdminId()); userGoldRecord.setAuditStatus(1); diff --git a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java index 36f49a7..1f9ff95 100644 --- a/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java @@ -209,6 +209,12 @@ public class BeanConsumeServiceImpl implements BeanConsumeService { return new PageInfo<>(beanConsumeCarts); } + //根据角色id获取角色频道 + @Override + public Object getRoleChannel(Integer roleId) { + return roleMapper.getChannel(roleId); + } + @Override public BeanConsumeGold sumConsumeGold(Page page) { BeanConsumeGold gold = new BeanConsumeGold(); 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 5c9d7a1..db76d10 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java @@ -10,6 +10,7 @@ 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; @@ -32,6 +33,7 @@ import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; @@ -351,6 +353,11 @@ public class CashCollectionServiceImpl implements CashCollectionService { public String complete(CashRecord cashRecord) { + if (!Objects.equals(cashRecord.getPaymentCurrency(), cashRecord.getReceivedCurrency()) + && ("Stripe".equals(cashRecord.getPayType()) || "Paypal".equals(cashRecord.getPayType()))) { + return "支付币种与收款币种不一致"; + } + int rows = cashCollectionMapper.complete(cashRecord); String goodsName = cashCollectionMapper.selectGoodsNameByCode(cashRecord.getOrderCode()); if (goodsName .equals("金币充值")) { @@ -363,34 +370,63 @@ public class CashCollectionServiceImpl implements CashCollectionService { } //根据精网号查询姓名和地区 -@Override -public User getNameAndMarket(Integer jwcode) { - try { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String token = request.getHeader("token"); - Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); - if (admin != null) { - List list = Arrays.asList(admin.getMarkets().split(",")); - List markets = marketMapper.getMarketIds(list); - if (markets.contains("9") || markets.contains("9999")) { - markets = null; - } - GoldUser gUser = userMapper.selectUserCard(jwcode.toString(), markets); - if (gUser != null) { - User user = new User(); - user.setMarket(cashCollectionMapper.getMarketByJwcode(jwcode)); - user.setName(cashCollectionMapper.getNameByJwcode(jwcode)); - user.setMarketName(cashCollectionMapper.getMarketNameByJwcode(jwcode)); - return user; + @Override + public Result getNameAndMarket(Integer jwcode,@RequestHeader(defaultValue = "zh_CN") String lang) { + try { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String token = request.getHeader("token"); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + + if (admin != null) { + List list = Arrays.asList(admin.getMarkets().split(",")); + List markets = marketMapper.getMarketIds(list); + + // 检查用户是否存在 + int userCount = cashCollectionMapper.checkUserExists(jwcode); + if (userCount == 0) { + String message = languageTranslationUtil.translate("精网号有误!请检查", lang); + return Result.error(message); + } + + if (markets.contains("9") || markets.contains("9999")) { + // 有特殊权限,可访问所有用户 + User user = new User(); + user.setMarket(cashCollectionMapper.getMarketByJwcode(jwcode)); + user.setName(cashCollectionMapper.getNameByJwcode(jwcode)); + user.setMarketName(cashCollectionMapper.getMarketNameByJwcode(jwcode)); + return Result.success(user); + } else { + // 检查用户所在市场是否在管理员权限范围内 + String userMarket = cashCollectionMapper.getMarketByJwcode(jwcode); + + if (userMarket != null && markets.contains(userMarket)) { + // 有权限访问,返回用户信息 + User user = new User(); + user.setMarket(userMarket); + user.setName(cashCollectionMapper.getNameByJwcode(jwcode)); + user.setMarketName(cashCollectionMapper.getMarketNameByJwcode(jwcode)); + return Result.success(user); + } else { + // 无权限,返回用户所属地区 + String userMarketName = cashCollectionMapper.getMarketNameByJwcode(jwcode); + String translatedMarketName = languageTranslationUtil.translate(userMarketName, lang); + String message = languageTranslationUtil.translate("无权限访问", lang); + return Result.errorWithData(message, java.util.Map.of("market", translatedMarketName)); + } + } + } else { + // admin 为 null,即权限验证失败 + String userMarketName = cashCollectionMapper.getMarketNameByJwcode(jwcode); + String translatedMarketName = languageTranslationUtil.translate(userMarketName, lang); + String message = languageTranslationUtil.translate("无权限访问", lang); + return Result.errorWithData(message, java.util.Map.of("market", translatedMarketName)); } + } catch (Exception e) { + e.printStackTrace(); + String errorMessage = languageTranslationUtil.translate("精网号有误!请检查", lang); + return Result.error(errorMessage); } - } catch (Exception e) { - e.printStackTrace(); } - - // 如果没有返回有效用户信息,则抛出异常 - throw new RuntimeException("无法获取用户信息"); -} //获取收款活动列表 @Override 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 989fbf5..734daed 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java @@ -419,12 +419,12 @@ public class ExportExcelServiceImpl implements ExportExcelService { try { JsonNode rootNode = objectMapper.readTree(message); JsonNode requestDataNode = rootNode.path("requestData"); - JsonNode beanRechargeNode = requestDataNode.path("performanceDTO"); - PerformanceDTO performanceDTO = objectMapper.treeToValue(beanRechargeNode, PerformanceDTO.class); + JsonNode performanceDTONode = requestDataNode.path("performanceDTO"); + PerformanceDTO performanceDTO = objectMapper.treeToValue(performanceDTONode, PerformanceDTO.class); page.setPerformanceDTO(performanceDTO); - // 从请求数据中获取语言设置,如果没有则使用默认值 + // 从请求数据中获取语言设置 String lang = "zh_CN"; - JsonNode langNode = requestDataNode.path("lang"); + JsonNode langNode = rootNode.path("lang"); if (langNode != null && !langNode.asText().isEmpty()) { lang = langNode.asText(); } @@ -852,6 +852,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { // 添加铁粉用户翻译支持 if ("fanUser".equals(exportType) && list.get(0) instanceof BeanConsumeFan) { + fillUserMemberStatusDescriptions((List) list); translateBeanConsumeFanList((List) list, lang); } @@ -874,6 +875,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { // 添加财务退款翻译支持 if ("financeUser".equals(exportType) && list.get(0) instanceof CashRecordDTO) { + fillRechargeUserIsRefund((List) list); translateCashRecordDTOList((List) list, lang); } @@ -1047,7 +1049,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { case "cashUser": return CashCollection.class; case "performanceUser": - return PerformanceDTO.class; + return PerformanceVO.class; case "fundUser": return FundsDTO.class; default: @@ -1056,6 +1058,31 @@ public class ExportExcelServiceImpl implements ExportExcelService { } /** + * 填充用户会员的状态描述 + */ + private void fillUserMemberStatusDescriptions(List fans) { + if (fans != null && !fans.isEmpty()) { + for (BeanConsumeFan fan : fans) { + if (fan.getType() != null) { + fan.setTypeDesc(fanTypeToString(fan.getType())); + } + } + } + } + + /** + * 将会员类型数字转换为中文描述 + */ + private String fanTypeToString(Integer type) { + if (type == null) return ""; + switch (type) { + case 7: return "单次付费"; + case 8: return "连续包月"; + default: return "其他"; + } + } + + /** * 填充用户数据的状态描述 */ private void fillUserStatusDescriptions(List funds) { @@ -1067,6 +1094,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { } } } + /** * 将类型数字转换为中文描述 */ @@ -1106,6 +1134,20 @@ public class ExportExcelServiceImpl implements ExportExcelService { } /** + * 填充财务退款用户数据的退款方式描述 + */ + private void fillRechargeUserIsRefund(List cashRecords) { + if (cashRecords != null && !cashRecords.isEmpty()) { + for (CashRecordDTO cashRecord : cashRecords) { + if (cashRecord.getRefundModel() != null) { + String modelDesc = convertRefundModelToString(cashRecord.getRefundModel()); + cashRecord.setRefundModelDesc(modelDesc); + } + } + } + } + + /** * 填充退款用户数据的退款方式描述 */ private void fillRefundUserModelDescriptions(List refundUsers) { @@ -1179,7 +1221,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { private String convertIsRefundToString(Integer isRefund) { if (isRefund == null) return ""; switch (isRefund) { - case 0: return "未退款"; + case 0: return "正常"; case 1: return "已退款"; default: return "未知状态"; } @@ -1224,6 +1266,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { } } } + /** * 将充值平台数字转换为中文描述 */ @@ -1257,8 +1300,8 @@ public class ExportExcelServiceImpl implements ExportExcelService { if (type == null) return ""; switch (type) { case 9, 10: return "打赏"; - case 11: return "付费"; - default: return "未知"; + case 11: return "付费购买"; + default: return "其他"; } } // 各种实体类的翻译方法 @@ -1448,8 +1491,8 @@ public class ExportExcelServiceImpl implements ExportExcelService { } // 翻译会员类型 - if (item.getType() != null && !item.getType().isEmpty()) { - item.setType(languageTranslationUtil.translate(item.getType(), lang)); + if (item.getTypeDesc() != null && !item.getTypeDesc().isEmpty()) { + item.setTypeDesc(languageTranslationUtil.translate(item.getTypeDesc(), lang)); } } } @@ -1555,6 +1598,11 @@ public class ExportExcelServiceImpl implements ExportExcelService { if (item.getRefundRemark() != null && !item.getRefundRemark().isEmpty()) { item.setRefundRemark(languageTranslationUtil.translate(item.getRefundRemark(), lang)); } + + // 翻译退款方式 + if (item.getRefundModelDesc() != null && !item.getRefundModelDesc().isEmpty()) { + item.setRefundModelDesc(languageTranslationUtil.translate(item.getRefundModelDesc(), lang)); + } } } diff --git a/src/main/resources/cashMapper/CashCollectionMapper.xml b/src/main/resources/cashMapper/CashCollectionMapper.xml index cd6ff7f..c6a6590 100644 --- a/src/main/resources/cashMapper/CashCollectionMapper.xml +++ b/src/main/resources/cashMapper/CashCollectionMapper.xml @@ -72,6 +72,10 @@ payment_amount = #{cashRecordCollection.paymentAmount}, + payment_currency_orig = #{cashRecordCollection.paymentCurrencyOrig}, + + payment_amount_orig = #{cashRecordCollection.paymentAmountOrig}, + status = CASE WHEN @@ -105,6 +109,12 @@ set is_synced = 1 where id = #{orderId} + + @@ -324,7 +334,7 @@ - + diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index c7ed8d8..17abf22 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -172,6 +172,9 @@ crc.pay_time, crc.voucher, crc.remark, + crr.refund_reason, + crr.refund_remark, + crr.reject_reason, crc.payment_currency, crc.payment_amount from cash_record_refund crr @@ -224,7 +227,7 @@ ORDER BY ${sortField} ${sortOrder} - ORDER BY crr.create_time DESC + ORDER BY crr.update_time DESC @@ -247,6 +250,7 @@ crr.free_gold, crr.audit_id, crr.related_id, + crr.reject_reason, la.area_servise, la.area_finance, la.area_charge, @@ -304,7 +308,7 @@ ORDER BY ${sortField} ${sortOrder} - ORDER BY crr.create_time DESC + ORDER BY crr.update_time DESC @@ -333,10 +337,13 @@ crr.refund_voucher, crr.refund_time, crr.executor, + crr.permanent_gold, + crr.free_gold, crr.status, crr.audit_id, crr.submitter_id, crr.related_id, + crr.refund_reason, la.area_servise, la.area_finance, la.area_charge, @@ -441,11 +448,17 @@ and crc.jwcode = #{jwcode} - AND crc.market IN + AND crc.received_market IN #{markets} + + AND crc.market IN + + #{localMarket} + + and crc.`pay_time` BETWEEN #{startTime} AND #{endTime} @@ -462,6 +475,14 @@ + + + ORDER BY ${sortField} ${sortOrder} + + + ORDER BY crc.create_time DESC + +