Browse Source

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

milestone-20260113-现金管理0109
lijianlin 1 month ago
parent
commit
d003ace402
  1. 10
      src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java
  2. 18
      src/main/java/com/example/demo/controller/cash/CashCollectionController.java
  3. 27
      src/main/java/com/example/demo/controller/cash/CashRefundController.java
  4. 25
      src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java
  5. 1
      src/main/java/com/example/demo/service/cash/RefundService.java
  6. 82
      src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java
  7. 75
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java

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

@ -292,12 +292,14 @@ public class ExcelHeaderTranslator {
headers.put("goodsName", "产品名称"); headers.put("goodsName", "产品名称");
headers.put("goodsNum", "产品数量"); headers.put("goodsNum", "产品数量");
headers.put("numUnit", "产品单位"); headers.put("numUnit", "产品单位");
headers.put("permanentGold", "永久金币数量");
headers.put("freeGold", "免费金币数量");
headers.put("Submitter", "提交人"); headers.put("Submitter", "提交人");
headers.put("id", "序号"); headers.put("id", "序号");
headers.put("jwcode", "精网号"); headers.put("jwcode", "精网号");
headers.put("name", "姓名"); headers.put("name", "姓名");
headers.put("market", "所属地区");
headers.put("status", "订单状态");
headers.put("marketName", "所属地区");
headers.put("statusDesc", "订单状态");
headers.put("remark", "备注"); headers.put("remark", "备注");
headers.put("refundReason", "退款理由"); headers.put("refundReason", "退款理由");
headers.put("refundModelDesc", "退款方式"); headers.put("refundModelDesc", "退款方式");
@ -315,8 +317,8 @@ public class ExcelHeaderTranslator {
*/ */
public List<String> getCashRecordColumnOrder() { public List<String> getCashRecordColumnOrder() {
return Arrays.asList( return Arrays.asList(
"goodsName", "goodsNum", "numUnit", "Submitter", "id", "jwcode", "name", "market",
"status", "remark", "refundReason", "refundModelDesc"
"goodsName", "goodsNum", "numUnit", "permanentGold", "freeGold", "Submitter", "id", "jwcode", "name", "marketName",
"statusDesc", "remark", "refundReason", "refundModelDesc"
); );
} }

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

@ -351,6 +351,10 @@ public class CashCollectionController {
if (collection.getPaymentCurrency() != null) { if (collection.getPaymentCurrency() != null) {
collection.setPaymentCurrency(languageTranslationUtil.translate(collection.getPaymentCurrency(), lang)); collection.setPaymentCurrency(languageTranslationUtil.translate(collection.getPaymentCurrency(), lang));
} }
// 翻译数量单位
if (collection.getNumUnit() != null) {
collection.setNumUnit(languageTranslationUtil.translate(collection.getNumUnit(), lang));
}
} }
} }
@ -436,6 +440,13 @@ public class CashCollectionController {
cashCollection.getMarketName(), languageCode); cashCollection.getMarketName(), languageCode);
cashCollection.setMarketName(chineseMarketName); cashCollection.setMarketName(chineseMarketName);
} }
// 转换数量单位
if (cashCollection.getNumUnit() != null && !cashCollection.getNumUnit().isEmpty()) {
String chineseNumUnit = translationService.findChineseSimplifiedByTranslation(
cashCollection.getNumUnit(), languageCode);
cashCollection.setNumUnit(chineseNumUnit);
}
} }
} }
@ -513,6 +524,13 @@ public class CashCollectionController {
cashCollection.getMarketName(), languageCode); cashCollection.getMarketName(), languageCode);
cashCollection.setMarketName(chineseMarketName); cashCollection.setMarketName(chineseMarketName);
} }
// 转换数量单位
if (cashCollection.getNumUnit() != null && !cashCollection.getNumUnit().isEmpty()) {
String chineseNumUnit = translationService.findChineseSimplifiedByTranslation(
cashCollection.getNumUnit(), languageCode);
cashCollection.setNumUnit(chineseNumUnit);
}
} }
} }

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

@ -381,7 +381,7 @@ public class CashRefundController {
return Result.error(errorMsg); 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) { if (result.getCode() == 200 && result.getData() instanceof com.github.pagehelper.PageInfo) {
@ -548,6 +548,10 @@ public class CashRefundController {
String refundModelDesc = convertRefundModelToString(dto.getRefundModel()); String refundModelDesc = convertRefundModelToString(dto.getRefundModel());
dto.setRefundModelDesc(languageTranslationUtil.translate(refundModelDesc, lang)); dto.setRefundModelDesc(languageTranslationUtil.translate(refundModelDesc, lang));
} }
// 翻译商品单位
if (dto.getNumUnit() != null) {
dto.setNumUnit(languageTranslationUtil.translate(dto.getNumUnit(), lang));
}
} }
} }
} }
@ -640,6 +644,13 @@ public class CashRefundController {
cashRecordDTO.getPaymentCurrency(), languageCode); cashRecordDTO.getPaymentCurrency(), languageCode);
cashRecordDTO.setPaymentCurrency(chineseCurrency); cashRecordDTO.setPaymentCurrency(chineseCurrency);
} }
// 转换商品单位
if (cashRecordDTO.getNumUnit() != null && !cashRecordDTO.getNumUnit().isEmpty()) {
String chineseNumUnit = translationService.findChineseSimplifiedByTranslation(
cashRecordDTO.getNumUnit(), languageCode);
cashRecordDTO.setNumUnit(chineseNumUnit);
}
} }
} }
@ -675,6 +686,20 @@ public class CashRefundController {
cashRecordRefund.getRefundCurrency(), languageCode); cashRecordRefund.getRefundCurrency(), languageCode);
cashRecordRefund.setRefundCurrency(chineseCurrency); 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);
}
} }
} }

25
src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java

@ -1,9 +1,6 @@
package com.example.demo.domain.vo.cash; package com.example.demo.domain.vo.cash;
import com.alibaba.excel.annotation.ExcelIgnore; 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.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@ -31,6 +28,8 @@ public class CashRecordDTO{
private String goodsName;// 商品名称 private String goodsName;// 商品名称
private Integer goodsNum;// 商品数量 private Integer goodsNum;// 商品数量
private String numUnit;// 商品单位 private String numUnit;// 商品单位
private BigDecimal permanentGold;//永久金币
private BigDecimal freeGold;// 免费金币
@ExcelIgnore @ExcelIgnore
private BigDecimal gold;//永久金币 private BigDecimal gold;//永久金币
@ExcelIgnore @ExcelIgnore
@ -96,8 +95,9 @@ public class CashRecordDTO{
/** /**
* 所属地区 * 所属地区
*/ */
@ExcelProperty(value = "",converter = MarketConverter.class)
@ExcelIgnore
private Integer market; private Integer market;
private String marketName;
/** /**
* 金币订单号 * 金币订单号
@ -112,18 +112,6 @@ public class CashRecordDTO{
private String bankCode; private String bankCode;
/** /**
* 永久金币
*/
@ExcelIgnore
private BigDecimal permanentGold;
/**
* 免费金币
*/
@ExcelIgnore
private BigDecimal freeGold;
/**
* 审核人id * 审核人id
*/ */
@ExcelIgnore @ExcelIgnore
@ -141,8 +129,9 @@ public class CashRecordDTO{
30总部财务待审核32总部财务驳回 30总部财务待审核32总部财务驳回
40执行人待处理41执行人已处理退款结束 40执行人待处理41执行人已处理退款结束
*/ */
@ExcelProperty(value="",converter = OrderStatusConverter.class)
@ExcelIgnore
private Integer status; private Integer status;
private String statusDesc;
/** /**
* 提交人id * 提交人id
@ -267,8 +256,6 @@ public class CashRecordDTO{
@ExcelIgnore @ExcelIgnore
private String executorName; private String executorName;
@ExcelIgnore @ExcelIgnore
private String marketName;
@ExcelIgnore
private List<Integer> statuses; private List<Integer> statuses;
@ExcelIgnore @ExcelIgnore
private String processInstanceId; // 流程实例ID private String processInstanceId; // 流程实例ID

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

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

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

@ -361,7 +361,14 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
userGoldRecord.setType((byte) 2); userGoldRecord.setType((byte) 2);
userGoldRecord.setIsRefund((byte) 1); userGoldRecord.setIsRefund((byte) 1);
userGoldRecord.setRefundType("金币退款"); 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.setJwcode(cashRecordDone.getJwcode());
userGoldRecord.setSumGold(cashRecordDone.getPermanentGold()+cashRecordDone.getFreeGold()); userGoldRecord.setSumGold(cashRecordDone.getPermanentGold()+cashRecordDone.getFreeGold());
userGoldRecord.setPermanentGold(cashRecordDone.getPermanentGold()); userGoldRecord.setPermanentGold(cashRecordDone.getPermanentGold());
@ -418,6 +425,79 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
@Override @Override
public PageInfo<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) { public PageInfo<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
List<String> markets = marketMapper.getMarketIds(cashRecordDTO.getMarkets());
if (markets.contains("9") || markets.contains("9999")){
markets=null;
}
cashRecordDTO.setMarkets(markets);
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> financeSelect2(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
List<String> markets = marketMapper.getMarketIds(cashRecordDTO.getMarkets());
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
// System.out.println(goldDetail.getMarkets()); // System.out.println(goldDetail.getMarkets());
List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO); List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO);

75
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.domain.vo.coin.*;
import com.example.demo.mapper.coin.ExportMapper; 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.ExportExcelService;
import com.example.demo.service.coin.MarketService;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; 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.security.authentication.AuthenticationManager;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
@ -88,6 +91,8 @@ public class ExportExcelServiceImpl implements ExportExcelService {
private static final int PAGE_SIZE = 5000; private static final int PAGE_SIZE = 5000;
@Autowired @Autowired
private ExportMapper exportMapper; private ExportMapper exportMapper;
@Autowired
private MarketService marketService;
@Transactional @Transactional
@Override @Override
@ -352,8 +357,36 @@ public class ExportExcelServiceImpl implements ExportExcelService {
JsonNode rootNode = objectMapper.readTree(message); JsonNode rootNode = objectMapper.readTree(message);
JsonNode requestDataNode = rootNode.path("requestData"); JsonNode requestDataNode = rootNode.path("requestData");
JsonNode beanRechargeNode = requestDataNode.path("cashRecordDTO"); JsonNode beanRechargeNode = requestDataNode.path("cashRecordDTO");
String token = rootNode.path("token").asText();
CashRecordDTO cashRecordDTO = objectMapper.treeToValue(beanRechargeNode, CashRecordDTO.class); CashRecordDTO cashRecordDTO = objectMapper.treeToValue(beanRechargeNode, CashRecordDTO.class);
page.setCashRecordDTO(cashRecordDTO); 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"; String lang = "zh_CN";
JsonNode langNode = requestDataNode.path("lang"); JsonNode langNode = requestDataNode.path("lang");
@ -895,7 +928,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); fillUserStatusDescriptions((List<FundsDTO>) list);
translateFundsList((List<FundsDTO>) list, lang); translateFundsList((List<FundsDTO>) list, lang);
} }
@ -1304,6 +1337,34 @@ public class ExportExcelServiceImpl implements ExportExcelService {
default: 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 + ")";
}
}
// 各种实体类的翻译方法 // 各种实体类的翻译方法
/** /**
@ -1603,6 +1664,18 @@ public class ExportExcelServiceImpl implements ExportExcelService {
if (item.getRefundModelDesc() != null && !item.getRefundModelDesc().isEmpty()) { if (item.getRefundModelDesc() != null && !item.getRefundModelDesc().isEmpty()) {
item.setRefundModelDesc(languageTranslationUtil.translate(item.getRefundModelDesc(), lang)); 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);
}
} }
} }

Loading…
Cancel
Save