提交
This commit is contained in:
parent
c1ac775e19
commit
2d4eab011a
smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service
smart-switch-web/src/main/java/com/ruoyi/web/controller/ss
|
@ -303,17 +303,6 @@ public interface TransactionBillService
|
|||
*/
|
||||
TransactionBillVO selectLastOne(TransactionBillQuery query);
|
||||
|
||||
/**
|
||||
* 修复订单数据
|
||||
*/
|
||||
int fix(Long billId);
|
||||
|
||||
/**
|
||||
* 修复所有订单数据
|
||||
* @return
|
||||
*/
|
||||
int fixAll();
|
||||
|
||||
/**
|
||||
* 收取商户查看用户手机号的价格
|
||||
* @param bill
|
||||
|
|
|
@ -9,7 +9,6 @@ import com.ruoyi.common.domain.vo.LongDecimalVO;
|
|||
import com.ruoyi.common.enums.ServiceCode;
|
||||
import com.ruoyi.common.enums.WithdrawServiceType;
|
||||
import com.ruoyi.common.exception.ServiceException;
|
||||
import com.ruoyi.common.pay.wx.service.WxPayService;
|
||||
import com.ruoyi.common.utils.DateUtils;
|
||||
import com.ruoyi.common.utils.ServiceUtil;
|
||||
import com.ruoyi.common.utils.SnowFlakeUtil;
|
||||
|
@ -27,7 +26,6 @@ import com.ruoyi.ss.bonus.domain.Bonus;
|
|||
import com.ruoyi.ss.bonus.domain.BonusVO;
|
||||
import com.ruoyi.ss.bonus.domain.enums.BonusArrivalType;
|
||||
import com.ruoyi.ss.bonus.domain.enums.BonusStatus;
|
||||
import com.ruoyi.ss.bonus.service.BonusConverter;
|
||||
import com.ruoyi.ss.bonus.service.BonusService;
|
||||
import com.ruoyi.ss.channelWithdraw.domain.ChannelWithdrawVO;
|
||||
import com.ruoyi.ss.channelWithdraw.service.ChannelWithdrawService;
|
||||
|
@ -45,8 +43,6 @@ import com.ruoyi.ss.receiveBill.domain.ReceiveBill;
|
|||
import com.ruoyi.ss.receiveBill.domain.enums.ReceiveBillStatus;
|
||||
import com.ruoyi.ss.receiveBill.domain.enums.ReceiveBillType;
|
||||
import com.ruoyi.ss.receiveBill.service.ReceiveBillService;
|
||||
import com.ruoyi.ss.record.time.service.IRecordTimeService;
|
||||
import com.ruoyi.ss.record.time.service.RecordTimeConverter;
|
||||
import com.ruoyi.ss.recordBalance.domain.enums.RecordBalanceBstType;
|
||||
import com.ruoyi.ss.risk.service.RiskService;
|
||||
import com.ruoyi.ss.store.domain.StoreVo;
|
||||
|
@ -66,7 +62,10 @@ import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;
|
|||
import com.ruoyi.ss.transactionBill.domain.vo.TransactionDailyAmountVO;
|
||||
import com.ruoyi.ss.transactionBill.domain.vo.UserWithdrawServiceVO;
|
||||
import com.ruoyi.ss.transactionBill.mapper.TransactionBillMapper;
|
||||
import com.ruoyi.ss.transactionBill.service.*;
|
||||
import com.ruoyi.ss.transactionBill.service.TransactionAssembler;
|
||||
import com.ruoyi.ss.transactionBill.service.TransactionBillService;
|
||||
import com.ruoyi.ss.transactionBill.service.TransactionBillValidator;
|
||||
import com.ruoyi.ss.transactionBill.service.WithdrawValidator;
|
||||
import com.ruoyi.ss.transfer.domain.TransferVO;
|
||||
import com.ruoyi.ss.transfer.interfaces.AfterTransfer;
|
||||
import com.ruoyi.ss.transfer.service.TransferConverter;
|
||||
|
@ -78,7 +77,6 @@ import com.ruoyi.system.service.ISysConfigService;
|
|||
import com.ruoyi.task.bill.BillDelayedManager;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
@ -112,9 +110,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
@Autowired
|
||||
private DeviceService deviceService;
|
||||
|
||||
@Autowired
|
||||
private WxPayService wxPayService;
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
|
@ -134,18 +129,9 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
@Autowired
|
||||
private ScheduledExecutorService scheduledExecutorService;
|
||||
|
||||
@Value("${sm.withdraw.password.enable}")
|
||||
private Boolean smWithdrawPasswordEnable; // 是否开启提现密码
|
||||
|
||||
@Autowired
|
||||
private TransactionTemplate transactionTemplate;
|
||||
|
||||
@Autowired
|
||||
private IRecordTimeService recordTimeService;
|
||||
|
||||
@Autowired
|
||||
private RecordTimeConverter recordTimeConverter;
|
||||
|
||||
@Autowired
|
||||
private PayBillService payBillService;
|
||||
|
||||
|
@ -158,15 +144,9 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
@Autowired
|
||||
private ISysConfigService sysConfigService;
|
||||
|
||||
@Autowired
|
||||
private TransactionBillConverter transactionBillConverter;
|
||||
|
||||
@Autowired
|
||||
private WithdrawValidator withdrawValidator;
|
||||
|
||||
@Autowired
|
||||
private BonusConverter bonusConverter;
|
||||
|
||||
@Autowired
|
||||
private BonusService bonusService;
|
||||
|
||||
|
@ -304,33 +284,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fix(Long billId) {
|
||||
TransactionBillVO bill = selectSmTransactionBillByBillId(billId);
|
||||
return fix(bill);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fixAll() {
|
||||
TransactionBillQuery query = new TransactionBillQuery();
|
||||
query.setStatusList(TransactionBillStatus.payedOrder());
|
||||
query.setVersion(1);
|
||||
List<TransactionBillVO> list = selectSmTransactionBillList(query);
|
||||
if (CollectionUtils.isEmptyElement(list)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (TransactionBillVO bill : list) {
|
||||
try {
|
||||
this.fix(bill);
|
||||
} catch (Exception e) {
|
||||
log.error("修复订单数据失败:{}, {}", bill.getBillNo(), e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int receiveMchShowMobileAmount(TransactionBillVO bill) {
|
||||
ServiceUtil.assertion(bill == null, "订单不存在");
|
||||
|
@ -414,36 +367,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
return transactionBillMapper.selectCountGroupBy(query, groupBy);
|
||||
}
|
||||
|
||||
private int fix(TransactionBillVO bill) {
|
||||
return 0;
|
||||
// if (bill == null || bill.getBillId() == null) {
|
||||
// log.warn("修复订单数据失败:订单不存在或订单ID为空");
|
||||
// return 0;
|
||||
// }
|
||||
// // 仅可以修复旧订单
|
||||
// ServiceUtil.assertion(bill.getVersion() == null || bill.getVersion() != 1, "该订单版本无法修复");
|
||||
// ServiceUtil.assertion(!TransactionBillStatus.payedOrder().contains(bill.getStatus()), "订单未支付,无法修复");
|
||||
//
|
||||
// // 获取订单分成数据,判断是否已有分成数据
|
||||
// BonusQuery query = new BonusQuery();
|
||||
// query.setBillId(bill.getBillId());
|
||||
// int bonusCount = bonusService.selectCount(query);
|
||||
// ServiceUtil.assertion(bonusCount > 0, "订单已存在分成数据,无法重复修复");
|
||||
//
|
||||
// // 根据订单生成新的分成数据
|
||||
// List<Bonus> bonusList = bonusConverter.toPo(bill);
|
||||
// ServiceUtil.assertion(CollectionUtils.isEmptyElement(bonusList), "订单生成分成数据失败");
|
||||
//
|
||||
// // 插入数据
|
||||
// Integer result = transactionTemplate.execute(status -> {
|
||||
// int insert = bonusService.batchInsert(bonusList);
|
||||
// ServiceUtil.assertion(insert != bonusList.size(), "订单分成数据插入失败");
|
||||
// return insert;
|
||||
// });
|
||||
//
|
||||
// return result == null ? 0 : result;
|
||||
}
|
||||
|
||||
// 转换为订单所需的数据
|
||||
private TransactionBill parseToOrder(RechargeBO bo) {
|
||||
// 校验
|
||||
|
@ -994,60 +917,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
return transactionBillMapper.updateSmTransactionBill(data);
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public DoPayVO payDeposit(RechargePayDepositBO bo) {
|
||||
// // 校验
|
||||
// ServiceUtil.assertion(transactionBillValidator.prePayDeposit(bo));
|
||||
// // 锁
|
||||
// Long lockKey = bo.getOrder().getBillId();
|
||||
// ServiceUtil.assertion(!redisLock.lock(RedisLockKey.PREPAY_DEPOSIT, lockKey), "当前订单押金正在支付,请稍后重试");
|
||||
// try {
|
||||
// // 创建支付订单并发起支付
|
||||
// return payBillService.createPayBill(payBillConverter.toPoByRechargeDeposit(bo));
|
||||
// } finally {
|
||||
// redisLock.unlock(RedisLockKey.PREPAY_DEPOSIT, lockKey);
|
||||
// }
|
||||
// }
|
||||
|
||||
// private int endTimingUse(EndUseBO bo) {
|
||||
// if (bo == null) {
|
||||
// return 0;
|
||||
// }
|
||||
// TransactionBillVO order = bo.getOrder();
|
||||
// DeviceVO device = bo.getDevice();
|
||||
// ServiceUtil.assertion(order == null, "订单不存在");
|
||||
// ServiceUtil.assertion(!TransactionBillStatus.SUCCESS_DEPOSIT.getStatus().equals(order.getStatus()), "当前订单状态不允许结束");
|
||||
// ServiceUtil.assertion(order.getIsFinished() != null && order.getIsFinished(), "当前订单已结束,无法操作");
|
||||
// ServiceUtil.assertion(device == null, "设备不存在");
|
||||
//
|
||||
// LocalDateTime endTime = LocalDateTime.now(); // 结束使用的时间
|
||||
//
|
||||
// // 结束使用的电量:若蓝牙传过来的值为空或者小于当前电量,则使用当前电量,否则使用蓝牙传输的电量
|
||||
// BigDecimal totalEle = this.calcTotalEle(device, bo.getTotalEle());
|
||||
//
|
||||
// // 计算金额
|
||||
// BigDecimal money = this.calcTimingAmount(order, endTime, totalEle);
|
||||
//
|
||||
// Integer result = transactionTemplate.execute(status -> {
|
||||
// // 修改订单信息
|
||||
// TransactionBill data = new TransactionBill();
|
||||
// data.setSuitEndEle(totalEle);
|
||||
// data.setSuitEndTime(endTime);
|
||||
// data.setStatus(TransactionBillStatus.UNPAID.getStatus());
|
||||
// data.setMoney(money);
|
||||
// TransactionBillQuery query = new TransactionBillQuery();
|
||||
// query.setStatus(TransactionBillStatus.SUCCESS_DEPOSIT.getStatus());
|
||||
// query.setBillId(order.getBillId());
|
||||
// query.setIsFinished(false);
|
||||
// int update = this.updateByQuery(data, query);
|
||||
// ServiceUtil.assertion(update != 1, "修改订单状态失败,请刷新后重试");
|
||||
//
|
||||
// return update;
|
||||
// });
|
||||
//
|
||||
// return result == null ? 0 : result;
|
||||
// }
|
||||
|
||||
private BigDecimal calcTotalEle(DeviceVO device, BigDecimal totalEle) {
|
||||
if (totalEle == null || totalEle.compareTo(device.getTotalElectriQuantity()) < 0) {
|
||||
return device.getTotalElectriQuantity();
|
||||
|
@ -1186,40 +1055,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
return transactionBillMapper.selectSumOfMoney(query);
|
||||
}
|
||||
|
||||
private int endUseSingle(EndUseBO bo) {
|
||||
if (bo == null) {
|
||||
return 0;
|
||||
}
|
||||
TransactionBillVO order = bo.getOrder();
|
||||
DeviceVO device = bo.getDevice();
|
||||
ServiceUtil.assertion(order == null, "订单不存在");
|
||||
ServiceUtil.assertion(order.getIsFinished() != null && order.getIsFinished(), "当前订单已结束,无法操作");
|
||||
// ServiceUtil.assertion(!TransactionBillStatus.SUCCESS.getStatus().equals(order.getStatus()), "当前订单状态不允许结束");
|
||||
ServiceUtil.assertion(device == null, "设备不存在");
|
||||
|
||||
LocalDateTime endTime = LocalDateTime.now(); // 结束使用的时间
|
||||
|
||||
// 结束使用的电量:若蓝牙传过来的值为空或者小于当前电量,则使用当前电量,否则使用蓝牙传输的电量(谁大用谁)
|
||||
BigDecimal totalEle = this.calcTotalEle(device, bo.getTotalEle());
|
||||
|
||||
Integer result = transactionTemplate.execute(status -> {
|
||||
// 修改结束使用的时间
|
||||
TransactionBill data = new TransactionBill();
|
||||
data.setSuitEndTime(endTime);
|
||||
data.setSuitEndEle(totalEle);
|
||||
TransactionBillQuery query = new TransactionBillQuery();
|
||||
query.setBillId(order.getBillId());
|
||||
query.setStatus(TransactionBillStatus.SUCCESS.getStatus());
|
||||
query.setIsFinished(false);
|
||||
int update = this.updateByQuery(data, query);
|
||||
ServiceUtil.assertion(update != 1, "修改订单信息失败,请重试:" + order.getBillNo());
|
||||
|
||||
return update;
|
||||
});
|
||||
|
||||
return result == null ? 0 : result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算退款金额
|
||||
*/
|
||||
|
@ -1308,12 +1143,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
|
||||
// 计算分时段计量金额
|
||||
private BigDecimal calcTimingCountAmount(TransactionBillVO order) {
|
||||
//---旧的
|
||||
// BigDecimal startEle = order.getSuitStartEle() == null ? BigDecimal.ZERO : order.getSuitStartEle(); // 起始电量
|
||||
// BigDecimal usedEle = totalEle == null ? BigDecimal.ZERO : totalEle.subtract(startEle); // 本次用电量
|
||||
// return calcTimingCountAmount(order.getSuitGearAmount(), order.getSuitGearTime(), order.getSuitStartTime(), endTime, usedEle);
|
||||
// 旧的 ---
|
||||
|
||||
BillEleRecordQuery query = new BillEleRecordQuery();
|
||||
query.setBillId(order.getBillId());
|
||||
BigDecimal amount = billEleRecordService.selectSumOfTotalPrice(query);
|
||||
|
@ -1321,76 +1150,8 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
return BigDecimal.ZERO;
|
||||
}
|
||||
return amount;
|
||||
|
||||
// 查询订单电量记录
|
||||
// BillEleRecordQuery query = new BillEleRecordQuery();
|
||||
// query.setBillId(order.getBillId());
|
||||
// List<BillEleRecordVO> recordList = billEleRecordService.selectBillEleRecordList(query);
|
||||
|
||||
// // 拟创建新的记录
|
||||
// LocalDateTime now = LocalDateTime.now();
|
||||
// DeviceVO device = deviceService.selectById(order.getDeviceId());
|
||||
// deviceService.pullDeviceInfo(device, null);
|
||||
// BillEleRecord newRecord = billEleRecordConverter.toPo(order, device, now, now);
|
||||
// recordList.add((BillEleRecordVO) newRecord);
|
||||
//
|
||||
// // 记录根据记录时间排序
|
||||
// recordList.sort(Comparator.comparing(BillEleRecordVO::getRecordTime));
|
||||
//
|
||||
// // 计算每个记录的金额
|
||||
// BigDecimal lastEle = order.getSuitStartEle();
|
||||
// BigDecimal totalPrice = BigDecimal.ZERO;
|
||||
// for (BillEleRecordVO record : recordList) {
|
||||
//
|
||||
//
|
||||
// totalPrice.add(record.getPrice() * )
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
// 计算分时段计量金额
|
||||
private BigDecimal calcTimingCountAmount(List<BigDecimal> suitGearAmount, List<Integer> suitGearTime, LocalDateTime startTime, LocalDateTime endTime, BigDecimal usedEle) {
|
||||
if (startTime == null) {
|
||||
startTime = LocalDateTime.now();
|
||||
}
|
||||
BigDecimal total = BigDecimal.ZERO;
|
||||
|
||||
// 计算每小时平均用电量
|
||||
Duration betweenAvg = Duration.between(startTime, endTime);
|
||||
long minutes = betweenAvg.toMinutes();
|
||||
if (minutes == 0) {
|
||||
minutes = 1;
|
||||
}
|
||||
BigDecimal avgEle = usedEle.divide(BigDecimal.valueOf(minutes), 6, RoundingMode.HALF_UP); // 平均每分钟的用电量 4.6
|
||||
|
||||
// 初始时间
|
||||
LocalDateTime time = startTime ;
|
||||
|
||||
// 计算每分钟的金额
|
||||
while(endTime.isAfter(time)) {
|
||||
int hour = time.getHour();
|
||||
BigDecimal minuteAmount = suitGearAmount.get(suitGearTime.get(hour)).multiply(avgEle);
|
||||
total = total.add(minuteAmount);
|
||||
|
||||
time = time.plusMinutes(1);
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
// 测试总用电量
|
||||
// public static void main(String[] args) {
|
||||
// List<BigDecimal> suitGearAmount = Arrays.asList(new BigDecimal(0.22), new BigDecimal("0.39"), new BigDecimal("0.59"), new BigDecimal("0.89"));
|
||||
// List<Integer> suitGearTime = Arrays.stream("1,1,1,1,1,1,1,2,2,2,1,0,0,0,1,2,3,3,3,2,2,2,2,1".split(",")).map(Integer::parseInt).collect(Collectors.toList());
|
||||
// LocalDateTime startTime = DateUtils.toLocalDateTime("2024-12-19 12:45:31");
|
||||
// LocalDateTime endTime = DateUtils.toLocalDateTime("2024-12-20 14:58:35");
|
||||
// BigDecimal usedEle = new BigDecimal(13.8); // 总用电量 13.8
|
||||
//
|
||||
// TransactionBillServiceImpl service = new TransactionBillServiceImpl();
|
||||
// BigDecimal total = service.calcTimingCountAmount(suitGearAmount, suitGearTime, startTime, endTime, usedEle);
|
||||
// System.out.println(total);
|
||||
// }
|
||||
|
||||
// 计算分时段计时金额
|
||||
private BigDecimal calcTimingTimeAmount(TransactionBillVO order, LocalDateTime endTime) {
|
||||
// 订单不存在 或者 开始时间为空,则表示未开始使用,返回0
|
||||
|
@ -1623,11 +1384,10 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
ServiceUtil.assertion(CollectionUtils.isEmptyElement(bonusList), "订单编号为%s的订单没有收益信息,无法退款", bill.getBillNo());
|
||||
|
||||
Integer result = transactionTemplate.execute(status -> {
|
||||
// 分成方余额按照比例扣减
|
||||
// 按比例计算退款金额
|
||||
// 分成方按照比例扣减余额
|
||||
BigDecimal refundAmount = dto.getRefundAmount(); // 总退款金额
|
||||
int updateRefundBonus = this.updateRefundBonus(bonusList, refundAmount, bill.getMoney());
|
||||
ServiceUtil.assertion(updateRefundBonus != bonusList.size(), "商户余额更新失败");
|
||||
ServiceUtil.assertion(updateRefundBonus == 0 || updateRefundBonus > bonusList.size(), "商户余额更新失败");
|
||||
|
||||
// 发起退款
|
||||
PayBillRefundDTO refundDto = new PayBillRefundDTO();
|
||||
|
@ -1654,22 +1414,32 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
return 0;
|
||||
}
|
||||
|
||||
// FIXME 构建退款列表
|
||||
// FIXME 多次退款有问题,比如商户已经退款0.3元,剩余0.2元,第二次退款的时候,还是给商户分配了0.3元的退款,此时退款会失败。
|
||||
// FIXME 需要重新考虑一下退款金额的分配规则。
|
||||
List<Bonus> refundList = new ArrayList<>(); // 退款的列表
|
||||
// 构建退款列表
|
||||
List<Bonus> refundList = new ArrayList<>();
|
||||
BigDecimal dividedAmount = BigDecimal.ZERO; // 已分配金额
|
||||
|
||||
for (BonusVO bonus : bonusList) {
|
||||
if (bonus == null) {
|
||||
continue;
|
||||
}
|
||||
// 计算扣减金额 = 退款金额 * 分配金额 / 总金额
|
||||
BigDecimal bonusRefundAmount = refundAmount.multiply(bonus.getAmount()).divide(billAmount, 2, RoundingMode.HALF_UP);
|
||||
|
||||
// 计算该分成记录的可退金额 = 分配金额 - 已退金额
|
||||
BigDecimal availableRefund = bonus.getAmount().subtract(bonus.getRefundAmount() == null ? BigDecimal.ZERO : bonus.getRefundAmount());
|
||||
if (availableRefund.compareTo(BigDecimal.ZERO) <= 0) {
|
||||
continue; // 跳过已无可退金额的记录
|
||||
}
|
||||
|
||||
// 按原始比例计算本次应退金额 = 本次退款总额 * (原始分配金额/订单总额)
|
||||
BigDecimal proportion = bonus.getAmount().divide(billAmount, 6, RoundingMode.HALF_UP);
|
||||
BigDecimal shouldRefund = refundAmount.multiply(proportion).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
// 实际退款金额取可退金额与应退金额的较小值
|
||||
BigDecimal actualRefund = shouldRefund.min(availableRefund);
|
||||
|
||||
Bonus refundBonus = new Bonus();
|
||||
refundBonus.setId(bonus.getId());
|
||||
refundBonus.setStatus(bonus.getStatus());
|
||||
refundBonus.setRefundAmount(bonusRefundAmount);
|
||||
refundBonus.setRefundAmount(actualRefund);
|
||||
refundBonus.setArrivalId(bonus.getArrivalId());
|
||||
refundBonus.setArrivalType(bonus.getArrivalType());
|
||||
refundBonus.setBillNo(bonus.getBillNo());
|
||||
|
@ -1677,60 +1447,110 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
refundBonus.setToBalance(bonus.getToBalance());
|
||||
refundList.add(refundBonus);
|
||||
|
||||
dividedAmount = dividedAmount.add(bonusRefundAmount);
|
||||
dividedAmount = dividedAmount.add(actualRefund);
|
||||
}
|
||||
// 若存在误差,则平台吃掉误差
|
||||
if (dividedAmount.compareTo(refundAmount) != 0) {
|
||||
Bonus platform = refundList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.PLATFORM.getType())).findFirst().orElse(null);
|
||||
ServiceUtil.assertion(platform == null, "平台不存在");
|
||||
|
||||
BigDecimal subtract = refundAmount.subtract(dividedAmount); // 误差值
|
||||
platform.setRefundAmount(platform.getRefundAmount().add(subtract));
|
||||
}
|
||||
// 处理误差
|
||||
handleRefundAmountDiff(refundList, bonusList, dividedAmount, refundAmount);
|
||||
|
||||
// 校验金额
|
||||
for (Bonus bonus : refundList) {
|
||||
ServiceUtil.assertion(bonus.getRefundAmount().compareTo(BigDecimal.ZERO) < 0, "退款金额不允许小于0");
|
||||
}
|
||||
BigDecimal sum = refundList.stream().map(Bonus::getRefundAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
BigDecimal sum = CollectionUtils.sumDecimal(refundList, Bonus::getRefundAmount);
|
||||
ServiceUtil.assertion(sum.compareTo(refundAmount) != 0, "退款金额分配出错");
|
||||
|
||||
// 执行退款逻辑
|
||||
return executeRefund(refundList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理退款金额分配的误差
|
||||
* @param refundList 退款列表
|
||||
* @param bonusList 原始分成列表
|
||||
* @param dividedAmount 已分配金额
|
||||
* @param refundAmount 需要退款总金额
|
||||
*/
|
||||
private void handleRefundAmountDiff(List<Bonus> refundList, List<BonusVO> bonusList, BigDecimal dividedAmount, BigDecimal refundAmount) {
|
||||
if (dividedAmount.compareTo(refundAmount) == 0) {
|
||||
return;
|
||||
}
|
||||
// 误差值
|
||||
BigDecimal diff = refundAmount.subtract(dividedAmount);
|
||||
|
||||
// 多个分成方共同承担误差
|
||||
BigDecimal remainingDiff = diff;
|
||||
for (Bonus refundBonus : refundList) {
|
||||
// 获取原始分成记录
|
||||
BonusVO originalBonus = bonusList.stream()
|
||||
.filter(b -> b.getId().equals(refundBonus.getId()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
||||
if (originalBonus == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 计算当前分成方的剩余可退金额
|
||||
BigDecimal availableRefund = originalBonus.getAmount()
|
||||
.subtract(originalBonus.getRefundAmount() == null ? BigDecimal.ZERO : originalBonus.getRefundAmount())
|
||||
.subtract(refundBonus.getRefundAmount());
|
||||
|
||||
// 如果剩余可退金额足够承担误差
|
||||
if (availableRefund.compareTo(BigDecimal.ZERO) > 0) {
|
||||
// 取可用退款金额与剩余误差中的较小值
|
||||
BigDecimal adjustAmount = availableRefund.min(remainingDiff);
|
||||
refundBonus.setRefundAmount(refundBonus.getRefundAmount().add(adjustAmount));
|
||||
remainingDiff = remainingDiff.subtract(adjustAmount);
|
||||
|
||||
// 如果误差已经分配完毕,则退出
|
||||
if (remainingDiff.compareTo(BigDecimal.ZERO) == 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 如果仍然无法完全分配误差,抛出异常
|
||||
if (remainingDiff.compareTo(BigDecimal.ZERO) > 0) {
|
||||
throw new ServiceException("退款金额分配出错:无法处理误差金额");
|
||||
}
|
||||
}
|
||||
|
||||
// 执行分成退款
|
||||
private int executeRefund(List<Bonus> refundList) {
|
||||
Integer result = transactionTemplate.execute(status -> {
|
||||
int update = 0;
|
||||
|
||||
for (Bonus bonus : refundList) {
|
||||
// 根据分成状态来决定是否扣减用户余额(给用户加余额前需要判断分成状态是否为待分成)
|
||||
if (BonusStatus.WAIT_DIVIDE.getStatus().equals(bonus.getStatus())) {
|
||||
// 待分成,扣减待分成金额,加上退款金额
|
||||
int refund = bonusService.refundWhenWaitDivide(bonus.getId(), bonus.getRefundAmount());
|
||||
ServiceUtil.assertion(refund != 1, "可退款金额不足");
|
||||
} else if (BonusStatus.DIVIDEND.getStatus().equals(bonus.getStatus())) {
|
||||
// 已分成,扣减已分成金额,加上退款金额
|
||||
int refund = bonusService.refundWhenDividend(bonus.getId(), bonus.getRefundAmount());
|
||||
ServiceUtil.assertion(refund != 1, "可退款金额不足");
|
||||
|
||||
// 扣减分成方余额
|
||||
ServiceUtil.assertion(bonus.getToBalance() == null, "数据异常,请联系管理员处理");
|
||||
if (bonus.getToBalance() != null && bonus.getToBalance()) {
|
||||
if (BonusArrivalType.userList().contains(bonus.getArrivalType())) {
|
||||
userService.subtractBalance(bonus.getArrivalId(), bonus.getRefundAmount(), String.format("订单退款:%s", bonus.getBillNo()), RecordBalanceBstType.RECHARGE, bonus.getBillId());
|
||||
userService.subtractBalance(
|
||||
bonus.getArrivalId(),
|
||||
bonus.getRefundAmount(),
|
||||
String.format("订单退款:%s", bonus.getBillNo()),
|
||||
RecordBalanceBstType.RECHARGE,
|
||||
bonus.getBillId()
|
||||
);
|
||||
} else if (BonusArrivalType.deptList().contains(bonus.getArrivalType())) {
|
||||
// deptService.subtractBalance(bonus.getArrivalId(), bonus.getRefundAmount(), String.format("订单退款:%s", bonus.getBillNo()), RecordBalanceBstType.RECHARGE, bonus.getBillId());
|
||||
// deptService相关逻辑暂时不处理
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
update++;
|
||||
}
|
||||
|
||||
return update;
|
||||
});
|
||||
|
||||
return result == null ? 0 : result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public int updateByQuery(TransactionBill data, TransactionBillQuery query) {
|
||||
if (query == null) {
|
||||
|
@ -1809,33 +1629,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
|||
return 0;
|
||||
}
|
||||
|
||||
// 结束使用订单
|
||||
// @Override
|
||||
// public int endUse(EndUseBO bo) {
|
||||
// if (bo == null) {
|
||||
// return 0;
|
||||
// }
|
||||
//
|
||||
// return this.endSmartUse(bo);
|
||||
|
||||
// 智能订单
|
||||
// if (SuitFeeMode.SMART.getMode().equals(bill.getSuitFeeMode())) {
|
||||
// // 单次智能
|
||||
//// if (SuitFeeType.singleList().contains(bill.getSuitFeeType())) {
|
||||
//// }
|
||||
//// // 分时段智能
|
||||
//// else if (SuitFeeType.timingList().contains(bill.getSuitFeeType())){
|
||||
//// return this.endTimingUse(bo);
|
||||
//// }
|
||||
// }
|
||||
// // 单次订单
|
||||
// else if (SuitFeeMode.SINGLE.getMode().equals(bill.getSuitFeeMode())) {
|
||||
// return this.endUseSingle(bo);
|
||||
// }
|
||||
//
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
@Override
|
||||
public <T> List<TransactionAmountVO<T>> selectCommonSumOfMoney(TransactionBillQuery query, String groupBy) {
|
||||
return transactionBillMapper.selectCommonSumOfMoney(query, groupBy);
|
||||
|
|
|
@ -180,19 +180,4 @@ public class SmTransactionBillController extends BaseController
|
|||
return error("暂不支持该订单类型");
|
||||
}
|
||||
|
||||
// 修复订单数据
|
||||
@PutMapping("/{billId}/fix")
|
||||
@Log(title = "修复订单数据", businessType = BusinessType.UPDATE)
|
||||
@PreAuthorize("@ss.hasPermi('system:bill:fix')")
|
||||
public AjaxResult fix(@PathVariable Long billId) {
|
||||
return toAjax(transactionBillService.fix(billId));
|
||||
}
|
||||
|
||||
@PutMapping("/fixAll")
|
||||
@Log(title = "修复所有订单数据", businessType = BusinessType.UPDATE)
|
||||
@PreAuthorize("@ss.hasPermi('system:bill:fix')")
|
||||
public AjaxResult fixAll() {
|
||||
return toAjax(transactionBillService.fixAll());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user