From eb2b04d95bb70378f60eaa70bfda8e4c7f08846a Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 14 十月 2026 13:42:27 +0800
Subject: [PATCH] 修改bug

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |   56 ++++++++++++++++++++++++++------------------------------
 1 files changed, 26 insertions(+), 30 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 31d10ea..eec9c0e 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
@@ -2033,6 +2033,11 @@
         chargingOrder.setVipDiscountAmount(discountAmount);
         this.updateById(chargingOrder);
 
+        // 支付成功立即下发启动充电指令(恢复 master 时序:桩收到指令后再做安全检测并回启动应答)。
+        // 预约订单不在此处下发,由 startDueReservationOrders 到期后统一下发。
+        if (chargingOrder.getReservationTime() == null) {
+            startCharging(chargingOrder, preChargeCheck);
+        }
 
         return AjaxResult.success();
     }
@@ -2067,13 +2072,6 @@
                     + ReservationTimeRangeSupport.describe(ranges) + ")");
         }
         return null;
-    }
-
-    private boolean isSafetyCheckPassed(PreChargeCheck check) {
-        return check != null
-                && Boolean.TRUE.equals(check.getElectronicLockLock())
-                && Boolean.TRUE.equals(check.getInsulationTesting())
-                && Boolean.TRUE.equals(check.getSecureConnectionDetection());
     }
 
     /**
@@ -2123,9 +2121,11 @@
         for (TChargingOrder order : dueOrders) {
             try {
                 PreChargeCheck check = redisService.getCacheObject("AQJC_" + order.getChargingGunId());
-                if (isSafetyCheckPassed(check)) {
-                    startChargingAfterSafety(order, check);
+                if (null == check) {
+                    check = newPreChargeCheck(order);
                 }
+                // 预约到期后直接下发启动指令,无需等待安全检测通过
+                startCharging(order, check);
             } catch (Exception e) {
                 log.error("预约充电到时启动失败,orderCode={}", order.getCode(), e);
             }
@@ -2170,43 +2170,44 @@
         }
     }
 
-    private void startChargingAfterSafety(TChargingOrder chargingOrder, PreChargeCheck check) {
+    private void startCharging(TChargingOrder chargingOrder, PreChargeCheck check) {
         RLock lock = redissonClient.getLock("START_AFTER_SAFETY:" + chargingOrder.getId());
         try {
             if (!lock.tryLock(1, 10, TimeUnit.SECONDS)) {
                 return;
             }
-            TChargingOrder latest = this.getById(chargingOrder.getId());
-            if (latest == null || latest.getStatus() != 2 || Boolean.TRUE.equals(check.getStartCommandSent())) {
+            // 直接使用传入对象:支付完成/预约到期路径下传入对象已是当前最新状态,
+            // 避免读写分离下 this.getById 立即回查读不到刚提交的 status=2 导致指令不下发
+            if (chargingOrder == null || chargingOrder.getStatus() != 2 || Boolean.TRUE.equals(check.getStartCommandSent())) {
                 return;
             }
-            if (!ReservationOrderSupport.isStartDue(latest.getReservationTime(), LocalDateTime.now())) {
+            if (!ReservationOrderSupport.isStartDue(chargingOrder.getReservationTime(), LocalDateTime.now())) {
                 return;
             }
-            TChargingGun gun = chargingGunClient.getChargingGunById(latest.getChargingGunId()).getData();
+            TChargingGun gun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
             TChargingPile pile = chargingPileClient.getChargingPileById(gun.getChargingPileId()).getData();
             String actualVin = normalizeVin(check.getActualVin());
             PlatformStartCharging command = new PlatformStartCharging();
-            command.setTransaction_serial_number(latest.getCode());
+            command.setTransaction_serial_number(chargingOrder.getCode());
             command.setCharging_pile_code(pile.getCode());
             command.setCharging_gun_code(gun.getCode());
-            command.setCard_number(latest.getId().toString());
-            command.setAccount_balance(latest.getChargeAmount());
-            latest.setActualVin(actualVin);
-            this.updateById(latest);
-            log.info(latest.getCode() + ":安全检测通过,下发启动充电命令:" + command);
+            command.setCard_number(chargingOrder.getId().toString());
+            command.setAccount_balance(chargingOrder.getChargeAmount());
+            chargingOrder.setActualVin(actualVin);
+            this.updateById(chargingOrder);
+            log.info(chargingOrder.getCode() + ":下发启动充电命令:" + command);
             try {
                 sendMessageClient.platformStartCharging(command);
             } catch (Exception e) {
-                // 下发失败不置 startCommandSent:保留后续安全检测上报重试机会,超时订单由兜底任务取消
-                log.error(latest.getCode() + ":启动充电命令下发失败,等待下次安全检测上报重试", e);
+                // 下发失败不置 startCommandSent:由启动超时兜底任务取消订单并退款
+                log.error(chargingOrder.getCode() + ":启动充电命令下发失败,交由启动超时兜底任务处理", e);
                 return;
             }
             check.setStartCommandSent(true);
-            redisService.setCacheObject("AQJC_" + latest.getChargingGunId(), check, 24L, TimeUnit.HOURS);
+            redisService.setCacheObject("AQJC_" + chargingOrder.getChargingGunId(), check, 24L, TimeUnit.HOURS);
             ScheduledExecutorService resultScheduler = Executors.newScheduledThreadPool(1);
             resultScheduler.scheduleAtFixedRate(() -> {
-                if (timingDetection(latest.getId())) {
+                if (timingDetection(chargingOrder.getId())) {
                     resultScheduler.shutdown();
                 }
             }, 10, 1, TimeUnit.SECONDS);
@@ -2421,12 +2422,7 @@
         // 刷新等待基准时间,避免前端等待窗口/超时判断误伤正在推进的安全检测
         preChargeCheck1.setAddTime(LocalDateTime.now());
         redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
-        if (isSafetyCheckPassed(preChargeCheck1)) {
-            TChargingOrder pendingOrder = getPendingStartOrder(chargingGun.getId());
-            if (pendingOrder != null) {
-                startChargingAfterSafety(pendingOrder, preChargeCheck1);
-            }
-        }
+        // 启动指令已在支付完成/预约到期时下发,此处仅记录检测结果,不再触发启动
     }
 
     /**

--
Gitblit v1.7.1