From 3909c3583e8fc2057715ca20ac16b14072f32b14 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 28 九月 2023 08:46:56 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java           |    5 
 src/main/java/com/zy/asrs/controller/RobotController.java                |   38 +
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java              |  114 +++++
 src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java              |    4 
 src/main/resources/mapper/LocMastMapper.xml                              |   10 
 src/main/java/com/zy/common/utils/RobotUtils.java                        |   24 
 src/main/webapp/views/shuttle2.html                                      |  626 +++++++++++++++++++++++++++++++
 src/main/java/com/zy/asrs/utils/Utils.java                               |    4 
 src/main/java/com/zy/core/model/protocol/NyShuttleProtocol.java          |   40 ++
 src/main/java/com/zy/asrs/controller/ShuttleController.java              |   45 ++
 src/main/java/com/zy/asrs/mapper/LocMastMapper.java                      |    2 
 src/main/java/com/zy/asrs/domain/param/RobotReportActionStatusParam.java |    2 
 src/main/java/com/zy/core/thread/NyShuttleThread.java                    |   90 ++-
 src/main/java/com/zy/core/MainProcess.java                               |    2 
 src/main/java/com/zy/asrs/service/LocMastService.java                    |    2 
 src/main/resources/application.yml                                       |  137 +++++-
 16 files changed, 1,066 insertions(+), 79 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/RobotController.java b/src/main/java/com/zy/asrs/controller/RobotController.java
index 49b74fe..bcb5fee 100644
--- a/src/main/java/com/zy/asrs/controller/RobotController.java
+++ b/src/main/java/com/zy/asrs/controller/RobotController.java
@@ -2,7 +2,19 @@
 
 import com.zy.asrs.domain.param.RobotReportActionStatusParam;
 import com.zy.asrs.domain.param.ReportExceptionParam;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.mapper.WrkMastMapper;
 import com.zy.common.utils.RobotUtils;
+import com.zy.core.DevpThread;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.DevpSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.protocol.StaProtocol;
+import com.zy.core.properties.SlaveProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
@@ -11,6 +23,11 @@
 
 @RestController
 public class RobotController {
+
+    @Autowired
+    private WrkMastMapper wrkMastMapper;
+    @Autowired
+    private SlaveProperties slaveProperties;
 
     //鏈烘鎵嬪悜WCS鍥炴姤浠诲姟缁撴灉瀹屾垚
     @PostMapping("/request/wcs/report_task_status")
@@ -21,6 +38,17 @@
         Integer pickNum = param.getPick_num();
         Integer targetNum = param.getTarget_num();
         String message = param.getMessage();
+        Integer staNo = param.getFrom_ws();//鐩爣绔�
+
+        //缁欑洰鏍囩珯鍐欏叆鍑哄簱绔�344
+        for (DevpSlave devp : slaveProperties.getDevp()) {
+            // 鑾峰彇鍏ュ簱绔欎俊鎭�
+            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
+            StaProtocol staProtocol = devpThread.getStation().get(staNo);//鏈烘鎵嬭噦鎷f枡绔�
+            staProtocol = staProtocol.clone();
+            staProtocol.setStaNo((short) 344);//绌烘墭鐩樺嚭搴撶珯
+            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+        }
 
         System.out.println(param);
         map.put("error", 0);
@@ -43,4 +71,14 @@
         return map;
     }
 
+    @GetMapping("/test")
+    public void test() {
+        boolean systemStatus = RobotUtils.getSystemStatus();
+    }
+
+    @GetMapping("/test2")
+    public void test2() {
+        RobotUtils.sendTask("9994", 4, "317");
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java
index 3c7508f..2135798 100644
--- a/src/main/java/com/zy/asrs/controller/ShuttleController.java
+++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -338,6 +338,15 @@
                     shuttleProtocol.setToken(0);//浠ょ墝娓呯┖
                     shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);//浠诲姟鐘舵��-绌洪棽
                     shuttleProtocol.setPakMk(false);//浣滀笟鏍囪澶嶄綅
+
+                    shuttleProtocol.setMoveLoc(false);
+                    shuttleProtocol.setMoveType(0);
+                    shuttleProtocol.setXStart(0);
+                    shuttleProtocol.setXTarget(0);
+                    shuttleProtocol.setXCurrent(0);
+                    shuttleProtocol.setYStart(0);
+                    shuttleProtocol.setYTarget(0);
+                    shuttleProtocol.setYCurrent(0);
                     return R.ok();
                 } else if (shuttleTaskModeType == ShuttleTaskModeType.SHUTTLE_CONTROL) {
                     //灏忚溅绠″埗
@@ -410,4 +419,40 @@
         return R.ok();
     }
 
+    /**
+     * 璺戝簱绋嬪簭
+     */
+    @PostMapping("/moveLoc")
+    @ManagerAuth
+    public R moveLoc(@RequestParam Integer shuttleNo,
+                     @RequestParam Integer moveType,
+                     @RequestParam Integer xStart,
+                     @RequestParam Integer xTarget,
+                     @RequestParam Integer yStart,
+                     @RequestParam Integer yTarget) {
+        NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
+        if (shuttleThread == null) {
+            return R.error();
+        }
+
+        NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+        if (shuttleProtocol == null) {
+            return R.error();
+        }
+
+        if (!shuttleProtocol.isIdle()) {
+            return R.error("灏忚溅蹇欑涓�");
+        }
+
+        shuttleProtocol.setMoveLoc(true);//寮�鍚窇搴�
+        shuttleProtocol.setMoveType(moveType);
+        shuttleProtocol.setXStart(xStart);
+        shuttleProtocol.setXTarget(xTarget);
+        shuttleProtocol.setXCurrent(xStart);
+        shuttleProtocol.setYStart(yStart);
+        shuttleProtocol.setYTarget(yTarget);
+        shuttleProtocol.setYCurrent(yStart);
+        return R.ok();
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/domain/param/RobotReportActionStatusParam.java b/src/main/java/com/zy/asrs/domain/param/RobotReportActionStatusParam.java
index b4bc5ee..b9c3ade 100644
--- a/src/main/java/com/zy/asrs/domain/param/RobotReportActionStatusParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/RobotReportActionStatusParam.java
@@ -23,4 +23,6 @@
     //缁撴灉璁伅
     private String message;
 
+    private Integer from_ws;
+
 }
diff --git a/src/main/java/com/zy/asrs/mapper/LocMastMapper.java b/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
index bdf4e86..7a892c0 100644
--- a/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -39,4 +39,6 @@
     LocMast queryByQrCode(String qrCodeValue);
 
     List<LocMast> selectLocByLev(Integer lev);
+
+    List<LocMast> selectEmptyLocNos(@Param("locNos") List<String> locNos);
 }
diff --git a/src/main/java/com/zy/asrs/service/LocMastService.java b/src/main/java/com/zy/asrs/service/LocMastService.java
index 9e814d4..0587f7c 100644
--- a/src/main/java/com/zy/asrs/service/LocMastService.java
+++ b/src/main/java/com/zy/asrs/service/LocMastService.java
@@ -70,4 +70,6 @@
 
     //鏌ヨ鎸囧畾妤煎眰鐨勫簱浣嶆暟鎹�
     List<LocMast> selectLocByLev(Integer lev);
+
+    List<LocMast> selectEmptyLocNos(List<String> locNos);
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
index c50356a..6ba3fab 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -91,4 +91,9 @@
     public List<LocMast> selectLocByLev(Integer lev) {
         return this.baseMapper.selectLocByLev(lev);
     }
+
+    @Override
+    public List<LocMast> selectEmptyLocNos(List<String> locNos) {
+        return this.baseMapper.selectEmptyLocNos(locNos);
+    }
 }
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 6becb10..8520b78 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1946,6 +1946,90 @@
     }
 
     /**
+     * AGV琛ヨ揣 => 鏈烘鑷傛嫞鏂�
+     */
+    public void agvRestockByRobot() {
+        //妫�娴�300绔欐槸鍚﹁嚜鍔ㄣ�佹湁鐗┿�佸伐浣滃彿
+        for (DevpSlave devp : slaveProperties.getDevp()) {
+            // 鑾峰彇鍏ュ簱绔欎俊鎭�
+            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
+            StaProtocol staProtocol = devpThread.getStation().get(300);
+            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0) {
+                //鏌ヨ鏄惁鏈夊伐浣滄。
+                WrkMast wrkMast = wrkMastMapper.selectByWorkNo(staProtocol.getWorkNo().intValue());
+                if (wrkMast == null) {
+                    continue;
+                }
+
+                if (wrkMast.getWrkSts() != 25) {//25.鎻愬崌鏈烘惉杩愬畬鎴�
+                    continue;
+                }
+
+                if (wrkMast.getMk().equals("Y")) {//鏍囪涓篩琛ㄧず闇�瑕佺敤鍒版満姊拌噦鎷f枡
+                    Short targetSta = null;//鐩爣绔�
+                    //鍒ゆ柇鏈烘鑷傛嫞鏂欑珯鏄惁绌洪棽
+                    StaProtocol staProtocol303 = devpThread.getStation().get(303);
+                    StaProtocol staProtocol317 = devpThread.getStation().get(317);
+                    if (staProtocol303.isAutoing() && !staProtocol303.isLoading()) {
+                        //鑷姩銆佹棤鐗�
+                        targetSta = (short) 303;
+                    } else if (staProtocol317.isAutoing() && !staProtocol317.isLoading()) {
+                        //鑷姩銆佹棤鐗�
+                        targetSta = (short) 317;
+                    }else {
+                        continue;//娌℃湁绌洪棽绔欑偣
+                    }
+
+                    targetSta = (short) 317;
+
+                    //瑕嗙洊宸ヤ綔妗g洰鏍囩珯
+                    wrkMast.setStaNo(targetSta.intValue());
+                    if (wrkMastMapper.updateById(wrkMast) > 0) {
+                        //鍚�300绔欏啓鍏ョ洰鏍囩珯
+                        staProtocol = staProtocol.clone();
+                        staProtocol.setStaNo(targetSta);//绉诲姩鍒扮洰鏍囩珯
+                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+                        try {
+                            Thread.sleep(500);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                        continue;
+                    }
+                }
+            }
+
+            StaProtocol staProtocol303 = devpThread.getStation().get(303);
+            StaProtocol staProtocol317 = devpThread.getStation().get(317);
+            if (staProtocol303.isAutoing() && staProtocol303.isLoading() && staProtocol303.getWorkNo() != 0) {
+                //璋冨害鏈烘鑷�
+                //鏌ヨ鏄惁鏈夊伐浣滄。
+                WrkMast wrkMast = wrkMastMapper.selectByWorkNo(staProtocol303.getWorkNo().intValue());
+                if (wrkMast == null) {
+                    continue;
+                }
+                WrkDetl wrkDetl = wrkDetlService.selectById(wrkMast.getWrkNo());
+                if (wrkDetl == null) {
+                    continue;
+                }
+                RobotUtils.sendTask(staProtocol303.getWorkNo().toString(), wrkDetl.getAnfme().intValue(), "303");
+            }else if (staProtocol317.isAutoing() && staProtocol317.isLoading() && staProtocol317.getWorkNo() != 0) {
+                //璋冨害鏈烘鑷�
+                //鏌ヨ鏄惁鏈夊伐浣滄。
+                WrkMast wrkMast = wrkMastMapper.selectByWorkNo(staProtocol317.getWorkNo().intValue());
+                if (wrkMast == null) {
+                    continue;
+                }
+                WrkDetl wrkDetl = wrkDetlService.selectById(wrkMast.getWrkNo());
+                if (wrkDetl == null) {
+                    continue;
+                }
+                RobotUtils.sendTask(staProtocol303.getWorkNo().toString(), wrkDetl.getAnfme().intValue(), "317");
+            }
+        }
+    }
+
+    /**
      * 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
      */
     public void ledExecute() {
@@ -2240,7 +2324,7 @@
                 }
             } else if (wrkCharge.getWrkSts() == 52) {
                 //妫�娴嬪皬杞︽槸鍚︽弧鐢�
-                int maxPower = 85;
+                int maxPower = 95;
                 if (shuttleProtocol.getPowerPercent() < maxPower) {
                     continue;
                 }
@@ -2257,22 +2341,32 @@
                 assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
                 assignCommand.setCommands(commands);//杩愯鍛戒护
 
+                //涓嬪彂浠诲姟
+                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+                try {
+                    Thread.sleep(3000);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
                 wrkCharge.setWrkSts(53L);//52.灏忚溅鍘诲厖鐢典腑 => 53.灏忚溅鍏呯數瀹屾垚
                 wrkCharge.setModiTime(new Date());
                 if (wrkChargeMapper.updateById(wrkCharge) > 0) {
-                    //涓嬪彂浠诲姟
-                    MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+                    shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE.id);
+                    shuttleProtocol.setTaskNo(0);
+                    shuttleProtocol.setPakMk(false);
                 }
             } else if (wrkCharge.getWrkSts() == 53) {
                 if (shuttleProtocol.getChargState() == 0) {//灏忚溅澶勪簬鏈厖鐢电姸鎬�
                     boolean result = Utils.searchEmptyGroupToMoveShuttle(Utils.getLev(wrkCharge.getLocNo()), shuttleThread.getSlave().getId(), shuttleThread);
-                    if (result) {
-                        wrkCharge.setWrkSts(60L);//53.灏忚溅鍏呯數瀹屾垚 => 60.鍏呯數浠诲姟瀹屾垚
-                        wrkCharge.setModiTime(new Date());
-                        if (wrkChargeMapper.updateById(wrkCharge) > 0) {
-                            shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE);
-                            shuttleProtocol.setTaskNo(0);
-                        }
+                    if (!result) {
+                        continue;
+                    }
+
+                    wrkCharge.setWrkSts(60L);//53.灏忚溅鍏呯數瀹屾垚 => 60.鍏呯數浠诲姟瀹屾垚
+                    wrkCharge.setModiTime(new Date());
+                    if (wrkChargeMapper.updateById(wrkCharge) > 0) {
+
                     }
                 }
             }
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index fbfff8e..b5e47fb 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -505,11 +505,11 @@
         SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class);
         for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
             //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
+            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
             if (shuttleThread == null) {
                 continue;
             }
-            ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
             if (shuttleProtocol == null) {
                 continue;
             }
diff --git a/src/main/java/com/zy/common/utils/RobotUtils.java b/src/main/java/com/zy/common/utils/RobotUtils.java
index 2db7119..5c3f2b9 100644
--- a/src/main/java/com/zy/common/utils/RobotUtils.java
+++ b/src/main/java/com/zy/common/utils/RobotUtils.java
@@ -23,7 +23,7 @@
         try {
             String response = new HttpHandler.Builder()
                     .setUri(robotUrl)
-                    .setPath("/api/wcs/is_system_ready")
+                    .setPath("/adaptor/api/wcs/is_vp_ready")
                     .setJson(JSON.toJSONString(map))
                     .build()
                     .doPost();
@@ -40,9 +40,22 @@
     }
 
     //WCS鍚戞満姊拌噦涓嬪彂鍗曟媶浠诲姟
-    public static boolean sendTask(String taskId, Map<String, Object> skuInfo, String from, String to) {
+    public static boolean sendTask(String taskId, Integer skuNum, String from) {
         Environment environment = SpringUtils.getBean(Environment.class);
         String robotUrl = environment.getProperty("robot.url");
+
+        Map<String, Object> skuInfo = new HashMap<>();
+        skuInfo.put("sku_id", "1");
+        skuInfo.put("length", 500);
+        skuInfo.put("width", 350);
+        skuInfo.put("height", 200);
+        skuInfo.put("weight", 1);
+        skuInfo.put("sku_num", skuNum);
+
+        String to = "307";
+        if (from.equals("317")) {
+            to = "310";
+        }
 
         HashMap<String, Object> map = new HashMap<>();
         map.put("task_id", taskId);
@@ -52,14 +65,15 @@
         try {
             String response = new HttpHandler.Builder()
                     .setUri(robotUrl)
-                    .setPath("api/wcs/single_class_depal_task")
+                    .setPath("/adaptor/api/wcs/task/single_depal")
                     .setJson(JSON.toJSONString(map))
                     .build()
                     .doPost();
 
             JSONObject data = JSON.parseObject(response);
-            int error = Integer.parseInt(data.get("error").toString());
-            if (error == 0) {
+            int code = Integer.parseInt(data.get("code").toString());
+            String msg = data.get("msg").toString();
+            if (code == 0 && msg.equals("success")) {
                 return true;//鎴愬姛
             }
         } catch (IOException e) {
diff --git a/src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java b/src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java
index bcaead1..3d84c4f 100644
--- a/src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java
+++ b/src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java
@@ -203,6 +203,10 @@
                 }
             }
 
+            if (wrkCharge.getWrkSts() == 53) {
+                toCharge = true;//鍏呯數缁撴潫锛屽厑璁哥敓鎴愮Щ搴撲换鍔�
+            }
+
             if (!toCharge) {
                 //涓嶆槸鍘诲厖鐢垫々涓斿瓨鍦ㄥ厖鐢典换鍔★紝绂佹鐢熸垚鏂扮殑绉诲姩浠诲姟
                 return false;
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index 3058a36..400fb63 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -70,6 +70,8 @@
                     mainService.recErr();
                     // 鍏ュ簱  ===>> 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
                     mainService.storeEmptyPlt();
+                    // AGV琛ヨ揣(鏈烘鑷傛嫞鏂�)
+                    mainService.agvRestockByRobot();
                     // 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
                     mainService.ledExecute();
                     // 鍏朵粬  ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅
diff --git a/src/main/java/com/zy/core/model/protocol/NyShuttleProtocol.java b/src/main/java/com/zy/core/model/protocol/NyShuttleProtocol.java
index 3744f61..ac78e39 100644
--- a/src/main/java/com/zy/core/model/protocol/NyShuttleProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/NyShuttleProtocol.java
@@ -204,6 +204,46 @@
      */
     private Integer token = 0;
 
+    /**
+     * 璺戝簱鐘舵��
+     */
+    private Boolean moveLoc = false;
+
+    /**
+     * 璺戝簱绫诲瀷锛�0:璺戣建閬擄紝1锛氳窇搴撲綅
+     */
+    private Integer moveType = 0;
+
+    /**
+     * 璺戝簱X璧风偣
+     */
+    private Integer xStart = 0;
+
+    /**
+     * 璺戝簱X缁堢偣
+     */
+    private Integer xTarget = 0;
+
+    /**
+     * 璺戝簱X褰撳墠鐐逛綅
+     */
+    private Integer xCurrent = 0;
+
+    /**
+     * 璺戝簱Y璧风偣
+     */
+    private Integer yStart = 0;
+
+    /**
+     * 璺戝簱Y缁堢偣
+     */
+    private Integer yTarget = 0;
+
+    /**
+     * 璺戝簱Y褰撳墠鐐逛綅
+     */
+    private Integer yCurrent = 0;
+
     //鎬婚噷绋嬫暟
     @Data
     public static class StatusSumClass {
diff --git a/src/main/java/com/zy/core/thread/NyShuttleThread.java b/src/main/java/com/zy/core/thread/NyShuttleThread.java
index f2602a8..e627a9f 100644
--- a/src/main/java/com/zy/core/thread/NyShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/NyShuttleThread.java
@@ -11,6 +11,7 @@
 import com.zy.asrs.utils.Utils;
 import com.zy.common.model.NavigateNode;
 import com.zy.common.model.NyShuttleOperaResult;
+import com.zy.common.service.CommonService;
 import com.zy.common.utils.*;
 import com.zy.core.News;
 import com.zy.core.ThreadHandler;
@@ -28,6 +29,7 @@
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
+import javax.swing.*;
 import java.io.IOException;
 import java.net.Socket;
 import java.text.MessageFormat;
@@ -98,6 +100,11 @@
                     && !shuttleProtocol.getPakMk()) {
                 //鎵ц涓嬩竴姝ユ寚浠�
                 executeWork(shuttleProtocol.getTaskNo().shortValue());
+            }
+
+            //灏忚溅绌洪棽涓旀湁璺戝簱绋嬪簭
+            if (shuttleProtocol.isIdle() && shuttleProtocol.getMoveLoc()) {
+                moveLoc();
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -493,37 +500,6 @@
         //浠诲姟鏁版嵁淇濆瓨鍒皉edis
         redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
 
-//        //鍒ゆ柇鏁版嵁鏄惁鎵ц瀹屾垚
-//        if (commandStep < commands.size() - 1) {
-//            commandStep++;
-//            //鏇存柊redis鏁版嵁
-//            redisCommand.setCommandStep(commandStep);
-//            //浠诲姟鏁版嵁淇濆瓨鍒皉edis
-//            redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
-//        }else {
-//            //宸叉墽琛屽畬鎴�
-//
-//            commandStep = commands.size();
-//            //鏇存柊redis鏁版嵁
-//            redisCommand.setCommandStep(commandStep);
-//            //浠诲姟鏁版嵁淇濆瓨鍒皉edis
-//            redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
-////            //鏈�鍚庝竴娈靛懡浠や负绉诲姩鍛戒护锛屽垯鏆傜紦鍒犻櫎redis绛夊緟娓呴櫎璺緞鏃朵竴娆℃�у垹闄�
-////            //鏈�鍚庝竴娈靛懡浠や负涓嶆槸绉诲姩鍛戒护锛屽垯鍒犻櫎redis
-////            if (!command.getRequest().getBody().get("requestType").equals("move")) {
-////                //鍒犻櫎redis
-////                redisUtil.del("shuttle_wrk_no_" + redisCommand.getWrkNo());
-////            }
-////
-////            if (!assignCommand.getCharge()) {
-////                //瀵逛富绾跨▼鎶涘嚭绛夊緟纭鐘舵�亀aiting
-////                shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
-////            }else {
-////                shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
-////            }
-////            News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屼笅鍙戝畬鎴愮瓑寰呮墽琛岀粨鏉燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
-//        }
-
         return true;
     }
 
@@ -711,4 +687,56 @@
         return false;//涓嶅彲琛岃蛋
     }
 
+    /**
+     * 璺戝簱绋嬪簭
+     */
+    private void moveLoc() {
+        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
+        ShuttleDispatchUtils shuttleDispatchUtils = SpringUtils.getBean(ShuttleDispatchUtils.class);
+        CommonService commonService = SpringUtils.getBean(CommonService.class);
+        WrkMastMapper wrkMastMapper = SpringUtils.getBean(WrkMastMapper.class);
+        int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//灏忚溅褰撳墠妤煎眰
+        if (!shuttleProtocol.isIdle()) {
+            return;
+        }
+
+        WrkMast wrkMast = wrkMastMapper.selectShuttleHasMoveWorking(shuttleProtocol.getShuttleNo().intValue());
+        if (wrkMast != null) {
+            return;
+        }
+
+        if (shuttleProtocol.getMoveType() == 0) {//璺戣建閬�
+            ArrayList<String> locs = new ArrayList<>();
+            for (int i = shuttleProtocol.getXCurrent(); i <= shuttleProtocol.getXTarget(); i++) {
+                String locNo = Utils.getLocNo(i, shuttleProtocol.getYCurrent(), lev);
+                locs.add(locNo);
+            }
+            List<LocMast> locMasts = locMastService.selectEmptyLocNos(locs);
+            if (locMasts.isEmpty()) {
+                //绌哄簱浣�
+                shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1);
+                return;
+            }
+
+            LocMast start = locMasts.get(0);
+            LocMast target = locMasts.get(locMasts.size() - 1);
+            //鍒ゆ柇灏忚溅鏄惁鍦ㄨ捣鐐逛綅缃�
+            if (!shuttleProtocol.getCurrentLocNo().equals(start.getLocNo())) {//涓嶅湪璧风偣浣嶇疆锛岃皟搴﹀幓璧风偣浣嶇疆
+                shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(3), start.getLocNo());
+            }else {
+                //鍦ㄨ捣鐐逛綅缃紝璋冨害鍘荤洰鏍囦綅缃�
+                if (shuttleProtocol.getCurrentLocNo().equals(target.getLocNo())) {
+                    shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1);//灏忚溅鍜岀洰鏍囦綅缃竴鑷达紝璺宠繃
+                }else {
+                    boolean result = shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(3), target.getLocNo());
+                    if (result) {//璋冨害鎴愬姛
+                        shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1);
+                    }
+                }
+            }
+        }else {//璺戝簱浣�
+
+        }
+    }
+
 }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index eb9717f..798fa5e 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -8,10 +8,10 @@
     name: @pom.build.finalName@
   datasource:
     driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-    url: jdbc:sqlserver://192.168.4.15:1433;databasename=tzskasrs
+    url: jdbc:sqlserver://127.0.0.1:1433;databasename=tzskasrs
     username: sa
 #    password: Zoneyung@zy56$
-    password: sa@123
+    password: sa
   mvc:
     static-path-pattern: /**
   redis:
@@ -41,7 +41,7 @@
   url: localhost:8081/tzskwms
 
 robot:
-  url: http://127.0.0.1:9090/tzskwcs
+  url: http://10.10.10.41:7002
 
 erp:
   db:
@@ -60,7 +60,7 @@
   # 杈撻�佺嚎
   devp[0]:
     id: 1
-    ip: 10.10.10.100
+    ip: 10.10.10.51
     port: 102
     rack: 0
     slot: 0
@@ -74,37 +74,37 @@
     inSta[1]:
       staNo: 103
       backSta: 102
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[1].id}
       led: ${wcs-slave.led[0].id}
     # 鍏ュ簱鍙�3
     inSta[2]:
       staNo: 105
       backSta: 104
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[2].id}
       led: ${wcs-slave.led[0].id}
     # 鍏ュ簱鍙�4
     inSta[3]:
       staNo: 200
       backSta: 201
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[3].id}
       led: ${wcs-slave.led[0].id}
     # 鍏ュ簱鍙�5
     inSta[4]:
       staNo: 203
       backSta: 202
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[4].id}
       led: ${wcs-slave.led[0].id}
     # 鍏ュ簱鍙�6
     inSta[5]:
       staNo: 205
       backSta: 204
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[5].id}
       led: ${wcs-slave.led[0].id}
     # 鍏ュ簱鍙�7
     inSta[6]:
       staNo: 346
       backSta: 345
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[8].id}
       led: ${wcs-slave.led[0].id}
     # 绌烘澘鍏ュ簱鍙�1
     emptyInSta[0]:
@@ -116,37 +116,37 @@
     emptyInSta[1]:
       staNo: 103
       backSta: 102
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[1].id}
       led: ${wcs-slave.led[0].id}
     # 绌烘澘鍏ュ簱鍙�3
     emptyInSta[2]:
       staNo: 105
       backSta: 104
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[2].id}
       led: ${wcs-slave.led[0].id}
     # 绌烘澘鍏ュ簱鍙�4
     emptyInSta[3]:
       staNo: 200
       backSta: 201
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[3].id}
       led: ${wcs-slave.led[0].id}
     # 绌烘澘鍏ュ簱鍙�5
     emptyInSta[4]:
       staNo: 203
       backSta: 202
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[4].id}
       led: ${wcs-slave.led[0].id}
     # 绌烘澘鍏ュ簱鍙�6
     emptyInSta[5]:
       staNo: 205
       backSta: 204
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[5].id}
       led: ${wcs-slave.led[0].id}
     # 绌烘澘鍏ュ簱鍙�7
     emptyInSta[6]:
       staNo: 346
       backSta: 345
-      barcode: ${wcs-slave.barcode[0].id}
+      barcode: ${wcs-slave.barcode[8].id}
       led: ${wcs-slave.led[0].id}
     # 鍑哄簱鍙�1
     outSta[0]:
@@ -248,6 +248,51 @@
     id: 1
     ip: 10.10.10.102
     port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[1]:
+    id: 2
+    ip: 10.10.10.102
+    port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[2]:
+    id: 3
+    ip: 10.10.10.102
+    port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[3]:
+    id: 4
+    ip: 10.10.10.102
+    port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[4]:
+    id: 5
+    ip: 10.10.10.102
+    port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[5]:
+    id: 6
+    ip: 10.10.10.102
+    port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[6]:
+    id: 7
+    ip: 10.10.10.102
+    port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[7]:
+    id: 8
+    ip: 10.10.10.102
+    port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[8]:
+    id: 9
+    ip: 10.10.10.102
+    port: 51236
+  # 鏉$爜鎵弿浠�
+  barcode[9]:
+    id: 10
+    ip: 10.10.10.102
+    port: 51236
 
    # LED1
   led[0]:
@@ -267,14 +312,14 @@
   # 鍥涘悜绌挎杞�1
   shuttle[0]:
     id: 1
-    ip: 127.0.0.1
+    ip: 10.10.10.101
     port: 8888
     rack: 0
     slot: 0
   # 鍥涘悜绌挎杞�2
   shuttle[1]:
     id: 2
-    ip: 192.168.4.15
+    ip: 10.10.10.102
     port: 8888
     rack: 0
     slot: 0
@@ -337,111 +382,141 @@
   # 鎻愬崌鏈�1
   lift[0]:
     id: 1
-    ip: 192.168.4.250
-    port: 502
-    row: 18
-    bay: 2
+    ip: 10.10.10.131
+    port: 102
+    staRow: 13
+    staBay: 22
     sta[0]:
       staNo: 101
       lev: 1
+      liftNo: ${wcs-slave.lift[0].id}
     sta[1]:
       staNo: 102
       lev: 2
+      liftNo: ${wcs-slave.lift[0].id}
     sta[2]:
       staNo: 103
       lev: 3
+      liftNo: ${wcs-slave.lift[0].id}
     sta[3]:
       staNo: 104
       lev: 4
+      liftNo: ${wcs-slave.lift[0].id}
     sta[4]:
       staNo: 105
       lev: 5
+      liftNo: ${wcs-slave.lift[0].id}
     sta[5]:
       staNo: 106
       lev: 6
+      liftNo: ${wcs-slave.lift[0].id}
     sta[6]:
       staNo: 107
       lev: 7
+      liftNo: ${wcs-slave.lift[0].id}
     sta[7]:
       staNo: 108
       lev: 8
+      liftNo: ${wcs-slave.lift[0].id}
     sta[8]:
       staNo: 109
       lev: 9
+      liftNo: ${wcs-slave.lift[0].id}
     sta[9]:
       staNo: 110
       lev: 10
+      liftNo: ${wcs-slave.lift[0].id}
   # 鎻愬崌鏈�2
   lift[1]:
     id: 2
-    ip: 127.0.0.1
-    port: 502
-    row: 18
-    bay: 2
+    ip: 10.10.10.132
+    port: 102
+    staRow: 13
+    staBay: 38
     sta[0]:
       staNo: 201
       lev: 1
+      liftNo: ${wcs-slave.lift[1].id}
     sta[1]:
       staNo: 202
       lev: 2
+      liftNo: ${wcs-slave.lift[1].id}
     sta[2]:
       staNo: 203
       lev: 3
+      liftNo: ${wcs-slave.lift[1].id}
     sta[3]:
       staNo: 204
       lev: 4
+      liftNo: ${wcs-slave.lift[1].id}
     sta[4]:
       staNo: 205
       lev: 5
+      liftNo: ${wcs-slave.lift[1].id}
     sta[5]:
       staNo: 206
       lev: 6
+      liftNo: ${wcs-slave.lift[1].id}
     sta[6]:
       staNo: 207
       lev: 7
+      liftNo: ${wcs-slave.lift[1].id}
     sta[7]:
       staNo: 208
       lev: 8
+      liftNo: ${wcs-slave.lift[1].id}
     sta[8]:
       staNo: 209
       lev: 9
+      liftNo: ${wcs-slave.lift[1].id}
     sta[9]:
       staNo: 210
       lev: 10
+      liftNo: ${wcs-slave.lift[1].id}
   # 鎻愬崌鏈�3
   lift[2]:
     id: 3
-    ip: 127.0.0.1
-    port: 502
-    row: 18
-    bay: 2
+    ip: 10.10.10.133
+    port: 102
+    staRow: 13
+    staBay: 57
     sta[0]:
       staNo: 301
       lev: 1
+      liftNo: ${wcs-slave.lift[2].id}
     sta[1]:
       staNo: 302
       lev: 2
+      liftNo: ${wcs-slave.lift[2].id}
     sta[2]:
       staNo: 303
       lev: 3
+      liftNo: ${wcs-slave.lift[2].id}
     sta[3]:
       staNo: 304
       lev: 4
+      liftNo: ${wcs-slave.lift[2].id}
     sta[4]:
       staNo: 305
       lev: 5
+      liftNo: ${wcs-slave.lift[2].id}
     sta[5]:
       staNo: 306
       lev: 6
+      liftNo: ${wcs-slave.lift[2].id}
     sta[6]:
       staNo: 307
       lev: 7
+      liftNo: ${wcs-slave.lift[2].id}
     sta[7]:
       staNo: 308
       lev: 8
+      liftNo: ${wcs-slave.lift[2].id}
     sta[8]:
       staNo: 309
       lev: 9
+      liftNo: ${wcs-slave.lift[2].id}
     sta[9]:
       staNo: 310
-      lev: 10
\ No newline at end of file
+      lev: 10
+      liftNo: ${wcs-slave.lift[2].id}
\ No newline at end of file
diff --git a/src/main/resources/mapper/LocMastMapper.xml b/src/main/resources/mapper/LocMastMapper.xml
index 7191979..6e96cd2 100644
--- a/src/main/resources/mapper/LocMastMapper.xml
+++ b/src/main/resources/mapper/LocMastMapper.xml
@@ -73,4 +73,14 @@
     <select id="selectLocByLev" resultMap="BaseResultMap">
         SELECT * FROM asr_loc_mast WHERE lev1 = #{lev}
     </select>
+
+    <select id="selectEmptyLocNos" resultMap="BaseResultMap">
+        select * from asr_loc_mast
+        where loc_no in
+        <foreach item="loc" collection="locNos" index="index"  separator="," open="(" close=")">
+            #{loc}
+        </foreach>
+        and loc_sts = 'O'
+        order by row1
+    </select>
 </mapper>
diff --git a/src/main/webapp/views/shuttle2.html b/src/main/webapp/views/shuttle2.html
new file mode 100644
index 0000000..c571991
--- /dev/null
+++ b/src/main/webapp/views/shuttle2.html
@@ -0,0 +1,626 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>鍥涘悜绌挎杞︾洃鎺х鐞�</title>
+    <link rel="stylesheet" type="text/css" href="../static/css/normalize.css">
+    <link rel="stylesheet" type="text/css" href="../static/css/common.css">
+    <link rel="stylesheet" type="text/css" href="../static/layui/css/layui.css">
+    <link rel="stylesheet" href="../static/css/shuttle.css">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/layer/layer.js"></script>
+    <script type="text/javascript" src="../static/layui/layui.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+</head>
+<body>
+    <div style="padding: 10px;height: 100%;float: left;width: 6%">
+        <div class="button-window"></div>
+    </div>
+    <div style="height: 100%;padding-left: 6%">
+        <div style="padding: 10px;height: 100%">
+            <!-- 鏃ュ織鐩戞帶鏉� -->
+            <div class="log-board">
+<!--                <div class="command-log" id="commandLogId" style="width: 5%;">-->
+<!--&lt;!&ndash;                    <div data-shuttleNo="1" class="shuttle-command-item">&ndash;&gt;-->
+<!--&lt;!&ndash;                        <label>1#</label>&ndash;&gt;-->
+<!--&lt;!&ndash;                        <button class="demoBtn pos-btn">鏁版嵁缁存姢</button>&ndash;&gt;-->
+<!--&lt;!&ndash;                        <button id="mode-1" class="demoBtn mode-btn" >璁惧淇℃伅</button>&ndash;&gt;-->
+<!--&lt;!&ndash;                    </div>&ndash;&gt;-->
+<!--                </div>-->
+                <!-- 鍫嗗灈鏈虹姸鎬佷綅淇℃伅 -->
+                <div class="shuttle-state" style="width: 100%;">
+                    <table id="shuttle-state-table">
+                        <thead>
+                            <tr>
+                                <th>鍥涘悜绌挎杞�</th>
+                                <th>浠诲姟鐘舵��</th>
+                                <th>灏忚溅鐘舵��</th>
+                                <th>宸ヤ綔妯″紡</th>
+                                <th>瀹為檯搴撲綅</th>
+                                <th>瀹為檯鍧愭爣</th>
+                                <th>鐢甸噺</th>
+                                <th>褰撳墠閫熷害</th>
+                                <th>璐熻浇鐘舵��</th>
+                                <th>椤跺崌浣嶇疆</th>
+                                <th>杩愯鏂瑰悜</th>
+                                <th>杩愯鏂瑰悜2</th>
+                                <th>鍏呯數鐘舵��</th>
+                                <th>鏁呴殰鐘舵��</th>
+                                <th>鏁呴殰鐮�</th>
+                                <th>绠″埗鐘舵��</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+            <!-- 绌挎杞︾姸鎬� -->
+            <div class="shuttle-msg">
+                <table id="shuttle-msg-table">
+                    <thead>
+                        <tr>
+                            <th>鍥涘悜绌挎杞�</th>
+                            <th>宸ヤ綔鍙�</th>
+                            <th>婧愬簱浣�</th>
+                            <th>鐩爣搴撲綅</th>
+                            <th>鏈�楂樼數鑺數鍘�</th>
+                            <th>鏈�浣庣數鑺數鍘�</th>
+                            <th>鐢垫睜鐢靛帇</th>
+                            <th>鍏呮斁鐢靛惊鐜鏁�</th>
+                            <th>鍓╀綑鐢甸噺</th>
+                            <th>鎬荤數閲�</th>
+                            <th>鎬婚噷绋嬫暟</th>
+                            <th>浣滀笟鏍囪</th>
+                            <th>褰撳墠搴撲綅</th>
+                            <th>浠ょ墝</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                    </tbody>
+                </table>
+            </div>
+            <!-- 鎵嬪姩鎿嶄綔 -->
+            <div class="shuttle-operation">
+                <!-- 閬僵灞� -->
+                <div class="shuttle-operation-shade">
+                    <span class="shuttle-operation-shade-span">
+                        WCS 绯荤粺杩愯涓紝璇峰仠姝㈠悗鎿嶄綔
+                    </span>
+                </div>
+                <!-- 璁惧浠诲姟閫夋嫨 -->
+                <div class="task-select">
+                    <!-- 閫夋嫨 -->
+                    <div id="shuttle-select" class="operator-item" style="width: 100%;">
+                        <span class="select-title">鍥涘悜绌挎杞﹀彿</span>
+                        <div class="select-container" id="shuttleRadioBoxId" style="display: flex;flex-wrap: wrap;justify-content: center;align-items: center;">
+<!--                            <label><input type="radio" name="shuttleSelect" value="1" checked>&nbsp;1鍙风┛姊溅</label>-->
+                        </div>
+                    </div>
+                </div>
+
+                <!-- 璁惧浠诲姟鎿嶄綔 -->
+                <div class="task-operator">
+                    <fieldset style="height: auto;padding-bottom: 20px;">
+                        <legend>鎵嬪姩鎿嶄綔</legend>
+                        <div style="display: flex;">
+                            <div style="width: 30%;">
+                                <div class="operator-item" style="height: auto;width: 100%;">
+                                    <span class="select-title">婧愬簱浣�/鐩爣搴撲綅</span>
+                                    <div class="select-container" style="height: auto;padding: 30px 10px 20px 10px;">
+                                        <div class="select-container-item">
+                                            <span>婧愬簱浣�</span>
+                                            <label><input id="sourceLocNo" type="text" name="sourceLocNo" /></label>
+                                        </div>
+                                        <div class="select-container-item">
+                                            <span>鐩爣搴撲綅</span>
+                                            <label><input id="distLocNo" type="text" name="distLocNo" /></label>
+                                        </div>
+
+                                        <div style="margin-top: 10px;">
+                                            <button class="item" onclick="shuttleOperator(18)">鎼繍璐х墿</button>
+                                            <button class="item" onclick="shuttleOperator(14)">绉诲姩鍒扮洰鏍囧簱浣�</button>
+                                            <button class="item" onclick="shuttleOperator(23)">绉诲姩鍒扮洰鏍囧簱浣�(浠诲姟)</button>
+<!--                                            <button class="item" onclick="shuttleOperator(16)">绉诲姩鍒版彁鍗囨満</button>-->
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div style="width: 40%;">
+                                <div class="operator-item" style="height: auto;width: 100%;">
+                                    <span class="select-title">鐩稿叧鎸囦护</span>
+                                    <div class="select-container" style="height: auto;padding: 30px 10px 10px 10px;">
+                                        <div class="button-group">
+                                            <button class="item" onclick="shuttleOperator(3)">鎵樼洏椤跺崌</button>
+                                            <button class="item" onclick="shuttleOperator(4)">鎵樼洏涓嬮檷</button>
+                                            <button class="item" onclick="shuttleOperator(15)">鍏呯數寮�鍏�</button>
+                                            <button class="item" onclick="shuttleOperator(9)">澶嶄綅</button>
+                                            <button class="item" onclick="shuttleOperator(21)">绠″埗</button>
+                                            <button class="item" onclick="shuttleOperator(22)">鍙栨秷绠″埗</button>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div style="width: 30%;">
+                                <div class="operator-item" style="height: auto;width: 100%;">
+                                    <span class="select-title">璺戝簱绯荤粺</span>
+                                    <div class="select-container" style="height: auto;padding: 30px 10px 20px 10px;">
+                                        <div class="select-container-item">
+                                            <span>X璧风偣</span>
+                                            <label><input id="xStart" type="text" name="xStart" /></label>
+                                        </div>
+                                        <div class="select-container-item">
+                                            <span>X缁堢偣</span>
+                                            <label><input id="xTarget" type="text" name="xTarget" /></label>
+                                        </div>
+                                        <div class="select-container-item">
+                                            <span>Y璧风偣</span>
+                                            <label><input id="yStart" type="text" name="yStart" /></label>
+                                        </div>
+                                        <div class="select-container-item">
+                                            <span>Y缁堢偣</span>
+                                            <label><input id="yTarget" type="text" name="yTarget" /></label>
+                                        </div>
+                                        <div>
+                                            <label><input type="radio" name="moveType" value="0">&nbsp;璺戣建閬�</label>
+                                            <label><input type="radio" name="moveType" value="1">&nbsp;璺戝簱浣�</label>
+                                        </div>
+                                        <div style="margin-top: 10px;">
+                                            <button class="item" onclick="moveLoc()">璺戝簱</button>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+
+                        </div>
+                    </fieldset>
+                </div>
+
+            </div>
+            <!-- 绌挎杞︽棩蹇楄緭鍑� -->
+            <div class="shuttle-output-board">
+                <textarea id="shuttle-output"></textarea>
+            </div>
+        </div>
+    </div>
+
+    <div id="shuttle-detl" style="display: none">
+        <div>
+            <div class="form-item">
+                <label class="form-label">绌挎杞﹀彿:</label>
+                <div class="form-input">
+                    <input id="shuttleNo" name="shuttleNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">宸ヤ綔鍙�:</label>
+                <div class="form-input">
+                    <input id="workNo" name="workNo" type="number" class="layui-input" lay-verify="number" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">浣滀笟鏍囪:</label>
+                <div class="form-input">
+                    <input id="pakMk" name="pakMk" type="text" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item">
+                <label class="form-label">浠ょ墝:</label>
+                <div class="form-input">
+                    <input id="token" name="token" type="text" class="layui-input" autocomplete="off">
+                </div>
+            </div>
+            <div class="form-item form-button-container">
+                <button class="form-button" id="save">淇濆瓨</button>
+                <button class="form-button" id="cancel" style="background-color: #D0D0D0">鍙栨秷</button>
+            </div>
+        </div>
+    </div>
+</body>
+</html>
+<script>
+    // 绌虹櫧琛屾暟
+    var shuttleStateTableBlankRows = 0;
+    var shuttleMsgTableBlankRows = 0;
+    // 瀹為檯琛屾暟
+    var shuttleStateTableFullRows = 0;
+    var shuttleMsgTableFullRows = 0;
+    // 鍒濆鍖�
+    var shuttleOutputDom = document.getElementById("shuttle-output");
+    $(document).ready(function() {
+        initShuttleStateTable();
+        getShuttleStateInfo();
+        initShuttleMsgTable();
+        getShuttleMsgInfo();
+        operatorBlockShow();
+        setShuttleRadio();
+    });
+
+    setInterval(function () {
+        getShuttleStateInfo()
+        getShuttleMsgInfo();
+    },1000)
+    setInterval(function () {
+        getShuttleOutput();
+        operatorBlockShow();
+    },500);
+
+    // 鍒ゆ柇鎵嬪姩鎿嶄綔妯″潡鏄惁鍙敤
+    function operatorBlockShow() {
+        if (parent.systemRunning) {
+            $('.shuttle-operation').css("opacity", "0.5");
+            $('.shuttle-operation-shade').show();
+            $('.shuttle-operation-shade-span').show();
+        }  else {
+            $('.shuttle-operation').css("opacity", "1");
+            $('.shuttle-operation-shade').hide();
+            $('.shuttle-operation-shade-span').hide();
+        }
+    }
+
+    function getColor(res,e){
+        $(e).val(res?"鉁�":"鈥�");
+        if (res){
+            $(e).attr("style", "color: #FD482C;");
+        }else {
+            $(e).attr("style", "color: #00FF00;");
+        }
+    }
+
+    $(document).on('click ','#save', function () {
+        http.post(baseUrl+ "/shuttle/detl/update", {
+            shuttleNo: $('#shuttleNo').val(),
+            workNo: $('#workNo').val(),
+            pakMk: $('#pakMk').val(),
+            token: $('#token').val(),
+        }, function (res) {
+            layer.msg("淇敼鎴愬姛", {icon: 1,});
+            layer.close(layerDetl);
+        })
+    })
+
+    function setShuttleRadio() {
+        $.ajax({
+            url: baseUrl+ "/shuttle/table/shuttle/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    let table = res.data;
+                    for (let i=1;i<=table.length;i++){
+                        //娓叉煋鍥涘悜绌挎杞﹂�夐」html
+                        let shuttleRadioBox = '<label><input type="radio" name="shuttleSelect" ';
+                        if (i === 1) {
+                            shuttleRadioBox += 'checked '
+                        }
+                        shuttleRadioBox += 'value="' + table[i - 1].shuttleNo + '">&nbsp;' + table[i - 1].shuttleNo + '鍙风┛姊溅</label>'
+                        $("#shuttleRadioBoxId").append(shuttleRadioBox)
+
+
+                        //娓叉煋鍥涘悜绌挎杞︽暟鎹淮鎶ゅ拰璁惧淇℃伅html
+                        let shuttleCommandLogBox = '<div class="shuttle-command-item" data-shuttleNo="' + table[i - 1].shuttleNo + '">\n' +
+                            '<label>' + table[i - 1].shuttleNo + '#</label>\n' +
+                            // '<button class="demoBtn pos-btn">鏁版嵁缁存姢</button>\n' +
+                            // '<button class="demoBtn mode-btn" id="mode-' + table[i - 1].shuttleNo + '">璁惧淇℃伅</button>\n' +
+                            '</div>'
+                        $("#commandLogId").append(shuttleCommandLogBox);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇 ---- 琛ㄤ竴
+    function getShuttleStateInfo() {
+        let tableEl = $('#shuttle-state-table');
+        $.ajax({
+            url: baseUrl+ "/shuttle/table/shuttle/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    let table = res.data;
+                    if (table.length > shuttleStateTableBlankRows && table.length !== shuttleStateTableFullRows) {
+                        initShuttleStateTable(table.length-shuttleStateTableBlankRows);
+                        shuttleStateTableFullRows = table.length;
+                    }
+                    for (let i=1;i<=table.length;i++){
+                        // $("#mode-"+table[i-1].shuttleNo).html(table[i-1].statusVal===0?'鑱旀満':'鑴辨満');
+                        let tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].shuttleNo);
+                        setVal(tr.children("td").eq(1), table[i-1].protocolStatus$);
+                        setVal(tr.children("td").eq(2), table[i-1].free$);
+                        setVal(tr.children("td").eq(3), table[i-1].workingMode$);
+                        setVal(tr.children("td").eq(4), table[i-1].point$);
+                        setVal(tr.children("td").eq(5), table[i-1].point$$);
+                        setVal(tr.children("td").eq(6), table[i-1].powerPercent$);
+                        setVal(tr.children("td").eq(7), table[i-1].speed);
+                        setVal(tr.children("td").eq(8), table[i-1].loadState$);
+                        setVal(tr.children("td").eq(9), table[i-1].liftPosition$);
+                        setVal(tr.children("td").eq(10), table[i-1].runDir$);
+                        setVal(tr.children("td").eq(11), table[i-1].runDir2$);
+                        setVal(tr.children("td").eq(12), table[i-1].chargState$);
+                        setVal(tr.children("td").eq(13), table[i-1].errState$);
+                        setVal(tr.children("td").eq(14), table[i-1].errCode$);
+                        setVal(tr.children("td").eq(15), table[i-1].suspendState$);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鍥涘悜绌挎杞︽暟鎹〃鑾峰彇 ---- 琛ㄤ簩
+    function getShuttleMsgInfo() {
+        let tableEl = $('#shuttle-msg-table');
+        $.ajax({
+            url: baseUrl+ "/shuttle/table/shuttle/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    var table = res.data;
+                    if (table.length > shuttleMsgTableBlankRows && table.length !== shuttleMsgTableFullRows) {
+                        initShuttleMsgTable(table.length-shuttleMsgTableBlankRows);
+                        shuttleMsgTableFullRows = table.length;
+                    }
+                    for (var i=1;i<=table.length;i++){
+                        var tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].shuttleNo);
+                        setVal(tr.children("td").eq(1), table[i-1].taskNo);
+                        setVal(tr.children("td").eq(2), table[i-1].sourceLocNo);
+                        setVal(tr.children("td").eq(3), table[i-1].locNo);
+                        setVal(tr.children("td").eq(4), table[i-1].maxCellVoltage$);
+                        setVal(tr.children("td").eq(5), table[i-1].minCellVoltage$);
+                        setVal(tr.children("td").eq(6), table[i-1].voltage$);
+                        setVal(tr.children("td").eq(7), table[i-1].chargeCycleTimes);
+                        setVal(tr.children("td").eq(8), table[i-1].surplusQuantity);
+                        setVal(tr.children("td").eq(9), table[i-1].countQuantity);
+                        setVal(tr.children("td").eq(10), table[i-1].statusSum.mileage);
+                        setVal(tr.children("td").eq(11), table[i-1].pakMk$);
+                        setVal(tr.children("td").eq(12), table[i-1].currentLocNo);
+                        setVal(tr.children("td").eq(13), table[i-1].token);
+                        if (table[i-1].shuttleNo == parseInt($('input[name="shuttleSelect"]:checked').val())) {
+                            $("#runSpeedText").text(table[i-1].runSpeed)
+                            $("#chargeLineText").text(table[i-1].chargeLine + "%")
+                        }
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 绌挎杞︽棩蹇楄緭鍑� -----------------------------------------------------------------------
+    function getShuttleOutput() {
+        $.ajax({
+            url: baseUrl + "/shuttle/output/shuttle",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    shuttleOutput(res.data);
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+    // 浠诲姟鎸囦护涓嬪彂
+    function shuttleOperator(shuttleTaskMode) {
+        http.post(baseUrl+"/shuttle/operator/shuttle", {
+            shuttleNo: $('input[name="shuttleSelect"]:checked').val(),
+            shuttleTaskMode: shuttleTaskMode,
+            sourceLocNo: $("#sourceLocNo").val(),
+            distLocNo: $("#distLocNo").val()
+        }, function (res) {
+            layer.msg(res.msg, {icon: 1});
+        });
+    }
+
+    // 璺戝簱
+    function moveLoc() {
+        $.ajax({
+            url: baseUrl + "/shuttle/moveLoc",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            data: {
+                shuttleNo: $('input[name="shuttleSelect"]:checked').val(),
+                xStart: $("#xStart").val(),
+                xTarget: $("#xTarget").val(),
+                yStart: $("#yStart").val(),
+                yTarget: $("#yTarget").val(),
+                moveType: $('input[name="moveType"]:checked').val()
+            },
+            success: function (res) {
+                if (res.code === 200) {
+                    layer.msg(res.msg, {icon: 1});
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+
+    // ------------------------------------------------------------------------------------------------
+
+    // 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇  ----- 琛ㄤ竴
+    function initShuttleStateTable(row) {
+        let line;
+        if (row === undefined){
+            let one = $('#shuttle-state-table thead').height();
+            let total = $('.shuttle-state').height();
+            let count = total / one;
+            count = parseInt(count) - 1;
+            shuttleStateTableBlankRows = count;
+            line = count;
+        } else {
+            line = row;
+        }
+        let html = "";
+        for (let i = 0; i < line; i ++){
+            html += " <tr>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#shuttle-state-table tbody').after(html);
+    }
+
+    // 绌挎杞︽暟鎹〃鑾峰彇  ----- 琛ㄤ簩
+    function initShuttleMsgTable(row) {
+        let line;
+        if (row === undefined){
+            let one = $('#shuttle-msg-table thead').height();
+            let total = $('.shuttle-msg').height();
+            let count = total / one;
+            count = parseInt(count) - 1;
+            shuttleMsgTableBlankRows = count;
+            line = count;
+        } else {
+            line = row;
+        }
+        let html = "";
+        for (let i = 0; i < line; i ++){
+            html += " <tr>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#shuttle-msg-table tbody').after(html);
+    }
+
+    // 鏃ュ織杈撳嚭妗�
+    function shuttleOutput(content){
+        shuttleOutputDom.value += content;
+        shuttleOutputDom.scrollTop = shuttleOutputDom.scrollHeight;
+    }
+
+    //鍥涘悜绌挎杞﹂厤缃弬鏁颁繚瀛�
+    function shuttleParamSave() {
+        $.ajax({
+            url: baseUrl+ "/shuttle/runSpeed/" + $('input[name="shuttleSelect"]:checked').val(),
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            data: {
+                runSpeed: $("#runSpeed").val(),
+                chargeLine: $("#chargeLine").val(),
+            },
+            success: function (res) {
+                if (res.code === 200){
+                    layer.msg("閰嶇疆宸蹭繚瀛�", {icon: 1,});
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 璇︽儏鎿嶄綔 -------------------------------------------------------------------------
+    var layerDetl;
+    $(document).on('dblclick ','#shuttle-msg-table tr', function () {
+        var shuttleNo = $(this).children("td").eq(0).html();
+        if (shuttleNo !== null && shuttleNo !== "") {
+            layerDetl = layer.open({
+                type: 1,
+                title: false,
+                shadeClose: true,
+                offset: 'rt',
+                anim: 5,
+                shade: [0],
+                area: ['340px', '255px'],
+                closeBtn: 0,
+                content: $("#shuttle-detl"),
+                success: function(layero, index){
+                    $.ajax({
+                        url: baseUrl+ "/shuttle/table/shuttle/state",
+                        headers: {'token': localStorage.getItem('token')},
+                        method: 'POST',
+                        success: function (res) {
+                            if (res.code === 200){
+                                var table = res.data;
+                                for (var i=1;i<=table.length;i++){
+                                    if (shuttleNo == table[i-1].shuttleNo) {
+                                        $('#shuttleNo').val(shuttleNo);
+                                        $('#workNo').val(table[i-1].taskNo);
+                                        $('#pakMk').val(table[i-1].pakMk$);
+                                        $('#token').val(table[i-1].token);
+                                    }
+                                }
+                            } else if (res.code === 403){
+                                window.location.href = baseUrl+"/login";
+                            }  else {
+                                console.log(res.msg);
+                            }
+                        }
+                    });
+                },
+                end: function () {
+                    $('#shuttleNo').val("");
+                    $('#workNo').val("");
+                    $('#pakMk').val("");
+                    $('#token').val("");
+                }
+            })
+        }
+    });
+
+    $(document).on('click ','#cancel', function () {
+        $('#shuttleNo').val("");
+        $('#workNo').val("");
+        $('#pakMk').val("");
+        $('#token').val("");
+        layer.close(layerDetl);
+    })
+
+
+</script>

--
Gitblit v1.9.1