From f375928943ad4b9fe6d8508e151971dcdc23e982 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期一, 05 一月 2026 16:18:36 +0800
Subject: [PATCH] #

---
 src/main/webapp/views/locMap/locMap.html                              |  451 -----------
 src/main/java/com/zy/core/utils/StationOperateProcessUtils.java       |   29 
 src/main/java/com/zy/asrs/controller/DualCrnController.java           |    6 
 src/main/java/com/zy/core/model/command/DualCrnCommand.java           |   20 
 src/main/java/com/zy/core/network/fake/ZyDualCrnFakeConnect.java      |  182 ++-
 src/main/java/com/zy/asrs/controller/OpenController.java              |   26 
 src/main/java/com/zy/asrs/domain/vo/DualCrnStateTableVo.java          |   24 
 src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java         |   87 -
 src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java       |  591 ++++++++++----
 src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java           |    1 
 src/main/webapp/components/WatchDualCrnCard.js                        |   12 
 src/main/java/com/zy/asrs/domain/param/GetAllLocInformationParam.java |   12 
 src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java      |    9 
 src/main/java/com/zy/core/thread/impl/ZyRgvThread.java                |   86 -
 src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java   |   56 
 src/main/java/com/zy/asrs/utils/Utils.java                            |  197 ++++
 src/main/java/com/zy/core/thread/impl/ZyStationThread.java            |   84 -
 src/main/java/com/zy/core/enums/RedisKeyType.java                     |    2 
 src/main/java/com/zy/common/service/CommonService.java                |   13 
 src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java     |  385 +++++----
 src/main/resources/docs/WCS外部HTTP API接口V1.2.docx                      |    0 
 src/main/java/com/zy/core/plugin/FakeProcess.java                     |   14 
 22 files changed, 1,153 insertions(+), 1,134 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/DualCrnController.java b/src/main/java/com/zy/asrs/controller/DualCrnController.java
index 7262f27..1d9123d 100644
--- a/src/main/java/com/zy/asrs/controller/DualCrnController.java
+++ b/src/main/java/com/zy/asrs/controller/DualCrnController.java
@@ -56,15 +56,11 @@
             vo.setLoading(p.getLoaded() != null && p.getLoaded() == 1 ? "鏈夌墿" : "鏃犵墿");
             vo.setLoadingTwo(p.getLoadedTwo() != null && p.getLoadedTwo() == 1 ? "鏈夌墿" : "鏃犵墿");
             vo.setBay(p.getBay());
-            vo.setBayTwo(p.getBayTwo());
             vo.setLev(p.getLevel());
-            vo.setLevTwo(p.getLevelTwo());
             vo.setForkOffset(p.getForkPosType() == null ? "-" : p.getForkPosType().desc);
             vo.setForkOffsetTwo(p.getForkPosTypeTwo() == null ? "-" : p.getForkPosTypeTwo().desc);
             vo.setLiftPos(p.getLiftPosType() == null ? "-" : p.getLiftPosType().desc);
-            vo.setLiftPosTwo(p.getLiftPosTypeTwo() == null ? "-" : p.getLiftPosTypeTwo().desc);
             vo.setWalkPos(p.getWalkPos() != null && p.getWalkPos() == 0 ? "鍦ㄥ畾浣�" : "涓嶅湪瀹氫綅");
-            vo.setWalkPosTwo(p.getWalkPosTwo() != null && p.getWalkPosTwo() == 0 ? "鍦ㄥ畾浣�" : "涓嶅湪瀹氫綅");
             vo.setTaskReceive(p.getTaskReceive() != null && p.getTaskReceive() == 1 ? "鎺ユ敹" : "鏃犱换鍔�");
             vo.setTaskReceiveTwo(p.getTaskReceiveTwo() != null && p.getTaskReceiveTwo() == 1 ? "鎺ユ敹" : "鏃犱换鍔�");
             vo.setXspeed(p.getXSpeed());
@@ -159,7 +155,7 @@
         }
         DualCrnCommand command = crnThread.getMoveCommand(targetLocNo, 9999, crnNo);
         if (station != null) {
-            command.setStation(station.shortValue());
+            command.setStation(station);
         }
         MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(3, command));
         return R.ok();
diff --git a/src/main/java/com/zy/asrs/controller/OpenController.java b/src/main/java/com/zy/asrs/controller/OpenController.java
index 9ca84ee..cef5ae6 100644
--- a/src/main/java/com/zy/asrs/controller/OpenController.java
+++ b/src/main/java/com/zy/asrs/controller/OpenController.java
@@ -1,6 +1,7 @@
 package com.zy.asrs.controller;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
 import com.core.common.R;
 import com.zy.asrs.domain.param.*;
 import com.zy.asrs.entity.DeviceConfig;
@@ -179,18 +180,31 @@
 
     @PostMapping("/getAllLocInformation")
     @OpenApiLog(memo = "鑾峰彇鍏ㄩ儴搴撲綅淇℃伅")
-    public R getAllLocInformation() {
-        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>());
-        if (locMasts.isEmpty()) {
-            return R.error("搴撲綅淇℃伅涓嶅瓨鍦�");
+    public R getAllLocInformation(@RequestBody GetAllLocInformationParam param) {
+        List<HashMap<String, Object>> list = new ArrayList<>();
+        EntityWrapper<LocMast> wrapper = new EntityWrapper<>();
+
+        if (!Cools.isEmpty(param.getRow())) {
+            wrapper.eq("row1", param.getRow());
         }
 
-        ArrayList<HashMap<String, Object>> list = new ArrayList<>();
+        if (!Cools.isEmpty(param.getLev())) {
+            wrapper.eq("lev1", param.getLev());
+        }
+
+        List<LocMast> locMasts = locMastService.selectList(wrapper);
+        if (locMasts.isEmpty()) {
+            return R.ok().add(list);
+        }
+
         for (LocMast locMast : locMasts) {
             HashMap<String, Object> map = new HashMap<>();
             map.put("locNo", locMast.getLocNo());
             map.put("locSts", locMast.getLocSts());
             map.put("barcode", locMast.getBarcode());
+            map.put("row", locMast.getRow1());
+            map.put("bay", locMast.getBay1());
+            map.put("lev", locMast.getLev1());
             list.add(map);
         }
 
@@ -224,7 +238,7 @@
     @GetMapping("/getFakeSystemRunStatus")
     public R getFakeSystemRunStatus() {
         HashMap<String, Object> map = new HashMap<>();
-        if(mainProcessPlugin.equals("FakeProcess")) {
+        if(mainProcessPlugin.contains("Fake")) {
             map.put("running", false);
             map.put("isFake", true);
             Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "enableFake"));
diff --git a/src/main/java/com/zy/asrs/domain/param/GetAllLocInformationParam.java b/src/main/java/com/zy/asrs/domain/param/GetAllLocInformationParam.java
new file mode 100644
index 0000000..6f1f5b5
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/GetAllLocInformationParam.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class GetAllLocInformationParam {
+
+    private Integer row;
+
+    private Integer lev;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/DualCrnStateTableVo.java b/src/main/java/com/zy/asrs/domain/vo/DualCrnStateTableVo.java
index 34ae94e..e3dceab 100644
--- a/src/main/java/com/zy/asrs/domain/vo/DualCrnStateTableVo.java
+++ b/src/main/java/com/zy/asrs/domain/vo/DualCrnStateTableVo.java
@@ -23,30 +23,22 @@
 
     private String loadingTwo = "-";
 
-    private Integer bay;
-
-    private Integer bayTwo;
-
-    private Integer lev;
-
-    private Integer levTwo;
-
     private String forkOffset = "-";
 
     private String forkOffsetTwo = "-";
 
-    private String liftPos = "-";
-
-    private String liftPosTwo = "-";
-
-    private String walkPos = "-";
-
-    private String walkPosTwo = "-";
-
     private String taskReceive = "-";
 
     private String taskReceiveTwo = "-";
 
+    private Integer bay;
+
+    private Integer lev;
+
+    private String liftPos = "-";
+
+    private String walkPos = "-";
+
     private Integer xspeed = 0;
 
     private Integer yspeed = 0;
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index bb645ef..6fd6c90 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -198,13 +198,24 @@
             List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<>());
             List<BasCrnp> basCrnps = basCrnpService.selectList(wrapper);
 
+            List<BasCrnp> baseList = new ArrayList<>();
+            List<BasCrnp> extraList = new ArrayList<>();
+            for (BasCrnp basCrnp : basCrnps) {
+                if (excludeCrnList.contains(basCrnp.getCrnNo())) {
+                    extraList.add(basCrnp);
+                }else {
+                    baseList.add(basCrnp);
+                }
+            }
+            baseList.addAll(extraList);
+
             for (WrkMast wrkMast : wrkMasts) {
                 Integer crnNo = wrkMast.getCrnNo();
                 map.put(crnNo, map.getOrDefault(crnNo, 0) + 1);
             }
 
             List<BasCrnp> enabledCrnps = new ArrayList<>();
-            for (BasCrnp basCrnp : basCrnps) {
+            for (BasCrnp basCrnp : baseList) {
                 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
                 if (crnThread == null) {
                     continue;
@@ -221,9 +232,6 @@
                 // 妫�鏌ユ槸鍚﹁秴杩囨渶澶у叆搴撲换鍔℃暟
                 if (maxInTaskControl && inWrkMasts.size() >= basCrnp.getMaxInTask()) {
                     News.info("鍫嗗灈鏈�:{} 宸茶揪鏈�澶у叆搴撲换鍔℃暟锛屽綋鍓嶄换鍔℃暟:{}", basCrnp.getCrnNo(), inWrkMasts.size());
-                    continue;
-                }
-                if (excludeCrnList.contains(basCrnp.getCrnNo())) {
                     continue;
                 }
 
@@ -278,13 +286,24 @@
             List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<>());
             List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(wrapper);
 
+            List<BasDualCrnp> baseList = new ArrayList<>();
+            List<BasDualCrnp> extraList = new ArrayList<>();
+            for (BasDualCrnp basDualCrnp : basDualCrnps) {
+                if (excludeCrnList.contains(basDualCrnp.getCrnNo())) {
+                    extraList.add(basDualCrnp);
+                }else {
+                    baseList.add(basDualCrnp);
+                }
+            }
+            baseList.addAll(extraList);
+
             for (WrkMast wrkMast : wrkMasts) {
                 Integer dualCrnNo = wrkMast.getDualCrnNo();
                 map.put(dualCrnNo, map.getOrDefault(dualCrnNo, 0) + 1);
             }
 
             List<BasDualCrnp> enabledCrnps = new ArrayList<>();
-            for (BasDualCrnp basDualCrnp : basDualCrnps) {
+            for (BasDualCrnp basDualCrnp : baseList) {
                 DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
                 if (dualCrnThread == null) {
                     continue;
@@ -300,10 +319,7 @@
                 );
                 // 妫�鏌ユ槸鍚﹁秴杩囨渶澶у叆搴撲换鍔℃暟
                 if (maxInTaskControl && inWrkMasts.size() >= basDualCrnp.getMaxInTask()) {
-                    News.info("鍫嗗灈鏈�:{} 宸茶揪鏈�澶у叆搴撲换鍔℃暟锛屽綋鍓嶄换鍔℃暟:{}", basDualCrnp.getCrnNo(), inWrkMasts.size());
-                    continue;
-                }
-                if (excludeCrnList.contains(basDualCrnp.getCrnNo())) {
+                    News.info("鍙屽伐浣嶅爢鍨涙満:{} 宸茶揪鏈�澶у叆搴撲换鍔℃暟锛屽綋鍓嶄换鍔℃暟:{}", basDualCrnp.getCrnNo(), inWrkMasts.size());
                     continue;
                 }
 
@@ -364,9 +380,23 @@
             return rowList;
         }
 
+        BasDualCrnpService basDualCrnpService = SpringUtils.getBean(BasDualCrnpService.class);
+        if (basDualCrnpService == null) {
+            return rowList;
+        }
+
         List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>());
         for (BasCrnp basCrnp : basCrnps) {
             String deepRowsStr = basCrnp.getDeepRows();
+            if(!Cools.isEmpty(deepRowsStr)){
+                List<Integer> rows = JSON.parseArray(deepRowsStr, Integer.class);
+                rowList.addAll(rows);
+            }
+        }
+
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<BasDualCrnp>());
+        for (BasDualCrnp basDualCrnp : basDualCrnps) {
+            String deepRowsStr = basDualCrnp.getDeepRows();
             if(!Cools.isEmpty(deepRowsStr)){
                 List<Integer> rows = JSON.parseArray(deepRowsStr, Integer.class);
                 rowList.addAll(rows);
@@ -377,6 +407,22 @@
 
     //鑾峰彇娴呭簱浣嶆帓鍙�
     public static Integer getShallowRowByDeepRow(Integer deepRow) {
+        SlaveType slaveType = checkRowDeviceType(deepRow);
+        if (slaveType == null) {
+            return null;
+        }
+
+        if (slaveType.equals(SlaveType.Crn)) {
+            return getShallowRowByCrnDeepRow(deepRow);
+        } else if (slaveType.equals(SlaveType.DualCrn)) {
+            return getShallowRowByDualCrnDeepRow(deepRow);
+        }
+
+        return null;
+    }
+
+    //鑾峰彇鍫嗗灈鏈烘祬搴撲綅鎺掑彿
+    public static Integer getShallowRowByCrnDeepRow(Integer deepRow) {
         BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
         if (basCrnpService == null) {
             return null;
@@ -403,6 +449,52 @@
             }
         }
 
+        if (controlRowList == null) {
+            return null;
+        }
+
+        for (Integer row : controlRowList) {
+            if (deepRow.equals(row)) {
+                continue;
+            }
+
+            return row;
+        }
+        return null;
+    }
+
+    //鑾峰彇鍙屽伐浣嶅爢鍨涙満娴呭簱浣嶆帓鍙�
+    public static Integer getShallowRowByDualCrnDeepRow(Integer deepRow) {
+        BasDualCrnpService basDualCrnpService = SpringUtils.getBean(BasDualCrnpService.class);
+        if (basDualCrnpService == null) {
+            return null;
+        }
+
+        List<Integer> deepRowList = getDeepRowList();
+        if (!deepRowList.contains(deepRow)) {
+            return null;
+        }
+
+        List<Integer> controlRowList = null;
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
+        for (BasDualCrnp basDualCrnp : basDualCrnps) {
+            List<List<Integer>> rowList = basDualCrnp.getControlRows$();
+            for (List<Integer> rows : rowList) {
+                if (rows.contains(deepRow)) {
+                    controlRowList = rows;
+                    break;
+                }
+            }
+
+            if (controlRowList != null) {
+                break;
+            }
+        }
+
+        if (controlRowList == null) {
+            return null;
+        }
+
         for (Integer row : controlRowList) {
             if (deepRow.equals(row)) {
                 continue;
@@ -415,6 +507,19 @@
 
     //鑾峰彇娣卞簱浣嶆帓鍙�
     public static Integer getDeepRowByShallowRow(Integer shallowRow) {
+        SlaveType slaveType = checkRowDeviceType(shallowRow);
+
+        if (slaveType.equals(SlaveType.Crn)) {
+            return getDeepRowByCrnShallowRow(shallowRow);
+        } else if (slaveType.equals(SlaveType.DualCrn)) {
+            return getDeepRowByDualCrnShallowRow(shallowRow);
+        }
+
+        return null;
+    }
+
+    //鑾峰彇鍫嗗灈鏈烘繁搴撲綅鎺掑彿
+    public static Integer getDeepRowByCrnShallowRow(Integer shallowRow) {
         BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
         if (basCrnpService == null) {
             return null;
@@ -451,4 +556,78 @@
         }
         return null;
     }
+
+    //鑾峰彇鍙屽伐浣嶅爢鍨涙満娣卞簱浣嶆帓鍙�
+    public static Integer getDeepRowByDualCrnShallowRow(Integer shallowRow) {
+        BasDualCrnpService basDualCrnpService = SpringUtils.getBean(BasDualCrnpService.class);
+        if (basDualCrnpService == null) {
+            return null;
+        }
+
+        List<Integer> controlRowList = null;
+        List<Integer> deepRowList = null;
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
+        for (BasDualCrnp basDualCrnp : basDualCrnps) {
+            List<List<Integer>> rowList = basDualCrnp.getControlRows$();
+            for (List<Integer> rows : rowList) {
+                if (rows.contains(shallowRow)) {
+                    controlRowList = rows;
+                    deepRowList = JSON.parseArray(basDualCrnp.getDeepRows(), Integer.class);
+                    break;
+                }
+            }
+
+            if (controlRowList != null) {
+                break;
+            }
+        }
+
+        if (deepRowList == null) {
+            return null;
+        }
+
+        for (Integer row : controlRowList) {
+            if (!deepRowList.contains(row)) {
+                continue;
+            }
+
+            return row;
+        }
+        return null;
+    }
+
+    //妫�娴嬫帓鍙疯澶囩被鍨�
+    public static SlaveType checkRowDeviceType(Integer row) {
+        BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
+        if (basCrnpService == null) {
+            return null;
+        }
+
+        BasDualCrnpService basDualCrnpService = SpringUtils.getBean(BasDualCrnpService.class);
+        if (basDualCrnpService == null) {
+            return null;
+        }
+
+        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
+        for (BasCrnp basCrnp : basCrnps) {
+            List<List<Integer>> controlRows = basCrnp.getControlRows$();
+            for (List<Integer> list : controlRows) {
+                if (list.contains(row)) {
+                    return SlaveType.Crn;
+                }
+            }
+        }
+
+        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
+        for (BasDualCrnp basDualCrnp : basDualCrnps) {
+            List<List<Integer>> controlRows = basDualCrnp.getControlRows$();
+            for (List<Integer> list : controlRows) {
+                if (list.contains(row)) {
+                    return SlaveType.DualCrn;
+                }
+            }
+        }
+
+        return null;
+    }
 }
diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index 138e46b..86294ea 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -1,7 +1,5 @@
 package com.zy.common.service;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;
 import com.core.exception.CoolException;
@@ -156,7 +154,6 @@
         if (!sourceCrnResult.getCrnNo().equals(targetCrnResult.getCrnNo())) {
             throw new CoolException("婧愬簱浣嶅拰鐩爣搴撲綅涓嶅湪鍚屼竴宸烽亾");
         }
-        Integer crnNo = targetCrnResult.getCrnNo();
 
         // 鑾峰彇宸ヤ綔鍙�
         int workNo = getWorkNo(WrkIoType.LOC_MOVE.id);
@@ -169,11 +166,19 @@
         wrkMast.setIoPri(ioPri);
         wrkMast.setSourceLocNo(param.getSourceLocNo());
         wrkMast.setLocNo(param.getLocNo()); // 鐩爣搴撲綅
-        wrkMast.setCrnNo(crnNo);
         wrkMast.setWmsWrkNo(param.getTaskNo());
         wrkMast.setBarcode(sourceLocMast.getBarcode());
         wrkMast.setAppeTime(now);
         wrkMast.setModiTime(now);
+
+        if (targetCrnResult.getCrnType().equals(SlaveType.Crn)) {
+            wrkMast.setCrnNo(targetCrnResult.getCrnNo());
+        } else if (targetCrnResult.getCrnType().equals(SlaveType.DualCrn)) {
+            wrkMast.setDualCrnNo(targetCrnResult.getCrnNo());
+        }else {
+            throw new CoolException("鏈煡璁惧绫诲瀷");
+        }
+
         boolean res = wrkMastService.insert(wrkMast);
         if (!res) {
             News.error("绉诲簱浠诲姟 --- 淇濆瓨宸ヤ綔妗eけ璐ワ紒");
diff --git a/src/main/java/com/zy/core/enums/RedisKeyType.java b/src/main/java/com/zy/core/enums/RedisKeyType.java
index 42dcfac..da4641c 100644
--- a/src/main/java/com/zy/core/enums/RedisKeyType.java
+++ b/src/main/java/com/zy/core/enums/RedisKeyType.java
@@ -36,10 +36,12 @@
     DUAL_CRN_IO_EXECUTE_FINISH_LIMIT("dual_crn_io_execute_finish_limit_"),
     STATION_IN_EXECUTE_LIMIT("station_in_execute_limit_"),
     STATION_OUT_EXECUTE_LIMIT("station_out_execute_limit_"),
+    STATION_OUT_EXECUTE_COMPLETE_LIMIT("station_out_execute_complete_limit_"),
     CHECK_STATION_RUN_BLOCK_LIMIT_("check_station_run_block_limit_"),
     CHECK_SHALLOW_LOC_STATUS_LIMIT("check_shallow_loc_status_limit_"),
 
     DUAL_CRN_PICK_WAIT_NEXT_TASK("dual_crn_pick_wait_next_task_"),
+    DUAL_CRN_OUT_TASK_STATION_INFO("dual_crn_out_task_station_info_"),
 
     CURRENT_CIRCLE_TASK_CRN_NO("current_circle_task_crn_no_"),
     AI_CHAT_HISTORY("ai_chat_history_"),
diff --git a/src/main/java/com/zy/core/model/command/DualCrnCommand.java b/src/main/java/com/zy/core/model/command/DualCrnCommand.java
index 73599da..9dd806a 100644
--- a/src/main/java/com/zy/core/model/command/DualCrnCommand.java
+++ b/src/main/java/com/zy/core/model/command/DualCrnCommand.java
@@ -12,35 +12,35 @@
     private Integer crnNo = 0;
 
     // 浠诲姟鍙�
-    private Short taskNo = 0;
+    private Integer taskNo = 0;
 
     /**
      * 浠诲姟妯″紡锛�
      */
-    private Short taskMode = 0;
+    private Integer taskMode = 0;
 
     // 婧愪綅缃帓鍙�
-    private Short sourcePosX = 0;
+    private Integer sourcePosX = 0;
 
     // 婧愪綅缃垪鍙�
-    private Short sourcePosY = 0;
+    private Integer sourcePosY = 0;
 
     // 婧愪綅缃眰鍙�
-    private Short sourcePosZ = 0;
+    private Integer sourcePosZ = 0;
 
     // 鐩爣浣嶇疆鎺掑彿
-    private Short destinationPosX = 0;
+    private Integer destinationPosX = 0;
 
     // 鐩爣浣嶇疆鍒楀彿
-    private Short destinationPosY = 0;
+    private Integer destinationPosY = 0;
 
     // 鐩爣浣嶇疆灞傚彿
-    private Short destinationPosZ = 0;
+    private Integer destinationPosZ = 0;
 
     // 浠诲姟纭 0锛氭湭纭 1锛氬凡纭
-    private Short command = 0;
+    private Integer command = 0;
 
     //宸ヤ綅
-    private Short station;
+    private Integer station;
 
 }
diff --git a/src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java b/src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java
index dd03a9c..d30c6b1 100644
--- a/src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java
+++ b/src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java
@@ -47,20 +47,6 @@
     public Integer statusTwo;
 
     /**
-     * 鍫嗗灈鏈哄綋鍓嶅垪鍙�
-     */
-    public Integer bay;
-
-    public Integer bayTwo;
-
-    /**
-     * 鍫嗗灈鏈哄綋鍓嶅眰鍙�
-     */
-    public Integer level;
-
-    public Integer levelTwo;
-
-    /**
      * 褰撳墠璐у弶浣嶇疆
      * 0 = 璐у弶鍘熶綅
      * 1 = 璐у弶鍦ㄥ乏渚�
@@ -69,24 +55,6 @@
     public Integer forkPos;
 
     public Integer forkPosTwo;
-
-    /**
-     * 褰撳墠杞借揣鍙颁綅缃�
-     * 0 = 涓嬪畾浣�
-     * 1 = 涓婂畾浣�
-     */
-    public Integer liftPos;
-
-    public Integer liftPosTwo;
-
-    /**
-     * 璧拌鍦ㄥ畾浣�
-     * 0 = 鍦ㄥ畾浣�
-     * 1 = 涓嶅湪瀹氫綅
-     */
-    public Integer walkPos;
-
-    public Integer walkPosTwo;
 
     /**
      * 杞借揣鍙版湁鐗�
@@ -105,6 +73,30 @@
     public Integer taskReceiveTwo;
 
     /**
+     * 鍫嗗灈鏈哄綋鍓嶅垪鍙�
+     */
+    public Integer bay;
+
+    /**
+     * 鍫嗗灈鏈哄綋鍓嶅眰鍙�
+     */
+    public Integer level;
+
+    /**
+     * 褰撳墠杞借揣鍙颁綅缃�
+     * 0 = 涓嬪畾浣�
+     * 1 = 涓婂畾浣�
+     */
+    public Integer liftPos;
+
+    /**
+     * 璧拌鍦ㄥ畾浣�
+     * 0 = 鍦ㄥ畾浣�
+     * 1 = 涓嶅湪瀹氫綅
+     */
+    public Integer walkPos;
+
+    /**
      * X琛岃蛋绾块�熷害m/min
      */
     private Integer xSpeed;
diff --git a/src/main/java/com/zy/core/network/fake/ZyDualCrnFakeConnect.java b/src/main/java/com/zy/core/network/fake/ZyDualCrnFakeConnect.java
index 0d25fed..d529843 100644
--- a/src/main/java/com/zy/core/network/fake/ZyDualCrnFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyDualCrnFakeConnect.java
@@ -16,7 +16,10 @@
 
     private ZyDualCrnStatusEntity crnStatus;
     private DeviceConfig deviceConfig;
-    private final ExecutorService executor = Executors.newSingleThreadExecutor();
+    // 鍏佽骞惰鎵ц澶氫釜鍛戒护浠诲姟锛堝浐瀹氱嚎绋嬫睜锛夈�傚闇�鏇撮珮骞跺彂鍙皟鏁村ぇ灏忋��
+    private final ExecutorService executor = Executors
+            .newFixedThreadPool(9999);
+    private int taskExecuteStation = 0;
 
     public ZyDualCrnFakeConnect(DeviceConfig deviceConfig) {
         this.deviceConfig = deviceConfig;
@@ -79,46 +82,71 @@
     }
 
     private void commandMove(DualCrnCommand command) {
-        int destinationPosX = command.getDestinationPosX().intValue();
-        int destinationPosY = command.getDestinationPosY().intValue();
-        int destinationPosZ = command.getDestinationPosZ().intValue();
-        int taskMode = command.getTaskMode().intValue();
-        int taskNo = command.getTaskNo().intValue();
+        int destinationPosX = command.getDestinationPosX();
+        int destinationPosY = command.getDestinationPosY();
+        int destinationPosZ = command.getDestinationPosZ();
+        int taskMode = command.getTaskMode();
+        int taskNo = command.getTaskNo();
+        int station = command.getStation();
+
+        while (true) {
+            if (taskExecuteStation == 0) {
+                taskExecuteStation = station;
+            }
+
+            if (taskExecuteStation == station) {
+                break;
+            }
+
+            sleep(200);
+        }
 
         if(command.getStation() == 1) {
             this.crnStatus.setTaskNo(taskNo);
             this.crnStatus.setStatus(CrnStatusType.MOVING.id);
             this.crnStatus.setTaskReceive(1);
-            moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), destinationPosY, this.crnStatus.getLevel(), destinationPosZ, command.getStation());
             this.crnStatus.setStatus(CrnStatusType.WAITING.id);
         }else {
             this.crnStatus.setTaskNoTwo(taskNo);
             this.crnStatus.setStatusTwo(CrnStatusType.MOVING.id);
             this.crnStatus.setTaskReceive(1);
-            moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), destinationPosY, this.crnStatus.getLevel(), destinationPosZ, command.getStation());
             this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id);
         }
+
+        taskExecuteStation = 0;
     }
 
     private void commandTake(DualCrnCommand command) {
-        int sourcePosX = command.getSourcePosX().intValue();
-        int sourcePosY = command.getSourcePosY().intValue();
-        int sourcePosZ = command.getSourcePosZ().intValue();
-        int destinationPosX = command.getDestinationPosX().intValue();
-        int destinationPosY = command.getDestinationPosY().intValue();
-        int destinationPosZ = command.getDestinationPosZ().intValue();
-        int taskMode = command.getTaskMode().intValue();
-        int taskNo = command.getTaskNo().intValue();
+        int sourcePosX = command.getSourcePosX();
+        int sourcePosY = command.getSourcePosY();
+        int sourcePosZ = command.getSourcePosZ();
+        int destinationPosX = command.getDestinationPosX();
+        int destinationPosY = command.getDestinationPosY();
+        int destinationPosZ = command.getDestinationPosZ();
+        int taskMode = command.getTaskMode();
+        int taskNo = command.getTaskNo();
+        int station = command.getStation();
+
+        while (true) {
+            if (taskExecuteStation == 0) {
+                taskExecuteStation = station;
+            }
+
+            if (taskExecuteStation == station) {
+                break;
+            }
+
+            sleep(200);
+        }
 
         if(command.getStation() == 1) {
             this.crnStatus.setTaskNo(taskNo);
             this.crnStatus.setStatus(CrnStatusType.FETCH_MOVING.id);
             this.crnStatus.setTaskReceive(1);
 
-            moveY(this.crnStatus.getBay(), sourcePosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevel(), sourcePosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), sourcePosY,this.crnStatus.getLevel(), sourcePosZ,command.getStation());
             this.crnStatus.setStatus(CrnStatusType.FETCHING.id);
             sleep(2000);
             if (Thread.currentThread().isInterrupted()) {
@@ -127,8 +155,7 @@
 
             this.crnStatus.setLoaded(1);
             this.crnStatus.setStatus(CrnStatusType.PUT_MOVING.id);
-            moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation());
             this.crnStatus.setStatus(CrnStatusType.PUTTING.id);
             sleep(2000);
             if (Thread.currentThread().isInterrupted()) {
@@ -141,8 +168,7 @@
             this.crnStatus.setStatusTwo(CrnStatusType.FETCH_MOVING.id);
             this.crnStatus.setTaskReceiveTwo(1);
 
-            moveY(this.crnStatus.getBayTwo(), sourcePosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevelTwo(), sourcePosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), sourcePosY,this.crnStatus.getLevel(), sourcePosZ, command.getStation());
             this.crnStatus.setStatusTwo(CrnStatusType.FETCHING.id);
             sleep(2000);
             if (Thread.currentThread().isInterrupted()) {
@@ -151,8 +177,7 @@
 
             this.crnStatus.setLoadedTwo(1);
             this.crnStatus.setStatusTwo(CrnStatusType.PUT_MOVING.id);
-            moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation());
             this.crnStatus.setStatusTwo(CrnStatusType.PUTTING.id);
             sleep(2000);
             if (Thread.currentThread().isInterrupted()) {
@@ -161,24 +186,38 @@
             this.crnStatus.setLoadedTwo(0);
             this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id);
         }
+
+        taskExecuteStation = 0;
     }
 
     private void commandPick(DualCrnCommand command) {
-        int destinationPosX = command.getDestinationPosX().intValue();
-        int destinationPosY = command.getDestinationPosY().intValue();
-        int destinationPosZ = command.getDestinationPosZ().intValue();
-        int taskMode = command.getTaskMode().intValue();
-        int taskNo = command.getTaskNo().intValue();
+        int destinationPosX = command.getDestinationPosX();
+        int destinationPosY = command.getDestinationPosY();
+        int destinationPosZ = command.getDestinationPosZ();
+        int taskMode = command.getTaskMode();
+        int taskNo = command.getTaskNo();
+        int station = command.getStation();
+
+        while (true) {
+            if (taskExecuteStation == 0) {
+                taskExecuteStation = station;
+            }
+
+            if (taskExecuteStation == station) {
+                break;
+            }
+
+            sleep(200);
+        }
 
         if(command.getStation() == 1) {
             this.crnStatus.setTaskNo(taskNo);
             this.crnStatus.setStatus(CrnStatusType.FETCH_MOVING.id);
             this.crnStatus.setTaskReceive(1);
 
-            moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation());
             this.crnStatus.setStatus(CrnStatusType.FETCHING.id);
-            sleep(2000);
+            sleep(3000);
             if (Thread.currentThread().isInterrupted()) {
                 return;
             }
@@ -189,34 +228,47 @@
             this.crnStatus.setStatusTwo(CrnStatusType.FETCH_MOVING.id);
             this.crnStatus.setTaskReceiveTwo(1);
 
-            moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation());
             this.crnStatus.setStatusTwo(CrnStatusType.FETCHING.id);
-            sleep(2000);
+            sleep(3000);
             if (Thread.currentThread().isInterrupted()) {
                 return;
             }
             this.crnStatus.setLoadedTwo(1);
             this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id);
         }
+
+        taskExecuteStation = 0;
     }
 
     private void commandPut(DualCrnCommand command) {
-        int destinationPosX = command.getDestinationPosX().intValue();
-        int destinationPosY = command.getDestinationPosY().intValue();
-        int destinationPosZ = command.getDestinationPosZ().intValue();
-        int taskMode = command.getTaskMode().intValue();
-        int taskNo = command.getTaskNo().intValue();
+        int destinationPosX = command.getDestinationPosX();
+        int destinationPosY = command.getDestinationPosY();
+        int destinationPosZ = command.getDestinationPosZ();
+        int taskMode = command.getTaskMode();
+        int taskNo = command.getTaskNo();
+        int station = command.getStation();
+
+        while (true) {
+            if (taskExecuteStation == 0) {
+                taskExecuteStation = station;
+            }
+
+            if (taskExecuteStation == station) {
+                break;
+            }
+
+            sleep(200);
+        }
 
         if(command.getStation() == 1) {
             this.crnStatus.setTaskNo(taskNo);
             this.crnStatus.setStatus(CrnStatusType.PUT_MOVING.id);
             this.crnStatus.setTaskReceive(1);
 
-            moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation());
             this.crnStatus.setStatus(CrnStatusType.PUTTING.id);
-            sleep(2000);
+            sleep(3000);
             if (Thread.currentThread().isInterrupted()) {
                 return;
             }
@@ -227,16 +279,17 @@
             this.crnStatus.setStatusTwo(CrnStatusType.PUT_MOVING.id);
             this.crnStatus.setTaskReceiveTwo(1);
 
-            moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue());
-            moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue());
+            moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation());
             this.crnStatus.setStatusTwo(CrnStatusType.PUTTING.id);
-            sleep(2000);
+            sleep(3000);
             if (Thread.currentThread().isInterrupted()) {
                 return;
             }
             this.crnStatus.setLoadedTwo(0);
             this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id);
         }
+
+        taskExecuteStation = 0;
     }
 
     private void moveZ(int sourcePosZ, int destinationPosZ, int station) {
@@ -245,11 +298,7 @@
             int initSourcePosZ = sourcePosZ;
             for(int i = 0; i < moveLength; i++) {
                 initSourcePosZ++;
-                if(station == 1) {
-                    this.crnStatus.setLevel(initSourcePosZ);
-                }else {
-                    this.crnStatus.setLevelTwo(initSourcePosZ);
-                }
+                this.crnStatus.setLevel(initSourcePosZ);
                 sleep(1000);
                 if (Thread.currentThread().isInterrupted()) {
                     return;
@@ -260,11 +309,7 @@
             int initSourcePosZ = sourcePosZ;
             for(int i = 0; i < moveLength; i++) {
                 initSourcePosZ--;
-                if(station == 1) {
-                    this.crnStatus.setLevel(initSourcePosZ);
-                }else {
-                    this.crnStatus.setLevelTwo(initSourcePosZ);
-                }
+                this.crnStatus.setLevel(initSourcePosZ);
                 this.crnStatus.setLevel(initSourcePosZ);
                 sleep(1000);
                 if (Thread.currentThread().isInterrupted()) {
@@ -280,12 +325,8 @@
             int initSourcePosY = sourcePosY;
             for(int i = 0; i < moveLength; i++) {
                 initSourcePosY++;
-                if(station == 1) {
-                    this.crnStatus.setBay(initSourcePosY);
-                }else {
-                    this.crnStatus.setBayTwo(initSourcePosY);
-                }
-                sleep(1000);
+                this.crnStatus.setBay(initSourcePosY);
+                sleep(500);
                 if (Thread.currentThread().isInterrupted()) {
                     return;
                 }
@@ -295,12 +336,8 @@
             int initSourcePosY = sourcePosY;
             for(int i = 0; i < moveLength; i++) {
                 initSourcePosY--;
-                if(station == 1) {
-                    this.crnStatus.setBay(initSourcePosY);
-                }else {
-                    this.crnStatus.setBayTwo(initSourcePosY);
-                }
-                sleep(1000);
+                this.crnStatus.setBay(initSourcePosY);
+                sleep(500);
                 if (Thread.currentThread().isInterrupted()) {
                     return;
                 }
@@ -308,6 +345,11 @@
         }
     }
 
+    private void moveYZ(int sourcePosY, int destinationPosY, int sourcePosZ, int destinationPosZ, int station) {
+        moveY(sourcePosY, destinationPosY, station);
+        moveZ(sourcePosZ, destinationPosZ, station);
+    }
+
     private void sleep(long ms) {
         try {
             Thread.sleep(ms);
diff --git a/src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java b/src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java
index 9a35a44..2d3b82e 100644
--- a/src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java
@@ -64,21 +64,18 @@
                 //宸ヤ綅1
                 crnStatus.setTaskNo((int) siemensNet.getByteTransform().TransInt16(result.Content, 2));
                 crnStatus.setStatus((int) siemensNet.getByteTransform().TransInt16(result.Content, 4));
-                crnStatus.setBay((int) siemensNet.getByteTransform().TransInt16(result.Content, 6));
-                crnStatus.setLevel((int) siemensNet.getByteTransform().TransInt16(result.Content, 8));
                 crnStatus.setForkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 10));
                 crnStatus.setLoaded((int) siemensNet.getByteTransform().TransInt16(result.Content, 12));
-                crnStatus.setWalkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 26));
 
                 //宸ヤ綅2
                 crnStatus.setTaskNoTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 14));
                 crnStatus.setStatusTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 16));
-                crnStatus.setBayTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 18));
-                crnStatus.setLevelTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 20));
                 crnStatus.setForkPosTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 22));
                 crnStatus.setLoadedTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 24));
-                crnStatus.setWalkPosTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 28));
 
+                crnStatus.setBay((int) siemensNet.getByteTransform().TransInt16(result.Content, 6));
+                crnStatus.setLevel((int) siemensNet.getByteTransform().TransInt16(result.Content, 8));
+                crnStatus.setWalkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 26));
                 crnStatus.setAlarm((int) siemensNet.getByteTransform().TransInt16(result.Content, 18));
                 crnStatus.setTemp1((int) siemensNet.getByteTransform().TransInt16(result.Content, 20));
                 crnStatus.setTemp2((int) siemensNet.getByteTransform().TransInt16(result.Content, 22));
diff --git a/src/main/java/com/zy/core/plugin/FakeProcess.java b/src/main/java/com/zy/core/plugin/FakeProcess.java
index 7aad282..d2d0fc0 100644
--- a/src/main/java/com/zy/core/plugin/FakeProcess.java
+++ b/src/main/java/com/zy/core/plugin/FakeProcess.java
@@ -94,7 +94,7 @@
         stationOperateProcessUtils.stationOutExecuteFinish();
 
         //鎵ц鍙屽伐浣嶅爢鍨涙満浠诲姟
-        dualCrnOperateProcessUtils.dualRrnIoExecute();
+        dualCrnOperateProcessUtils.dualCrnIoExecute();
         //鍙屽伐浣嶅爢鍨涙満浠诲姟鎵ц瀹屾垚
         dualCrnOperateProcessUtils.dualCrnIoExecuteFinish();
     }
@@ -615,7 +615,17 @@
                                 continue;
                             }
                             DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
-                            if (!dualCrnProtocol.getStatusType().equals(DualCrnStatusType.PUT_MOVING) && !dualCrnProtocol.getStatusType().equals(DualCrnStatusType.PUTTING)) {
+
+                            boolean reset = false;
+                            if (dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getLoaded() == 1) {
+                                reset = true;
+                            }
+
+                            if (dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getLoadedTwo() == 1) {
+                                reset = true;
+                            }
+
+                            if (!reset) {
                                 continue;
                             }
 
diff --git a/src/main/java/com/zy/core/thread/impl/ZyRgvThread.java b/src/main/java/com/zy/core/thread/impl/ZyRgvThread.java
index 295a818..41c78fe 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyRgvThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyRgvThread.java
@@ -30,10 +30,6 @@
 
 import java.text.MessageFormat;
 import java.util.Date;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
 
 @Data
 @Slf4j
@@ -44,9 +40,6 @@
     private ZyRgvConnectDriver zyRgvConnectDriver;
     private RgvProtocol rgvProtocol;
     private int deviceLogCollectTime = 200;
-    private volatile boolean closed = false;
-    private ScheduledExecutorService readExecutor;
-    private ScheduledExecutorService processExecutor;
 
     public ZyRgvThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
@@ -58,53 +51,39 @@
     public void run() {
         connect();
         initRgv();
-        readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("RgvReader-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
-            }
-        });
-        readExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                deviceLogCollectTime = Utils.getDeviceLogCollectTime();
-                readStatus();
-            } catch (Exception e) {
-                log.error("RgvThread Fail", e);
-            }
-        }, 0, 200, TimeUnit.MILLISECONDS);
 
-        processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("RgvWriter-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
+        Thread readThread = new Thread(() -> {
+            while (true) {
+                try {
+                    deviceLogCollectTime = Utils.getDeviceLogCollectTime();
+                    readStatus();
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("RgvThread Fail", e);
+                }
             }
         });
-        processExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                int step = 1;
-                Task task = MessageQueue.poll(SlaveType.Rgv, deviceConfig.getDeviceNo());
-                if (task != null) {
-                    step = task.getStep();
+        readThread.start();
+
+        Thread processThread = new Thread(() -> {
+            while (true) {
+                try {
+                    int step = 1;
+                    Task task = MessageQueue.poll(SlaveType.Rgv, deviceConfig.getDeviceNo());
+                    if (task != null) {
+                        step = task.getStep();
+                    }
+                    if (step == 2) {
+                        sendCommand((RgvCommand) task.getData());
+                    }
+
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("RgvProcess Fail", e);
                 }
-                if (step == 2 && task != null) {
-                    sendCommand((RgvCommand) task.getData());
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
             }
-        }, 0, 200, TimeUnit.MILLISECONDS);
+        });
+        processThread.start();
     }
 
     private void initRgv() {
@@ -182,17 +161,8 @@
 
     @Override
     public void close() {
-        closed = true;
         if (zyRgvConnectDriver != null) {
             zyRgvConnectDriver.close();
-        }
-        ScheduledExecutorService ex = readExecutor;
-        if (ex != null) {
-            try { ex.shutdownNow(); } catch (Exception ignore) {}
-        }
-        ScheduledExecutorService px = processExecutor;
-        if (px != null) {
-            try { px.shutdownNow(); } catch (Exception ignore) {}
         }
     }
 
diff --git a/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java b/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
index a29d75a..72610b6 100644
--- a/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
@@ -30,10 +30,6 @@
 
 import java.text.MessageFormat;
 import java.util.Date;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
 
 /**
  * 鍫嗗灈鏈虹嚎绋�
@@ -47,10 +43,6 @@
     private ZyCrnConnectDriver zyCrnConnectDriver;
     private CrnProtocol crnProtocol;
     private int deviceLogCollectTime = 200;
-    private boolean resetFlag = false;
-    private volatile boolean closed = false;
-    private ScheduledExecutorService readExecutor;
-    private ScheduledExecutorService processExecutor;
 
     public ZySiemensCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
@@ -62,53 +54,39 @@
     public void run() {
         this.connect();
         this.initCrn();
-        readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("CrnReader-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
-            }
-        });
-        readExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                deviceLogCollectTime = Utils.getDeviceLogCollectTime();
-                readStatus();
-            } catch (Exception e) {
-                log.error("CrnThread Fail", e);
-            }
-        }, 0, 200, TimeUnit.MILLISECONDS);
 
-        processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("CrnWriter-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
+        Thread readThread = new Thread(() -> {
+            while (true) {
+                try {
+                    deviceLogCollectTime = Utils.getDeviceLogCollectTime();
+                    readStatus();
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("CrnThread Fail", e);
+                }
             }
         });
-        processExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                int step = 1;
-                Task task = MessageQueue.poll(SlaveType.Crn, deviceConfig.getDeviceNo());
-                if (task != null) {
-                    step = task.getStep();
+        readThread.start();
+
+        Thread processThread = new Thread(() -> {
+            while (true) {
+                try {
+                    int step = 1;
+                    Task task = MessageQueue.poll(SlaveType.Crn, deviceConfig.getDeviceNo());
+                    if (task != null) {
+                        step = task.getStep();
+                    }
+                    if (step == 2) {
+                        sendCommand((CrnCommand) task.getData());
+                    }
+
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("CrnProcess Fail", e);
                 }
-                if (step == 2 && task != null) {
-                    sendCommand((CrnCommand) task.getData());
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
             }
-        }, 0, 200, TimeUnit.MILLISECONDS);
+        });
+        processThread.start();
     }
 
     /**
@@ -240,15 +218,6 @@
 
     @Override
     public void close() {
-        closed = true;
-        ScheduledExecutorService ex = readExecutor;
-        if (ex != null) {
-            try { ex.shutdownNow(); } catch (Exception ignore) {}
-        }
-        ScheduledExecutorService px = processExecutor;
-        if (px != null) {
-            try { px.shutdownNow(); } catch (Exception ignore) {}
-        }
         if (zyCrnConnectDriver != null) {
             zyCrnConnectDriver.close();
         }
diff --git a/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java b/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
index 9ac77c5..43f5039 100644
--- a/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
@@ -6,26 +6,28 @@
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.DateUtils;
 import com.core.common.SpringUtils;
-import com.zy.asrs.entity.BasDualCrnp;
-import com.zy.asrs.entity.BasDualCrnpOpt;
-import com.zy.asrs.entity.DeviceConfig;
-import com.zy.asrs.entity.DeviceDataLog;
+import com.zy.asrs.entity.*;
 import com.zy.asrs.service.BasDualCrnpOptService;
 import com.zy.asrs.service.BasDualCrnpService;
+import com.zy.asrs.service.WrkMastService;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.News;
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.OutputQueue;
+import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.*;
 import com.zy.core.model.CommandResponse;
+import com.zy.core.model.StationObjModel;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.DualCrnCommand;
 import com.zy.core.model.protocol.DualCrnProtocol;
+import com.zy.core.model.protocol.StationProtocol;
 import com.zy.core.network.DeviceConnectPool;
 import com.zy.core.network.ZyDualCrnConnectDriver;
 import com.zy.core.network.entity.ZyDualCrnStatusEntity;
 import com.zy.core.thread.DualCrnThread;
+import com.zy.core.thread.StationThread;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
@@ -33,10 +35,7 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
+import java.util.Map;
 
 /**
  * 鍙屽伐浣嶅爢鍨涙満绾跨▼
@@ -50,11 +49,6 @@
     private ZyDualCrnConnectDriver zyDualCrnConnectDriver;
     private DualCrnProtocol crnProtocol;
     private int deviceLogCollectTime = 200;
-    private boolean resetFlag = false;
-    private volatile boolean closed = false;
-    private ScheduledExecutorService readExecutor;
-    private ScheduledExecutorService processExecutor;
-    private ScheduledExecutorService commandExecutor;
 
     public ZySiemensDualCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
@@ -66,133 +60,163 @@
     public void run() {
         this.connect();
         this.initCrn();
-        readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("DualCrnReader-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
+
+        Thread readThread = new Thread(() -> {
+            while (true) {
+                try {
+                    deviceLogCollectTime = Utils.getDeviceLogCollectTime();
+                    readStatus();
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("DualCrnThread Fail", e);
+                }
             }
         });
-        readExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                deviceLogCollectTime = Utils.getDeviceLogCollectTime();
-                readStatus();
-            } catch (Exception e) {
-                log.error("DualCrnThread Fail", e);
-            }
-        }, 0, 200, TimeUnit.MILLISECONDS);
+        readThread.start();
 
-        processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("DualCrnWriter-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
-            }
-        });
-        processExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                int step = 1;
-                Task task = MessageQueue.poll(SlaveType.DualCrn, deviceConfig.getDeviceNo());
-                if (task != null) {
-                    step = task.getStep();
-                }
-
-                if (step == 2) {
-                    List<DualCrnCommand> commandList = (List<DualCrnCommand>) task.getData();
-                    DualCrnCommand command = commandList.get(0);
-
-                    HashMap<String, Object> map = new HashMap<>();
-                    map.put("commands", commandList);
-                    map.put("idx", 1);
-                    redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + command.getTaskNo(), JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
-                    sendCommand(command);
-                } else if (step == 3) {
-                    sendCommand((DualCrnCommand) task.getData());
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }, 0, 200, TimeUnit.MILLISECONDS);
-
-        commandExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("DualCrnCommand-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
-            }
-        });
-        commandExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                if(crnProtocol.getMode() != DualCrnModeType.AUTO.id) {
-                    return;
-                }
-
-                if(crnProtocol.getAlarm() != 0) {
-                    return;
-                }
-
-                //绛夊緟涓嬩竴涓换鍔�
-                Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
-                if (wait != null) {
-                    return;
-                }
-
-                if(crnProtocol.getTaskNo() > 0 && crnProtocol.getStatus() == DualCrnStatusType.IDLE.id) {
-                    Integer taskNo = crnProtocol.getTaskNo();
-                    Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo);
-                    if (commandObj == null) {
-                        News.error("鍙屽伐浣嶅爢鍨涙満锛屽伐浣�1绌洪棽绛夊緟涓嬪彂鍛戒护锛屼絾鏈壘鍒板懡浠ゃ�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crnProtocol.getCrnNo(), taskNo);
-                        return;
+        Thread processThread = new Thread(() -> {
+            while (true) {
+                try {
+                    int step = 1;
+                    Task task = MessageQueue.poll(SlaveType.DualCrn, deviceConfig.getDeviceNo());
+                    if (task != null) {
+                        step = task.getStep();
                     }
 
-                    JSONObject commandMap = JSON.parseObject(commandObj.toString());
-                    Integer idx = commandMap.getInteger("idx");
-                    List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class);
-                    DualCrnCommand dualCommand = commandList.get(idx);
-                    idx++;
-                    commandMap.put("idx", idx);
-                    sendCommand(dualCommand);
-                    redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24);
-                }
+                    if (step == 2) {
+                        List<DualCrnCommand> commandList = (List<DualCrnCommand>) task.getData();
+                        DualCrnCommand command = commandList.get(0);
 
-                if(crnProtocol.getTaskNoTwo() > 0 && crnProtocol.getStatusTwo() == DualCrnStatusType.IDLE.id) {
-                    Integer taskNo = crnProtocol.getTaskNoTwo();
-                    Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo);
-                    if (commandObj == null) {
-                        News.error("鍙屽伐浣嶅爢鍨涙満锛屽伐浣�2绌洪棽绛夊緟涓嬪彂鍛戒护锛屼絾鏈壘鍒板懡浠ゃ�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crnProtocol.getCrnNo(), taskNo);
-                        return;
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("commands", commandList);
+                        map.put("idx", 1);
+                        redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + command.getTaskNo(), JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
+                        sendCommand(command);
+                    } else if (step == 3) {
+                        sendCommand((DualCrnCommand) task.getData());
                     }
 
-                    JSONObject commandMap = JSON.parseObject(commandObj.toString());
-                    Integer idx = commandMap.getInteger("idx");
-                    List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class);
-                    DualCrnCommand dualCommand = commandList.get(idx);
-                    idx++;
-                    commandMap.put("idx", idx);
-                    sendCommand(dualCommand);
-                    redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24);
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("DualCrnProcess Fail", e);
                 }
-
-            } catch (Exception e) {
-                e.printStackTrace();
-                log.error("DualCrnCommandThread Fail", e);
             }
-        }, 0, 200, TimeUnit.MILLISECONDS);
+        });
+        processThread.start();
+
+        Thread commandThread = new Thread(() -> {
+            while (true) {
+                try {
+                    if(crnProtocol.getMode() != DualCrnModeType.AUTO.id) {
+                        continue;
+                    }
+
+                    if(crnProtocol.getAlarm() != 0) {
+                        continue;
+                    }
+
+                    if (crnProtocol.getLoaded() == 1 && crnProtocol.getLoadedTwo() == 1) {
+                        Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+                        if (wait != null) {
+                            redisUtil.del(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+                        }
+                    }
+
+                    if(crnProtocol.getTaskNo() > 0 && crnProtocol.getStatus() == DualCrnStatusType.IDLE.id) {
+                        Integer taskNo = crnProtocol.getTaskNo();
+                        Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo);
+                        if (commandObj == null) {
+                            News.error("鍙屽伐浣嶅爢鍨涙満锛屽伐浣�1绌洪棽绛夊緟涓嬪彂鍛戒护锛屼絾鏈壘鍒板懡浠ゃ�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crnProtocol.getCrnNo(), taskNo);
+                            continue;
+                        }
+
+                        JSONObject commandMap = JSON.parseObject(commandObj.toString());
+                        Integer idx = commandMap.getInteger("idx");
+                        List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class);
+                        if (idx >= commandList.size()) {
+                            continue;
+                        }
+                        DualCrnCommand dualCommand = commandList.get(idx);
+
+                        if (dualCommand.getTaskMode() == DualCrnTaskModeType.PUT.id.shortValue()) {
+                            //绛夊緟涓嬩竴涓换鍔�
+                            Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+                            if (wait != null) {
+                                continue;
+                            }
+
+                            Object outTaskStationInfoObj = redisUtil.get(RedisKeyType.DUAL_CRN_OUT_TASK_STATION_INFO.key + taskNo);
+                            if (outTaskStationInfoObj != null) {
+                                //妫�娴嬪嚭鍙g珯鏄惁鍙墽琛屾斁璐у姩浣�
+                                StationObjModel stationObjModel = JSON.parseObject(outTaskStationInfoObj.toString(), StationObjModel.class);
+                                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
+                                if (stationThread == null) {
+                                    continue;
+                                }
+
+                                Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap();
+                                StationProtocol stationProtocol = statusMap.get(stationObjModel.getStationId());
+                                if (stationProtocol == null) {
+                                    continue;
+                                }
+
+                                if (!stationProtocol.isAutoing()) {
+                                    continue;
+                                }
+
+                                if (stationProtocol.isLoading()) {
+                                    continue;
+                                }
+
+                                if (stationProtocol.getTaskNo() > 0) {
+                                    continue;
+                                }
+                            }
+                        }
+
+                        idx++;
+                        commandMap.put("idx", idx);
+                        sendCommand(dualCommand);
+                        redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24);
+                    }
+
+                    if(crnProtocol.getTaskNoTwo() > 0 && crnProtocol.getStatusTwo() == DualCrnStatusType.IDLE.id) {
+                        Integer taskNo = crnProtocol.getTaskNoTwo();
+                        Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo);
+                        if (commandObj == null) {
+                            News.error("鍙屽伐浣嶅爢鍨涙満锛屽伐浣�2绌洪棽绛夊緟涓嬪彂鍛戒护锛屼絾鏈壘鍒板懡浠ゃ�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crnProtocol.getCrnNo(), taskNo);
+                            continue;
+                        }
+
+                        JSONObject commandMap = JSON.parseObject(commandObj.toString());
+                        Integer idx = commandMap.getInteger("idx");
+                        List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class);
+                        if (idx >= commandList.size()) {
+                            continue;
+                        }
+                        DualCrnCommand dualCommand = commandList.get(idx);
+
+                        if (dualCommand.getTaskMode() == DualCrnTaskModeType.PUT.id.shortValue()) {
+                            //绛夊緟涓嬩竴涓换鍔�
+                            Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo());
+                            if (wait != null) {
+                                continue;
+                            }
+                        }
+
+                        idx++;
+                        commandMap.put("idx", idx);
+                        sendCommand(dualCommand);
+                        redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24);
+                    }
+
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("DualCrnCommand Fail", e);
+                }
+            }
+        });
+        commandThread.start();
     }
 
     /**
@@ -257,25 +281,21 @@
         //宸ヤ綅1
         crnProtocol.setTaskNo(crnStatus.getTaskNo());
         crnProtocol.setStatus(crnStatus.getStatus());
-        crnProtocol.setBay(crnStatus.getBay());
-        crnProtocol.setLevel(crnStatus.getLevel());
         crnProtocol.setForkPos(crnStatus.getForkPos());
         crnProtocol.setLoaded(crnStatus.getLoaded());
-        crnProtocol.setWalkPos(crnStatus.getWalkPos());
-        crnProtocol.setLiftPos(crnStatus.getLiftPos());
         crnProtocol.setTaskReceive(crnStatus.getTaskReceive());
 
         //宸ヤ綅2
         crnProtocol.setTaskNoTwo(crnStatus.getTaskNoTwo());
         crnProtocol.setStatusTwo(crnStatus.getStatusTwo());
-        crnProtocol.setBayTwo(crnStatus.getBayTwo());
-        crnProtocol.setLevelTwo(crnStatus.getLevelTwo());
         crnProtocol.setForkPosTwo(crnStatus.getForkPosTwo());
         crnProtocol.setLoadedTwo(crnStatus.getLoadedTwo());
-        crnProtocol.setWalkPosTwo(crnStatus.getWalkPosTwo());
-        crnProtocol.setLiftPosTwo(crnStatus.getLiftPosTwo());
         crnProtocol.setTaskReceiveTwo(crnStatus.getTaskReceiveTwo());
 
+        crnProtocol.setBay(crnStatus.getBay());
+        crnProtocol.setLevel(crnStatus.getLevel());
+        crnProtocol.setWalkPos(crnStatus.getWalkPos());
+        crnProtocol.setLiftPos(crnStatus.getLiftPos());
         crnProtocol.setAlarm(crnStatus.getAlarm());
         crnProtocol.setTemp1(crnStatus.getTemp1());
         crnProtocol.setTemp2(crnStatus.getTemp2());
@@ -337,15 +357,6 @@
 
     @Override
     public void close() {
-        closed = true;
-        ScheduledExecutorService ex = readExecutor;
-        if (ex != null) {
-            try { ex.shutdownNow(); } catch (Exception ignore) {}
-        }
-        ScheduledExecutorService px = processExecutor;
-        if (px != null) {
-            try { px.shutdownNow(); } catch (Exception ignore) {}
-        }
         if (zyDualCrnConnectDriver != null) {
             zyDualCrnConnectDriver.close();
         }
@@ -360,16 +371,16 @@
     public DualCrnCommand getPickAndPutCommand(String sourceLocNo, String targetLocNo, Integer taskNo, Integer crnNo, Integer station) {
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
-        crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
-        crnCommand.setTaskMode(DualCrnTaskModeType.TRANSFER.id.shortValue()); // 浠诲姟妯″紡:  鍙栨斁璐�
-        crnCommand.setSourcePosX((short) Utils.getRow(sourceLocNo));     // 婧愬簱浣嶆帓
-        crnCommand.setSourcePosY((short) Utils.getBay(sourceLocNo));     // 婧愬簱浣嶅垪
-        crnCommand.setSourcePosZ((short) Utils.getLev(sourceLocNo));     // 婧愬簱浣嶅眰
-        crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
-        crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
-        crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
-        crnCommand.setStation(station.shortValue());//宸ヤ綅
-        crnCommand.setCommand((short) 1);     // 浠诲姟纭
+        crnCommand.setTaskNo(taskNo); // 宸ヤ綔鍙�
+        crnCommand.setTaskMode(DualCrnTaskModeType.TRANSFER.id); // 浠诲姟妯″紡:  鍙栨斁璐�
+        crnCommand.setSourcePosX(Utils.getRow(sourceLocNo));     // 婧愬簱浣嶆帓
+        crnCommand.setSourcePosY(Utils.getBay(sourceLocNo));     // 婧愬簱浣嶅垪
+        crnCommand.setSourcePosZ(Utils.getLev(sourceLocNo));     // 婧愬簱浣嶅眰
+        crnCommand.setDestinationPosX(Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
+        crnCommand.setDestinationPosY(Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
+        crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
+        crnCommand.setStation(station);//宸ヤ綅
+        crnCommand.setCommand(1);     // 浠诲姟纭
         return crnCommand;
     }
 
@@ -377,13 +388,13 @@
     public DualCrnCommand getPickCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station) {
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
-        crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
-        crnCommand.setTaskMode(DualCrnTaskModeType.PICK.id.shortValue()); // 浠诲姟妯″紡:  鍙栬揣
-        crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
-        crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
-        crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
-        crnCommand.setStation(station.shortValue());//宸ヤ綅
-        crnCommand.setCommand((short) 1);     // 浠诲姟纭
+        crnCommand.setTaskNo(taskNo); // 宸ヤ綔鍙�
+        crnCommand.setTaskMode(DualCrnTaskModeType.PICK.id); // 浠诲姟妯″紡:  鍙栬揣
+        crnCommand.setDestinationPosX(Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
+        crnCommand.setDestinationPosY(Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
+        crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
+        crnCommand.setStation(station);//宸ヤ綅
+        crnCommand.setCommand(1);     // 浠诲姟纭
         return crnCommand;
     }
 
@@ -391,13 +402,13 @@
     public DualCrnCommand getPutCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station) {
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
-        crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
-        crnCommand.setTaskMode(DualCrnTaskModeType.PUT.id.shortValue()); // 浠诲姟妯″紡:  鏀捐揣
-        crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
-        crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
-        crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
-        crnCommand.setStation(station.shortValue());//宸ヤ綅
-        crnCommand.setCommand((short) 1);     // 浠诲姟纭
+        crnCommand.setTaskNo(taskNo); // 宸ヤ綔鍙�
+        crnCommand.setTaskMode(DualCrnTaskModeType.PUT.id); // 浠诲姟妯″紡:  鏀捐揣
+        crnCommand.setDestinationPosX(Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
+        crnCommand.setDestinationPosY(Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
+        crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
+        crnCommand.setStation(station);//宸ヤ綅
+        crnCommand.setCommand(1);     // 浠诲姟纭
         return crnCommand;
     }
 
@@ -405,12 +416,12 @@
     public DualCrnCommand getMoveCommand(String targetLocNo, Integer taskNo, Integer crnNo) {
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
-        crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
-        crnCommand.setTaskMode(DualCrnTaskModeType.MOVE.id.shortValue()); // 浠诲姟妯″紡:  鍫嗗灈鏈虹Щ鍔�
-        crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
-        crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
-        crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
-        crnCommand.setCommand((short) 1);     // 浠诲姟纭
+        crnCommand.setTaskNo(taskNo); // 宸ヤ綔鍙�
+        crnCommand.setTaskMode(DualCrnTaskModeType.MOVE.id); // 浠诲姟妯″紡:  鍫嗗灈鏈虹Щ鍔�
+        crnCommand.setDestinationPosX(Utils.getRow(targetLocNo));     // 鐩爣搴撲綅鎺�
+        crnCommand.setDestinationPosY(Utils.getBay(targetLocNo));     // 鐩爣搴撲綅鍒�
+        crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo));     // 鐩爣搴撲綅灞�
+        crnCommand.setCommand(1);     // 浠诲姟纭
         return crnCommand;
     }
 
@@ -418,16 +429,16 @@
     public DualCrnCommand getResetCommand(Integer crnNo, Integer station) {
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
-        crnCommand.setTaskNo((short) 0); // 宸ヤ綔鍙�
-        crnCommand.setTaskMode(DualCrnTaskModeType.CONFIRM.id.shortValue()); // 浠诲姟妯″紡:  纭
-        crnCommand.setSourcePosX((short)0);     // 婧愬簱浣嶆帓
-        crnCommand.setSourcePosY((short)0);     // 婧愬簱浣嶅垪
-        crnCommand.setSourcePosZ((short)0);     // 婧愬簱浣嶅眰
-        crnCommand.setDestinationPosX((short)0);     // 鐩爣搴撲綅鎺�
-        crnCommand.setDestinationPosY((short)0);     // 鐩爣搴撲綅鍒�
-        crnCommand.setDestinationPosZ((short)0);     // 鐩爣搴撲綅灞�
-        crnCommand.setStation(station.shortValue());//宸ヤ綅
-        crnCommand.setCommand((short) 1);     // 浠诲姟纭
+        crnCommand.setTaskNo(0); // 宸ヤ綔鍙�
+        crnCommand.setTaskMode(DualCrnTaskModeType.CONFIRM.id); // 浠诲姟妯″紡:  纭
+        crnCommand.setSourcePosX(0);     // 婧愬簱浣嶆帓
+        crnCommand.setSourcePosY(0);     // 婧愬簱浣嶅垪
+        crnCommand.setSourcePosZ(0);     // 婧愬簱浣嶅眰
+        crnCommand.setDestinationPosX(0);     // 鐩爣搴撲綅鎺�
+        crnCommand.setDestinationPosY(0);     // 鐩爣搴撲綅鍒�
+        crnCommand.setDestinationPosZ(0);     // 鐩爣搴撲綅灞�
+        crnCommand.setStation(station);//宸ヤ綅
+        crnCommand.setCommand(1);     // 浠诲姟纭
         return crnCommand;
     }
 
diff --git a/src/main/java/com/zy/core/thread/impl/ZyStationThread.java b/src/main/java/com/zy/core/thread/impl/ZyStationThread.java
index 8a9ff5b..df9af2a 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationThread.java
@@ -28,10 +28,7 @@
 
 import java.text.MessageFormat;
 import java.util.*;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
 
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
@@ -49,9 +46,6 @@
     private ZyStationConnectDriver zyStationConnectDriver;
     private int deviceLogCollectTime = 200;
     private long deviceDataLogTime = System.currentTimeMillis();
-    private volatile boolean closed = false;
-    private ScheduledExecutorService readExecutor;
-    private ScheduledExecutorService processExecutor;
 
     public ZyStationThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
@@ -64,53 +58,38 @@
         this.connect();
         deviceLogCollectTime = Utils.getDeviceLogCollectTime();
 
-        readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("DevpReader-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
+        Thread readThread = new Thread(() -> {
+            while (true) {
+                try {
+                    deviceLogCollectTime = Utils.getDeviceLogCollectTime();
+                    readStatus();
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("StationThread Fail", e);
+                }
             }
         });
-        readExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                deviceLogCollectTime = Utils.getDeviceLogCollectTime();
-                readStatus();
-            } catch (Exception e) {
-                log.error("StationThread Fail", e);
-            }
-        }, 0, 200, TimeUnit.MILLISECONDS);
+        readThread.start();
 
-        processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setName("DevpWriter-" + deviceConfig.getDeviceNo());
-                t.setDaemon(true);
-                return t;
+        Thread processThread = new Thread(() -> {
+            while (true) {
+                try {
+                    int step = 1;
+                    Task task = MessageQueue.poll(SlaveType.Devp, deviceConfig.getDeviceNo());
+                    if (task != null) {
+                        step = task.getStep();
+                    }
+                    if (step == 2) {
+                        sendCommand((StationCommand) task.getData());
+                    }
+
+                    Thread.sleep(100);
+                } catch (Exception e) {
+                    log.error("StationProcess Fail", e);
+                }
             }
         });
-        processExecutor.scheduleAtFixedRate(() -> {
-            if (closed || Thread.currentThread().isInterrupted()) {
-                return;
-            }
-            try {
-                int step = 1;
-                Task task = MessageQueue.poll(SlaveType.Devp, deviceConfig.getDeviceNo());
-                if (task != null) {
-                    step = task.getStep();
-                }
-                if (step == 2) {
-                    sendCommand((StationCommand) task.getData());
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }, 0, 200, TimeUnit.MILLISECONDS);
+        processThread.start();
     }
 
     private void readStatus() {
@@ -190,15 +169,6 @@
 
     @Override
     public void close() {
-        closed = true;
-        ScheduledExecutorService ex = readExecutor;
-        if (ex != null) {
-            try { ex.shutdownNow(); } catch (Exception ignore) {}
-        }
-        ScheduledExecutorService px = processExecutor;
-        if (px != null) {
-            try { px.shutdownNow(); } catch (Exception ignore) {}
-        }
         if (zyStationConnectDriver != null) {
             zyStationConnectDriver.close();
         }
diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index 3cb2adf..d486a06 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -163,7 +163,6 @@
             }
 
             if(wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts){
-                News.taskInfo(stationProtocol.getTaskNo(), "宸ヤ綔鍙�:{} 浠诲姟鐘舵�佸紓甯�", stationProtocol.getTaskNo());
                 continue;
             }
 
diff --git a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
index 68d3406..29f07c5 100644
--- a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
@@ -2,10 +2,10 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.exception.CoolException;
 import com.zy.asrs.domain.param.CreateLocMoveTaskParam;
-import com.zy.asrs.entity.BasCrnp;
 import com.zy.asrs.entity.BasDualCrnp;
 import com.zy.asrs.entity.LocMast;
 import com.zy.asrs.entity.WrkMast;
@@ -22,15 +22,14 @@
 import com.zy.core.enums.*;
 import com.zy.core.model.StationObjModel;
 import com.zy.core.model.Task;
-import com.zy.core.model.command.CrnCommand;
 import com.zy.core.model.command.DualCrnCommand;
-import com.zy.core.model.protocol.CrnProtocol;
+import com.zy.core.model.command.StationCommand;
 import com.zy.core.model.protocol.DualCrnProtocol;
 import com.zy.core.model.protocol.StationProtocol;
-import com.zy.core.thread.CrnThread;
 import com.zy.core.thread.DualCrnThread;
 import com.zy.core.thread.StationThread;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
@@ -42,6 +41,8 @@
 @Component
 public class DualCrnOperateProcessUtils {
 
+    @Value("${mainProcessPlugin}")
+    private String mainProcessPlugin;
     @Autowired
     private WrkMastService wrkMastService;
     @Autowired
@@ -56,7 +57,7 @@
     private CommonService commonService;
 
     //鍏ュ嚭搴�  ===>>  鍙屽伐浣嶅爢鍨涙満鍏ュ嚭搴撲綔涓氫笅鍙�
-    public synchronized void dualRrnIoExecute() {
+    public synchronized void dualCrnIoExecute() {
         List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
         for (BasDualCrnp basDualCrnp : basDualCrnps) {
             DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
@@ -85,72 +86,67 @@
                 continue;
             }
 
-            int executeTaskNo = 0;
-            if (dualCrnProtocol.getTaskNo() > 0) {
-                executeTaskNo = dualCrnProtocol.getTaskNo();
-            }
-            if (dualCrnProtocol.getTaskNoTwo() > 0) {
-                executeTaskNo = dualCrnProtocol.getTaskNoTwo();
-            }
-
-            if (executeTaskNo > 0) {
-                WrkMast wrkMast = wrkMastService.selectByWorkNo(executeTaskNo);
-                if (wrkMast != null) {
-                    if (wrkMast.getIoType().equals(WrkIoType.IN.id)) {
-                        this.crnExecuteIn(basDualCrnp, dualCrnThread); //  鍏ュ簱
-                    } else if (wrkMast.getIoType().equals(WrkIoType.OUT.id)) {
-                        this.crnExecuteOut(basDualCrnp, dualCrnThread); //  鍑哄簱
-                    }else {
-                        continue;
-                    }
-                }
-            }
-
-            // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
-            if (dualCrnProtocol.getLastIo().equals("I")) {
-                if (basDualCrnp.getInEnable().equals("Y")) {
-                    this.crnExecuteIn(basDualCrnp, dualCrnThread); //  鍏ュ簱
-                    dualCrnProtocol.setLastIo("O");
-                } else if (basDualCrnp.getOutEnable().equals("Y")) {
-                    this.crnExecuteOut(basDualCrnp, dualCrnThread); //  鍑哄簱
-                    dualCrnProtocol.setLastIo("I");
-                }
-            }
-            // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
-            else if (dualCrnProtocol.getLastIo().equals("O")) {
-                if (basDualCrnp.getOutEnable().equals("Y")) {
-                    this.crnExecuteOut(basDualCrnp, dualCrnThread); //  鍑哄簱
-                    dualCrnProtocol.setLastIo("I");
-                } else if (basDualCrnp.getInEnable().equals("Y")) {
-                    this.crnExecuteIn(basDualCrnp, dualCrnThread); //  鍏ュ簱
-                    dualCrnProtocol.setLastIo("O");
-                }
-            }
+            this.crnExecute(basDualCrnp, dualCrnThread);
         }
     }
 
-    private synchronized void crnExecuteIn(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
+    private synchronized void crnExecute(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
         DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
         if(dualCrnProtocol == null){
             return;
         }
 
+        List<WrkMast> allTaskList = new ArrayList<>();
+        List<WrkMast> inTaskList = getInTaskList(basDualCrnp);
+        List<WrkMast> outTaskList = getOutTaskList(basDualCrnp);
+        List<WrkMast> locMoveTaskList = getLocMoveTaskList(basDualCrnp);
+
+        if (!locMoveTaskList.isEmpty()) {
+            allTaskList.addAll(locMoveTaskList);
+        }
+
+        // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
+        if (dualCrnProtocol.getLastIo().equals("O")) {
+            allTaskList.addAll(inTaskList);
+            allTaskList.addAll(outTaskList);
+        }
+        // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
+        else if (dualCrnProtocol.getLastIo().equals("I")) {
+            allTaskList.addAll(outTaskList);
+            allTaskList.addAll(inTaskList);
+        }
+
+        for (WrkMast wrkMast : allTaskList) {
+            if (wrkMast.getIoType() == WrkIoType.IN.id) {
+                boolean result = this.crnExecuteIn(basDualCrnp, dualCrnThread, wrkMast);
+                if (result) {
+                    break;
+                }
+            } else if (wrkMast.getIoType() == WrkIoType.OUT.id) {
+                boolean result = this.crnExecuteOut(basDualCrnp, dualCrnThread, wrkMast);
+                if (result) {
+                    break;
+                }
+            } else if (wrkMast.getIoType() == WrkIoType.LOC_MOVE.id) {
+                boolean result = this.crnExecuteLocMove(basDualCrnp, dualCrnThread, wrkMast);
+                if (result) {
+                    break;
+                }
+            }
+        }
+    }
+
+    private List<WrkMast> getInTaskList(BasDualCrnp basDualCrnp) {
+        List<WrkMast> list = new ArrayList<>();
         if(!basDualCrnp.getInEnable().equals("Y")){
             News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍙叆淇″彿涓嶆弧瓒�", basDualCrnp.getCrnNo());
-            return;
+            return list;
         }
 
         List<StationObjModel> inStationList = basDualCrnp.getInStationList$();
         if(inStationList.isEmpty()){
             News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍏ュ簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
-            return;
-        }
-
-        Integer crnNo = basDualCrnp.getCrnNo();
-        int station = calcStation(dualCrnProtocol);
-        if(station == 0){
-            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鏃犲彲鐢ㄥ伐浣�", basDualCrnp.getCrnNo());
-            return;
+            return list;
         }
 
         for (StationObjModel stationObjModel : inStationList) {
@@ -190,19 +186,217 @@
             }
 
             if(wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts){
-                News.taskInfo(stationProtocol.getTaskNo(), "宸ヤ綔鍙�:{} 浠诲姟鐘舵�佸紓甯�", stationProtocol.getTaskNo());
+                continue;
+            }
+
+            list.add(wrkMast);
+        }
+
+        return list;
+    }
+
+    private List<WrkMast> getOutTaskList(BasDualCrnp basDualCrnp) {
+        List<WrkMast> list = new ArrayList<>();
+        if(!basDualCrnp.getOutEnable().equals("Y")){
+            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍙嚭淇″彿涓嶆弧瓒�", basDualCrnp.getCrnNo());
+            return list;
+        }
+
+        List<StationObjModel> outStationList = basDualCrnp.getOutStationList$();
+        if(outStationList.isEmpty()){
+            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍑哄簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
+            return list;
+        }
+
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                .eq("dual_crn_no", basDualCrnp.getCrnNo())
+                .eq("wrk_sts", WrkStsType.NEW_OUTBOUND.sts)
+        );
+        list.addAll(wrkMasts);
+        return list;
+    }
+
+    private List<WrkMast> getLocMoveTaskList(BasDualCrnp basDualCrnp) {
+        List<WrkMast> list = new ArrayList<>();
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                .eq("dual_crn_no", basDualCrnp.getCrnNo())
+                .eq("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts)
+        );
+        list.addAll(wrkMasts);
+        return list;
+    }
+
+    private synchronized boolean crnExecuteIn(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast) {
+        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
+        if (dualCrnProtocol == null) {
+            return false;
+        }
+
+        if (!basDualCrnp.getInEnable().equals("Y")) {
+            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍙叆淇″彿涓嶆弧瓒�", basDualCrnp.getCrnNo());
+            return false;
+        }
+
+        List<StationObjModel> inStationList = basDualCrnp.getInStationList$();
+        if(inStationList.isEmpty()){
+            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍏ュ簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
+            return false;
+        }
+
+        Integer crnNo = basDualCrnp.getCrnNo();
+        int station = calcStation(dualCrnProtocol, "in");
+        if (station == 0) {
+            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鏃犲彲鐢ㄥ伐浣�", basDualCrnp.getCrnNo());
+            return false;
+        }
+
+        if (wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts) {
+            return false;
+        }
+
+        // 鑾峰彇搴撲綅淇℃伅
+        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+        if (locMast == null) {
+            News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
+            return false;
+        }
+
+        if (!locMast.getLocSts().equals("S")) {
+            News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 鐘舵�佸紓甯�", wrkMast.getLocNo());
+            return false;
+        }
+
+        //妫�娴嬫祬搴撲綅鐘舵��
+        boolean checkStatus = checkShallowLocStatus(locMast.getLocNo(), wrkMast.getWrkNo());
+        if (!checkStatus) {
+            News.taskInfo(wrkMast.getWrkNo(), "鍥犳祬搴撲綅鍫靛鏃犳硶鎵ц");
+            return false;
+        }
+
+        StationObjModel inStationObjModel = null;
+        for (StationObjModel stationObjModel : inStationList) {
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
+            if (stationThread == null) {
+                continue;
+            }
+
+            Map<Integer, StationProtocol> stationProtocolMap = stationThread.getStatusMap();
+            StationProtocol stationProtocol = stationProtocolMap.get(stationObjModel.getStationId());
+            if (stationProtocol == null) {
+                continue;
+            }
+
+            if (!stationProtocol.isAutoing()) {
+                continue;
+            }
+
+            if (!stationProtocol.isLoading()) {
+                continue;
+            }
+
+            if (stationProtocol.getTaskNo() <= 0) {
+                continue;
+            }
+
+            if (!stationProtocol.isInEnable()) {
+                News.taskInfo(stationProtocol.getTaskNo(), "鍙栬揣绔欑偣:{} 娌℃湁鍙叆淇″彿", stationObjModel.getStationId());
+                continue;
+            }
+
+            if (stationProtocol.getTaskNo().equals(wrkMast.getWrkNo())) {
+                inStationObjModel = stationObjModel;
+                break;
+            }
+        }
+
+        if (inStationObjModel == null) {
+            News.taskInfo(wrkMast.getWrkNo(), "鏈悳绱㈠埌鍙栬揣绔欑偣");
+            return false;
+        }
+
+        String sourceLocNo = Utils.getLocNo(inStationObjModel.getDeviceRow(), inStationObjModel.getDeviceBay(), inStationObjModel.getDeviceLev());
+
+        List<DualCrnCommand> commandList = new ArrayList<>();
+        DualCrnCommand pickCommand = dualCrnThread.getPickCommand(sourceLocNo, wrkMast.getWrkNo(), crnNo, station);
+        DualCrnCommand putCommand = dualCrnThread.getPutCommand(wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo, station);
+        commandList.add(pickCommand);
+        commandList.add(putCommand);
+
+        wrkMast.setWrkSts(WrkStsType.INBOUND_RUN.sts);
+        wrkMast.setDualCrnNo(crnNo);
+        wrkMast.setSystemMsg("");
+        wrkMast.setIoTime(new Date());
+        if (wrkMastService.updateById(wrkMast)) {
+            MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, commandList));
+            News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂鎴愬姛锛屽爢鍨涙満鍙�={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(commandList));
+            dualCrnProtocol.setLastIo("I");
+            return true;
+        }
+        return false;
+    }
+
+    private synchronized boolean crnExecuteOut(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast) {
+        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
+        if (dualCrnProtocol == null) {
+            return false;
+        }
+
+        if (!basDualCrnp.getOutEnable().equals("Y")) {
+            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍙嚭淇″彿涓嶆弧瓒�", basDualCrnp.getCrnNo());
+            return false;
+        }
+
+        List<StationObjModel> outStationList = basDualCrnp.getOutStationList$();
+        if (outStationList.isEmpty()) {
+            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍑哄簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
+            return false;
+        }
+
+        Integer crnNo = basDualCrnp.getCrnNo();
+        int station = calcStation(dualCrnProtocol, "out");
+        if (station == 0) {
+            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鏃犲彲鐢ㄥ伐浣�", basDualCrnp.getCrnNo());
+            return false;
+        }
+
+        for (StationObjModel stationObjModel : outStationList) {
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
+            if (stationThread == null) {
+                continue;
+            }
+
+            Map<Integer, StationProtocol> stationProtocolMap = stationThread.getStatusMap();
+            StationProtocol stationProtocol = stationProtocolMap.get(stationObjModel.getStationId());
+            if (stationProtocol == null) {
+                continue;
+            }
+
+            if (!stationProtocol.isAutoing()) {
+                continue;
+            }
+
+            if (stationProtocol.isLoading()) {
+                continue;
+            }
+
+            if (stationProtocol.getTaskNo() != 0) {
+                continue;
+            }
+
+            if (!stationProtocol.isOutEnable()) {
+                News.info("鏀捐揣绔欑偣:{} 娌℃湁鍙嚭淇″彿", stationObjModel.getStationId());
                 continue;
             }
 
             // 鑾峰彇搴撲綅淇℃伅
-            LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+            LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
             if (locMast == null) {
-                News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
+                News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
                 continue;
             }
 
-            if (!locMast.getLocSts().equals("S")) {
-                News.taskInfo(wrkMast.getWrkNo(), "鐩爣搴撲綅:{} 鐘舵�佸紓甯�", wrkMast.getLocNo());
+            if (!locMast.getLocSts().equals("R")) {
+                News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 鐘舵�佸紓甯�", wrkMast.getSourceLocNo());
                 continue;
             }
 
@@ -213,124 +407,96 @@
                 continue;
             }
 
-            String sourceLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev());
+            String targetLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev());
 
             List<DualCrnCommand> commandList = new ArrayList<>();
-            DualCrnCommand pickCommand = dualCrnThread.getPickCommand(sourceLocNo, wrkMast.getWrkNo(), crnNo, station);
-            DualCrnCommand putCommand = dualCrnThread.getPutCommand(wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo, station);
+            DualCrnCommand pickCommand = dualCrnThread.getPickCommand(wrkMast.getSourceLocNo(), wrkMast.getWrkNo(), crnNo, station);
+            DualCrnCommand putCommand = dualCrnThread.getPutCommand(targetLocNo, wrkMast.getWrkNo(), crnNo, station);
             commandList.add(pickCommand);
             commandList.add(putCommand);
 
-            wrkMast.setWrkSts(WrkStsType.INBOUND_RUN.sts);
+            wrkMast.setWrkSts(WrkStsType.OUTBOUND_RUN.sts);
             wrkMast.setDualCrnNo(crnNo);
             wrkMast.setSystemMsg("");
             wrkMast.setIoTime(new Date());
             if (wrkMastService.updateById(wrkMast)) {
                 MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, commandList));
                 News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂鎴愬姛锛屽爢鍨涙満鍙�={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(commandList));
+                dualCrnProtocol.setLastIo("O");
+
+                redisUtil.set(RedisKeyType.DUAL_CRN_OUT_TASK_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(stationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24);
+                return true;
             }
         }
+        return false;
     }
 
-    private synchronized void crnExecuteOut(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
+    private synchronized boolean crnExecuteLocMove(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast) {
         DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
-        if(dualCrnProtocol == null){
-            return;
-        }
-
-        if(!basDualCrnp.getOutEnable().equals("Y")){
-            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍙嚭淇″彿涓嶆弧瓒�", basDualCrnp.getCrnNo());
-            return;
-        }
-
-        List<StationObjModel> outStationList = basDualCrnp.getOutStationList$();
-        if(outStationList.isEmpty()){
-            News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍑哄簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
-            return;
+        if (dualCrnProtocol == null) {
+            return false;
         }
 
         Integer crnNo = basDualCrnp.getCrnNo();
-        int station = calcStation(dualCrnProtocol);
-        if(station == 0){
+        int station = calcStation(dualCrnProtocol, "locMove");
+        if (station == 0) {
             News.info("鍙屽伐浣嶅爢鍨涙満:{} 鏃犲彲鐢ㄥ伐浣�", basDualCrnp.getCrnNo());
-            return;
+            return false;
         }
 
         List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                 .eq("crn_no", crnNo)
-                .eq("wrk_sts", WrkStsType.NEW_OUTBOUND.sts)
+                .eq("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts)
         );
 
-        for (WrkMast wrkMast : wrkMasts) {
-            for (StationObjModel stationObjModel : outStationList) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                Map<Integer, StationProtocol> stationProtocolMap = stationThread.getStatusMap();
-                StationProtocol stationProtocol = stationProtocolMap.get(stationObjModel.getStationId());
-                if (stationProtocol == null) {
-                    continue;
-                }
-
-                if (!stationProtocol.isAutoing()) {
-                    continue;
-                }
-
-                if (stationProtocol.isLoading()) {
-                    continue;
-                }
-
-                if (stationProtocol.getTaskNo() != 0) {
-                    continue;
-                }
-
-                if (!stationProtocol.isOutEnable()) {
-                    News.info("鏀捐揣绔欑偣:{} 娌℃湁鍙嚭淇″彿", stationObjModel.getStationId());
-                    continue;
-                }
-
-                // 鑾峰彇搴撲綅淇℃伅
-                LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
-                if (locMast == null) {
-                    News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
-                    continue;
-                }
-
-                if (!locMast.getLocSts().equals("R")) {
-                    News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 鐘舵�佸紓甯�", wrkMast.getSourceLocNo());
-                    continue;
-                }
-
-                //妫�娴嬫祬搴撲綅鐘舵��
-                boolean checkStatus = checkShallowLocStatus(locMast.getLocNo(), wrkMast.getWrkNo());
-                if (!checkStatus) {
-                    News.taskInfo(wrkMast.getWrkNo(), "鍥犳祬搴撲綅鍫靛鏃犳硶鎵ц");
-                    continue;
-                }
-
-                String targetLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev());
-
-                List<DualCrnCommand> commandList = new ArrayList<>();
-                DualCrnCommand pickCommand = dualCrnThread.getPickCommand(wrkMast.getSourceLocNo(), wrkMast.getWrkNo(), crnNo, station);
-                DualCrnCommand putCommand = dualCrnThread.getPutCommand(targetLocNo, wrkMast.getWrkNo(), crnNo, station);
-                commandList.add(pickCommand);
-                commandList.add(putCommand);
-
-                wrkMast.setWrkSts(WrkStsType.OUTBOUND_RUN.sts);
-                wrkMast.setDualCrnNo(crnNo);
-                wrkMast.setSystemMsg("");
-                wrkMast.setIoTime(new Date());
-                if (wrkMastService.updateById(wrkMast)) {
-                    MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, commandList));
-                    //鍙栬揣鍚庣瓑寰呬笅涓�涓换鍔℃椂闀�
-                    redisUtil.set(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnNo, "wait", 5);
-                    News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂鎴愬姛锛屽爢鍨涙満鍙�={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(commandList));
-                    return;
-                }
-            }
+        // 鑾峰彇婧愬簱浣嶄俊鎭�
+        LocMast sourceLocMast = locMastService.selectById(wrkMast.getSourceLocNo());
+        if (sourceLocMast == null) {
+            News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getSourceLocNo());
+            return false;
         }
+
+        if(!sourceLocMast.getLocSts().equals("R")){
+            News.taskInfo(wrkMast.getWrkNo(), "婧愬簱浣�:{} 鐘舵�佸紓甯革紝涓嶅睘浜庡嚭搴撻绾︾姸鎬�", wrkMast.getSourceLocNo());
+            return false;
+        }
+
+        // 鑾峰彇搴撲綅淇℃伅
+        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+        if (locMast == null) {
+            News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 淇℃伅涓嶅瓨鍦�", wrkMast.getLocNo());
+            return false;
+        }
+
+        if (!locMast.getLocSts().equals("S")) {
+            News.taskInfo(wrkMast.getWrkNo(), "搴撲綅:{} 鐘舵�佸紓甯革紝涓嶅睘浜庡叆搴撻绾︾姸鎬�", wrkMast.getLocNo());
+            return false;
+        }
+
+        //妫�娴嬫祬搴撲綅鐘舵��
+        boolean checkStatus = checkShallowLocStatus(locMast.getLocNo(), wrkMast.getWrkNo());
+        if (!checkStatus) {
+            News.taskInfo(wrkMast.getWrkNo(), "鍥犳祬搴撲綅鍫靛鏃犳硶鎵ц");
+            return false;
+        }
+
+        List<DualCrnCommand> commandList = new ArrayList<>();
+        DualCrnCommand pickCommand = dualCrnThread.getPickCommand(wrkMast.getSourceLocNo(), wrkMast.getWrkNo(), crnNo, station);
+        DualCrnCommand putCommand = dualCrnThread.getPutCommand(wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo, station);
+        commandList.add(pickCommand);
+        commandList.add(putCommand);
+
+        wrkMast.setWrkSts(WrkStsType.LOC_MOVE_RUN.sts);
+        wrkMast.setDualCrnNo(crnNo);
+        wrkMast.setSystemMsg("");
+        wrkMast.setIoTime(new Date());
+        if (wrkMastService.updateById(wrkMast)) {
+            MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, commandList));
+            News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂鎴愬姛锛屽爢鍨涙満鍙�={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(commandList));
+            dualCrnProtocol.setLastIo("I");
+            return true;
+        }
+        return false;
     }
 
     //鍙屽伐浣嶅爢鍨涙満浠诲姟鎵ц瀹屾垚
@@ -357,12 +523,10 @@
 
             if(dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getStatus() == DualCrnStatusType.WAITING.id) {
                 executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNo(), 1);
-                continue;
             }
 
             if(dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getStatusTwo() == DualCrnStatusType.WAITING.id) {
                 executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNoTwo(), 2);
-                continue;
             }
         }
     }
@@ -395,6 +559,30 @@
                 updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
             } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts) {
                 updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
+
+                if(mainProcessPlugin.contains("Fake")) {
+                    //鐢熸垚浠跨湡绔欑偣鏁版嵁
+                    List<StationObjModel> outStationList = basDualCrnp.getOutStationList$();
+                    if(outStationList.isEmpty()){
+                        News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍑哄簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
+                        return;
+                    }
+
+                    for (StationObjModel stationObjModel : outStationList) {
+                        if (!stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) {
+                            continue;
+                        }
+
+                        StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
+                        if (stationThread == null) {
+                            continue;
+                        }
+                        //鐢熸垚浠跨湡绔欑偣鏁版嵁
+                        StationCommand command = stationThread.getMoveCommand(9998, wrkMast.getSourceStaNo(), 0, 0);
+                        MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
+                    }
+                }
+
             } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts) {
                 updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
             } else {
@@ -402,16 +590,24 @@
                 return;
             }
 
-            wrkMast.setWrkSts(updateWrkSts);
-            wrkMast.setSystemMsg("");
-            wrkMast.setIoTime(new Date());
-            if (wrkMastService.updateById(wrkMast)) {
-                DualCrnCommand resetCommand = dualCrnThread.getResetCommand(dualCrnProtocol.getCrnNo(), station);
-                MessageQueue.offer(SlaveType.DualCrn, dualCrnProtocol.getCrnNo(), new Task(3, resetCommand));
-                News.info("鍙屽伐浣嶅爢鍨涙満浠诲姟鐘舵�佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basDualCrnp.getCrnNo(), taskNo);
+            DualCrnCommand resetCommand = dualCrnThread.getResetCommand(dualCrnProtocol.getCrnNo(), station);
+            boolean offer = MessageQueue.offer(SlaveType.DualCrn, dualCrnProtocol.getCrnNo(), new Task(3, resetCommand));
+            if (offer) {
+                wrkMast.setWrkSts(updateWrkSts);
+                wrkMast.setSystemMsg("");
+                wrkMast.setIoTime(new Date());
+                if (wrkMastService.updateById(wrkMast)) {
+                    News.info("鍙屽伐浣嶅爢鍨涙満浠诲姟鐘舵�佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basDualCrnp.getCrnNo(), taskNo);
+                }
+                redisUtil.set(RedisKeyType.DUAL_CRN_IO_EXECUTE_FINISH_LIMIT.key + basDualCrnp.getCrnNo() + "_" + taskNo, "lock", 10);
             }
-            redisUtil.set(RedisKeyType.DUAL_CRN_IO_EXECUTE_FINISH_LIMIT.key + basDualCrnp.getCrnNo() + "_" + taskNo, "lock", 10);
         }else {
+            DualCrnCommand command = commandList.get(idx - 1);
+            if (command.getTaskMode() == DualCrnTaskModeType.PICK.id.shortValue()) {
+                //鍙栬揣鍚庣瓑寰呬笅涓�涓换鍔℃椂闀�
+                redisUtil.set(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + basDualCrnp.getCrnNo(), "wait", 10);
+            }
+
             DualCrnCommand resetCommand = dualCrnThread.getResetCommand(dualCrnProtocol.getCrnNo(), station);
             MessageQueue.offer(SlaveType.DualCrn, dualCrnProtocol.getCrnNo(), new Task(3, resetCommand));
             News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护瀹屾垚纭鎴愬姛锛屽爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basDualCrnp.getCrnNo(), taskNo);
@@ -481,15 +677,72 @@
         return false;
     }
 
-    private int calcStation(DualCrnProtocol dualCrnProtocol) {
-        int station = 0;
-        if(dualCrnProtocol.getTaskNo() == 0){
-            station = 1;
-        }else if (dualCrnProtocol.getTaskNoTwo() == 0){
-            station = 2;
+    private int calcStation(DualCrnProtocol dualCrnProtocol, String type) {
+        List<Integer> idleStationList = new ArrayList<>();
+
+        if (dualCrnProtocol.getTaskNo() == 0
+                && dualCrnProtocol.getLoaded() == 0
+                && dualCrnProtocol.getStatusType().equals(DualCrnStatusType.IDLE)
+        ) {
+            idleStationList.add(1);
         }
 
-        return station;
+        if (dualCrnProtocol.getTaskNoTwo() == 0
+                && dualCrnProtocol.getLoadedTwo() == 0
+                && dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.IDLE)
+        ) {
+            idleStationList.add(2);
+        }
+
+        if (type.equals("locMove")) {
+            if (idleStationList.size() != 2) {
+                return 0;
+            }
+            return idleStationList.get(0);
+        }
+
+        if (idleStationList.size() == 2) {
+            return idleStationList.get(0);
+        }
+
+        Integer idleStation = idleStationList.get(0);
+        int workingStation = idleStation == 1 ? 2 : 1;
+
+        int executeTaskNo = 0;
+        if (workingStation == 1) {
+            executeTaskNo = dualCrnProtocol.getTaskNo();
+            //妫�娴嬪伐浣嶅凡杩涘叆鏀捐揣闃舵锛屾斁璐ч樁娈典笉鎺ユ柊浠诲姟
+            if (dualCrnProtocol.getStatusType().equals(DualCrnStatusType.PUT_MOVING)
+                    || dualCrnProtocol.getStatusType().equals(DualCrnStatusType.PUTTING)
+                    || dualCrnProtocol.getStatusType().equals(DualCrnStatusType.WAITING)
+            ) {
+                return 0;
+            }
+        } else {
+            executeTaskNo = dualCrnProtocol.getTaskNoTwo();
+            //妫�娴嬪伐浣嶅凡杩涘叆鏀捐揣闃舵锛屾斁璐ч樁娈典笉鎺ユ柊浠诲姟
+            if (dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.PUT_MOVING)
+                    || dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.PUTTING)
+                    || dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.WAITING)
+            ) {
+                return 0;
+            }
+        }
+
+        if (executeTaskNo == 0) {
+            return 0;
+        }
+
+        WrkMast wrkMast = wrkMastService.selectByWorkNo(executeTaskNo);
+        if (wrkMast.getIoType().equals(WrkIoType.IN.id) && type.equals("in")) {
+            return idleStation;
+        }
+
+        if (wrkMast.getIoType().equals(WrkIoType.OUT.id) && type.equals("out")) {
+            return idleStation;
+        }
+
+        return 0;
     }
 
 }
diff --git a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
index c3c8516..39c4396 100644
--- a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
@@ -38,6 +38,8 @@
     @Autowired
     private BasCrnpService basCrnpService;
     @Autowired
+    private BasDualCrnpService basDualCrnpService;
+    @Autowired
     private RedisUtil redisUtil;
     @Autowired
     private LocMastService locMastService;
@@ -130,15 +132,24 @@
     public synchronized void stationOutExecute() {
         List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", WrkStsType.OUTBOUND_RUN_COMPLETE.sts));
         for (WrkMast wrkMast : wrkMasts) {
+            List<StationObjModel> outStationList = new ArrayList<>();
+
             BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", wrkMast.getCrnNo()));
-            if (basCrnp == null) {
-                continue;
+            if (basCrnp != null) {
+                outStationList = basCrnp.getOutStationList$();
+                if(outStationList.isEmpty()){
+                    News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
+                    continue;
+                }
             }
 
-            List<StationObjModel> outStationList = basCrnp.getOutStationList$();
-            if(outStationList.isEmpty()){
-                News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
-                continue;
+            BasDualCrnp basDualCrnp = basDualCrnpService.selectOne(new EntityWrapper<BasDualCrnp>().eq("crn_no", wrkMast.getDualCrnNo()));
+            if (basDualCrnp != null) {
+                outStationList = basDualCrnp.getOutStationList$();
+                if(outStationList.isEmpty()){
+                    News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍑哄簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
+                    continue;
+                }
             }
 
             for (StationObjModel stationObjModel : outStationList) {
@@ -176,6 +187,7 @@
                         MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command));
                         News.info("杈撻�佺珯鐐瑰嚭搴撳懡浠や笅鍙戞垚鍔燂紝绔欑偣鍙�={}锛屽伐浣滃彿={}锛屽懡浠ゆ暟鎹�={}", stationProtocol.getStationId(), wrkMast.getWrkNo(), JSON.toJSONString(command));
                         redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_LIMIT.key + stationProtocol.getStationId(), "lock", 5);
+                        redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_COMPLETE_LIMIT.key + wrkMast.getWrkNo(), "lock", 60 * 5);
                     }
                 }
             }
@@ -188,6 +200,11 @@
         for (WrkMast wrkMast : wrkMasts) {
             Integer wrkNo = wrkMast.getWrkNo();
 
+            Object lock = redisUtil.get(RedisKeyType.STATION_OUT_EXECUTE_COMPLETE_LIMIT.key + wrkNo);
+            if (lock != null) {
+                continue;
+            }
+
             boolean complete = true;
             List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
             for (BasDevp basDevp : basDevps) {
diff --git "a/src/main/resources/docs/WCS\345\244\226\351\203\250HTTP API\346\216\245\345\217\243V1.2.docx" "b/src/main/resources/docs/WCS\345\244\226\351\203\250HTTP API\346\216\245\345\217\243V1.2.docx"
new file mode 100644
index 0000000..21bc048
--- /dev/null
+++ "b/src/main/resources/docs/WCS\345\244\226\351\203\250HTTP API\346\216\245\345\217\243V1.2.docx"
Binary files differ
diff --git a/src/main/webapp/components/WatchDualCrnCard.js b/src/main/webapp/components/WatchDualCrnCard.js
index b047a24..4191450 100644
--- a/src/main/webapp/components/WatchDualCrnCard.js
+++ b/src/main/webapp/components/WatchDualCrnCard.js
@@ -53,18 +53,14 @@
                 <el-descriptions-item label="宸ヤ綅2鐘舵��">{{ item.statusTwo }}</el-descriptions-item>
                 <el-descriptions-item label="宸ヤ綅1鏄惁鏈夌墿">{{ item.loading }}</el-descriptions-item>
                 <el-descriptions-item label="宸ヤ綅2鏄惁鏈夌墿">{{ item.loadingTwo }}</el-descriptions-item>
-                <el-descriptions-item label="宸ヤ綅1鍒�">{{ item.bay }}</el-descriptions-item>
-                <el-descriptions-item label="宸ヤ綅2鍒�">{{ item.bayTwo }}</el-descriptions-item>
-                <el-descriptions-item label="宸ヤ綅1灞�">{{ item.lev }}</el-descriptions-item>
-                <el-descriptions-item label="宸ヤ綅2灞�">{{ item.levTwo }}</el-descriptions-item>
                 <el-descriptions-item label="宸ヤ綅1璐у弶瀹氫綅">{{ item.forkOffset }}</el-descriptions-item>
                 <el-descriptions-item label="宸ヤ綅2璐у弶瀹氫綅">{{ item.forkOffsetTwo }}</el-descriptions-item>
-                <el-descriptions-item label="宸ヤ綅1杞借揣鍙板畾浣�">{{ item.liftPos }}</el-descriptions-item>
-                <el-descriptions-item label="宸ヤ綅2杞借揣鍙板畾浣�">{{ item.liftPosTwo }}</el-descriptions-item>
-                <el-descriptions-item label="宸ヤ綅1璧拌鍦ㄥ畾浣�">{{ item.walkPos }}</el-descriptions-item>
-                <el-descriptions-item label="宸ヤ綅2璧拌鍦ㄥ畾浣�">{{ item.walkPosTwo }}</el-descriptions-item>
                 <el-descriptions-item label="宸ヤ綅1浠诲姟鎺ユ敹">{{ item.taskReceive }}</el-descriptions-item>
                 <el-descriptions-item label="宸ヤ綅2浠诲姟鎺ユ敹">{{ item.taskReceiveTwo }}</el-descriptions-item>
+                <el-descriptions-item label="鍒�">{{ item.bay }}</el-descriptions-item>
+                <el-descriptions-item label="灞�">{{ item.lev }}</el-descriptions-item>
+                <el-descriptions-item label="杞借揣鍙板畾浣�">{{ item.liftPos }}</el-descriptions-item>
+                <el-descriptions-item label="璧拌鍦ㄥ畾浣�">{{ item.walkPos }}</el-descriptions-item>
                 <el-descriptions-item label="璧拌閫熷害锛坢/min)">{{ item.xspeed }}</el-descriptions-item>
                 <el-descriptions-item label="鍗囬檷閫熷害锛坢/min)">{{ item.yspeed }}</el-descriptions-item>
                 <el-descriptions-item label="鍙夌墮閫熷害锛坢/min)">{{ item.zspeed }}</el-descriptions-item>
diff --git a/src/main/webapp/views/locMap/locMap.html b/src/main/webapp/views/locMap/locMap.html
index 2fcfd1d..5d34f56 100644
--- a/src/main/webapp/views/locMap/locMap.html
+++ b/src/main/webapp/views/locMap/locMap.html
@@ -69,21 +69,6 @@
   </el-drawer>
 
   <el-drawer
-          title="灏忚溅淇℃伅"
-          :visible.sync="drawerShuttle"
-          :with-header="true"
-          :modal="false"
-  >
-    <div v-if="drawerShuttleData!=null">
-      <div style="margin: 10px;">
-        <div style="margin-top: 5px;">灏忚溅锛歿{drawerShuttleData.shuttleNo}}</div>
-        <div style="margin-top: 5px;">宸ヤ綔鍙凤細{{drawerShuttleData.wrkNo}}</div>
-        <div style="margin-top: 5px;">鐘舵�侊細{{drawerShuttleData}}</div>
-      </div>
-    </div>
-  </el-drawer>
-
-  <el-drawer
           title="绔欑偣淇℃伅"
           :visible.sync="drawerSta"
           :with-header="true"
@@ -108,35 +93,14 @@
     </div>
   </el-drawer>
 
-  <el-drawer
-          title="鎻愬崌鏈轰俊鎭�"
-          :visible.sync="drawerLift"
-          :with-header="true"
-          :modal="false"
-  >
-    <div v-if="drawerLiftData!=null">
-      <div style="margin: 10px;">
-        <div style="margin-top: 5px;">鎻愬崌鏈猴細{{liftList[drawerLiftData-1].liftNo}}</div>
-        <div style="margin-top: 5px;">宸ヤ綔鍙凤細{{liftList[drawerLiftData-1].taskNo}}</div>
-        <div style="margin-top: 5px;">鐘舵�侊細{{liftList[drawerLiftData-1]}}</div>
-      </div>
-    </div>
-  </el-drawer>
-
 </div>
 <script>
   let width = 25;
   let height = 25;
   let pixiApp;
   let pixiStageList = [];
-  let pixiShuttleMap = new Map();
-  let pixiShuttleMoveAdvancePathMap = new Map();
-  let pixiShuttleMoveAdvancePathList = [];
-  let pixiShuttleLockPathMap = new Map();
   let pixiStaMap = new Map();
   let objectsContainer;
-  let objectsContainer2;
-  let objectsContainer3;
   let graphics0;
   let graphics3;
   let graphics4;
@@ -152,23 +116,15 @@
       map: [],
       currentLev: 1,
       floorList: [], //褰撳墠椤圭洰妤煎眰
-      currentLevShuttleList: [],//褰撳墠妤煎眰鍥涘悜绌挎杞﹂泦鍚�
-      shuttleColorList: [],//鍥涘悜绌挎杞﹂鑹查泦鍚�
       drawer: false,
       drawerLocNo: false,
       drawerLocNoData: null,
       drawerLocDetls: [],
       reloadMap: true,
       mapFps: 0,
-      drawerShuttle: false,
-      drawerShuttleData: null,
       currentLevStaList: [],//褰撳墠妤煎眰绔欑偣list
-      reloadSta: true,
       drawerSta: false,
       drawerStaData: null,
-      drawerLift: false,
-      drawerLiftData: null,
-      liftList: [],
     },
     mounted() {
       this.init()
@@ -205,14 +161,6 @@
         setTimeout(() => {
           that.getMap(this.currentLev)
         }, 1000);
-
-        // this.consoleInterval = setInterval(() => {
-        //   this.getMap(this.currentLev) //鑾峰彇瀹炴椂鍦板浘鏁版嵁
-        //   this.getShuttleStateInfo() //鑾峰彇鍥涘悜绌挎杞︿俊鎭�
-        //   this.getLiftStateInfo() //鑾峰彇鎻愬崌鏈轰俊鎭�
-        //   this.getSiteInfo() //鑾峰彇杈撻�佺珯鐐规暟鎹�
-        //   // this.getCodeData()//鑾峰彇鏉$爜
-        // }, 1000)
 
       },
       initLev(){
@@ -257,19 +205,8 @@
       },
       changeFloor(lev) {
         this.currentLev = lev
-        this.currentLevShuttleList = []
         this.reloadMap = true
-        this.reloadSta = true
         this.getMap(lev)
-
-        //娓呯┖鍗犵敤璺緞
-        objectsContainer3.removeChildren();
-        pixiShuttleLockPathMap = new Map();
-
-        //娓呯┖棰勮璺緞
-        objectsContainer2.removeChildren();
-        pixiShuttleMoveAdvancePathMap = new Map();
-        pixiShuttleMoveAdvancePathList = []
       },
       createMap(){
         //Create a Pixi Application
@@ -281,9 +218,6 @@
         });
         //Add the canvas that Pixi automatically created for you to the HTML document
         $("#pixiView").append(pixiApp.view)
-
-        //鍔犺浇灏忚溅璧勬簮
-        pixiApp.loader.add('shuttle', '../static/images/sxcar.png');
 
         // 浠嶨raphics瀵硅薄鍒涘缓涓�涓汗鐞�
 		    graphicsF = pixiApp.renderer.generateTexture(getContainer(1000));
@@ -298,10 +232,6 @@
         // 鍒涘缓涓�涓鍣ㄦ潵绠$悊澶ф壒閲忕殑鏄剧ず瀵硅薄
         objectsContainer = new PIXI.Container();
         pixiApp.stage.addChild(objectsContainer);
-
-        // 鍒涘缓涓�涓鍣ㄦ潵绠$悊澶ф壒閲忕殑鏄剧ず瀵硅薄
-        objectsContainer2 = new PIXI.Container();
-        pixiApp.stage.addChild(objectsContainer2);
 
         // 鍒涘缓涓�涓鍣ㄦ潵绠$悊澶ф壒閲忕殑鏄剧ず瀵硅薄
         objectsContainer3 = new PIXI.Container();
@@ -370,13 +300,24 @@
         //*******************缂╂斁鐢诲竷*******************
 
         //*******************FPS*******************
-        var g_Time=0;
+        let g_Time = 0;
+        let fpsLastUpdateTs = 0;
+        let fpsDeltaSumMs = 0;
+        let fpsFrameCount = 0;
+        const fpsUpdateInterval = 200;
         pixiApp.ticker.add((delta) => {
-          var timeNow = (new Date()).getTime();
-          var timeDiff = timeNow - g_Time;
+          const timeNow = (new Date()).getTime();
+          const timeDiff = timeNow - g_Time;
           g_Time = timeNow;
-          var fps = 1000 / timeDiff;
-          this.mapFps = parseInt(fps)
+          fpsDeltaSumMs += timeDiff;
+          fpsFrameCount += 1;
+          if (timeNow - fpsLastUpdateTs >= fpsUpdateInterval) {
+            const avgFps = fpsDeltaSumMs > 0 ? (fpsFrameCount * 1000 / fpsDeltaSumMs) : 0;
+            this.mapFps = Math.round(avgFps);
+            fpsDeltaSumMs = 0;
+            fpsFrameCount = 0;
+            fpsLastUpdateTs = timeNow;
+          }
         });
         //*******************FPS*******************
 
@@ -399,10 +340,7 @@
                 if (val.value == 4) {
                   //绔欑偣
                   this.openDrawerSta(val)
-                } else if (val.value == 67) {
-                  //鎻愬崌鏈�
-                  this.openDrawerLift(val)
-                } else {
+                }else {
                   //搴撲綅
                   this.rightEvent(index, idx, e);
                   updateColor(sprite, 0x9900ff);
@@ -450,11 +388,10 @@
           });
 
           const b1 = objectsContainer.getLocalBounds();
-          const b2 = objectsContainer2.getLocalBounds();
-          const minX = Math.min(b1.x, b2.x);
-          const minY = Math.min(b1.y, b2.y);
-          const maxX = Math.max(b1.x + b1.width, b2.x + b2.width);
-          const maxY = Math.max(b1.y + b1.height, b2.y + b2.height);
+          const minX = Math.min(b1.x);
+          const minY = Math.min(b1.y);
+          const maxX = Math.max(b1.x + b1.width);
+          const maxY = Math.max(b1.y + b1.height);
           const contentW = Math.max(0, maxX - minX);
           const contentH = Math.max(0, maxY - minY);
           const vw = pixiApp.view.width;
@@ -464,141 +401,13 @@
           const posX = (vw - contentW * scale) / 2 - minX * scale;
           const posY = (vh - contentH * scale) / 2 - minY * scale;
           pixiApp.stage.setTransform(posX, posY, scale, scale, 0, 0, 0, 0, 0);
-        }else {
-          let diff = this.findDiffList(this.map, map);
-          diff.forEach((item, index) => {
-            //鑾峰彇old鍏冪礌
-            let oldSprite = pixiStageList[item.x][item.y]
-            if (item.originData == -999) {
-              //绉婚櫎old璺緞鍏冪礌
-              objectsContainer3.removeChild(oldSprite);
-            }else {
-              //绉婚櫎old鍏冪礌
-              objectsContainer.removeChild(oldSprite);
-            }
-
-            let sprite = getSprite(item.data, item.y * width, item.x * height, item, (e) => {
-              this.rightEvent(item.x, item.y, e);
-              updateColor(sprite, 0x9900ff);
-            });
-
-            if (item.data == -999) {
-              //娣诲姞璺緞鍏冪礌
-              objectsContainer3.addChild(sprite);
-            }else {
-              //娣诲姞鍏冪礌
-              objectsContainer.addChild(sprite);
-            }
-
-            //淇濆瓨鏂板厓绱�
-            pixiStageList[item.x][item.y] = sprite
-          });
         }
-
         this.map = map;
       },
       rightEvent(x, y, e) {
         this.drawerLocNo = true
         this.drawerLocNoData =  {x:x, y: y, z: this.currentLev, locNo: this.map[x][y].locNo,
             locSts: this.map[x][y].locSts,row:this.map[x][y].row, bay: this.map[x][y].bay, lev: this.currentLev};
-      },
-      findDiffList(arr1, arr2) {
-        let diff = []
-        arr1.forEach((item,index) => {
-          item.forEach((val,idx) => {
-            if(val.value != arr2[index][idx].value){
-              diff.push({
-                x: index,
-                y: idx,
-                data: arr2[index][idx].value,
-                originData: val.value,
-                locSts: val.locSts
-              })
-            }
-          })
-        })
-
-        return diff;
-      },
-      findShuttleDiffList(list1, list2) {
-        //妫�娴嬮泦鍚�1閲岄潰鐨勫皬杞︽槸鍚﹀湪闆嗗悎2涓湁鍙樺姩
-        if (list1.length == 0) {
-          return false;//闆嗗悎涓虹┖
-        }
-        if (list1.length != list2.length) {
-          return false;//涓や釜闆嗗悎闀垮害涓嶄竴鑷�
-        }
-
-        let flag = false;
-        list1.forEach((item,index) => {
-          for (var i = 0; i < list2.length; i++) {
-            if (item.shuttleNo == list2[i].shuttleNo) {
-              flag = true;
-              break;
-            }
-          }
-        });
-
-        return flag;
-      },
-      findShuttlePathDiffList(list1, list2) {
-        //妫�娴嬮泦鍚�1閲岄潰鐨勫皬杞﹂璁¤矾寰勬槸鍚﹀湪闆嗗悎2涓湁鍙樺姩
-        if (list1.length == 0) {
-          return false;//闆嗗悎涓虹┖
-        }
-        if (list1.length != list2.length) {
-          return false;//涓や釜闆嗗悎闀垮害涓嶄竴鑷�
-        }
-
-        for (var index = 0; index < list1.length; index++) {
-          let item = list1[index];
-          for (var i = 0; i < list2.length; i++) {
-            if (item.shuttleNo != list2[i].shuttleNo) {
-              continue;//鎵句笉鍒板皬杞﹀彿
-            }
-
-            if (item.moveAdvancePath == null) {
-              item.moveAdvancePath = [];
-            }
-
-            if (list2[i].moveAdvancePath == null) {
-              list2[i].moveAdvancePath = [];
-            }
-
-            if (!(item.moveAdvancePath.length == list2[i].moveAdvancePath.length)) {
-              return false;//灏忚溅棰勮璺緞闀垮害涓嶄竴鑷�
-            }
-          }
-        }
-        return true;
-      },
-      checkStaInListDiff(sta, list) {
-        //妫�娴嬬珯鐐规槸鍚﹀湪闆嗗悎涓湁鍙樺姩
-        if (list.length == 0) {
-          return false;//闆嗗悎涓虹┖
-        }
-
-        let tmp = null;
-        for (var i = 0; i < list.length; i++) {
-          if (sta.siteId == list[i].siteId) {
-            tmp = list[i];//鎵惧埌鐩稿悓绔欑偣
-            break
-          }
-        }
-
-        if (tmp == null) {
-          return false;//娌℃湁鎵惧埌鐩稿悓绔欑偣
-        }
-
-        if (sta.siteStatus != tmp.siteStatus) {
-          return false;//绔欑偣鐘舵�佷笉鐩稿悓
-        }
-
-        if (sta.workNo != tmp.workNo) {
-          return false;//绔欑偣宸ヤ綔鍙蜂笉鐩稿悓
-        }
-
-        return true;//鏃犲彉鍖�
       },
       webSocketOnOpen(e) {
         console.log("open");
@@ -608,18 +417,10 @@
       },
       webSocketOnMessage(e) {
         const result = JSON.parse(e.data);
-        if (result.url == "/shuttle/table/shuttle/state") {
-          this.setShuttleStateInfo(JSON.parse(result.data))
-        }else if (result.url == "/lift/table/lift/state") {
-          this.setLiftStateInfo(JSON.parse(result.data))
-        }else if (result.url == "/console/latest/data/site") {
-          this.setSiteInfo(JSON.parse(result.data))
-        }else if (result.url == "/console/map/auth") {
+        if (result.url == "/console/map/auth") {
           this.setMap(JSON.parse(result.data))
         }else if (result.url == "/console/locMap/auth") {
           this.setMap(JSON.parse(result.data))
-        }else if (result.url == "/console/barcode/output/site") {
-          this.setCodeData(JSON.parse(result.data))
         }
       },
       webSocketClose(e) {
@@ -628,119 +429,6 @@
       sendWs(message) {
         if (ws.readyState == WebSocket.OPEN) {
           ws.send(message)
-        }
-      },
-      colorRGB(){
-        //闅忔満棰滆壊
-        const r = Math.floor(Math.random()*256);
-        const g = Math.floor(Math.random()*256);
-        const b = Math.floor(Math.random()*256);
-        return `rgb(${r},${g},${b})`;
-      },
-      updateShuttleXY(item) {
-        const shuttle = pixiShuttleMap.get(item.shuttleNo);
-        if (shuttle.updateMoveStatus) {//鍔ㄧ敾鎵ц瀹屾垚鎵嶅彲缁х画鎵ц鍔ㄧ敾
-          shuttle.updateMoveStatus = false;//鍔ㄧ敾鎵ц涓�
-          // 璁$畻涓ょ偣涔嬮棿鐨勮窛绂�1
-          const distance = Math.sqrt(Math.pow((item.wcsPoint.x * width) - shuttle.x, 2) + Math.pow((item.wcsPoint.y * height) - shuttle.y, 2));
-          gsap.killTweensOf(shuttle); // 鏉�姝绘墍鏈夐拡瀵�".class"鐨勫姩鐢�
-          gsap.to(shuttle, {
-            x: (item.wcsPoint.y - 0) * width, // 鐩爣浣嶇疆
-            y: (item.wcsPoint.x - 1) * height, // 鐩爣浣嶇疆
-            duration: 0.2, // 鍔ㄧ敾鎸佺画鏃堕棿锛堢锛�
-            ease: "power1.inOut", // 缂撳姩绫诲瀷
-            onComplete: () => {
-              shuttle.updateMoveStatus = true;//鍔ㄧ敾鎵ц瀹屾垚
-            }
-          });
-        }
-      },
-      getSiteInfo() {
-        //鑾峰彇杈撻�佺珯鐐规暟鎹�
-        this.sendWs(JSON.stringify({
-          "url": "/console/latest/data/site",
-          "data": {}
-        }))
-      },
-      setSiteInfo(res) {
-        // var test = "{\"msg\":\"鎿嶄綔鎴愬姛\",\"code\":200,\"data\":[{\"siteId\":\"300\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"301\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"302\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"303\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"304\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"305\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"306\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"307\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"308\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"309\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"310\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"311\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"312\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"313\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"314\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"315\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"316\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"317\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"318\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"319\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"320\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"321\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"322\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"323\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"324\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"325\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"326\",\"siteStatus\":\"site-auto-id\",\"workNo\":5451},{\"siteId\":\"327\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"200\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"328\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"201\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"329\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"202\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"330\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"203\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"331\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"204\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"332\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"205\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"333\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"334\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"335\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"336\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"337\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"338\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"339\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":5447},{\"siteId\":\"340\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"341\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"342\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"343\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"344\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"345\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"346\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"100\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":8851},{\"siteId\":\"101\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":8855},{\"siteId\":\"102\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"103\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"104\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"105\",\"siteStatus\":\"site-auto\",\"workNo\":0}]}";
-        // res = JSON.parse(test)
-        //鑾峰彇杈撻�佺珯鐐规暟鎹�
-        if (res.code === 200){
-          var sites = res.data;
-          if (this.reloadSta && pixiStaMap.size > 0) {
-            //閲嶆柊娓叉煋鎵�鏈夎緭閫佺珯鐐�
-            this.currentLevStaList = sites;
-            this.reloadSta = false;
-            sites.forEach((item, index) => {
-              let sta = pixiStaMap.get(parseInt(item.siteId));
-              if (sta != undefined) {
-                if (item.workNo > 0) {
-                  sta.textObj.text = item.siteId + "(" + item.workNo + ")";
-                }
-
-                //鍒涘缓閬僵灞�
-                if (item.siteStatus == "site-auto") {
-                  //鑷姩鐘舵�侊紝绉婚櫎閬僵灞�
-                  if (sta.statusObj != null) {
-                    objectsContainer.removeChild(sta.statusObj)
-                    sta.statusObj = null;
-                  }
-                }else if (item.siteStatus == "site-auto-run" || item.siteStatus == "site-auto-run-id") {
-                  //鑷姩鏈夌墿
-                  let graphics = getGraphics(0xfa51f6, width, height, sta.x, sta.y);
-                  graphics.addChild(sta.textObj);//缁ф壙鏂囧瓧淇℃伅
-                  sta.statusObj = graphics;
-                  objectsContainer.addChild(graphics);
-                }else if (item.siteStatus == "site-unauto") {
-                  //闈炶嚜鍔�
-                  let graphics = getGraphics(0xb8b8b8, width, height, sta.x, sta.y);
-                  graphics.addChild(sta.textObj);//缁ф壙鏂囧瓧淇℃伅
-                  sta.statusObj = graphics;
-                  objectsContainer.addChild(graphics);
-                }
-              }
-            });
-          } else {
-            //妫�娴嬩笉鐩稿悓绔欑偣杩涜灞�閮ㄦ洿鏂�
-            this.currentLevStaList.forEach((item, index) => {
-              let result = this.checkStaInListDiff(item, sites);
-              if (!result) {
-                //闇�瑕佹洿鏂�
-                let sta = pixiStaMap.get(parseInt(item.siteId));
-                if (item.workNo > 0) {
-                  sta.textObj.text = item.siteId + "(" + item.workNo + ")";
-                }else {
-                  sta.textObj.text = item.siteId;
-                }
-
-                //鍒涘缓閬僵灞�
-                if (item.siteStatus == "site-auto") {
-                  //鑷姩鐘舵�侊紝绉婚櫎閬僵灞�
-                  if (sta.statusObj != null) {
-                    objectsContainer.removeChild(sta.statusObj)
-                    sta.statusObj = null;
-                  }
-                }else if (item.siteStatus == "site-auto-run") {
-                  //鑷姩鏈夌墿
-                  let graphics = getGraphics(0xfa51f6, width, height, sta.x, sta.y);
-                  graphics.addChild(sta.textObj);//缁ф壙鏂囧瓧淇℃伅
-                  sta.statusObj = graphics;
-                  objectsContainer.addChild(graphics);
-                }else if (item.siteStatus == "site-unauto") {
-                  //闈炶嚜鍔�
-                  let graphics = getGraphics(0xb8b8b8, width, height, sta.x, sta.y);
-                  graphics.addChild(sta.textObj);//缁ф壙鏂囧瓧淇℃伅
-                  sta.statusObj = graphics;
-                  objectsContainer.addChild(graphics);
-                }
-              }
-            });
-          }
-        } else if (res.code === 403){
-          parent.location.href = baseUrl+"/login";
-        }  else {
-          console.log(res.msg);
         }
       },
       openDrawerSta(data) {
@@ -763,101 +451,6 @@
             }
           }
         })
-      },
-      openDrawerLift(data) {
-        this.drawerLift = true;
-        this.drawerLiftData = parseInt(data.data)
-      },
-      getLiftStateInfo() {
-        // 鎻愬崌鏈轰俊鎭〃鑾峰彇
-        this.sendWs(JSON.stringify({
-          "url": "/lift/table/lift/state",
-          "data": {}
-        }))
-      },
-      setLiftStateInfo(res) {
-        // 鎻愬崌鏈轰俊鎭〃鑾峰彇
-        if (res.code == 200) {
-          this.liftList = res.data
-        }
-      },
-      addMoveAdvancePath(moveAdvancePath, shuttleNo) {//娣诲姞棰勮璺緞
-        let that = this;
-        moveAdvancePath.forEach((path, idx) => {
-          let locNo = this.map[path.x, path.y];
-          if (!pixiShuttleMoveAdvancePathMap.has(locNo)) {
-            let graphics = getGraphics(0x9966ff, width, height, path.y * width, (path.x - 1) * height);
-            let shuttleNos = [shuttleNo];
-            // 鍒涘缓鏂囨湰瀵硅薄
-            const style = new PIXI.TextStyle({
-              fontFamily: 'Arial',
-              fontSize: 10,
-              fill: '#000000',
-            });
-            const text = new PIXI.Text(JSON.stringify(shuttleNos), style);
-            text.anchor.set(0.5); // 璁剧疆鏂囨湰閿氱偣涓轰腑蹇冪偣
-            text.position.set(graphics.width / 2, graphics.height / 2); // 灏嗘枃鏈綅缃缃负Graphics瀵硅薄鐨勪腑蹇冪偣
-            // 灏嗘枃鏈璞℃坊鍔犲埌Graphics瀵硅薄涓�
-            graphics.addChild(text);
-            graphics.textObj = text;
-            objectsContainer2.addChild(graphics)
-            pixiShuttleMoveAdvancePathMap.set(locNo, {
-              path: path,
-              sprite: graphics,
-              textObj: text,
-              shuttleNos: shuttleNos
-            })
-
-            if (pixiShuttleMoveAdvancePathList[shuttleNo] == null) {
-              let locNos = new Set()
-              locNos.add(locNo);
-              pixiShuttleMoveAdvancePathList[shuttleNo] = locNos;
-            }else {
-              pixiShuttleMoveAdvancePathList[shuttleNo].add(locNo);
-            }
-          }else {
-            let pathMap = pixiShuttleMoveAdvancePathMap.get(locNo)
-            let shuttleNos = pathMap.shuttleNos;
-            shuttleNos.push(shuttleNo);
-            pathMap.textObj.text = JSON.stringify(shuttleNos);
-            pixiShuttleMoveAdvancePathMap.set(locNo, pathMap);
-            if (pixiShuttleMoveAdvancePathList[shuttleNo] == null) {
-              let locNos = new Set()
-              locNos.add(locNo);
-              pixiShuttleMoveAdvancePathList[shuttleNo] = locNos;
-            }else {
-              pixiShuttleMoveAdvancePathList[shuttleNo].add(locNo);
-            }
-          }
-        });
-      },
-      removeMoveAdvancePath(shuttleNo) {//鍒犻櫎棰勮璺緞
-        let locNos = pixiShuttleMoveAdvancePathList[shuttleNo];
-        if (locNos != null) {
-          locNos.forEach((locNo,index) => {
-            let pathMap = pixiShuttleMoveAdvancePathMap.get(locNo);
-            if (pathMap != null) {
-              let shuttleNos = pathMap.shuttleNos;
-              let shuttleNosNew = [];
-              shuttleNos.forEach((shuttle, idx) => {
-                if (shuttle != shuttleNo) {
-                  shuttleNosNew.push(shuttle);
-                }
-              });
-
-              if (shuttleNosNew.length === 0) {
-                //棰勮璺緞娌℃湁灏忚溅锛岀洿鎺ュ垹闄よ矾寰�
-                objectsContainer2.removeChild(pathMap.sprite);
-                pixiShuttleMoveAdvancePathMap.delete(locNo)
-              }else {
-                //棰勮璺緞瀛樺湪鍏朵粬灏忚溅锛屾洿鏂版枃瀛椾俊鎭�
-                pathMap.textObj.text = JSON.stringify(shuttleNosNew);
-                pathMap.shuttleNos = shuttleNosNew;
-                pixiShuttleMoveAdvancePathMap.set(locNo, pathMap);
-              }
-            }
-          })
-        }
       },
     }
   })

--
Gitblit v1.9.1