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.

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