75 Commits

Author SHA1 Message Date
huangqizhen 88c25143d9 修改补交 6 days ago
wangguorui f610c03421 Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 3 weeks ago
wangguorui 331958175c 2月11日,执行人查询优化 3 weeks ago
lijianlin 6880b9181e 02-11 撤销现金收款添加模糊查询 3 weeks ago
lijianlin ee030d9040 02-11 现金收款添加模糊查询 3 weeks ago
wangguorui 8c0fcc2562 2月10日,推送给指定执行人 3 weeks ago
lijianlin bc61233ec7 02-10 bank接口取消登录拦截 3 weeks ago
huangqizhen b7290e716c Merge branch 'refs/heads/milestone-20260128-DC金豆金币接口' into milestone-20260128-金币日常优化1.0 3 weeks ago
huangqizhen 18eac1c10f 2.7 修改现金退款 3 weeks ago
wangguorui 08c951ee8c 2月8日,指定执行人翻译优化 3 weeks ago
huangqizhen 9c28aa17f2 2.7 修改导出 3 weeks ago
wangguorui 28e7d17d6a 2月7日,指定执行人收到消息优化 3 weeks ago
wangguorui b2821983d2 2月7日,指定执行人收到消息 3 weeks ago
wangguorui 4f33fd3787 2月6日,重复消费翻译 3 weeks ago
wangguorui 921f7b8199 2月5日,消息推送 4 weeks ago
wangguorui 00bf932958 2月5日,消息推送 4 weeks ago
huangqizhen a89535de67 2.4 金币金豆DC接口 4 weeks ago
wangguorui f004258008 2月5日,消息推送现金发送到账地区 4 weeks ago
wangguorui f22e857180 Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 4 weeks ago
wangguorui d5364cd25a 2月5日,消息推送 4 weeks ago
sunjiabei 1d70c31da8 20260205消耗金豆接口 4 weeks ago
lijianlin dc32fd5f62 02-04 充值时间同步 4 weeks ago
sunjiabei 52f0b457ca 20260203消耗金豆接口 4 weeks ago
wangguorui 74a204ba3f 2月4日,消息推送 4 weeks ago
wangguorui 94283f7b33 Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 4 weeks ago
wangguorui de2b798964 2月4日,消息推送发送退款消息 4 weeks ago
lijianlin 21cae8ea4d 02-04 新增充值/消费 返回订单号与创建时间 4 weeks ago
huangqizhen 6ee01a0282 2.4 金币金豆DC接口 4 weeks ago
wangguorui cc602ac6a4 2月23日,消息推送订单状态说明 4 weeks ago
sunjiabei 12f70c62e2 Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 4 weeks ago
sunjiabei 5ffadcc43d 20260203消耗金豆接口 4 weeks ago
wangguorui 5c6215d185 2月23日,消息推送优化 4 weeks ago
wangguorui 7cccb80f46 2月23日,消息推送 4 weeks ago
wangguorui 500beb1006 Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 4 weeks ago
wangguorui 2cef50ec4e 2月2日,消息推送翻译显示 4 weeks ago
huangqizhen be37c456bb 2.1 同步数据库 4 weeks ago
lijianlin 76dae152dc 01-31 同步g_order,活动存id 1 month ago
wangguorui a23b26afa2 Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 1 month ago
wangguorui 756b3c3774 1月31日,消息推送over 1 month ago
huangqizhen f0b6d711e1 1.30 增加免费金币接口 1 month ago
huangqizhen 44ff7c5180 Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 1 month ago
huangqizhen c21b499ead Merge branch 'refs/heads/milestone-20260128-DC金豆金币接口' into milestone-20260128-金币日常优化1.0 1 month ago
wangguorui 6ec6ee8a85 1月30日,消息推送over 1 month ago
huangqizhen 0162b1b684 1.30 增加免费金币接口 1 month ago
lijianlin 98809d0366 01-30 查询重复订单,精简数据信息 1 month ago
wangguorui a1d7fae725 1月30日,消息推送over 1 month ago
wangguorui 7b1775de75 Revert "1月29日,消息推送分页" 1 month ago
wangguorui 3df703fc08 1月29日,消息推送,现金收款待审核 1 month ago
wangguorui 7fd3abc42e 1月29日,消息推送分页 1 month ago
lijianlin 3d66ecbc08 01-29 现金营收按照支付时间统计 1 month ago
wangguorui 43906ee5ce Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 1 month ago
wangguorui 8aeace3973 1月29日,消息推送金币收款退款跳转id-续 1 month ago
sunjiabei ce05c386b9 Merge remote-tracking branch 'origin/milestone-20260128-金币日常优化1.0' into milestone-20260128-金币日常优化1.0 1 month ago
sunjiabei 0e67725746 20260129stripe2 1 month ago
huangqizhen b12f29c44f Merge branch 'refs/heads/huangqizheng/feature-20260129114800-验证码' into milestone-20260128-金币日常优化1.0 1 month ago
huangqizhen e8efd5fe63 1.29 验证码 1 month ago
wangguorui c11cef2c83 1月29日,消息推送金币收款退款跳转id 1 month ago
wangguorui 4e48bda18f 1月29日,消息推送金币收款退款 1 month ago
wangguorui 5eb479d572 1月29日,消息推送金币收款退款 1 month ago
huangqizhen b672677714 1.28 dc金币充值修改类型 1 month ago
lijianlin 61cee6c38d Merge branch 'milestone-20260128-金币日常优化1.0' of http://39.101.133.168:8807/huangqizhen/gold-java into lijianlin/feature-20260128-金币日常优化V1.0 1 month ago
sunjiabei d867743572 20260128DC免费金豆 1 month ago
sunjiabei 292ec906b7 20260128DC免费金豆 1 month ago
sunjiabei 657719802b 20260128DC免费金豆 1 month ago
sunjiabei 914a543aee Merge remote-tracking branch 'origin/milestone-20260128-DC金豆金币接口' into milestone-20260128-DC金豆金币接口 1 month ago
sunjiabei f0e1494aa0 20260128DC免费金豆 1 month ago
huangqizhen ab6d0f9a56 1.28 dc金币充值修改类型 1 month ago
sunjiabei b52055cad3 20260128DC免费金豆 1 month ago
lijianlin a147e60847 01-28 新增充值/消费反订单号;根据订单号查询订单信息(仅重复提示字段) 1 month ago
huangqizhen c9d0f32364 1.28 dc金币充值 1 month ago
huangqizhen acb88d9c02 Merge branch 'refs/heads/huangqizheng/feature-20260128093535-免费金币接口' into milestone-20260128-DC金豆金币接口 1 month ago
huangqizhen 915c881216 1.28 dc金币充值 1 month ago
wangguorui 97e2d4b82d 1月28日,消息推送翻译优化· 1 month ago
sunjiabei 21e55bb322 20260128DC免费金豆 1 month ago
lijianlin 35ec481758 01-28 同步g_order关闭登录校验 1 month ago
  1. 6
      pom.xml
  2. 8
      src/main/java/com/example/demo/Mysql/MysqlServiceImpl.java
  3. 97
      src/main/java/com/example/demo/RabbitMQ/BeanRechargeAspect.java
  4. 31
      src/main/java/com/example/demo/RabbitMQ/BeanRechargeConsumer.java
  5. 96
      src/main/java/com/example/demo/RabbitMQ/CoinRechargeAspect.java
  6. 31
      src/main/java/com/example/demo/RabbitMQ/CoinRechargeConsumer.java
  7. 97
      src/main/java/com/example/demo/RabbitMQ/CoinRefundAspect.java
  8. 31
      src/main/java/com/example/demo/RabbitMQ/CoinRefundConsumer.java
  9. 2
      src/main/java/com/example/demo/Util/BaseDES.java
  10. 32
      src/main/java/com/example/demo/Util/GoldTistV2.java
  11. 31
      src/main/java/com/example/demo/config/KaptchaConfig.java
  12. 61
      src/main/java/com/example/demo/config/RabbitMQConfig.java
  13. 9
      src/main/java/com/example/demo/controller/bean/BeanConsumeController.java
  14. 12
      src/main/java/com/example/demo/controller/bean/BeanRechargeController.java
  15. 152
      src/main/java/com/example/demo/controller/cash/CashRefundController.java
  16. 29
      src/main/java/com/example/demo/controller/cash/MessageController.java
  17. 36
      src/main/java/com/example/demo/controller/coin/AdminController.java
  18. 49
      src/main/java/com/example/demo/controller/coin/CaptchaController.java
  19. 11
      src/main/java/com/example/demo/controller/coin/ConsumeController.java
  20. 32
      src/main/java/com/example/demo/controller/coin/GoldDetailController.java
  21. 63
      src/main/java/com/example/demo/controller/coin/RechargeController.java
  22. 8
      src/main/java/com/example/demo/controller/coin/UserController.java
  23. 6
      src/main/java/com/example/demo/domain/entity/Admin.java
  24. 29
      src/main/java/com/example/demo/domain/entity/DCUser.java
  25. 19
      src/main/java/com/example/demo/domain/vo/cash/CashRecordRefund.java
  26. 1
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  27. 46
      src/main/java/com/example/demo/domain/vo/coin/GoldRepeat.java
  28. 4
      src/main/java/com/example/demo/domain/vo/coin/Messages.java
  29. 28
      src/main/java/com/example/demo/domain/vo/coin/OrderResultVO.java
  30. 6
      src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java
  31. 3
      src/main/java/com/example/demo/mapper/cash/CashRefundMapper.java
  32. 2
      src/main/java/com/example/demo/mapper/cash/MessageMapper.java
  33. 1
      src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java
  34. 3
      src/main/java/com/example/demo/mapper/coin/OperationLogMapper.java
  35. 7
      src/main/java/com/example/demo/mapper/coin/RechargeMapper.java
  36. 3
      src/main/java/com/example/demo/mapper/sqlserver/HistoryRecordMapper.java
  37. 3
      src/main/java/com/example/demo/security/SecurityConfig.java
  38. 1
      src/main/java/com/example/demo/service/bean/BeanConsumeService.java
  39. 3
      src/main/java/com/example/demo/service/bean/BeanRechargeService.java
  40. 2
      src/main/java/com/example/demo/service/cash/MessageService.java
  41. 2
      src/main/java/com/example/demo/service/cash/RefundService.java
  42. 2
      src/main/java/com/example/demo/service/coin/ConsumeService.java
  43. 12
      src/main/java/com/example/demo/service/coin/RechargeService.java
  44. 3
      src/main/java/com/example/demo/service/coin/UserService.java
  45. 76
      src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java
  46. 228
      src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java
  47. 72
      src/main/java/com/example/demo/serviceImpl/cash/CashAuditServiceImpl.java
  48. 72
      src/main/java/com/example/demo/serviceImpl/cash/CashCollectionServiceImpl.java
  49. 204
      src/main/java/com/example/demo/serviceImpl/cash/CashRefundServiceImpl.java
  50. 4
      src/main/java/com/example/demo/serviceImpl/cash/MessageServiceImpl.java
  51. 248
      src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java
  52. 28
      src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java
  53. 3
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  54. 72
      src/main/java/com/example/demo/serviceImpl/coin/RechargeServiceImpl.java
  55. 24
      src/main/java/com/example/demo/serviceImpl/coin/RefundServiceImpl.java
  56. 30
      src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java
  57. 8
      src/main/resources/application-dev.yml
  58. 3
      src/main/resources/application-prod.yml
  59. 18
      src/main/resources/application-test.yml
  60. 12
      src/main/resources/cashMapper/CashCollectionMapper.xml
  61. 53
      src/main/resources/cashMapper/CashRefundMapper.xml
  62. 17
      src/main/resources/cashMapper/MessageMapper.xml
  63. 22
      src/main/resources/mapper/BeanRechargeMapper1.xml
  64. 12
      src/main/resources/mapper/RechargeMapper.xml
  65. 2
      src/main/resources/mapper/WorkBenchMapper.xml
  66. 13
      src/main/resources/sqlserverMapper/HistoryRecordMapper.xml

6
pom.xml

@ -42,6 +42,12 @@
</dependency>
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>

8
src/main/java/com/example/demo/Mysql/MysqlServiceImpl.java

@ -35,8 +35,8 @@ public class MysqlServiceImpl implements MysqlService {
@Autowired
private RestTemplate restTemplate;
Set<Integer> validZeroTypes = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 18, 19, 20, 21, 22, 23, 24, 26, 28, 29, 35, 36, 40, 45, 46, 47, 48, 49, 53, 54, 60));
Set<Integer> validOneTypes = new HashSet<>(Arrays.asList(9, 15, 17, 25, 27, 37, 41, 42, 43, 50, 51, 62));
Set<Integer> validZeroTypes = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 18, 19, 20, 21, 22, 23, 24, 26, 28, 29, 35, 36, 40, 45, 46, 47, 48, 49, 53, 54, 60,67));
Set<Integer> validOneTypes = new HashSet<>(Arrays.asList(9, 15, 17, 25, 27, 37, 41, 42, 43, 50, 51, 62,68));
Set<Integer> validTwoTypes = new HashSet<>(Arrays.asList(52,61));
Set<Integer> validThreeTypes = new HashSet<>(Arrays.asList(10, 16, 30, 31, 32, 33, 34, 39, 44));
Set<Integer> validFourTypes = new HashSet<>(Arrays.asList(55, 56, 57, 58, 59, 63, 64, 65));
@ -404,7 +404,9 @@ public class MysqlServiceImpl implements MysqlService {
throw new IllegalArgumentException("不应处理 platform=4,应在上层过滤");
} else if ("0".equals(platform)) {
stmt.setString(8, "初始化金币");
} else {
} else if ("5".equals(platform)){
stmt.setString(8, "DC");
}else {
stmt.setString(8, "其他");
}

97
src/main/java/com/example/demo/RabbitMQ/BeanRechargeAspect.java

@ -0,0 +1,97 @@
package com.example.demo.RabbitMQ;
import com.example.demo.Util.SecurityUtils;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.config.interfac.Message;
import com.example.demo.domain.DTO.MessageDTO;
import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.mapper.coin.OperationLogMapper;
import com.example.demo.mapper.coin.UserMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @program: GOLD
* @ClassName BeanRechargeAspect
* @description: 金豆充值流程切面
* @author:
* @create:
* @Version 1.0
**/
@Aspect
@Component
@Slf4j
public class BeanRechargeAspect {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private UserMapper userMapper;
@Autowired
private OperationLogMapper operationLogMapper;
@Around("@annotation(com.example.demo.config.interfac.Message)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getName();
String className = signature.getDeclaringTypeName();
Object[] args = joinPoint.getArgs();
Message logAnnotation = signature.getMethod().getAnnotation(Message.class);
String action = logAnnotation.value();
// 使用 Spring Security 获取真实用户
String username = SecurityUtils.getCurrentUsername();
Integer userId = SecurityUtils.getCurrentUserId();
String name = userMapper.selectUserByJwcode(Integer.valueOf(username)).getName();
// 添加空值检查
if (userId == null) {
log.warn("无法获取当前用户ID,使用默认值 -1");
userId = -1; // 或者使用其他默认值
}
ObjectMapper mapper = new ObjectMapper();
String argsJson = "[]";
try {
argsJson = mapper.writeValueAsString(args);
} catch (Exception e) {
argsJson = "serialize failed";
}
Object result;
try {
result = joinPoint.proceed();
} catch (Exception e) {
log.error("方法执行异常: {}", e.getMessage());
throw e;
}
long duration = System.currentTimeMillis() - startTime;
// 构造金豆充值消息 DTO
Messages messageDTO = new Messages();
messageDTO.setJwcode(Integer.valueOf(username));
messageDTO.setName(name);
messageDTO.setTitle(action);
messageDTO.setDesc(username + "有一条金豆充值消息需要处理");
// 发送消息到 RabbitMQ不等待
try {
rabbitTemplate.convertAndSend(RabbitMQConfig.Bean_RECHARGE_EXCHANGE, "bean.recharge.save", messageDTO);
log.info("📩 金豆充值消息已发送到 RabbitMQ: {}", action);
} catch (Exception e) {
log.error("发送金豆充值消息到 RabbitMQ 失败", e);
}
log.info("✅ AOP 拦截完成: {} 执行 [{}] 耗时 {}ms", username, action, duration);
return result;
}
}

31
src/main/java/com/example/demo/RabbitMQ/BeanRechargeConsumer.java

@ -0,0 +1,31 @@
package com.example.demo.RabbitMQ;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.mapper.coin.OperationLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 金豆充值流程消息消费者
* 监听金豆充值流程中各个状态变更的消息队列
*/
@Component
@Slf4j
public class BeanRechargeConsumer {
@Autowired
private OperationLogMapper operationLogMapper;
@RabbitListener(queues = RabbitMQConfig.Bean_RECHARGE_QUEUE)
public void consumeLog(Messages messages) {
try {
operationLogMapper.insertMessage(messages);
} catch (Exception e) {
log.error("持久化金豆充值日志失败", e);
// 可以重试或记录到文件
}
}
}

96
src/main/java/com/example/demo/RabbitMQ/CoinRechargeAspect.java

@ -0,0 +1,96 @@
package com.example.demo.RabbitMQ;
import com.example.demo.Util.SecurityUtils;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.config.interfac.Message;
import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.mapper.coin.OperationLogMapper;
import com.example.demo.mapper.coin.UserMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @program: GOLD
* @ClassName CoinRechargeAspect
* @description: 金币充值流程切面
* @author:
* @create:
* @Version 1.0
**/
@Aspect
@Component
@Slf4j
public class CoinRechargeAspect {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private UserMapper userMapper;
@Autowired
private OperationLogMapper operationLogMapper;
@Around("@annotation(com.example.demo.config.interfac.Message)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getName();
String className = signature.getDeclaringTypeName();
Object[] args = joinPoint.getArgs();
Message logAnnotation = signature.getMethod().getAnnotation(Message.class);
String action = logAnnotation.value();
// 使用 Spring Security 获取真实用户
String username = SecurityUtils.getCurrentUsername();
Integer userId = SecurityUtils.getCurrentUserId();
String name = userMapper.selectUserByJwcode(Integer.valueOf(username)).getName();
// 添加空值检查
if (userId == null) {
log.warn("无法获取当前用户ID,使用默认值 -1");
userId = -1; // 或者使用其他默认值
}
ObjectMapper mapper = new ObjectMapper();
String argsJson = "[]";
try {
argsJson = mapper.writeValueAsString(args);
} catch (Exception e) {
argsJson = "serialize failed";
}
Object result;
try {
result = joinPoint.proceed();
} catch (Exception e) {
log.error("方法执行异常: {}", e.getMessage());
throw e;
}
long duration = System.currentTimeMillis() - startTime;
// 构造金币充值消息 DTO
Messages messageDTO = new Messages();
messageDTO.setJwcode(Integer.valueOf(username));
messageDTO.setName(name);
messageDTO.setTitle(action);
messageDTO.setDesc(username + "有一条金币充值消息需要处理");
// 发送消息到 RabbitMQ不等待
try {
rabbitTemplate.convertAndSend(RabbitMQConfig.COIN_RECHARGE_EXCHANGE, "coin.recharge.save", messageDTO);
log.info("📩 金币充值消息已发送到 RabbitMQ: {}", action);
} catch (Exception e) {
log.error("发送金币充值消息到 RabbitMQ 失败", e);
}
log.info("✅ AOP 拦截完成: {} 执行 [{}] 耗时 {}ms", username, action, duration);
return result;
}
}

31
src/main/java/com/example/demo/RabbitMQ/CoinRechargeConsumer.java

@ -0,0 +1,31 @@
package com.example.demo.RabbitMQ;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.mapper.coin.OperationLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 金币充值流程消息消费者
* 监听金币充值流程中各个状态变更的消息队列
*/
@Component
@Slf4j
public class CoinRechargeConsumer {
@Autowired
private OperationLogMapper operationLogMapper;
@RabbitListener(queues = RabbitMQConfig.COIN_RECHARGE_QUEUE)
public void consumeLog(Messages messages) {
try {
operationLogMapper.insertMessage(messages);
} catch (Exception e) {
log.error("持久化金币充值日志失败", e);
// 可以重试或记录到文件
}
}
}

97
src/main/java/com/example/demo/RabbitMQ/CoinRefundAspect.java

@ -0,0 +1,97 @@
package com.example.demo.RabbitMQ;
import com.example.demo.Util.SecurityUtils;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.config.interfac.Message;
import com.example.demo.domain.DTO.MessageDTO;
import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.mapper.coin.OperationLogMapper;
import com.example.demo.mapper.coin.UserMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @program: GOLD
* @ClassName CoinRefundAspect
* @description: 金币退款流程切面
* @author: wangguorui
* @create:
* @Version 1.0
**/
@Aspect
@Component
@Slf4j
public class CoinRefundAspect {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private UserMapper userMapper;
@Autowired
private OperationLogMapper operationLogMapper;
@Around("@annotation(com.example.demo.config.interfac.Message)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getName();
String className = signature.getDeclaringTypeName();
Object[] args = joinPoint.getArgs();
Message logAnnotation = signature.getMethod().getAnnotation(Message.class);
String action = logAnnotation.value();
// 使用 Spring Security 获取真实用户
String username = SecurityUtils.getCurrentUsername();
Integer userId = SecurityUtils.getCurrentUserId();
String name = userMapper.selectUserByJwcode(Integer.valueOf(username)).getName();
// 添加空值检查
if (userId == null) {
log.warn("无法获取当前用户ID,使用默认值 -1");
userId = -1; // 或者使用其他默认值
}
ObjectMapper mapper = new ObjectMapper();
String argsJson = "[]";
try {
argsJson = mapper.writeValueAsString(args);
} catch (Exception e) {
argsJson = "serialize failed";
}
Object result;
try {
result = joinPoint.proceed();
} catch (Exception e) {
log.error("方法执行异常: {}", e.getMessage());
throw e;
}
long duration = System.currentTimeMillis() - startTime;
// 构造金币退款消息 DTO
Messages messageDTO = new Messages();
messageDTO.setJwcode(Integer.valueOf(username));
messageDTO.setName(name);
messageDTO.setTitle(action);
messageDTO.setDesc(username + "有一条金币退款消息需要处理");
// 发送消息到 RabbitMQ不等待
try {
rabbitTemplate.convertAndSend(RabbitMQConfig.COIN_REFUND_EXCHANGE, "coin.refund.save", messageDTO);
log.info("📩 金币退款消息已发送到 RabbitMQ: {}", action);
} catch (Exception e) {
log.error("发送金币退款消息到 RabbitMQ 失败", e);
}
log.info("✅ AOP 拦截完成: {} 执行 [{}] 耗时 {}ms", username, action, duration);
return result;
}
}

31
src/main/java/com/example/demo/RabbitMQ/CoinRefundConsumer.java

@ -0,0 +1,31 @@
package com.example.demo.RabbitMQ;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.mapper.coin.OperationLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 金币退款流程消息消费者
* 监听金币退款流程中各个状态变更的消息队列
*/
@Component
@Slf4j
public class CoinRefundConsumer {
@Autowired
private OperationLogMapper operationLogMapper;
@RabbitListener(queues = RabbitMQConfig.COIN_REFUND_QUEUE)
public void consumeLog(Messages messages) {
try {
operationLogMapper.insertMessage(messages);
} catch (Exception e) {
log.error("持久化金币退款日志失败", e);
// 可以重试或记录到文件
}
}
}

2
src/main/java/com/example/demo/Util/BaseDES.java

@ -91,7 +91,7 @@ public class BaseDES {
public static void main(String args[]) {
try {
BaseDES d = new BaseDES();
String encryptedText = d.encrypt("90048169");
String encryptedText = d.encrypt("90048384");
System.out.println("加密结果:" + encryptedText);
System.out.println("加密字符串:90005179》"+d.encrypt("90005179"));
System.out.println("解密字符串:6aaef5277c050f7ae383f816651098ff》"+d.decrypt("6aaef5277c050f7ae383f816651098ff"));

32
src/main/java/com/example/demo/Util/GoldTistV2.java

@ -215,6 +215,28 @@ public class GoldTistV2 {
return resp;
}
public static String addDCCoinNew(String jwcode, int lx, double jbs, String sjzfc,
String remark,double yjjb,String czr,String goodsname){
//查错误使用
// String sjzfc = RandomUid(10);
String resp = "";
try {
DESGB desjbkc = new DESGB("Jbxt.205");
String sk = "jwcode="+jwcode+"&number="+jbs+"&uid="+sjzfc+"&remark="+
remark+"&czr="+czr+"&yjjb="+yjjb+"&czpt=5&goodsname="+goodsname+"&type="+lx;
System.out.println("签名前:"+sk);
String sign = generateSignature(sk.split("&"),"222251821eba7efab6d48e388b8f6baa");
sk = desjbkc.encrypt(new String(sk.getBytes(), "UTF-8"));
System.out.println(url+"goldUpdate_sign.gold?app=4&sk="+sk+"&sign="+sign);
resp = doGet(url+"goldUpdate_sign.gold?app=4&sk="+sk+"&sign="+sign);
}catch (Exception e){
System.out.println("加金币异常"+e.toString());
}
System.out.println(resp);
return resp;
}
/** addCoinRecordNew("94226013","测试","lzh","测试商品");
* @功能描述: 添加一条单独的记录不更新金币
* @开发人员: 弘历研发部 刘志红 2025-3-21下午1:58:13 创建
@ -232,10 +254,10 @@ public class GoldTistV2 {
String sjzfc = RandomUid(10);
String resp = "";
try {
DESGB desjbkc = new DESGB("Jbxt.205");
DESGB desjbkc = new DESGB("Jxbt.205");
String sk = "jwcode="+jwcode+"&type=66&uid="+sjzfc+"&remark="+
remark+"&czr="+czr+"&czpt=4&goodsname="+goodsname;
String sign = generateSignature(sk.split("&"),"222251821eba7efab6d48e388b8f6baa");
String sign = generateSignature(sk.split("&"),"aJCQ6PcofDUybiZJI3ElC2eAQZhnF2hM");
sk = desjbkc.encrypt(new String(sk.getBytes(), "UTF-8"));
resp = doGet(url+"userjbAddRecord.gold?app=4&sk="+sk+"&sign="+sign);
}catch (Exception e){
@ -247,10 +269,10 @@ public class GoldTistV2 {
public static void main(String[] args) throws Exception {
//调用demo
addCoinNew("94226013",63,20,"123","测试",0,"黄其振","文章11");
addCoinNew("90044554",65,-1286,"","清除刷金币数量",0,"黄其振","清除刷金币数量");
}
//初始化类型
// https://hcm.rzfwq.com/hwhcnewA/initTypeGold.gold
}

31
src/main/java/com/example/demo/config/KaptchaConfig.java

@ -0,0 +1,31 @@
// com.example.demo.config.KaptchaConfig.java
package com.example.demo.config;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
@Configuration
public class KaptchaConfig {
@Bean
public DefaultKaptcha defaultKaptcha() {
DefaultKaptcha kaptcha = new DefaultKaptcha();
Properties properties = new Properties();
properties.setProperty("kaptcha.image.width", "130");
properties.setProperty("kaptcha.image.height", "45");
properties.setProperty("kaptcha.textproducer.char.length", "4");
properties.setProperty("kaptcha.textproducer.font.size", "35");
properties.setProperty("kaptcha.textproducer.font.color", "black");
properties.setProperty("kaptcha.textproducer.char.space", "5");
properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.WaterRipple");
properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.DefaultNoise");
kaptcha.setConfig(new Config(properties));
return kaptcha;
}
}

61
src/main/java/com/example/demo/config/RabbitMQConfig.java

@ -19,8 +19,14 @@ public class RabbitMQConfig {
public static final String LOG_EXCHANGE = "operation_log_exchange";
public static final String CASH_COLLECTION_QUEUE = "cash_collection_queue";
public static final String CASH_COLLECTION_EXCHANGE = "cash_collection_exchange";
public static final String CASH_REFUND_QUEUE = "cash_collection_exchange";
public static final String CASH_REFUND_QUEUE = "cash_refund_queue";
public static final String CASH_REFUND_EXCHANGE = "cash_refund_exchange";
public static final String COIN_REFUND_QUEUE = "coin_refund_queue";
public static final String COIN_REFUND_EXCHANGE = "coin_refund_exchange";
public static final String COIN_RECHARGE_QUEUE = "coin_recharge_queue";
public static final String COIN_RECHARGE_EXCHANGE = "coin_recharge_exchange";
public static final String Bean_RECHARGE_QUEUE = "bean_recharge_queue";
public static final String Bean_RECHARGE_EXCHANGE = "bean_recharge_exchange";
@Bean
public Queue logQueue() {
return new Queue(LOG_QUEUE, true);
@ -74,6 +80,59 @@ public class RabbitMQConfig {
.with("cash.refund.*");
}
// 金币退款队列和绑定按照操作日志的标准
@Bean
public Queue coinRefundQueue() {
return new Queue(COIN_REFUND_QUEUE, true);
}
@Bean
public TopicExchange coinRefundExchange() {
return new TopicExchange(COIN_REFUND_EXCHANGE);
}
@Bean
public Binding coinRefundBinding() {
return BindingBuilder.bind(coinRefundQueue())
.to(coinRefundExchange())
.with("coin.refund.*");
}
// 金币充值队列和绑定按照操作日志的标准
@Bean
public Queue coinRechargeQueue() {
return new Queue(COIN_RECHARGE_QUEUE, true);
}
@Bean
public TopicExchange coinRechargeExchange() {
return new TopicExchange(COIN_RECHARGE_EXCHANGE);
}
@Bean
public Binding coinRechargeBinding() {
return BindingBuilder.bind(coinRechargeQueue())
.to(coinRechargeExchange())
.with("coin.recharge.*");
}
// 金豆充值队列和绑定按照操作日志的标准
@Bean
public Queue beanRechargeQueue() {
return new Queue(Bean_RECHARGE_QUEUE, true);
}
@Bean
public TopicExchange beanRechargeExchange() {
return new TopicExchange(Bean_RECHARGE_EXCHANGE);
}
@Bean
public Binding beanRechargeBinding() {
return BindingBuilder.bind(beanRechargeQueue())
.to(beanRechargeExchange())
.with("bean.recharge.*");
}
@Bean
public MessageConverter messageConverter() {

9
src/main/java/com/example/demo/controller/bean/BeanConsumeController.java

@ -112,6 +112,15 @@ public class BeanConsumeController {
}
}
//减少金豆
@PostMapping("/reduceBeanDC")
public Result reduceBeanDC(@RequestBody BeanConsume consume) {
try {
return beanConsumeService.reduceBeanDC(consume);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
//筛选查询直播消费记录
@Log("查询直播消费记录")
@PostMapping("/selectLiveBy")

12
src/main/java/com/example/demo/controller/bean/BeanRechargeController.java

@ -181,6 +181,18 @@ public class BeanRechargeController {
}
//添加金豆
@PostMapping("/addBeanDC")
public Result addBeanDC(@RequestBody BeanRecharge recharge) {
try {
return beanRechargeService.addBeanDC(recharge);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
//线上金豆统计
@PostMapping("/statsOnlineBean")
public Result statsOnlineBean(@RequestBody BeanOnlineRechargeInfo beanOnlineRechargeInfo, @RequestHeader(defaultValue = "zh_CN") String lang) {

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

@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
@ -144,7 +145,13 @@ public class CashRefundController {
cashRecordRefund.setStatus(10);
int resultCode = refundService.add(cashRecordRefund, lang);
String successMsg = languageTranslationUtil.translate("提交成功", lang);
return Result.success(successMsg);
// 如果操作成功对返回数据进行字段翻译
if (resultCode > 0) {
translateCashRecordRefundFields(cashRecordRefund, lang);
}
return Result.success(successMsg, cashRecordRefund);
} catch (Exception e) {
String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
return Result.error(errorMsg);
@ -240,35 +247,31 @@ public class CashRefundController {
}
@PostMapping("/update")
public Result update(@RequestBody CashRecordDone cashRecordDone, @RequestHeader(defaultValue = "zh_CN") String lang)throws Exception {
public Result update(@RequestBody CashRecordDone cashRecordDone)throws Exception {
try {
if (cashRecordDone.getStatus() == null) {
String errorMsg = languageTranslationUtil.translate("状态为空", lang);
return Result.error(errorMsg);
return Result.error("状态为空");
}
if (cashRecordDone.getStatus() == 10) {
int result = refundService.withdraw(cashRecordDone);
String msg = result > 0 ? languageTranslationUtil.translate("操作成功", lang) : languageTranslationUtil.translate("操作失败", lang);
String msg = result > 0 ? "操作成功" : "操作失败";
return Result.success(msg);
}
else if (cashRecordDone.getStatus() == 11) {
try {
int result = refundService.update(cashRecordDone, lang);
String msg = result > 0 ? languageTranslationUtil.translate("操作成功", lang) : languageTranslationUtil.translate("操作失败", lang);
int result = refundService.update(cashRecordDone);
String msg = result > 0 ? "操作成功" : "操作失败";
return Result.success(msg);
} catch (Exception e) {
String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
return Result.error(errorMsg);
return Result.error(e.getMessage());
}
}
else {
String errorMsg = languageTranslationUtil.translate("该订单状态无法支持此操作", lang);
return Result.error(errorMsg);
return Result.error("该订单状态无法支持此操作");
}
} catch (Exception e) {
String errorMsg = languageTranslationUtil.translate("操作失败", lang);
return Result.error(errorMsg + ": " + e.getMessage());
return Result.error("操作失败" + ": " + e.getMessage());
}
}
@ -326,11 +329,30 @@ public class CashRefundController {
@PostMapping("/executor")
public Result executor(@RequestBody CashRecordDone cashRecordDone, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
try {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将输入的翻译字段转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedExecutorFieldsToChinese(cashRecordDone, languageCode);
}
// 执行业务逻辑
int result = refundService.executor(cashRecordDone);
String msg = result > 0 ? languageTranslationUtil.translate("操作成功", lang) : languageTranslationUtil.translate("操作失败", lang);
return Result.success(msg);
}
catch (Exception e) {
// 根据执行结果返回多语言消息
String successMsg = languageTranslationUtil.translate("操作成功", lang);
String failMsg = languageTranslationUtil.translate("操作失败", lang);
String msg = result > 0 ? successMsg : failMsg;
// 如果操作成功对返回数据进行字段翻译
if (result > 0) {
translateCashRecordDoneFields(cashRecordDone, lang);
}
return Result.success(msg, cashRecordDone);
} catch (Exception e) {
// 异常信息翻译
String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
return Result.error(errorMsg);
}
@ -353,7 +375,10 @@ public class CashRefundController {
cashRecordRefund.setStatus(20);
int resultCode = refundService.add(cashRecordRefund,lang);
String successMsg = languageTranslationUtil.translate("提交成功", lang);
return Result.success(successMsg);
if (resultCode > 0) {
translateCashRecordRefundFields(cashRecordRefund, lang);
}
return Result.success(successMsg, cashRecordRefund);
} catch (Exception e) {
String errorMsg = languageTranslationUtil.translate(e.getMessage(), lang);
return Result.error(errorMsg);
@ -518,6 +543,60 @@ public class CashRefundController {
}
/**
* 翻译 CashRecordDone 对象中的多语言字段
*/
private void translateCashRecordDoneFields(CashRecordDone cashRecordDone, String lang) {
if (cashRecordDone != null) {
// 翻译市场名称
if (cashRecordDone.getMarketName() != null) {
cashRecordDone.setMarketName(languageTranslationUtil.translate(cashRecordDone.getMarketName(), lang));
}
// 翻译退款币种
if (cashRecordDone.getRefundCurrency() != null) {
cashRecordDone.setRefundCurrency(languageTranslationUtil.translate(cashRecordDone.getRefundCurrency(), lang));
}
// 翻译退款途径
if (cashRecordDone.getRefundChannels() != null) {
cashRecordDone.setRefundChannels(languageTranslationUtil.translate(cashRecordDone.getRefundChannels(), lang));
}
}
}
/**
* 翻译 CashRecordRefund 对象中的多语言字段
*/
private void translateCashRecordRefundFields(CashRecordRefund cashRecordRefund, String lang) {
if (cashRecordRefund != null) {
// 翻译退款理由
if (cashRecordRefund.getRefundReason() != null) {
cashRecordRefund.setRefundReason(languageTranslationUtil.translate(cashRecordRefund.getRefundReason(), lang));
}
// 翻译退款备注
if (cashRecordRefund.getRefundRemark() != null) {
cashRecordRefund.setRefundRemark(languageTranslationUtil.translate(cashRecordRefund.getRefundRemark(), lang));
}
// 翻译退款途径
if (cashRecordRefund.getRefundChannels() != null) {
cashRecordRefund.setRefundChannels(languageTranslationUtil.translate(cashRecordRefund.getRefundChannels(), lang));
}
// 翻译退款币种
if (cashRecordRefund.getRefundCurrency() != null) {
cashRecordRefund.setRefundCurrency(languageTranslationUtil.translate(cashRecordRefund.getRefundCurrency(), lang));
}
// 翻译所属地区
if (cashRecordRefund.getMarketName() != null) {
cashRecordRefund.setMarketName(languageTranslationUtil.translate(cashRecordRefund.getMarketName(), lang));
}
}
}
/**
* 转换现金记录DTO的多语言字段
*/
private void translateCashRecordDTOs(com.github.pagehelper.PageInfo<CashRecordDTO> pageInfo, String lang) {
@ -556,6 +635,10 @@ public class CashRefundController {
if (dto.getRefundCurrency() != null) {
dto.setRefundCurrency(languageTranslationUtil.translate(dto.getRefundCurrency(), lang));
}
// 翻译退款途径
if (dto.getRefundChannels() != null) {
dto.setRefundChannels(languageTranslationUtil.translate(dto.getRefundChannels(), lang));
}
}
}
}
@ -662,6 +745,13 @@ public class CashRefundController {
cashRecordDTO.getRefundCurrency(), languageCode);
cashRecordDTO.setRefundCurrency(chineseCurrency);
}
// 转换退款途径
if (cashRecordDTO.getRefundChannels() != null && !cashRecordDTO.getRefundChannels().isEmpty()) {
String chineseChannels = translationService.findChineseSimplifiedByTranslation(
cashRecordDTO.getRefundChannels(), languageCode);
cashRecordDTO.setRefundChannels(chineseChannels);
}
}
}
@ -755,6 +845,32 @@ public class CashRefundController {
}
}
}
private void convertTranslatedExecutorFieldsToChinese(CashRecordDone cashRecordDone, String languageCode) {
if (cashRecordDone != null) {
// 转换退款币种
if (cashRecordDone.getRefundCurrency() != null && !cashRecordDone.getRefundCurrency().isEmpty()) {
String chineseCurrency = translationService.findChineseSimplifiedByTranslation(
cashRecordDone.getRefundCurrency(), languageCode);
cashRecordDone.setRefundCurrency(chineseCurrency);
}
// 转换退款途径
if (cashRecordDone.getRefundChannels() != null && !cashRecordDone.getRefundChannels().isEmpty()) {
String chineseChannels = translationService.findChineseSimplifiedByTranslation(
cashRecordDone.getRefundChannels(), languageCode);
cashRecordDone.setRefundChannels(chineseChannels);
}
// 转换所属地区
if (cashRecordDone.getMarketName() != null && !cashRecordDone.getMarketName().isEmpty()) {
String chineseMarket = translationService.findChineseSimplifiedByTranslation(
cashRecordDone.getMarketName(), languageCode);
cashRecordDone.setMarketName(chineseMarket);
}
}
}
/**
* 将类型数字转换为中文描述
*/

29
src/main/java/com/example/demo/controller/cash/MessageController.java

@ -5,6 +5,7 @@ import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.domain.DTO.IdRequest;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.cash.Status;
import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.service.cash.MessageService;
import com.example.demo.service.coin.MarketService;
@ -55,11 +56,17 @@ public class MessageController {
List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets);
// 获取当前用户的 executor
Integer executor = Integer.valueOf(admin.getAccount());
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertTranslatedFieldsToChinese(status, languageCode);
List<Messages> messages = messageService.getMessage(markets, status.getStatus(), executor);
for (Messages message : messages) {
convertTranslatedFieldsToChinese(message, languageCode);
}
}
// 权限校验逻辑
@ -67,7 +74,7 @@ public class MessageController {
markets = null;
}
List<com.example.demo.domain.vo.coin.Messages> messages = messageService.getMessage(markets, status.getStatus());
List<Messages> messages = messageService.getMessage(markets, status.getStatus(), executor);
// 对返回结果进行多语言转换
translateMessages(messages, lang);
return Result.success(messages);
@ -130,10 +137,20 @@ public class MessageController {
/**
* 将查询条件中的翻译字段转换为中文简体
*/
private void convertTranslatedFieldsToChinese(Status status, String languageCode) {
if (status != null) {
// 如果状态相关的字段需要翻译可以在这里处理
// 目前 Status 类中主要是状态码一般不需要翻译
private void convertTranslatedFieldsToChinese(Messages messages, String languageCode) {
if (messages != null) {
// 翻译标题
if (messages.getTitle() != null && !messages.getTitle().isEmpty()) {
messages.setTitle(languageTranslationUtil.translate(messages.getTitle(), languageCode));
}
// 翻译描述
if (messages.getDesc() != null && !messages.getDesc().isEmpty()) {
messages.setDesc(languageTranslationUtil.translate(messages.getDesc(), languageCode));
}
// 翻译市场名称
if (messages.getMarketName() != null && !messages.getMarketName().isEmpty()) {
messages.setMarketName(languageTranslationUtil.translate(messages.getMarketName(), languageCode));
}
}
}
}

36
src/main/java/com/example/demo/controller/coin/AdminController.java

@ -12,6 +12,7 @@ import com.example.demo.service.coin.TranslationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
@ -37,6 +38,8 @@ public class AdminController {
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private TranslationService translationService;
@Autowired
private StringRedisTemplate redisTemplate;
@PostMapping("/test")
public void testGetAdmin() {
@ -48,23 +51,50 @@ public class AdminController {
@Log("用户登录")
@PostMapping("/login")
public Result login(@RequestBody Admin admin, @RequestHeader(defaultValue = "zh_CN") String lang) {
try {
// ====== 新增验证码校验逻辑 ======
if (admin.getCaptcha() == null || admin.getUuid() == null) {
String errorMsg = "验证码或验证码ID缺失";
String translatedErrorMsg = languageTranslationUtil.translate(errorMsg, lang);
return Result.error(translatedErrorMsg);
}
String cacheCode = redisTemplate.opsForValue().get("CAPTCHA:" + admin.getUuid());
if (cacheCode == null) {
String errorMsg = "验证码已过期,请重新获取";
String translatedErrorMsg = languageTranslationUtil.translate(errorMsg, lang);
return Result.error(translatedErrorMsg);
}
if (!cacheCode.equalsIgnoreCase(admin.getCaptcha())) {
String errorMsg = "验证码错误,请重新输入";
String translatedErrorMsg = languageTranslationUtil.translate(errorMsg, lang);
return Result.error(translatedErrorMsg);
}
// ====== 验证码校验结束 ======
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将输入的翻译字段转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertLoginFieldsToChinese(admin, languageCode);
}
// 执行登录此时 admin 包含用户名密码
admin = adminService.login(admin);
// 登录成功后删除已使用的验证码防止重放
redisTemplate.delete("CAPTCHA:" + admin.getUuid());
// 生成 token
String token = JWTUtil.createJWT(admin);
// 对返回的管理员信息进行多语言转换
// 多语言转换
translateAdminInfoForLogin(admin, lang);
admin.setPassword(null);
return Result.success(token, admin);
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());

49
src/main/java/com/example/demo/controller/coin/CaptchaController.java

@ -0,0 +1,49 @@
// com.example.demo.controller.CaptchaController.java
package com.example.demo.controller.coin;
import com.google.code.kaptcha.Producer;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@RestController
public class CaptchaController {
@Autowired
private Producer kaptchaProducer;
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 获取图形验证码
* @param uuid 前端生成的唯一标识用于关联验证码
*/
@GetMapping("/captcha")
public void captcha(@RequestParam String uuid, HttpServletResponse response) throws IOException {
if (uuid == null || uuid.trim().isEmpty()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "uuid is required");
return;
}
// 生成验证码文本和图片
String code = kaptchaProducer.createText();
BufferedImage image = kaptchaProducer.createImage(code);
// 存入 Redis5分钟过期
redisTemplate.opsForValue().set("CAPTCHA:" + uuid, code, 5, TimeUnit.MINUTES);
// 输出图片
response.setHeader("Cache-Control", "no-store");
response.setContentType("image/jpeg");
ImageIO.write(image, "jpg", response.getOutputStream());
}
}

11
src/main/java/com/example/demo/controller/coin/ConsumeController.java

@ -174,7 +174,7 @@ public class ConsumeController {
// 如果操作成功对返回消息进行多语言转换
if (result.getCode() == 200) {
String translatedMsg = languageTranslationUtil.translate("添加成功", lang);
return Result.success(translatedMsg);
return Result.success(translatedMsg, result.getData());
} else {
// 对错误消息进行多语言转换
String translatedErrorMsg = languageTranslationUtil.translate(result.getMsg(), lang);
@ -212,6 +212,15 @@ public class ConsumeController {
// }
// }
@PostMapping("/DCadd")
public Result DCadd(@RequestBody ConsumeUser consumeUser) {
try {
return consumeService.addDC(consumeUser);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
public Result select(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) {
try {
//页码校验

32
src/main/java/com/example/demo/controller/coin/GoldDetailController.java

@ -323,9 +323,41 @@ public class GoldDetailController {
@PostMapping("/exportqqq")
public Result ExcelGoldDetail(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(page.getGoldDetail().getToken()), Admin.class);
// 解析语言代码
String languageCode = parseLanguageCode(lang);
List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
List<String> markets = marketService.getMarketIds(userMarkets);
// 校验分页参数
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
}
// 获取传入的市场列表
List<String> requestedMarkets = page.getGoldDetail() != null ? page.getGoldDetail().getMarkets() : null;
// 权限校验逻辑
if (markets.contains("9") || markets.contains("9999")) {
// 特权市场9 9999跳过权限校验直接放行传入的 markets
// 如果业务需要也可以在这里做空值处理
if (page.getGoldDetail() != null) {
// 保持 requestedMarkets 不变原样接受
// 可选如果 requestedMarkets null可设为默认值或保持 null
}
} else {
// 普通用户必须校验权限
if (requestedMarkets == null || requestedMarkets.isEmpty()) {
page.getGoldDetail().setMarkets(markets);
}
if (!markets.containsAll(requestedMarkets)) {
return Result.error("无权限!请求的市场不在授权范围内。");
}
// 校验通过保持 requestedMarkets 不变
}
// 如果不是中文环境将查询条件中的翻译文本转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
convertGoldDetailTranslatedFieldsToChinese(page.getGoldDetail(), languageCode);

63
src/main/java/com/example/demo/controller/coin/RechargeController.java

@ -85,6 +85,33 @@ public class RechargeController {
}
}
//根据订单单号获取订单信息重复充值/消费提示
@PostMapping("/selectByOrderCode")
public Result selectByOrderCode(@RequestBody String orderCode, @RequestHeader(defaultValue = "zh_CN") String lang) {
try {
// 解析语言代码
String languageCode = parseLanguageCode(lang);
// 如果不是中文环境将订单号转换为中文简体
if (!"zh".equalsIgnoreCase(languageCode) && !"zh_cn".equalsIgnoreCase(languageCode)) {
orderCode = translationService.findChineseSimplifiedByTranslation(orderCode, languageCode);
}
// 调用服务层获取订单信息
GoldRepeat goldRepeat = rechargeService.selectByOrderCode(orderCode);
// 对返回结果进行多语言转换
if (goldRepeat != null) {
translateGoldRepeat(goldRepeat, lang);
}
return Result.success(goldRepeat);
} catch (Exception e) {
String errorMsg = languageTranslationUtil.translate("查询失败", lang);
return Result.error(errorMsg + ": " + e.getMessage());
}
}
//充值明细筛选
@Log("充值明细筛选")
@PostMapping("/selectBy")
@ -160,6 +187,22 @@ public class RechargeController {
}
}
@PostMapping("/addDC")
public Result addDC(@RequestBody RechargeUser rechargeUser) {
try {
return rechargeService.addDC(rechargeUser);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
@PostMapping("/addFree")
public Result addFree(@RequestBody RechargeUser rechargeUser) {
try {
return rechargeService.addFree(rechargeUser);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
public Result select(@RequestBody Page page, @RequestHeader(defaultValue = "zh_CN") String lang) {
try {
@ -282,12 +325,30 @@ public class RechargeController {
}
/**
* 翻译 GoldRepeat 对象中的多语言字段
*/
private void translateGoldRepeat(GoldRepeat goldRepeat, String lang) {
if (goldRepeat == null) return;
// 翻译商品名称
if (goldRepeat.getGoodsName() != null && !goldRepeat.getGoodsName().isEmpty()) {
goldRepeat.setGoodsName(languageTranslationUtil.translate(goldRepeat.getGoodsName(), lang));
}
// 翻译是否退款状态描述
if (goldRepeat.getIsRefund() != null) {
String isRefundDesc = convertIsRefundToString(goldRepeat.getIsRefund());
goldRepeat.setIsRefundDesc(languageTranslationUtil.translate(isRefundDesc, lang));
}
}
/**
* 将是否退款数字转换为中文描述
*/
private String convertIsRefundToString(Integer isRefund) {
if (isRefund == null) return "";
switch (isRefund) {
case 0: return "未退款";
case 0: return "正常";
case 1: return "已退款";
default: return "未知状态";
}

8
src/main/java/com/example/demo/controller/coin/UserController.java

@ -1,6 +1,7 @@
package com.example.demo.controller.coin;
import com.example.demo.config.interfac.Log;
import com.example.demo.domain.entity.DCUser;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.coin.GoldUser;
import com.example.demo.domain.vo.coin.Result;
@ -37,6 +38,13 @@ public class UserController {
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
// 查找用户
@PostMapping("/DCSelectUser")
public Result DCSelectUser(@RequestBody DCUser dcUser) {
return userService.DCSelectUser(dcUser);
}
//查找用户
@Log("查找客户")
@PostMapping("/selectUser")

6
src/main/java/com/example/demo/domain/entity/Admin.java

@ -3,6 +3,7 @@ package com.example.demo.domain.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
@ -34,12 +35,17 @@ public class Admin implements UserDetails, Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 创建时间
@NotBlank(message = "验证码不能为空")
private String captcha;
@NotBlank(message = "验证码ID不能为空")
private String uuid; // 用于从 Redis 中取验证码
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date updateTime; // 更新时间
private Integer roleId;
@Override
@JsonIgnore
public Collection<? extends GrantedAuthority> getAuthorities() {

29
src/main/java/com/example/demo/domain/entity/DCUser.java

@ -0,0 +1,29 @@
package com.example.demo.domain.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @program: GOLD
* @ClassName DCUser
* @description:
* @author: huangqizhen
* @create: 202602-03 16:21
* @Version 1.0
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DCUser {
private String jwcode;
private String name;
private BigDecimal permanentBean;
private BigDecimal freeBean;
private BigDecimal nowFreeGold;
private BigDecimal nowPermanentGold;
private BigDecimal nowTaskGold;
private BigDecimal nowSumGold;
}

19
src/main/java/com/example/demo/domain/vo/cash/CashRecordRefund.java

@ -68,15 +68,16 @@ public class CashRecordRefund {
/**
* 订单状态1位代表收款2位代表退款
0线下财务待审核1线下财务审核通过待填手续费2线下财务审核驳回5手动撤回待编辑提交
3link线上财务复核待填手续费
4收款流程全部结束
6退款
---------------------------------------------
10地区财务待审核;11:地区财务手动撤回待编辑提交12地区财务驳回
20地区负责人待审核22地区负责人驳回
30总部财务待审核32总部财务驳回
40执行人待处理41执行人已处理退款结束
* 0线下财务待审核1线下财务审核通过待填手续费2线下财务审核驳回5手动撤回待编辑提交
* 3link线上财务复核待填手续费
* 4收款流程全部结束
* 6退款
* 7线下负责人审核通过待填手续费
* ---------------------------------------------
* 10地区财务待审核;11:地区财务手动撤回待编辑提交12地区财务驳回
* 20地区负责人待审核22地区负责人驳回
* 30总部财务待审核32总部财务驳回
* 40执行人待处理41执行人已处理退款结束
*/
private Integer status;

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

@ -55,7 +55,6 @@ public class ConsumeUser implements Serializable {
private String adminName; //提交人姓名
@ExcelIgnore
private Integer isRefund; //是否退款
@ExcelProperty("是否退款")
private String isRefundDescription; //退款描述
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 消费时间

46
src/main/java/com/example/demo/domain/vo/coin/GoldRepeat.java

@ -0,0 +1,46 @@
package com.example.demo.domain.vo.coin;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @program: gold-java
* @ClassName GoldRepeat
* @description:
* @author: Ethan
* @create: 202601-28 10:54
* @Version 1.0
**/
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class GoldRepeat implements Serializable {
private static final long serialVersionUID = 1L;
private String orderCode; // 订单号
private Integer jwcode; // 精网号
private BigDecimal permanentGold; // 永久金币
private BigDecimal freeJune; // 六月免费金币
private BigDecimal freeDecember; // 十二月免费金币
private BigDecimal taskGold; // 任务金币
private String goodsName; // 商品名称
private Byte type; // 类型0充值/1消耗/2退款
private Integer isRefund; // 是否已退款消费限定1退款0正常
private String isRefundDesc; // 退款描述
private Integer auditStatus; // 审核状态0待审核1通过2驳回3外部传入默认通过
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime; // 创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date auditTime; // 审核时间
}

4
src/main/java/com/example/demo/domain/vo/coin/Messages.java

@ -33,6 +33,6 @@ public class Messages {
private Integer market;
private Integer flag;
private String marketName;
private Integer queryId;
private Integer executor; //执行人OA号
}

28
src/main/java/com/example/demo/domain/vo/coin/OrderResultVO.java

@ -0,0 +1,28 @@
package com.example.demo.domain.vo.coin;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* 新增充值消费返回前端的VO类
*/
@Data
public class OrderResultVO {
// 订单号原有的核心字段
private String orderCoder;
// 时间格式化为前端易读的字符串也可保留LocalDateTime类型
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime;
// 快捷构建方法可选简化代码
public static OrderResultVO build(String orderCode, Date time) {
OrderResultVO vo = new OrderResultVO();
vo.setOrderCoder(orderCode); // 拼接前缀
// 格式化时间为yyyy-MM-dd HH:mm:ss格式也可根据前端需求调整
vo.setCreateTime(time);
return vo;
}
}

6
src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java

@ -92,4 +92,10 @@ public interface CashCollectionMapper {
void updateGoldOrder(@Param("cashRecordCollection")CashRecord cashRecord);
//根据订单号查询商品名称
String selectGoodsNameByCode(String orderCode);
// 根据 typeId type 更新消息记录的 flag 字段
int updateMessageFlagByTypeIdAndType(@Param("typeId") Integer typeId,
@Param("type") Integer type,
@Param("flag") Integer flag);
}

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

@ -44,4 +44,7 @@ public interface CashRefundMapper {
List<FundsDTO> selectRefundCount(List<Integer> needQueryIds);
void updategold(String orderCode);
// 新增方法根据订单ID更新消息表的flag字段
void updateMessageFlagByOrderId(Integer orderId);
}

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

@ -16,7 +16,7 @@ import java.util.List;
**/
@Mapper
public interface MessageMapper {
List<Messages> getMessage(List<String> markets, List<Integer> status);
List<Messages> getMessage(List<String> markets, List<Integer> status, Integer executor);
void update(Integer id);
}

1
src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java

@ -23,4 +23,5 @@ public interface BeanRechargeMapper1 {
//筛选查询小黄车消费
List<BeanConsumeCartVo> selectCartBy(BeanConsumeCartDTO beanConsumeCartDTO);
int add(BeanRecharge recharge);
int addBeanDC(BeanRecharge recharge);
}

3
src/main/java/com/example/demo/mapper/coin/OperationLogMapper.java

@ -10,7 +10,8 @@ public interface OperationLogMapper {
@Insert("INSERT INTO operation_log (user_id, username, action, ip, method, args, create_time) " +
"VALUES (#{userId}, #{username}, #{action}, #{ip}, #{method}, #{args}, NOW())")
void insertLog(OperationLog log);
@Insert("INSERT INTO message (jwcode, name, title, `desc`, status,type,type_id,market) "+" VALUES (#{jwcode}, #{name}, #{title}, #{desc},#{status},#{type},#{typeId},#{market})")
@Insert("INSERT INTO message (jwcode, name, title, `desc`, status, type, type_id, market, query_id, executor) " +
"VALUES (#{jwcode}, #{name}, #{title}, #{desc}, #{status}, #{type}, #{typeId}, #{market}, #{queryId}, #{executor})")
void insertMessage(Messages message);
@Options(
useGeneratedKeys = true, // 告诉 MyBatis 使用数据库生成的主键

7
src/main/java/com/example/demo/mapper/coin/RechargeMapper.java

@ -2,10 +2,7 @@ package com.example.demo.mapper.coin;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.coin.ConsumeUser;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.RechargeUser;
import com.example.demo.domain.vo.coin.RefundUser;
import com.example.demo.domain.vo.coin.*;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@ -31,4 +28,6 @@ public interface RechargeMapper {
Gold sumGold(RechargeUser rechargeUser);
List<RechargeUser> selectOrderCodeByJwcode(RefundUser refundUser);
//根据订单单号获取订单信息重复充值/消费提示
GoldRepeat selectByOrderCode(String orderCode);
}

3
src/main/java/com/example/demo/mapper/sqlserver/HistoryRecordMapper.java

@ -1,6 +1,7 @@
package com.example.demo.mapper.sqlserver;
import com.example.demo.domain.vo.coin.GoldUser;
import com.example.demo.domain.vo.coin.HistoryRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -27,4 +28,6 @@ public interface HistoryRecordMapper {
long countNewHistoryRecord(HistoryRecord historyRecord);
// 统计总条数
long countOldHistoryRecord(HistoryRecord historyRecord);
// 获取用户信息
GoldUser selectUser(String jwcode);
}

3
src/main/java/com/example/demo/security/SecurityConfig.java

@ -60,7 +60,8 @@ public class SecurityConfig {
request
.requestMatchers( HttpMethod.POST,
// 用户不登录就可以访问的路径
"/admin/login","/upload/**","/detailY/ERP","/home/java/haiwaiyanfa/gold1/**","/home/java/haiwaiyanfa/**","/statistics/**","/Mysql/**","/Temporary/**").permitAll()
"/admin/login","/upload/**","/detailY/ERP","/home/java/haiwaiyanfa/gold1/**","/home/java/haiwaiyanfa/**","/statistics/**","/Mysql/**","/Temporary/**","/beanRecharge/addBeanDC","/beanConsume/reduceBeanDC","/recharge/addDC","/recharge/addFree","/cashCollection/syncToCashRecord","/user/DCSelectUser","/consume/DCadd","bank/bankAuto").permitAll()
.requestMatchers(HttpMethod.GET, "/captcha").permitAll()
.requestMatchers(
"/error","alipay/**","/upload/**","/home/java/haiwaiyanfa/gold1/**","/home/java/haiwaiyanfa/**"
).permitAll()

1
src/main/java/com/example/demo/service/bean/BeanConsumeService.java

@ -24,6 +24,7 @@ public interface BeanConsumeService {
List<String> getLiveDept();
//减少金豆
Result reduce(BeanConsume consume);
Result reduceBeanDC(BeanConsume consume);
//筛选查询直播消费
Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive);
//筛选查询铁粉消费

3
src/main/java/com/example/demo/service/bean/BeanRechargeService.java

@ -24,6 +24,9 @@ public interface BeanRechargeService {
//线上充值
Result add(BeanRecharge recharge);
//添加金豆
Result addBeanDC(BeanRecharge recharge);
//系统充值
PageInfo<BeanSystemRechargeInfo> selectBySystem(Integer pageNum, Integer pageSize, BeanSystemRechargeInfo beanRechargeInfo);

2
src/main/java/com/example/demo/service/cash/MessageService.java

@ -16,7 +16,7 @@ import java.util.List;
**/
@Service
public interface MessageService {
List<Messages> getMessage(List<String> markets, List<Integer> status);
List<Messages> getMessage(List<String> markets, List<Integer> status, Integer executor);
void update(Integer id) throws Exception;
}

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

@ -20,7 +20,7 @@ public interface RefundService {
//添加
int add(CashRecordRefund cashRecordRefund, String lang) throws Exception;
//修改
int update(CashRecordDone cashRecordDone, String lang) throws Exception;
int update(CashRecordDone cashRecordDone) throws Exception;
//
int withdraw(CashRecordDone cashRecordDone);
//审核

2
src/main/java/com/example/demo/service/coin/ConsumeService.java

@ -29,6 +29,8 @@ public interface ConsumeService {
//增加消费订单
Result add(ConsumeUser consumeUser);
Result addDC(ConsumeUser consumeUser);
// //增加退款订单
// Result addRefund(ConsumeUser consumeUser);

12
src/main/java/com/example/demo/service/coin/RechargeService.java

@ -1,9 +1,7 @@
package com.example.demo.service.coin;
import com.example.demo.domain.vo.coin.ConsumeUser;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.RechargeUser;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.coin.*;
import com.github.pagehelper.PageInfo;
/**
@ -27,4 +25,10 @@ public interface RechargeService {
//添加充值记录
Result add(RechargeUser rechargeUser);
////根据订单单号获取订单信息重复充值/消费提示
GoldRepeat selectByOrderCode(String orderCode);
Result addDC(RechargeUser rechargeUser);
Result addFree(RechargeUser rechargeUser);
}

3
src/main/java/com/example/demo/service/coin/UserService.java

@ -1,5 +1,6 @@
package com.example.demo.service.coin;
import com.example.demo.domain.entity.DCUser;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.GoldUser;
@ -33,4 +34,6 @@ public interface UserService {
//更新用户的首充时间
void updateFirstRecharge();
Result DCSelectUser(DCUser dcUser);
}

76
src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java

@ -12,6 +12,7 @@ import com.example.demo.mapper.coin.RoleMapper;
import com.example.demo.mapper.coin.UserMapper;
import com.example.demo.mapper.live.LiveMapper;
import com.example.demo.service.bean.BeanConsumeService;
import com.example.demo.service.bean.BeanUserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
@ -156,6 +157,81 @@ public class BeanConsumeServiceImpl implements BeanConsumeService {
}
@Override
public Result reduceBeanDC(BeanConsume consume) {
// 验证精网号是否有效
if (consume.getJwcode() == null || consume.getJwcode().isEmpty()) {
return Result.error("精网号不能为空");
}
//获取用户当前余额
BeanUserCard user = beanUserMapper.userCard(consume.getJwcode());
// 计算需要扣除的总金豆数量
int totalConsume = consume.getPermanentBean();
// 检查用户金豆余额是否足够
if (user.getFreeBean() + user.getPermanentBean() < totalConsume) {
return Result.error("用户金豆余额不足");
}
// 先扣免费金豆再扣永久金豆
int freeBeanConsume = Math.min(totalConsume, user.getFreeBean());
int permanentBeanConsume = totalConsume - freeBeanConsume;
// 将计算后的值赋给consume对象
consume.setFreeBean(freeBeanConsume);
consume.setPermanentBean(permanentBeanConsume);
String jwcode = consume.getJwcode();
try {
BaseDES2 d = new BaseDES2();
jwcode = d.encrypt(jwcode);
} catch (Exception e) {
return Result.error("加密失败");
}
String content = consume.getRemark(); // 备注作为content参数
// 2. 创建请求参数对象使用Map或自定义实体类
Map<String, String> params = new HashMap<>();
params.put("jwcode", jwcode);
int total = consume.getPermanentBean() + consume.getFreeBean();
params.put("total", String.valueOf(total));
params.put("buy", consume.getPermanentBean().toString());
params.put("free", consume.getFreeBean().toString());
params.put("content", content);
// 3. 构建请求头指定Content-Type为JSON
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); // 关键设置为JSON格式
// 4. 构建请求实体参数+头信息
HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(params, headers);
try {
// 5. 发送POST请求
ResponseEntity<String> response = restTemplate.postForEntity(
apiUrl,
requestEntity,
String.class
);
System.out.println("请求参数:" + params);
System.out.println("响应状态码:" + response.getStatusCodeValue());
System.out.println("响应内容:" + response.getBody());
if (!response.getStatusCode().is2xxSuccessful()) {
return Result.error("远程接口接口调用失败,状态码:" + response.getStatusCodeValue() + ",响应:" + response.getBody());
}
return Result.success(response.getBody());
} catch (RestClientException e) {
e.printStackTrace();
return Result.error("请求发送失败:" + e.getMessage());
}
}
//筛选查询直播消费
@Override
public Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive) {

228
src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java

@ -1,30 +1,40 @@
package com.example.demo.serviceImpl.bean;
import com.example.demo.Util.BaseDES;
import com.example.demo.Util.BaseDES2;
import com.example.demo.Util.BaseDES3;
import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.GoldUser;
import com.example.demo.domain.vo.coin.RechargeUser;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.domain.vo.coin.*;
import com.example.demo.mapper.bean.BeanRechargeMapper2;
import com.example.demo.mapper.bean.BeanUserMapper;
import com.example.demo.mapper.coin.BeanRechargeMapper1;
import com.example.demo.mapper.coin.MarketMapper;
import com.example.demo.mapper.coin.UserMapper;
import com.example.demo.mapper.pay.BeanRechargeMapper3;
import com.example.demo.service.bean.BeanRechargeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import com.example.demo.config.RabbitMQConfig;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -37,6 +47,7 @@ import java.util.stream.Collectors;
**/
@Service
@RequiredArgsConstructor
@Slf4j
public class BeanRechargeServiceImpl implements BeanRechargeService {
@Autowired
@ -46,7 +57,7 @@ public class BeanRechargeServiceImpl implements BeanRechargeService {
private BeanRechargeMapper2 beanRechargeMapper2;
@Autowired
private BeanRechargeMapper1 beanRechargeMapper1;
private BeanRechargeMapper1 beanRechargeMapper1;
@Autowired
private BeanRechargeMapper3 beanRechargeMapper3;
@ -56,6 +67,14 @@ public class BeanRechargeServiceImpl implements BeanRechargeService {
@Autowired
private BeanUserMapper beanUserMapper;
@Autowired
private MarketMapper marketMapper;
@Qualifier("rabbitTemplate")
@Autowired
private RabbitTemplate rabbitTemplate;
@Value("${bean.recharge.url}")
String apiUrl;
//新增金豆
@Override
@ -65,8 +84,7 @@ public class BeanRechargeServiceImpl implements BeanRechargeService {
if (recharge.getJwcode() == null || recharge.getJwcode().toString().isEmpty()) {
return Result.error("精网号不能为空");
}
if(recharge.getJwcode()<10000000||recharge.getJwcode()>99999999)
{
if (recharge.getJwcode() < 10000000 || recharge.getJwcode() > 99999999) {
return Result.error("精网号位数小于8位或大于8位");
}
// 验证免费豆和永久豆是否为非负数
@ -82,18 +100,55 @@ public class BeanRechargeServiceImpl implements BeanRechargeService {
return Result.error("免费豆和永久豆不能同时为0");
}
BeanUserCard user = beanUserMapper.userCard(String.valueOf(recharge.getJwcode()));
if(user==null){
if (user == null) {
return Result.error("用户查找不到");
}
// 验证备注是否为空
if (recharge.getRemark() == null || recharge.getRemark().toString().isEmpty()) {
return Result.error("备注不能为空");
}
if(recharge.getAdminName() == null || recharge.getAdminName().toString().isEmpty()){
if (recharge.getAdminName() == null || recharge.getAdminName().toString().isEmpty()) {
return Result.error("管理员名称不能为空");
}
beanRechargeMapper1.add(recharge);
// 创建消息队列用于发送金豆审核通知
try {
Messages message = new Messages();
message.setJwcode(user.getJwcode());
message.setName(user.getName());
message.setStatus(30);
message.setType(0);
message.setDesc("的金豆充值收款申请待审核,前往处理");
message.setTitle("金币管理--财务审核--金豆审核");
message.setTypeId(recharge.getId());
// 安全获取和设置市场信息
String userMarketStr = user.getMarket();
if (userMarketStr != null && !userMarketStr.isEmpty()) {
try {
Integer marketId = Integer.valueOf(userMarketStr);
message.setMarket(marketId);
String marketName = marketMapper.getMarketNameById(String.valueOf(marketId));
message.setMarketName(marketName != null ? marketName : "");
} catch (NumberFormatException e) {
log.warn("无法解析市场ID: {}", userMarketStr);
message.setMarket(null);
message.setMarketName("");
}
} else {
message.setMarket(null);
message.setMarketName("");
}
message.setQueryId(20);
rabbitTemplate.convertAndSend(RabbitMQConfig.Bean_RECHARGE_EXCHANGE, "bean.recharge.save", message);
} catch (Exception e) {
log.error("发送金豆充值消息失败", e);
// 消息发送失败不应该影响主业务逻辑可以选择继续或记录日志
}
// String jwcode = recharge.getJwcode().toString();
// String op = "recharge"; // 操作类型根据实际业务定义例如"recharge"表示充值
// String content = recharge.getRemark(); // 备注作为content参数
@ -121,9 +176,143 @@ public class BeanRechargeServiceImpl implements BeanRechargeService {
}
}
@Value("${toujiaoApp.url}")
private String toujiaoAppUrl;
@Override
public Result addBeanDC(BeanRecharge recharge) {
try {
// 验证精网号是否有效
recharge.setPermanentBean(0);
if (recharge.getJwcode() == null || recharge.getJwcode().toString().isEmpty()) {
return Result.error("精网号不能为空");
}
if (recharge.getJwcode() < 10000000 || recharge.getJwcode() > 99999999) {
return Result.error("精网号位数小于8位或大于8位");
}
// 验证免费豆和永久豆是否为非负数
if (recharge.getFreeBean() < 0) {
return Result.error("免费豆不能为负数");
}
// 验证免费豆和永久豆是否为非负数
if (recharge.getFreeBean() > 999999) {
return Result.error("免费豆和不能超过999999");
}
// 验证免费豆和永久豆是否均为0
if (recharge.getFreeBean() == 0) {
return Result.error("免费豆为0");
}
// 验证备注是否为空
if (recharge.getRemark() == null || recharge.getRemark().toString().isEmpty()) {
return Result.error("备注不能为空");
}
String jwcode = recharge.getJwcode().toString();
String jwcodeDC = recharge.getJwcode().toString();
// String jwcode = "2e35cadd48a15cc4cd834d35e38faa71";
try {
BaseDES2 d = new BaseDES2();
jwcode = d.encrypt(jwcode);
} catch (Exception e) {
return Result.error("加密失败");
}
try {
BaseDES3 d = new BaseDES3();
jwcodeDC = d.encrypt(jwcodeDC);
} catch (Exception e) {
return Result.error("加密失败");
}
try {
// 构建完整的请求URL
String fullUrl = toujiaoAppUrl + "/api/user/toujiaoAppLogin";
// 创建请求头设置Content-Type为application/x-www-form-urlencoded
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
// 创建请求体使用MultiValueMap存储参数
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("jwcode", jwcodeDC);
// 构建请求实体
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
// 发送POST请求
ResponseEntity<String> response = restTemplate.postForEntity(
fullUrl,
requestEntity,
String.class
);
System.out.println("请求URL:" + fullUrl);
System.out.println("请求参数:" + params);
System.out.println("响应状态码:" + response.getStatusCodeValue());
System.out.println("响应内容:" + response.getBody());
if (!response.getStatusCode().is2xxSuccessful()) {
return Result.error("远程接口调用失败,状态码:" + response.getStatusCodeValue() + ",响应:" + response.getBody());
}
} catch (RestClientException e) {
e.printStackTrace();
return Result.error("请求发送失败:" + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
return Result.error("系统异常:" + e.getMessage());
}
BeanUserCard user = beanUserMapper.userCard(String.valueOf(recharge.getJwcode()));
if (user == null) {
return Result.error("用户查找不到");
}
String content = recharge.getRemark(); // 备注作为content参数
String orderNo = UUID.randomUUID().toString().replace("-", ""); // 生成唯一订单号去除横线
// 1. 创建请求参数对象使用Map或自定义实体类
Map<String, String> params = new HashMap<>();
params.put("jwcode", jwcode);
params.put("gold_buy", recharge.getPermanentBean().toString());
params.put("gold_free", recharge.getFreeBean().toString());
params.put("content", content);
params.put("order_no", orderNo);
// 2. 构建请求头指定Content-Type为JSON
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); // 关键设置为JSON格式
// 3. 构建请求实体参数+头信息
HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(params, headers);
try {
// 4. 发送POST请求
ResponseEntity<String> response = restTemplate.postForEntity(
apiUrl,
requestEntity,
String.class
);
System.out.println("请求参数:" + params);
System.out.println("响应状态码:" + response.getStatusCodeValue());
System.out.println("响应内容:" + response.getBody());
if (!response.getStatusCode().is2xxSuccessful()) {
return Result.error("远程接口接口调用失败,状态码:" + response.getStatusCodeValue() + ",响应:" + response.getBody());
}
} catch (RestClientException e) {
e.printStackTrace();
return Result.error("请求发送失败:" + e.getMessage());
}
return Result.success("添加成功");
} catch (Exception e) {
return Result.error("系统异常:" + e.getMessage());
}
}
//系统充值明细
@Override
public PageInfo<BeanSystemRechargeInfo> selectBySystem(Integer pageNum, Integer pageSize, BeanSystemRechargeInfo beanSystemRechargeInfo){
public PageInfo<BeanSystemRechargeInfo> selectBySystem(Integer pageNum, Integer pageSize, BeanSystemRechargeInfo beanSystemRechargeInfo) {
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
List<BeanSystemRechargeInfo> beanSystemRechargeInfos = beanRechargeMapper2.selectBySystem(beanSystemRechargeInfo);
return new PageInfo<>(beanSystemRechargeInfos);
@ -134,22 +323,22 @@ public class BeanRechargeServiceImpl implements BeanRechargeService {
public GoldBean statsSystemBean(BeanSystemRechargeInfo beanSystemRechargeInfo) {
GoldBean gold = beanRechargeMapper2.selectSystemSum(beanSystemRechargeInfo);
if(gold==null){
if (gold == null) {
gold = new GoldBean();
}
BigDecimal moneySum;
if(gold.getPermanentBean()==null){
if (gold.getPermanentBean() == null) {
gold.setPermanentBean(0);
}
if(gold.getFreeBean()==null){
if (gold.getFreeBean() == null) {
gold.setFreeBean(0);
}
if(gold.getNum()==null){
if (gold.getNum() == null) {
gold.setNum(0);
}
moneySum = new BigDecimal(gold.getPermanentBean()).divide(new BigDecimal("50"), 2, RoundingMode.HALF_UP);
gold.setMoney(moneySum.doubleValue());
gold.setBeanNum(gold.getPermanentBean()+gold.getFreeBean());
gold.setBeanNum(gold.getPermanentBean() + gold.getFreeBean());
return gold;
}
@ -166,7 +355,7 @@ public class BeanRechargeServiceImpl implements BeanRechargeService {
//线上充值明细
@Override
public PageInfo<BeanOnlineRechargeInfo> selectByOnline(Integer pageNum, Integer pageSize, BeanOnlineRechargeInfo beanOnlineRechargeInfo){
public PageInfo<BeanOnlineRechargeInfo> selectByOnline(Integer pageNum, Integer pageSize, BeanOnlineRechargeInfo beanOnlineRechargeInfo) {
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
List<BeanOnlineRechargeInfo> beanOnlineRechargeInfos = beanRechargeMapper3.selectByOnline(beanOnlineRechargeInfo);
return new PageInfo<>(beanOnlineRechargeInfos);
@ -180,7 +369,6 @@ public class BeanRechargeServiceImpl implements BeanRechargeService {
}
@Override
public List<String> onlineMarket() {
List<String> list = beanRechargeMapper3.onlineMarket();

72
src/main/java/com/example/demo/serviceImpl/cash/CashAuditServiceImpl.java

@ -11,6 +11,7 @@ import com.example.demo.domain.vo.coin.Messages;
import com.example.demo.mapper.cash.CashAuditMapper;
import com.example.demo.mapper.cash.CashCollectionMapper;
import com.example.demo.mapper.coin.AuditMapper;
import com.example.demo.mapper.coin.MarketMapper;
import com.example.demo.mapper.coin.RechargeMapper;
import com.example.demo.service.cash.CashAuditService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
@ -46,6 +47,8 @@ public class CashAuditServiceImpl implements CashAuditService {
private CashAuditMapper cashAuditMapper;
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private MarketMapper marketMapper;
@Transactional
@ -192,33 +195,50 @@ public class CashAuditServiceImpl implements CashAuditService {
}
//更新订单
cashAuditMapper.updateOrder(updateOrder);
// 创建消息队列用于发送审核结果通知
Messages message = new Messages();
message.setJwcode(order.getJwcode());
message.setName(order.getName());
message.setStatus(updateOrder.getStatus());
message.setDesc(order.getJwcode() + action==1?"收款记录需补充手续费,前往填写":"现金收款申请已被驳回,前往查看驳回理");
message.setTitle(action==1?"收款订单审核通过":"收款订单审核驳回");
message.setType(1);
message.setTypeId(order.getId());
message.setMarket(Integer.valueOf(order.getMarket()));
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
// 根据审核结果发送不同的消息
if (action == 1) {
// 发送审核通过消息
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_COLLECTION_EXCHANGE,
"collection.audited",
message
);
if (action == 1){
// 创建消息队列1用于发送审核结果通知
Messages message1 = new Messages();
message1.setJwcode(order.getJwcode());
message1.setName(order.getName());
message1.setStatus(7);
message1.setDesc("的收款记录需补充手续费,前往填写");
message1.setTitle("现金管理--收款处理(负责人)");
message1.setType(0);
message1.setTypeId(order.getId());
message1.setMarket(Integer.valueOf(order.getReceivedMarket()));
String marketName1 = marketMapper.getMarketNameById(String.valueOf(message1.getMarket()));
message1.setMarketName(marketName1);
message1.setQueryId(86);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message1);
// 创建消息队列2用于发送审核结果通知
Messages message2 = new Messages();
message2.setJwcode(order.getJwcode());
message2.setName(order.getName());
message2.setStatus(updateOrder.getStatus());
message2.setDesc("的收款记录需补充手续费,前往填写");
message2.setTitle("现金管理--收款处理");
message2.setType(0);
message2.setTypeId(order.getId());
message2.setMarket(Integer.valueOf(order.getReceivedMarket()));
String marketName2 = marketMapper.getMarketNameById(String.valueOf(message2.getMarket()));
message2.setMarketName(marketName2);
message2.setQueryId(74);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message2);
} else {
// 发送审核驳回消息
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_COLLECTION_EXCHANGE,
"collection.rejected",
message
);
// 创建消息队列用于发送审核结果通知
Messages message = new Messages();
message.setJwcode(order.getJwcode());
message.setName(order.getName());
message.setStatus(updateOrder.getStatus());
message.setDesc("的现金收款申请已被驳回,前往查看驳回理由");
message.setTitle("现金管理--收款提交");
message.setType(0);
message.setTypeId(order.getId());
message.setMarket(Integer.valueOf(order.getMarket()));
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(marketName);
message.setQueryId(60);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
}
return true;
}

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

@ -140,13 +140,14 @@ public class CashCollectionServiceImpl implements CashCollectionService {
message.setJwcode(cashRecord.getJwcode());
message.setName(cashRecord.getName());
message.setStatus(cashRecord.getStatus());
message.setDesc(cashRecord.getJwcode()+languageTranslationUtil.translate("用户的现金收款申请待审核,前往审核", lang));
message.setTitle(languageTranslationUtil.translate("现金收款--新增收款", lang));
message.setType(1);
message.setDesc("的现金收款申请待审核,前往审核");
message.setTitle("现金管理--收款处理");
message.setType(0);
message.setTypeId(cashRecord.getId());
message.setMarket(Integer.valueOf(cashRecord.getMarket()));
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(languageTranslationUtil.translate(marketName, lang));
message.setMarketName(marketName);
message.setQueryId(67);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
return "添加成功";
}
@ -193,13 +194,14 @@ public class CashCollectionServiceImpl implements CashCollectionService {
message.setJwcode(cashRecord.getJwcode());
message.setName(cashRecord.getName());
message.setStatus(cashRecord.getStatus());
message.setDesc(cashRecord.getJwcode()+languageTranslationUtil.translate("用户的现金收款申请待审核,请前往审核", lang));
message.setTitle(languageTranslationUtil.translate("现金收款--赠送免费金币", lang));
message.setDesc("的现金收款申请待审核,请前往审核");
message.setTitle("现金收款--现金收款");
message.setType(1);
message.setTypeId(cashRecord.getId());
message.setMarket(Integer.valueOf(cashRecord.getMarket()));
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(languageTranslationUtil.translate(marketName, lang));
message.setMarketName(marketName);
message.setQueryId(67);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
return "添加成功";
}
@ -207,6 +209,7 @@ public class CashCollectionServiceImpl implements CashCollectionService {
//撤回未审核的订单
@Override
public String cancel(String orderCode) {
// 查询订单是否存在
CashRecord cashRecord = cashCollectionMapper.selectByOrderCode(orderCode);
if (cashRecord == null) {
throw new IllegalArgumentException("订单不存在");
@ -214,9 +217,28 @@ public class CashCollectionServiceImpl implements CashCollectionService {
if (cashRecord.getStatus() != 0) {
throw new IllegalArgumentException("订单状态不符合条件");
}
//修改订单状态
// 更新订单状态为撤回状态5
int rows = cashCollectionMapper.updateStatus(orderCode, 5);
// 更新与该订单关联的消息记录的 flag 字段为 1
try {
// 根据订单ID查找关联的消息记录
Messages message = new Messages();
message.setTypeId(cashRecord.getId()); // 订单ID作为消息的 typeId
message.setType(0); // 消息类型为收款
// 更新消息的 flag 字段为 1
int messageRows = cashCollectionMapper.updateMessageFlagByTypeIdAndType(
message.getTypeId(), message.getType(), 1);
if (messageRows <= 0) {
log.warn("未找到与订单 {} 关联的消息记录", orderCode);
}
} catch (Exception e) {
log.error("更新消息状态失败,订单号:{}", orderCode, e);
// 可选择抛出异常或记录日志后继续执行
}
return rows > 0 ? "撤回成功" : "撤回失败";
}
@ -278,21 +300,20 @@ public class CashCollectionServiceImpl implements CashCollectionService {
//cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(cashRecord.getJwcode()));
int rows = cashCollectionMapper.updateByOrderCode(cashRecord);
if (rows > 0) {
// 发送重新提交消息
CashCollectionMessage message = new CashCollectionMessage();
message.setId(cashRecord.getId());
message.setOrderCode(cashRecord.getOrderCode());
message.setStatus(0); // 重新提交后状态变为待审核
message.setStatusDescription(languageTranslationUtil.translate("线下财务待审核", lang));
message.setMessage(languageTranslationUtil.translate("收款订单已重新提交", lang));
message.setSubmitterId(cashRecord.getSubmitterId());
message.setTimestamp(LocalDateTime.now());
rabbitTemplate.convertAndSend(
RabbitMQConfig.CASH_COLLECTION_EXCHANGE,
"collection.created",
message
);
// 发送收款创建消息
Messages message = new Messages();
message.setJwcode(cashRecord.getJwcode());
message.setName(cashRecord.getName());
message.setStatus(cashRecord.getStatus());
message.setDesc("的现金收款申请待审核,前往审核");
message.setTitle("现金管理--收款处理");
message.setType(0);
message.setTypeId(cashRecord.getId());
message.setMarket(Integer.valueOf(cashRecord.getMarket()));
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(marketName);
message.setQueryId(67);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
}
return rows > 0 ? "重新提交成功" : "重新提交失败";
}
@ -482,7 +503,7 @@ public class CashCollectionServiceImpl implements CashCollectionService {
cashRecord.setMarket(cashCollectionMapper.getMarketByJwcode(gOrder.getJwcode()));
if (gOrder.getType().equals("gold")){ //充金豆
cashRecord.setActivity("Link日常充值");
cashRecord.setActivity("99");
cashRecord.setGoodsName("Link充值金豆");
cashRecord.setRemark("Link充值金豆");
cashRecord.setNumUnit("个");
@ -491,7 +512,7 @@ public class CashCollectionServiceImpl implements CashCollectionService {
}
if (gOrder.getType().equals("gold_coin")){//充金币
cashRecord.setActivity("Link日常充值");
cashRecord.setActivity("98");
cashRecord.setGoodsName("Link充值金币");
cashRecord.setRemark("Link充值金币");
cashRecord.setPermanentGold(gOrder.getCount()*100);
@ -574,4 +595,5 @@ public class CashCollectionServiceImpl implements CashCollectionService {
return new PageInfo<>(performanceVOs);
}
}

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

@ -1,4 +1,5 @@
package com.example.demo.serviceImpl.cash;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.Util.SimpleIdGenerator;
import com.example.demo.domain.entity.Admin;
@ -22,6 +23,7 @@ import com.example.demo.mapper.coin.RefundMapper;
import com.example.demo.service.cash.RefundService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -46,7 +48,7 @@ import static org.apache.commons.lang3.StringUtils.substring;
* @Version 1.0
**/
@Service
@Slf4j
public class CashRefundServiceImpl implements RefundService {
@Autowired
@ -142,18 +144,17 @@ public class CashRefundServiceImpl implements RefundService {
BigDecimal permanent = new BigDecimal(permanentGold).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
item.setGold(permanent);
item.setFree(free);
item.setActivity(cashCollection.getActivity());
item.setPaymentCurrency(cashCollection.getPaymentCurrency());
if(cashCollection.getPaymentCurrency() != null){
item.setPaymentAmount(cashCollection.getPaymentAmount().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));}
else item.setPaymentAmount(cashCollection.getPaymentAmount());
if (cashCollection.getPaymentCurrency() != null) {
item.setPaymentAmount(cashCollection.getPaymentAmount().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
} else item.setPaymentAmount(cashCollection.getPaymentAmount());
item.setReceivedCurrency(cashCollection.getReceivedCurrency());
if (cashCollection.getReceivedCurrency() != null){
item.setReceivedAmount(cashCollection.getReceivedAmount().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));}
else item.setReceivedAmount(cashCollection.getReceivedAmount());
if (cashCollection.getReceivedCurrency() != null) {
item.setReceivedAmount(cashCollection.getReceivedAmount().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
} else item.setReceivedAmount(cashCollection.getReceivedAmount());
item.setPayType(cashCollection.getPayType());
item.setPayTime(cashCollection.getPayTime());
item.setPayBankCode(cashCollection.getBankCode());
@ -174,18 +175,18 @@ public class CashRefundServiceImpl implements RefundService {
}
@Override
public int add(CashRecordRefund cashRecordRefund, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
if(cashRecordRefund.getJwcode()==null){
throw new Exception("未输入精网号") ;
public int add(CashRecordRefund cashRecordRefund, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
if (cashRecordRefund.getJwcode() == null) {
throw new Exception("未输入精网号");
}
if(cashRecordRefund.getRefundModel()== null){
throw new Exception("请填充退款类型") ;
if (cashRecordRefund.getRefundModel() == null) {
throw new Exception("请填充退款类型");
}
if(cashRecordRefund.getRefundReason()== null){
throw new Exception("请填写退款理由") ;
if (cashRecordRefund.getRefundReason() == null) {
throw new Exception("请填写退款理由");
}
if (cashRecordRefund.getHandlingCharge()== null){
throw new Exception("请先填写手续费") ;
if (cashRecordRefund.getHandlingCharge() == null) {
throw new Exception("请先填写手续费");
}
CashRecordDone cashRecordDonetwo = new CashRecordDone();
cashRecordDonetwo.setAreaServise(cashRecordRefund.getAreaServise());
@ -202,8 +203,8 @@ public class CashRefundServiceImpl implements RefundService {
CashRecordDone cashRecordDone1 = new CashRecordDone();
cashRecordDone1.setId(cashRecordRefund.getOriginalOrderId());
cashRecordDone1.setStatus(6);
if (cashRecordDone1.getId()!=null||cashRecordDone1.getOrderCode()!= null)
cashRefundMapper.updateStatus(cashRecordDone1);
if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null)
cashRefundMapper.updateStatus(cashRecordDone1);
else return Result.error("提交失败").getCode();
// 发送退款创建消息
@ -211,13 +212,14 @@ public class CashRefundServiceImpl implements RefundService {
message.setJwcode(cashRecordRefund.getJwcode());
message.setName(cashRecordRefund.getName());
message.setStatus(cashRecordRefund.getStatus());
message.setDesc(cashRecordRefund.getJwcode()+languageTranslationUtil.translate("用户的客服退款申请待审核,前往处理", lang));
message.setTitle(languageTranslationUtil.translate("现金退款--新增退款", lang));
message.setDesc("的客服退款申请待审核,前往处理");
message.setTitle("现金退款--新增退款");
message.setType(0);
message.setTypeId(cashRecordRefund.getId());
message.setMarket(Integer.valueOf(cashRecordRefund.getMarket()));
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(languageTranslationUtil.translate(marketName, lang));
message.setMarketName(marketName);
message.setQueryId(103);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
return Result.success("提交成功").getCode();
@ -225,26 +227,26 @@ public class CashRefundServiceImpl implements RefundService {
}
@Override
public int update(CashRecordDone cashRecordDone, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
if (cashRecordDone.getJwcode()== null) {
public int update(CashRecordDone cashRecordDone) throws Exception {
if (cashRecordDone.getJwcode() == null) {
throw new RuntimeException("未输入精网号");
}
if (cashRecordDone.getPaymentAmount()== null) {
if (cashRecordDone.getPaymentAmount() == null) {
throw new RuntimeException("未输入付款金额");
}
if (cashRecordDone.getPaymentCurrency()== null){
throw new RuntimeException("未输入付款币种");
if (cashRecordDone.getPaymentCurrency() == null) {
throw new RuntimeException("未输入付款币种");
}
if (cashRecordDone.getRefundModel()== null) {
if (cashRecordDone.getRefundModel() == null) {
throw new RuntimeException("请填写退款类型");
}
if (cashRecordDone.getRefundReason()== null) {
if (cashRecordDone.getRefundReason() == null) {
throw new RuntimeException("请填写退款理由");
}
if(cashRecordDone.getNewRefundGold()== null){
if (cashRecordDone.getNewRefundGold() == null) {
cashRecordDone.setNewRefundGold(BigDecimal.valueOf(0));
}
if(cashRecordDone.getNewRefundFree()== null){
if (cashRecordDone.getNewRefundFree() == null) {
cashRecordDone.setNewRefundFree(BigDecimal.valueOf(0));
}
int result = cashRefundMapper.update(cashRecordDone);
@ -255,36 +257,46 @@ public class CashRefundServiceImpl implements RefundService {
message.setJwcode(cashRecordDTO.getJwcode());
message.setName(cashRecordDTO.getName());
message.setStatus(cashRecordDTO.getStatus());
message.setDesc(cashRecordDTO.getJwcode() + languageTranslationUtil.translate("用户的退款申请待审核,前往处理", lang));
message.setTitle(languageTranslationUtil.translate("现金退款--当地退款审核(编辑后提交)", lang));
message.setDesc("的退款申请待审核,前往处理");
message.setTitle("现金管理--退款审批");
message.setType(1);
message.setTypeId(cashRecordDTO.getId());
message.setMarket(cashRecordDTO.getMarket());
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(languageTranslationUtil.translate(marketName, lang));
message.setMarketName(marketName);
message.setQueryId(103);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
}
return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
}
@Override
public int withdraw(CashRecordDone cashRecordDone) {
return cashRefundMapper.withdraw(cashRecordDone.getId());
// 撤回订单
int result = cashRefundMapper.withdraw(cashRecordDone.getId());
if (result > 0) {
// 更新与该订单关联的消息记录的flag字段为1
cashRefundMapper.updateMessageFlagByOrderId(cashRecordDone.getId());
}
return result;
}
@Override
public int review(CashRecordDone cashRecordDone, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
if(cashRecordDone.getStatus()== 12|| cashRecordDone.getStatus()== 22){
if(cashRecordDone.getOrderCode()== null){
public int review(CashRecordDone cashRecordDone, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
if (cashRecordDone.getStatus() == 12 || cashRecordDone.getStatus() == 22) {
if (cashRecordDone.getOrderCode() == null) {
throw new RuntimeException("未输入订单号");
}
CashRecordDone cashRecordDone1 = new CashRecordDone();
CashRecordDone cashRecordDone1 = new CashRecordDone();
cashRecordDone1.setId(cashRecordDone.getRelatedId());
cashRecordDone1.setOrderCode(cashRecordDone.getOrderCode().substring(2));
cashRecordDone1.setStatus(4);
if (cashRecordDone1.getId()!=null||cashRecordDone1.getOrderCode()!= null){
cashRefundMapper.updateStatus(cashRecordDone1);
}}
if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
cashRefundMapper.updateStatus(cashRecordDone1);
}
}
cashRefundMapper.updateAudit(cashRecordDone);
int result = cashRefundMapper.review(cashRecordDone);
CashRecordDTO cashRecordDTO = cashRefundMapper.selectById(cashRecordDone.getId());
@ -294,15 +306,26 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
message.setJwcode(cashRecordDTO.getJwcode());
message.setName(cashRecordDTO.getName());
message.setStatus(cashRecordDTO.getStatus());
message.setDesc(cashRecordDTO.getJwcode()+cashRecordDTO.getStatus()!=12|| cashRecordDTO.getStatus()!=22?languageTranslationUtil.translate("用户的退款申请待审核,前往处理", lang):languageTranslationUtil.translate("用户的现金退款申请已被驳回,前往查看详情", lang));
message.setTitle(languageTranslationUtil.translate("现金退款--当地退款审核", lang));
if (cashRecordDTO.getStatus()==20) {
message.setDesc("的现金退款申请待审批,前往处理");
message.setTitle("现金管理--退款审批(负责人)");
message.setQueryId(107);
} else if (cashRecordDTO.getStatus()==30) {
message.setDesc("的现金退款申请待审核,前往处理");
message.setTitle("现金管理--退款审批(总部财务)");
message.setQueryId(111);
} else {
message.setDesc("的现金退款申请已被驳回,前往查看详情");
message.setTitle("现金管理--退款提交");
message.setQueryId(99);
}
message.setType(1);
message.setTypeId(cashRecordDTO.getId());
message.setMarket(cashRecordDTO.getMarket());
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(languageTranslationUtil.translate(marketName, lang));
message.setMarketName(marketName);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
}
@ -311,22 +334,22 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
@Override
public int executor(CashRecordDone cashRecordDone) throws Exception {
if(cashRecordDone.getRefundVoucher()== null){
if (cashRecordDone.getRefundVoucher() == null) {
throw new RuntimeException("未输入退款凭证");
}
if(cashRecordDone.getRefundTime()== null){
if (cashRecordDone.getRefundTime() == null) {
throw new RuntimeException("未输入退款时间");
}
if(cashRecordDone.getRefundRemark()== null){
if (cashRecordDone.getRefundRemark() == null) {
throw new RuntimeException("未输入退款备注");
}
if(cashRecordDone.getRefundChannels()== null){
if (cashRecordDone.getRefundChannels() == null) {
throw new RuntimeException("未输入退款途径");
}
if(cashRecordDone.getRefundCurrency()== null){
if (cashRecordDone.getRefundCurrency() == null) {
throw new RuntimeException("未输入退款币种");
}
if(cashRecordDone.getRefundAmount()== null){
if (cashRecordDone.getRefundAmount() == null) {
throw new RuntimeException("未输入退款金额");
}
int result = cashRefundMapper.executor(cashRecordDone);
@ -340,21 +363,22 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
@Override
public int finalreview(CashRecordDone cashRecordDone, @RequestHeader(defaultValue = "zh_CN") String lang) {
if(cashRecordDone.getPermanentGold()== null){
if (cashRecordDone.getPermanentGold() == null) {
cashRecordDone.setPermanentGold(0);
}
if(cashRecordDone.getFreeGold()== null){
if (cashRecordDone.getFreeGold() == null) {
cashRecordDone.setFreeGold(0);
}
if(cashRecordDone.getStatus()== 32){
if (cashRecordDone.getStatus() == 32) {
CashRecordDone cashRecordDone1 = new CashRecordDone();
cashRecordDone1.setOrderCode(cashRecordDone.getOrderCode().substring(2));
cashRecordDone1.setStatus(4);
if (cashRecordDone1.getId()!=null||cashRecordDone1.getOrderCode()!= null){
cashRefundMapper.updateStatus(cashRecordDone1);
}}
if (cashRecordDone.getGoodsName() != null &&cashRecordDone.getStatus() ==40 &&
(cashRecordDone.getGoodsName().equals(languageTranslationUtil.translate("金币充值", lang))||
if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
cashRefundMapper.updateStatus(cashRecordDone1);
}
}
if (cashRecordDone.getGoodsName() != null && cashRecordDone.getStatus() == 40 &&
(cashRecordDone.getGoodsName().equals(languageTranslationUtil.translate("金币充值", lang)) ||
cashRecordDone.getGoodsName().contains(languageTranslationUtil.translate("金币充值", lang)))) {
UserGoldRecord userGoldRecord = new UserGoldRecord();
userGoldRecord.setOrderCode(cashRecordDone.getOrderCode());
@ -365,16 +389,15 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
userGoldRecord.setType((byte) 2);
userGoldRecord.setIsRefund((byte) 1);
userGoldRecord.setRefundType("金币退款");
if (cashRecordDone.getRefundModel() == 1){
if (cashRecordDone.getRefundModel() == 1) {
userGoldRecord.setRefundModel(Byte.valueOf("1"));
}
else if (cashRecordDone.getRefundModel() == 0){
} else if (cashRecordDone.getRefundModel() == 0) {
userGoldRecord.setRefundModel(Byte.valueOf("0"));
}
userGoldRecord.setJwcode(cashRecordDone.getJwcode());
userGoldRecord.setSumGold(cashRecordDone.getPermanentGold()+cashRecordDone.getFreeGold());
userGoldRecord.setSumGold(cashRecordDone.getPermanentGold() + cashRecordDone.getFreeGold());
userGoldRecord.setPermanentGold(cashRecordDone.getPermanentGold());
int currentMonth = LocalDate.now().getMonthValue();
if (currentMonth >= 1 && currentMonth <= 6) {
@ -395,17 +418,18 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
userGoldRecord.setCreateTime(new Date());
userGoldRecord.setUpdateTime(new Date());
String auditName = auditMapper.getName(cashRecordDone.getAuditId());
refundMapper.add(userGoldRecord);
cashRefundMapper.updategold(orderCode);
User user = new User();
user.setJwcode(userGoldRecord.getJwcode());
refundMapper.add(userGoldRecord);
cashRefundMapper.updategold(orderCode);
User user = new User();
user.setJwcode(userGoldRecord.getJwcode());
user.setCurrentPermanentGold(BigDecimal.valueOf(-userGoldRecord.getPermanentGold())); //当前永久金币
user.setCurrentFreeJune(BigDecimal.valueOf(-userGoldRecord.getFreeJune())); //当前六月免费金币
user.setCurrentFreeDecember(BigDecimal.valueOf(-userGoldRecord.getFreeDecember())); //当前十二月免费金币
auditMapper.updateUserGold(user);
GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 58, //退款免费+永久金币-充值
(double) (userGoldRecord.getFreeDecember()+userGoldRecord.getFreeJune()+userGoldRecord.getPermanentGold() ) /100, SimpleIdGenerator.generateId(),
userGoldRecord.getRemark(),(double) userGoldRecord.getPermanentGold() / 100, auditName, "退款金币充值");}
GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 58, //退款免费+永久金币-充值
(double) (userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getPermanentGold()) / 100, SimpleIdGenerator.generateId(),
userGoldRecord.getRemark(), (double) userGoldRecord.getPermanentGold() / 100, auditName, "退款金币充值");
}
cashRefundMapper.updateAudit(cashRecordDone);
int result = cashRefundMapper.review(cashRecordDone);
@ -416,14 +440,20 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
message.setJwcode(cashRecordDTO.getJwcode());
message.setName(cashRecordDTO.getName());
message.setStatus(cashRecordDTO.getStatus());
message.setDesc(cashRecordDTO.getJwcode()+cashRecordDTO.getStatus()!=32?languageTranslationUtil.translate("用户的退款申请待审核,前往处理", lang):languageTranslationUtil.translate("用户的现金退款申请已被驳回,前往查看详情", lang));
message.setTitle(languageTranslationUtil.translate("现金退款--执行人退款提交", lang));
message.setDesc(cashRecordDTO.getStatus() != 32 ? "的退款记录需填写执行明细,前往查看处理" : "的现金退款申请已被驳回,前往查看详情");
message.setTitle(cashRecordDTO.getStatus() != 32 ? "现金管理--执行明细填写":"现金管理--退款提交");
message.setType(1);
message.setTypeId(cashRecordDTO.getId());
message.setMarket(cashRecordDTO.getMarket());
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(languageTranslationUtil.translate(marketName, "zh_CN"));
message.setMarketName(marketName);
message.setQueryId(cashRecordDTO.getStatus() != 32 ? 115:99);
if (cashRecordDTO.getStatus() != 32) {
log.info("Setting executor to: {}", cashRecordDTO.getExecutor());
message.setExecutor(cashRecordDTO.getExecutor());
log.info("Executor after setting: {}", message.getExecutor());
}
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
}
return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
}
@ -496,7 +526,7 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
}
@Override
public PageInfo<CashRecordDTO> financeSelect2(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
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);
@ -567,7 +597,7 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
// System.out.println(goldDetail.getMarkets());
List<CashRecordDTO> list = cashRefundMapper.exSelect(cashRecordDTO);
System.out.println( list);
System.out.println(list);
if (list.isEmpty()) {
return new PageInfo<>(list);
}
@ -632,14 +662,14 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
@Override
public void addOnline(CashRecordRefund cashRecordRefund) {
if(cashRecordRefund.getJwcode()==null){
throw new BusinessException("未输入精网号") ;
if (cashRecordRefund.getJwcode() == null) {
throw new BusinessException("未输入精网号");
}
if(cashRecordRefund.getRefundModel()== null){
throw new BusinessException("请填充退款类型") ;
if (cashRecordRefund.getRefundModel() == null) {
throw new BusinessException("请填充退款类型");
}
if(cashRecordRefund.getRefundReason()== null){
throw new BusinessException("请填写退款理由") ;
if (cashRecordRefund.getRefundReason() == null) {
throw new BusinessException("请填写退款理由");
}
CashRecordDone cashRecordDonetwo = new CashRecordDone();
cashRecordDonetwo.setAreaServise(cashRecordRefund.getAreaServise());
@ -656,9 +686,9 @@ CashRecordDone cashRecordDone1 = new CashRecordDone();
CashRecordDone cashRecordDone1 = new CashRecordDone();
cashRecordDone1.setId(cashRecordRefund.getId());
cashRecordDone1.setStatus(6);
if (cashRecordDone1.getId()!=null||cashRecordDone1.getOrderCode()!= null)
cashRefundMapper.updateStatus(cashRecordDone1);
else throw new SystemException("提交失败") ;
if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null)
cashRefundMapper.updateStatus(cashRecordDone1);
else throw new SystemException("提交失败");
}
@Override

4
src/main/java/com/example/demo/serviceImpl/cash/MessageServiceImpl.java

@ -23,11 +23,11 @@ public class MessageServiceImpl implements MessageService {
@Autowired
private MessageMapper messageMapper;
@Override
public List<Messages> getMessage(List<String> markets, List<Integer> status) {
public List<Messages> getMessage(List<String> markets, List<Integer> status,Integer executor) {
if(status== null|| status.size()==0){
status.add(99);
}
return messageMapper.getMessage(markets, status) ;
return messageMapper.getMessage(markets, status, executor) ;
}
@Override

248
src/main/java/com/example/demo/serviceImpl/coin/AuditServiceImpl.java

@ -3,6 +3,7 @@ package com.example.demo.serviceImpl.coin;
import com.example.demo.Util.GoldTistV2;
import com.example.demo.Util.SimpleIdGenerator;
import com.example.demo.config.GlobalExceptionHandler;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.coin.*;
@ -18,6 +19,7 @@ import com.example.demo.service.coin.GeneralService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -55,55 +57,60 @@ public class AuditServiceImpl implements AuditService {
private MarketMapper marketMapper;
@Autowired
private RedService redService;
@Autowired
private RabbitTemplate rabbitTemplate;
/*
审核订单并修改用户余额等
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean auditOrder(String token, String orderCode, Integer auditId, Integer action,String rejectReason,BigDecimal price,String linkId) throws Exception {
public boolean auditOrder(String token, String orderCode, Integer auditId, Integer action, String rejectReason, BigDecimal price, String linkId) throws Exception {
if (linkId== null){
linkId=orderCode;
}
UserGoldRecord order=auditMapper.selectOrderByOrderCode(orderCode);
if (linkId == null) {
linkId = orderCode;
}
UserGoldRecord order = auditMapper.selectOrderByOrderCode(orderCode);
if (price== null){
price= BigDecimal.valueOf(order.getPermanentGold());
}
Date date =new Date();
//状态为0待审核或4第一次红包退款失败的订单才能审核
if (order == null || (order.getAuditStatus() != 0 && order.getAuditStatus() !=4)) {
throw new IllegalArgumentException("订单不存在或已被审核");
}
GoldUser userNow = userMapper.selectUser(order.getJwcode().toString());
//更新订单的审核状态和审核人
UserGoldRecord updateOrder = new UserGoldRecord();
updateOrder.setOrderCode(orderCode);
updateOrder.setAuditId(auditId);
String auditName = auditMapper.getName(auditId);
//判断是通过还是驳回
if (action==2){ //驳回
if (order.getType()==2) { //退款
//2.获取对应的订单退款订单号去掉开头"TK"即为对应原始订单
String oldOrderCode = order.getOrderCode().replaceFirst("TK_", "");
//3.更新消费订单是否已退款状态为0
UserGoldRecord oldOrder = auditMapper.selectAllOrderByOrderCode(oldOrderCode);
if (oldOrderCode != null&&(oldOrder.getType()==1||oldOrder.getType()==0)){ //确保是消费或充值订单
auditMapper.updateOrderRefund(oldOrderCode,(byte)0);
}else {
if (price == null) {
price = BigDecimal.valueOf(order.getPermanentGold());
}
Date date = new Date();
//状态为0待审核或4第一次红包退款失败的订单才能审核
if (order == null || (order.getAuditStatus() != 0 && order.getAuditStatus() != 4)) {
throw new IllegalArgumentException("订单不存在或已被审核");
}
GoldUser userNow = userMapper.selectUser(order.getJwcode().toString());
//更新订单的审核状态和审核人
UserGoldRecord updateOrder = new UserGoldRecord();
updateOrder.setOrderCode(orderCode);
updateOrder.setAuditId(auditId);
String auditName = auditMapper.getName(auditId);
//判断是通过还是驳回
if (action == 2) { //驳回
if (order.getType() == 2) { //退款
//2.获取对应的订单退款订单号去掉开头"TK"即为对应原始订单
String oldOrderCode = order.getOrderCode().replaceFirst("TK_", "");
//3.更新消费订单是否已退款状态为0
UserGoldRecord oldOrder = auditMapper.selectAllOrderByOrderCode(oldOrderCode);
if (oldOrderCode != null && (oldOrder.getType() == 1 || oldOrder.getType() == 0)) { //确保是消费或充值订单
auditMapper.updateOrderRefund(oldOrderCode, (byte) 0);
} else {
throw new IllegalArgumentException("找不到对应的订单或不是有效订单");
} }
updateOrder.setAuditStatus(2);
updateOrder.setRejectReason(rejectReason);
updateOrder.setAuditTime(new Date());
// 执行审核更新
auditMapper.updateOrder(updateOrder);
}
}
updateOrder.setAuditStatus(2);
updateOrder.setRejectReason(rejectReason);
updateOrder.setAuditTime(new Date());
}else if (action==1) { //通过
// 执行审核更新
auditMapper.updateOrder(updateOrder);
} else if (action == 1) { //通过
//判断是充值还是退款
if (order.getType()==0){ //充值
//判断是充值还是退款
if (order.getType() == 0) { //充值
//更新用户余额
User update = new User();
Date oldFirstRecharge = userMapper.getFirstRecharge(order.getJwcode().toString());
@ -126,40 +133,40 @@ public class AuditServiceImpl implements AuditService {
*/
// 构造 2020-01-01 00:00:00
Date placeholder = new GregorianCalendar(2020, Calendar.JANUARY, 1, 0, 0).getTime();
if(oldFirstRecharge== null||oldFirstRecharge.after(date)||placeholder.equals(oldFirstRecharge)){
if (oldFirstRecharge == null || oldFirstRecharge.after(date) || placeholder.equals(oldFirstRecharge)) {
auditMapper.updateFirstRecharge(order.getJwcode());//设置首充时间为当前时间
}
auditMapper.updateUserGold(update);
//累充
try {
BigDecimal sum = BigDecimal.valueOf(
order.getPermanentGold())
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP) ;
order.getPermanentGold())
.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
redService.addAmount(order.getJwcode(), sum, 1); // 直接调你写好的方法
} catch (Exception e) {
log.warn("红包累加失败,主流程继续 | jwcode={}", order.getJwcode(), e);
}
try {
redService.sendJwcode(order.getJwcode(),order.getLinkId());
redService.sendJwcode(order.getJwcode(), order.getLinkId());
log.info("精网号发送成功 | jwcode={}", order.getJwcode());
}catch (Exception e){
} catch (Exception e) {
log.warn("精网号发送失败,主流程继续 | jwcode={}", order.getJwcode(), e);
}
//erp增加充值数据
GoldTistV2.addCoinNew(order.getJwcode().toString(), 64, //充值永久金币
(double) (order.getPermanentGold() ) /100, order.getLinkId()
,order.getRemark(),(double) (order.getPermanentGold() ) /100, auditName, "金币充值");
GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
(double) (order.getFreeDecember()+order.getFreeJune() ) /100, order.getLinkId(),
order.getRemark(),0, auditName, "金币充值");
GoldTistV2.addCoinNew(order.getJwcode().toString(), 64, //充值永久金币
(double) (order.getPermanentGold()) / 100, order.getLinkId()
, order.getRemark(), (double) (order.getPermanentGold()) / 100, auditName, "金币充值");
GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
(double) (order.getFreeDecember() + order.getFreeJune()) / 100, order.getLinkId(),
order.getRemark(), 0, auditName, "金币充值");
}else if (order.getType()==2) { //退款
} else if (order.getType() == 2) { //退款
//对非强制退款订单进行退红包校验
if (order.getAuditStatus()!=4){
if (order.getAuditStatus() != 4) {
try {
String result = redService.checkRed(price, linkId);
// 设置到全局上下文
@ -173,7 +180,7 @@ public class AuditServiceImpl implements AuditService {
);
log.error(logMsg);
updateOrder.setAuditStatus(4);
updateOrder.setRedDiff(BigDecimal.valueOf(num* 100L));
updateOrder.setRedDiff(BigDecimal.valueOf(num * 100L));
auditMapper.updateOrder(updateOrder);
AuditContext.setFailMsg(logMsg);
return false;
@ -181,7 +188,8 @@ public class AuditServiceImpl implements AuditService {
// 网络异常 / 系统异常
log.error("红包接口调用异常", e);
throw new RuntimeException(e);
}}
}
}
//2.获取对应的订单退款订单号去掉开头"TK"即为对应原始订单
String oldOrderCode = order.getOrderCode().replaceFirst("TK_", "");
UserGoldRecord oldOrder = auditMapper.selectAllOrderByOrderCode(oldOrderCode);
@ -196,10 +204,10 @@ public class AuditServiceImpl implements AuditService {
//商品消费退款
//erp增加退款数据
if(oldOrder.getType()==1){
int type = 2;
if (oldOrder.getType() == 1) {
int type = 2;
//额外扣金币抵扣红包
if (order.getAuditStatus()==4){
if (order.getAuditStatus() == 4) {
// 检查用户余额是否足够抵扣红包差额
@ -248,49 +256,48 @@ public class AuditServiceImpl implements AuditService {
redService.consumeRed(linkId);
}
//link扣除已有红包
else if (AuditContext.getRedCheckResult()!=null &&!AuditContext.getRedCheckResult().equals("old")){
else if (AuditContext.getRedCheckResult() != null && !AuditContext.getRedCheckResult().equals("old")) {
redService.consumeRed(linkId);
}
else {
} else {
Exception e = new Exception("旧订单退款");
String title = "旧订单退款";
String detail= ("精网号:"+order.getJwcode())+"\n金币订单号:"+orderCode+"\n永久金币:"+Math.abs(order.getPermanentGold())/100+
"\n免费金币:"+Math.abs((order.getFreeJune()+order.getFreeDecember()))/100+"\n任务金币:"+Math.abs(order.getTaskGold())/100+
"\n退款类型:"+order.getRefundType()+"\n商品名:"+order.getGoodsName()+"\n备注:"+order.getRemark();
String detail = ("精网号:" + order.getJwcode()) + "\n金币订单号:" + orderCode + "\n永久金币:" + Math.abs(order.getPermanentGold()) / 100 +
"\n免费金币:" + Math.abs((order.getFreeJune() + order.getFreeDecember())) / 100 + "\n任务金币:" + Math.abs(order.getTaskGold()) / 100 +
"\n退款类型:" + order.getRefundType() + "\n商品名:" + order.getGoodsName() + "\n备注:" + order.getRemark();
GlobalExceptionHandler.sendFeishuAlert(e, title, detail);
}
// 执行审核更新
redMapper.update(order.getJwcode(),type,price.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
if (order.getPermanentGold()!=0||order.getFreeJune()!=0||order.getFreeDecember()!=0||order.getTaskGold()!=0){
GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费-商品
(double) (order.getFreeDecember()+order.getFreeJune()) /100,SimpleIdGenerator.generateId(),
order.getRemark(),0, auditName, "退款商品"+order.getGoodsName());
GoldTistV2.addCoinNew(order.getJwcode().toString(), 56, //退款永久-商品
(double) (order.getPermanentGold()) /100,SimpleIdGenerator.generateId(),
order.getRemark(),order.getPermanentGold(), auditName, "退款商品"+order.getGoodsName());
GoldTistV2.addCoinNew(order.getJwcode().toString(), 57, //退款任务-商品
(double) (order.getTaskGold() ) /100,SimpleIdGenerator.generateId(),
order.getRemark(),0, auditName, "退款商品"+order.getGoodsName());}
else {
redMapper.update(order.getJwcode(), type, price.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
if (order.getPermanentGold() != 0 || order.getFreeJune() != 0 || order.getFreeDecember() != 0 || order.getTaskGold() != 0) {
GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费-商品
(double) (order.getFreeDecember() + order.getFreeJune()) / 100, SimpleIdGenerator.generateId(),
order.getRemark(), 0, auditName, "退款商品" + order.getGoodsName());
GoldTistV2.addCoinNew(order.getJwcode().toString(), 56, //退款永久-商品
(double) (order.getPermanentGold()) / 100, SimpleIdGenerator.generateId(),
order.getRemark(), order.getPermanentGold(), auditName, "退款商品" + order.getGoodsName());
GoldTistV2.addCoinNew(order.getJwcode().toString(), 57, //退款任务-商品
(double) (order.getTaskGold()) / 100, SimpleIdGenerator.generateId(),
order.getRemark(), 0, auditName, "退款商品" + order.getGoodsName());
} else {
//0金币消耗往erp传一条金币为空的记录
GoldTistV2.addCoinRecordNew(String.valueOf(order.getJwcode()), order.getRemark(),auditName,order.getGoodsName());
GoldTistV2.addCoinRecordNew(String.valueOf(order.getJwcode()), order.getRemark(), auditName, order.getGoodsName());
}
}
}//金币充值退款
else if (oldOrder.getType()==0){
else if (oldOrder.getType() == 0) {
//判断够不够扣
if(userNow.getNowPermanentGold().compareTo(BigDecimal.valueOf(Math.abs(order.getPermanentGold()))) < 0
|| userNow.getNowFreeGold().compareTo(BigDecimal.valueOf(Math.abs(order.getFreeDecember() + order.getFreeJune()))) < 0
|| userNow.getNowTaskGold().compareTo(BigDecimal.valueOf(Math.abs(order.getTaskGold()))) < 0){
if (userNow.getNowPermanentGold().compareTo(BigDecimal.valueOf(Math.abs(order.getPermanentGold()))) < 0
|| userNow.getNowFreeGold().compareTo(BigDecimal.valueOf(Math.abs(order.getFreeDecember() + order.getFreeJune()))) < 0
|| userNow.getNowTaskGold().compareTo(BigDecimal.valueOf(Math.abs(order.getTaskGold()))) < 0) {
log.error("用户余额不足,无法退款");
throw new IllegalArgumentException("用户余额不足,无法退款");
}
int type = 1; //红包充值累计
int type = 1; //红包充值累计
//额外扣金币抵扣红包
if (order.getAuditStatus()==4){
if (order.getAuditStatus() == 4) {
// 检查用户余额是否足够抵扣红包差额
@ -337,30 +344,31 @@ public class AuditServiceImpl implements AuditService {
redService.updateRed(consumeUser);
//link扣除已有红包
redService.consumeRed(linkId);
}
//link扣除已有红包
else if (AuditContext.getRedCheckResult()!=null &&!AuditContext.getRedCheckResult().equals("old")){
redService.consumeRed(linkId);
}
else {
//link扣除已有红包
else if (AuditContext.getRedCheckResult() != null && !AuditContext.getRedCheckResult().equals("old")) {
redService.consumeRed(linkId);
} else {
Exception e = new Exception("旧订单退款");
String title = "旧订单退款";
String detail= ("精网号:"+order.getJwcode())+"\n金币订单号:"+orderCode+"\n永久金币:"+Math.abs(order.getPermanentGold())/100+
"\n免费金币:"+Math.abs((order.getFreeJune()+order.getFreeDecember()))/100+"\n任务金币:"+Math.abs(order.getTaskGold())/100+
"\n退款类型:"+order.getRefundType()+"\n商品名:"+order.getGoodsName()+"\n备注:"+order.getRemark();
String detail = ("精网号:" + order.getJwcode()) + "\n金币订单号:" + orderCode + "\n永久金币:" + Math.abs(order.getPermanentGold()) / 100 +
"\n免费金币:" + Math.abs((order.getFreeJune() + order.getFreeDecember())) / 100 + "\n任务金币:" + Math.abs(order.getTaskGold()) / 100 +
"\n退款类型:" + order.getRefundType() + "\n商品名:" + order.getGoodsName() + "\n备注:" + order.getRemark();
GlobalExceptionHandler.sendFeishuAlert(e, title, detail);
}
// 执行审核更新
redMapper.update(order.getJwcode(),type,price.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
redMapper.update(order.getJwcode(), type, price.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
if(order.getTaskGold()==0){ //无任务金币统一走免费+永久
if (order.getTaskGold() == 0) { //无任务金币统一走免费+永久
GoldTistV2.addCoinNew(order.getJwcode().toString(), 58, //退款免费+永久金币-充值
(double) (order.getFreeDecember()+order.getFreeJune()+order.getPermanentGold() ) /100,SimpleIdGenerator.generateId(),
order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");}
if (order.getTaskGold()!=0){
(double) (order.getFreeDecember() + order.getFreeJune() + order.getPermanentGold()) / 100, SimpleIdGenerator.generateId(),
order.getRemark(), (double) order.getPermanentGold() / 100, auditName, "退款金币充值");
}
if (order.getTaskGold() != 0) {
GoldTistV2.addCoinNew(order.getJwcode().toString(), 59, //退款任务+永久金币-充值
(double) (order.getTaskGold()+order.getPermanentGold() ) /100,SimpleIdGenerator.generateId(),
order.getRemark(),(double) order.getPermanentGold() / 100, auditName, "退款金币充值");}
(double) (order.getTaskGold() + order.getPermanentGold()) / 100, SimpleIdGenerator.generateId(),
order.getRemark(), (double) order.getPermanentGold() / 100, auditName, "退款金币充值");
}
}
@ -374,7 +382,8 @@ public class AuditServiceImpl implements AuditService {
}
return true;
}
}
/*
* 多条件查询充值订单列表
*/
@ -382,15 +391,16 @@ public class AuditServiceImpl implements AuditService {
public PageInfo<RechargeAudit> selectRechargeBy(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit) {
List<String> markets = marketMapper.getMarketIds(rechargeAudit.getMarkets());
if (markets.contains("9") || markets.contains("9999")){
markets=null;
if (markets.contains("9") || markets.contains("9999")) {
markets = null;
}
rechargeAudit.setMarkets(markets);
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
List<RechargeAudit> rechargeAudits = auditMapper.selectRechargeBy(pageNum, pageSize, rechargeAudit);
// rechargeAudit.setFreeGold(rechargeAudit.getFreeJune()+rechargeAudit.getFreeDecember());
// rechargeAudit.setFreeGold(rechargeAudit.getFreeJune()+rechargeAudit.getFreeDecember());
return new PageInfo<>(rechargeAudits);
}
/*
多条件查询退款订单
*/
@ -399,8 +409,8 @@ public class AuditServiceImpl implements AuditService {
List<String> markets = marketMapper.getMarketIds(refundAudit.getMarkets());
if (markets.contains("9") || markets.contains("9999")){
markets=null;
if (markets.contains("9") || markets.contains("9999")) {
markets = null;
}
refundAudit.setMarkets(markets);
PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
@ -409,6 +419,7 @@ public class AuditServiceImpl implements AuditService {
//refundAudit.setFreeGold(refundAudit.getFreeJune()+refundAudit.getFreeDecember());
return new PageInfo<>(refundAudits);
}
/*
充值审核金币合计数
*/
@ -419,13 +430,13 @@ public class AuditServiceImpl implements AuditService {
//获取充值审核订单列表
List<String> markets = marketMapper.getMarketIds(rechargeAudit.getMarkets());
if (markets.contains("9") || markets.contains("9999")){
markets=null;
if (markets.contains("9") || markets.contains("9999")) {
markets = null;
}
rechargeAudit.setMarkets(markets);
List<RechargeAudit> rechargeAudits = auditMapper.selectRechargeBy(1, 500000, rechargeAudit);
// 初始化累加器
int totalNum=0;
int totalNum = 0;
int permanentGoldSum = 0;
int freeGoldSum = 0;
// 遍历消费记录并累加金币
@ -435,8 +446,8 @@ public class AuditServiceImpl implements AuditService {
permanentGoldSum += recharge.getPermanentGold();
}
// 累加免费金币
if (recharge.getFreeJune() != null||recharge.getFreeDecember() != null) {
freeGoldSum = freeGoldSum+recharge.getFreeJune()+recharge.getFreeDecember();
if (recharge.getFreeJune() != null || recharge.getFreeDecember() != null) {
freeGoldSum = freeGoldSum + recharge.getFreeJune() + recharge.getFreeDecember();
}
// 每遍历一条记录总条数加1
@ -458,13 +469,13 @@ public class AuditServiceImpl implements AuditService {
//获取充值审核订单列表
List<String> markets = marketMapper.getMarketIds(refundAudit.getMarkets());
if (markets.contains("9") || markets.contains("9999")){
markets=null;
if (markets.contains("9") || markets.contains("9999")) {
markets = null;
}
refundAudit.setMarkets(markets);
List<RefundAudit> refundAudits = auditMapper.selectRefundBy(1, 500000, refundAudit);
// 初始化累加器
int totalNum=0;
int totalNum = 0;
int permanentGoldSum = 0;
int freeGoldSum = 0;
int taskGoldSum = 0;
@ -475,12 +486,12 @@ public class AuditServiceImpl implements AuditService {
permanentGoldSum += refund.getPermanentGold();
}
// 累加免费金币
if (refund.getFreeJune() != null||refund.getFreeDecember()!=null) {
freeGoldSum += refund.getFreeJune()+refund.getFreeDecember();
if (refund.getFreeJune() != null || refund.getFreeDecember() != null) {
freeGoldSum += refund.getFreeJune() + refund.getFreeDecember();
}
//累加任务金币
if(refund.getTaskGold()!=null)
taskGoldSum+=refund.getTaskGold();
if (refund.getTaskGold() != null)
taskGoldSum += refund.getTaskGold();
// 每遍历一条记录总条数加1
totalNum++;
@ -492,6 +503,7 @@ public class AuditServiceImpl implements AuditService {
gold.setTaskGolds(BigDecimal.valueOf(taskGoldSum));
return gold;
}
public class AuditContext {
private static final ThreadLocal<String> FAIL_MSG = new ThreadLocal<>();
@ -504,6 +516,7 @@ public class AuditServiceImpl implements AuditService {
public static String getFailMsg() {
return FAIL_MSG.get();
}
public static void setRedCheckResult(String result) {
RED_CHECK_RESULT.set(result);
}
@ -511,6 +524,7 @@ public class AuditServiceImpl implements AuditService {
public static String getRedCheckResult() {
return RED_CHECK_RESULT.get();
}
public static void clear() {
FAIL_MSG.remove();
RED_CHECK_RESULT.remove();

28
src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java

@ -4,10 +4,7 @@ import com.example.demo.Util.GoldTistV2;
import com.example.demo.Util.SimpleIdGenerator;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.coin.ConsumeUser;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.GoldUser;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.domain.vo.coin.*;
import com.example.demo.exception.SystemException;
import com.example.demo.mapper.coin.ConsumeMapper;
import com.example.demo.mapper.coin.MarketMapper;
@ -254,7 +251,28 @@ public class ConsumeServiceImpl implements ConsumeService {
redService.sendConsumeJwcode(consumeUser.getJwcode(),consumeUser.getRedIds(),userGoldRecord.getLinkId());
// }
return Result.success();
//data返回订单号和创建时间
OrderResultVO resultVO = OrderResultVO.build("XF_" + orderNumber,userGoldRecord.getCreateTime());
return Result.success(resultVO);
}
@Override
public Result addDC(ConsumeUser consumeUser) {
if (consumeUser.getJwcode()==null||consumeUser.getJwcode()<10000000||consumeUser.getJwcode()>99999999){
throw new SystemException("精网号位数小于8位或大于8位");
}
if (consumeUser.getSumGold()==null||consumeUser.getSumGold().compareTo(BigDecimal.ZERO)<0){
throw new SystemException("消费金币不能小于0");
}
String result = GoldTistV2.addDCCoinNew(consumeUser.getJwcode().toString(),68,-consumeUser.getSumGold().doubleValue(),"","DC金币消耗",0,"DC","DC金币消耗");
String cleanResult = result.replaceAll("\\s+", "");
if ("2".equals(cleanResult)) {
return Result.success();
} else {
throw new SystemException(String.format("金币发放失败:类型错误(%S),jwcode=%s", result,consumeUser.getJwcode()));
}
}
//
// @Transactional

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

@ -102,7 +102,10 @@ public class ExportExcelServiceImpl implements ExportExcelService {
JsonNode rootNode = objectMapper.readTree(message);
JsonNode requestDataNode = rootNode.path("requestData");
JsonNode GoldDetailNode = requestDataNode.path("goldDetail");
JsonNode tokenNode = requestDataNode.path("token");
String token = tokenNode.asText();
GoldDetail goldDetail = objectMapper.treeToValue(GoldDetailNode, GoldDetail.class);
goldDetail.setToken(token);
page.setGoldDetail(goldDetail);
// 从请求数据中获取语言设置如果没有则使用默认值

72
src/main/java/com/example/demo/serviceImpl/coin/RechargeServiceImpl.java

@ -1,8 +1,11 @@
package com.example.demo.serviceImpl.coin;
import com.example.demo.Util.GoldTistV2;
import com.example.demo.Util.SimpleIdGenerator;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.vo.bean.BeanUserCard;
import com.example.demo.exception.SystemException;
import com.example.demo.mapper.bean.BeanUserMapper;
import com.example.demo.mapper.coin.MarketMapper;
import com.example.demo.mapper.coin.RechargeMapper;
@ -11,6 +14,7 @@ import com.example.demo.service.coin.MarketService;
import com.example.demo.service.coin.RechargeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.domain.vo.coin.*;
@ -48,7 +52,8 @@ public class RechargeServiceImpl implements RechargeService {
@Autowired
private BeanUserMapper beanUserMapper;
@Autowired
private RabbitTemplate rabbitTemplate;
//查询所有充值
@Override
@ -148,6 +153,69 @@ public class RechargeServiceImpl implements RechargeService {
userGoldRecord.setLinkId(SimpleIdGenerator.generateId());
userGoldRecord.setPrice(rechargeUser.getPermanentGold());
rechargeMapper.add(userGoldRecord);
return Result.success();
// 发送金币充值创建消息
Messages message = new Messages();
message.setJwcode(rechargeUser.getJwcode());
message.setName(goldUser.getName());
message.setStatus(10);
message.setDesc("的金币充值收款申请待审核,前往处理");
message.setTitle("金币管理--金币审核--充值审核");
message.setType(0);
message.setTypeId(userGoldRecord.getId());
message.setMarket(Integer.valueOf(goldUser.getMarket()));
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(marketName);
message.setQueryId(6);
// 发送到RabbitMQ
rabbitTemplate.convertAndSend(RabbitMQConfig.COIN_RECHARGE_EXCHANGE, "coin.recharge.save", message);
//data返回订单号和创建时间
OrderResultVO resultVO = OrderResultVO.build("CZ_" + orderNumber,userGoldRecord.getCreateTime());
return Result.success(resultVO);
}
//根据订单单号获取订单信息重复充值/消费提示
@Override
public GoldRepeat selectByOrderCode(String orderCode) {
return rechargeMapper.selectByOrderCode(orderCode);
}
@Override
public Result addDC(RechargeUser rechargeUser) {
if (rechargeUser.getJwcode()==null||rechargeUser.getJwcode()<10000000||rechargeUser.getJwcode()>99999999){
throw new SystemException("精网号位数小于8位或大于8位");
}
if (rechargeUser.getFreeGold()==null||rechargeUser.getFreeGold().compareTo(BigDecimal.ZERO)<0){
throw new SystemException("免费金币不能小于0");
}
String result = GoldTistV2.addDCCoinNew(rechargeUser.getJwcode().toString(),67,rechargeUser.getFreeGold().doubleValue(),"","DC免费金币赠送",0,"DC","DC免费金币赠送");
String cleanResult = result.replaceAll("\\s+", "");
if ("1".equals(cleanResult)) {
return Result.success();
} else {
throw new SystemException(String.format("金币发放失败:类型错误(%S),jwcode=%s", result,rechargeUser.getJwcode()));
}
}
@Override
public Result addFree(RechargeUser rechargeUser) {
if (rechargeUser.getJwcode()==null||rechargeUser.getJwcode()<10000000||rechargeUser.getJwcode()>99999999){
throw new SystemException("精网号位数小于8位或大于8位");
}
if (rechargeUser.getFreeGold()==null||rechargeUser.getFreeGold().compareTo(BigDecimal.ZERO)<0){
throw new SystemException("免费金币不能小于0");
}
String result = GoldTistV2.addDCCoinNew(rechargeUser.getJwcode().toString(),67,rechargeUser.getFreeGold().doubleValue(),"","分享得金币",0,"黄其振","分享得金币");
String cleanResult = result.replaceAll("\\s+", "");
if ("1".equals(cleanResult)) {
return Result.success();
} else {
throw new SystemException(String.format("金币发放失败:类型错误(%S),jwcode=%s", result,rechargeUser.getJwcode()));
}
}
}

24
src/main/java/com/example/demo/serviceImpl/coin/RefundServiceImpl.java

@ -1,5 +1,6 @@
package com.example.demo.serviceImpl.coin;
import com.example.demo.config.RabbitMQConfig;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.mapper.coin.*;
import com.example.demo.service.coin.MarketService;
@ -7,6 +8,7 @@ import com.example.demo.service.coin.RefundService;
import com.example.demo.Util.LanguageTranslationUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -47,10 +49,12 @@ public class RefundServiceImpl implements RefundService {
@Autowired
private RechargeMapper rechargeMapper;
// 注入多语言工具类
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private RabbitTemplate rabbitTemplate;
//查找全部退款
@Override
public PageInfo<RefundUser> selectAll(Integer pageNum, Integer pageSize, RefundUser refundUser) throws Exception {
@ -222,6 +226,24 @@ public class RefundServiceImpl implements RefundService {
}
refundMapper.add(userGoldRecord);
consumeMapper.updateIsRefund(orderCode);
// 发送金币退款创建消息
Messages message = new Messages();
message.setJwcode(refundUser.getJwcode());
message.setName(goldUser.getName());
message.setStatus(10);
message.setDesc("的金币退款申请待审核,前往确认");
message.setTitle("金币管理--金币审核--退款审核");
message.setType(1);
message.setTypeId(userGoldRecord.getId());
message.setMarket(Integer.valueOf(goldUser.getMarket()));
String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
message.setMarketName(marketName);
message.setQueryId(13);
// 发送到RabbitMQ
rabbitTemplate.convertAndSend(RabbitMQConfig.COIN_REFUND_EXCHANGE, "coin.refund.save", message);
String successMsg = languageTranslationUtil.translate("操作成功", lang);
return Result.success(successMsg);
}

30
src/main/java/com/example/demo/serviceImpl/coin/UserServiceImpl.java

@ -3,12 +3,16 @@ package com.example.demo.serviceImpl.coin;
import com.example.demo.Util.JWTUtil;
import com.example.demo.Util.LanguageTranslationUtil;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.DCUser;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.bean.BeanUserCard;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.GoldUser;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.bean.BeanUserMapper;
import com.example.demo.mapper.coin.MarketMapper;
import com.example.demo.mapper.coin.UserMapper;
import com.example.demo.mapper.sqlserver.HistoryRecordMapper;
import com.example.demo.service.Temporary.RedService;
import com.example.demo.service.coin.UserService;
import jakarta.servlet.http.HttpServletRequest;
@ -44,6 +48,10 @@ public class UserServiceImpl implements UserService {
private RedService redService;
@Autowired
private LanguageTranslationUtil languageTranslationUtil;
@Autowired
private BeanUserMapper beanUserMapper;
@Autowired
private HistoryRecordMapper historyRecordMapper;
//查找用户部分信息
@Override
@ -151,6 +159,28 @@ public class UserServiceImpl implements UserService {
}
}
@Override
public Result DCSelectUser(DCUser dcUser) {
if(dcUser.getJwcode() == null||dcUser.getJwcode().equals("")){
return Result.error("精网号有误!请检查");
}
int userCount = userMapper.checkUserExists(dcUser.getJwcode());
if (userCount == 0) {
return Result.error("精网号有误!请检查");
}
GoldUser goldUser = historyRecordMapper.selectUser(dcUser.getJwcode());
BeanUserCard user = beanUserMapper.userCard(dcUser.getJwcode());
dcUser.setJwcode(String.valueOf(goldUser.getJwcode()));
dcUser.setPermanentBean(BigDecimal.valueOf(user.getPermanentBean()));
dcUser.setFreeBean(BigDecimal.valueOf(user.getFreeBean()));
// 如果字段类型是 BigDecimal
dcUser.setNowFreeGold(goldUser.getNowFreeGold().divide(BigDecimal.valueOf(100)));
dcUser.setNowPermanentGold(goldUser.getNowPermanentGold().divide(BigDecimal.valueOf(100)));
dcUser.setNowTaskGold(goldUser.getNowTaskGold().divide(BigDecimal.valueOf(100)));
dcUser.setNowSumGold(goldUser.getNowSumGold().divide(BigDecimal.valueOf(100)));
return Result.success(dcUser);
}
//查找用户金币
@Override
public GoldUser selectgold(String jwcode) {

8
src/main/resources/application-dev.yml

@ -81,9 +81,9 @@ spring:
rabbitmq:
host: 54.255.212.181
port: 5672
username: gold
password: gold
virtual-host: /
username: dong
password: 123
virtual-host: mq
listener:
simple:
trusted-packages: com.example.demo.domain.DTO
@ -92,6 +92,8 @@ file:
upload:
url: http://39.101.133.168:8828/hljw/api/aws/upload
toujiaoApp:
url: http://39.101.133.168:8828/hljw
feishu:
webhook:
url: https://open.feishu.cn/open-apis/bot/v2/hook/455ccf9c-a8b1-46b4-b4d8-9f528620595d

3
src/main/resources/application-prod.yml

@ -98,6 +98,9 @@ feishu:
webhook:
url: https://open.feishu.cn/open-apis/bot/v2/hook/1a515b19-b64f-46b7-9486-35842b9539fe
toujiaoApp:
url: https://api.homilychart.com/hljw
bean:
recharge:
url: http://api.homilychart.com/hljwgo/api/wallet/recharge

18
src/main/resources/application-test.yml

@ -68,9 +68,12 @@ spring:
rabbitmq:
host: 54.255.212.181
port: 5672
username: gold
password: gold
virtual-host: /
#username: gold
#password: gold
#virtual-host: /
username: dong
password: 123
virtual-host: mq
listener:
simple:
trusted-packages: com.example.demo.domain.DTO
@ -78,9 +81,9 @@ spring:
data:
redis:
database: 0
host: 54.255.212.181
port: 10703
password: Ngc0FYUTA6h3wC5J
host: localhost
port: 6379
password: 123456
lettuce:
pool:
@ -95,6 +98,9 @@ feishu:
webhook:
url: https://open.feishu.cn/open-apis/bot/v2/hook/8dd2bcc4-6492-487b-9dc5-bb7b27d43ccf
toujiaoApp:
url: https://api.homilychart.com/hljw
bean:
recharge:
# url: http://api.homilychart.com/hljwgo/api/wallet/recharge

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

@ -227,7 +227,7 @@
select crc.id,jwcode,name,market,ra.activity_name as activity,
order_code,bank_code,goods_name,good_num,num_unit,permanent_gold,free_gold,
payment_currency,payment_amount,pay_type,pay_time,crc.status,submitter_id,
voucher,remark,version
voucher,remark,version,received_market
from cash_record_collection crc
left join recharge_activity ra on ra.id = crc.activity
where order_code=#{orderCode}
@ -422,8 +422,8 @@
update cash_record_collection
SET
received_time=#{availableOn},
payment_currency='2',
received_currency='2',
payment_currency='3',
received_currency='3',
payment_amount=#{amount},
received_amount=#{net},
handling_charge=#{fee},
@ -456,4 +456,10 @@
where order_code=#{orderNo}
</update>
<update id="updateMessageFlagByTypeIdAndType">
UPDATE message
SET flag = #{flag}
WHERE type_id = #{typeId} AND type = #{type}
</update>
</mapper>

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

@ -210,11 +210,12 @@
AND crc.payment_currency LIKE CONCAT('%', #{paymentCurrency}, '%')
</if>
<if test="goodsNames!= null and goodsNames.size > 0">
AND crc.goods_name IN
<foreach collection="goodsNames" item="goodsNames" open="(" separator="," close=")">
#{goodsNames}
<if test="goodsNames != null and !goodsNames.isEmpty()">
AND (
<foreach collection="goodsNames" item="name" separator=" OR ">
crc.goods_name LIKE CONCAT('%', #{name}, '%')
</foreach>
)
</if>
<if test="payType != null and payType.length()>0">
and crc.pay_type = #{payType}
@ -295,7 +296,7 @@
<!-- </foreach>-->
<!-- </if>-->
<if test="goodsName!= null and goodsName.length() > 0">
and crc.goods_name = #{goodsName}
and crc.goods_name like CONCAT('%', #{goodsName}, '%')
</if>
<if test="payType != null and payType.length()>0">
and crc.pay_type = #{payType}
@ -378,17 +379,18 @@
</foreach>
</if>
<if test="goodsNames!= null and goodsNames.size > 0">
AND crc.goods_name IN
<foreach collection="goodsNames" item="goodsNames" open="(" separator="," close=")">
#{goodsNames}
<if test="goodsNames != null and !goodsNames.isEmpty()">
AND (
<foreach collection="goodsNames" item="name" separator=" OR ">
crc.goods_name LIKE CONCAT('%', #{name}, '%')
</foreach>
)
</if>
<if test="refundCurrency != null and refundCurrency.length() > 0">
AND crr.refund_currency = #{refundCurrency}
AND crr.refund_currency like CONCAT('%', #{refundCurrency}, '%')
</if>
<if test="refundChannels != null and refundChannels.length()>0">
and crr.refund_channels = #{refundChannels}
and crr.refund_channels like CONCAT('%', #{refundChannels}, '%')
</if>
<if test="sTime != null and eTime != null">
and crr.`refund_time` BETWEEN #{sTime} AND #{eTime}
@ -420,12 +422,29 @@
</select>
<select id="selectById" resultType="com.example.demo.domain.vo.cash.CashRecordDTO">
select crr.id,
crr.jwcode,
crr.name,
crr.status
crr.jwcode,
crr.name,
crr.status,
crr.market,
crr.audit_id,
crr.submitter_id,
crr.executor,
crr.related_id,
crr.order_code,
crr.refund_reason,
crr.remark,
crr.reject_reason,
crr.refund_model,
crr.refund_currency,
crr.refund_amount,
crr.refund_channels,
crr.refund_time,
crr.refund_remark,
crr.refund_voucher
from cash_record_refund crr
where crr.id = #{id}
</select>
<select id="selectfunds" resultType="com.example.demo.domain.vo.cash.FundsDTO">
SELECT
crc.id,
@ -503,5 +522,9 @@
</where>
</select>
<update id="updateMessageFlagByOrderId">
UPDATE message
SET flag = 1
WHERE type_id = #{orderId} AND type = 0
</update>
</mapper>

17
src/main/resources/cashMapper/MessageMapper.xml

@ -19,22 +19,29 @@
m.type_id,
m.flag,
m.cz_time,
m.query_id, <!-- 🔍 添加 queryId 字段 -->
m.executor, <!-- 👤 添加 executor 字段 -->
mk.name AS market_name <!-- ✅ market.name -->
FROM message m
LEFT JOIN market mk ON m.market = mk.id
<where>
m.flag = 0
<!-- 当 executor 不为 null 时,跳过 markets 过滤 -->
<if test="executor == null and markets != null and markets.size() > 0">
AND m.market IN
<foreach item="item" collection="markets" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="status != null and status.size() > 0">
AND m.status IN
<foreach item="item" collection="status" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="markets != null and markets.size() > 0">
AND m.market IN
<foreach item="item" collection="markets" open="(" separator="," close=")">
#{item}
</foreach>
<!-- 只有当 executor 不为 null 时才添加过滤条件 -->
<if test="executor != null">
AND (m.executor = #{executor} OR m.executor IS NULL)
</if>
</where>
ORDER BY m.cz_time DESC

22
src/main/resources/mapper/BeanRechargeMapper1.xml

@ -26,6 +26,28 @@
</trim>
</insert>
<insert id="addBeanDC" parameterType="com.example.demo.domain.vo.bean.BeanRecharge" useGeneratedKeys="true" keyProperty="id">
INSERT INTO audit
<trim prefix="(" suffix=")" suffixOverrides=",">
jwcode,
buy_jd,
free_jd,
type,
admin_name,
remark,
audit_status
</trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=",">
#{jwcode},
#{permanentBean},
#{freeBean},
0,
#{adminName},
#{remark},
1
</trim>
</insert>
<!--筛选查询小黄车消费数据-->
<select id="selectCartBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeCartVo">
select

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

@ -266,4 +266,16 @@
AND ugr.jwcode = #{jwcode}
AND ugr.flag = 1
</select>
<!--根据订单单号获取订单信息(重复充值/消费提示)-->
<select id="selectByOrderCode" resultType="com.example.demo.domain.vo.coin.GoldRepeat">
select type,order_code,jwcode,
COALESCE(permanent_gold,0)/100 as permanentGold,
COALESCE(free_june,0)/100 as freeJune,
COALESCE(free_december,0)/100 as freeDecember,
COALESCE(task_gold,0)/100 as taskGold,
audit_time,goods_name,is_refund,create_time,audit_status
from user_gold_record
where order_code = #{orderCode}
</select>
</mapper>

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.received_time BETWEEN #{startDate} AND #{endDate}
AND cr.pay_time BETWEEN #{startDate} AND #{endDate}
AND cr.order_type=1
AND cr.status IN (0,1,3,4,6)
GROUP BY m.name;

13
src/main/resources/sqlserverMapper/HistoryRecordMapper.xml

@ -84,4 +84,17 @@
<if test="name != null and name!=''">AND ui.Name = #{name}</if> <!-- 修复姓名关联字段 -->
</where>
</select>
<select id="selectUser" resultType="com.example.demo.domain.vo.coin.GoldUser">
SELECT
jwcode AS "jwcode",
(COALESCE(free_6, 0) + COALESCE(free_12, 0) + COALESCE(core_jb, 0) +
COALESCE(buy_jb, 0)) AS "nowSumGold",
buy_jb AS "nowPermanentGold",
(COALESCE(free_6, 0) + COALESCE(free_12, 0)) AS "nowFreeGold",
core_jb AS "nowTaskGold"
FROM [hwhcGold].[dbo].[user_gold]
<where>
jwcode = #{jwcode}
</where>
</select>
</mapper>
Loading…
Cancel
Save