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.

866 lines
41 KiB

6 months ago
5 months ago
6 months ago
5 months ago
6 months ago
6 months ago
5 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
5 months ago
6 months ago
5 months ago
6 months ago
5 months ago
6 months ago
5 months ago
6 months ago
5 months ago
5 months ago
5 months ago
6 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
6 months ago
  1. package com.example.demo.serviceImpl.cash;
  2. import com.example.demo.Util.LanguageTranslationUtil;
  3. import com.example.demo.Util.SimpleIdGenerator;
  4. import com.example.demo.domain.entity.*;
  5. import com.example.demo.Util.BusinessException;
  6. import com.example.demo.Util.GoldTistV2;
  7. import com.example.demo.config.RabbitMQConfig;
  8. import com.example.demo.domain.vo.bean.Region;
  9. import com.example.demo.domain.vo.cash.*;
  10. import com.example.demo.domain.vo.coin.Messages;
  11. import com.example.demo.domain.vo.coin.Result;
  12. import com.example.demo.exception.SystemException;
  13. import com.example.demo.mapper.cash.CashCollectionMapper;
  14. import com.example.demo.mapper.cash.CashRefundMapper;
  15. import com.example.demo.mapper.coin.AuditMapper;
  16. import com.example.demo.mapper.coin.MarketMapper;
  17. import com.example.demo.mapper.coin.OperationLogMapper;
  18. import com.example.demo.mapper.coin.RefundMapper;
  19. import com.example.demo.service.Wallet.WalletService;
  20. import com.example.demo.service.cash.RefundService;
  21. import com.example.demo.service.coin.TranslationService;
  22. import com.github.pagehelper.PageHelper;
  23. import com.github.pagehelper.PageInfo;
  24. import lombok.extern.slf4j.Slf4j;
  25. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.transaction.annotation.Transactional;
  29. import org.springframework.web.bind.annotation.RequestHeader;
  30. import com.example.demo.domain.DTO.Currency;
  31. import java.math.BigDecimal;
  32. import java.math.RoundingMode;
  33. import java.time.LocalDate;
  34. import java.util.*;
  35. import java.util.function.Function;
  36. import java.util.stream.Collectors;
  37. import static org.apache.commons.lang3.StringUtils.substring;
  38. /**
  39. * @program: GOLD
  40. * @ClassName CashRefundServiceImpl
  41. * @description:
  42. * @author: huangqizhen
  43. * @create: 202509-28 15:02
  44. * @Version 1.0
  45. **/
  46. @Service
  47. @Slf4j
  48. public class CashRefundServiceImpl implements RefundService {
  49. @Autowired
  50. private CashRefundMapper cashRefundMapper;
  51. @Autowired
  52. private RefundMapper refundMapper;
  53. @Autowired
  54. private AuditMapper auditMapper;
  55. @Autowired
  56. private MarketMapper marketMapper;
  57. @Autowired
  58. private RabbitTemplate rabbitTemplate;
  59. @Autowired
  60. private OperationLogMapper operationLogMapper;
  61. @Autowired
  62. private CashCollectionMapper cashCollectionMapper;
  63. @Autowired
  64. private LanguageTranslationUtil languageTranslationUtil;
  65. @Autowired
  66. private WalletService walletService;
  67. @Autowired
  68. private TranslationService translationService;
  69. @Override
  70. public PageInfo<CashRecordDTO> select(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
  71. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  72. List<CashRecordDTO> list = cashRefundMapper.select(cashRecordDTO);
  73. if (list.isEmpty()) {
  74. return new PageInfo<>(list);
  75. }
  76. // 批量收集ID
  77. Set<Integer> relatedIds = new HashSet<>();
  78. Set<Integer> marketIds = new HashSet<>();
  79. Set<Integer> submitterIds = new HashSet<>();
  80. Set<Integer> auditIds = new HashSet<>();
  81. Set<Integer> executorIds = new HashSet<>();
  82. list.forEach(item -> {
  83. if (item.getRelatedId() != null) relatedIds.add(item.getRelatedId());
  84. if (item.getMarket() != null) marketIds.add(item.getMarket());
  85. if (item.getSubmitterId() != null) submitterIds.add(item.getSubmitterId());
  86. if (item.getAuditId() != null) auditIds.add(item.getAuditId());
  87. if (item.getExecutor() != null) executorIds.add(item.getExecutor());
  88. });
  89. // 批量查询
  90. Map<Integer, CashCollection> cashCollectionMap = cashCollectionMapper.selectBatchIds(relatedIds)
  91. .stream().collect(Collectors.toMap(CashCollection::getId, Function.identity()));
  92. Map<Integer, String> marketNameMap = marketMapper.getMarketByIds(marketIds)
  93. .stream().collect(Collectors.toMap(Market::getId, Market::getName));
  94. Map<Integer, String> submitterNameMap = auditMapper.getNamesByIds(submitterIds)
  95. .stream().collect(Collectors.toMap(Admin::getId, Admin::getAdminName));
  96. Map<Integer, LhlAudit> auditMap = cashRefundMapper.getAuditBatch(auditIds)
  97. .stream().collect(Collectors.toMap(LhlAudit::getId, Function.identity()));
  98. Map<String, String> executorNameMap = auditMapper.getNamesByJwcodes(executorIds)
  99. .stream().collect(Collectors.toMap(Admin::getAccount, Admin::getAdminName));
  100. // 处理数据
  101. list.forEach(item -> {
  102. CashCollection cashCollection = cashCollectionMap.get(item.getRelatedId());
  103. if (cashCollection != null) {
  104. processCashCollection(item, cashCollection);
  105. }
  106. String marketName = marketNameMap.get(item.getMarket());
  107. String submitter = submitterNameMap.get(item.getSubmitterId());
  108. LhlAudit lhlAudit = auditMap.get(item.getAuditId());
  109. String executorName = executorNameMap.get(String.valueOf(item.getExecutor()));
  110. item.setMarketName(marketName != null ? marketName : "");
  111. item.setSubmitter(submitter != null ? submitter : "");
  112. item.setExecutorName(executorName != null ? executorName : "");
  113. if (lhlAudit != null) {
  114. item.setAreaServise(lhlAudit.getAreaServise());
  115. item.setAreaFinance(lhlAudit.getAreaFinance());
  116. item.setAreaCharge(lhlAudit.getAreaCharge());
  117. item.setHeadFinance(lhlAudit.getHeadFinance());
  118. }
  119. });
  120. return new PageInfo<>(list);
  121. }
  122. private void processCashCollection(CashRecordDTO item, CashCollection cashCollection) {
  123. // 设置默认值
  124. Integer freeGold = cashCollection.getFreeGold() != null ? cashCollection.getFreeGold() : 0;
  125. Integer permanentGold = cashCollection.getPermanentGold() != null ? cashCollection.getPermanentGold() : 0;
  126. BigDecimal free = new BigDecimal(freeGold).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
  127. BigDecimal permanent = new BigDecimal(permanentGold).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
  128. item.setGold(permanent);
  129. item.setFree(free);
  130. item.setActivity(cashCollection.getActivity());
  131. item.setPaymentCurrency(cashCollection.getPaymentCurrency());
  132. if (cashCollection.getPaymentCurrency() != null) {
  133. item.setPaymentAmount(cashCollection.getPaymentAmount().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
  134. } else item.setPaymentAmount(cashCollection.getPaymentAmount());
  135. item.setReceivedCurrency(cashCollection.getReceivedCurrency());
  136. if (cashCollection.getReceivedCurrency() != null) {
  137. item.setReceivedAmount(cashCollection.getReceivedAmount().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
  138. } else item.setReceivedAmount(cashCollection.getReceivedAmount());
  139. item.setPayType(cashCollection.getPayType());
  140. item.setPayTime(cashCollection.getPayTime());
  141. item.setPayBankCode(cashCollection.getBankCode());
  142. item.setPaySubmitter(cashCollection.getSubmitterName());
  143. item.setAudit(cashCollection.getAuditName());
  144. item.setReceivedTime(cashCollection.getReceivedTime());
  145. item.setPayVoucher(cashCollection.getVoucher());
  146. item.setPayRemark(cashCollection.getRemark());
  147. item.setHandlingCharge(cashCollection.getHandlingCharge().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
  148. // 处理金币金额
  149. if (item.getPermanentGold() != null) {
  150. item.setPermanentGold(item.getPermanentGold().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
  151. }
  152. if (item.getFreeGold() != null) {
  153. item.setFreeGold(item.getFreeGold().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
  154. }
  155. }
  156. @Override
  157. public int add(CashRecordRefund cashRecordRefund, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
  158. try {
  159. if (cashRecordRefund.getJwcode() == null) {
  160. throw new Exception("未输入精网号");
  161. }
  162. if (cashRecordRefund.getRefundModel() == null) {
  163. throw new Exception("请填充退款类型");
  164. }
  165. if (cashRecordRefund.getRefundReason() == null) {
  166. throw new Exception("请填写退款理由");
  167. }
  168. if (cashRecordRefund.getHandlingCharge() == null) {
  169. throw new Exception("请先填写手续费");
  170. }
  171. if (cashRecordRefund.getMarket() == null || cashRecordRefund.getMarket().trim().isEmpty()) {
  172. throw new Exception("请选择所属地区");
  173. }
  174. CashRecordDone cashRecordDonetwo = new CashRecordDone();
  175. cashRecordDonetwo.setAreaServise(cashRecordRefund.getAreaServise());
  176. cashRefundMapper.addAudit(cashRecordDonetwo);
  177. cashRecordRefund.setAuditId(cashRecordDonetwo.getId());
  178. cashRecordRefund.setStatus(10);
  179. //生成订单号后半部分
  180. String orderNumber = cashRecordRefund.getOrderCode();
  181. //构建订单信息
  182. cashRecordRefund.setOrderCode("TK" + orderNumber); //订单号
  183. // 查询市场 ID,增加空值检查和多语言支持
  184. String marketName = cashRecordRefund.getMarket();
  185. String marketId = marketMapper.getMarketId(marketName);
  186. // 如果直接查询失败,尝试将英文名称转换为中文后再次查询
  187. if (marketId == null || marketId.trim().isEmpty()) {
  188. String chineseMarketName = translationService.findChineseSimplifiedByTranslation(marketName, "en");
  189. if (chineseMarketName != null && !chineseMarketName.equals(marketName)) {
  190. marketId = marketMapper.getMarketId(chineseMarketName);
  191. }
  192. }
  193. if (marketId == null || marketId.trim().isEmpty()) {
  194. throw new Exception("无效的所属地区:" + cashRecordRefund.getMarket());
  195. }
  196. cashRecordRefund.setMarket(String.valueOf(Integer.valueOf(marketId)));
  197. cashRefundMapper.insert(cashRecordRefund);
  198. CashRecordDone cashRecordDone1 = new CashRecordDone();
  199. cashRecordDone1.setId(cashRecordRefund.getOriginalOrderId());
  200. cashRecordDone1.setStatus(6);
  201. if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
  202. cashRefundMapper.updateStatus(cashRecordDone1);
  203. } else {
  204. return Result.error("提交失败").getCode();
  205. }
  206. // 发送退款创建消息
  207. Messages message = new Messages();
  208. message.setJwcode(cashRecordRefund.getJwcode());
  209. message.setName(cashRecordRefund.getName());
  210. message.setStatus(cashRecordRefund.getStatus());
  211. message.setDesc("的客服退款申请待审核,前往处理");
  212. message.setTitle("现金退款--新增退款");
  213. message.setType(0);
  214. message.setTypeId(cashRecordRefund.getId());
  215. message.setMarket(Integer.valueOf(cashRecordRefund.getMarket()));
  216. String marketName2 = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
  217. message.setMarketName(marketName2);
  218. message.setQueryId(103);
  219. rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
  220. return Result.success("提交成功").getCode();
  221. } catch (Exception e) {
  222. log.error("add error", e);
  223. throw e;
  224. }
  225. }
  226. @Override
  227. public int update(CashRecordDone cashRecordDone) throws Exception {
  228. if (cashRecordDone.getJwcode() == null) {
  229. throw new RuntimeException("未输入精网号");
  230. }
  231. if (cashRecordDone.getPaymentAmount() == null) {
  232. throw new RuntimeException("未输入付款金额");
  233. }
  234. if (cashRecordDone.getPaymentCurrency() == null) {
  235. throw new RuntimeException("未输入付款币种");
  236. }
  237. if (cashRecordDone.getRefundModel() == null) {
  238. throw new RuntimeException("请填写退款类型");
  239. }
  240. if (cashRecordDone.getRefundReason() == null) {
  241. throw new RuntimeException("请填写退款理由");
  242. }
  243. if (cashRecordDone.getNewRefundGold() == null) {
  244. cashRecordDone.setNewRefundGold(BigDecimal.valueOf(0));
  245. }
  246. if (cashRecordDone.getNewRefundFree() == null) {
  247. cashRecordDone.setNewRefundFree(BigDecimal.valueOf(0));
  248. }
  249. int result = cashRefundMapper.update(cashRecordDone);
  250. CashRecordDTO cashRecordDTO = cashRefundMapper.selectById(cashRecordDone.getId());
  251. if (result > 0) {
  252. // 发送审核消息
  253. Messages message = new Messages();
  254. message.setJwcode(cashRecordDTO.getJwcode());
  255. message.setName(cashRecordDTO.getName());
  256. message.setStatus(cashRecordDTO.getStatus());
  257. message.setDesc("的退款申请待审核,前往处理");
  258. message.setTitle("现金管理--退款审批");
  259. message.setType(1);
  260. message.setTypeId(cashRecordDTO.getId());
  261. message.setMarket(cashRecordDTO.getMarket());
  262. String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
  263. message.setMarketName(marketName);
  264. message.setQueryId(103);
  265. rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
  266. }
  267. return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
  268. }
  269. @Override
  270. public int withdraw(CashRecordDone cashRecordDone) {
  271. // 撤回订单
  272. int result = cashRefundMapper.withdraw(cashRecordDone.getId());
  273. if (result > 0) {
  274. // 更新与该订单关联的消息记录的flag字段为1
  275. cashRefundMapper.updateMessageFlagByOrderId(cashRecordDone.getId());
  276. }
  277. return result;
  278. }
  279. @Override
  280. public int review(CashRecordDone cashRecordDone, @RequestHeader(defaultValue = "zh_CN") String lang) throws Exception {
  281. if (cashRecordDone.getStatus() == 12 || cashRecordDone.getStatus() == 22) {
  282. if (cashRecordDone.getOrderCode() == null) {
  283. throw new RuntimeException("未输入订单号");
  284. }
  285. CashRecordDone cashRecordDone1 = new CashRecordDone();
  286. cashRecordDone1.setId(cashRecordDone.getRelatedId());
  287. cashRecordDone1.setOrderCode(cashRecordDone.getOrderCode().substring(2));
  288. cashRecordDone1.setStatus(4);
  289. if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
  290. cashRefundMapper.updateStatus(cashRecordDone1);
  291. }
  292. }
  293. cashRefundMapper.updateAudit(cashRecordDone);
  294. int result = cashRefundMapper.review(cashRecordDone);
  295. CashRecordDTO cashRecordDTO = cashRefundMapper.selectById(cashRecordDone.getId());
  296. if (result > 0) {
  297. // 发送审核消息
  298. Messages message = new Messages();
  299. message.setJwcode(cashRecordDTO.getJwcode());
  300. message.setName(cashRecordDTO.getName());
  301. message.setStatus(cashRecordDTO.getStatus());
  302. if (cashRecordDTO.getStatus()==20) {
  303. message.setDesc("的现金退款申请待审批,前往处理");
  304. message.setTitle("现金管理--退款审批(负责人)");
  305. message.setQueryId(107);
  306. } else if (cashRecordDTO.getStatus()==30) {
  307. message.setDesc("的现金退款申请待审核,前往处理");
  308. message.setTitle("现金管理--退款审批(总部财务)");
  309. message.setQueryId(111);
  310. } else {
  311. message.setDesc("的现金退款申请已被驳回,前往查看详情");
  312. message.setTitle("现金管理--退款提交");
  313. message.setQueryId(99);
  314. }
  315. message.setType(1);
  316. message.setTypeId(cashRecordDTO.getId());
  317. message.setMarket(cashRecordDTO.getMarket());
  318. String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
  319. message.setMarketName(marketName);
  320. rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
  321. }
  322. return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
  323. }
  324. @Override
  325. public int executor(CashRecordDone cashRecordDone) throws Exception {
  326. if (cashRecordDone.getRefundVoucher() == null) {
  327. throw new RuntimeException("未输入退款凭证");
  328. }
  329. if (cashRecordDone.getRefundTime() == null) {
  330. throw new RuntimeException("未输入退款时间");
  331. }
  332. if (cashRecordDone.getRefundRemark() == null) {
  333. throw new RuntimeException("未输入退款备注");
  334. }
  335. if (cashRecordDone.getRefundChannels() == null) {
  336. throw new RuntimeException("未输入退款途径");
  337. }
  338. if (cashRecordDone.getRefundCurrency() == null) {
  339. throw new RuntimeException("未输入退款币种");
  340. }
  341. if (cashRecordDone.getRefundAmount() == null) {
  342. throw new RuntimeException("未输入退款金额");
  343. }
  344. int result = cashRefundMapper.executor(cashRecordDone);
  345. return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
  346. }
  347. @Override
  348. public int updateStatus(CashRecordDone cashRecordDone) {
  349. return cashRefundMapper.updateStatus(cashRecordDone);
  350. }
  351. @Override
  352. public int finalreview(CashRecordDone cashRecordDone, @RequestHeader(defaultValue = "zh_CN") String lang) {
  353. if (cashRecordDone.getPermanentGold() == null) {
  354. cashRecordDone.setPermanentGold(0);
  355. }
  356. if (cashRecordDone.getFreeGold() == null) {
  357. cashRecordDone.setFreeGold(0);
  358. }
  359. if (cashRecordDone.getStatus() == 32) {
  360. CashRecordDone cashRecordDone1 = new CashRecordDone();
  361. cashRecordDone1.setOrderCode(cashRecordDone.getOrderCode().substring(2));
  362. cashRecordDone1.setStatus(4);
  363. if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
  364. cashRefundMapper.updateStatus(cashRecordDone1);
  365. }
  366. }
  367. if (cashRecordDone.getGoodsName() != null && cashRecordDone.getStatus() == 40 &&
  368. (cashRecordDone.getGoodsName().equals(languageTranslationUtil.translate("金币充值", lang)) ||
  369. cashRecordDone.getGoodsName().contains(languageTranslationUtil.translate("金币充值", lang)))) {
  370. UserGoldRecord userGoldRecord = new UserGoldRecord();
  371. userGoldRecord.setOrderCode(cashRecordDone.getOrderCode());
  372. String orderCode = cashRecordDone.getOrderCode();
  373. if (orderCode != null && orderCode.length() > 4 && orderCode.startsWith("TKXJ")) {
  374. orderCode = "XJCZ" + orderCode.substring(4);
  375. }
  376. userGoldRecord.setType((byte) 2);
  377. userGoldRecord.setIsRefund((byte) 1);
  378. userGoldRecord.setRefundType("金币退款");
  379. if (cashRecordDone.getRefundModel() == 1) {
  380. userGoldRecord.setRefundModel(Byte.valueOf("1"));
  381. } else if (cashRecordDone.getRefundModel() == 0) {
  382. userGoldRecord.setRefundModel(Byte.valueOf("0"));
  383. }
  384. userGoldRecord.setJwcode(cashRecordDone.getJwcode());
  385. userGoldRecord.setSumGold(cashRecordDone.getPermanentGold() + cashRecordDone.getFreeGold());
  386. userGoldRecord.setPermanentGold(cashRecordDone.getPermanentGold());
  387. int currentMonth = LocalDate.now().getMonthValue();
  388. if (currentMonth >= 1 && currentMonth <= 6) {
  389. // 1-6月:设置12月额度,6月保持默认值
  390. userGoldRecord.setFreeJune(0);
  391. userGoldRecord.setFreeDecember(cashRecordDone.getFreeGold());
  392. } else {
  393. // 7-12月:设置6月额度,12月保持默认值
  394. userGoldRecord.setFreeJune(cashRecordDone.getFreeGold());
  395. userGoldRecord.setFreeDecember(0);
  396. }
  397. userGoldRecord.setGoodsName("金币充值");
  398. userGoldRecord.setPayPlatform("金币系统");
  399. userGoldRecord.setRemark(cashRecordDone.getRemark());
  400. userGoldRecord.setAdminId(cashRecordDone.getAdminId());
  401. userGoldRecord.setAuditStatus(1);
  402. userGoldRecord.setTaskGold(0);
  403. userGoldRecord.setCreateTime(new Date());
  404. userGoldRecord.setUpdateTime(new Date());
  405. String auditName = auditMapper.getName(cashRecordDone.getAuditId());
  406. refundMapper.add(userGoldRecord);
  407. cashRefundMapper.updategold(orderCode);
  408. User user = new User();
  409. user.setJwcode(userGoldRecord.getJwcode());
  410. user.setCurrentPermanentGold(BigDecimal.valueOf(-userGoldRecord.getPermanentGold())); //当前永久金币
  411. user.setCurrentFreeJune(BigDecimal.valueOf(-userGoldRecord.getFreeJune())); //当前六月免费金币
  412. user.setCurrentFreeDecember(BigDecimal.valueOf(-userGoldRecord.getFreeDecember())); //当前十二月免费金币
  413. auditMapper.updateUserGold(user);
  414. //钱包更新
  415. List<UserWalletRecord> userWalletList = walletService.selectUserWalletRecord(userGoldRecord.getJwcode(), orderCode);
  416. UserRegionWallet userRegionWallet = new UserRegionWallet();
  417. for (UserWalletRecord userWalletRecord : userWalletList){
  418. userRegionWallet.setJwcode(userWalletRecord.getJwcode());
  419. userRegionWallet.setWalletId(userWalletRecord.getWalletId());
  420. userRegionWallet.setCurrentPermanentGold(BigDecimal.valueOf(userWalletRecord.getAmount()));
  421. walletService.updateUserGoldRecord(userRegionWallet);
  422. walletService.updateUserWalletRecord(userWalletRecord.getId());
  423. }
  424. GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 58, //退款免费+永久金币-充值
  425. (double) (userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getPermanentGold()) / 100, SimpleIdGenerator.generateId(),
  426. userGoldRecord.getRemark(), (double) userGoldRecord.getPermanentGold() / 100, auditName, "退款金币充值");
  427. }
  428. cashRefundMapper.updateAudit(cashRecordDone);
  429. int result = cashRefundMapper.review(cashRecordDone);
  430. CashRecordDTO cashRecordDTO = cashRefundMapper.selectById(cashRecordDone.getId());
  431. if (result > 0) {
  432. // 发送审核消息
  433. Messages message = new Messages();
  434. message.setJwcode(cashRecordDTO.getJwcode());
  435. message.setName(cashRecordDTO.getName());
  436. message.setStatus(cashRecordDTO.getStatus());
  437. message.setDesc(cashRecordDTO.getStatus() != 32 ? "的退款记录需填写执行明细,前往查看处理" : "的现金退款申请已被驳回,前往查看详情");
  438. message.setTitle(cashRecordDTO.getStatus() != 32 ? "现金管理--执行明细填写":"现金管理--退款提交");
  439. message.setType(1);
  440. message.setTypeId(cashRecordDTO.getId());
  441. message.setMarket(cashRecordDTO.getMarket());
  442. String marketName = marketMapper.getMarketNameById(String.valueOf(message.getMarket()));
  443. message.setMarketName(marketName);
  444. message.setQueryId(cashRecordDTO.getStatus() != 32 ? 115:99);
  445. if (cashRecordDTO.getStatus() != 32) {
  446. log.info("Setting executor to: {}", cashRecordDTO.getExecutor());
  447. message.setExecutor(cashRecordDTO.getExecutor());
  448. log.info("Executor after setting: {}", message.getExecutor());
  449. }
  450. rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", message);
  451. }
  452. return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode();
  453. }
  454. @Override
  455. public PageInfo<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
  456. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  457. // System.out.println(goldDetail.getMarkets());
  458. List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO);
  459. if (list.isEmpty()) {
  460. return new PageInfo<>(list);
  461. }
  462. // 批量收集ID
  463. Set<Integer> relatedIds = new HashSet<>();
  464. Set<Integer> marketIds = new HashSet<>();
  465. Set<Integer> submitterIds = new HashSet<>();
  466. Set<Integer> auditIds = new HashSet<>();
  467. Set<Integer> executorIds = new HashSet<>();
  468. list.forEach(item -> {
  469. if (item.getRelatedId() != null) relatedIds.add(item.getRelatedId());
  470. if (item.getMarket() != null) marketIds.add(item.getMarket());
  471. if (item.getSubmitterId() != null) submitterIds.add(item.getSubmitterId());
  472. if (item.getAuditId() != null) auditIds.add(item.getAuditId());
  473. if (item.getExecutor() != null) executorIds.add(item.getExecutor());
  474. });
  475. // 批量查询
  476. Map<Integer, CashCollection> cashCollectionMap = cashCollectionMapper.selectBatchIds(relatedIds)
  477. .stream().collect(Collectors.toMap(CashCollection::getId, Function.identity()));
  478. Map<Integer, String> marketNameMap = marketMapper.getMarketByIds(marketIds)
  479. .stream().collect(Collectors.toMap(Market::getId, Market::getName));
  480. Map<Integer, String> submitterNameMap = auditMapper.getNamesByIds(submitterIds)
  481. .stream().collect(Collectors.toMap(Admin::getId, Admin::getAdminName));
  482. Map<Integer, LhlAudit> auditMap = cashRefundMapper.getAuditBatch(auditIds)
  483. .stream().collect(Collectors.toMap(LhlAudit::getId, Function.identity()));
  484. Map<String, String> executorNameMap = auditMapper.getNamesByJwcodes(executorIds)
  485. .stream().collect(Collectors.toMap(Admin::getAccount, Admin::getAdminName));
  486. // 处理数据
  487. list.forEach(item -> {
  488. CashCollection cashCollection = cashCollectionMap.get(item.getRelatedId());
  489. if (cashCollection != null) {
  490. processCashCollection(item, cashCollection);
  491. }
  492. String marketName = marketNameMap.get(item.getMarket());
  493. String submitter = submitterNameMap.get(item.getSubmitterId());
  494. LhlAudit lhlAudit = auditMap.get(item.getAuditId());
  495. String executorName = executorNameMap.get(String.valueOf(item.getExecutor()));
  496. item.setMarketName(marketName != null ? marketName : "");
  497. item.setSubmitter(submitter != null ? submitter : "");
  498. item.setExecutorName(executorName != null ? executorName : "");
  499. if (lhlAudit != null) {
  500. item.setAreaServise(lhlAudit.getAreaServise());
  501. item.setAreaFinance(lhlAudit.getAreaFinance());
  502. item.setAreaCharge(lhlAudit.getAreaCharge());
  503. item.setHeadFinance(lhlAudit.getHeadFinance());
  504. }
  505. });
  506. return new PageInfo<>(list);
  507. }
  508. @Override
  509. public PageInfo<CashRecordDTO> financeSelect2(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
  510. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  511. // System.out.println(goldDetail.getMarkets());
  512. List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO);
  513. if (list.isEmpty()) {
  514. return new PageInfo<>(list);
  515. }
  516. // 批量收集ID
  517. Set<Integer> relatedIds = new HashSet<>();
  518. Set<Integer> marketIds = new HashSet<>();
  519. Set<Integer> submitterIds = new HashSet<>();
  520. Set<Integer> auditIds = new HashSet<>();
  521. Set<Integer> executorIds = new HashSet<>();
  522. list.forEach(item -> {
  523. if (item.getRelatedId() != null) relatedIds.add(item.getRelatedId());
  524. if (item.getMarket() != null) marketIds.add(item.getMarket());
  525. if (item.getSubmitterId() != null) submitterIds.add(item.getSubmitterId());
  526. if (item.getAuditId() != null) auditIds.add(item.getAuditId());
  527. if (item.getExecutor() != null) executorIds.add(item.getExecutor());
  528. });
  529. // 批量查询
  530. Map<Integer, CashCollection> cashCollectionMap = cashCollectionMapper.selectBatchIds(relatedIds)
  531. .stream().collect(Collectors.toMap(CashCollection::getId, Function.identity()));
  532. Map<Integer, String> marketNameMap = marketMapper.getMarketByIds(marketIds)
  533. .stream().collect(Collectors.toMap(Market::getId, Market::getName));
  534. Map<Integer, String> submitterNameMap = auditMapper.getNamesByIds(submitterIds)
  535. .stream().collect(Collectors.toMap(Admin::getId, Admin::getAdminName));
  536. Map<Integer, LhlAudit> auditMap = cashRefundMapper.getAuditBatch(auditIds)
  537. .stream().collect(Collectors.toMap(LhlAudit::getId, Function.identity()));
  538. Map<String, String> executorNameMap = auditMapper.getNamesByJwcodes(executorIds)
  539. .stream().collect(Collectors.toMap(Admin::getAccount, Admin::getAdminName));
  540. // 处理数据
  541. list.forEach(item -> {
  542. CashCollection cashCollection = cashCollectionMap.get(item.getRelatedId());
  543. if (cashCollection != null) {
  544. processCashCollection(item, cashCollection);
  545. }
  546. String marketName = marketNameMap.get(item.getMarket());
  547. String submitter = submitterNameMap.get(item.getSubmitterId());
  548. LhlAudit lhlAudit = auditMap.get(item.getAuditId());
  549. String executorName = executorNameMap.get(String.valueOf(item.getExecutor()));
  550. item.setMarketName(marketName != null ? marketName : "");
  551. item.setSubmitter(submitter != null ? submitter : "");
  552. item.setExecutorName(executorName != null ? executorName : "");
  553. if (lhlAudit != null) {
  554. item.setAreaServise(lhlAudit.getAreaServise());
  555. item.setAreaFinance(lhlAudit.getAreaFinance());
  556. item.setAreaCharge(lhlAudit.getAreaCharge());
  557. item.setHeadFinance(lhlAudit.getHeadFinance());
  558. }
  559. });
  560. return new PageInfo<>(list);
  561. }
  562. @Override
  563. public PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
  564. PageHelper.startPage(pageNum, pageSize); //必须要直接跟mapper
  565. // System.out.println(goldDetail.getMarkets());
  566. List<CashRecordDTO> list = cashRefundMapper.exSelect(cashRecordDTO);
  567. System.out.println(list);
  568. if (list.isEmpty()) {
  569. return new PageInfo<>(list);
  570. }
  571. // 批量收集ID
  572. Set<Integer> relatedIds = new HashSet<>();
  573. Set<Integer> marketIds = new HashSet<>();
  574. Set<Integer> submitterIds = new HashSet<>();
  575. Set<Integer> auditIds = new HashSet<>();
  576. Set<Integer> executorIds = new HashSet<>();
  577. list.forEach(item -> {
  578. if (item.getRelatedId() != null) relatedIds.add(item.getRelatedId());
  579. if (item.getMarket() != null) marketIds.add(item.getMarket());
  580. if (item.getSubmitterId() != null) submitterIds.add(item.getSubmitterId());
  581. if (item.getAuditId() != null) auditIds.add(item.getAuditId());
  582. if (item.getExecutor() != null) executorIds.add(item.getExecutor());
  583. });
  584. // 批量查询
  585. Map<Integer, CashCollection> cashCollectionMap = cashCollectionMapper.selectBatchIds(relatedIds)
  586. .stream().collect(Collectors.toMap(CashCollection::getId, Function.identity()));
  587. Map<Integer, String> marketNameMap = marketMapper.getMarketByIds(marketIds)
  588. .stream().collect(Collectors.toMap(Market::getId, Market::getName));
  589. Map<Integer, String> submitterNameMap = auditMapper.getNamesByIds(submitterIds)
  590. .stream().collect(Collectors.toMap(Admin::getId, Admin::getAdminName));
  591. Map<Integer, LhlAudit> auditMap = cashRefundMapper.getAuditBatch(auditIds)
  592. .stream().collect(Collectors.toMap(LhlAudit::getId, Function.identity()));
  593. Map<String, String> executorNameMap = auditMapper.getNamesByJwcodes(executorIds)
  594. .stream().collect(Collectors.toMap(Admin::getAccount, Admin::getAdminName));
  595. // 处理数据
  596. list.forEach(item -> {
  597. CashCollection cashCollection = cashCollectionMap.get(item.getRelatedId());
  598. if (cashCollection != null) {
  599. processCashCollection(item, cashCollection);
  600. }
  601. String marketName = marketNameMap.get(item.getMarket());
  602. String submitter = submitterNameMap.get(item.getSubmitterId());
  603. LhlAudit lhlAudit = auditMap.get(item.getAuditId());
  604. String executorName = executorNameMap.get(String.valueOf(item.getExecutor()));
  605. item.setMarketName(marketName != null ? marketName : "");
  606. item.setSubmitter(submitter != null ? submitter : "");
  607. item.setExecutorName(executorName != null ? executorName : "");
  608. if (lhlAudit != null) {
  609. item.setAreaServise(lhlAudit.getAreaServise());
  610. item.setAreaFinance(lhlAudit.getAreaFinance());
  611. item.setAreaCharge(lhlAudit.getAreaCharge());
  612. item.setHeadFinance(lhlAudit.getHeadFinance());
  613. }
  614. });
  615. return new PageInfo<>(list);
  616. }
  617. @Override
  618. @Transactional
  619. public void addOnline(CashRecordRefund cashRecordRefund) {
  620. try {
  621. if (cashRecordRefund.getJwcode() == null) {
  622. throw new BusinessException("未输入精网号");
  623. }
  624. if (cashRecordRefund.getRefundModel() == null) {
  625. throw new BusinessException("请填充退款类型");
  626. }
  627. if (cashRecordRefund.getRefundReason() == null) {
  628. throw new BusinessException("请填写退款理由");
  629. }
  630. if (cashRecordRefund.getMarket() == null || cashRecordRefund.getMarket().trim().isEmpty()) {
  631. throw new BusinessException("请选择所属地区");
  632. }
  633. CashRecordDone cashRecordDonetwo = new CashRecordDone();
  634. cashRecordDonetwo.setAreaServise(cashRecordRefund.getAreaServise());
  635. cashRefundMapper.addAudit(cashRecordDonetwo);
  636. cashRecordRefund.setAuditId(cashRecordDonetwo.getId());
  637. cashRecordRefund.setStatus(20);
  638. //生成订单号后半部分
  639. String orderNumber = cashRecordRefund.getOrderCode();
  640. //构建订单信息
  641. cashRecordRefund.setOrderCode("TK" + orderNumber); //订单号
  642. // 查询市场 ID,增加空值检查
  643. String marketName = cashRecordRefund.getMarket();
  644. // 如果传入的是英文名称,需要转换为中文名称再查询
  645. String marketId = marketMapper.getMarketId(marketName);
  646. if (marketId == null || marketId.trim().isEmpty()) {
  647. // 尝试将英文名称转换为中文后再次查询
  648. String chineseMarketName = translationService.findChineseSimplifiedByTranslation(marketName, "en");
  649. if (chineseMarketName != null && !chineseMarketName.equals(marketName)) {
  650. marketId = marketMapper.getMarketId(chineseMarketName);
  651. }
  652. }
  653. if (marketId == null || marketId.trim().isEmpty()) {
  654. throw new BusinessException("无效的所属地区:" + cashRecordRefund.getMarket());
  655. }
  656. cashRecordRefund.setMarket(String.valueOf(Integer.valueOf(marketId)));
  657. cashRefundMapper.insert(cashRecordRefund);
  658. CashRecordDone cashRecordDone1 = new CashRecordDone();
  659. cashRecordDone1.setId(cashRecordRefund.getOriginalOrderId());
  660. cashRecordDone1.setStatus(6);
  661. if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) {
  662. cashRefundMapper.updateStatus(cashRecordDone1);
  663. } else {
  664. throw new SystemException("提交失败");
  665. }
  666. } catch (BusinessException | SystemException e) {
  667. throw e;
  668. } catch (Exception e) {
  669. log.error("addOnline error", e);
  670. throw new SystemException("提交失败:" + e.getMessage());
  671. }
  672. }
  673. @Override
  674. public PageInfo<FundsDTO> funds(Integer pageNum, Integer pageSize, FundsDTO fundsDTO) {
  675. // 1. 分页查询主数据
  676. PageHelper.startPage(pageNum, pageSize);
  677. if (fundsDTO.getStatuses() == null || fundsDTO.getStatuses().isEmpty()) {
  678. fundsDTO.setStatuses(Arrays.asList(4, 6));
  679. }
  680. List<FundsDTO> list = cashRefundMapper.selectfunds(fundsDTO);
  681. // 2. 收集 status == 6 的记录 ID
  682. List<Integer> needQueryIds = new ArrayList<>();
  683. for (FundsDTO dto : list) {
  684. if (dto.getStatus() != null && dto.getStatus() == 6) {
  685. needQueryIds.add(dto.getId());
  686. }
  687. }
  688. // 3. 批量查询 refundDetail 信息(用于负数处理)
  689. if (!needQueryIds.isEmpty()) {
  690. List<FundsDTO> detailList = cashRefundMapper.selectRefundCount(needQueryIds);
  691. Map<Integer, FundsDTO> detailMap = new HashMap<>();
  692. for (FundsDTO detail : detailList) {
  693. // 假设 detail.getRelatedId() 对应主表的 id
  694. detailMap.put(detail.getRelatedId(), detail);
  695. }
  696. // 回填 refundAmount(取负)和 refundCurrency
  697. for (FundsDTO dto : list) {
  698. if (dto.getStatus() != null && dto.getStatus() == 6) {
  699. FundsDTO detail = detailMap.get(dto.getId());
  700. if (detail != null) {
  701. BigDecimal amount = detail.getRefundAmount();
  702. if (amount != null) {
  703. dto.setRefundAmount(amount.negate()); // 转为负数
  704. } else {
  705. dto.setRefundAmount(null); // 或设为 BigDecimal.ZERO
  706. }
  707. dto.setRefundCurrency(detail.getRefundCurrency());
  708. }
  709. }
  710. }
  711. }
  712. // 4. 收集所有需要转换的 regionId 和 currencyId
  713. Set<Integer> regionIds = new HashSet<>();
  714. Set<Integer> currencyIds = new HashSet<>();
  715. Set<Integer> reCurrencyIds = new HashSet<>();
  716. for (FundsDTO dto : list) {
  717. if (dto.getMarket() != null) {
  718. regionIds.add(dto.getMarket());
  719. }
  720. if (dto.getPaymentCurrency() != null) {
  721. currencyIds.add(dto.getPaymentCurrency());
  722. }
  723. if (dto.getReceivedCurrency() != null) {
  724. reCurrencyIds.add(dto.getReceivedCurrency());
  725. }
  726. }
  727. // 5. 批量查询地区字典
  728. Map<Integer, String> regionMap = new HashMap<>();
  729. if (!regionIds.isEmpty()) {
  730. List<Region> regions = refundMapper.selectByIds(new ArrayList<>(regionIds));
  731. for (Region region : regions) {
  732. regionMap.put(region.getId(), region.getName());
  733. }
  734. }
  735. // 6. 批量查询币种字典
  736. Map<Integer, String> currencyMap = new HashMap<>();
  737. if (!currencyIds.isEmpty()) {
  738. List<Currency> currencies = refundMapper.selectByCIds(new ArrayList<>(currencyIds));
  739. for (Currency currency : currencies) {
  740. currencyMap.put(currency.getId(), currency.getName()); // 或 getCode(),按需调整
  741. }
  742. }
  743. Map<Integer, String> reCurrencyMap = new HashMap<>();
  744. if (!reCurrencyIds.isEmpty()) {
  745. List<Currency> reCurrencies = refundMapper.selectByCIds(new ArrayList<>(reCurrencyIds));
  746. for (Currency reCurrency : reCurrencies) {
  747. reCurrencyMap.put(reCurrency.getId(), reCurrency.getName()); // 或 getCode(),按需调整
  748. }
  749. }
  750. // 7. 回填地区名称和币种名称到 DTO
  751. for (FundsDTO dto : list) {
  752. dto.setMarketName(regionMap.get(dto.getMarket()));
  753. dto.setPaymentCurrencyName(currencyMap.get(dto.getPaymentCurrency()));
  754. dto.setReceivedCurrencyName(reCurrencyMap.get(dto.getReceivedCurrency()));
  755. }
  756. // 8. 返回分页结果
  757. return new PageInfo<>(list);
  758. }
  759. }