You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

629 lines
34 KiB

10 months ago
2 months ago
2 months ago
2 months ago
10 months ago
10 months ago
2 months ago
2 months ago
2 months ago
2 months ago
10 months ago
  1. package com.example.demo.serviceImpl.coin;
  2. import com.example.demo.Util.GoldTistV2;
  3. import com.example.demo.Util.SimpleIdGenerator;
  4. import com.example.demo.config.GlobalExceptionHandler;
  5. import com.example.demo.config.RabbitMQConfig;
  6. import com.example.demo.domain.entity.User;
  7. import com.example.demo.domain.entity.UserGoldRecord;
  8. import com.example.demo.domain.entity.UserRegionWallet;
  9. import com.example.demo.domain.entity.UserWalletRecord;
  10. import com.example.demo.domain.vo.bean.BeanConsume;
  11. import com.example.demo.domain.vo.coin.*;
  12. import com.example.demo.exception.RedCheckException;
  13. import com.example.demo.mapper.Temporary.RedMapper;
  14. import com.example.demo.mapper.coin.AuditMapper;
  15. import com.example.demo.mapper.coin.MarketMapper;
  16. import com.example.demo.mapper.coin.UserMapper;
  17. import com.example.demo.mapper.coin.WalletMapper;
  18. import com.example.demo.service.Temporary.RedService;
  19. import com.example.demo.service.Wallet.WalletService;
  20. import com.example.demo.service.bean.BeanConsumeService;
  21. import com.example.demo.service.coin.AdminService;
  22. import com.example.demo.service.coin.AuditService;
  23. import com.example.demo.service.coin.GeneralService;
  24. import com.github.pagehelper.PageHelper;
  25. import com.github.pagehelper.PageInfo;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.apache.commons.collections4.CollectionUtils;
  28. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.transaction.annotation.Transactional;
  32. import java.math.BigDecimal;
  33. import java.math.RoundingMode;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. /**
  37. * @program: gold-java
  38. * @ClassName AuditServiceImpl
  39. * @description: 审核模块
  40. * @author: Ethan
  41. * @create: 202506-19 17:38
  42. * @Version 1.0
  43. **/
  44. @Service
  45. @Slf4j
  46. public class AuditServiceImpl implements AuditService {
  47. @Autowired
  48. private AuditMapper auditMapper;
  49. @Autowired
  50. private UserMapper userMapper;
  51. @Autowired
  52. private RedMapper redMapper;
  53. @Autowired
  54. private AdminService adminService;
  55. @Autowired
  56. private GeneralService generalService;
  57. @Autowired
  58. private MarketMapper marketMapper;
  59. @Autowired
  60. private RedService redService;
  61. @Autowired
  62. private WalletMapper walletMapper;
  63. @Autowired
  64. private RabbitTemplate rabbitTemplate;
  65. @Autowired
  66. private WalletService walletService;
  67. @Autowired
  68. private BeanConsumeService beanConsumeService;
  69. /*
  70. 审核订单并修改用户余额等
  71. */
  72. @Transactional(rollbackFor = Exception.class)
  73. @Override
  74. public boolean auditOrder(String token, String orderCode, Integer auditId, Integer action, String rejectReason, BigDecimal price, String linkId ,Integer refundModel) throws Exception {
  75. if (linkId == null) {
  76. linkId = orderCode;
  77. }
  78. UserGoldRecord order = auditMapper.selectOrderByOrderCode(orderCode);
  79. if (price == null) {
  80. price = BigDecimal.valueOf(order.getPermanentGold());
  81. }
  82. Date date = new Date();
  83. //状态为0待审核或4第一次红包退款失败的订单才能审核
  84. if (order == null || (order.getAuditStatus() != 0 && order.getAuditStatus() != 4)) {
  85. throw new IllegalArgumentException("订单不存在或已被审核");
  86. }
  87. GoldUser userNow = userMapper.selectUser(order.getJwcode().toString());
  88. //更新订单的审核状态和审核人
  89. UserGoldRecord updateOrder = new UserGoldRecord();
  90. updateOrder.setOrderCode(orderCode);
  91. updateOrder.setAuditId(auditId);
  92. String auditName = auditMapper.getName(auditId);
  93. //判断是通过还是驳回
  94. if (action == 2) { //驳回
  95. if (order.getType() == 2) { //退款
  96. //2.获取对应的订单(退款订单号去掉开头"TK"即为对应原始订单)
  97. String oldOrderCode = order.getOrderCode().replaceFirst("TK_", "");
  98. //3.更新消费订单是否已退款状态为0
  99. UserGoldRecord oldOrder = auditMapper.selectAllOrderByOrderCode(oldOrderCode);
  100. if (oldOrderCode != null && (oldOrder.getType() == 1 || oldOrder.getType() == 0)) { //确保是消费或充值订单
  101. auditMapper.updateOrderRefund(oldOrderCode, (byte) 0);
  102. } else {
  103. throw new IllegalArgumentException("找不到对应的订单或不是有效订单");
  104. }
  105. }
  106. updateOrder.setAuditStatus(2);
  107. updateOrder.setRejectReason(rejectReason);
  108. updateOrder.setAuditTime(new Date());
  109. // 执行审核更新
  110. auditMapper.updateOrder(updateOrder);
  111. } else if (action == 1) { //通过
  112. //判断是充值还是退款
  113. if (order.getType() == 0) { //充值
  114. //更新用户余额
  115. User update = new User();
  116. Date oldFirstRecharge = userMapper.getFirstRecharge(order.getJwcode().toString());
  117. update.setJwcode(order.getJwcode()); //精网号
  118. update.setSumPermanentGold(BigDecimal.valueOf(order.getPermanentGold())); //历史永久金币
  119. update.setSumFreeJune(BigDecimal.valueOf(order.getFreeJune())); //历史六月免费金币
  120. update.setSumFreeDecember(BigDecimal.valueOf(order.getFreeDecember())); //历史十二月免费金币
  121. update.setSumTaskGold(BigDecimal.valueOf(order.getTaskGold())); //历史任务金币
  122. update.setCurrentPermanentGold(BigDecimal.valueOf(order.getPermanentGold())); //当前永久金币
  123. update.setCurrentFreeJune(BigDecimal.valueOf(order.getFreeJune())); //当前六月免费金币
  124. update.setCurrentFreeDecember(BigDecimal.valueOf(order.getFreeDecember())); //当前十二月免费金币
  125. update.setCurrentTaskGold(BigDecimal.valueOf(order.getTaskGold())); //当前任务金币
  126. update.setRechargeNum(1); //充值次数加一
  127. /*
  128. 判断是否更新首充时间
  129. 1.用户当前首充时间为空
  130. 2.用户当前首充时间小于当前时间
  131. 3.用户当前首充时间等于2020-01-01 00:00:00
  132. */
  133. // 构造 2020-01-01 00:00:00
  134. Date placeholder = new GregorianCalendar(2020, Calendar.JANUARY, 1, 0, 0).getTime();
  135. if (oldFirstRecharge == null || oldFirstRecharge.after(date) || placeholder.equals(oldFirstRecharge)) {
  136. auditMapper.updateFirstRecharge(order.getJwcode());//设置首充时间为当前时间
  137. }
  138. auditMapper.updateUserGold(update);
  139. /* //累充
  140. try {
  141. BigDecimal sum = BigDecimal.valueOf(
  142. order.getPermanentGold())
  143. .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
  144. redService.addAmount(order.getJwcode(), sum, 1); // ← 直接调你写好的方法!
  145. } catch (Exception e) {
  146. log.warn("红包累加失败,主流程继续 | jwcode={}", order.getJwcode(), e);
  147. }
  148. try {
  149. redService.sendJwcode(order.getJwcode(), order.getLinkId());
  150. log.info("精网号发送成功 | jwcode={}", order.getJwcode());
  151. } catch (Exception e) {
  152. log.warn("精网号发送失败,主流程继续 | jwcode={}", order.getJwcode(), e);
  153. }*/
  154. //erp增加充值数据
  155. GoldTistV2.addCoinNew(order.getJwcode().toString(), 64, //充值永久金币
  156. (double) (order.getPermanentGold()) / 100, order.getLinkId()
  157. , order.getRemark(), (double) (order.getPermanentGold()) / 100, auditName, "金币充值");
  158. GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
  159. (double) (order.getFreeDecember() + order.getFreeJune()) / 100, order.getLinkId(),
  160. order.getRemark(), 0, auditName, "金币充值");
  161. } else if (order.getType() == 2) { //退款
  162. /* //对非强制退款订单进行退红包校验
  163. if (order.getAuditStatus() != 4) {
  164. try {
  165. String result = redService.checkRed(price, linkId);
  166. // 设置到全局上下文
  167. AuditContext.setRedCheckResult(result);
  168. } catch (RedCheckException e) {
  169. // 业务失败(flag=false)
  170. int num = e.getNum();
  171. String logMsg = String.format(
  172. "红包退票失败,orderId=%s,还需扣除金币数=%d",
  173. linkId, num
  174. );
  175. log.error(logMsg);
  176. updateOrder.setAuditStatus(4);
  177. updateOrder.setRedDiff(BigDecimal.valueOf(num * 100L));
  178. auditMapper.updateOrder(updateOrder);
  179. AuditContext.setFailMsg(logMsg);
  180. return false;
  181. } catch (Exception e) {
  182. // 网络异常 / 系统异常
  183. log.error("红包接口调用异常", e);
  184. throw new RuntimeException(e);
  185. }
  186. }*/
  187. //2.获取对应的订单(退款订单号去掉开头"TK"即为对应原始订单)
  188. String oldOrderCode = order.getOrderCode().replaceFirst("TK_", "");
  189. UserGoldRecord oldOrder = auditMapper.selectAllOrderByOrderCode(oldOrderCode);
  190. //更新用户余额
  191. User update = new User();
  192. update.setJwcode(order.getJwcode());
  193. update.setCurrentPermanentGold(BigDecimal.valueOf(order.getPermanentGold())); //当前永久金币
  194. update.setCurrentFreeJune(BigDecimal.valueOf(order.getFreeJune())); //当前六月免费金币
  195. update.setCurrentFreeDecember(BigDecimal.valueOf(order.getFreeDecember())); //当前十二月免费金币
  196. update.setCurrentTaskGold(BigDecimal.valueOf(order.getTaskGold())); //当前任务金币
  197. auditMapper.updateUserGold(update);
  198. //钱包更新
  199. // List<UserWalletRecord> userWalletList = walletService.selectUserWalletRecord(order.getJwcode(), oldOrderCode);
  200. // UserRegionWallet userRegionWallet = new UserRegionWallet();
  201. // 钱包更新 - 按原始扣款流水 wallet_id 优先级顺序原路退回(1-10,越小优先级越高)
  202. // 1. 查询原始扣款流水(type=1 消耗,status=0 正常)
  203. List<UserWalletRecord> originalRecords = walletService.selectUserWalletRecord(order.getJwcode(), oldOrderCode);
  204. if (!CollectionUtils.isEmpty(originalRecords)) {
  205. originalRecords = originalRecords.stream()
  206. .filter(r -> r.getType() == 1 && r.getStatus() == 0)
  207. // 修改点:使用 comparingInt 并 reversed
  208. .sorted(Comparator.comparingInt(UserWalletRecord::getWalletId).reversed())
  209. .collect(Collectors.toList());
  210. // 2. 本次退款总金额
  211. BigDecimal totalRefundAmount = BigDecimal.valueOf(order.getPermanentGold());
  212. if (totalRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
  213. BigDecimal remainingRefund = totalRefundAmount;
  214. // 3. 按原始流水顺序退回
  215. for (UserWalletRecord record : originalRecords) {
  216. if (remainingRefund.compareTo(BigDecimal.ZERO) <= 0) {
  217. break;
  218. }
  219. Integer walletId = record.getWalletId();
  220. // 🔥 关键修正:取绝对值,兼容负数存储
  221. BigDecimal originalAmount = BigDecimal.valueOf(record.getAmount()).abs();
  222. if (originalAmount.compareTo(BigDecimal.ZERO) <= 0) {
  223. continue;
  224. }
  225. // 4. 计算本次退回金额 = min(原扣金额,剩余待退金额)
  226. BigDecimal refundAmount = originalAmount.min(remainingRefund);
  227. if (refundAmount.compareTo(BigDecimal.ZERO) <= 0) {
  228. continue;
  229. }
  230. // 5. 插入退款流水记录(type=2 退款)
  231. UserWalletRecord refundRecord = new UserWalletRecord();
  232. refundRecord.setJwcode(order.getJwcode());
  233. refundRecord.setWalletId(walletId);
  234. refundRecord.setType(2); // 退款类型
  235. refundRecord.setTransactionCurrency("金币"); // 交易币种
  236. refundRecord.setAmount(refundAmount.intValue()); // 🔥 退款存正数
  237. refundRecord.setOrderCode(order.getOrderCode());
  238. if(refundModel==0){
  239. refundRecord.setDescription("全部退款");
  240. }else{
  241. refundRecord.setDescription("部分退款");
  242. }
  243. refundRecord.setStatus(0);
  244. walletService.addUserWalletRecord(refundRecord);
  245. // 6. 查询并更新钱包余额(覆盖更新,先查后改)
  246. UserRegionWallet currentWallet = walletMapper.selectWallet(order.getJwcode(), walletId);
  247. if (currentWallet == null) {
  248. log.error("钱包记录不存在,无法退款 | jwcode={}, walletId={}", order.getJwcode(), walletId);
  249. continue;
  250. }
  251. // 7. 计算新余额 + 覆盖更新
  252. BigDecimal newBalance = currentWallet.getCurrentPermanentGold().add(refundAmount);
  253. currentWallet.setCurrentPermanentGold(newBalance);
  254. walletMapper.updateWallet(currentWallet);
  255. walletService.updateUserWalletRecord(record.getId());
  256. // 8. 扣减剩余待退金额
  257. remainingRefund = remainingRefund.subtract(refundAmount);
  258. }
  259. if (order.getGoodsName()=="兑换金豆"){
  260. BeanConsume consume = new BeanConsume();
  261. consume.setJwcode(String.valueOf(order.getJwcode()));
  262. consume.setAdminName(auditName);
  263. consume.setPermanentBean(order.getPermanentGold()/2);
  264. consume.setRemark("金币系统兑换金豆退款");
  265. consume.setFreeBean((order.getFreeJune()+order.getFreeDecember())/2);
  266. beanConsumeService.reduce(consume);
  267. }
  268. }
  269. }
  270. //商品消费退款
  271. //erp增加退款数据
  272. if (oldOrder.getType() == 1) {
  273. /* int type = 2;
  274. //额外扣金币抵扣红包
  275. if (order.getAuditStatus() == 4) {
  276. // 检查用户余额是否足够抵扣红包差额
  277. if (price.add(order.getRedDiff()).compareTo(userNow.getNowSumGold()) > 0) {
  278. log.error("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}",
  279. order.getRedDiff(), userNow.getNowSumGold());
  280. throw new IllegalArgumentException("用户余额不足,无法抵扣红包");
  281. }
  282. ConsumeUser consumeUser = new ConsumeUser();
  283. // 1. 先扣除免费金币
  284. if (order.getRedDiff().compareTo(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember()))) <= 0) {
  285. // 红包差额小于等于免费金币,只扣免费金币
  286. consumeUser.setJwcode(order.getJwcode());
  287. consumeUser.setFreeGold(order.getRedDiff());
  288. consumeUser.setPermanentGold(BigDecimal.ZERO);
  289. consumeUser.setTaskGold(BigDecimal.ZERO);
  290. } else {
  291. // 2. 免费金币不足,扣除免费+永久金币
  292. BigDecimal remainingAfterFree = order.getRedDiff().subtract(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
  293. if (remainingAfterFree.compareTo(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold()))) <= 0) {
  294. consumeUser.setJwcode(order.getJwcode());
  295. consumeUser.setFreeGold(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
  296. consumeUser.setPermanentGold(remainingAfterFree);
  297. consumeUser.setTaskGold(BigDecimal.ZERO);
  298. } else {
  299. // 3. 免费+永久金币仍不足,扣除全部免费+永久+部分任务金币
  300. BigDecimal remainingAfterPermanent = remainingAfterFree.subtract(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold())));
  301. if (remainingAfterPermanent.compareTo(userNow.getNowTaskGold().add(BigDecimal.valueOf(order.getTaskGold()))) <= 0) {
  302. consumeUser.setJwcode(order.getJwcode());
  303. consumeUser.setFreeGold(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
  304. consumeUser.setPermanentGold(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold())));
  305. consumeUser.setTaskGold(remainingAfterPermanent);
  306. } else {
  307. throw new IllegalArgumentException("用户金币不足,无法抵扣红包");
  308. }
  309. }
  310. }
  311. consumeUser.setSumGold(order.getRedDiff());
  312. consumeUser.setAdminId(order.getAdminId());
  313. consumeUser.setRemark(order.getRemark());
  314. consumeUser.setPrice(price);
  315. // 执行金币抵扣红包
  316. redService.updateRed(consumeUser);
  317. //link扣除已有红包
  318. redService.consumeRed(linkId);
  319. }
  320. //link扣除已有红包
  321. else if (AuditContext.getRedCheckResult() != null && !AuditContext.getRedCheckResult().equals("old")) {
  322. redService.consumeRed(linkId);
  323. } else {
  324. Exception e = new Exception("旧订单退款");
  325. String title = "旧订单退款";
  326. String detail = ("精网号:" + order.getJwcode()) + "\n金币订单号:" + orderCode + "\n永久金币:" + Math.abs(order.getPermanentGold()) / 100 +
  327. "\n免费金币:" + Math.abs((order.getFreeJune() + order.getFreeDecember())) / 100 + "\n任务金币:" + Math.abs(order.getTaskGold()) / 100 +
  328. "\n退款类型:" + order.getRefundType() + "\n商品名:" + order.getGoodsName() + "\n备注:" + order.getRemark();
  329. GlobalExceptionHandler.sendFeishuAlert(e, title, detail);
  330. }
  331. // 执行审核更新
  332. redMapper.update(order.getJwcode(), type, price.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
  333. */
  334. if (order.getPermanentGold() != 0 || order.getFreeJune() != 0 || order.getFreeDecember() != 0 || order.getTaskGold() != 0) {
  335. GoldTistV2.addCoinNew(order.getJwcode().toString(), 55, //退款免费-商品
  336. (double) (order.getFreeDecember() + order.getFreeJune()) / 100, SimpleIdGenerator.generateId(),
  337. order.getRemark(), 0, auditName, "退款商品" + order.getGoodsName());
  338. GoldTistV2.addCoinNew(order.getJwcode().toString(), 56, //退款永久-商品
  339. (double) (order.getPermanentGold()) / 100, SimpleIdGenerator.generateId(),
  340. order.getRemark(), order.getPermanentGold(), auditName, "退款商品" + order.getGoodsName());
  341. GoldTistV2.addCoinNew(order.getJwcode().toString(), 57, //退款任务-商品
  342. (double) (order.getTaskGold()) / 100, SimpleIdGenerator.generateId(),
  343. order.getRemark(), 0, auditName, "退款商品" + order.getGoodsName());
  344. } else {
  345. //0金币消耗,往erp传一条金币为空的记录
  346. GoldTistV2.addCoinRecordNew(String.valueOf(order.getJwcode()), order.getRemark(), auditName, order.getGoodsName());
  347. }
  348. }//金币充值退款
  349. else if (oldOrder.getType() == 0) {
  350. //判断够不够扣
  351. if (userNow.getNowPermanentGold().compareTo(BigDecimal.valueOf(Math.abs(order.getPermanentGold()))) < 0
  352. || userNow.getNowFreeGold().compareTo(BigDecimal.valueOf(Math.abs(order.getFreeDecember() + order.getFreeJune()))) < 0
  353. || userNow.getNowTaskGold().compareTo(BigDecimal.valueOf(Math.abs(order.getTaskGold()))) < 0) {
  354. log.error("用户余额不足,无法退款");
  355. throw new IllegalArgumentException("用户余额不足,无法退款");
  356. }
  357. /* int type = 1; //红包充值累计
  358. //额外扣金币抵扣红包
  359. if (order.getAuditStatus() == 4) {
  360. // 检查用户余额是否足够抵扣红包差额
  361. if (price.add(order.getRedDiff()).compareTo(userNow.getNowSumGold()) > 0) {
  362. log.error("用户余额不足,无法抵扣红包 - 红包差额: {}, 用户余额: {}",
  363. order.getRedDiff(), userNow.getNowSumGold());
  364. throw new IllegalArgumentException("用户余额不足,无法抵扣红包");
  365. }
  366. ConsumeUser consumeUser = new ConsumeUser();
  367. // 1. 先扣除免费金币
  368. if (order.getRedDiff().compareTo(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember()))) <= 0) {
  369. // 红包差额小于等于免费金币,只扣免费金币
  370. consumeUser.setJwcode(order.getJwcode());
  371. consumeUser.setFreeGold(order.getRedDiff());
  372. consumeUser.setPermanentGold(BigDecimal.ZERO);
  373. consumeUser.setTaskGold(BigDecimal.ZERO);
  374. } else {
  375. // 2. 免费金币不足,扣除免费+永久金币
  376. BigDecimal remainingAfterFree = order.getRedDiff().subtract(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
  377. if (remainingAfterFree.compareTo(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold()))) <= 0) {
  378. consumeUser.setJwcode(order.getJwcode());
  379. consumeUser.setFreeGold(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
  380. consumeUser.setPermanentGold(remainingAfterFree);
  381. consumeUser.setTaskGold(BigDecimal.ZERO);
  382. } else {
  383. // 3. 免费+永久金币仍不足,扣除全部免费+永久+部分任务金币
  384. BigDecimal remainingAfterPermanent = remainingAfterFree.subtract(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold())));
  385. if (remainingAfterPermanent.compareTo(userNow.getNowTaskGold().add(BigDecimal.valueOf(order.getTaskGold()))) <= 0) {
  386. consumeUser.setJwcode(order.getJwcode());
  387. consumeUser.setFreeGold(userNow.getNowFreeGold().add(BigDecimal.valueOf(order.getFreeJune() + order.getFreeDecember())));
  388. consumeUser.setPermanentGold(userNow.getNowPermanentGold().add(BigDecimal.valueOf(order.getPermanentGold())));
  389. consumeUser.setTaskGold(remainingAfterPermanent);
  390. } else {
  391. throw new IllegalArgumentException("用户金币不足,无法抵扣红包");
  392. }
  393. }
  394. }
  395. consumeUser.setSumGold(order.getRedDiff());
  396. consumeUser.setAdminId(order.getAdminId());
  397. consumeUser.setRemark(order.getRemark());
  398. consumeUser.setPrice(price);
  399. // 执行金币抵扣红包
  400. redService.updateRed(consumeUser);
  401. //link扣除已有红包
  402. redService.consumeRed(linkId);
  403. }
  404. //link扣除已有红包
  405. else if (AuditContext.getRedCheckResult() != null && !AuditContext.getRedCheckResult().equals("old")) {
  406. redService.consumeRed(linkId);
  407. } else {
  408. Exception e = new Exception("旧订单退款");
  409. String title = "旧订单退款";
  410. String detail = ("精网号:" + order.getJwcode()) + "\n金币订单号:" + orderCode + "\n永久金币:" + Math.abs(order.getPermanentGold()) / 100 +
  411. "\n免费金币:" + Math.abs((order.getFreeJune() + order.getFreeDecember())) / 100 + "\n任务金币:" + Math.abs(order.getTaskGold()) / 100 +
  412. "\n退款类型:" + order.getRefundType() + "\n商品名:" + order.getGoodsName() + "\n备注:" + order.getRemark();
  413. GlobalExceptionHandler.sendFeishuAlert(e, title, detail);
  414. }
  415. // 执行审核更新
  416. redMapper.update(order.getJwcode(), type, price.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
  417. */
  418. if (order.getTaskGold() == 0) { //无任务金币统一走免费+永久
  419. GoldTistV2.addCoinNew(order.getJwcode().toString(), 58, //退款免费+永久金币-充值
  420. (double) (order.getFreeDecember() + order.getFreeJune() + order.getPermanentGold()) / 100, SimpleIdGenerator.generateId(),
  421. order.getRemark(), (double) order.getPermanentGold() / 100, auditName, "退款金币充值");
  422. }
  423. if (order.getTaskGold() != 0) {
  424. GoldTistV2.addCoinNew(order.getJwcode().toString(), 59, //退款任务+永久金币-充值
  425. (double) (order.getTaskGold() + order.getPermanentGold()) / 100, SimpleIdGenerator.generateId(),
  426. order.getRemark(), (double) order.getPermanentGold() / 100, auditName, "退款金币充值");
  427. }
  428. }
  429. }
  430. updateOrder.setAuditStatus(1);
  431. updateOrder.setAuditTime(new Date());
  432. auditMapper.updateOrder(updateOrder);
  433. }
  434. return true;
  435. }
  436. /*
  437. * 多条件查询充值订单列表
  438. */
  439. @Override
  440. public PageInfo<RechargeAudit> selectRechargeBy(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit) {
  441. List<String> markets = marketMapper.getMarketIds(rechargeAudit.getMarkets());
  442. if (markets.contains("9") || markets.contains("9999")) {
  443. markets = null;
  444. }
  445. rechargeAudit.setMarkets(markets);
  446. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  447. List<RechargeAudit> rechargeAudits = auditMapper.selectRechargeBy(pageNum, pageSize, rechargeAudit);
  448. // rechargeAudit.setFreeGold(rechargeAudit.getFreeJune()+rechargeAudit.getFreeDecember());
  449. return new PageInfo<>(rechargeAudits);
  450. }
  451. /*
  452. 多条件查询退款订单
  453. */
  454. @Override
  455. public PageInfo<RefundAudit> selectRefundBy(Integer pageNum, Integer pageSize, RefundAudit refundAudit) {
  456. List<String> markets = marketMapper.getMarketIds(refundAudit.getMarkets());
  457. if (markets.contains("9") || markets.contains("9999")) {
  458. markets = null;
  459. }
  460. refundAudit.setMarkets(markets);
  461. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  462. List<RefundAudit> refundAudits = auditMapper.selectRefundBy(pageNum, pageSize, refundAudit);
  463. //refundAudit.setFreeGold(refundAudit.getFreeJune()+refundAudit.getFreeDecember());
  464. return new PageInfo<>(refundAudits);
  465. }
  466. /*
  467. 充值审核金币合计数
  468. */
  469. @Override
  470. public Gold sumRechargeGold(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit) {
  471. Gold gold = new Gold();
  472. //获取充值审核订单列表
  473. List<String> markets = marketMapper.getMarketIds(rechargeAudit.getMarkets());
  474. if (markets.contains("9") || markets.contains("9999")) {
  475. markets = null;
  476. }
  477. rechargeAudit.setMarkets(markets);
  478. List<RechargeAudit> rechargeAudits = auditMapper.selectRechargeBy(1, 500000, rechargeAudit);
  479. // 初始化累加器
  480. int totalNum = 0;
  481. int permanentGoldSum = 0;
  482. int freeGoldSum = 0;
  483. // 遍历消费记录并累加金币
  484. for (RechargeAudit recharge : rechargeAudits) {
  485. // 累加永久金币
  486. if (recharge.getPermanentGold() != null) {
  487. permanentGoldSum += recharge.getPermanentGold();
  488. }
  489. // 累加免费金币
  490. if (recharge.getFreeJune() != null || recharge.getFreeDecember() != null) {
  491. freeGoldSum = freeGoldSum + recharge.getFreeJune() + recharge.getFreeDecember();
  492. }
  493. // 每遍历一条记录,总条数加1
  494. totalNum++;
  495. }
  496. // 将累加结果设置到Gold对象
  497. gold.setPermanentGolds(BigDecimal.valueOf(permanentGoldSum));
  498. gold.setFreeGolds(BigDecimal.valueOf(freeGoldSum));
  499. gold.setTotalNum(totalNum);
  500. return gold;
  501. }
  502. /*
  503. 退款审核合计数
  504. */
  505. @Override
  506. public Gold sumRefundGold(Integer pageNum, Integer pageSize, RefundAudit refundAudit) {
  507. Gold gold = new Gold();
  508. //获取充值审核订单列表
  509. List<String> markets = marketMapper.getMarketIds(refundAudit.getMarkets());
  510. if (markets.contains("9") || markets.contains("9999")) {
  511. markets = null;
  512. }
  513. refundAudit.setMarkets(markets);
  514. List<RefundAudit> refundAudits = auditMapper.selectRefundBy(1, 500000, refundAudit);
  515. // 初始化累加器
  516. int totalNum = 0;
  517. int permanentGoldSum = 0;
  518. int freeGoldSum = 0;
  519. int taskGoldSum = 0;
  520. // 遍历消费记录并累加金币
  521. for (RefundAudit refund : refundAudits) {
  522. // 累加永久金币
  523. if (refund.getPermanentGold() != null) {
  524. permanentGoldSum += refund.getPermanentGold();
  525. }
  526. // 累加免费金币
  527. if (refund.getFreeJune() != null || refund.getFreeDecember() != null) {
  528. freeGoldSum += refund.getFreeJune() + refund.getFreeDecember();
  529. }
  530. //累加任务金币
  531. if (refund.getTaskGold() != null)
  532. taskGoldSum += refund.getTaskGold();
  533. // 每遍历一条记录,总条数加1
  534. totalNum++;
  535. }
  536. // 将累加结果设置到Gold对象
  537. gold.setPermanentGolds(BigDecimal.valueOf(permanentGoldSum));
  538. gold.setFreeGolds(BigDecimal.valueOf(freeGoldSum));
  539. gold.setTotalNum(totalNum);
  540. gold.setTaskGolds(BigDecimal.valueOf(taskGoldSum));
  541. return gold;
  542. }
  543. public class AuditContext {
  544. private static final ThreadLocal<String> FAIL_MSG = new ThreadLocal<>();
  545. private static final ThreadLocal<String> RED_CHECK_RESULT = new ThreadLocal<>();
  546. public static void setFailMsg(String msg) {
  547. FAIL_MSG.set(msg);
  548. }
  549. public static String getFailMsg() {
  550. return FAIL_MSG.get();
  551. }
  552. public static void setRedCheckResult(String result) {
  553. RED_CHECK_RESULT.set(result);
  554. }
  555. public static String getRedCheckResult() {
  556. return RED_CHECK_RESULT.get();
  557. }
  558. public static void clear() {
  559. FAIL_MSG.remove();
  560. RED_CHECK_RESULT.remove();
  561. }
  562. }
  563. }