Browse Source

Merge branch 'milestone-20260113-现金管理0109' of http://39.101.133.168:8807/huangqizhen/gold-java into lijianlin/feature-20260113-现金管理0109

lijianlin/feature-20260113-现金管理0109
lijianlin 1 month ago
parent
commit
e9f803e292
  1. 3
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  2. 17
      src/main/java/com/example/demo/Util/ExcelHeaderTranslator.java
  3. 5
      src/main/java/com/example/demo/controller/bean/BeanConsumeController.java
  4. 44
      src/main/java/com/example/demo/controller/cash/CashCollectionController.java
  5. 16
      src/main/java/com/example/demo/controller/cash/CashRefundController.java
  6. 12
      src/main/java/com/example/demo/controller/coin/AdminController.java
  7. 21
      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. 2
      src/main/java/com/example/demo/domain/entity/CashRecord.java
  12. 7
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java
  13. 6
      src/main/java/com/example/demo/domain/vo/cash/CashRecordDTO.java
  14. 6
      src/main/java/com/example/demo/domain/vo/cash/FundsDTO.java
  15. 2
      src/main/java/com/example/demo/domain/vo/cash/PerformanceVO.java
  16. 2
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  17. 1
      src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
  18. 2
      src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
  19. 2
      src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java
  20. 2
      src/main/java/com/example/demo/service/bean/BeanConsumeService.java
  21. 4
      src/main/java/com/example/demo/service/cash/CashCollectionService.java
  22. 2
      src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java
  23. 6
      src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java
  24. 60
      src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java
  25. 68
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  26. 14
      src/main/resources/cashMapper/CashCollectionMapper.xml
  27. 27
      src/main/resources/cashMapper/CashRefundMapper.xml
  28. 2
      src/main/resources/mapper/AdminMapper.xml
  29. 12
      src/main/resources/mapper/AuditMapper.xml
  30. 3
      src/main/resources/mapper/ConsumeMapper.xml
  31. 4
      src/main/resources/mapper/GoldDetailMapper.xml
  32. 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());
}

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

@ -87,7 +87,7 @@ public class ExcelHeaderTranslator {
headers.put("adminName", "提交人");
headers.put("isRefundDescription", "是否退款");
headers.put("createTime", "消耗时间");
headers.put("price", "折扣金币");
headers.put("price", "原价");
// 如果需要翻译则翻译表头
if (!isChineseLanguage(lang)) {
@ -131,8 +131,6 @@ public class ExcelHeaderTranslator {
headers.put("taskGold", "任务金币");
headers.put("remark", "备注");
headers.put("adminName", "提交人");
headers.put("price", "原价");
headers.put("linkId", "LinkId");
headers.put("auditTime", "退款时间");
// 如果需要翻译则翻译表头
@ -150,7 +148,7 @@ public class ExcelHeaderTranslator {
return Arrays.asList(
"orderCode", "name", "jwcode", "market", "goodsName",
"refundType", "refundModelDesc", "sumGold", "permanentGold",
"freeGold", "taskGold", "remark", "adminName", "price", "linkId", "auditTime"
"freeGold", "taskGold", "remark", "adminName", "auditTime"
);
}
@ -302,7 +300,7 @@ public class ExcelHeaderTranslator {
headers.put("status", "订单状态");
headers.put("remark", "备注");
headers.put("refundReason", "退款理由");
headers.put("refundModel", "退款方式");
headers.put("refundModelDesc", "退款方式");
// 如果需要翻译则翻译表头
if (!isChineseLanguage(lang)) {
@ -318,7 +316,7 @@ public class ExcelHeaderTranslator {
public List<String> getCashRecordColumnOrder() {
return Arrays.asList(
"goodsName", "goodsNum", "numUnit", "Submitter", "id", "jwcode", "name", "market",
"status", "remark", "refundReason", "refundModel"
"status", "remark", "refundReason", "refundModelDesc"
);
}
@ -411,7 +409,7 @@ public class ExcelHeaderTranslator {
headers.put("freeBean", "免费金豆数");
headers.put("buyBean", "付费金豆数");
headers.put("channel", "频道");
headers.put("type", "会员类型");
headers.put("typeDesc", "会员类型");
headers.put("consumeTime", "加入时间");
// 如果需要翻译则翻译表头
@ -428,7 +426,7 @@ public class ExcelHeaderTranslator {
public List<String> getBeanConsumeFanColumnOrder() {
return Arrays.asList(
"id", "name", "jwcode", "dept", "beanNum", "freeBean", "buyBean",
"channel", "type", "consumeTime"
"channel", "typeDesc", "consumeTime"
);
}
@ -493,6 +491,7 @@ public class ExcelHeaderTranslator {
headers.put("taskGold", "任务金币");
headers.put("adminName", "提交人");
headers.put("auditTime", "更新时间");
headers.put("price", "原价");
// 如果需要翻译则翻译表头
if (!isChineseLanguage(lang)) {
@ -508,7 +507,7 @@ public class ExcelHeaderTranslator {
public List<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){

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

@ -53,13 +53,26 @@ public class CashCollectionController {
@PostMapping("/getNameAndMarket")
public Result getNameAndMarket(@RequestBody Integer jwcode, @RequestHeader(defaultValue = "zh_CN") String lang) {
try {
return Result.success(cashCollectionService.getNameAndMarket(jwcode));
Result result = cashCollectionService.getNameAndMarket(jwcode, lang);
// 对返回结果进行多语言转换
if (result.getCode() == 200 && result.getData() instanceof User) {
User user = (User) result.getData();
// 如果服务层未处理市场名称翻译在这里进行处理
if (user.getMarketName() != null) {
user.setMarketName(languageTranslationUtil.translate(user.getMarketName(), lang));
}
}
return result;
} catch (Exception e) {
String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
return Result.error(errorMsg);
String errorMsg = languageTranslationUtil.translate("查询失败", lang);
return Result.error(errorMsg + ": " + e.getMessage());
}
}
//获取收款活动列表
@PostMapping("/getActivityList")
public Result getActivityList()
@ -296,10 +309,8 @@ public class CashCollectionController {
return result;
} catch (Exception e) {
// 推送异常到飞书核心调用工具类
System.out.println(e.getMessage());
String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
throw new SecurityException();
return Result.error(errorMsg);
}
}
@ -418,6 +429,13 @@ public class CashCollectionController {
cashCollection.getReceivedMarket(), languageCode);
cashCollection.setReceivedMarket(chineseMarket);
}
// 转换所属地区名称
if (cashCollection.getMarketName() != null && !cashCollection.getMarketName().isEmpty()) {
String chineseMarketName = translationService.findChineseSimplifiedByTranslation(
cashCollection.getMarketName(), languageCode);
cashCollection.setMarketName(chineseMarketName);
}
}
}
@ -481,6 +499,20 @@ public class CashCollectionController {
cashCollection.getPaymentCurrency(), languageCode);
cashCollection.setPaymentCurrency(chineseCurrency);
}
// 转换提交人地区
if (cashCollection.getSubmitterMarket() != null && !cashCollection.getSubmitterMarket().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
cashCollection.getSubmitterMarket(), languageCode);
cashCollection.setSubmitterMarket(chineseMarket);
}
// 转换所属地区名称
if (cashCollection.getMarketName() != null && !cashCollection.getMarketName().isEmpty()) {
String chineseMarketName = translationService.findChineseSimplifiedByTranslation(
cashCollection.getMarketName(), languageCode);
cashCollection.setMarketName(chineseMarketName);
}
}
}

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

@ -543,6 +543,11 @@ public class CashRefundController {
if (dto.getReceivedCurrency() != null) {
dto.setReceivedCurrency(languageTranslationUtil.translate(dto.getReceivedCurrency(), lang));
}
// 翻译退款方式
if (dto.getRefundModel() != null) {
String refundModelDesc = convertRefundModelToString(dto.getRefundModel());
dto.setRefundModelDesc(languageTranslationUtil.translate(refundModelDesc, lang));
}
}
}
}
@ -726,4 +731,15 @@ public class CashRefundController {
}
}
/**
* 将退款模型数字转换为中文描述
*/
private String convertRefundModelToString(Byte refundModel) {
if (refundModel == null) return "";
switch (refundModel) {
case 0: return "全部退款";
case 1: return "部分退款";
default: return "未知退款方式";
}
}
}

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

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

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; // 备注

2
src/main/java/com/example/demo/domain/entity/CashRecord.java

@ -44,6 +44,8 @@ public class CashRecord implements Serializable {
// 金额信息
private String paymentCurrency; // 付款币种
private BigDecimal paymentAmount; // 付款金额
private String paymentCurrencyOrig; // 原始付款币种
private BigDecimal paymentAmountOrig; // 原始付款金额
private String receivedCurrency; // 到账币种
private BigDecimal receivedAmount; // 到账金额
private BigDecimal handlingCharge; // 手续费

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

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

@ -4,7 +4,6 @@ import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.example.demo.config.MarketConverter;
import com.example.demo.config.OrderStatusConverter;
import com.example.demo.config.RefundModelConverter;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -182,8 +181,9 @@ public class CashRecordDTO{
/**
* 退款方式0全额/1部分
*/
@ExcelProperty(value = "",converter = RefundModelConverter.class)
private Integer refundModel;
@ExcelIgnore
private Byte refundModel;
private String refundModelDesc; //退款方式转换
/**
* 退款执行人OA号

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

2
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);
//新增收款订单

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表

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

60
src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java

@ -10,6 +10,7 @@ import com.example.demo.domain.vo.cash.CashCollectionMessage;
import com.example.demo.domain.vo.cash.PerformanceVO;
import com.example.demo.domain.vo.coin.GoldUser;
import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.cash.CashCollectionMapper;
import com.example.demo.mapper.coin.MarketMapper;
import com.example.demo.mapper.coin.UserMapper;
@ -32,6 +33,7 @@ import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
@ -351,6 +353,11 @@ public class CashCollectionServiceImpl implements CashCollectionService {
public String complete(CashRecord cashRecord) {
if (!Objects.equals(cashRecord.getPaymentCurrency(), cashRecord.getReceivedCurrency())
&& ("Stripe".equals(cashRecord.getPayType()) || "Paypal".equals(cashRecord.getPayType()))) {
return "支付币种与收款币种不一致";
}
int rows = cashCollectionMapper.complete(cashRecord);
String goodsName = cashCollectionMapper.selectGoodsNameByCode(cashRecord.getOrderCode());
if (goodsName .equals("金币充值")) {
@ -363,34 +370,63 @@ public class CashCollectionServiceImpl implements CashCollectionService {
}
//根据精网号查询姓名和地区
@Override
public User getNameAndMarket(Integer jwcode) {
@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);
if (markets.contains("9") || markets.contains("9999")) {
markets = null;
// 检查用户是否存在
int userCount = cashCollectionMapper.checkUserExists(jwcode);
if (userCount == 0) {
String message = languageTranslationUtil.translate("精网号有误!请检查", lang);
return Result.error(message);
}
GoldUser gUser = userMapper.selectUserCard(jwcode.toString(), markets);
if (gUser != null) {
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 user;
}
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);
}
}
// 如果没有返回有效用户信息则抛出异常
throw new RuntimeException("无法获取用户信息");
}
//获取收款活动列表
@Override

68
src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java

@ -419,12 +419,12 @@ public class ExportExcelServiceImpl implements ExportExcelService {
try {
JsonNode rootNode = objectMapper.readTree(message);
JsonNode requestDataNode = rootNode.path("requestData");
JsonNode beanRechargeNode = requestDataNode.path("performanceDTO");
PerformanceDTO performanceDTO = objectMapper.treeToValue(beanRechargeNode, PerformanceDTO.class);
JsonNode performanceDTONode = requestDataNode.path("performanceDTO");
PerformanceDTO performanceDTO = objectMapper.treeToValue(performanceDTONode, PerformanceDTO.class);
page.setPerformanceDTO(performanceDTO);
// 从请求数据中获取语言设置如果没有则使用默认值
// 从请求数据中获取语言设置
String lang = "zh_CN";
JsonNode langNode = requestDataNode.path("lang");
JsonNode langNode = rootNode.path("lang");
if (langNode != null && !langNode.asText().isEmpty()) {
lang = langNode.asText();
}
@ -852,6 +852,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
// 添加铁粉用户翻译支持
if ("fanUser".equals(exportType) && list.get(0) instanceof BeanConsumeFan) {
fillUserMemberStatusDescriptions((List<BeanConsumeFan>) list);
translateBeanConsumeFanList((List<BeanConsumeFan>) list, lang);
}
@ -874,6 +875,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
// 添加财务退款翻译支持
if ("financeUser".equals(exportType) && list.get(0) instanceof CashRecordDTO) {
fillRechargeUserIsRefund((List<CashRecordDTO>) list);
translateCashRecordDTOList((List<CashRecordDTO>) list, lang);
}
@ -1047,7 +1049,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
case "cashUser":
return CashCollection.class;
case "performanceUser":
return PerformanceDTO.class;
return PerformanceVO.class;
case "fundUser":
return FundsDTO.class;
default:
@ -1056,6 +1058,31 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}
/**
* 填充用户会员的状态描述
*/
private void fillUserMemberStatusDescriptions(List<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 +1094,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}
}
}
/**
* 将类型数字转换为中文描述
*/
@ -1106,6 +1134,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 +1221,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
private String convertIsRefundToString(Integer isRefund) {
if (isRefund == null) return "";
switch (isRefund) {
case 0: return "未退款";
case 0: return "正常";
case 1: return "已退款";
default: return "未知状态";
}
@ -1224,6 +1266,7 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}
}
}
/**
* 将充值平台数字转换为中文描述
*/
@ -1257,8 +1300,8 @@ public class ExportExcelServiceImpl implements ExportExcelService {
if (type == null) return "";
switch (type) {
case 9, 10: return "打赏";
case 11: return "付费";
default: return "未知";
case 11: return "付费购买";
default: return "其他";
}
}
// 各种实体类的翻译方法
@ -1448,8 +1491,8 @@ public class ExportExcelServiceImpl implements ExportExcelService {
}
// 翻译会员类型
if (item.getType() != null && !item.getType().isEmpty()) {
item.setType(languageTranslationUtil.translate(item.getType(), lang));
if (item.getTypeDesc() != null && !item.getTypeDesc().isEmpty()) {
item.setTypeDesc(languageTranslationUtil.translate(item.getTypeDesc(), lang));
}
}
}
@ -1555,6 +1598,11 @@ public class ExportExcelServiceImpl implements ExportExcelService {
if (item.getRefundRemark() != null && !item.getRefundRemark().isEmpty()) {
item.setRefundRemark(languageTranslationUtil.translate(item.getRefundRemark(), lang));
}
// 翻译退款方式
if (item.getRefundModelDesc() != null && !item.getRefundModelDesc().isEmpty()) {
item.setRefundModelDesc(languageTranslationUtil.translate(item.getRefundModelDesc(), lang));
}
}
}

14
src/main/resources/cashMapper/CashCollectionMapper.xml

@ -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
@ -105,6 +109,12 @@
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}
@ -209,7 +219,7 @@
ORDER BY ${cashCollection.sortField} ${cashCollection.sortOrder}
</when>
<otherwise>
ORDER BY create_time DESC
ORDER BY pay_time DESC
</otherwise>
</choose>
</select>
@ -324,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>

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

@ -172,6 +172,9 @@
crc.pay_time,
crc.voucher,
crc.remark,
crr.refund_reason,
crr.refund_remark,
crr.reject_reason,
crc.payment_currency,
crc.payment_amount
from cash_record_refund crr
@ -224,7 +227,7 @@
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY crr.create_time DESC
ORDER BY crr.update_time DESC
</otherwise>
</choose>
</select>
@ -247,6 +250,7 @@
crr.free_gold,
crr.audit_id,
crr.related_id,
crr.reject_reason,
la.area_servise,
la.area_finance,
la.area_charge,
@ -304,7 +308,7 @@
ORDER BY ${sortField} ${sortOrder}
</when>
<otherwise>
ORDER BY crr.create_time DESC
ORDER BY crr.update_time DESC
</otherwise>
</choose>
</select>
@ -333,10 +337,13 @@
crr.refund_voucher,
crr.refund_time,
crr.executor,
crr.permanent_gold,
crr.free_gold,
crr.status,
crr.audit_id,
crr.submitter_id,
crr.related_id,
crr.refund_reason,
la.area_servise,
la.area_finance,
la.area_charge,
@ -441,11 +448,17 @@
and crc.jwcode = #{jwcode}
</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 +475,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,

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

@ -160,8 +160,18 @@
</foreach>
)
</if>
<if test="refundAudit.startTime != null and refundAudit.endTime != null ">
<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}

3
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

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