package com.example.demo.serviceImpl.cash; import com.example.demo.Util.GoldTistV2; import com.example.demo.config.RabbitMQConfig; import com.example.demo.domain.entity.User; import com.example.demo.domain.entity.UserGoldRecord; import com.example.demo.domain.vo.cash.CashRecordDTO; import com.example.demo.domain.vo.cash.CashRecordDone; import com.example.demo.domain.vo.cash.CashRecordRefund; import com.example.demo.domain.vo.cash.CashRefundMessage; import com.example.demo.domain.vo.coin.Result; import com.example.demo.mapper.cash.CashRefundMapper; import com.example.demo.mapper.coin.AuditMapper; import com.example.demo.mapper.coin.MarketMapper; import com.example.demo.mapper.coin.RefundMapper; import com.example.demo.service.cash.RefundService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import jakarta.servlet.http.HttpServletRequest; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; import static org.apache.commons.lang3.StringUtils.substring; /** * @program: GOLD * @ClassName CashRefundServiceImpl * @description: 处理退款相关业务逻辑 * @author: huangqizhen * @create: 2025−09-28 15:02 * @Version 1.0 **/ @Service public class CashRefundServiceImpl implements RefundService { @Autowired private CashRefundMapper cashRefundMapper; @Autowired private RefundMapper refundMapper; @Autowired private AuditMapper auditMapper; @Autowired private MarketMapper marketMapper; @Autowired private RabbitTemplate rabbitTemplate; @Override public PageInfo select(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) { PageHelper.startPage(pageNum, pageSize); // System.out.println(goldDetail.getMarkets()); List list = cashRefundMapper.select(cashRecordDTO); return new PageInfo<>(list); } // 添加退款订单 @Override public int add(CashRecordRefund cashRecordRefund) throws Exception { if (cashRecordRefund.getJwcode() == null) { throw new Exception("未输入精网号"); } if (cashRecordRefund.getRefundModel() == null) { throw new Exception("请填充退款类型"); } if (cashRecordRefund.getRefundReason() == null) { throw new Exception("请填写退款理由"); } CashRecordDone cashRecordDonetwo = new CashRecordDone(); cashRecordDonetwo.setAreaServise(cashRecordRefund.getAreaServise()); cashRefundMapper.addAudit(cashRecordDonetwo); cashRecordRefund.setAuditId(cashRecordDonetwo.getId()); cashRecordRefund.setStatus(10); //生成订单号后半部分 String orderNumber = cashRecordRefund.getOrderCode(); //构建订单信息 cashRecordRefund.setOrderCode("TK" + orderNumber); //订单号 cashRecordRefund.setMarket(String.valueOf(Integer.valueOf(marketMapper.getMarketId(cashRecordRefund.getMarket())))); cashRefundMapper.insert(cashRecordRefund); CashRecordDone cashRecordDone1 = new CashRecordDone(); cashRecordDone1.setId(cashRecordRefund.getId()); cashRecordDone1.setStatus(6); if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) cashRefundMapper.updateStatus(cashRecordDone1); else return Result.error("提交失败").getCode(); // 发送退款创建消息 CashRefundMessage message = new CashRefundMessage(); message.setId(cashRecordRefund.getId()); message.setOrderCode(cashRecordRefund.getOrderCode()); message.setStatus(10); message.setStatusDescription("地区财务待审核"); message.setMessage("退款订单已创建"); message.setSubmitterId(cashRecordRefund.getSubmitterId()); message.setTimestamp(LocalDateTime.now()); rabbitTemplate.convertAndSend( RabbitMQConfig.CASH_REFUND_EXCHANGE, "refund.created", message ); return Result.success("提交成功").getCode(); } // 更新退款订单信息 @Override public int update(CashRecordDone cashRecordDone) throws Exception { if (cashRecordDone.getJwcode() == null) { throw new RuntimeException("未输入精网号"); } if (cashRecordDone.getPaymentAmount() == null) { throw new RuntimeException("未输入付款金额"); } if (cashRecordDone.getPaymentCurrency() == null) { throw new RuntimeException("未输入付款币种"); } if (cashRecordDone.getRefundModel() == null) { throw new RuntimeException("请填写退款类型"); } if (cashRecordDone.getRefundReason() == null) { throw new RuntimeException("请填写退款理由"); } int result = cashRefundMapper.update(cashRecordDone); return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode(); } // 撤回退款订单 @Override public int withdraw(CashRecordDone cashRecordDone) { return cashRefundMapper.withdraw(cashRecordDone.getId()); } // 审核退款订单 @Override public int review(CashRecordDone cashRecordDone) throws Exception { if (cashRecordDone.getStatus() == 12 || cashRecordDone.getStatus() == 22) { if (cashRecordDone.getOrderCode() == null) { throw new RuntimeException("未输入订单号"); } CashRecordDone cashRecordDone1 = new CashRecordDone(); cashRecordDone1.setOrderCode(cashRecordDone.getOrderCode().substring(2)); cashRecordDone1.setStatus(4); if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) { cashRefundMapper.updateStatus(cashRecordDone1); } } cashRefundMapper.updateAudit(cashRecordDone); int result = cashRefundMapper.review(cashRecordDone); if (result > 0) { // 发送审核消息 CashRefundMessage message = new CashRefundMessage(); message.setId(cashRecordDone.getId()); message.setOrderCode(cashRecordDone.getOrderCode()); message.setStatus(cashRecordDone.getStatus()); message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus())); message.setMessage("退款订单已审核"); message.setSubmitterId(cashRecordDone.getSubmitterId()); message.setAuditId(cashRecordDone.getAuditId()); // 可以通过 auditId 查询审核人姓名 message.setTimestamp(LocalDateTime.now()); if (cashRecordDone.getStatus() == 12 || cashRecordDone.getStatus() == 22) { rabbitTemplate.convertAndSend( RabbitMQConfig.CASH_REFUND_EXCHANGE, "refund.rejected", message ); } else { rabbitTemplate.convertAndSend( RabbitMQConfig.CASH_REFUND_EXCHANGE, "refund.reviewed", message ); } } return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode(); } // 执行退款操作 @Override public int executor(CashRecordDone cashRecordDone) throws Exception { if (cashRecordDone.getRefundVoucher() == null) { throw new RuntimeException("未输入退款凭证"); } if (cashRecordDone.getRefundTime() == null) { throw new RuntimeException("未输入退款时间"); } if (cashRecordDone.getRefundRemark() == null) { throw new RuntimeException("未输入退款备注"); } if (cashRecordDone.getRefundChannels() == null) { throw new RuntimeException("未输入退款途径"); } if (cashRecordDone.getRefundCurrency() == null) { throw new RuntimeException("未输入退款币种"); } if (cashRecordDone.getRefundAmount() == null) { throw new RuntimeException("未输入退款金额"); } int result = cashRefundMapper.executor(cashRecordDone); if (result > 0) { // 发送执行消息 CashRefundMessage message = new CashRefundMessage(); message.setId(cashRecordDone.getId()); message.setOrderCode(cashRecordDone.getOrderCode()); message.setStatus(cashRecordDone.getStatus()); message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus())); message.setMessage("退款订单已执行"); message.setSubmitterId(cashRecordDone.getSubmitterId()); message.setExecutorId(cashRecordDone.getExecutor()); // 可以通过 executorId 查询执行人姓名 message.setTimestamp(LocalDateTime.now()); rabbitTemplate.convertAndSend( RabbitMQConfig.CASH_REFUND_EXCHANGE, "refund.executed", message ); } return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode(); } // 更新退款订单状态 @Override public int updateStatus(CashRecordDone cashRecordDone) { return cashRefundMapper.updateStatus(cashRecordDone); } // 最终审核退款订单 @Override public int finalreview(CashRecordDone cashRecordDone) { if (cashRecordDone.getPermanentGold() == null) { cashRecordDone.setPermanentGold(0); } if (cashRecordDone.getFreeGold() == null) { cashRecordDone.setFreeGold(0); } if (cashRecordDone.getStatus() == 32) { CashRecordDone cashRecordDone1 = new CashRecordDone(); cashRecordDone1.setOrderCode(cashRecordDone.getOrderCode().substring(2)); cashRecordDone1.setStatus(4); if (cashRecordDone1.getId() != null || cashRecordDone1.getOrderCode() != null) { cashRefundMapper.updateStatus(cashRecordDone1); } } if (cashRecordDone.getGoodsName() != null && cashRecordDone.getStatus() == 40 && (cashRecordDone.getGoodsName().equals("金币充值") || cashRecordDone.getGoodsName().contains("金币充值"))) { UserGoldRecord userGoldRecord = new UserGoldRecord(); userGoldRecord.setOrderCode(cashRecordDone.getOrderCode()); userGoldRecord.setType((byte) 2); userGoldRecord.setIsRefund((byte) 1); userGoldRecord.setRefundType("金币退款"); userGoldRecord.setCrefundModel(cashRecordDone.getRefundModel()); userGoldRecord.setJwcode(cashRecordDone.getJwcode()); userGoldRecord.setSumGold(cashRecordDone.getPermanentGold() + cashRecordDone.getFreeGold()); userGoldRecord.setPermanentGold(cashRecordDone.getPermanentGold()); int currentMonth = LocalDate.now().getMonthValue(); if (currentMonth >= 1 && currentMonth <= 6) { // 1-6月:设置12月额度,6月保持默认值 userGoldRecord.setFreeJune(0); userGoldRecord.setFreeDecember(cashRecordDone.getFreeGold()); } else { // 7-12月:设置6月额度,12月保持默认值 userGoldRecord.setFreeJune(cashRecordDone.getFreeGold()); userGoldRecord.setFreeDecember(0); } userGoldRecord.setGoodsName(cashRecordDone.getGoodsName()); userGoldRecord.setPayPlatform("金币系统"); userGoldRecord.setRemark(cashRecordDone.getRemark()); userGoldRecord.setAdminId(cashRecordDone.getAuditId()); userGoldRecord.setAuditStatus(1); userGoldRecord.setTaskGold(0); userGoldRecord.setCreateTime(new Date()); userGoldRecord.setUpdateTime(new Date()); String auditName = auditMapper.getName(cashRecordDone.getAuditId()); refundMapper.add(userGoldRecord); User user = new User(); user.setJwcode(userGoldRecord.getJwcode()); user.setCurrentPermanentGold(BigDecimal.valueOf(-userGoldRecord.getPermanentGold())); //当前永久金币 user.setCurrentFreeJune(BigDecimal.valueOf(-userGoldRecord.getFreeJune())); //当前六月免费金币 user.setCurrentFreeDecember(BigDecimal.valueOf(-userGoldRecord.getFreeDecember())); //当前十二月免费金币 auditMapper.updateUserGold(user); GoldTistV2.addCoinNew(userGoldRecord.getJwcode().toString(), 58, //退款免费+永久金币-充值 (double) (userGoldRecord.getFreeDecember() + userGoldRecord.getFreeJune() + userGoldRecord.getPermanentGold()) / 100, userGoldRecord.getRemark(), (double) userGoldRecord.getPermanentGold() / 100, auditName, "退款金币充值"); } cashRefundMapper.updateAudit(cashRecordDone); int result = cashRefundMapper.review(cashRecordDone); if (result > 0) { // 发送最终审核消息 CashRefundMessage message = new CashRefundMessage(); message.setId(cashRecordDone.getId()); message.setOrderCode(cashRecordDone.getOrderCode()); message.setStatus(cashRecordDone.getStatus()); message.setStatusDescription(getStatusDescription(cashRecordDone.getStatus())); message.setMessage("退款订单已完成"); message.setSubmitterId(cashRecordDone.getSubmitterId()); message.setAuditId(cashRecordDone.getAuditId()); message.setTimestamp(LocalDateTime.now()); rabbitTemplate.convertAndSend( RabbitMQConfig.CASH_REFUND_EXCHANGE, "refund.completed", message ); } return (result > 0 ? Result.success("提交成功") : Result.error("提交失败")).getCode(); } // 辅助方法:根据状态码获取状态描述 private String getStatusDescription(Integer status) { switch (status) { case 10: return "地区财务待审核"; case 11: return "地区财务手动撤回待编辑提交"; case 12: return "地区财务驳回"; case 20: return "地区负责人待审核"; case 22: return "地区负责人驳回"; case 30: return "总部财务待审核"; case 32: return "总部财务驳回"; case 40: return "执行人待处理"; case 41: return "执行人已处理,退款结束"; default: return "未知状态"; } } // 财务查询退款订单列表 @Override public PageInfo financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) { PageHelper.startPage(pageNum, pageSize); // System.out.println(goldDetail.getMarkets()); List list = cashRefundMapper.financeSelect(cashRecordDTO); return new PageInfo<>(list); } @Override public PageInfo exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) { PageHelper.startPage(pageNum, pageSize); List list = cashRefundMapper.exSelect(cashRecordDTO); return new PageInfo<>(list); } @Override public void addOnline(CashRecordRefund cashRecordRefund) { } }