From 976ff3fe092ee2f9515013dbfab77d25b2944b75 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 14 十月 2026 11:18:29 +0800
Subject: [PATCH] 修改bug

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java |   70 +++++++++++++++++++++++++++++++----
 1 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index 0ec1b7d..df80466 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -10,6 +10,7 @@
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
 import java.time.*;
+import java.util.concurrent.TimeUnit;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -1871,6 +1872,12 @@
     
     
     
+    /**
+     * 安全检测等待窗口(秒):设备在此时长内未上报有效安全检测时,前端按「未插枪」提示用户,
+     * 超时订单由启动超时兜底任务自动取消,避免订单永久停留在启动中状态。
+     */
+    private static final long STARTUP_WAIT_SECONDS = 90L;
+
     @ResponseBody
     @GetMapping(value = "/preChargeCheck/{id}")
     @ApiOperation(value = "获取安全检测数据", tags = {"小程序-扫一扫"})
@@ -1880,10 +1887,17 @@
     public AjaxResult<PreChargeCheck> preChargeCheck(@PathVariable Integer id) {
         String key = "AQJC_" + id;
         PreChargeCheck cacheObject = redisService.getCacheObject(key);
-        if(null != cacheObject){
-            if(LocalDateTime.now().minusMinutes(1).isAfter(cacheObject.getAddTime())){
-                redisService.deleteObject(key);
-                cacheObject = null;
+        if (null != cacheObject) {
+            LocalDateTime addTime = cacheObject.getAddTime();
+            // 等待安全检测超出窗口且启动指令尚未下发时,按「未插枪」提示前端;
+            // 缓存必须保留:设备安全检测上报依赖该缓存推进启动,删除会导致订单永久卡在启动中
+            if (Integer.valueOf(1).equals(cacheObject.getStartupSuccess())
+                    && !Boolean.TRUE.equals(cacheObject.getStartCommandSent())
+                    && null != addTime
+                    && LocalDateTime.now().isAfter(addTime.plusSeconds(STARTUP_WAIT_SECONDS))) {
+                cacheObject.setStartupSuccess(3);
+                cacheObject.setFailureCause(5);
+                redisService.setCacheObject(key, cacheObject, 24L, TimeUnit.HOURS);
             }
         }
         return AjaxResult.success(cacheObject);
@@ -1912,6 +1926,18 @@
     })
     public AjaxResult stopCharging(@PathVariable String id) {
         log.info("小程序主动发起停止充电,订单ID:{}", id);
+        // VIN 码充电订单路由:VD 订单存于 t_vin_charging_order,不在 t_charging_order;
+        // VD 表存在该 ID 订单时优先走 VIN 停充(内部按状态返回准确的“不能重复操作/还未开始充电”),
+        // 其余情况回落普通停充。雪花 ID 两表同源生成,撞号概率可忽略
+        TVinChargingOrder vinOrder = null;
+        try {
+            vinOrder = vinChargingOrderService.getById(Long.valueOf(id));
+        } catch (NumberFormatException ignored) {
+            // 非数字订单ID,按普通停充处理
+        }
+        if (vinOrder != null) {
+            return vinChargingOrderService.stopChargingByApplet(id);
+        }
         return chargingOrderService.stopCharging(id);
     }
     
@@ -2432,10 +2458,38 @@
         }
         return R.ok(result);
     }
-    
-    
-    
-    
+
+    /**
+     * 内部接口:统计公司名下进行中充电订单数(三表合计,状态 2=启动中/3=充电中/4=停止中,
+     * 账户模式切换:分配→共享 前校验使用)
+     */
+    @PostMapping("/inner/count-active-by-company")
+    public R<Integer> countActiveByCompany(@RequestParam("companyId") Integer companyId) {
+        if (companyId == null) {
+            return R.ok(0);
+        }
+        try {
+            List<Integer> activeStatuses = Arrays.asList(2, 3, 4);
+            long count = 0L;
+            count += chargingOrderService.lambdaQuery()
+                    .eq(TChargingOrder::getCompanyId, companyId)
+                    .in(TChargingOrder::getStatus, activeStatuses)
+                    .count();
+            count += cardChargingOrderService.lambdaQuery()
+                    .eq(TCardChargingOrder::getCompanyId, companyId)
+                    .in(TCardChargingOrder::getStatus, activeStatuses)
+                    .count();
+            count += vinChargingOrderService.lambdaQuery()
+                    .eq(TVinChargingOrder::getCompanyId, companyId)
+                    .in(TVinChargingOrder::getStatus, activeStatuses)
+                    .count();
+            return R.ok((int) count);
+        } catch (RuntimeException ex) {
+            log.error("统计公司进行中充电订单失败:companyId={}", companyId, ex);
+            return R.fail("统计公司进行中充电订单失败:" + ex.getMessage());
+        }
+    }
+
     @RequiresPermissions(value = {"/chargingOperationAnalysis"}, logical = Logical.OR)
     @ResponseBody
     @PostMapping(value = "/charging/statistics")

--
Gitblit v1.7.1