From efbd157c0d810c39d04cd86752e769a3f3a1a1fc Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期四, 11 九月 2025 16:57:03 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/entity/BasShuttle.java                   |    7 
 src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java     |    5 
 src/main/java/com/zy/asrs/domain/param/ConfigUpdateBatchParam.java |   12 +
 src/main/java/com/zy/core/thread/impl/NyShuttleThread.java         |   34 ++
 src/main/java/com/zy/common/utils/ShuttleOperaUtils.java           |   12 +
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java        |   53 ++++
 src/main/java/com/zy/core/enums/ShuttleRequireChargeType.java      |   41 ++++
 src/main/java/com/zy/core/thread/ShuttleThread.java                |    3 
 src/main/resources/mapper/BasShuttleMapper.xml                     |    1 
 src/main/java/com/zy/system/controller/ConfigController.java       |   26 ++
 src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java              |   11 
 src/main/java/com/zy/core/enums/WrkStsType.java                    |    5 
 src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java     |    5 
 src/main/java/com/zy/core/action/ShuttleAction.java                |    2 
 src/main/webapp/static/js/basShuttle/basShuttle.js                 |    7 
 src/main/webapp/views/admin/debugParam/debugParam.html             |  285 ++++++++++++++++++++++++++++
 src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java    |   25 ++
 src/main/webapp/views/admin/basShuttle/basShuttle.html             |   36 ++-
 18 files changed, 519 insertions(+), 51 deletions(-)

diff --git a/src/main/java/com/zy/asrs/domain/param/ConfigUpdateBatchParam.java b/src/main/java/com/zy/asrs/domain/param/ConfigUpdateBatchParam.java
new file mode 100644
index 0000000..c8df0ae
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/ConfigUpdateBatchParam.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class ConfigUpdateBatchParam {
+
+    private String code;
+
+    private String value;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/BasShuttle.java b/src/main/java/com/zy/asrs/entity/BasShuttle.java
index 1ee828b..12dafc7 100644
--- a/src/main/java/com/zy/asrs/entity/BasShuttle.java
+++ b/src/main/java/com/zy/asrs/entity/BasShuttle.java
@@ -70,6 +70,13 @@
     private Integer chargeLine;
 
     /**
+     * 寤鸿鐢甸噺绾�
+     */
+    @ApiModelProperty(value= "寤鸿鐢甸噺绾�")
+    @TableField("suggest_charge_line")
+    private Integer suggestChargeLine;
+
+    /**
      * 娣诲姞浜哄憳
      */
     @ApiModelProperty(value= "娣诲姞浜哄憳")
diff --git a/src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java
index c67d3f2..b8af362 100644
--- a/src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/ForkMainServiceImpl.java
@@ -1097,7 +1097,7 @@
                 }
 
                 //鍒ゆ柇褰撳墠灏忚溅鏄惁婊¤冻闇�瑕佸厖鐢佃姹�
-                if (!shuttleThread.isRequireCharge()) {
+                if (shuttleThread.isRequireCharge().equals(ShuttleRequireChargeType.NONE)) {
                     continue;
                 }
 
@@ -1324,7 +1324,7 @@
             List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleChargeCommand(assignCommand, shuttleThread, true);
             assignCommand.setCommands(commands);//杩愯鍛戒护
 
-            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_WORKING.sts);
+            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_CHARGING.sts);
             wrkMast.setModiTime(new Date());
             if (!wrkMastService.updateById(wrkMast)) {
                 return false;
@@ -1341,7 +1341,7 @@
 
     //灏忚溅鍋滄鍏呯數
     private synchronized boolean executeShuttleChargeStepStopCharge(WrkMast wrkMast) {
-        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_WORKING.sts) {
+        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING.sts) {
             ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
@@ -1351,7 +1351,16 @@
                 return false;
             }
 
-            if (!shuttleThread.isChargingCompleted()) {
+            boolean stopCharge = false;
+            if (wrkMast.getMemo().equals("suggestChargeTaskStop")) {
+                stopCharge = true;
+            }else {
+                if (shuttleThread.isChargingCompleted()) {
+                    stopCharge = true;
+                }
+            }
+
+            if (!stopCharge) {
                 return false;
             }
 
@@ -1367,6 +1376,12 @@
 
             //涓嬪彂浠诲姟
             shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+
+            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_CHARGING_COMPLETE.sts);
+            wrkMast.setModiTime(new Date());
+            if (wrkMastService.updateById(wrkMast)) {
+                return false;
+            }
             return false;
         }
         return true;
@@ -1374,7 +1389,7 @@
 
     //灏忚溅绂诲紑鍏呯數妗�
     private synchronized boolean executeShuttleChargeStepLeaveCharge(WrkMast wrkMast) {
-        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts) {
+        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING_COMPLETE.sts) {
             ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index 6524140..001543c 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.SpringUtils;
 import com.zy.asrs.domain.enums.NotifyMsgType;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.service.*;
@@ -75,6 +76,8 @@
     private DeviceConfigService deviceConfigService;
     @Autowired
     private LiftDispatchUtils liftDispatchUtils;
+    @Autowired
+    private BasShuttleService basShuttleService;
 
     /**
      * 鍒濆鍖栧疄鏃跺湴鍥�
@@ -1094,8 +1097,26 @@
                 }
 
                 //鍒ゆ柇褰撳墠灏忚溅鏄惁婊¤冻闇�瑕佸厖鐢佃姹�
-                if (!shuttleThread.isRequireCharge()) {
-                    continue;
+                if (shuttleThread.isRequireCharge().equals(ShuttleRequireChargeType.NONE)) {
+                    continue;//鏃犻渶鍏呯數
+                }
+
+                boolean forceCharge = true;
+                if (shuttleThread.isRequireCharge().equals(ShuttleRequireChargeType.SUGGEST_CHARGE)) {
+                    BasShuttle basShuttle = basShuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", device.getDeviceNo()));
+                    if (basShuttle != null) {
+                        Integer suggestChargeLine = basShuttle.getSuggestChargeLine();
+                        boolean chargeSuggestResult = Integer.parseInt(shuttleProtocol.getBatteryPower()) < suggestChargeLine;
+                        if (chargeSuggestResult) {
+                            //妫�娴嬬郴缁熸槸鍚︽湁浠诲姟
+                            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 1, 101, 201));
+                            if (wrkMasts.isEmpty()) {
+                                forceCharge = false;
+                            }else {
+                                continue;
+                            }
+                        }
+                    }
                 }
 
                 WrkMast wrkMast1 = wrkMastService.selectShuttleWorking(shuttleProtocol.getShuttleNo());
@@ -1171,7 +1192,7 @@
                 wrkMast.setIoPri((double) 999);
                 wrkMast.setLocNo(chargeLocNo);
                 wrkMast.setShuttleNo(device.getDeviceNo());
-                wrkMast.setMemo("charge");
+                wrkMast.setMemo(forceCharge ? "forceCharge" : "suggestCharge");
                 wrkMast.setAppeTime(new Date());
                 if (!wrkMastService.insert(wrkMast)) {
                     News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", device.getDeviceNo());
@@ -1321,7 +1342,7 @@
             List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleChargeCommand(assignCommand, shuttleThread, true);
             assignCommand.setCommands(commands);//杩愯鍛戒护
 
-            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_WORKING.sts);
+            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_START_CHARGING.sts);
             wrkMast.setModiTime(new Date());
             if (!wrkMastService.updateById(wrkMast)) {
                 return false;
@@ -1338,7 +1359,7 @@
 
     //灏忚溅鍋滄鍏呯數
     private synchronized boolean executeShuttleChargeStepStopCharge(WrkMast wrkMast) {
-        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_WORKING.sts) {
+        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING.sts) {
             ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
@@ -1348,7 +1369,16 @@
                 return false;
             }
 
-            if (!shuttleThread.isChargingCompleted()) {
+            boolean stopCharge = false;
+            if (wrkMast.getMemo().equals("suggestChargeTaskStop")) {
+                stopCharge = true;
+            }else {
+                if (shuttleThread.isChargingCompleted()) {
+                    stopCharge = true;
+                }
+            }
+
+            if (!stopCharge) {
                 return false;
             }
 
@@ -1371,7 +1401,7 @@
 
     //灏忚溅绂诲紑鍏呯數妗�
     private synchronized boolean executeShuttleChargeStepLeaveCharge(WrkMast wrkMast) {
-        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts) {
+        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING_COMPLETE.sts) {
             ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
@@ -1795,7 +1825,14 @@
                 return false;
             }
 
-            String targetLocNo = navigateUtils.calcFirstLocation(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, 2);
+            //灏忚溅鍑烘彁鍗囨満杩戠偣璺濈
+            int shuttleOutLiftLocationDistance = 2;
+            Config shuttleOutLiftLocationDistanceConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleOutLiftLocationDistance"));
+            if (shuttleOutLiftLocationDistanceConfig != null) {
+                shuttleOutLiftLocationDistance = Integer.parseInt(shuttleOutLiftLocationDistanceConfig.getValue());
+            }
+
+            String targetLocNo = navigateUtils.calcFirstLocation(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.getMapTypes(NavigationMapType.NORMAL), null, null, shuttleOutLiftLocationDistance);
             if (targetLocNo == null) {//鍑烘彁鍗囨満杩戠偣璁$畻澶辫触
                 News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽嚭鎻愬崌鏈鸿繎鐐硅绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
diff --git a/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
index 0422e92..bf2033e 100644
--- a/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -123,8 +123,9 @@
 
                 , WrkStsType.NEW_CHARGE.sts
                 , WrkStsType.CHARGE_SHUTTLE_RUN.sts
-                , WrkStsType.CHARGE_SHUTTLE_WORKING.sts
-                , WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts
+                , WrkStsType.CHARGE_SHUTTLE_RUN_COMPLETE.sts
+                , WrkStsType.CHARGE_SHUTTLE_CHARGING.sts
+                , WrkStsType.CHARGE_SHUTTLE_CHARGING_COMPLETE.sts
         ).eq("shuttle_no", shuttleNo));
         if (Cools.isEmpty(wrkMasts)) {
             return false;
diff --git a/src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java b/src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java
index 61169c1..695d85a 100644
--- a/src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java
+++ b/src/main/java/com/zy/asrs/utils/ShuttleTaskUtils.java
@@ -90,9 +90,14 @@
                             wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts);
                             shuttleThread.setSyncTaskNo(0);
                             notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVE_COMPLETE);//瑙﹀彂閫氱煡
-                        } else if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_WORKING.sts) {
-                            //204.灏忚溅鍏呯數涓� ==> 205.灏忚溅鍏呯數瀹屾垚
-                            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts);
+                        } else if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_START_CHARGING.sts) {
+                            //204.灏忚溅寮�鍚厖鐢典腑 ==> 205.灏忚溅鍏呯數涓�
+                            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_CHARGING.sts);
+                            shuttleThread.setSyncTaskNo(0);
+                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_POWER_COMPLETE);//瑙﹀彂閫氱煡
+                        } else if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_CHARGING.sts) {
+                            //205.灏忚溅鍏呯數涓� ==> 206.灏忚溅鍏呯數瀹屾垚
+                            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_CHARGING_COMPLETE.sts);
                             shuttleThread.setSyncTaskNo(0);
                             notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_POWER_COMPLETE);//瑙﹀彂閫氱煡
                         } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_SHUTTLE_RUN.sts) {
diff --git a/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java b/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
index 2f826fc..7cdbed3 100644
--- a/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
+++ b/src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
@@ -371,7 +371,17 @@
         int[] pointArr = NavigatePositionConvert.positionToXY(locNo);
         NavigateNode currentNode = new NavigateNode(pointArr[0], pointArr[1]);
         currentNode.setZ(lev);
-        innerNodes.add(currentNode);
+
+        boolean addCurrentNode = true;
+        for (int[] shuttlePoint : whiteShuttlePointList) {
+            if(currentNode.getX() == shuttlePoint[0] && currentNode.getY() == shuttlePoint[1]) {
+                addCurrentNode = false;
+                break;
+            }
+        }
+        if (addCurrentNode) {
+            innerNodes.add(currentNode);
+        }
 
         List<List<MapNode>> lists = navigateMapData.getJsonData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null);//鑾峰彇瀹屾暣鍦板浘
         int[][] map = navigateMapData.parseJsonDataArr(lists);
diff --git a/src/main/java/com/zy/core/action/ShuttleAction.java b/src/main/java/com/zy/core/action/ShuttleAction.java
index d3e961f..3df5b16 100644
--- a/src/main/java/com/zy/core/action/ShuttleAction.java
+++ b/src/main/java/com/zy/core/action/ShuttleAction.java
@@ -565,7 +565,7 @@
             return;
         }
 
-        if (shuttleThread.isRequireCharge()) {
+        if (!shuttleThread.isRequireCharge().equals(ShuttleRequireChargeType.NONE)) {
             return;
         }
 
diff --git a/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java b/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
index 18ec992..a3b29bf 100644
--- a/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
+++ b/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
@@ -401,6 +401,11 @@
         //鍒ゆ柇鏄惁鏈夊厖鐢典换鍔℃鍦ㄤ娇鐢ㄧ┛姊溅
         WrkMast wrkMast = wrkMastService.selectChargeWorking(shuttleNo);
         if (wrkMast != null) {
+            if (wrkMast.getMemo().equals("suggestCharge")) {
+                wrkMast.setMemo("suggestChargeTaskStop");//鏂紑鍏呯數
+                wrkMast.setModiTime(new Date());
+                wrkMastService.updateById(wrkMast);
+            }
             return true;//鏈夊厖鐢典换鍔�
         }
         return false;//鏃犲厖鐢典换鍔�
diff --git a/src/main/java/com/zy/core/enums/ShuttleRequireChargeType.java b/src/main/java/com/zy/core/enums/ShuttleRequireChargeType.java
new file mode 100644
index 0000000..f2b7530
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/ShuttleRequireChargeType.java
@@ -0,0 +1,41 @@
+package com.zy.core.enums;
+
+public enum ShuttleRequireChargeType {
+
+    NONE(0, "鏃犻渶鍏呯數"),
+    FORCE_CHARGE(1, "寮哄埗鍏呯數"),
+    SUGGEST_CHARGE(2, "寤鸿鍏呯數")
+    ;
+
+    public Integer id;
+    public String desc;
+
+    ShuttleRequireChargeType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static ShuttleRequireChargeType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (ShuttleRequireChargeType type : ShuttleRequireChargeType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static ShuttleRequireChargeType get(ShuttleRequireChargeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (ShuttleRequireChargeType type1 : ShuttleRequireChargeType.values()) {
+            if (type1 == type) {
+                return type1;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/core/enums/WrkStsType.java b/src/main/java/com/zy/core/enums/WrkStsType.java
index 5b45eda..d72f4b4 100644
--- a/src/main/java/com/zy/core/enums/WrkStsType.java
+++ b/src/main/java/com/zy/core/enums/WrkStsType.java
@@ -24,8 +24,9 @@
     NEW_CHARGE(201, "鐢熸垚鍏呯數浠诲姟"),
     CHARGE_SHUTTLE_RUN(202, "灏忚溅鍓嶅線鍏呯數妗�"),
     CHARGE_SHUTTLE_RUN_COMPLETE(203, "灏忚溅鍒拌揪鍏呯數妗�"),
-    CHARGE_SHUTTLE_WORKING(204, "灏忚溅鍏呯數涓�"),
-    CHARGE_SHUTTLE_COMPLETE(205, "灏忚溅鍏呯數瀹屾垚"),
+    CHARGE_SHUTTLE_START_CHARGING(204, "灏忚溅寮�鍚厖鐢典腑"),
+    CHARGE_SHUTTLE_CHARGING(205, "灏忚溅鍏呯數涓�"),
+    CHARGE_SHUTTLE_CHARGING_COMPLETE(206, "灏忚溅鍏呯數瀹屾垚"),
     COMPLETE_CHARGE(210, "鍏呯數浠诲姟瀹屾垚"),
 
     NEW_MOVE(301, "鐢熸垚杩佺Щ浠诲姟"),
diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java
index 228afb4..02d6120 100644
--- a/src/main/java/com/zy/core/thread/ShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -6,6 +6,7 @@
 import com.zy.common.model.NavigateNode;
 import com.zy.core.ThreadHandler;
 import com.zy.core.enums.ShuttleProtocolStatusType;
+import com.zy.core.enums.ShuttleRequireChargeType;
 import com.zy.core.enums.ShuttleTaskNoType;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.command.ShuttleCommand;
@@ -42,7 +43,7 @@
 
     boolean isDeviceIdle(ExecuteSupport support);//璁惧鏄惁绌洪棽
 
-    boolean isRequireCharge();//鏄惁婊¤冻鍏呯數鐘舵��
+    ShuttleRequireChargeType isRequireCharge();//鏄惁婊¤冻鍏呯數鐘舵��
 
     boolean isCharging();//鏄惁鍏呯數涓�
 
diff --git a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
index 53fbe7f..e124f84 100644
--- a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -577,7 +577,7 @@
     }
 
     @Override
-    public boolean isRequireCharge() {
+    public ShuttleRequireChargeType isRequireCharge() {
         if (this.shuttleProtocol.getDeviceStatus() == null
                 || this.shuttleProtocol.getPakMk() == null
                 || this.shuttleProtocol.getErrorCode() == null
@@ -585,7 +585,7 @@
                 || this.shuttleProtocol.getMode() == null
                 || this.shuttleProtocol.getExtend() == null
         ) {
-            return false;
+            return ShuttleRequireChargeType.NONE;
         }
 
         InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend();
@@ -598,25 +598,43 @@
                 && extend.getSuspendState() == 0
                 ;
         if (!res) {
-            return res;
+            return ShuttleRequireChargeType.NONE;
         } else {
             // 鐢甸噺灏忎簬闃堝�奸渶瑕佽繘琛屽厖鐢�
             try {
                 BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class);
                 if (shuttleService == null) {
-                    return false;
+                    return ShuttleRequireChargeType.NONE;
                 }
+
                 BasShuttle basShuttle = shuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", deviceConfig.getDeviceNo()));
                 if (basShuttle == null) {
-                    return false;
+                    return ShuttleRequireChargeType.NONE;
                 }
+
                 Integer chargeLine = basShuttle.getChargeLine();
                 if (chargeLine == null) {
-                    return false;
+                    return ShuttleRequireChargeType.NONE;
                 }
-                return Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < chargeLine;
+
+                boolean chargeResult = Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < chargeLine;
+                if (chargeResult) {
+                    return ShuttleRequireChargeType.FORCE_CHARGE;//闇�瑕佸己鍒跺厖鐢�
+                }
+
+                Integer suggestChargeLine = basShuttle.getSuggestChargeLine();
+                if (suggestChargeLine == null) {
+                    return ShuttleRequireChargeType.NONE;
+                }
+
+                boolean suggestChargeResult = Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < suggestChargeLine;
+                if (suggestChargeResult) {
+                    return ShuttleRequireChargeType.SUGGEST_CHARGE;//寤鸿鍏呯數
+                }
+
+                return ShuttleRequireChargeType.NONE;
             } catch (Exception e) {
-                return false;
+                return ShuttleRequireChargeType.NONE;
             }
         }
     }
diff --git a/src/main/java/com/zy/system/controller/ConfigController.java b/src/main/java/com/zy/system/controller/ConfigController.java
index a005512..e5a5639 100644
--- a/src/main/java/com/zy/system/controller/ConfigController.java
+++ b/src/main/java/com/zy/system/controller/ConfigController.java
@@ -9,6 +9,7 @@
 import com.core.common.DateUtils;
 import com.core.common.R;
 import com.core.controller.AbstractBaseController;
+import com.zy.asrs.domain.param.ConfigUpdateBatchParam;
 import com.zy.common.entity.Parameter;
 import com.zy.system.entity.Config;
 import com.zy.system.service.ConfigService;
@@ -43,6 +44,14 @@
         return R.ok(configService.selectPage(new Page<>(curr, limit), wrapper));
     }
 
+    @RequestMapping(value = "/config/listAll/auth")
+    @ManagerAuth
+    public R listAll(){
+        EntityWrapper<Config> wrapper = new EntityWrapper<>();
+        wrapper.orderBy("id", false);
+        return R.ok(configService.selectList(wrapper));
+    }
+
     private void convert(Map<String, Object> map, EntityWrapper wrapper){
         for (Map.Entry<String, Object> entry : map.entrySet()){
             if (entry.getKey().endsWith(">")) {
@@ -55,6 +64,23 @@
         }
     }
 
+    @RequestMapping(value = "/config/updateBatch")
+    @ManagerAuth
+    public R updateBatch(@RequestBody List<ConfigUpdateBatchParam> params){
+        for (ConfigUpdateBatchParam param : params) {
+            String code = param.getCode();
+            String value = param.getValue();
+            Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", code));
+            if (config == null) {
+                continue;
+            }
+
+            config.setValue(value);
+            configService.updateById(config);
+        }
+        return R.ok();
+    }
+
     @RequestMapping(value = "/config/edit/auth")
     @ManagerAuth
     public R edit(Config config) {
diff --git a/src/main/resources/mapper/BasShuttleMapper.xml b/src/main/resources/mapper/BasShuttleMapper.xml
index 5e44550..4860a85 100644
--- a/src/main/resources/mapper/BasShuttleMapper.xml
+++ b/src/main/resources/mapper/BasShuttleMapper.xml
@@ -11,6 +11,7 @@
         <result column="idle_loc" property="idleLoc" />
         <result column="auto_charge" property="autoCharge" />
         <result column="charge_line" property="chargeLine" />
+        <result column="suggest_charge_line" property="suggestChargeLine" />
         <result column="create_by" property="createBy" />
         <result column="create_time" property="createTime" />
         <result column="update_by" property="updateBy" />
diff --git a/src/main/webapp/static/js/basShuttle/basShuttle.js b/src/main/webapp/static/js/basShuttle/basShuttle.js
index ca1c240..0c6dbae 100644
--- a/src/main/webapp/static/js/basShuttle/basShuttle.js
+++ b/src/main/webapp/static/js/basShuttle/basShuttle.js
@@ -24,17 +24,14 @@
             {type: 'checkbox'}
             ,{field: 'shuttleNo', align: 'center',title: '鍥涘悜绌挎杞﹀彿', width: 120}
             ,{field: 'status$', align: 'center',title: '鐘舵��'}
-            // ,{field: 'shuttleStatus', align: 'center',title: '浣滀笟鎬�'}
-            ,{field: 'wrkNo', align: 'center',title: '浠诲姟鍙�'}
-            // ,{field: 'idleLoc', align: 'center',title: '鏆傚瓨搴撲綅'}
+            // ,{field: 'wrkNo', align: 'center',title: '浠诲姟鍙�'}
             ,{field: 'chargeLine', align: 'center',title: '鐢甸噺绾�'}
-            ,{field: 'currentCode', align: 'center',title: '浜岀淮鐮�'}
+            ,{field: 'suggestChargeLine', align: 'center',title: '寤鸿鐢甸噺绾�'}
             // ,{field: 'createBy$', align: 'center',title: '娣诲姞浜哄憳'}
             // ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
             // ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳'}
             // ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿'}
             ,{field: 'memo', align: 'center',title: '澶囨敞'}
-            ,{field: 'pakMk$', align: 'center',title: '鏍囪'}
 
             ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:120}
         ]],
diff --git a/src/main/webapp/views/admin/basShuttle/basShuttle.html b/src/main/webapp/views/admin/basShuttle/basShuttle.html
index fa5c78c..2118290 100644
--- a/src/main/webapp/views/admin/basShuttle/basShuttle.html
+++ b/src/main/webapp/views/admin/basShuttle/basShuttle.html
@@ -87,12 +87,12 @@
                         </select>
                     </div>
                 </div>
-                <div class="layui-form-item">
-                    <label class="layui-form-label">浠诲姟鍙�: </label>
-                    <div class="layui-input-block">
-                        <input class="layui-input" name="wrkNo" placeholder="璇疯緭鍏ヤ换鍔″彿">
-                    </div>
-                </div>
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">浠诲姟鍙�: </label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <input class="layui-input" name="wrkNo" placeholder="璇疯緭鍏ヤ换鍔″彿">-->
+<!--                    </div>-->
+<!--                </div>-->
 <!--                <div class="layui-form-item">-->
 <!--                    <label class="layui-form-label">鑷姩鍏呯數: </label>-->
 <!--                    <div class="layui-input-block">-->
@@ -106,20 +106,26 @@
                     </div>
                 </div>
                 <div class="layui-form-item">
+                    <label class="layui-form-label">寤鸿鐢甸噺绾�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="suggestChargeLine" placeholder="璇疯緭鍏ュ缓璁數閲忕嚎">
+                    </div>
+                </div>
+                <div class="layui-form-item">
                     <label class="layui-form-label">澶囨敞: </label>
                     <div class="layui-input-block">
                         <input class="layui-input" name="memo" placeholder="璇疯緭鍏ュ娉�">
                     </div>
                 </div>
-                <div class="layui-form-item">
-                    <label class="layui-form-label">鏍囪: </label>
-                    <div class="layui-input-block">
-                        <select name="pakMk">
-                            <option value="1">Y</option>
-                            <option value="0">N</option>
-                        </select>
-                    </div>
-                </div>
+<!--                <div class="layui-form-item">-->
+<!--                    <label class="layui-form-label">鏍囪: </label>-->
+<!--                    <div class="layui-input-block">-->
+<!--                        <select name="pakMk">-->
+<!--                            <option value="1">Y</option>-->
+<!--                            <option value="0">N</option>-->
+<!--                        </select>-->
+<!--                    </div>-->
+<!--                </div>-->
 
              </div>
         </div>
diff --git a/src/main/webapp/views/admin/debugParam/debugParam.html b/src/main/webapp/views/admin/debugParam/debugParam.html
new file mode 100644
index 0000000..2b7dee2
--- /dev/null
+++ b/src/main/webapp/views/admin/debugParam/debugParam.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html>
+<html lang="en">
+
+	<head>
+		<meta charset="UTF-8">
+		<title>璋冭瘯鍙傛暟</title>
+		<link rel="stylesheet" href="../../../static/vue/element/element.css">
+		<script type="text/javascript" src="../../../static/js/jquery/jquery-3.3.1.min.js"></script>
+		<script type="text/javascript" src="../../../static/js/common.js"></script>
+		<script type="text/javascript" src="../../../static/vue/js/vue.min.js"></script>
+		<script type="text/javascript" src="../../../static/vue/element/element.js"></script>
+		<style>
+			.show-box {
+				width: 20%;
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+				margin-bottom: 30px;
+			}
+		</style>
+	</head>
+
+	<body>
+		<div id="app">
+			<div>
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>璋冨害鍙傛暟</span>
+					</div>
+
+					<div style="display: flex;flex-wrap: wrap;">
+						<div class="show-box">
+							<div>璋冨害灏忚溅鍚屽眰鏈�澶ф暟閲�</div>
+							<el-input v-model="codeMap.dispatchShuttleMaxNum" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>鍏ュ簱棰勭暀灏忚溅</div>
+							<el-input v-model="codeMap.shuttleWrkInObligateCount" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>閬块殰鍐呭湀鍗婂緞</div>
+							<el-input v-model="codeMap.avoidInnerCircle" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>閬块殰澶栧湀鍗婂緞</div>
+							<el-input v-model="codeMap.avoidOuterCircle" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>鍦板浘姣嶈建鏂瑰悜(x,y)</div>
+							<el-input v-model="codeMap.direction_map" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>灏忚溅鍑烘彁鍗囨満杩戠偣璺濈</div>
+							<el-input v-model="codeMap.shuttleOutLiftLocationDistance" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>灏忚溅绉诲姩杩炵画涓嬪彂鎸囦护</div>
+							<el-radio border v-model="codeMap.shuttleMoveCommandsContinuously" label="Y">寮�</el-radio>
+							<el-radio border v-model="codeMap.shuttleMoveCommandsContinuously" label="N">鍏�</el-radio>
+						</div>
+
+						<div class="show-box">
+							<div>鍏佽浜ょ閲嶆柊瑙勫垝璺緞</div>
+							<el-radio border v-model="codeMap.trafficControlRestartCalcPath" label="Y">寮�</el-radio>
+							<el-radio border v-model="codeMap.trafficControlRestartCalcPath" label="N">鍏�</el-radio>
+						</div>
+
+						<div class="show-box">
+							<div>杈撳嚭RCS璋冭瘯鏃ュ織</div>
+							<el-radio border v-model="codeMap.rcsDebugShowLog" label="true">寮�</el-radio>
+							<el-radio border v-model="codeMap.rcsDebugShowLog" label="false">鍏�</el-radio>
+						</div>
+					</div>
+
+					<div style="margin-top: 20px;">
+						<el-button type="primary" @click="saveParam('shuttle')">淇濆瓨</el-button>
+					</div>
+				</el-card>
+			</div>
+
+			<div style="margin-top: 20px;">
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>鍏呯數鍙傛暟</span>
+					</div>
+
+					<div style="display: flex;flex-wrap: wrap;">
+						<div class="show-box">
+							<div>灏忚溅鍏呯數鏈�澶ч槇鍊�</div>
+							<el-input v-model="codeMap.chargeMaxValue" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>灏忚溅鐢甸噺棰勮闃堝��</div>
+							<el-input v-model="codeMap.shuttlePowerEarlyValue" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>灏忚溅婊$數鏍″噯</div>
+							<el-radio border v-model="codeMap.shuttleMaxPowerVerify" label="true">寮�</el-radio>
+							<el-radio border v-model="codeMap.shuttleMaxPowerVerify" label="false">鍏�</el-radio>
+						</div>
+
+						<div class="show-box">
+							<div>瀹氭椂鍏呯數寮�鍏�</div>
+							<el-radio border v-model="codeMap.timedCharge" label="Y">寮�</el-radio>
+							<el-radio border v-model="codeMap.timedCharge" label="N">鍏�</el-radio>
+						</div>
+
+						<div class="show-box">
+							<div>瀹氭椂鍏呯數鏃堕棿娈�</div>
+							<el-input v-model="codeMap.timedChargeRange" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>灏忚溅榛樿鍏呯數绾�</div>
+							<el-input v-model="codeMap.shuttleDefaultChargePowerLine" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>灏忚溅瀹氭椂鍏呯數绾�</div>
+							<el-input v-model="codeMap.timedChargePowerLine" style="width: 60%;"></el-input>
+						</div>
+					</div>
+
+					<div style="margin-top: 20px;">
+						<el-button type="primary" @click="saveParam('charge')">淇濆瓨</el-button>
+					</div>
+				</el-card>
+			</div>
+
+			<div style="margin-top: 20px;">
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>婕旂ず妯″紡鍙傛暟</span>
+					</div>
+					<div style="display: flex;flex-wrap: wrap;">
+						<div class="show-box">
+							<div>绉诲姩婕旂ず妯″紡-妤煎眰</div>
+							<el-input v-model="codeMap.demoRunLev" style="width: 60%;"></el-input>
+						</div>
+
+						<div class="show-box">
+							<div>绉诲姩婕旂ず妯″紡-鏄惁鎹㈠眰</div>
+							<el-radio border v-model="codeMap.demoSwitchLev" label="Y">寮�</el-radio>
+							<el-radio border v-model="codeMap.demoSwitchLev" label="N">鍏�</el-radio>
+						</div>
+
+						<div class="show-box">
+							<div>婕旂ず妯″紡-璐х墿鎼繍</div>
+							<el-radio border v-model="codeMap.demoCargoMove" label="Y">寮�</el-radio>
+							<el-radio border v-model="codeMap.demoCargoMove" label="N">鍏�</el-radio>
+						</div>
+
+					</div>
+
+					<div style="margin-top: 20px;">
+						<el-button type="primary" @click="saveParam('demo')">淇濆瓨</el-button>
+					</div>
+				</el-card>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				el: '#app',
+				data: {
+					codeMap: {},
+				},
+				created() {
+					this.init()
+				},
+				methods: {
+					init() {
+						this.getConfigData()
+					},
+					getConfigData() {
+						let that = this;
+						$.ajax({
+							url: baseUrl + "/config/listAll/auth",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: {},
+							dataType: 'json',
+							contentType: 'application/json;charset=UTF-8',
+							method: 'GET',
+							success: function(res) {
+								if (res.code == 200) {
+									let codeMap = {}
+									res.data.forEach((item) => {
+										codeMap[item.code] = item.value
+									})
+									that.codeMap = codeMap;
+								} else if (res.code === 403) {
+									top.location.href = baseUrl + "/";
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					},
+					saveParam(type) {
+						let that = this;
+						let codeList = this.getParamData(type)
+						let updateCodeList = [];
+
+						codeList.forEach((key) => {
+							let value = this.codeMap[key]
+							updateCodeList.push({
+								code: key,
+								value: value
+							})
+						})
+
+						console.log(updateCodeList)
+
+						$.ajax({
+							url: baseUrl + "/config/updateBatch",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: JSON.stringify(updateCodeList),
+							dataType: 'json',
+							contentType: 'application/json;charset=UTF-8',
+							method: 'POST',
+							success: function(res) {
+								if (res.code == 200) {
+									that.$message({
+										message: '淇濆瓨鎴愬姛',
+										type: 'success'
+									});
+								} else if (res.code === 403) {
+									top.location.href = baseUrl + "/";
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					},
+					getParamData(type) {
+						let data = []
+						if(type == "shuttle") {
+							data.push('dispatchShuttleMaxNum');
+							data.push('shuttleWrkInObligateCount');
+							data.push('avoidInnerCircle');
+							data.push('avoidOuterCircle');
+							data.push('direction_map');
+							data.push('shuttleOutLiftLocationDistance');
+							data.push('shuttleMoveCommandsContinuously');
+							data.push('trafficControlRestartCalcPath');
+							data.push('rcsDebugShowLog');
+						}else if (type == "charge") {
+							data.push('chargeMaxValue');
+							data.push('shuttlePowerEarlyValue');
+							data.push('shuttleMaxPowerVerify');
+							data.push('timedCharge');
+							data.push('timedChargeRange');
+							data.push('shuttleDefaultChargePowerLine');
+							data.push('timedChargePowerLine');
+						}else if (type == "demo") {
+							data.push('demoRunLev');
+							data.push('demoSwitchLev');
+							data.push('demoCargoMove');
+						}
+
+						return data;
+					},
+				},
+			})
+		</script>
+	</body>
+
+</html>

--
Gitblit v1.9.1