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.

320 lines
17 KiB

3 months ago
  1. package com.example.demo.serviceImpl.cash;
  2. import com.example.demo.Util.GoldTistV2;
  3. import com.example.demo.Util.SimpleIdGenerator;
  4. import com.example.demo.config.RabbitMQConfig;
  5. import com.example.demo.domain.entity.*;
  6. import com.example.demo.domain.vo.cash.CashCollectionMessage;
  7. import com.example.demo.domain.vo.coin.Messages;
  8. import com.example.demo.mapper.cash.CashAuditMapper;
  9. import com.example.demo.mapper.cash.CashCollectionMapper;
  10. import com.example.demo.mapper.coin.AuditMapper;
  11. import com.example.demo.mapper.coin.MarketMapper;
  12. import com.example.demo.mapper.coin.RateMapper;
  13. import com.example.demo.mapper.coin.RechargeMapper;
  14. import com.example.demo.service.cash.CashAuditService;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import java.math.BigDecimal;
  21. import java.time.LocalDate;
  22. import java.time.LocalDateTime;
  23. import java.time.ZoneOffset;
  24. import java.util.Date;
  25. import static net.sf.jsqlparser.parser.feature.Feature.update;
  26. /**
  27. * @program: gold-java
  28. * @ClassName CashAuditServiceImpl
  29. * @description: 处理收款订单的审核业务逻辑
  30. * @author: Ethan
  31. * @create: 202510-08 10:09
  32. * @Version 1.0
  33. **/
  34. @Service
  35. @Slf4j
  36. public class CashAuditServiceImpl implements CashAuditService {
  37. @Autowired
  38. private AuditMapper auditMapper;
  39. @Autowired
  40. private RechargeMapper rechargeMapper;
  41. @Autowired
  42. private CashCollectionMapper cashCollectionMapper;
  43. @Autowired
  44. private CashAuditMapper cashAuditMapper;
  45. @Autowired
  46. private RabbitTemplate rabbitTemplate;
  47. @Autowired
  48. private MarketMapper marketMapper;
  49. @Autowired
  50. private RateMapper rateMapper;
  51. @Transactional
  52. @Override
  53. public boolean auditCollection(String token, Integer auditId, String orderCode, Integer action, String rejectReason) {
  54. CashRecord order = cashCollectionMapper.selectAuditByOrderCode(orderCode);
  55. if (order == null || order.getStatus() != 0
  56. ) {
  57. throw new IllegalArgumentException("订单不存在或已被审核");
  58. }
  59. //带版本更新
  60. int updated=cashCollectionMapper.updateOrderWithVersion(orderCode, 0, auditId, order.getVersion());
  61. if (updated==0){
  62. throw new IllegalArgumentException("订单已被其他审核员审核");
  63. }
  64. CashRecord updateOrder = new CashRecord();
  65. //设置审核人
  66. updateOrder.setAuditId(auditId);
  67. //判断是通过还是驳回,更新审核状态
  68. updateOrder.setOrderCode(orderCode);
  69. String auditName = cashAuditMapper.getAuditName(auditId);
  70. if (action == 1) { //通过
  71. updateOrder.setStatus(1);
  72. if (order.getGoodsName().equals("金币充值")) {
  73. //往金币订单表加一条充值记录
  74. UserGoldRecord rechargeOrder = new UserGoldRecord();
  75. rechargeOrder.setOrderCode(orderCode.replaceFirst("^XJ_", "XJCZ_"));
  76. rechargeOrder.setJwcode(order.getJwcode());
  77. rechargeOrder.setActivity(order.getActivity());
  78. rechargeOrder.setPermanentGold(order.getPermanentGold());
  79. // 获取当前月份(1-12)
  80. int currentMonth = LocalDate.now().getMonthValue();
  81. // 根据当前月份设置对应字段
  82. if (currentMonth >= 1 && currentMonth <= 6) {
  83. // 1-6 月:设置 6 月额度,12 月保持默认值
  84. rechargeOrder.setFreeJune(order.getFreeGold());
  85. rechargeOrder.setFreeDecember(0);
  86. } else {
  87. // 7-12 月:设置 12 月额度,6 月保持默认值
  88. rechargeOrder.setFreeJune(0);
  89. rechargeOrder.setFreeDecember(order.getFreeGold());
  90. }
  91. rechargeOrder.setSumGold(order.getPermanentGold() + order.getFreeGold());
  92. Integer rateId = rateMapper.getIdByName(order.getPaymentCurrency());
  93. if (rateId == null) {
  94. log.warn("未找到币种 '{}' 对应的ID,使用默认值0", order.getPaymentCurrency());
  95. rateId = 0;
  96. }
  97. rechargeOrder.setRateId(rateId);
  98. rechargeOrder.setMoney(order.getPaymentAmount().intValue());
  99. rechargeOrder.setRemark(order.getRemark());
  100. rechargeOrder.setVoucher(order.getVoucher());
  101. rechargeOrder.setPayPlatform("金币系统");
  102. rechargeOrder.setPayModel(order.getPayType());
  103. //把时间转换成 Date
  104. Date date = Date.from(order.getPayTime().toInstant(ZoneOffset.ofHours(8)));
  105. rechargeOrder.setPayTime(date);
  106. rechargeOrder.setAdminId(order.getSubmitterId());
  107. rechargeOrder.setAuditId(auditId);
  108. rechargeOrder.setType((byte) 0);
  109. rechargeOrder.setAuditStatus(1);
  110. rechargeOrder.setCreateTime(new Date());
  111. order.setLinkId(SimpleIdGenerator.generateId());
  112. rechargeOrder.setLinkId(order.getLinkId());
  113. rechargeMapper.add(rechargeOrder);
  114. // 先从数据库中获取订单的 walletId
  115. CashRecord dbRecord = cashCollectionMapper.selectByOrderCode(orderCode);
  116. Integer walletId = dbRecord != null ? dbRecord.getWalletId() : null;
  117. // 充值到指定钱包
  118. if (walletId != null && order.getPermanentGold() > 0) {
  119. try {
  120. // 尝试更新用户钱包余额
  121. int updateRows = cashCollectionMapper.addUserWalletPermanentGold(
  122. order.getJwcode(),
  123. walletId,
  124. order.getPermanentGold()
  125. );
  126. // 如果没有更新任何行,说明记录不存在,需要插入新记录
  127. if (updateRows == 0) {
  128. UserRegionWallet wallet = new UserRegionWallet();
  129. wallet.setJwcode(order.getJwcode());
  130. wallet.setWalletId(walletId);
  131. wallet.setCurrentPermanentGold(new BigDecimal(order.getPermanentGold()));
  132. cashCollectionMapper.insertUserWallet(wallet);
  133. log.info("创建新的钱包记录:jwcode={}, walletId={}, permanentGold={}",
  134. order.getJwcode(), walletId, order.getPermanentGold());
  135. } else {
  136. log.info("充值成功:jwcode={}, walletId={}, 增加金币={}",
  137. order.getJwcode(), walletId, order.getPermanentGold());
  138. }
  139. // 创建钱包明细记录
  140. UserWalletRecord walletRecord = new UserWalletRecord();
  141. walletRecord.setJwcode(order.getJwcode());
  142. walletRecord.setWalletId(walletId);
  143. walletRecord.setType(0); // 0=充值
  144. walletRecord.setTransactionCurrency("金币");
  145. walletRecord.setAmount(order.getPermanentGold());
  146. walletRecord.setOrderCode(orderCode);
  147. walletRecord.setDescription(order.getPayType());
  148. walletRecord.setStatus(0); // 0=正常
  149. cashCollectionMapper.insertUserWalletRecord(walletRecord);
  150. log.info("创建钱包明细记录:jwcode={}, walletId={}, orderCode={}, amount={}",
  151. order.getJwcode(), walletId, orderCode, order.getPermanentGold());
  152. } catch (Exception e) {
  153. log.error("充值钱包失败:jwcode={}, walletId={}, error={}",
  154. order.getJwcode(), walletId, e.getMessage(), e);
  155. // 不抛出异常,避免影响主流程,但记录错误日志
  156. }
  157. }
  158. //往 ERP 加一条充值数据
  159. GoldTistV2.addCoinNew(order.getJwcode().toString(), 64, //充值永久金币
  160. (double) (order.getPermanentGold()) / 100,order.getLinkId(),
  161. order.getRemark(), (double) (order.getPermanentGold()) / 100, auditName, "金币充值");
  162. GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
  163. (double) (order.getFreeGold()) / 100,order.getLinkId(),
  164. order.getRemark(), 0, auditName, "金币充值");
  165. //修改用户余额,添加金币
  166. User user = new User();
  167. user.setJwcode(order.getJwcode());
  168. user.setSumConsumePermanent(BigDecimal.valueOf(order.getPermanentGold()));
  169. // 根据当前月份设置对应字段
  170. if (currentMonth >= 1 && currentMonth <= 6) {
  171. // 1-6 月:设置 12 月额度,6 月保持默认值
  172. user.setSumFreeJune(BigDecimal.valueOf(0));
  173. user.setSumFreeDecember(BigDecimal.valueOf(order.getFreeGold()));
  174. user.setCurrentFreeDecember(BigDecimal.valueOf(order.getFreeGold()));
  175. } else {
  176. // 7-12 月:设置 6 月额度,12 月保持默认值
  177. user.setSumFreeJune(BigDecimal.valueOf(order.getFreeGold()));
  178. user.setCurrentFreeJune(BigDecimal.valueOf(order.getFreeGold()));
  179. user.setSumFreeDecember(BigDecimal.valueOf(0));
  180. }
  181. user.setCurrentPermanentGold(BigDecimal.valueOf(order.getPermanentGold()));
  182. user.setRechargeNum(1); //充值次数加一
  183. auditMapper.updateUserGold(user);
  184. }
  185. if (order.getGoodsName().equals("免费金币赠送")) {
  186. //往金币订单表加一条充值记录
  187. UserGoldRecord rechargeOrder = new UserGoldRecord();
  188. rechargeOrder.setOrderCode(orderCode.replaceFirst("^XJ_", "XJCZ_"));
  189. rechargeOrder.setJwcode(order.getJwcode());
  190. rechargeOrder.setActivity(order.getActivity());
  191. rechargeOrder.setPermanentGold(0);
  192. // 获取当前月份(1-12)
  193. int currentMonth = LocalDate.now().getMonthValue();
  194. // 根据当前月份设置对应字段
  195. if (currentMonth >= 1 && currentMonth <= 6) {
  196. // 1-6 月:设置 6 月额度,12 月保持默认值
  197. rechargeOrder.setFreeJune(order.getFreeGold());
  198. rechargeOrder.setFreeDecember(0);
  199. } else {
  200. // 7-12 月:设置 12 月额度,6 月保持默认值
  201. rechargeOrder.setFreeJune(0);
  202. rechargeOrder.setFreeDecember(order.getFreeGold());
  203. }
  204. rechargeOrder.setSumGold(order.getFreeGold());
  205. rechargeOrder.setRemark(order.getRemark());
  206. rechargeOrder.setPayPlatform("金币系统");
  207. rechargeOrder.setAdminId(order.getSubmitterId());
  208. rechargeOrder.setAuditId(auditId);
  209. rechargeOrder.setType((byte) 0);
  210. rechargeOrder.setAuditStatus(1);
  211. rechargeOrder.setCreateTime(new Date());
  212. rechargeMapper.add(rechargeOrder);
  213. //往 ERP 加一条充值数据
  214. GoldTistV2.addCoinNew(order.getJwcode().toString(), 63, //充值免费
  215. (double) (order.getFreeGold()) / 100,
  216. order.getRemark(), SimpleIdGenerator.generateId(),0, auditName, "金币充值");
  217. //修改用户余额,添加金币
  218. User user = new User();
  219. user.setJwcode(order.getJwcode());
  220. user.setSumConsumePermanent(BigDecimal.valueOf(0));
  221. // 根据当前月份设置对应字段
  222. if (currentMonth >= 1 && currentMonth <= 6) {
  223. // 1-6 月:设置 6 月额度,12 月保持默认值
  224. user.setSumFreeJune(BigDecimal.valueOf(order.getFreeGold()));
  225. user.setSumFreeJune(BigDecimal.valueOf(order.getFreeGold()));
  226. user.setCurrentFreeDecember(BigDecimal.valueOf(0));
  227. } else {
  228. // 7-12 月:设置 12 月额度,6 月保持默认值
  229. user.setSumFreeJune(BigDecimal.valueOf(0));
  230. user.setSumFreeDecember(BigDecimal.valueOf(order.getFreeGold()));
  231. user.setSumFreeDecember(BigDecimal.valueOf(order.getFreeGold()));
  232. }
  233. user.setCurrentPermanentGold(BigDecimal.valueOf(0));
  234. user.setRechargeNum(1); //充值次数加一
  235. auditMapper.updateUserGold(user);
  236. }
  237. else {
  238. // 先从数据库中获取订单的 walletId
  239. CashRecord dbRecord = cashCollectionMapper.selectByOrderCode(orderCode);
  240. Integer walletId = dbRecord != null ? dbRecord.getWalletId() : null;
  241. // 创建钱包明细记录
  242. UserWalletRecord walletRecord = new UserWalletRecord();
  243. walletRecord.setJwcode(order.getJwcode());
  244. walletRecord.setWalletId(walletId);
  245. walletRecord.setType(3); // 3=软件购买
  246. walletRecord.setTransactionCurrency(order.getPaymentCurrency());
  247. walletRecord.setAmount(order.getPaymentAmount().intValue());
  248. walletRecord.setOrderCode(orderCode);
  249. walletRecord.setDescription(order.getGoodsName()+order.getGoodNum()+order.getNumUnit());
  250. walletRecord.setStatus(0); // 0=正常
  251. cashCollectionMapper.insertUserWalletRecord(walletRecord);
  252. log.info("创建钱包明细记录:jwcode={}, walletId={}, orderCode={}, amount={}",
  253. order.getJwcode(), walletId, orderCode, order.getPermanentGold());
  254. }
  255. } else if (action == 2) { //驳回
  256. updateOrder.setStatus(2);
  257. updateOrder.setRejectReason(rejectReason);
  258. }
  259. //更新订单
  260. cashAuditMapper.updateOrder(updateOrder);
  261. if (action == 1){
  262. // 创建消息队列1,用于发送审核结果通知
  263. Messages message1 = new Messages();
  264. message1.setJwcode(order.getJwcode());
  265. message1.setName(order.getName());
  266. message1.setStatus(7);
  267. message1.setDesc("的收款记录需补充手续费,前往填写");
  268. message1.setTitle("现金管理--收款处理(负责人)");
  269. message1.setType(0);
  270. message1.setTypeId(order.getId());
  271. message1.setMarket(Integer.valueOf(order.getReceivedMarket()));
  272. String marketName1 = marketMapper.getMarketNameById(String.valueOf(message1.getMarket()));
  273. message1.setMarketName(marketName1);
  274. message1.setQueryId(86);
  275. rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message1);
  276. // 创建消息队列2,用于发送审核结果通知
  277. Messages message2 = new Messages();
  278. message2.setJwcode(order.getJwcode());
  279. message2.setName(order.getName());
  280. message2.setStatus(updateOrder.getStatus());
  281. message2.setDesc("的收款记录需补充手续费,前往填写");
  282. message2.setTitle("现金管理--收款处理");
  283. message2.setType(0);
  284. message2.setTypeId(order.getId());
  285. message2.setMarket(Integer.valueOf(order.getReceivedMarket()));
  286. String marketName2 = marketMapper.getMarketNameById(String.valueOf(message2.getMarket()));
  287. message2.setMarketName(marketName2);
  288. message2.setQueryId(74);
  289. rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message2);
  290. } else {
  291. // 创建消息队列,用于发送审核结果通知
  292. Messages message = new Messages();
  293. message.setJwcode(order.getJwcode());
  294. message.setName(order.getName());
  295. message.setStatus(updateOrder.getStatus());
  296. message.setDesc("的现金收款申请已被驳回,前往查看驳回理由");
  297. message.setTitle("现金管理--收款提交");
  298. message.setType(0);
  299. message.setTypeId(order.getId());
  300. message.setMarket(Integer.valueOf(order.getMarket()));
  301. String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
  302. message.setMarketName(marketName);
  303. message.setQueryId(60);
  304. rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_COLLECTION_EXCHANGE, "cash.collection.save", message);
  305. }
  306. return true;
  307. }
  308. }