“mitao”
2026-05-08 c5a4bbfbe2e7858446cc54c7b474af0d1380944b
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1320,14 +1320,29 @@
      if (chargingOrder.getOrderSource() == 1) {
         BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
         Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
         Integer payMethod = chargingOrder.getPayMethod();
         //构建退款明细
         TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
         chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
         chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
         chargingOrderRefund.setRefundAmount(money);
         chargingOrderRefund.setBalanceRefundAmount(BigDecimal.ZERO);
         chargingOrderRefund.setThirdRefundAmount(money);
         BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
         BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
         if (Integer.valueOf(1).equals(payMethod)) {
            balanceRefundAmount = money.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
         } else if (Integer.valueOf(2).equals(payMethod)) {
            BigDecimal refundableThirdAmount = money(chargingOrder.getThirdPayAmount()).subtract(money(chargingOrder.getThirdRefundAmount()));
            if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
               refundableThirdAmount = BigDecimal.ZERO;
            }
            thirdRefundAmount = money.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP);
            balanceRefundAmount = money.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
         } else {
            thirdRefundAmount = money;
         }
         chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
         chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
         chargingOrderRefund.setRefundStatus(1);
         chargingOrderRefund.setPayType(rechargePaymentType);
         chargingOrderRefund.setRefundStatus(1);
@@ -1338,6 +1353,11 @@
         chargingOrderRefund.setRefundRemark("充电完成退款,手动退款");
         chargingOrderRefund.setRefundTotalAmount(money);
         chargingOrderRefund.setPayAmount(money);
         if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
            chargingOrderRefund.setRefundSerialNumber("BALANCE");
            finishManualChargingRefund(chargingOrder, chargingOrderRefund, money, balanceRefundAmount, thirdRefundAmount);
            return;
         }
         if (1 == rechargePaymentType) {
            WxPaymentRefundModel model = new WxPaymentRefundModel();
            model.setOut_trade_no(chargingOrder.getCode());
@@ -1345,7 +1365,7 @@
            model.setReason("充电完成退款");
            model.setNotify_url("/payment/wx/refund/notify");
            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
            amount.setRefund(money.multiply(new BigDecimal(100)).intValue());
            amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
            amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
            amount.setCurrency("CNY");
            model.setAmount(amount);
@@ -1363,8 +1383,8 @@
         if (2 == rechargePaymentType) {
            RefundReq dto = new RefundReq();
            dto.setOutTradeNo(chargingOrder.getCode());
            dto.setOutRequestNo(chargingOrderRefund.getCode());
            dto.setRefundAmount(money.toString());
            dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
            dto.setRefundAmount(thirdRefundAmount.toString());
            dto.setRefundReason("充电完成退款");
            RefundResp resp = aliPaymentClient.refund(dto).getData();
            if (null != resp) {
@@ -1380,8 +1400,8 @@
         if (3 == rechargePaymentType) {
            RefundReq dto = new RefundReq();
            dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
            dto.setOutRequestNo(chargingOrderRefund.getCode());
            dto.setRefundAmount(money.toString());
            dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
            dto.setRefundAmount(thirdRefundAmount.toString());
            dto.setRefundReason("充电完成退款");
            RefundResp resp = h5AliPaymentClient.refund(dto).getData();
            if (null != resp && "10000".equals(resp.getCode())) {
@@ -2999,8 +3019,17 @@
                chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
                chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
                refundAmount = refundAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
                BigDecimal thirdRefundAmount = refundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
                BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                Integer payMethod = chargingOrder.getPayMethod();
                BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
                BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
                if (Integer.valueOf(1).equals(payMethod)) {
                    balanceRefundAmount = refundAmount.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                } else if (Integer.valueOf(2).equals(payMethod)) {
                    thirdRefundAmount = refundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
                    balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                } else {
                    thirdRefundAmount = refundAmount;
                }
                BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount);
                if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) {
                    actualThirdPayAmount = BigDecimal.ZERO;
@@ -3124,6 +3153,8 @@
                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                        chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
                        chargingOrderRefund.setRefundAmount(refundAmount);
                        chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
                        chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
                        chargingOrderRefund.setPayType(rechargePaymentType);
                        chargingOrderRefund.setRefundStatus(1);
                        chargingOrderRefund.setCode(chargingOrder.getCode());
@@ -3133,7 +3164,20 @@
                        chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
                        chargingOrderRefund.setRefundTotalAmount(refundAmount);
                        chargingOrderRefund.setPayAmount(rechargeAmount);
                        if (1 == rechargePaymentType) {
                        if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
                            chargingOrderRefund.setRefundStatus(2);
                            chargingOrderRefund.setRefundSerialNumber("BALANCE");
                            chargingOrderRefund.setRefundTime(LocalDateTime.now());
                            chargingOrderRefundService.save(chargingOrderRefund);
                            if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                                changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
                                recordBalanceRefund(chargingOrder, balanceRefundAmount, chargingOrderRefund.getRefundCode());
                            }
                            chargingOrder.setRefundStatus(2);
                            chargingOrder.setRefundTime(LocalDateTime.now());
                            this.updateById(chargingOrder);
                        } else if (1 == rechargePaymentType) {
                            WxPaymentRefundModel model = new WxPaymentRefundModel();
                            model.setOut_trade_no(chargingOrder.getCode());
                            model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -3141,7 +3185,7 @@
                            model.setNotify_url("/payment/wx/refund/notify");
                            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                            amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                            amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                            amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
                            amount.setCurrency("CNY");
                            model.setAmount(amount);
                            R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);