Browse Source

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

milestone-20260113-现金管理0109
sunjiabei 4 weeks ago
parent
commit
e23c41616d
  1. 3
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  2. 25
      src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java
  3. 5
      src/main/java/com/example/demo/controller/bean/BeanConsumeController.java
  4. 62
      src/main/java/com/example/demo/controller/cash/CashCollectionController.java
  5. 54
      src/main/java/com/example/demo/controller/cash/CashRefundController.java
  6. 12
      src/main/java/com/example/demo/controller/coin/AdminController.java
  7. 28
      src/main/java/com/example/demo/controller/coin/ExportController.java
  8. 33
      src/main/java/com/example/demo/controller/coin/PermissionController.java
  9. 6
      src/main/java/com/example/demo/controller/coin/WorkbenchController.java
  10. 1
      src/main/java/com/example/demo/domain/entity/Admin.java
  11. 8
      src/main/java/com/example/demo/domain/entity/CashRecord.java
  12. 2
      src/main/java/com/example/demo/domain/entity/User.java
  13. 7
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java
  14. 31
      src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java
  15. 6
      src/main/java/com/example/demo/domain/vo/cash/FundsDTO.java
  16. 2
      src/main/java/com/example/demo/domain/vo/cash/PerformanceVO.java
  17. 2
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  18. 1
      src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
  19. 2
      src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
  20. 7
      src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java
  21. 2
      src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java
  22. 2
      src/main/java/com/example/demo/service/bean/BeanConsumeService.java
  23. 4
      src/main/java/com/example/demo/service/cash/CashCollectionService.java
  24. 1
      src/main/java/com/example/demo/service/cash/RefundService.java
  25. 2
      src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java
  26. 6
      src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java
  27. 94
      src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java
  28. 87
      src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java
  29. 176
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  30. 38
      src/main/resources/cashMapper/CashCollectionMapper.xml
  31. 33
      src/main/resources/cashMapper/CashRefundMapper.xml
  32. 2
      src/main/resources/mapper/AdminMapper.xml
  33. 14
      src/main/resources/mapper/AuditMapper.xml
  34. 13
      src/main/resources/mapper/ConsumeMapper.xml
  35. 4
      src/main/resources/mapper/GoldDetailMapper.xml
  36. 2
      src/main/resources/mapper/WorkBenchMapper.xml

3
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());
}

25
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<String> 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<String> 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<String> getGoldDetailColumnOrder() {
return Arrays.asList(
"name", "jwcode", "market", "payPlatform", "typeDesc", "sumGold",
"permanentGold", "freeGold", "taskGold", "adminName", "auditTime"
"permanentGold", "freeGold", "taskGold", "adminName", "auditTime","price"
);
}

5
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){

62
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);
}
}
}

54
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 "未知退款方式";
}
}
}

12
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")

28
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);
}
}
}

33
src/main/java/com/example/demo/controller/coin/PermissionController.java

@ -227,9 +227,10 @@ public class PermissionController {
private void translatePermissions(com.github.pagehelper.PageInfo<com.example.demo.domain.vo.coin.Permission> 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<String> positions, String lang) {

6
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<String> markets = workbenchService.getAdminMarket(account);

1
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<String> market; // 地区列表
private String markets; // 地区
private String marketName; // 地区名称
private String roleKey;
private String postiton; // 职位
private String remark; // 备注

8
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; // 手续费

2
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

7
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

31
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<Integer> statuses;
@ExcelIgnore
private String processInstanceId; // 流程实例ID

6
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<String> localMarket;
}

2
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;
}

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

@ -76,7 +76,7 @@ public class ConsumeUser implements Serializable {
private List<String> markets; // 地区列表
@ExcelIgnore
private Integer flag; //是否为员工号
private BigDecimal price; // 折扣金币
private BigDecimal price; // 原价
@ExcelIgnore
private Integer redMoney; //是否用红包
@ExcelIgnore

1
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;
}

2
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

7
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<String> selectStripeList();
List<String> selectStripe2List();
List<String> selectPaymentList();
//补全手续费后修改金币订单
void updateGoldOrder(@Param("cashRecordCollection")CashRecord cashRecord);
//根据订单号查询商品名称
String selectGoodsNameByCode(String orderCode);
}

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

@ -42,4 +42,6 @@ public interface CashRefundMapper {
List<FundsDTO> selectfunds(FundsDTO fundsDTO);
List<FundsDTO> selectRefundCount(List<Integer> needQueryIds);
void updategold(String orderCode);
}

2
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);
}

4
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<RechargeActivity> getActivityList();
//同步g_order订单到cash_record表

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

@ -32,6 +32,7 @@ public interface RefundService {
int finalreview(CashRecordDone cashRecordDone, String lang);
PageInfo<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO);
PageInfo<CashRecordDTO> financeSelect2(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO);
PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO);
//新增线上退款记录

2
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);

6
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();

94
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,41 +353,81 @@ 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<String> list = Arrays.asList(admin.getMarkets().split(","));
List<String> 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<String> list = Arrays.asList(admin.getMarkets().split(","));
List<String> 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
public List<RechargeActivity> getActivityList() {

87
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<CashRecordDTO> financeSelect2(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
// System.out.println(goldDetail.getMarkets());
List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO);
if (list.isEmpty()) {
return new PageInfo<>(list);
}
// 批量收集ID
Set<Integer> relatedIds = new HashSet<>();
Set<Integer> marketIds = new HashSet<>();
Set<Integer> submitterIds = new HashSet<>();
Set<Integer> auditIds = new HashSet<>();
Set<Integer> 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<Integer, CashCollection> cashCollectionMap = cashCollectionMapper.selectBatchIds(relatedIds)
.stream().collect(Collectors.toMap(CashCollection::getId, Function.identity()));
Map<Integer, String> marketNameMap = marketMapper.getMarketByIds(marketIds)
.stream().collect(Collectors.toMap(Market::getId, Market::getName));
Map<Integer, String> submitterNameMap = auditMapper.getNamesByIds(submitterIds)
.stream().collect(Collectors.toMap(Admin::getId, Admin::getAdminName));
Map<Integer, LhlAudit> auditMap = cashRefundMapper.getAuditBatch(auditIds)
.stream().collect(Collectors.toMap(LhlAudit::getId, Function.identity()));
Map<String, String> 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<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
// System.out.println(goldDetail.getMarkets());

176
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<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets);
// 获取传入的市场列表
List<String> 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<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets);
// 获取传入的市场列表
List<String> 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<BeanConsumeFan>) list);
translateBeanConsumeFanList((List<BeanConsumeFan>) list, lang);
}
@ -874,6 +936,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
// 添加财务退款翻译支持
if ("financeUser".equals(exportType) && list.get(0) instanceof CashRecordDTO) {
fillRechargeUserIsRefund((List<CashRecordDTO>) list);
translateCashRecordDTOList((List<CashRecordDTO>) 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<FundsDTO>) list);
translateFundsList((List<FundsDTO>) 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<BeanConsumeFan> 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<FundsDTO> funds) {
@ -1067,6 +1155,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}
}
}
/**
* 将类型数字转换为中文描述
*/
@ -1106,6 +1195,20 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}
/**
* 填充财务退款用户数据的退款方式描述
*/
private void fillRechargeUserIsRefund(List<CashRecordDTO> 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<RefundUser> 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));
}
}
}

38
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})
</insert>
<!-- <insert id="syncToCashRecord">
insert into cash_record(order_type,jwcode,name,market,activity,
@ -72,6 +72,10 @@
<if test="cashRecordCollection.paymentAmount != 0">
payment_amount = #{cashRecordCollection.paymentAmount},
</if>
payment_currency_orig = #{cashRecordCollection.paymentCurrencyOrig},
<if test="cashRecordCollection.paymentAmountOrig != 0">
payment_amount_orig = #{cashRecordCollection.paymentAmountOrig},
</if>
<!-- 只有 这些字段全部非空才更新状态 -->
status = CASE
WHEN
@ -88,12 +92,29 @@
WHERE order_code = #{cashRecordCollection.orderCode}
AND status IN (1, 3)
</update>
<!--提交手续费时修改金币订单-->
<update id="updateGoldOrder">
UPDATE user_gold_record
<set>
rate_id=#{cashRecordCollection.paymentCurrency},
<if test="cashRecordCollection.paymentAmount != 0">
money = #{cashRecordCollection.paymentAmount}
</if>
</set>
WHERE order_code = #{cashRecordCollection.orderCode}
</update>
<!--设置gOrder订单为已同步-->
<update id="markSynced">
update g_order
set is_synced = 1
where id = #{orderId}
</update>
<!-- 检查用户是否存在 -->
<select id="checkUserExists" resultType="int">
SELECT COUNT(*)
FROM user
WHERE jwcode = #{jwcode}
</select>
<!--根据jwcode获取所属地区-->
<select id="getMarketByJwcode" resultType="java.lang.String">
select market from user where jwcode=#{jwcode}
@ -198,7 +219,7 @@
ORDER BY ${cashCollection.sortField} ${cashCollection.sortOrder}
</when>
<otherwise>
ORDER BY create_time DESC
ORDER BY pay_time DESC
</otherwise>
</choose>
</select>
@ -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>
<select id="selectById" resultType="com.example.demo.domain.vo.cash.CashCollection">
@ -313,7 +334,7 @@
<!-- adminMarket筛选:如果adminMarket列表不为空且不包含研发部或总部,则筛选market表中的name等于adminMarket列表中的内容 -->
<if test="adminMarket != null and adminMarket.size() > 0">
<choose>
<when test="adminMarket.contains('研发部') or adminMarket.contains('总部')">
<when test="adminMarket.contains('研发部'.toString()) or adminMarket.contains('总部'.toString())">
<!-- 如果包含研发部或总部,则不筛选 -->
</when>
<otherwise>
@ -364,6 +385,10 @@
<select id="selectIpayList" resultType="com.example.demo.domain.vo.cash.CashCollection">
select order_code,permanent_gold from cash_record_collection where payload='Ipay88' and order_no_status=1
</select>
<!--根据订单号获取商品名称-->
<select id="selectGoodsNameByCode" resultType="java.lang.String">
select goods_name from cash_record_collection where order_code=#{orderCode}
</select>
<!--根据OrderCode订单号更新收款订单-->
<update id="updateByGoldCoinOrderCodeByPayment">
update cash_record_collection
@ -430,4 +455,5 @@
order_no_status=0
where order_code=#{orderNo}
</update>
</mapper>

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

@ -138,7 +138,11 @@
</set>
where id = #{auditId}
</update>
<update id="updategold">
update user_gold_record
set is_refund = 1
where order_code = #{orderCode}
</update>
<select id="select" resultType="com.example.demo.domain.vo.cash.CashRecordDTO">
select
@ -172,6 +176,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 +231,7 @@
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY crr.create_time DESC
ORDER BY crr.update_time DESC
</otherwise>
</choose>
</select>
@ -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}
</when>
<otherwise>
ORDER BY crr.create_time DESC
ORDER BY crr.update_time DESC
</otherwise>
</choose>
</select>
@ -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}
</if>
<if test="markets!= null and markets.size > 0">
AND crc.market IN
AND crc.received_market IN
<foreach collection="markets" item="markets" open="(" separator="," close=")">
#{markets}
</foreach>
</if>
<if test="localMarket != null and localMarket.size > 0">
AND crc.market IN
<foreach collection="localMarket" item="localMarket" open="(" separator="," close=")">
#{localMarket}
</foreach>
</if>
<if test="startTime != null and endTime != null">
and crc.`pay_time` BETWEEN #{startTime} AND #{endTime}
</if>
@ -462,6 +479,14 @@
</foreach>
</if>
</where>
<choose>
<when test="sortField != null and sortField.length > 0 or sortOrder != null and sortOrder.length > 0">
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY crc.create_time DESC
</otherwise>
</choose>
</select>
<select id="selectRefundCount" resultType="com.example.demo.domain.vo.cash.FundsDTO">
select crr.refund_currency,

2
src/main/resources/mapper/AdminMapper.xml

@ -11,6 +11,7 @@
machine_id as machineId,
admin_status as adminStatus,
market as markets,
market as marketName,
postiton as postiton,
remark as remark,
create_time as createTime,
@ -27,6 +28,7 @@
machine_id as machineId,
admin_status as adminStatus,
market as markets,
market as marketName,
postiton as postiton,
remark as remark,
create_time as createTime,

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

@ -160,8 +160,18 @@
</foreach>
)
</if>
<if test="refundAudit.startTime != null and refundAudit.endTime != null ">
AND ugr.audit_time between #{refundAudit.startTime} and #{refundAudit.endTime}
<if test="refundAudit.startTime != null and refundAudit.endTime != null">
<choose>
<when test="refundAudit.auditStatus == 1 or refundAudit.auditStatus == 2">
AND ugr.audit_time between #{refundAudit.startTime} and #{refundAudit.endTime}
</when>
<when test="refundAudit.auditStatus == 0 or refundAudit.auditStatus == 4">
AND ugr.create_time between #{refundAudit.startTime} and #{refundAudit.endTime}
</when>
<otherwise>
<!-- 如果auditStatus不是这些值,则不添加时间条件 -->
</otherwise>
</choose>
</if>
<if test="refundAudit.market != null and refundAudit.market != ''">
AND m.id = #{refundAudit.market}

13
src/main/resources/mapper/ConsumeMapper.xml

@ -87,7 +87,8 @@
ugr.remark AS remark,
a.admin_name AS adminName,
ugr.create_time AS createTime,
ugr.is_refund AS isRefund
ugr.is_refund AS isRefund,
COALESCE( ugr.price,0)/100 AS price
FROM user_gold_record ugr
left JOIN
user u ON u.jwcode = ugr.jwcode
@ -166,11 +167,10 @@
<select id="selectRefund" resultType="com.example.demo.domain.vo.coin.ConsumeUser">
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 @@
</foreach>
</if>
AND type = 2
AND audit_status = 1
AND flag = 1
</select>
<!-- 查询筛选后消费记录 -->

4
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,

2
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
<foreach item="market" collection="markets" open="(" separator="," close=")">#{market}</foreach>
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;

Loading…
Cancel
Save