From a3d44470b704e81d4f66399bed2f37529ddb31be Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期四, 25 十二月 2025 13:53:32 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/controller/DualCrnController.java         |   39 ++
 src/main/java/com/zy/core/model/command/DualCrnCommand.java         |   13 
 src/main/java/com/zy/core/network/fake/ZyDualCrnFakeConnect.java    |   88 ++++++
 src/main/java/com/zy/core/enums/DualCrnModeType.java                |   42 +++
 src/main/java/com/zy/asrs/domain/vo/DualCrnStateTableVo.java        |    4 
 src/main/java/com/zy/asrs/controller/BasDualCrnpController.java     |    1 
 src/main/java/com/zy/asrs/entity/BasDualCrnp.java                   |    2 
 src/main/java/com/zy/core/enums/DualCrnForkPosType.java             |   43 +++
 src/main/java/com/zy/core/model/protocol/DualCrnProtocol.java       |   74 +++--
 src/main/webapp/components/WatchDualCrnCard.js                      |   54 +++
 src/main/java/com/zy/core/thread/DualCrnThread.java                 |    4 
 src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java    |  259 +++++++++---------
 src/main/java/com/zy/core/enums/DualCrnLiftPosType.java             |   44 +++
 src/main/java/com/zy/asrs/controller/ConsoleController.java         |   10 
 src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java |    9 
 src/main/java/com/zy/core/enums/DualCrnTaskModeType.java            |   42 +++
 src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java   |   40 ++
 src/main/java/com/zy/core/enums/DualCrnStatusType.java              |   52 +++
 18 files changed, 625 insertions(+), 195 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/BasDualCrnpController.java b/src/main/java/com/zy/asrs/controller/BasDualCrnpController.java
index a53b3ae..b64a3e6 100644
--- a/src/main/java/com/zy/asrs/controller/BasDualCrnpController.java
+++ b/src/main/java/com/zy/asrs/controller/BasDualCrnpController.java
@@ -1,6 +1,5 @@
 package com.zy.asrs.controller;
 
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
diff --git a/src/main/java/com/zy/asrs/controller/ConsoleController.java b/src/main/java/com/zy/asrs/controller/ConsoleController.java
index 5ad5b40..466a081 100644
--- a/src/main/java/com/zy/asrs/controller/ConsoleController.java
+++ b/src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -20,11 +20,7 @@
 import com.zy.common.CodeRes;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.cache.SlaveConnection;
-import com.zy.core.enums.CrnModeType;
-import com.zy.core.enums.RedisKeyType;
-import com.zy.core.enums.RgvStatusType;
-import com.zy.core.enums.SlaveType;
-import com.zy.core.enums.WrkIoType;
+import com.zy.core.enums.*;
 import com.zy.core.model.protocol.CrnProtocol;
 import com.zy.core.model.protocol.DualCrnProtocol;
 import com.zy.core.model.protocol.StationProtocol;
@@ -230,9 +226,9 @@
                 vo.setCrnStatus(CrnStatusType.MACHINE_ERROR);
             } else {
                 if (taskNo != null && taskNo > 0) {
-                    vo.setCrnStatus(p.getModeType() == CrnModeType.AUTO ? CrnStatusType.MACHINE_AUTO : CrnStatusType.MACHINE_UN_AUTO);
+                    vo.setCrnStatus(p.getModeType() == DualCrnModeType.AUTO ? CrnStatusType.MACHINE_AUTO : CrnStatusType.MACHINE_UN_AUTO);
                 } else {
-                    vo.setCrnStatus(p.getModeType() == CrnModeType.AUTO ? CrnStatusType.MACHINE_AUTO : CrnStatusType.MACHINE_UN_AUTO);
+                    vo.setCrnStatus(p.getModeType() == DualCrnModeType.AUTO ? CrnStatusType.MACHINE_AUTO : CrnStatusType.MACHINE_UN_AUTO);
                 }
             }
             vos.add(vo);
diff --git a/src/main/java/com/zy/asrs/controller/DualCrnController.java b/src/main/java/com/zy/asrs/controller/DualCrnController.java
index b33e029..599eb45 100644
--- a/src/main/java/com/zy/asrs/controller/DualCrnController.java
+++ b/src/main/java/com/zy/asrs/controller/DualCrnController.java
@@ -65,6 +65,8 @@
             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());
             vo.setYspeed(p.getYSpeed());
             vo.setZspeed(p.getZSpeed());
@@ -105,6 +107,43 @@
         return R.ok();
     }
 
+    @PostMapping("/dualcrn/command/pick")
+    @ManagerAuth(memo = "鍙屽伐浣嶅爢鍨涙満鍙栬揣鍛戒护")
+    public R dualCrnCommandPick(@RequestBody DualCrnCommandParam param) {
+        if (Cools.isEmpty(param)) {
+            return R.error("缂哄皯鍙傛暟");
+        }
+        Integer crnNo = param.getCrnNo();
+        String targetLocNo = param.getTargetLocNo();
+        Integer station = param.getStation();
+        DualCrnThread crnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, crnNo);
+        if (crnThread == null) {
+            return R.error("绾跨▼涓嶅瓨鍦�");
+        }
+        DualCrnCommand command = crnThread.getPickCommand(targetLocNo, 9999, crnNo, station);
+        MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, command));
+        return R.ok();
+    }
+
+    @PostMapping("/dualcrn/command/put")
+    @ManagerAuth(memo = "鍙屽伐浣嶅爢鍨涙満鏀捐揣鍛戒护")
+    public R dualCrnCommandPut(@RequestBody DualCrnCommandParam param) {
+        if (Cools.isEmpty(param)) {
+            return R.error("缂哄皯鍙傛暟");
+        }
+        Integer crnNo = param.getCrnNo();
+        String targetLocNo = param.getTargetLocNo();
+        Integer station = param.getStation();
+        DualCrnThread crnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, crnNo);
+        if (crnThread == null) {
+            return R.error("绾跨▼涓嶅瓨鍦�");
+        }
+        DualCrnCommand command = crnThread.getPutCommand(targetLocNo, 9999, crnNo, station);
+        MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, command));
+        return R.ok();
+    }
+    
+
     @PostMapping("/dualcrn/command/move")
     @ManagerAuth(memo = "鍙屽伐浣嶅爢鍨涙満绉诲姩鍛戒护")
     public R dualCrnCommandMove(@RequestBody DualCrnCommandParam param) {
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 7c00f96..34ae94e 100644
--- a/src/main/java/com/zy/asrs/domain/vo/DualCrnStateTableVo.java
+++ b/src/main/java/com/zy/asrs/domain/vo/DualCrnStateTableVo.java
@@ -43,6 +43,10 @@
 
     private String walkPosTwo = "-";
 
+    private String taskReceive = "-";
+
+    private String taskReceiveTwo = "-";
+
     private Integer xspeed = 0;
 
     private Integer yspeed = 0;
diff --git a/src/main/java/com/zy/asrs/entity/BasDualCrnp.java b/src/main/java/com/zy/asrs/entity/BasDualCrnp.java
index aa3345a..74f1027 100644
--- a/src/main/java/com/zy/asrs/entity/BasDualCrnp.java
+++ b/src/main/java/com/zy/asrs/entity/BasDualCrnp.java
@@ -6,8 +6,6 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import org.springframework.format.annotation.DateTimeFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
diff --git a/src/main/java/com/zy/core/enums/DualCrnForkPosType.java b/src/main/java/com/zy/core/enums/DualCrnForkPosType.java
new file mode 100644
index 0000000..b91aada
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/DualCrnForkPosType.java
@@ -0,0 +1,43 @@
+package com.zy.core.enums;
+
+public enum DualCrnForkPosType {
+
+    NONE(-1, "涓嶅湪瀹氫綅"),   // 璐у弶鍘熶綅
+    HOME(0, "璐у弶鍘熶綅"),   // 璐у弶鍘熶綅
+    LEFT(1, "璐у弶鍦ㄥ乏渚�"),  // 璐у弶鍦ㄥ乏渚�
+    RIGHT(2, "璐у弶鍦ㄥ彸渚�"),   // 璐у弶鍦ㄥ彸渚�
+    _LEFT(3, "璐у弶鍦ㄥ乏渚ц繙"),   // 璐у弶鍦ㄥ彸渚ц繙
+    _RIGHT(4, "璐у弶鍦ㄥ彸渚ц繙"),   // 璐у弶鍦ㄥ彸渚ц繙
+    ;
+
+    public Integer id;
+    public String desc;
+    DualCrnForkPosType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static DualCrnForkPosType get(Integer id) {
+        if (null == id) {
+            return null;
+        }
+        for (DualCrnForkPosType type : DualCrnForkPosType.values()) {
+            if (type.id.equals(id)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static DualCrnForkPosType get(DualCrnForkPosType type) {
+        if (null == type) {
+            return null;
+        }
+        for (DualCrnForkPosType crnForkPosType : DualCrnForkPosType.values()) {
+            if (crnForkPosType == type) {
+                return crnForkPosType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/core/enums/DualCrnLiftPosType.java b/src/main/java/com/zy/core/enums/DualCrnLiftPosType.java
new file mode 100644
index 0000000..dba8306
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/DualCrnLiftPosType.java
@@ -0,0 +1,44 @@
+package com.zy.core.enums;
+
+public enum DualCrnLiftPosType {
+
+    ERROR(-1, "鏈煡"),   // 涓嶅湪瀹氫綅
+    NONE(0, "涓嶅湪瀹氫綅"),   // 涓嶅湪瀹氫綅
+    _DOWN(1, "鍙屾繁浣庝綅"),  //
+    DOWN(2, "鍗曟繁浣庝綅"),  //
+    _UP(3, "鍗曟繁楂樹綅"),   //
+    UP(4, "鍙屾繁楂樹綅"),   //
+    ;
+
+    public Integer id;
+    public String desc;
+    DualCrnLiftPosType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static DualCrnLiftPosType get(Integer id) {
+        if (null == id) {
+            return null;
+        }
+        for (DualCrnLiftPosType type : DualCrnLiftPosType.values()) {
+            if (type.id.equals(id)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static DualCrnLiftPosType get(DualCrnLiftPosType type) {
+        if (null == type) {
+            return null;
+        }
+        for (DualCrnLiftPosType crnLiftPosType : DualCrnLiftPosType.values()) {
+            if (crnLiftPosType == type) {
+                return crnLiftPosType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/enums/DualCrnModeType.java b/src/main/java/com/zy/core/enums/DualCrnModeType.java
new file mode 100644
index 0000000..639e6ad
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/DualCrnModeType.java
@@ -0,0 +1,42 @@
+package com.zy.core.enums;
+
+public enum DualCrnModeType {
+
+    NONE(-1, "绂荤嚎"),
+    STOP(0, "缁翠慨"),
+    HAND(1, "鎵嬪姩"),
+    HALF_AUTO(2, "鍗婅嚜鍔�"),
+    AUTO(3, "鑷姩"),
+    ;
+
+    public Integer id;
+    public String desc;
+    DualCrnModeType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static DualCrnModeType get(Integer id) {
+        if (null == id) {
+            return null;
+        }
+        for (DualCrnModeType type : DualCrnModeType.values()) {
+            if (type.id.equals(id)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static DualCrnModeType get(DualCrnModeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (DualCrnModeType crnModeType : DualCrnModeType.values()) {
+            if (crnModeType == type) {
+                return crnModeType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/core/enums/DualCrnStatusType.java b/src/main/java/com/zy/core/enums/DualCrnStatusType.java
new file mode 100644
index 0000000..ad30097
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/DualCrnStatusType.java
@@ -0,0 +1,52 @@
+package com.zy.core.enums;
+
+public enum DualCrnStatusType {
+
+    NONE(-1, "绂荤嚎"),
+    IDLE(0, "绌洪棽"),
+    FETCH_MOVING(1, "鍙栬揣琛岃蛋"),
+    FETCH_WAITING(2, "鍙栬揣绛夊緟"),
+    FETCHING(3, "鍙栬揣涓�"),
+    PUT_MOVING(4, "鏀捐揣璧拌"),
+    PUT_WAITING(5, "鏀捐揣绛夊緟"),
+    PUTTING(6, "鏀捐揣涓�"),
+    ORIGIN_GO(7, "鍥炲師鐐�"),
+    ORIGIN_BACK(8, "鍥炲弽鍘熺偣"),
+    MOVING(9, "璧拌涓�"),
+    WAITING(90, "浠诲姟瀹屾垚绛夊緟WCS纭"),
+    PAUSE(11, "浠诲姟鏆傚仠"),
+    SOS(99, "鎶ヨ"),
+    UNKNOW(100, "鍏朵粬"),
+    ;
+
+    public Integer id;
+    public String desc;
+    DualCrnStatusType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static DualCrnStatusType get(Integer id) {
+        if (null == id) {
+            return null;
+        }
+        for (DualCrnStatusType type : DualCrnStatusType.values()) {
+            if (type.id.equals(id)) {
+                return type;
+            }
+        }
+        return NONE;
+    }
+
+    public static DualCrnStatusType get(DualCrnStatusType type) {
+        if (null == type) {
+            return null;
+        }
+        for (DualCrnStatusType crnStatusType : DualCrnStatusType.values()) {
+            if (crnStatusType == type) {
+                return crnStatusType;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/core/enums/DualCrnTaskModeType.java b/src/main/java/com/zy/core/enums/DualCrnTaskModeType.java
new file mode 100644
index 0000000..bc62cc4
--- /dev/null
+++ b/src/main/java/com/zy/core/enums/DualCrnTaskModeType.java
@@ -0,0 +1,42 @@
+package com.zy.core.enums;
+
+public enum DualCrnTaskModeType {
+
+    NONE(0),    // 鏃�
+    PICK(1),    // 鍙栬揣
+    PUT(2),    // 鏀捐揣
+    TRANSFER(3),    // 鍙栨斁璐�
+    MOVE(4),    // 绉诲姩
+    CONFIRM(5),    // 纭
+    ;
+
+    public Integer id;
+    DualCrnTaskModeType(Integer id) {
+        this.id = id;
+    }
+
+    public static DualCrnTaskModeType get(Integer id) {
+        if (null == id) {
+            return null;
+        }
+        for (DualCrnTaskModeType type : DualCrnTaskModeType.values()) {
+            if (type.id.equals(id)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static DualCrnTaskModeType get(DualCrnTaskModeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (DualCrnTaskModeType crnTaskModeType : DualCrnTaskModeType.values()) {
+            if (crnTaskModeType == type) {
+                return crnTaskModeType;
+            }
+        }
+        return null;
+    }
+
+}
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 379ed38..73599da 100644
--- a/src/main/java/com/zy/core/model/command/DualCrnCommand.java
+++ b/src/main/java/com/zy/core/model/command/DualCrnCommand.java
@@ -11,24 +11,11 @@
     // 鍫嗗灈鏈哄彿
     private Integer crnNo = 0;
 
-    // 浠诲姟瀹屾垚纭浣�
-    private Short ackFinish = 0;
-
     // 浠诲姟鍙�
     private Short taskNo = 0;
 
     /**
      * 浠诲姟妯″紡锛�
-     * 0 = 鏃�
-     * 1 = 鍏ュ簱   婧愬拰鐩爣閮藉彂
-     * 2 = 鍑哄簱   婧愬拰鐩爣閮藉彂
-     * 3 = 搴撲綅绉昏浆 婧愬拰鐩爣閮藉彂
-     * 4 = 绔欎綅绉昏浆 婧愬拰鐩爣閮藉彂
-     * 5 = 鍥炲師鐐�  涓嶇敤鍙�
-     * 6 = 鍘诲弽鍘熺偣 鐩爣鍙�
-     * 7 = 鍧愭爣绉昏 鍙栬揣鍙�
-     * 90 = 璁剧疆鏃堕棿
-     * 99 = 鍙栨秷褰撳墠浠诲姟
      */
     private Short taskMode = 0;
 
diff --git a/src/main/java/com/zy/core/model/protocol/DualCrnProtocol.java b/src/main/java/com/zy/core/model/protocol/DualCrnProtocol.java
index f9b5e9f..f2ecb14 100644
--- a/src/main/java/com/zy/core/model/protocol/DualCrnProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/DualCrnProtocol.java
@@ -1,9 +1,10 @@
 package com.zy.core.model.protocol;
 
-import com.zy.core.enums.CrnForkPosType;
-import com.zy.core.enums.CrnLiftPosType;
-import com.zy.core.enums.CrnModeType;
-import com.zy.core.enums.CrnStatusType;
+import com.zy.core.enums.DualCrnForkPosType;
+import com.zy.core.enums.DualCrnLiftPosType;
+import com.zy.core.enums.DualCrnModeType;
+import com.zy.core.enums.DualCrnStatusType;
+
 import lombok.Data;
 
 import java.util.Map;
@@ -20,7 +21,7 @@
      */
     public Integer mode;
 
-    public CrnModeType modeType;
+    public DualCrnModeType modeType;
 
     /**
      * 寮傚父鐮�
@@ -60,12 +61,12 @@
     /**
      * 宸ヤ綅1鐘舵�佹灇涓�
      */
-    public CrnStatusType statusType;
+    public DualCrnStatusType statusType;
 
     /**
      * 宸ヤ綅2鐘舵�佹灇涓�
      */
-    public CrnStatusType statusTypeTwo;
+    public DualCrnStatusType statusTypeTwo;
 
     /**
      * 宸ヤ綅1鍫嗗灈鏈哄綋鍓嶅垪鍙�
@@ -103,9 +104,9 @@
      */
     public Integer forkPosTwo;
 
-    public CrnForkPosType forkPosType;
+    public DualCrnForkPosType forkPosType;
 
-    public CrnForkPosType forkPosTypeTwo;
+    public DualCrnForkPosType forkPosTypeTwo;
 
     /**
      * 褰撳墠杞借揣鍙颁綅缃�
@@ -116,9 +117,9 @@
 
     public Integer liftPosTwo;
 
-    public CrnLiftPosType liftPosType;
+    public DualCrnLiftPosType liftPosType;
 
-    public CrnLiftPosType liftPosTypeTwo;
+    public DualCrnLiftPosType liftPosTypeTwo;
 
     /**
      * 璧拌鍦ㄥ畾浣�
@@ -135,6 +136,15 @@
     public Integer loaded;
 
     public Integer loadedTwo;
+
+    /**
+     * 浠诲姟鎺ユ敹鐘舵��
+     * 0 = 鏈帴鏀�
+     * 1 = 宸叉帴鏀�
+     */
+    public Integer taskReceive;
+
+    public Integer taskReceiveTwo;
 
     private Integer temp1;
 
@@ -208,72 +218,72 @@
 
     public void setMode(Integer mode) {
         this.mode = mode;
-        this.modeType = CrnModeType.get(mode);
+        this.modeType = DualCrnModeType.get(mode);
     }
 
-    public void setMode(CrnModeType type) {
+    public void setMode(DualCrnModeType type) {
         this.modeType = type;
-        this.mode = CrnModeType.get(type).id;
+        this.mode = DualCrnModeType.get(type).id;
     }
 
     public void setForkPos(Integer forkPos) {
         this.forkPos = forkPos;
-        this.forkPosType = CrnForkPosType.get(forkPos);
+        this.forkPosType = DualCrnForkPosType.get(forkPos);
     }
 
     public void setForkPosTwo(Integer forkPosTwo) {
         this.forkPosTwo = forkPosTwo;
-        this.forkPosTypeTwo = CrnForkPosType.get(forkPosTwo);
+        this.forkPosTypeTwo = DualCrnForkPosType.get(forkPosTwo);
     }
 
-    public void setForkPos(CrnForkPosType type) {
+    public void setForkPos(DualCrnForkPosType type) {
         this.forkPosType = type;
-        this.forkPos = CrnForkPosType.get(type).id;
+        this.forkPos = DualCrnForkPosType.get(type).id;
     }
 
-    public void setForkPosTwo(CrnForkPosType type) {
+    public void setForkPosTwo(DualCrnForkPosType type) {
         this.forkPosTypeTwo = type;
-        this.forkPosTwo = CrnForkPosType.get(type).id;
+        this.forkPosTwo = DualCrnForkPosType.get(type).id;
     }
 
     public void setLiftPos(Integer liftPos) {
         this.liftPos = liftPos;
-        this.liftPosType = CrnLiftPosType.get(liftPos);
+        this.liftPosType = DualCrnLiftPosType.get(liftPos);
     }
 
     public void setLiftPosTwo(Integer liftPosTwo) {
         this.liftPosTwo = liftPosTwo;
-        this.liftPosTypeTwo = CrnLiftPosType.get(liftPosTwo);
+        this.liftPosTypeTwo = DualCrnLiftPosType.get(liftPosTwo);
     }
 
-    public void setLiftPos(CrnLiftPosType type) {
+    public void setLiftPos(DualCrnLiftPosType type) {
         this.liftPosType = type;
-        this.liftPos = CrnLiftPosType.get(type).id;
+        this.liftPos = DualCrnLiftPosType.get(type).id;
     }
 
-    public void setLiftPosTwo(CrnLiftPosType type) {
+    public void setLiftPosTwo(DualCrnLiftPosType type) {
         this.liftPosTypeTwo = type;
-        this.liftPosTwo = CrnLiftPosType.get(type).id;
+        this.liftPosTwo = DualCrnLiftPosType.get(type).id;
     }
 
     public void setStatus(Integer status){
         this.status = status;
-        this.statusType = CrnStatusType.get(status);
+        this.statusType = DualCrnStatusType.get(status);
     }
 
-    public void setStatus(CrnStatusType type){
+    public void setStatus(DualCrnStatusType type){
         this.statusType = type;
-        this.status = CrnStatusType.get(type).id;
+        this.status = DualCrnStatusType.get(type).id;
     }
 
     public void setStatusTwo(Integer statusTwo){
         this.statusTwo = statusTwo;
-        this.statusTypeTwo = CrnStatusType.get(statusTwo);
+        this.statusTypeTwo = DualCrnStatusType.get(statusTwo);
     }
 
-    public void setStatusTwo(CrnStatusType type){
+    public void setStatusTwo(DualCrnStatusType type){
         this.statusTypeTwo = type;
-        this.statusTwo = CrnStatusType.get(type).id;
+        this.statusTwo = DualCrnStatusType.get(type).id;
     }
 
 }
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 9c26fef..dd03a9c 100644
--- a/src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java
+++ b/src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java
@@ -96,6 +96,15 @@
     public Integer loadedTwo;
 
     /**
+     * 浠诲姟鎺ユ敹鐘舵��
+     * 0 = 鏈帴鏀�
+     * 1 = 宸叉帴鏀�
+     */
+    public Integer taskReceive;
+
+    public Integer taskReceiveTwo;
+
+    /**
      * 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 133d910..1cdd5bd 100644
--- a/src/main/java/com/zy/core/network/fake/ZyDualCrnFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyDualCrnFakeConnect.java
@@ -3,7 +3,7 @@
 import com.alibaba.fastjson.JSON;
 import com.zy.asrs.entity.DeviceConfig;
 import com.zy.core.enums.CrnStatusType;
-import com.zy.core.enums.CrnTaskModeType;
+import com.zy.core.enums.DualCrnTaskModeType;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.command.DualCrnCommand;
 import com.zy.core.network.api.ZyDualCrnConnectApi;
@@ -42,13 +42,19 @@
     @Override
     public CommandResponse sendCommand(DualCrnCommand command) {
         CommandResponse response = new CommandResponse(false);
-        if (command.getTaskMode().intValue() == CrnTaskModeType.LOC_MOVE.id) {
+        if (command.getTaskMode().intValue() == DualCrnTaskModeType.TRANSFER.id) {
             //鍙栨斁璐�
             executor.submit(() -> commandTake(command));
-        } else if (command.getTaskMode().intValue() == CrnTaskModeType.CRN_MOVE.id) {
+        } else if (command.getTaskMode().intValue() == DualCrnTaskModeType.PICK.id) {
+            //鍙栬揣
+            executor.submit(() -> commandPick(command));
+        } else if (command.getTaskMode().intValue() == DualCrnTaskModeType.PUT.id) {
+            //鏀捐揣
+            executor.submit(() -> commandPut(command));
+        } else if (command.getTaskMode().intValue() == DualCrnTaskModeType.MOVE.id) {
             //绉诲姩
             executor.submit(() -> commandMove(command));
-        } else if (command.getTaskMode().intValue() == CrnTaskModeType.NONE.id) {
+        } else if (command.getTaskMode().intValue() == DualCrnTaskModeType.CONFIRM.id) {
             //澶嶄綅
             executor.submit(() -> commandTaskComplete(command));
         }
@@ -148,6 +154,80 @@
         }
     }
 
+    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();
+
+        this.crnStatus.setMode(taskMode);
+        if(command.getStation() == 1) {
+            this.crnStatus.setTaskNo(taskNo);
+            this.crnStatus.setStatus(CrnStatusType.FETCH_MOVING.id);
+
+            moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue());
+            moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue());
+            this.crnStatus.setStatus(CrnStatusType.FETCHING.id);
+            sleep(2000);
+            if (Thread.currentThread().isInterrupted()) {
+                return;
+            }
+            this.crnStatus.setLoaded(1);
+            this.crnStatus.setStatus(CrnStatusType.WAITING.id);
+        }else {
+            this.crnStatus.setTaskNoTwo(taskNo);
+            this.crnStatus.setStatusTwo(CrnStatusType.FETCH_MOVING.id);
+
+            moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue());
+            moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue());
+            this.crnStatus.setStatusTwo(CrnStatusType.FETCHING.id);
+            sleep(2000);
+            if (Thread.currentThread().isInterrupted()) {
+                return;
+            }
+            this.crnStatus.setLoadedTwo(1);
+            this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id);
+        }
+    }
+
+    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();
+
+        this.crnStatus.setMode(taskMode);
+        if(command.getStation() == 1) {
+            this.crnStatus.setTaskNo(taskNo);
+            this.crnStatus.setStatus(CrnStatusType.PUT_MOVING.id);
+
+            moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue());
+            moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue());
+            this.crnStatus.setStatus(CrnStatusType.PUTTING.id);
+            sleep(2000);
+            if (Thread.currentThread().isInterrupted()) {
+                return;
+            }
+            this.crnStatus.setLoaded(0);
+            this.crnStatus.setStatus(CrnStatusType.WAITING.id);
+        }else {
+            this.crnStatus.setTaskNoTwo(taskNo);
+            this.crnStatus.setStatusTwo(CrnStatusType.PUT_MOVING.id);
+
+            moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue());
+            moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue());
+            this.crnStatus.setStatusTwo(CrnStatusType.PUTTING.id);
+            sleep(2000);
+            if (Thread.currentThread().isInterrupted()) {
+                return;
+            }
+            this.crnStatus.setLoadedTwo(0);
+            this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id);
+        }
+    }
+
     private void moveZ(int sourcePosZ, int destinationPosZ, int station) {
         if(destinationPosZ - sourcePosZ > 0) {
             int moveLength = destinationPosZ - sourcePosZ;
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 c5d2b06..9a35a44 100644
--- a/src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java
@@ -108,145 +108,144 @@
     @Override
     public CommandResponse sendCommand(DualCrnCommand command) {
         CommandResponse response = new CommandResponse(false);
-        try {
-            if (null == command) {
-                News.error("鍙屽伐浣嶅爢鍨涙満鍐欏叆鍛戒护涓虹┖");
-                response.setMessage("鍙屽伐浣嶅爢鍨涙満鍐欏叆鍛戒护涓虹┖");
-                return response;
-            }
+        // try {
+        //     if (null == command) {
+        //         News.error("鍙屽伐浣嶅爢鍨涙満鍐欏叆鍛戒护涓虹┖");
+        //         response.setMessage("鍙屽伐浣嶅爢鍨涙満鍐欏叆鍛戒护涓虹┖");
+        //         return response;
+        //     }
 
-            String address = "DB100.0";
-            if (command.getStation() == 1) {
-                //宸ヤ綅1
-                address = "DB100.0";
-            }else {
-                //宸ヤ綅2
-                address = "DB100.20";
-            }
+        //     String address = "DB100.0";
+        //     if (command.getStation() == 1) {
+        //         //宸ヤ綅1
+        //         address = "DB100.0";
+        //     }else {
+        //         //宸ヤ綅2
+        //         address = "DB100.20";
+        //     }
 
-            int writeAck = 0;
-            boolean ackResult = false;
-            do {
-                OperateResult resultAck = siemensNet.Write(address, (short) 0);
-                if (resultAck.IsSuccess) {
-                    Thread.sleep(200);
-                    OperateResultExOne<byte[]> resultRead = siemensNet.Read(address, (short) 2);
-                    short ack = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
-                    if (ack != 0) {
-                        writeAck++;
-                    } else {
-                        News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂[id:{}] >>>>> {}", command.getCrnNo(), "ack澶嶄綅瀹屾垚");
-                        ackResult = true;
-                        break;
-                    }
-                }
-            } while (writeAck < 5);
+        //     int writeAck = 0;
+        //     boolean ackResult = false;
+        //     do {
+        //         OperateResult resultAck = siemensNet.Write(address, (short) 0);
+        //         if (resultAck.IsSuccess) {
+        //             Thread.sleep(200);
+        //             OperateResultExOne<byte[]> resultRead = siemensNet.Read(address, (short) 2);
+        //             short ack = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
+        //             if (ack != 0) {
+        //                 writeAck++;
+        //             } else {
+        //                 News.info("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂[id:{}] >>>>> {}", command.getCrnNo(), "ack澶嶄綅瀹屾垚");
+        //                 ackResult = true;
+        //                 break;
+        //             }
+        //         }
+        //     } while (writeAck < 5);
 
-            if (!ackResult) {
-                response.setMessage("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂[id:{}] >>>>> {}" + command.getCrnNo() + "ack澶嶄綅澶辫触");
-                return response;
-            }
+        //     if (!ackResult) {
+        //         response.setMessage("鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂[id:{}] >>>>> {}" + command.getCrnNo() + "ack澶嶄綅澶辫触");
+        //         return response;
+        //     }
 
-            short[] array = new short[10];
-            array[0] = command.getAckFinish();
-            array[1] = command.getTaskNo();
-            array[2] = command.getTaskMode();
-            array[3] = command.getSourcePosX();
-            array[4] = command.getSourcePosY();
-            array[5] = command.getSourcePosZ();
-            array[6] = command.getDestinationPosX();
-            array[7] = command.getDestinationPosY();
-            array[8] = command.getDestinationPosZ();
-            array[9] = command.getCommand();
+        //     short[] array = new short[10];
+        //     array[1] = command.getTaskNo();
+        //     array[2] = command.getTaskMode();
+        //     array[3] = command.getSourcePosX();
+        //     array[4] = command.getSourcePosY();
+        //     array[5] = command.getSourcePosZ();
+        //     array[6] = command.getDestinationPosX();
+        //     array[7] = command.getDestinationPosY();
+        //     array[8] = command.getDestinationPosZ();
+        //     array[9] = command.getCommand();
 
-            OperateResult result = null;
-            int idx = 0;
-            do {
-                OperateResultExOne<byte[]> resultRead = siemensNet.Read(address, (short) 20);
-                if (resultRead.IsSuccess) {
-                    if (command.getAckFinish() == 0) {
-                        short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2);
-                        short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4);
-                        short sourcePosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 6);
-                        short sourcePosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 8);
-                        short sourcePosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 10);
-                        short destinationPosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 12);
-                        short destinationPosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 14);
-                        short destinationPosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 16);
-                        if (taskNo == 0 || taskMode == 0 || sourcePosX == 0 || sourcePosY == 0 || sourcePosZ == 0 || destinationPosX == 0 || destinationPosY == 0 || destinationPosZ == 0) {
-                            result = siemensNet.Write(address, array);
-                        } else {
-                            break;
-                        }
-                    } else {
-                        short ackFinish = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
-                        if (ackFinish != command.getAckFinish()) {
-                            result = siemensNet.Write(address, array);
-                        } else {
-                            break;
-                        }
-                    }
-                }
-                idx++;
-                Thread.sleep(500);
-            } while (idx < 5);
+        //     OperateResult result = null;
+        //     int idx = 0;
+        //     do {
+        //         OperateResultExOne<byte[]> resultRead = siemensNet.Read(address, (short) 20);
+        //         if (resultRead.IsSuccess) {
+        //             if (command.getAckFinish() == 0) {
+        //                 short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2);
+        //                 short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4);
+        //                 short sourcePosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 6);
+        //                 short sourcePosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 8);
+        //                 short sourcePosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 10);
+        //                 short destinationPosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 12);
+        //                 short destinationPosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 14);
+        //                 short destinationPosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 16);
+        //                 if (taskNo == 0 || taskMode == 0 || sourcePosX == 0 || sourcePosY == 0 || sourcePosZ == 0 || destinationPosX == 0 || destinationPosY == 0 || destinationPosZ == 0) {
+        //                     result = siemensNet.Write(address, array);
+        //                 } else {
+        //                     break;
+        //                 }
+        //             } else {
+        //                 short ackFinish = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
+        //                 if (ackFinish != command.getAckFinish()) {
+        //                     result = siemensNet.Write(address, array);
+        //                 } else {
+        //                     break;
+        //                 }
+        //             }
+        //         }
+        //         idx++;
+        //         Thread.sleep(500);
+        //     } while (idx < 5);
 
-            if (command.getAckFinish() == 0) {
-                short commandFinish = 1;
-                int i = 0;
-                do {
-                    OperateResultExOne<byte[]> resultRead = siemensNet.Read(address, (short) 4);
-                    OperateResultExOne<byte[]> resultReadConfirm = siemensNet.Read(address + 18, (short) 2);
-                    if (resultRead.IsSuccess && resultReadConfirm.IsSuccess) {
-                        short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2);
-                        short confirm = siemensNet.getByteTransform().TransInt16(resultReadConfirm.Content, 0);
-                        if (taskNo != 0 && confirm == 0) {
-                            result = siemensNet.Write(address + 18, commandFinish);
-                        }
-                    }
-                    i++;
-                    Thread.sleep(500);
-                } while (i < 5);
-            }
+        //     if (command.getAckFinish() == 0) {
+        //         short commandFinish = 1;
+        //         int i = 0;
+        //         do {
+        //             OperateResultExOne<byte[]> resultRead = siemensNet.Read(address, (short) 4);
+        //             OperateResultExOne<byte[]> resultReadConfirm = siemensNet.Read(address + 18, (short) 2);
+        //             if (resultRead.IsSuccess && resultReadConfirm.IsSuccess) {
+        //                 short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2);
+        //                 short confirm = siemensNet.getByteTransform().TransInt16(resultReadConfirm.Content, 0);
+        //                 if (taskNo != 0 && confirm == 0) {
+        //                     result = siemensNet.Write(address + 18, commandFinish);
+        //                 }
+        //             }
+        //             i++;
+        //             Thread.sleep(500);
+        //         } while (i < 5);
+        //     }
 
-            if (result != null && result.IsSuccess) {
-                News.info("SiemensDualCrn 鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂[id:{}] >>>>> {}", command.getCrnNo(), JSON.toJSON(command));
-                OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), command.getCrnNo(), JSON.toJSON(command)));
-                response.setResult(true);
-                response.setMessage("鍛戒护涓嬪彂鎴愬姛");
-            } else {
-                News.error("SiemensDualCrn 鍙屽伐浣嶅爢鍨涙満鍐欏叆鍫嗗灈鏈簆lc鏁版嵁澶辫触 ===>> [id:{}]", command.getCrnNo());
-                OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝啓鍏ュ爢鍨涙満plc鏁版嵁澶辫触 ===>> [id:{1}]", DateUtils.convert(new Date()), command.getCrnNo()));
-                response.setResult(false);
-                response.setMessage("鍛戒护涓嬪彂澶辫触");
-            }
+        //     if (result != null && result.IsSuccess) {
+        //         News.info("SiemensDualCrn 鍙屽伐浣嶅爢鍨涙満鍛戒护涓嬪彂[id:{}] >>>>> {}", command.getCrnNo(), JSON.toJSON(command));
+        //         OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), command.getCrnNo(), JSON.toJSON(command)));
+        //         response.setResult(true);
+        //         response.setMessage("鍛戒护涓嬪彂鎴愬姛");
+        //     } else {
+        //         News.error("SiemensDualCrn 鍙屽伐浣嶅爢鍨涙満鍐欏叆鍫嗗灈鏈簆lc鏁版嵁澶辫触 ===>> [id:{}]", command.getCrnNo());
+        //         OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝啓鍏ュ爢鍨涙満plc鏁版嵁澶辫触 ===>> [id:{1}]", DateUtils.convert(new Date()), command.getCrnNo()));
+        //         response.setResult(false);
+        //         response.setMessage("鍛戒护涓嬪彂澶辫触");
+        //     }
 
-            return response;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }finally {
-            String sourceLocNo = Utils.getLocNo(command.getSourcePosX(), command.getSourcePosY(), command.getSourcePosZ());
-            String targetLocNo = Utils.getLocNo(command.getDestinationPosX(), command.getDestinationPosY(), command.getDestinationPosZ());
+        //     return response;
+        // } catch (Exception e) {
+        //     e.printStackTrace();
+        // }finally {
+        //     String sourceLocNo = Utils.getLocNo(command.getSourcePosX(), command.getSourcePosY(), command.getSourcePosZ());
+        //     String targetLocNo = Utils.getLocNo(command.getDestinationPosX(), command.getDestinationPosY(), command.getDestinationPosZ());
 
-            // 鏃ュ織璁板綍
-            BasCrnpOptService bean = SpringUtils.getBean(BasCrnpOptService.class);
-            BasCrnpOpt basCrnpOpt = new BasCrnpOpt(
-                    command.getTaskNo().intValue(),    // 浠诲姟鍙�
-                    command.getCrnNo(),    // 鍫嗗灈鏈篬闈炵┖]
-                    new Date(),    // 涓嬪彂鏃堕棿
-                    String.valueOf(command.getTaskMode()),    // 妯″紡
-                    sourceLocNo, //婧愬簱浣�
-                    targetLocNo, //鐩爣搴撲綅
-                    null,    // 淇敼鏃堕棿
-                    null,    // 淇敼浜哄憳
-                    null,    // 澶囨敞
-                    JSON.toJSONString(command),    // 鎸囦护
-                    JSON.toJSONString(getStatus()),    // 绯荤粺鐘舵��
-                    1,    // 涓嬪彂鐘舵�亄0:鏈笅鍙�,1:宸蹭笅鍙憓
-                    JSON.toJSONString(response)    // 鍝嶅簲
-            );
-            bean.insert(basCrnpOpt);
-        }
+        //     // 鏃ュ織璁板綍
+        //     BasCrnpOptService bean = SpringUtils.getBean(BasCrnpOptService.class);
+        //     BasCrnpOpt basCrnpOpt = new BasCrnpOpt(
+        //             command.getTaskNo().intValue(),    // 浠诲姟鍙�
+        //             command.getCrnNo(),    // 鍫嗗灈鏈篬闈炵┖]
+        //             new Date(),    // 涓嬪彂鏃堕棿
+        //             String.valueOf(command.getTaskMode()),    // 妯″紡
+        //             sourceLocNo, //婧愬簱浣�
+        //             targetLocNo, //鐩爣搴撲綅
+        //             null,    // 淇敼鏃堕棿
+        //             null,    // 淇敼浜哄憳
+        //             null,    // 澶囨敞
+        //             JSON.toJSONString(command),    // 鎸囦护
+        //             JSON.toJSONString(getStatus()),    // 绯荤粺鐘舵��
+        //             1,    // 涓嬪彂鐘舵�亄0:鏈笅鍙�,1:宸蹭笅鍙憓
+        //             JSON.toJSONString(response)    // 鍝嶅簲
+        //     );
+        //     bean.insert(basCrnpOpt);
+        // }
         return response;
     }
 }
diff --git a/src/main/java/com/zy/core/thread/DualCrnThread.java b/src/main/java/com/zy/core/thread/DualCrnThread.java
index cd40f95..b670bc1 100644
--- a/src/main/java/com/zy/core/thread/DualCrnThread.java
+++ b/src/main/java/com/zy/core/thread/DualCrnThread.java
@@ -11,6 +11,10 @@
 
     DualCrnCommand getPickAndPutCommand(String sourceLocNo, String targetLocNo, Integer taskNo, Integer crnNo, Integer station);//鍙栨斁璐�
 
+    DualCrnCommand getPickCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station);//鍙栬揣
+
+    DualCrnCommand getPutCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station);//鏀捐揣
+
     DualCrnCommand getMoveCommand(String targetLocNo, Integer taskNo, Integer crnNo);//绉诲姩
 
     DualCrnCommand getResetCommand(Integer crnNo, Integer station);//澶嶄綅
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 fcb6019..96b2983 100644
--- a/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZySiemensDualCrnThread.java
@@ -15,6 +15,7 @@
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.OutputQueue;
 import com.zy.core.enums.CrnTaskModeType;
+import com.zy.core.enums.DualCrnTaskModeType;
 import com.zy.core.enums.RedisKeyType;
 import com.zy.core.enums.SlaveType;
 import com.zy.core.model.CommandResponse;
@@ -168,7 +169,6 @@
             OutputQueue.DUAL_CRN.offer(MessageFormat.format("銆恵0}銆戣鍙栧弻宸ヤ綅鍫嗗灈鏈簆lc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()));
             return;
         }
-
         crnProtocol.setMode(crnStatus.getMode());
 
         //宸ヤ綅1
@@ -180,6 +180,7 @@
         crnProtocol.setLoaded(crnStatus.getLoaded());
         crnProtocol.setWalkPos(crnStatus.getWalkPos());
         crnProtocol.setLiftPos(crnStatus.getLiftPos());
+        crnProtocol.setTaskReceive(crnStatus.getTaskReceive());
 
         //宸ヤ綅2
         crnProtocol.setTaskNoTwo(crnStatus.getTaskNoTwo());
@@ -190,6 +191,7 @@
         crnProtocol.setLoadedTwo(crnStatus.getLoadedTwo());
         crnProtocol.setWalkPosTwo(crnStatus.getWalkPosTwo());
         crnProtocol.setLiftPosTwo(crnStatus.getLiftPosTwo());
+        crnProtocol.setTaskReceiveTwo(crnStatus.getTaskReceiveTwo());
 
         crnProtocol.setAlarm(crnStatus.getAlarm());
         crnProtocol.setTemp1(crnStatus.getTemp1());
@@ -276,10 +278,38 @@
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
         crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
-        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE.id.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);     // 浠诲姟纭
+        return crnCommand;
+    }
+
+    @Override
+    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);     // 浠诲姟纭
+        return crnCommand;
+    }
+
+    @Override
+    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));     // 鐩爣搴撲綅灞�
@@ -293,8 +323,7 @@
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
         crnCommand.setTaskNo(taskNo.shortValue()); // 宸ヤ綔鍙�
-        crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
-        crnCommand.setTaskMode(CrnTaskModeType.CRN_MOVE.id.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));     // 鐩爣搴撲綅灞�
@@ -307,8 +336,7 @@
         DualCrnCommand crnCommand = new DualCrnCommand();
         crnCommand.setCrnNo(crnNo); // 鍫嗗灈鏈虹紪鍙�
         crnCommand.setTaskNo((short) 0); // 宸ヤ綔鍙�
-        crnCommand.setAckFinish((short) 1);  // 浠诲姟瀹屾垚纭浣�
-        crnCommand.setTaskMode(CrnTaskModeType.NONE.id.shortValue()); // 浠诲姟妯″紡
+        crnCommand.setTaskMode(DualCrnTaskModeType.CONFIRM.id.shortValue()); // 浠诲姟妯″紡:  纭
         crnCommand.setSourcePosX((short)0);     // 婧愬簱浣嶆帓
         crnCommand.setSourcePosY((short)0);     // 婧愬簱浣嶅垪
         crnCommand.setSourcePosZ((short)0);     // 婧愬簱浣嶅眰
diff --git a/src/main/webapp/components/WatchDualCrnCard.js b/src/main/webapp/components/WatchDualCrnCard.js
index 5c306ab..b047a24 100644
--- a/src/main/webapp/components/WatchDualCrnCard.js
+++ b/src/main/webapp/components/WatchDualCrnCard.js
@@ -24,6 +24,8 @@
               </el-select>
             </div>
             <div style="margin-bottom: 10px;"><el-button @click="controlCommandTransport()" size="mini">鍙栨斁璐�</el-button></div>
+            <div style="margin-bottom: 10px;"><el-button @click="controlCommandPickup()" size="mini">鍙栬揣</el-button></div>
+            <div style="margin-bottom: 10px;"><el-button @click="controlCommandPutdown()" size="mini">鏀捐揣</el-button></div>
             <div style="margin-bottom: 10px;"><el-button @click="controlCommandMove()" size="mini">绉诲姩</el-button></div>
             <div style="margin-bottom: 10px;"><el-button @click="controlCommandTaskComplete()" size="mini">浠诲姟瀹屾垚</el-button></div>
           </div>
@@ -61,6 +63,8 @@
                 <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="璧拌閫熷害锛坢/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>
@@ -173,6 +177,56 @@
         },
       });
     },
+    controlCommandPickup() {
+      let that = this;
+      $.ajax({
+        url: baseUrl + "/dualcrn/command/pick",
+        headers: {
+          token: localStorage.getItem("token"),
+        },
+        contentType: "application/json",
+        method: "post",
+        data: JSON.stringify(that.controlParam),
+        success: (res) => {
+          if (res.code == 200) {
+            that.$message({
+              message: res.msg,
+              type: "success",
+            });
+          } else {
+            that.$message({
+              message: res.msg,
+              type: "warning",
+            });
+          }
+        },
+      });
+    },
+    controlCommandPutdown() {
+      let that = this;
+      $.ajax({
+        url: baseUrl + "/dualcrn/command/put",
+        headers: {
+          token: localStorage.getItem("token"),
+        },
+        contentType: "application/json",
+        method: "post",
+        data: JSON.stringify(that.controlParam),
+        success: (res) => {
+          if (res.code == 200) {
+            that.$message({
+              message: res.msg,
+              type: "success",
+            });
+          } else {
+            that.$message({
+              message: res.msg,
+              type: "warning",
+            });
+          }
+        },
+      });
+    },
     controlCommandMove() {
       let that = this;
       $.ajax({

--
Gitblit v1.9.1