longz
2026-07-21 2b4ccf5ba9e76e8f73f0c5821877e48a24db5f60
fix: 修正特殊退款累计金额
1个文件已修改
36 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -4821,6 +4821,7 @@
        if (order == null) {
            return R.fail("未查询到支付成功的充电订单");
        }
        mergeSuccessfulRefundAmounts(order);
        PayOrderInfoDto dto = new PayOrderInfoDto();
        dto.setOrderId(order.getId().toString());
        dto.setCode(order.getCode());
@@ -4862,6 +4863,7 @@
            if (order == null) {
                return R.fail("充电订单不存在");
            }
            mergeSuccessfulRefundAmounts(order);
            BigDecimal refundAmount = money(payOrderQueryDto.getRefundAmount());
            BigDecimal refundableAmount = money(order.getPaymentAmount()).subtract(money(order.getRefundAmount())).setScale(2, RoundingMode.HALF_UP);
            if (refundAmount.compareTo(refundableAmount) > 0) {
@@ -4928,6 +4930,40 @@
        }
    }
    private void mergeSuccessfulRefundAmounts(TChargingOrder order) {
        if (order == null || order.getId() == null) {
            return;
        }
        List<TChargingOrderRefund> refunds = chargingOrderRefundService.list(
                new LambdaQueryWrapper<TChargingOrderRefund>()
                        .eq(TChargingOrderRefund::getChargingOrderId, order.getId())
                        .eq(TChargingOrderRefund::getRefundStatus, 2));
        if (refunds == null || refunds.isEmpty()) {
            return;
        }
        BigDecimal successfulAmount = BigDecimal.ZERO;
        BigDecimal explicitBalanceAmount = BigDecimal.ZERO;
        BigDecimal explicitThirdAmount = BigDecimal.ZERO;
        BigDecimal unspecifiedAmount = BigDecimal.ZERO;
        for (TChargingOrderRefund refund : refunds) {
            BigDecimal amount = money(refund.getRefundAmount());
            BigDecimal balanceAmount = money(refund.getBalanceRefundAmount());
            BigDecimal thirdAmount = money(refund.getThirdRefundAmount());
            successfulAmount = successfulAmount.add(amount);
            explicitBalanceAmount = explicitBalanceAmount.add(balanceAmount);
            explicitThirdAmount = explicitThirdAmount.add(thirdAmount);
            if (balanceAmount.add(thirdAmount).compareTo(BigDecimal.ZERO) == 0) {
                unspecifiedAmount = unspecifiedAmount.add(amount);
            }
        }
        BigDecimal inferredThirdAmount = unspecifiedAmount.min(
                getRefundableThirdPayAmount(order).subtract(explicitThirdAmount).max(BigDecimal.ZERO));
        BigDecimal inferredBalanceAmount = unspecifiedAmount.subtract(inferredThirdAmount).max(BigDecimal.ZERO);
        order.setRefundAmount(money(order.getRefundAmount()).max(money(successfulAmount)));
        order.setThirdRefundAmount(money(order.getThirdRefundAmount()).max(money(explicitThirdAmount.add(inferredThirdAmount))));
        order.setBalanceRefundAmount(money(order.getBalanceRefundAmount()).max(money(explicitBalanceAmount.add(inferredBalanceAmount))));
    }
    private R refundIcbcShareBeforeMainRefund(TChargingOrder order, TChargingOrderRefund refund, BigDecimal thirdRefundAmount) {
        if (order == null || refund == null || thirdRefundAmount == null || thirdRefundAmount.compareTo(BigDecimal.ZERO) <= 0) {
            return R.ok();