支持挂账部分退款

This commit is contained in:
谭凯凯
2024-12-11 16:34:55 +08:00
committed by Tankaikai
parent 2c5e2a79f3
commit 51e1c6aa74

View File

@@ -294,6 +294,7 @@ public class TbCreditBuyerOrderServiceImpl extends ServiceImpl<TbCreditBuyerOrde
}
@Override
//@Transactional(rollbackFor = Exception.class)
public boolean partRefund(String creditBuyerId, Long orderId, BigDecimal refundAmount) {
if (StrUtil.isBlank(creditBuyerId)) {
throw new BadRequestException("挂账人id不能为空");
@@ -314,87 +315,31 @@ public class TbCreditBuyerOrderServiceImpl extends ServiceImpl<TbCreditBuyerOrde
if (dto == null) {
throw new BadRequestException("挂账订单不存在");
}
// 1.把退款归还至余额
creditBuyer.setAccountBalance(NumberUtil.add(creditBuyer.getAccountBalance(), refundAmount));
// 2.保存挂账退款记录
// 已还款金额进行红冲
TbCreditPaymentRecord record = new TbCreditPaymentRecord();
record.setCreditBuyerId(creditBuyerId);
record.setOrderId(orderId);
record.setRepaymentAmount(NumberUtil.sub(BigDecimal.ZERO, refundAmount));
record.setPaymentMethod("挂账退款");
record.setPaymentTime(new Date());
record.setRemark(StrUtil.format("挂账订单:{},申请退款¥{}元,退款金额¥{}元已转移至账户余额", orderInfo.getOrderNo(), refundAmount, refundAmount));
record.setRemark(StrUtil.format("挂账订单:{},申请退款¥{}元,已恢复挂账额度", orderInfo.getOrderNo(), refundAmount));
record.setCreateTime(new Date());
tbCreditPaymentRecordMapper.insert(record);
tbCreditBuyerService.updateById(creditBuyer);
if ("unpaid".equals(dto.getStatus())) {
creditBuyer.setAccountBalance(NumberUtil.sub(creditBuyer.getAccountBalance(), refundAmount));
TbCreditPaymentRecord auto = new TbCreditPaymentRecord();
auto.setCreditBuyerId(creditBuyerId);
auto.setOrderId(orderId);
auto.setRepaymentAmount(refundAmount);
auto.setPaymentMethod("挂账冲红");
auto.setPaymentTime(new Date());
auto.setRemark(StrUtil.format("挂账订单:{},申请退款¥{}元,冲红金额¥{}元,挂账额度已恢复。", orderInfo.getOrderNo(), refundAmount, refundAmount));
auto.setCreateTime(new Date());
tbCreditPaymentRecordMapper.insert(auto);
dto = baseMapper.getOne(params);
if (NumberUtil.isGreater(dto.getPaidAmount(), BigDecimal.ZERO)) {
TbCreditPaymentRecord flow = new TbCreditPaymentRecord();
flow.setCreditBuyerId(creditBuyerId);
flow.setOrderId(orderId);
flow.setRepaymentAmount(NumberUtil.sub(BigDecimal.ZERO, dto.getPaidAmount()));
flow.setPaymentMethod("挂账退款");
flow.setPaymentTime(new Date());
flow.setRemark(StrUtil.format("挂账订单:{},申请退款¥{}元,由于此挂账订单已提前还款,溢出部分¥{}元将转储至账户余额。", orderInfo.getOrderNo(), refundAmount, dto.getPaidAmount()));
flow.setCreateTime(new Date());
tbCreditPaymentRecordMapper.insert(record);
// 退回余额
creditBuyer.setAccountBalance(NumberUtil.add(creditBuyer.getAccountBalance(), dto.getPaidAmount()));
tbCreditBuyerService.updateById(creditBuyer);
return true;
}
// 3.修正挂账订单已还款数据
dto.setPaidAmount(NumberUtil.sub(dto.getPaidAmount(), refundAmount));
if (NumberUtil.equals(dto.getPaidAmount(), BigDecimal.ZERO)) {
dto.setStatus("unpaid");
} else if (NumberUtil.isGreater(dto.getPaidAmount(), BigDecimal.ZERO) && NumberUtil.isLess(dto.getPaidAmount(), dto.getPayAmount())) {
dto.setStatus("partial");
}
dto.setUnpaidAmount(NumberUtil.sub(dto.getPayAmount(), dto.getPaidAmount()));
tbCreditBuyerOrderMapper.update(
Wrappers.<TbCreditBuyerOrder>lambdaUpdate()
.eq(TbCreditBuyerOrder::getId, dto.getId())
.set(TbCreditBuyerOrder::getPaidAmount, dto.getPaidAmount())
.set(TbCreditBuyerOrder::getStatus, dto.getStatus()));
// 4.自动还款
BigDecimal accountBalance = creditBuyer.getAccountBalance();
BigDecimal sub = NumberUtil.sub(creditBuyer.getAccountBalance(), dto.getUnpaidAmount());
// 4.1.可以还清
if (NumberUtil.isGreaterOrEqual(sub, BigDecimal.ZERO)) {
creditBuyer.setAccountBalance(sub);
tbCreditBuyerOrderMapper.update(
Wrappers.<TbCreditBuyerOrder>lambdaUpdate()
.eq(TbCreditBuyerOrder::getId, dto.getId())
.set(TbCreditBuyerOrder::getPaidAmount, NumberUtil.add(dto.getPaidAmount(), dto.getUnpaidAmount()))
.set(TbCreditBuyerOrder::getStatus, "paid"));
TbCreditPaymentRecord auto = new TbCreditPaymentRecord();
auto.setCreditBuyerId(creditBuyerId);
auto.setOrderId(orderId);
auto.setRepaymentAmount(dto.getUnpaidAmount());
auto.setPaymentMethod("自动还款");
auto.setPaymentTime(new Date());
dto.setUnpaidAmount(NumberUtil.sub(dto.getPayAmount(), NumberUtil.add(dto.getPaidAmount(), dto.getUnpaidAmount())));
auto.setRemark(StrUtil.format("挂账订单:{},挂账金额¥{},账户余额¥{},自动还款¥{}。", orderInfo.getOrderNo(), dto.getUnpaidAmount(), accountBalance, dto.getUnpaidAmount()));
auto.setCreateTime(new Date());
tbCreditPaymentRecordMapper.insert(auto);
} else {
// 4.2.可以还部分
creditBuyer.setAccountBalance(BigDecimal.ZERO);
tbCreditBuyerOrderMapper.update(
Wrappers.<TbCreditBuyerOrder>lambdaUpdate()
.eq(TbCreditBuyerOrder::getId, dto.getId())
.set(TbCreditBuyerOrder::getPaidAmount, NumberUtil.add(dto.getPaidAmount(), accountBalance))
.set(TbCreditBuyerOrder::getStatus, "partial"));
TbCreditPaymentRecord auto = new TbCreditPaymentRecord();
auto.setCreditBuyerId(creditBuyerId);
auto.setOrderId(orderId);
auto.setRepaymentAmount(accountBalance);
auto.setPaymentMethod("自动还款");
auto.setPaymentTime(new Date());
dto.setUnpaidAmount(NumberUtil.sub(dto.getPayAmount(), NumberUtil.add(dto.getPaidAmount(), accountBalance)));
auto.setRemark(StrUtil.format("挂账订单:{},挂账金额¥{},账户余额¥{},自动还款¥{}。", orderInfo.getOrderNo(), dto.getUnpaidAmount(), accountBalance, accountBalance));
auto.setCreateTime(new Date());
tbCreditPaymentRecordMapper.insert(auto);
}
tbCreditBuyerService.updateById(creditBuyer);
return true;
}
}