From 506f0dc2e5b0f95047d0b6fe60b286928a4b863a Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期一, 25 五月 2026 15:33:38 +0800
Subject: [PATCH] bug

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |   39 +++++++++++++++----
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java                     |   29 ++++++++++++--
 2 files changed, 55 insertions(+), 13 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index 9400899..328bc82 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -449,6 +449,26 @@
     }
 
     /**
+     * 获取第三方实付金额,兼容早期未写入third_pay_amount的纯第三方支付订单。
+     *
+     * @param order 充电订单
+     * @return 第三方可退款本金
+     */
+    private BigDecimal getRefundableThirdPayAmount(TChargingOrder order) {
+        if (order == null || isWhitelistAllFreeOrder(order)) {
+            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+        }
+        BigDecimal thirdPayAmount = money(order.getThirdPayAmount());
+        if (thirdPayAmount.compareTo(BigDecimal.ZERO) > 0) {
+            return thirdPayAmount;
+        }
+        if (Integer.valueOf(3).equals(order.getPayMethod())) {
+            return money(order.getRechargeAmount());
+        }
+        return thirdPayAmount;
+    }
+
+    /**
      * 调整用户余额
      *
      * @param userId 用户ID
@@ -1281,7 +1301,7 @@
 	                    // 白名单全部免费启动失败同样只记录预估金额,避免未支付订单进入实际退款流程。
 	                    BigDecimal recordedRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? rechargeAmount : totalRefundAmount;
 	                    BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(chargingOrder) ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : totalRefundAmount;
-	                    BigDecimal thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                    BigDecimal thirdRefundAmount = channelRefundAmount.min(getRefundableThirdPayAmount(chargingOrder)).setScale(2, RoundingMode.HALF_UP);
 	                    BigDecimal balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                     //构建退款明细
                     TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
@@ -1326,7 +1346,7 @@
                         model.setNotify_url("/payment/wx/refund/notify");
                         WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                         amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
-                        amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
+                        amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
                         amount.setCurrency("CNY");
                         model.setAmount(amount);
                         R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
@@ -1477,7 +1497,7 @@
 				model.setNotify_url("/payment/wx/refund/notify");
 				WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
 				amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
-				amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
+				amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
 				amount.setCurrency("CNY");
 				model.setAmount(amount);
 				R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
@@ -3300,7 +3320,8 @@
                 Integer payMethod = chargingOrder.getPayMethod();
                 BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
                 BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
-                BigDecimal refundableAmount = money(chargingOrder.getThirdPayAmount()).add(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+                BigDecimal refundableThirdPayAmount = getRefundableThirdPayAmount(chargingOrder);
+                BigDecimal refundableAmount = refundableThirdPayAmount.add(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                 // 全部免费订单启动时未拉起支付,渠道可退金额固定为0,避免误触发微信/支付宝/余额退款。
                 BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(chargingOrder)
                         ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)
@@ -3308,12 +3329,12 @@
                 if (Integer.valueOf(1).equals(payMethod)) {
                     balanceRefundAmount = channelRefundAmount.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                 } else if (Integer.valueOf(2).equals(payMethod)) {
-                    thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                    thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP);
                     balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                 } else {
-                    thirdRefundAmount = channelRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                    thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP);
                 }
-                BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount);
+                BigDecimal actualThirdPayAmount = refundableThirdPayAmount.subtract(thirdRefundAmount);
                 if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) {
                     actualThirdPayAmount = BigDecimal.ZERO;
                 }
@@ -3469,7 +3490,7 @@
                             model.setNotify_url("/payment/wx/refund/notify");
                             WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                             amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
-                            amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
+                            amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
                             amount.setCurrency("CNY");
                             model.setAmount(amount);
                             R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
@@ -3751,7 +3772,7 @@
 				model.setNotify_url("/payment/wx/refund/notify");
 				WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
 				amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
-				amount.setTotal((isBalancePayMode(tChargingOrder.getPayMethod()) ? money(tChargingOrder.getThirdPayAmount()) : money(tChargingOrder.getRechargeAmount())).multiply(new BigDecimal(100)).intValue());
+				amount.setTotal(getRefundableThirdPayAmount(tChargingOrder).multiply(new BigDecimal(100)).intValue());
 				amount.setCurrency("CNY");
 				model.setAmount(amount);
 				R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
index 3ea5448..d1d0b5e 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -176,6 +176,26 @@
     }
 
     /**
+     * 获取第三方实付金额,兼容早期未写入third_pay_amount的纯第三方支付订单。
+     *
+     * @param order 充电订单
+     * @return 第三方可退款本金
+     */
+    private BigDecimal getRefundableThirdPayAmount(TChargingOrder order) {
+        if (order == null || isWhitelistAllFreeOrder(order)) {
+            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+        }
+        BigDecimal thirdPayAmount = money(order.getThirdPayAmount());
+        if (thirdPayAmount.compareTo(BigDecimal.ZERO) > 0) {
+            return thirdPayAmount;
+        }
+        if (Integer.valueOf(3).equals(order.getPayMethod())) {
+            return money(order.getRechargeAmount());
+        }
+        return thirdPayAmount;
+    }
+
+    /**
      * 判断订单是否为白名单订单
      *
      * @param order 充电订单
@@ -766,7 +786,8 @@
 
                         //开始构建退款费用
                         refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
-                        BigDecimal refundableAmount = money(order.getThirdPayAmount()).add(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+                        BigDecimal refundableThirdPayAmount = getRefundableThirdPayAmount(order);
+                        BigDecimal refundableAmount = refundableThirdPayAmount.add(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                         // 白名单全部免费只记录预估预充金额,实际渠道退款金额保持0,防止补偿任务重复发起退款。
                         BigDecimal recordedRefundAmount = isWhitelistAllFreeOrder(order) ? money(order.getRechargeAmount()) : refundAmount;
                         BigDecimal channelRefundAmount = isWhitelistAllFreeOrder(order)
@@ -779,10 +800,10 @@
                         if (Integer.valueOf(1).equals(payMethod)) {
                             balanceRefundAmount = channelRefundAmount.min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                         } else if (Integer.valueOf(2).equals(payMethod)) {
-                            thirdRefundAmount = channelRefundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                            thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP);
                             balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                         } else {
-                            thirdRefundAmount = channelRefundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                            thirdRefundAmount = channelRefundAmount.min(refundableThirdPayAmount).setScale(2, RoundingMode.HALF_UP);
                         }
                         if (channelRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                             refundAmount = thirdRefundAmount.add(balanceRefundAmount).setScale(2, RoundingMode.HALF_UP);
@@ -825,7 +846,7 @@
                                 model.setNotify_url("/payment/wx/refund/notify");
                                 WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                                 amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
-                                amount.setTotal((isBalancePayMode(order.getPayMethod()) ? money(order.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
+                                amount.setTotal(getRefundableThirdPayAmount(order).multiply(new BigDecimal(100)).intValue());
                                 amount.setCurrency("CNY");
                                 model.setAmount(amount);
                                 R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);

--
Gitblit v1.7.1