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..d77697f 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" ); } @@ -294,15 +292,17 @@ public class ExcelHeaderTranslator { headers.put("goodsName", "产品名称"); headers.put("goodsNum", "产品数量"); headers.put("numUnit", "产品单位"); + headers.put("permanentGold", "永久金币数量"); + headers.put("freeGold", "免费金币数量"); headers.put("Submitter", "提交人"); headers.put("id", "序号"); headers.put("jwcode", "精网号"); headers.put("name", "姓名"); - headers.put("market", "所属地区"); - headers.put("status", "订单状态"); + headers.put("marketName", "所属地区"); + headers.put("statusDesc", "订单状态"); headers.put("remark", "备注"); headers.put("refundReason", "退款理由"); - headers.put("refundModel", "退款方式"); + headers.put("refundModelDesc", "退款方式"); // 如果需要翻译,则翻译表头 if (!isChineseLanguage(lang)) { @@ -317,8 +317,8 @@ public class ExcelHeaderTranslator { */ public List getCashRecordColumnOrder() { return Arrays.asList( - "goodsName", "goodsNum", "numUnit", "Submitter", "id", "jwcode", "name", "market", - "status", "remark", "refundReason", "refundModel" + "goodsName", "goodsNum", "numUnit", "permanentGold", "freeGold", "Submitter", "id", "jwcode", "name", "marketName", + "statusDesc", "remark", "refundReason", "refundModelDesc" ); } @@ -411,7 +411,7 @@ public class ExcelHeaderTranslator { headers.put("freeBean", "免费金豆数"); headers.put("buyBean", "付费金豆数"); headers.put("channel", "频道"); - headers.put("type", "会员类型"); + headers.put("typeDesc", "会员类型"); headers.put("consumeTime", "加入时间"); // 如果需要翻译,则翻译表头 @@ -428,7 +428,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 +493,7 @@ public class ExcelHeaderTranslator { headers.put("taskGold", "任务金币"); headers.put("adminName", "提交人"); headers.put("auditTime", "更新时间"); + headers.put("price", "原价"); // 如果需要翻译,则翻译表头 if (!isChineseLanguage(lang)) { @@ -508,7 +509,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..dbd484f 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); } } @@ -340,6 +351,10 @@ public class CashCollectionController { if (collection.getPaymentCurrency() != null) { collection.setPaymentCurrency(languageTranslationUtil.translate(collection.getPaymentCurrency(), lang)); } + // 翻译数量单位 + if (collection.getNumUnit() != null) { + collection.setNumUnit(languageTranslationUtil.translate(collection.getNumUnit(), lang)); + } } } @@ -418,6 +433,20 @@ 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); + } + + // 转换数量单位 + if (cashCollection.getNumUnit() != null && !cashCollection.getNumUnit().isEmpty()) { + String chineseNumUnit = translationService.findChineseSimplifiedByTranslation( + cashCollection.getNumUnit(), languageCode); + cashCollection.setNumUnit(chineseNumUnit); + } } } @@ -481,6 +510,27 @@ 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); + } + + // 转换数量单位 + if (cashCollection.getNumUnit() != null && !cashCollection.getNumUnit().isEmpty()) { + String chineseNumUnit = translationService.findChineseSimplifiedByTranslation( + cashCollection.getNumUnit(), languageCode); + cashCollection.setNumUnit(chineseNumUnit); + } } } 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..4988f2f 100644 --- a/src/main/java/com/example/demo/controller/cash/CashRefundController.java +++ b/src/main/java/com/example/demo/controller/cash/CashRefundController.java @@ -381,7 +381,7 @@ public class CashRefundController { return Result.error(errorMsg); } - Result result = Result.success(refundService.financeSelect(page.getPageNum(), page.getPageSize(), page.getCashRecordDTO())); + Result result = Result.success(refundService.financeSelect2(page.getPageNum(), page.getPageSize(), page.getCashRecordDTO())); // 对返回结果进行多语言转换 if (result.getCode() == 200 && result.getData() instanceof com.github.pagehelper.PageInfo) { @@ -543,6 +543,19 @@ 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)); + } + // 翻译商品单位 + if (dto.getNumUnit() != null) { + dto.setNumUnit(languageTranslationUtil.translate(dto.getNumUnit(), lang)); + } + // 翻译退款币种 + if (dto.getRefundCurrency() != null) { + dto.setRefundCurrency(languageTranslationUtil.translate(dto.getRefundCurrency(), lang)); + } } } } @@ -635,6 +648,20 @@ public class CashRefundController { cashRecordDTO.getPaymentCurrency(), languageCode); cashRecordDTO.setPaymentCurrency(chineseCurrency); } + + // 转换商品单位 + if (cashRecordDTO.getNumUnit() != null && !cashRecordDTO.getNumUnit().isEmpty()) { + String chineseNumUnit = translationService.findChineseSimplifiedByTranslation( + cashRecordDTO.getNumUnit(), languageCode); + cashRecordDTO.setNumUnit(chineseNumUnit); + } + + // 转换退款币种 + if (cashRecordDTO.getRefundCurrency() != null && !cashRecordDTO.getRefundCurrency().isEmpty()) { + String chineseCurrency = translationService.findChineseSimplifiedByTranslation( + cashRecordDTO.getRefundCurrency(), languageCode); + cashRecordDTO.setRefundCurrency(chineseCurrency); + } } } @@ -670,6 +697,20 @@ public class CashRefundController { cashRecordRefund.getRefundCurrency(), languageCode); cashRecordRefund.setRefundCurrency(chineseCurrency); } + + // 转换所属地区 + if (cashRecordRefund.getMarketName() != null && !cashRecordRefund.getMarketName().isEmpty()) { + String chineseMarket = translationService.findChineseSimplifiedByTranslation( + cashRecordRefund.getMarketName(), languageCode); + cashRecordRefund.setMarketName(chineseMarket); + } + + // 转换提交人地区 + if (cashRecordRefund.getSubmitterMarket() != null && !cashRecordRefund.getSubmitterMarket().isEmpty()) { + String chineseMarket = translationService.findChineseSimplifiedByTranslation( + cashRecordRefund.getSubmitterMarket(), languageCode); + cashRecordRefund.setSubmitterMarket(chineseMarket); + } } } @@ -726,4 +767,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..18cf473 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); } } } @@ -784,6 +781,13 @@ public class ExportController { cashCollection.getRejectReason(), languageCode); cashCollection.setRejectReason(chineseRejectReason); } + + // 转换提交人地区 + if (cashCollection.getSubmitterMarket() != null && !cashCollection.getSubmitterMarket().isEmpty()) { + String chineseMarket = translationService.findChineseSimplifiedByTranslation( + cashCollection.getSubmitterMarket(), languageCode); + cashCollection.setSubmitterMarket(chineseMarket); + } } } 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..94c8f5a 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 @@ -1,10 +1,6 @@ package com.example.demo.domain.vo.cash; 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; @@ -32,6 +28,8 @@ public class CashRecordDTO{ private String goodsName;// 商品名称 private Integer goodsNum;// 商品数量 private String numUnit;// 商品单位 + private BigDecimal permanentGold;//永久金币 + private BigDecimal freeGold;// 免费金币 @ExcelIgnore private BigDecimal gold;//永久金币 @ExcelIgnore @@ -97,8 +95,9 @@ public class CashRecordDTO{ /** * 所属地区 */ - @ExcelProperty(value = "",converter = MarketConverter.class) + @ExcelIgnore private Integer market; + private String marketName; /** * 金币订单号 @@ -113,18 +112,6 @@ public class CashRecordDTO{ private String bankCode; /** - * 永久金币 - */ - @ExcelIgnore - private BigDecimal permanentGold; - - /** - * 免费金币 - */ - @ExcelIgnore - private BigDecimal freeGold; - - /** * 审核人id */ @ExcelIgnore @@ -142,8 +129,9 @@ public class CashRecordDTO{ 30:总部财务待审核;32:总部财务驳回; 40:执行人待处理;41:执行人已处理,退款结束 */ - @ExcelProperty(value="",converter = OrderStatusConverter.class) + @ExcelIgnore private Integer status; + private String statusDesc; /** * 提交人id @@ -182,8 +170,9 @@ public class CashRecordDTO{ /** * 退款方式(0全额/1部分) */ - @ExcelProperty(value = "",converter = RefundModelConverter.class) - private Integer refundModel; + @ExcelIgnore + private Byte refundModel; + private String refundModelDesc; //退款方式转换 /** * 退款执行人OA号 @@ -267,8 +256,6 @@ public class CashRecordDTO{ @ExcelIgnore private String executorName; @ExcelIgnore - private String marketName; - @ExcelIgnore private List statuses; @ExcelIgnore private String processInstanceId; // 流程实例ID 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 0577fa7..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); //新增收款订单 @@ -86,5 +88,8 @@ public interface CashCollectionMapper { List selectStripeList(); List selectStripe2List(); List selectPaymentList(); - + //补全手续费后,修改金币订单 + void updateGoldOrder(@Param("cashRecordCollection")CashRecord cashRecord); + //根据订单号查询商品名称 + String selectGoodsNameByCode(String orderCode); } 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 ebedef9..4d2bb91 100644 --- a/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java +++ b/src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java @@ -42,4 +42,6 @@ public interface CashRefundMapper { List selectfunds(FundsDTO fundsDTO); List selectRefundCount(List needQueryIds); + + void updategold(String orderCode); } \ No newline at end of file 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/service/cash/RefundService.java b/src/main/java/com/example/demo/service/cash/RefundService.java index 608f32c..8baa23c 100644 --- a/src/main/java/com/example/demo/service/cash/RefundService.java +++ b/src/main/java/com/example/demo/service/cash/RefundService.java @@ -32,6 +32,7 @@ public interface RefundService { int finalreview(CashRecordDone cashRecordDone, String lang); PageInfo financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO); + PageInfo financeSelect2(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO); PageInfo exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO); //新增线上退款记录 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 838ed44..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; @@ -239,6 +241,8 @@ public class CashCollectionServiceImpl implements CashCollectionService { if (cashRecord.getGoodsName().equals("金币充值")) { if (cashRecord.getPermanentGold() == 0 && cashRecord.getFreeGold() == 0) { throw new IllegalArgumentException("金币数量不能为空"); + }if (cashRecord.getPermanentGold() == 0){ + throw new IllegalArgumentException("永久金币数量不能为空"); } } @@ -349,40 +353,80 @@ 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("金币充值")) { + cashRecord.setOrderCode(cashRecord.getOrderCode().replace("XJ_", "XJCZ_")); + //修改金币订单 + cashCollectionMapper.updateGoldOrder(cashRecord); + } return rows > 0 ? "编辑成功" : "编辑失败"; } //根据精网号查询姓名和地区 -@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/cash/CashRefundServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java index 3c1e6e8..da5a86d 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java @@ -354,14 +354,25 @@ CashRecordDone cashRecordDone1 = new CashRecordDone(); cashRefundMapper.updateStatus(cashRecordDone1); }} if (cashRecordDone.getGoodsName() != null &&cashRecordDone.getStatus() ==40 && - (cashRecordDone.getGoodsName().equals("金币充值") || - cashRecordDone.getGoodsName().contains("金币充值"))) { + (cashRecordDone.getGoodsName().equals(languageTranslationUtil.translate("金币充值", lang))|| + cashRecordDone.getGoodsName().contains(languageTranslationUtil.translate("金币充值", lang)))) { UserGoldRecord userGoldRecord = new UserGoldRecord(); userGoldRecord.setOrderCode(cashRecordDone.getOrderCode()); + String orderCode = cashRecordDone.getOrderCode(); + if (orderCode != null && orderCode.length() > 2 && orderCode.startsWith("TK")) { + orderCode = orderCode.substring(2); + } userGoldRecord.setType((byte) 2); userGoldRecord.setIsRefund((byte) 1); userGoldRecord.setRefundType("金币退款"); - userGoldRecord.setCrefundModel(cashRecordDone.getRefundModel()); + if (cashRecordDone.getRefundModel() == 1){ + userGoldRecord.setRefundModel(Byte.valueOf("1")); + } + else if (cashRecordDone.getRefundModel() == 0){ + userGoldRecord.setRefundModel(Byte.valueOf("0")); + } + + userGoldRecord.setJwcode(cashRecordDone.getJwcode()); userGoldRecord.setSumGold(cashRecordDone.getPermanentGold()+cashRecordDone.getFreeGold()); userGoldRecord.setPermanentGold(cashRecordDone.getPermanentGold()); @@ -375,7 +386,7 @@ CashRecordDone cashRecordDone1 = new CashRecordDone(); userGoldRecord.setFreeJune(cashRecordDone.getFreeGold()); userGoldRecord.setFreeDecember(0); } - userGoldRecord.setGoodsName(cashRecordDone.getGoodsName()); + userGoldRecord.setGoodsName("金币充值"); userGoldRecord.setPayPlatform("金币系统"); userGoldRecord.setRemark(cashRecordDone.getRemark()); userGoldRecord.setAdminId(cashRecordDone.getAdminId()); @@ -385,6 +396,7 @@ CashRecordDone cashRecordDone1 = new CashRecordDone(); userGoldRecord.setUpdateTime(new Date()); String auditName = auditMapper.getName(cashRecordDone.getAuditId()); refundMapper.add(userGoldRecord); + cashRefundMapper.updategold(orderCode); User user = new User(); user.setJwcode(userGoldRecord.getJwcode()); user.setCurrentPermanentGold(BigDecimal.valueOf(-userGoldRecord.getPermanentGold())); //当前永久金币 @@ -484,6 +496,73 @@ CashRecordDone cashRecordDone1 = new CashRecordDone(); } @Override + public PageInfo financeSelect2(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) { + PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper +// System.out.println(goldDetail.getMarkets()); + List list = cashRefundMapper.financeSelect(cashRecordDTO); + if (list.isEmpty()) { + return new PageInfo<>(list); + } + + // 批量收集ID + Set relatedIds = new HashSet<>(); + Set marketIds = new HashSet<>(); + Set submitterIds = new HashSet<>(); + Set auditIds = new HashSet<>(); + Set executorIds = new HashSet<>(); + + list.forEach(item -> { + if (item.getRelatedId() != null) relatedIds.add(item.getRelatedId()); + if (item.getMarket() != null) marketIds.add(item.getMarket()); + if (item.getSubmitterId() != null) submitterIds.add(item.getSubmitterId()); + if (item.getAuditId() != null) auditIds.add(item.getAuditId()); + if (item.getExecutor() != null) executorIds.add(item.getExecutor()); + }); + + // 批量查询 + Map cashCollectionMap = cashCollectionMapper.selectBatchIds(relatedIds) + .stream().collect(Collectors.toMap(CashCollection::getId, Function.identity())); + + Map marketNameMap = marketMapper.getMarketByIds(marketIds) + .stream().collect(Collectors.toMap(Market::getId, Market::getName)); + + Map submitterNameMap = auditMapper.getNamesByIds(submitterIds) + .stream().collect(Collectors.toMap(Admin::getId, Admin::getAdminName)); + + Map auditMap = cashRefundMapper.getAuditBatch(auditIds) + .stream().collect(Collectors.toMap(LhlAudit::getId, Function.identity())); + Map executorNameMap = auditMapper.getNamesByJwcodes(executorIds) + .stream().collect(Collectors.toMap(Admin::getAccount, Admin::getAdminName)); + + // 处理数据 + list.forEach(item -> { + CashCollection cashCollection = cashCollectionMap.get(item.getRelatedId()); + if (cashCollection != null) { + processCashCollection(item, cashCollection); + } + + + String marketName = marketNameMap.get(item.getMarket()); + String submitter = submitterNameMap.get(item.getSubmitterId()); + LhlAudit lhlAudit = auditMap.get(item.getAuditId()); + String executorName = executorNameMap.get(String.valueOf(item.getExecutor())); + + item.setMarketName(marketName != null ? marketName : ""); + item.setSubmitter(submitter != null ? submitter : ""); + item.setExecutorName(executorName != null ? executorName : ""); + + if (lhlAudit != null) { + item.setAreaServise(lhlAudit.getAreaServise()); + item.setAreaFinance(lhlAudit.getAreaFinance()); + item.setAreaCharge(lhlAudit.getAreaCharge()); + item.setHeadFinance(lhlAudit.getHeadFinance()); + } + }); + + return new PageInfo<>(list); + } + + @Override public PageInfo exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) { PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper // System.out.println(goldDetail.getMarkets()); 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..db64d4b 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java @@ -29,7 +29,9 @@ import com.example.demo.domain.vo.cash.PerformanceVO; import com.example.demo.domain.vo.coin.*; import com.example.demo.mapper.coin.ExportMapper; +import com.example.demo.mapper.coin.MarketMapper; import com.example.demo.service.coin.ExportExcelService; +import com.example.demo.service.coin.MarketService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -43,6 +45,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; import java.io.*; import java.util.*; @@ -88,6 +91,8 @@ public class ExportExcelServiceImpl implements ExportExcelService { private static final int PAGE_SIZE = 5000; @Autowired private ExportMapper exportMapper; + @Autowired + private MarketService marketService; @Transactional @Override @@ -352,8 +357,36 @@ public class ExportExcelServiceImpl implements ExportExcelService { JsonNode rootNode = objectMapper.readTree(message); JsonNode requestDataNode = rootNode.path("requestData"); JsonNode beanRechargeNode = requestDataNode.path("cashRecordDTO"); + String token = rootNode.path("token").asText(); CashRecordDTO cashRecordDTO = objectMapper.treeToValue(beanRechargeNode, CashRecordDTO.class); page.setCashRecordDTO(cashRecordDTO); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + List markets = marketService.getMarketIds(userMarkets); + + + // 获取传入的市场列表 + List requestedMarkets = page.getCashRecordDTO() != null ? page.getCashRecordDTO().getMarkets() : null; + + // 权限校验逻辑 + if (markets.contains("9") || markets.contains("9999")) { + // 特权市场:9 或 9999,跳过权限校验,直接放行传入的 markets + // 如果业务需要,也可以在这里做空值处理 + if (page.getCashRecordDTO() != null) { + // 保持 requestedMarkets 不变,原样接受 + // 可选:如果 requestedMarkets 为 null,可设为默认值或保持 null + } + } else { + // 普通用户:必须校验权限 + if (requestedMarkets == null || requestedMarkets.isEmpty()) { + page.getCashRecordDTO().setMarkets(markets); + } + if (!markets.containsAll(requestedMarkets)) { + String errorMsg = "无权限!请求的市场不在授权范围内。"; + return Result.error(errorMsg); + } + // 校验通过,保持 requestedMarkets 不变 + } // 从请求数据中获取语言设置,如果没有则使用默认值 String lang = "zh_CN"; JsonNode langNode = requestDataNode.path("lang"); @@ -397,8 +430,36 @@ public class ExportExcelServiceImpl implements ExportExcelService { JsonNode rootNode = objectMapper.readTree(message); JsonNode requestDataNode = rootNode.path("requestData"); JsonNode beanRechargeNode = requestDataNode.path("fundsDTO"); + String token = rootNode.path("token").asText(); FundsDTO fundsDTO = objectMapper.treeToValue(beanRechargeNode, FundsDTO.class); page.setFundsDTO(fundsDTO); + Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + List userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ",")); + List markets = marketService.getMarketIds(userMarkets); + + + // 获取传入的市场列表 + List requestedMarkets = page.getFundsDTO() != null ? page.getFundsDTO().getMarkets() : null; + + // 权限校验逻辑 + if (markets.contains("9") || markets.contains("9999")) { + // 特权市场:9 或 9999,跳过权限校验,直接放行传入的 markets + // 如果业务需要,也可以在这里做空值处理 + if (page.getFundsDTO() != null) { + // 保持 requestedMarkets 不变,原样接受 + // 可选:如果 requestedMarkets 为 null,可设为默认值或保持 null + } + } else { + // 普通用户:必须校验权限 + if (requestedMarkets == null || requestedMarkets.isEmpty()) { + page.getFundsDTO().setMarkets(markets); + } + if (!markets.containsAll(requestedMarkets)) { + String errorMsg = "无权限!请求的市场不在授权范围内。"; + return Result.error(errorMsg); + } + // 校验通过,保持 requestedMarkets 不变 + } // 从请求数据中获取语言设置,如果没有则使用默认值 String lang = "zh_CN"; JsonNode langNode = requestDataNode.path("lang"); @@ -419,12 +480,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 +913,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { // 添加铁粉用户翻译支持 if ("fanUser".equals(exportType) && list.get(0) instanceof BeanConsumeFan) { + fillUserMemberStatusDescriptions((List) list); translateBeanConsumeFanList((List) list, lang); } @@ -874,6 +936,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { // 添加财务退款翻译支持 if ("financeUser".equals(exportType) && list.get(0) instanceof CashRecordDTO) { + fillRechargeUserIsRefund((List) list); translateCashRecordDTOList((List) list, lang); } @@ -893,7 +956,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { } // 添加资金流水翻译支持 - if ("fundsUser".equals(exportType) && list.get(0) instanceof FundsDTO) { + if ("fundUser".equals(exportType) && list.get(0) instanceof FundsDTO) { fillUserStatusDescriptions((List) list); translateFundsList((List) list, lang); } @@ -1047,7 +1110,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 +1119,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 +1155,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { } } } + /** * 将类型数字转换为中文描述 */ @@ -1106,6 +1195,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 +1282,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 +1327,7 @@ public class ExportExcelServiceImpl implements ExportExcelService { } } } + /** * 将充值平台数字转换为中文描述 */ @@ -1257,10 +1361,38 @@ 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 "其他"; } } + + /** + * 根据状态值获取状态描述 + */ + private String getStatusDescription(Integer status) { + if (status == null) return ""; + + switch (status) { + case 0: return "线下财务待审核"; + case 1: return "线下财务审核通过待填手续费"; + case 2: return "线下财务审核驳回"; + case 3: return "link线上财务复核待填手续费"; + case 4: return "收款流程全部结束"; + case 5: return "手动撤回待编辑提交"; + case 6: return "退款"; + case 10: return "地区财务待审核"; + case 11: return "地区财务手动撤回待编辑提交"; + case 12: return "地区财务驳回"; + case 20: return "地区负责人待审核"; + case 22: return "地区负责人驳回"; + case 30: return "总部财务待审核"; + case 32: return "总部财务驳回"; + case 40: return "执行人待处理"; + case 41: return "执行人已处理,退款结束"; + default: return "未知状态(" + status + ")"; + } + } + // 各种实体类的翻译方法 /** @@ -1448,8 +1580,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 +1687,28 @@ 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)); + } + + // 翻译所属地区名称 + if (item.getMarketName() != null && !item.getMarketName().isEmpty()) { + item.setMarketName(languageTranslationUtil.translate(item.getMarketName(), lang)); + } + + // 翻译订单状态(首先获取状态的中文描述,然后进行多语言翻译) + if (item.getStatus() != null) { + String statusDesc = getStatusDescription(item.getStatus()); + String translatedStatus = languageTranslationUtil.translate(statusDesc, lang); + item.setStatusDesc(translatedStatus); + } + + // 翻译商品单位 + if (item.getNumUnit() != null && !item.getNumUnit().isEmpty()) { + item.setNumUnit(languageTranslationUtil.translate(item.getNumUnit(), lang)); + } } } diff --git a/src/main/resources/cashMapper/CashCollectionMapper.xml b/src/main/resources/cashMapper/CashCollectionMapper.xml index 9dd76e4..7f25eef 100644 --- a/src/main/resources/cashMapper/CashCollectionMapper.xml +++ b/src/main/resources/cashMapper/CashCollectionMapper.xml @@ -9,12 +9,12 @@ cash_record_collection(order_type,jwcode,name,market,activity, order_code,bank_code,goods_name,good_num,num_unit,permanent_gold,free_gold, payment_currency,payment_amount,received_market, - pay_type,pay_time,status,submitter_id,submitter_market,payload, + pay_type,pay_time,status,submitter_id,submitter_market,payload,audit_time, voucher,remark) values(#{orderType},#{jwcode},#{name},#{market},#{activity}, #{orderCode},#{bankCode},#{goodsName},#{goodNum},#{numUnit},#{permanentGold},#{freeGold},#{paymentCurrency}, #{paymentAmount},#{receivedMarket},#{payType},#{payTime}, - #{status},#{submitterId},#{submitterMarket},#{payload},#{voucher},#{remark}) + #{status},#{submitterId},#{submitterMarket},#{payload},#{auditTime},#{voucher},#{remark}) status = CASE WHEN @@ -88,12 +92,29 @@ WHERE order_code = #{cashRecordCollection.orderCode} AND status IN (1, 3) + + + UPDATE user_gold_record + + rate_id=#{cashRecordCollection.paymentCurrency}, + + money = #{cashRecordCollection.paymentAmount} + + + WHERE order_code = #{cashRecordCollection.orderCode} + update g_order set is_synced = 1 where id = #{orderId} + + @@ -230,8 +251,8 @@ success_time,ios_environment,ios_transaction_id,ios_receipt_data,firstdata_ipgTransactionId, add_time,is_synced from g_order - where is_synced=0 and state=1 and pay_style in(3,5,6,7,9) - and success_time>=1763136000 + where is_synced=0 and state=1 and pay_style in(3,5,6,7,9,10,15) + and success_time>=1767196800 limit #{size} select order_code,permanent_gold from cash_record_collection where payload='Ipay88' and order_no_status=1 + + update cash_record_collection @@ -430,4 +455,5 @@ order_no_status=0 where order_code=#{orderNo} + \ No newline at end of file diff --git a/src/main/resources/cashMapper/CashRefundMapper.xml b/src/main/resources/cashMapper/CashRefundMapper.xml index c7ed8d8..638535d 100644 --- a/src/main/resources/cashMapper/CashRefundMapper.xml +++ b/src/main/resources/cashMapper/CashRefundMapper.xml @@ -138,7 +138,11 @@ where id = #{auditId} - + + update user_gold_record + set is_refund = 1 + where order_code = #{orderCode} + @@ -247,6 +254,7 @@ crr.free_gold, crr.audit_id, crr.related_id, + crr.reject_reason, la.area_servise, la.area_finance, la.area_charge, @@ -304,7 +312,7 @@ ORDER BY ${sortField} ${sortOrder} - ORDER BY crr.create_time DESC + ORDER BY crr.update_time DESC @@ -333,10 +341,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 +452,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 +479,14 @@ + + + ORDER BY ${sortField} ${sortOrder} + + + ORDER BY crc.create_time DESC + + SELECT order_code, - sum_gold, - permanent_gold, - free_june, - free_december, - task_gold, + COALESCE(sum_gold, 0)/100 as sumGold, + COALESCE(permanent_gold, 0)/100 as permanentGold, + (COALESCE(free_june, 0) + COALESCE(free_december, 0))/100 as freeGold, + COALESCE(task_gold, 0)/100 as taskGold, refund_model FROM user_gold_record @@ -183,6 +183,7 @@ AND type = 2 + AND audit_status = 1 AND flag = 1 diff --git a/src/main/resources/mapper/GoldDetailMapper.xml b/src/main/resources/mapper/GoldDetailMapper.xml index b1d3b7d..a123213 100644 --- a/src/main/resources/mapper/GoldDetailMapper.xml +++ b/src/main/resources/mapper/GoldDetailMapper.xml @@ -30,7 +30,9 @@ `ugr`.type, `ugr`.is_refund, `ugr`.order_code, - `ugr`.goods_name,`ugr`.price,`ugr`.link_id, + `ugr`.goods_name, + ROUND(`ugr`.price/100.0, 2) AS price, + `ugr`.link_id, Round((`ugr`.free_june + `ugr`.free_december) / 100.0, 2) AS freeGold, ROUND(`ugr`.sum_gold / 100.0, 2) AS SumGold, ROUND(`ugr`.permanent_gold / 100.0, 2) AS PermanentGold, diff --git a/src/main/resources/mapper/WorkBenchMapper.xml b/src/main/resources/mapper/WorkBenchMapper.xml index b45bc45..a272d4d 100644 --- a/src/main/resources/mapper/WorkBenchMapper.xml +++ b/src/main/resources/mapper/WorkBenchMapper.xml @@ -185,7 +185,7 @@ WHERE cr.received_currency IN (2,3,4,5,6,7,8) -- 只统计这7种币 AND m.name IN #{market} - AND cr.audit_time BETWEEN #{startDate} AND #{endDate} + AND cr.received_time BETWEEN #{startDate} AND #{endDate} AND cr.order_type=1 AND cr.status IN (0,1,3,4,6) GROUP BY m.name;