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
341 lines
15 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.Messages;
|
|
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.OperationLogMapper;
|
|
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 org.springframework.transaction.annotation.Transactional;
|
|
|
|
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
|
|
@Transactional
|
|
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;
|
|
@Autowired
|
|
private OperationLogMapper operationLogMapper;
|
|
|
|
@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();
|
|
|
|
// 发送退款创建消息
|
|
Messages message = new Messages();
|
|
message.setJwcode(cashRecordRefund.getJwcode());
|
|
message.setName(cashRecordRefund.getName());
|
|
message.setStatus(cashRecordRefund.getStatus());
|
|
message.setDesc(cashRecordRefund.getJwcode()+"用户有条退款订单需审核");
|
|
message.setTitle("现金退款--新增退款");
|
|
message.setType(1);
|
|
message.setTypeId(cashRecordRefund.getId());
|
|
message.setMarket(Integer.valueOf(cashRecordRefund.getMarket()));
|
|
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", 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);
|
|
CashRecordDTO cashRecordDTO = cashRefundMapper.selectById(cashRecordDone.getId());
|
|
if (result > 0) {
|
|
// 发送审核消息
|
|
Messages message = new Messages();
|
|
message.setJwcode(cashRecordDTO.getJwcode());
|
|
message.setName(cashRecordDTO.getName());
|
|
message.setStatus(cashRecordDTO.getStatus());
|
|
message.setDesc(cashRecordDTO.getJwcode()+"用户有条退款订单需审核");
|
|
message.setTitle("现金退款--新增退款");
|
|
message.setType(1);
|
|
message.setTypeId(cashRecordDTO.getId());
|
|
message.setMarket(cashRecordDTO.getMarket());
|
|
|
|
if (cashRecordDTO.getStatus() != 12 || cashRecordDTO.getStatus() != 22) {
|
|
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", 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);
|
|
|
|
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);
|
|
CashRecordDTO cashRecordDTO = cashRefundMapper.selectById(cashRecordDone.getId());
|
|
if (result > 0) {
|
|
// 发送审核消息
|
|
Messages message = new Messages();
|
|
message.setJwcode(cashRecordDTO.getJwcode());
|
|
message.setName(cashRecordDTO.getName());
|
|
message.setStatus(cashRecordDTO.getStatus());
|
|
message.setDesc(cashRecordDTO.getJwcode()+"用户有条退款订单需审核");
|
|
message.setTitle("现金退款--新增退款");
|
|
message.setType(1);
|
|
message.setTypeId(cashRecordDTO.getId());
|
|
message.setMarket(cashRecordDTO.getMarket());
|
|
|
|
if (cashRecordDTO.getStatus() != 32) {
|
|
rabbitTemplate.convertAndSend(RabbitMQConfig.CASH_REFUND_EXCHANGE, "cash.refund.save", 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) {
|
|
|
|
}
|
|
}
|