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

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<CashRecordDTO> select(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize);
// System.out.println(goldDetail.getMarkets());
List<CashRecordDTO> 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<CashRecordDTO> financeSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize);
// System.out.println(goldDetail.getMarkets());
List<CashRecordDTO> list = cashRefundMapper.financeSelect(cashRecordDTO);
return new PageInfo<>(list);
}
@Override
public PageInfo<CashRecordDTO> exSelect(Integer pageNum, Integer pageSize, CashRecordDTO cashRecordDTO) {
PageHelper.startPage(pageNum, pageSize);
List<CashRecordDTO> list = cashRefundMapper.exSelect(cashRecordDTO);
return new PageInfo<>(list);
}
@Override
public void addOnline(CashRecordRefund cashRecordRefund) {
}
}