From 461b3df61dfd1cc887dc24c58395dd9436605588 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 08 五月 2026 16:48:34 +0800
Subject: [PATCH] 联调充电桩

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java       |   66 ++++++++++++++++++---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java |   36 ++++++-----
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java                           |   40 ++++++++-----
 3 files changed, 99 insertions(+), 43 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 9b540b5..0ba71ac 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
@@ -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);
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 4ac4e4a..401c549 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
@@ -685,8 +685,17 @@
                         refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
                         if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
                             Integer rechargePaymentType = order.getRechargePaymentType();
-                            BigDecimal thirdRefundAmount = refundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
-                            BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+                            Integer payMethod = order.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(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+                            } else if (Integer.valueOf(2).equals(payMethod)) {
+                                thirdRefundAmount = refundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
+                                balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
+                            } else {
+                                thirdRefundAmount = refundAmount;
+                            }
                             refundAmount = thirdRefundAmount.add(balanceRefundAmount).setScale(2, RoundingMode.HALF_UP);
                             order.setThirdRefundAmount(thirdRefundAmount);
                             order.setBalanceRefundAmount(balanceRefundAmount);
@@ -708,7 +717,18 @@
                             chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
                             chargingOrderRefund.setRefundTotalAmount(refundAmount);
                             chargingOrderRefund.setPayAmount(rechargeAmount);
-                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 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) {
+                                    recordBalanceRefund(order, balanceRefundAmount, chargingOrderRefund.getRefundCode());
+                                }
+                                order.setRefundStatus(2);
+                                order.setRefundTime(LocalDateTime.now());
+                                chargingOrderService.updateById(order);
+                            } else if (1 == rechargePaymentType) {
                                 WxPaymentRefundModel model = new WxPaymentRefundModel();
                                 model.setOut_trade_no(order.getCode());
                                 model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -730,7 +750,7 @@
                                     chargingOrderRefundService.updateById(chargingOrderRefund);
                                 }
                             }
-                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) {
+                            else if (2 == rechargePaymentType) {
                                 RefundReq dto = new RefundReq();
                                 dto.setOutTradeNo(order.getCode());
                                 dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
@@ -742,7 +762,7 @@
                                     chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                                 }
                             }
-                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) {
+                            else if (3 == rechargePaymentType) {
                                 RefundReq dto = new RefundReq();
                                 dto.setOutTradeNo(order.getRechargeSerialNumber());
                                 dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
@@ -753,16 +773,6 @@
                                     chargingOrderRefundService.save(chargingOrderRefund);
                                     chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                                 }
-                            }
-                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0 && balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
-                                chargingOrderRefund.setRefundStatus(2);
-                                chargingOrderRefund.setRefundSerialNumber("BALANCE");
-                                chargingOrderRefund.setRefundTime(LocalDateTime.now());
-                                chargingOrderRefundService.save(chargingOrderRefund);
-                                recordBalanceRefund(order, balanceRefundAmount, chargingOrderRefund.getRefundCode());
-                                order.setRefundStatus(2);
-                                order.setRefundTime(LocalDateTime.now());
-                                chargingOrderService.updateById(order);
                             }
                         }
                     }
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
index 1f96c33..57d3b7d 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
@@ -759,11 +759,7 @@
         if (record == null || userId == null || record.getId() == null) {
             return;
         }
-        List<TExchangeCodeUseRecord> records = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
-                .eq("user_id", userId)
-                .le("id", record.getId())
-                .orderByAsc("id"));
-        record.setCurrentBalance(calculateCurrentBalance(records));
+        record.setCurrentBalance(calculateCurrentBalanceAfterRecord(userId, record.getId()));
     }
 
     private void fillUseRecordBalances(List<TExchangeCodeUseRecord> records, Long userId) {
@@ -772,36 +768,42 @@
         }
         List<TExchangeCodeUseRecord> allRecords = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
                 .eq("user_id", userId)
-                .orderByAsc("id"));
+                .orderByDesc("id"));
         Map<Long, BigDecimal> balanceMap = new HashMap<>();
-        BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+        BigDecimal balance = getCurrentExchangeCodeBalance(userId);
         for (TExchangeCodeUseRecord item : allRecords) {
-            balance = applyUseRecordChange(balance, item);
             balanceMap.put(item.getId(), balance);
+            balance = rollbackUseRecordChange(balance, item);
         }
         for (TExchangeCodeUseRecord item : records) {
             item.setCurrentBalance(balanceMap.getOrDefault(item.getId(), BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)));
         }
     }
 
-    private BigDecimal calculateCurrentBalance(List<TExchangeCodeUseRecord> records) {
-        BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
-        if (records == null) {
-            return balance;
-        }
+    private BigDecimal calculateCurrentBalanceAfterRecord(Long userId, Long recordId) {
+        BigDecimal balance = getCurrentExchangeCodeBalance(userId);
+        List<TExchangeCodeUseRecord> records = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
+                .eq("user_id", userId)
+                .gt("id", recordId)
+                .orderByDesc("id"));
         for (TExchangeCodeUseRecord item : records) {
-            balance = applyUseRecordChange(balance, item);
+            balance = rollbackUseRecordChange(balance, item);
         }
         return balance;
     }
 
-    private BigDecimal applyUseRecordChange(BigDecimal balance, TExchangeCodeUseRecord record) {
+    private BigDecimal rollbackUseRecordChange(BigDecimal balance, TExchangeCodeUseRecord record) {
         BigDecimal amount = defaultMoney(record == null ? null : record.getUsedAmount());
         Integer changeType = record == null ? null : record.getChangeType();
         if (USE_RECORD_TYPE_CONSUME.equals(changeType)) {
-            return balance.subtract(amount).setScale(2, RoundingMode.HALF_UP);
+            return balance.add(amount).setScale(2, RoundingMode.HALF_UP);
         }
-        return balance.add(amount).setScale(2, RoundingMode.HALF_UP);
+        return balance.subtract(amount).setScale(2, RoundingMode.HALF_UP);
+    }
+
+    private BigDecimal getCurrentExchangeCodeBalance(Long userId) {
+        Map<Long, BigDecimal> balanceMap = getUserExchangeCodeBalanceMap(Collections.singletonList(userId));
+        return defaultMoney(balanceMap.get(userId));
     }
 
     private void fillUseRecordView(TExchangeCodeUseRecord record) {

--
Gitblit v1.7.1