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.

370 lines
16 KiB

2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
  1. package com.example.demo.serviceImpl.cash;
  2. import com.example.demo.Util.GoldTistV2;
  3. import com.example.demo.config.RabbitMQConfig;
  4. import com.example.demo.domain.entity.User;
  5. import com.example.demo.domain.entity.UserGoldRecord;
  6. import com.example.demo.domain.vo.cash.CashRecordDTO;
  7. import com.example.demo.domain.vo.cash.CashRecordDone;
  8. import com.example.demo.domain.vo.cash.CashRecordRefund;
  9. import com.example.demo.domain.vo.cash.CashRefundMessage;
  10. import com.example.demo.domain.vo.coin.Result;
  11. import com.example.demo.mapper.cash.CashRefundMapper;
  12. import com.example.demo.mapper.coin.AuditMapper;
  13. import com.example.demo.mapper.coin.MarketMapper;
  14. import com.example.demo.mapper.coin.RefundMapper;
  15. import com.example.demo.service.cash.RefundService;
  16. import com.github.pagehelper.PageHelper;
  17. import com.github.pagehelper.PageInfo;
  18. import jakarta.servlet.http.HttpServletRequest;
  19. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import java.math.BigDecimal;
  23. import java.time.LocalDate;
  24. import java.time.LocalDateTime;
  25. import java.util.Date;
  26. import java.util.List;
  27. import java.util.UUID;
  28. import static org.apache.commons.lang3.StringUtils.substring;
  29. /**
  30. * @program: GOLD
  31. * @ClassName CashRefundServiceImpl
  32. * @description: 处理退款相关业务逻辑
  33. * @author: huangqizhen
  34. * @create: 202509-28 15:02
  35. * @Version 1.0
  36. **/
  37. @Service
  38. public class CashRefundServiceImpl implements RefundService {
  39. @Autowired
  40. private CashRefundMapper cashRefundMapper;
  41. @Autowired
  42. private RefundMapper refundMapper;
  43. @Autowired
  44. private AuditMapper auditMapper;
  45. @Autowired
  46. private MarketMapper marketMapper;
  47. @Autowired
  48. private RabbitTemplate rabbitTemplate;
  49. @Override
  50. public PageInfo<CashRecordDTO> select(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
  51. PageHelper.startPage(pageNum, pageSize);
  52. // System.out.println(goldDetail.getMarkets());
  53. List<CashRecordDTO> list = cashRefundMapper.select(cashRecordDTO);
  54. return new PageInfo<>(list);
  55. }
  56. // 添加退款订单
  57. @Override
  58. public int add(CashRecordRefund cashRecordRefund) throws Exception {
  59. if (cashRecordRefund.getJwcode() == null) {
  60. throw new Exception("未输入精网号");
  61. }
  62. if (cashRecordRefund.getRefundModel() == null) {
  63. throw new Exception("请填充退款类型");
  64. }
  65. if (cashRecordRefund.getRefundReason() == null) {
  66. throw new Exception("请填写退款理由");
  67. }
  68. CashRecordDone cashRecordDonetwo = new CashRecordDone();
  69. cashRecordDonetwo.setAreaServise(cashRecordRefund.getAreaServise());
  70. cashRefundMapper.addAudit(cashRecordDonetwo);
  71. cashRecordRefund.setAuditId(cashRecordDonetwo.getId());
  72. cashRecordRefund.setStatus(10);
  73. //生成订单号后半部分
  74. String orderNumber = cashRecordRefund.getOrderCode();
  75. //构建订单信息
  76. cashRecordRefund.setOrderCode("TK" + orderNumber); //订单号
  77. cashRecordRefund.setMarket(String.valueOf(Integer.valueOf(marketMapper.getMarketId(cashRecordRefund.getMarket()))));
  78. cashRefundMapper.insert(cashRecordRefund);
  79. CashRecordDone cashRecordDone1 = new CashRecordDone();
  80. cashRecordDone1.setId(cashRecordRefund.getId());
  81. cashRecordDone1.setStatus(6);
  82. if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null)
  83. cashRefundMapper.updateStatus(cashRecordDone1);
  84. else return Result.error("提交失败").getCode();
  85. // 发送退款创建消息
  86. CashRefundMessage message = new CashRefundMessage();
  87. message.setId(cashRecordRefund.getId());
  88. message.setOrderCode(cashRecordRefund.getOrderCode());
  89. message.setStatus(10);
  90. message.setStatusDescription("地区财务待审核");
  91. message.setMessage("退款订单已创建");
  92. message.setSubmitterId(cashRecordRefund.getSubmitterId());
  93. message.setTimestamp(LocalDateTime.now());
  94. rabbitTemplate.convertAndSend(
  95. RabbitMQConfig.CASH_REFUND_EXCHANGE,
  96. "refund.created",
  97. message
  98. );
  99. return Result.success("提交成功").getCode();
  100. }
  101. // 更新退款订单信息
  102. @Override
  103. public int update(CashRecordDone cashRecordDone) throws Exception {
  104. if (cashRecordDone.getJwcode() == null) {
  105. throw new RuntimeException("未输入精网号");
  106. }
  107. if (cashRecordDone.getPaymentAmount() == null) {
  108. throw new RuntimeException("未输入付款金额");
  109. }
  110. if (cashRecordDone.getPaymentCurrency() == null) {
  111. throw new RuntimeException("未输入付款币种");
  112. }
  113. if (cashRecordDone.getRefundModel() == null) {
  114. throw new RuntimeException("请填写退款类型");
  115. }
  116. if (cashRecordDone.getRefundReason() == null) {
  117. throw new RuntimeException("请填写退款理由");
  118. }
  119. int result = cashRefundMapper.update(cashRecordDone);
  120. return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
  121. }
  122. // 撤回退款订单
  123. @Override
  124. public int withdraw(CashRecordDone cashRecordDone) {
  125. return cashRefundMapper.withdraw(cashRecordDone.getId());
  126. }
  127. // 审核退款订单
  128. @Override
  129. public int review(CashRecordDone cashRecordDone) throws Exception {
  130. if (cashRecordDone.getStatus() == 12 || cashRecordDone.getStatus() == 22) {
  131. if (cashRecordDone.getOrderCode() == null) {
  132. throw new RuntimeException("未输入订单号");
  133. }
  134. CashRecordDone cashRecordDone1 = new CashRecordDone();
  135. cashRecordDone1.setOrderCode(cashRecordDone.getOrderCode().substring(2));
  136. cashRecordDone1.setStatus(4);
  137. if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
  138. cashRefundMapper.updateStatus(cashRecordDone1);
  139. }
  140. }
  141. cashRefundMapper.updateAudit(cashRecordDone);
  142. int result = cashRefundMapper.review(cashRecordDone);
  143. if (result > 0) {
  144. // 发送审核消息
  145. CashRefundMessage message = new CashRefundMessage();
  146. message.setId(cashRecordDone.getId());
  147. message.setOrderCode(cashRecordDone.getOrderCode());
  148. message.setStatus(cashRecordDone.getStatus());
  149. message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus()));
  150. message.setMessage("退款订单已审核");
  151. message.setSubmitterId(cashRecordDone.getSubmitterId());
  152. message.setAuditId(cashRecordDone.getAuditId());
  153. // 可以通过 auditId 查询审核人姓名
  154. message.setTimestamp(LocalDateTime.now());
  155. if (cashRecordDone.getStatus() == 12 || cashRecordDone.getStatus() == 22) {
  156. rabbitTemplate.convertAndSend(
  157. RabbitMQConfig.CASH_REFUND_EXCHANGE,
  158. "refund.rejected",
  159. message
  160. );
  161. } else {
  162. rabbitTemplate.convertAndSend(
  163. RabbitMQConfig.CASH_REFUND_EXCHANGE,
  164. "refund.reviewed",
  165. message
  166. );
  167. }
  168. }
  169. return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
  170. }
  171. // 执行退款操作
  172. @Override
  173. public int executor(CashRecordDone cashRecordDone) throws Exception {
  174. if (cashRecordDone.getRefundVoucher() == null) {
  175. throw new RuntimeException("未输入退款凭证");
  176. }
  177. if (cashRecordDone.getRefundTime() == null) {
  178. throw new RuntimeException("未输入退款时间");
  179. }
  180. if (cashRecordDone.getRefundRemark() == null) {
  181. throw new RuntimeException("未输入退款备注");
  182. }
  183. if (cashRecordDone.getRefundChannels() == null) {
  184. throw new RuntimeException("未输入退款途径");
  185. }
  186. if (cashRecordDone.getRefundCurrency() == null) {
  187. throw new RuntimeException("未输入退款币种");
  188. }
  189. if (cashRecordDone.getRefundAmount() == null) {
  190. throw new RuntimeException("未输入退款金额");
  191. }
  192. int result = cashRefundMapper.executor(cashRecordDone);
  193. if (result > 0) {
  194. // 发送执行消息
  195. CashRefundMessage message = new CashRefundMessage();
  196. message.setId(cashRecordDone.getId());
  197. message.setOrderCode(cashRecordDone.getOrderCode());
  198. message.setStatus(cashRecordDone.getStatus());
  199. message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus()));
  200. message.setMessage("退款订单已执行");
  201. message.setSubmitterId(cashRecordDone.getSubmitterId());
  202. message.setExecutorId(cashRecordDone.getExecutor());
  203. // 可以通过 executorId 查询执行人姓名
  204. message.setTimestamp(LocalDateTime.now());
  205. rabbitTemplate.convertAndSend(
  206. RabbitMQConfig.CASH_REFUND_EXCHANGE,
  207. "refund.executed",
  208. message
  209. );
  210. }
  211. return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
  212. }
  213. // 更新退款订单状态
  214. @Override
  215. public int updateStatus(CashRecordDone cashRecordDone) {
  216. return cashRefundMapper.updateStatus(cashRecordDone);
  217. }
  218. // 最终审核退款订单
  219. @Override
  220. public int finalreview(CashRecordDone cashRecordDone) {
  221. if (cashRecordDone.getPermanentGold() == null) {
  222. cashRecordDone.setPermanentGold(0);
  223. }
  224. if (cashRecordDone.getFreeGold() == null) {
  225. cashRecordDone.setFreeGold(0);
  226. }
  227. if (cashRecordDone.getStatus() == 32) {
  228. CashRecordDone cashRecordDone1 = new CashRecordDone();
  229. cashRecordDone1.setOrderCode(cashRecordDone.getOrderCode().substring(2));
  230. cashRecordDone1.setStatus(4);
  231. if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
  232. cashRefundMapper.updateStatus(cashRecordDone1);
  233. }
  234. }
  235. if (cashRecordDone.getGoodsName() != null && cashRecordDone.getStatus() == 40 &&
  236. (cashRecordDone.getGoodsName().equals("金币充值") ||
  237. cashRecordDone.getGoodsName().contains("金币充值"))) {
  238. UserGoldRecord userGoldRecord = new UserGoldRecord();
  239. userGoldRecord.setOrderCode(cashRecordDone.getOrderCode());
  240. userGoldRecord.setType((byte) 2);
  241. userGoldRecord.setIsRefund((byte) 1);
  242. userGoldRecord.setRefundType("金币退款");
  243. userGoldRecord.setCrefundModel(cashRecordDone.getRefundModel());
  244. userGoldRecord.setJwcode(cashRecordDone.getJwcode());
  245. userGoldRecord.setSumGold(cashRecordDone.getPermanentGold() + cashRecordDone.getFreeGold());
  246. userGoldRecord.setPermanentGold(cashRecordDone.getPermanentGold());
  247. int currentMonth = LocalDate.now().getMonthValue();
  248. if (currentMonth >= 1 && currentMonth <= 6) {
  249. // 1-6月:设置12月额度,6月保持默认值
  250. userGoldRecord.setFreeJune(0);
  251. userGoldRecord.setFreeDecember(cashRecordDone.getFreeGold());
  252. } else {
  253. // 7-12月:设置6月额度,12月保持默认值
  254. userGoldRecord.setFreeJune(cashRecordDone.getFreeGold());
  255. userGoldRecord.setFreeDecember(0);
  256. }
  257. userGoldRecord.setGoodsName(cashRecordDone.getGoodsName());
  258. userGoldRecord.setPayPlatform("金币系统");
  259. userGoldRecord.setRemark(cashRecordDone.getRemark());
  260. userGoldRecord.setAdminId(cashRecordDone.getAuditId());
  261. userGoldRecord.setAuditStatus(1);
  262. userGoldRecord.setTaskGold(0);
  263. userGoldRecord.setCreateTime(new Date());
  264. userGoldRecord.setUpdateTime(new Date());
  265. String auditName = auditMapper.getName(cashRecordDone.getAuditId());
  266. refundMapper.add(userGoldRecord);
  267. User user = new User();
  268. user.setJwcode(userGoldRecord.getJwcode());
  269. user.setCurrentPermanentGold(BigDecimal.valueOf(-userGoldRecord.getPermanentGold())); //当前永久金币
  270. user.setCurrentFreeJune(BigDecimal.valueOf(-userGoldRecord.getFreeJune())); //当前六月免费金币
  271. user.setCurrentFreeDecember(BigDecimal.valueOf(-userGoldRecord.getFreeDecember())); //当前十二月免费金币
  272. auditMapper.updateUserGold(user);
  273. GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 58, //退款免费+永久金币-充值
  274. (double) (userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getPermanentGold()) / 100,
  275. userGoldRecord.getRemark(), (double) userGoldRecord.getPermanentGold() / 100, auditName, "退款金币充值");
  276. }
  277. cashRefundMapper.updateAudit(cashRecordDone);
  278. int result = cashRefundMapper.review(cashRecordDone);
  279. if (result > 0) {
  280. // 发送最终审核消息
  281. CashRefundMessage message = new CashRefundMessage();
  282. message.setId(cashRecordDone.getId());
  283. message.setOrderCode(cashRecordDone.getOrderCode());
  284. message.setStatus(cashRecordDone.getStatus());
  285. message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus()));
  286. message.setMessage("退款订单已完成");
  287. message.setSubmitterId(cashRecordDone.getSubmitterId());
  288. message.setAuditId(cashRecordDone.getAuditId());
  289. message.setTimestamp(LocalDateTime.now());
  290. rabbitTemplate.convertAndSend(
  291. RabbitMQConfig.CASH_REFUND_EXCHANGE,
  292. "refund.completed",
  293. message
  294. );
  295. }
  296. return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
  297. }
  298. // 辅助方法:根据状态码获取状态描述
  299. private String getStatusDescription(Integer status) {
  300. switch (status) {
  301. case 10:
  302. return "地区财务待审核";
  303. case 11:
  304. return "地区财务手动撤回待编辑提交";
  305. case 12:
  306. return "地区财务驳回";
  307. case 20:
  308. return "地区负责人待审核";
  309. case 22:
  310. return "地区负责人驳回";
  311. case 30:
  312. return "总部财务待审核";
  313. case 32:
  314. return "总部财务驳回";
  315. case 40:
  316. return "执行人待处理";
  317. case 41:
  318. return "执行人已处理,退款结束";
  319. default:
  320. return "未知状态";
  321. }
  322. }
  323. // 财务查询退款订单列表
  324. @Override
  325. public PageInfo<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
  326. PageHelper.startPage(pageNum, pageSize);
  327. // System.out.println(goldDetail.getMarkets());
  328. List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO);
  329. return new PageInfo<>(list);
  330. }
  331. @Override
  332. public PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
  333. PageHelper.startPage(pageNum, pageSize);
  334. List<CashRecordDTO> list = cashRefundMapper.exSelect(cashRecordDTO);
  335. return new PageInfo<>(list);
  336. }
  337. @Override
  338. public void addOnline(CashRecordRefund cashRecordRefund) {
  339. }
  340. }