From ad79ba405b2d1ac96423f88f4e8a76c584b9d38a Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期一, 09 二月 2026 15:57:06 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java       |  156 ++++++++
 src/main/java/com/zy/core/utils/WmsOperateUtils.java                |  111 +++++
 src/main/java/com/zy/core/network/entity/ZyCrnStatusEntity.java     |    6 
 src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java         |   64 ++
 src/main/java/com/zy/asrs/entity/BasCrnp.java                       |    7 
 src/main/resources/mapper/BasCrnpMapper.xml                         |    1 
 pom.xml                                                             |    2 
 src/main/java/com/zy/core/model/protocol/CrnProtocol.java           |    5 
 src/main/java/com/zy/common/model/StartupDto.java                   |   12 
 src/main/java/com/zy/core/network/real/ZyStationRealConnect.java    |   27 
 src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java |    2 
 src/main/java/com/zy/core/model/protocol/StationProtocol.java       |    3 
 src/main/java/com/zy/core/network/ZyCrnConnectDriver.java           |   12 
 src/main/java/com/zy/asrs/utils/Utils.java                          |   34 +
 src/main/java/com/zy/core/thread/impl/ZyStationThread.java          |    1 
 src/main/webapp/views/index.html                                    |    8 
 src/main/java/com/zy/asrs/domain/NotifyDto.java                     |    3 
 src/main/java/com/zy/core/thread/CrnThread.java                     |    5 
 src/main/webapp/static/js/common.js                                 |    2 
 src/main/java/com/zy/common/service/CommonService.java              |   45 +
 src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java        |   27 +
 src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java        |  201 +++++++++-
 src/main/java/com/zy/core/plugin/FakeProcess.java                   |   13 
 src/main/java/com/zy/core/utils/StationOperateProcessUtils.java     |  123 +++++
 src/main/java/com/zy/asrs/controller/OpenController.java            |   42 ++
 src/main/java/com/zy/asrs/entity/WrkMast.java                       |    7 
 src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java     |    3 
 src/main/resources/mapper/WrkMastMapper.xml                         |    1 
 src/main/java/com/zy/asrs/domain/param/CreateOutTaskParam.java      |    3 
 src/main/java/com/zy/asrs/task/NotifyScheduler.java                 |    2 
 src/main/java/com/zy/core/model/command/CrnCommand.java             |    6 
 src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java    |  111 ++---
 src/main/java/com/zy/asrs/domain/param/CreateLocMoveTaskParam.java  |    2 
 src/main/webapp/views/locMast/locMast_detail.html                   |    6 
 src/main/java/com/zy/core/plugin/NormalProcess.java                 |   41 +
 src/main/java/com/zy/core/enums/WrkStsType.java                     |    1 
 src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java           |    2 
 src/main/java/com/zy/common/model/MonitorParam.java                 |    8 
 src/main/java/com/zy/asrs/domain/param/CreateInTaskParam.java       |   16 
 src/main/java/com/zy/core/network/api/ZyCrnConnectApi.java          |    5 
 src/main/java/com/zy/core/enums/RedisKeyType.java                   |    1 
 src/main/resources/application.yml                                  |    7 
 42 files changed, 957 insertions(+), 177 deletions(-)

diff --git a/pom.xml b/pom.xml
index a5e538c..51cee7e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -144,7 +144,7 @@
     </dependencies>
 
     <build>
-        <finalName>wcs</finalName>
+        <finalName>hcwcs</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
diff --git a/src/main/java/com/zy/asrs/controller/OpenController.java b/src/main/java/com/zy/asrs/controller/OpenController.java
index abc031f..138fc9c 100644
--- a/src/main/java/com/zy/asrs/controller/OpenController.java
+++ b/src/main/java/com/zy/asrs/controller/OpenController.java
@@ -5,13 +5,16 @@
 import com.core.common.R;
 import com.core.exception.CoolException;
 import com.zy.asrs.domain.param.*;
+import com.zy.asrs.entity.BasDevp;
 import com.zy.asrs.entity.DeviceConfig;
 import com.zy.asrs.entity.LocMast;
 import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.BasDevpService;
 import com.zy.asrs.service.DeviceConfigService;
 import com.zy.asrs.service.LocMastService;
 import com.zy.asrs.service.WrkMastService;
 import com.zy.common.annotations.OpenApiLog;
+import com.zy.common.model.MonitorParam;
 import com.zy.common.service.CommonService;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.SlaveType;
@@ -58,6 +61,8 @@
     private ConfigService configService;
     @Autowired
     private DeviceConfigService deviceConfigService;
+    @Autowired
+    private BasDevpService basDevpService;
 
     // 绉诲簱浠诲姟
     @PostMapping("/createLocMoveTask")
@@ -352,4 +357,41 @@
         return R.ok();
     }
 
+    // 鍙嶉浠诲姟鎵ц缁撴灉
+    @PostMapping("/stationStatus")
+    public R stationStatus(@RequestBody MonitorParam param){
+        if(param == null || param.getStationIds().length == 0){
+            return R.error("杈撳叆鐨勫弬鏁颁负绌�");
+        }
+        List<StationProtocol> basDevps  =  new ArrayList<>();
+        Boolean flag = false;
+        // 鑾峰彇杈撻�佺珯鐐规暟鎹�
+        ArrayList<StationProtocol> stationProtocols = new ArrayList<>();
+        List<DeviceConfig> stationList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
+                .eq("device_type", String.valueOf(SlaveType.Devp)));
+        for (DeviceConfig device : stationList) {
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, device.getDeviceNo());
+            if (stationThread == null) {
+                continue;
+            }
+
+            List<StationProtocol> stationProtocolList = stationThread.getStatus();
+            if (stationProtocolList == null) {
+                continue;
+            }
+            for (StationProtocol stationProtocol : stationProtocolList) {
+                for (int i = 0; i < param.getStationIds().length; i++) {
+                    if (stationProtocol.getStationId().equals(param.getStationIds()[i])){
+                        flag = true;
+                        basDevps.add(stationProtocol);
+                    }
+                }
+            }
+        }
+        if(flag){
+            return R.ok().add(basDevps);
+        }
+        return null;
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/domain/NotifyDto.java b/src/main/java/com/zy/asrs/domain/NotifyDto.java
index eb15f4b..3a37ed2 100644
--- a/src/main/java/com/zy/asrs/domain/NotifyDto.java
+++ b/src/main/java/com/zy/asrs/domain/NotifyDto.java
@@ -40,4 +40,7 @@
     //涓婃閲嶈瘯鏃堕棿
     private Long lastRetryTime = 0L;
 
+    //閲嶉噺
+    private Double weight;
+
 }
diff --git a/src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java b/src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java
index f9d1067..716894e 100644
--- a/src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java
+++ b/src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java
@@ -4,7 +4,7 @@
     //浠诲姟
     TASK_COMPLETE("task_complete", "浠诲姟瀹屾垚"),
     TASK_CANCEL("task_cancel", "浠诲姟鍙栨秷"),
-
+    ARRIVE_AT_THE_DESTINATION("task_arrive", "鍒拌揪鐩殑鍦�"),
     CRN_IN_TASK_RUN("crn_in_task_run", "鍫嗗灈鏈哄叆搴撲换鍔℃墽琛屼腑"),
     CRN_IN_TASK_COMPLETE("crn_in_task_complete", "鍫嗗灈鏈哄叆搴撲换鍔℃墽琛屽畬鎴�"),
     CRN_OUT_TASK_RUN("crn_out_task_run", "鍫嗗灈鏈哄嚭搴撲换鍔℃墽琛屼腑"),
diff --git a/src/main/java/com/zy/asrs/domain/param/CreateInTaskParam.java b/src/main/java/com/zy/asrs/domain/param/CreateInTaskParam.java
index db454c1..0d9a783 100644
--- a/src/main/java/com/zy/asrs/domain/param/CreateInTaskParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/CreateInTaskParam.java
@@ -5,22 +5,20 @@
 @Data
 public class CreateInTaskParam {
 
-    //wms浠诲姟鍙�
-    private String taskNo;
+    private String sourceStaNo;
 
-    //婧愮珯
-    private Integer sourceStaNo;
+    private String staNo;
 
-    //鐩爣绔�
-    private Integer staNo;
+    private Integer crnNo;
 
-    //鐩爣搴撲綅
     private String locNo;
 
-    //鏉$爜
+    private Integer workNo;
+
+    private String taskNo;
+
     private String barcode;
 
-    //浠诲姟浼樺厛绾�
     private Integer taskPri;
 
 }
diff --git a/src/main/java/com/zy/asrs/domain/param/CreateLocMoveTaskParam.java b/src/main/java/com/zy/asrs/domain/param/CreateLocMoveTaskParam.java
index fbf9138..baa8a3e 100644
--- a/src/main/java/com/zy/asrs/domain/param/CreateLocMoveTaskParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/CreateLocMoveTaskParam.java
@@ -17,4 +17,6 @@
     //浠诲姟浼樺厛绾�
     private Integer taskPri;
 
+    //鎵樼洏鐮�
+    private String barcode;
 }
diff --git a/src/main/java/com/zy/asrs/domain/param/CreateOutTaskParam.java b/src/main/java/com/zy/asrs/domain/param/CreateOutTaskParam.java
index 2ddcf09..f1bd6e9 100644
--- a/src/main/java/com/zy/asrs/domain/param/CreateOutTaskParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/CreateOutTaskParam.java
@@ -9,6 +9,9 @@
     private String taskNo;
 
     //鍑哄簱搴撲綅
+    private String sourceLocNo;
+
+    //鐩爣搴撲綅
     private String locNo;
 
     //浠诲姟浼樺厛绾�
diff --git a/src/main/java/com/zy/asrs/entity/BasCrnp.java b/src/main/java/com/zy/asrs/entity/BasCrnp.java
index 8a24879..37193d3 100644
--- a/src/main/java/com/zy/asrs/entity/BasCrnp.java
+++ b/src/main/java/com/zy/asrs/entity/BasCrnp.java
@@ -111,6 +111,13 @@
     @TableField("max_out_task")
     private Integer maxOutTask;
 
+    /**
+     * 鎸囧畾搴撲綅闇�瑕佷寒鐏�
+     */
+    @ApiModelProperty(value= "鏈�澶у嚭搴撲换鍔℃暟")
+    @TableField("arr")
+    private String arr;
+
     public BasCrnp() {}
 
     public BasCrnp(Integer status,Integer wrkNo,String inEnable,String outEnable,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
diff --git a/src/main/java/com/zy/asrs/entity/WrkMast.java b/src/main/java/com/zy/asrs/entity/WrkMast.java
index e339021..aa69cc8 100644
--- a/src/main/java/com/zy/asrs/entity/WrkMast.java
+++ b/src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -189,6 +189,13 @@
     @TableField(value = "batch_seq")
     private Integer batchSeq;
 
+    /**
+     * 閲嶉噺
+     */
+    @ApiModelProperty(value= "閲嶉噺")
+    @TableField(value = "weight")
+    private Double weight;
+
     public String getWrkSts$(){
         BasWrkStatusMapper mapper = SpringUtils.getBean(BasWrkStatusMapper.class);
         BasWrkStatus entity = mapper.selectById(this.wrkSts);
diff --git a/src/main/java/com/zy/asrs/task/NotifyScheduler.java b/src/main/java/com/zy/asrs/task/NotifyScheduler.java
index 8e40b08..9bc36ed 100644
--- a/src/main/java/com/zy/asrs/task/NotifyScheduler.java
+++ b/src/main/java/com/zy/asrs/task/NotifyScheduler.java
@@ -107,6 +107,8 @@
                 continue;
             }
             NotifyDto notifyDto = (NotifyDto) object;
+            int id =notifyDto.getId().intValue();
+            notifyDto.setId((Long.valueOf(id)));
 
             if (System.currentTimeMillis() - notifyDto.getLastRetryTime() < 1000 * notifyDto.getRetryTime()) {
                 continue;
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index db3a663..0cf04f8 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -680,4 +680,38 @@
 
         return null;
     }
+    //灏唚ms搴撲綅鍙疯浆鎹㈡垚wcs搴撲綅鍙�
+    public static String WMSLocToWCSLoc(String locNo) {
+        String row = locNo.substring(0, 2);
+        int i = 0;
+        for (char c : row.toCharArray()) {
+            if (c == '0') {
+                i++;
+            }else {
+                break;
+            }
+        }
+        row = row.substring(i);
+        int j = 0;
+        String boy = locNo.substring(2, 5);
+        for (char c : boy.toCharArray()) {
+            if (c == '0') {
+                j++;
+            }else {
+                break;
+            }
+        }
+        boy = boy.substring(j);
+        int k = 0;
+        String lev = locNo.substring(5);
+        for (char c : lev.toCharArray()) {
+            if (c == '0') {
+                k++;
+            }else {
+                break;
+            }
+        }
+        lev = lev.substring(k);
+        return row + "-" + boy + "-" + lev;
+    }
 }
diff --git a/src/main/java/com/zy/common/model/MonitorParam.java b/src/main/java/com/zy/common/model/MonitorParam.java
new file mode 100644
index 0000000..d496e4c
--- /dev/null
+++ b/src/main/java/com/zy/common/model/MonitorParam.java
@@ -0,0 +1,8 @@
+package com.zy.common.model;
+
+import lombok.Data;
+
+@Data
+public class MonitorParam {
+    Integer[] stationIds;
+}
diff --git a/src/main/java/com/zy/common/model/StartupDto.java b/src/main/java/com/zy/common/model/StartupDto.java
index 58de959..38548e7 100644
--- a/src/main/java/com/zy/common/model/StartupDto.java
+++ b/src/main/java/com/zy/common/model/StartupDto.java
@@ -5,9 +5,19 @@
 @Data
 public class StartupDto {
 
+    private Integer sourceStaNo;
+
+    private Integer staNo;
+
+    private Integer crnNo;
+
     private String locNo;
 
-    private String taskNo;
+    private Integer workNo;
+
+    private Integer taskNo;
+
+    private String barcode;
 
     private Integer taskPri;
 
diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index 6026fd8..52fba06 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -12,11 +12,13 @@
 import com.zy.common.utils.NavigateUtils;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.News;
-import com.zy.core.enums.RedisKeyType;
-import com.zy.core.enums.SlaveType;
-import com.zy.core.enums.WrkIoType;
-import com.zy.core.enums.WrkStsType;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.*;
 import com.zy.core.model.StationObjModel;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.StationCommand;
+import com.zy.core.thread.StationThread;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -177,7 +179,10 @@
         if (!sourceCrnResult.getCrnNo().equals(targetCrnResult.getCrnNo())) {
             throw new CoolException("婧愬簱浣嶅拰鐩爣搴撲綅涓嶅湪鍚屼竴宸烽亾");
         }
-
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wms_wrk_no", param.getTaskNo()));
+        if (!wrkMasts.isEmpty()) {
+            throw new CoolException("宸茬粡鐢熸垚鏀逛换鍔″彿浠诲姟="+param.getTaskNo());
+        }
         // 鑾峰彇宸ヤ綔鍙�
         int workNo = getWorkNo(WrkIoType.LOC_MOVE.id);
         // 淇濆瓨宸ヤ綔妗�
@@ -222,6 +227,7 @@
     //鍏ュ簱浠诲姟
     public WrkMast createInTask(CreateInTaskParam param) {
         Date now = new Date();
+//        String s = Utils.WMSLocToWCSLoc(param.getLocNo());
         LocMast locMast = locMastService.queryByLoc(param.getLocNo());
         if (null == locMast) {
             throw new CoolException(param.getLocNo() + "鐩爣搴撲綅涓嶅瓨鍦�");
@@ -248,16 +254,22 @@
         WrkMast wrkMast = new WrkMast();
         wrkMast.setWrkNo(workNo);
         wrkMast.setIoTime(now);
-        wrkMast.setWrkSts(WrkStsType.NEW_INBOUND.sts); // 宸ヤ綔鐘舵�侊細1.鐢熸垚鍏ュ簱浠诲姟
+        wrkMast.setWrkSts(WrkStsType.INBOUND_DEVICE_RUN.sts); // 宸ヤ綔鐘舵�侊細3.璁惧鎼繍涓�
         wrkMast.setIoType(WrkIoType.IN.id); // 鍏ュ嚭搴撶姸鎬侊細 1.鍏ュ簱
         wrkMast.setIoPri(ioPri);
         wrkMast.setLocNo(param.getLocNo()); // 鐩爣搴撲綅
-        wrkMast.setSourceStaNo(param.getSourceStaNo());//婧愮珯
-        wrkMast.setStaNo(param.getStaNo());//鐩爣绔�
-        wrkMast.setWmsWrkNo(param.getTaskNo());
+        wrkMast.setSourceStaNo(Integer.valueOf(param.getSourceStaNo()));//婧愮珯
+        wrkMast.setStaNo(Integer.valueOf(param.getSourceStaNo()));//鐩爣绔�
+        wrkMast.setWmsWrkNo(String.valueOf(param.getTaskNo()));
         wrkMast.setBarcode(param.getBarcode());
         wrkMast.setAppeTime(now);
         wrkMast.setModiTime(now);
+        StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, 1);
+
+        StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO,
+                wrkMast.getWrkNo(), Integer.valueOf(param.getSourceStaNo()), Integer.valueOf(param.getSourceStaNo()), 0);
+
+        MessageQueue.offer(SlaveType.Devp, 1, new Task(2, command));
 
         if (findCrnResult.getCrnType().equals(SlaveType.Crn)) {
             wrkMast.setCrnNo(findCrnResult.getCrnNo());
@@ -285,7 +297,7 @@
     //鍑哄簱浠诲姟
     public boolean createOutTask(CreateOutTaskParam param) {
         Date now = new Date();
-        LocMast locMast = locMastService.queryByLoc(param.getLocNo());
+        LocMast locMast = locMastService.queryByLoc(param.getSourceLocNo());
         if (null == locMast) {
             throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
         }
@@ -336,6 +348,19 @@
         wrkMast.setIoType(WrkIoType.OUT.id); // 鍏ュ嚭搴撶姸鎬侊細 101.鍑哄簱
         wrkMast.setIoPri(ioPri);
         wrkMast.setSourceLocNo(locMast.getLocNo()); // 婧愬簱浣�
+
+        if(!Cools.isEmpty(param.getLocNo())) {
+            //鐩爣绔欑偣
+            LocMast locMast1 = locMastService.queryByLoc(param.getLocNo());
+            if (null == locMast1) {
+                throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
+            }
+
+            if (!locMast1.getLocSts().equals("O")) {
+                throw new CoolException("鐩爣搴撲綅涓嶅浜庡湪搴撶姸鎬�");
+            }
+            wrkMast.setLocNo(locMast1.getLocNo()); //鐩爣搴撲綅
+        }
         wrkMast.setSourceStaNo(sourceStationId);//婧愮珯
         wrkMast.setStaNo(staNo);//鐩爣绔�
         wrkMast.setWmsWrkNo(param.getTaskNo());
diff --git a/src/main/java/com/zy/core/enums/RedisKeyType.java b/src/main/java/com/zy/core/enums/RedisKeyType.java
index 566de01..01de1e1 100644
--- a/src/main/java/com/zy/core/enums/RedisKeyType.java
+++ b/src/main/java/com/zy/core/enums/RedisKeyType.java
@@ -41,6 +41,7 @@
     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_"),
+    STATION_OUT_EXECUTE_DESTINATION_LIMIT("station_out_execute_destination_limit_"),
     CHECK_STATION_RUN_BLOCK_LIMIT_("check_station_run_block_limit_"),
     CHECK_SHALLOW_LOC_STATUS_LIMIT("check_shallow_loc_status_limit_"),
     GENERATE_ENABLE_IN_STATION_DATA_LIMIT("generate_enable_in_station_data_limit_"),
diff --git a/src/main/java/com/zy/core/enums/WrkStsType.java b/src/main/java/com/zy/core/enums/WrkStsType.java
index 59b4665..0b702d2 100644
--- a/src/main/java/com/zy/core/enums/WrkStsType.java
+++ b/src/main/java/com/zy/core/enums/WrkStsType.java
@@ -15,6 +15,7 @@
     OUTBOUND_RUN(102, "璁惧鎼繍涓�"),
     OUTBOUND_RUN_COMPLETE(103, "璁惧鎼繍瀹屾垚"),
     STATION_RUN(104, "绔欑偣杩愯涓�"),
+    ARRIVE_AT_THE_DESTINATION(105, "鍒拌揪鐩殑鍦�"),
     COMPLETE_OUTBOUND(109, "鍑哄簱瀹屾垚"),
     SETTLE_OUTBOUND(110, "鍑哄簱搴撳瓨鏇存柊"),
 
diff --git a/src/main/java/com/zy/core/model/command/CrnCommand.java b/src/main/java/com/zy/core/model/command/CrnCommand.java
index dcc61c9..c0f42d8 100644
--- a/src/main/java/com/zy/core/model/command/CrnCommand.java
+++ b/src/main/java/com/zy/core/model/command/CrnCommand.java
@@ -53,4 +53,10 @@
     // 浠诲姟纭 0锛氭湭纭 1锛氬凡纭
     private Integer command = 0;
 
+    private int index;
+
+    private short value;
+
+    private String locNo;
+
 }
diff --git a/src/main/java/com/zy/core/model/protocol/CrnProtocol.java b/src/main/java/com/zy/core/model/protocol/CrnProtocol.java
index ffceec0..d69f099 100644
--- a/src/main/java/com/zy/core/model/protocol/CrnProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -173,6 +173,11 @@
      */
     private Map<String, Object> extend;
 
+    /**
+     * DB110.200 - DB110.398 data
+     */
+    private short[] db110Data;
+
     public void setMode(Integer mode) {
         this.mode = mode;
         this.modeType = CrnModeType.get(mode);
diff --git a/src/main/java/com/zy/core/model/protocol/StationProtocol.java b/src/main/java/com/zy/core/model/protocol/StationProtocol.java
index c2c9f52..b632d03 100644
--- a/src/main/java/com/zy/core/model/protocol/StationProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/StationProtocol.java
@@ -63,6 +63,9 @@
     */
    private Map<String, Object> extend;
 
+   //寮傚父
+    private String systemWarning;
+
     @Override
     public StationProtocol clone() {
         try {
diff --git a/src/main/java/com/zy/core/network/ZyCrnConnectDriver.java b/src/main/java/com/zy/core/network/ZyCrnConnectDriver.java
index 48a8a51..e885eb5 100644
--- a/src/main/java/com/zy/core/network/ZyCrnConnectDriver.java
+++ b/src/main/java/com/zy/core/network/ZyCrnConnectDriver.java
@@ -97,4 +97,16 @@
         return zyCrnConnectApi.sendCommand(command);
     }
 
+    public CommandResponse sendCommand1(CrnCommand command) {
+        return zyCrnConnectApi.sendCommand1(command);
+    }
+
+    public CommandResponse sendCommand2(CrnCommand command) {
+        return zyCrnConnectApi.sendCommand2(command);
+    }
+
+    public CommandResponse sendCommand3(CrnCommand command) {
+        return zyCrnConnectApi.sendCommand3(command);
+    }
+
 }
diff --git a/src/main/java/com/zy/core/network/api/ZyCrnConnectApi.java b/src/main/java/com/zy/core/network/api/ZyCrnConnectApi.java
index ab07f10..3824f39 100644
--- a/src/main/java/com/zy/core/network/api/ZyCrnConnectApi.java
+++ b/src/main/java/com/zy/core/network/api/ZyCrnConnectApi.java
@@ -14,4 +14,9 @@
 
     CommandResponse sendCommand(CrnCommand command);//涓嬪彂鍛戒护
 
+    CommandResponse sendCommand1(CrnCommand command);
+
+    CommandResponse sendCommand2(CrnCommand command);
+
+    CommandResponse sendCommand3(CrnCommand command);
 }
diff --git a/src/main/java/com/zy/core/network/entity/ZyCrnStatusEntity.java b/src/main/java/com/zy/core/network/entity/ZyCrnStatusEntity.java
index 9ddfe6b..a86dc70 100644
--- a/src/main/java/com/zy/core/network/entity/ZyCrnStatusEntity.java
+++ b/src/main/java/com/zy/core/network/entity/ZyCrnStatusEntity.java
@@ -122,4 +122,10 @@
 
     private Integer temp4;
 
+    private Double weight;
+
+    /**
+     * DB110.200 - DB110.398 data
+     */
+    private short[] db110Data;
 }
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 33f12eb..884166e 100644
--- a/src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java
+++ b/src/main/java/com/zy/core/network/entity/ZyDualCrnStatusEntity.java
@@ -145,4 +145,6 @@
     //鏉$爜
     private String barcode;
 
+    private Float weight;
+
 }
diff --git a/src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java b/src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java
index 570b9aa..26986f6 100644
--- a/src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyCrnFakeConnect.java
@@ -55,6 +55,33 @@
         return response;
     }
 
+    @Override
+    public CommandResponse sendCommand1(CrnCommand command) {
+        CommandResponse response = new CommandResponse(false);
+        if (command.getTaskMode().intValue() == CrnTaskModeType.LOC_MOVE.id) {
+            //鍙栨斁璐�
+            executor.submit(() -> commandTake(command));
+        } else if (command.getTaskMode().intValue() == CrnTaskModeType.CRN_MOVE.id) {
+            //绉诲姩
+            executor.submit(() -> commandMove(command));
+        } else if (command.getTaskMode().intValue() == CrnTaskModeType.NONE.id) {
+            //澶嶄綅
+            executor.submit(() -> commandTaskComplete(command));
+        }
+        response.setResult(true);
+        return response;
+    }
+
+    @Override
+    public CommandResponse sendCommand2(CrnCommand command) {
+        return null;
+    }
+
+    @Override
+    public CommandResponse sendCommand3(CrnCommand command) {
+        return null;
+    }
+
     private void commandTaskComplete(CrnCommand command) {
         this.crnStatus.setTaskNo(0);
         this.crnStatus.setStatus(CrnStatusType.IDLE.id);
diff --git a/src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java b/src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java
index ba2a839..0568d82 100644
--- a/src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyCrnRealConnect.java
@@ -5,12 +5,9 @@
 import HslCommunication.Profinet.Siemens.SiemensPLCS;
 import HslCommunication.Profinet.Siemens.SiemensS7Net;
 import com.alibaba.fastjson.JSON;
+import com.core.common.Cools;
 import com.core.common.DateUtils;
-import com.core.common.SpringUtils;
-import com.zy.asrs.entity.BasCrnpOpt;
 import com.zy.asrs.entity.DeviceConfig;
-import com.zy.asrs.service.BasCrnpOptService;
-import com.zy.asrs.utils.Utils;
 import com.zy.core.News;
 import com.zy.core.cache.OutputQueue;
 import com.zy.core.model.CommandResponse;
@@ -34,9 +31,9 @@
         boolean connected = false;
         siemensNet = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
         OperateResult connect = siemensNet.ConnectServer();
-        if(connect.IsSuccess){
+        if (connect.IsSuccess) {
             connected = true;
-            OutputQueue.CRN.offer(MessageFormat.format( "銆恵0}銆戝爢鍨涙満plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()));
+            OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝爢鍨涙満plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()));
             News.info("鍫嗗灈鏈簆lc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}]", deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort());
         } else {
             OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝爢鍨涙満plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()));
@@ -55,7 +52,7 @@
     @Override
     public ZyCrnStatusEntity getStatus() {
         try {
-            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 56);
+            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 60);
             if (result.IsSuccess) {
                 ZyCrnStatusEntity crnStatus = new ZyCrnStatusEntity();
                 crnStatus.setCrnNo(deviceConfig.getDeviceNo());
@@ -78,6 +75,14 @@
                 crnStatus.setYDistance((double) siemensNet.getByteTransform().TransSingle(result.Content, 44));
                 crnStatus.setXDuration((double) siemensNet.getByteTransform().TransSingle(result.Content, 48));
                 crnStatus.setYDuration((double) siemensNet.getByteTransform().TransSingle(result.Content, 52));
+                crnStatus.setWeight((double) siemensNet.getByteTransform().TransSingle(result.Content, 56));
+
+                // 璇诲彇DB110.200 - DB110.398
+                OperateResultExOne<byte[]> resultDb110 = siemensNet.Read("DB110.200", (short) 200);
+                if (resultDb110.IsSuccess) {
+                    short[] db110Data = siemensNet.getByteTransform().TransInt16(resultDb110.Content, 0, 100);
+                    crnStatus.setDb110Data(db110Data);
+                }
 
                 return crnStatus;
             } else {
@@ -103,23 +108,20 @@
             }
 
             int writeAck = 0;
-            boolean commandResult = false;
             do {
-                OperateResultExOne<byte[]> commandReadResult = siemensNet.Read("DB100.0", (short) 2);
-                if (commandReadResult.IsSuccess) {
-                    short commandRead = siemensNet.getByteTransform().TransInt16(commandReadResult.Content, 0);
-                    if (commandRead == 1) {
-                        Thread.sleep(500);
-                    }else {
-                        commandResult = true;
+                OperateResult resultAck = siemensNet.Write("DB100.0", (short) 0);
+                if (resultAck.IsSuccess) {
+                    Thread.sleep(200);
+                    OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 2);
+                    short ack = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
+                    if (ack != 0) {
+                        writeAck++;
+                    } else {
+                        News.info("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}", command.getCrnNo(), "ack澶嶄綅瀹屾垚");
+                        break;
                     }
                 }
             } while (writeAck < 5);
-
-            if (!commandResult) {
-                response.setMessage("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}" + command.getCrnNo() + "浠诲姟鐘舵�佷綅寮傚父");
-                return response;
-            }
 
             short[] array = new short[9];
             array[0] = (short) 0;
@@ -160,7 +162,7 @@
                 Thread.sleep(500);
             } while (idx < 5);
 
-            OperateResult confirmResult = siemensNet.Write("DB100.0", (short) 1);
+            OperateResult confirmResult = siemensNet.Write("DB100.18", (short) 1);
             if (!confirmResult.IsSuccess) {
                 News.error("鍫嗗灈鏈哄啓鍏ョ‘璁ゆ暟鎹け璐� ===>> [id:{}]", command.getCrnNo());
                 response.setMessage("鍫嗗灈鏈哄啓鍏ョ‘璁ゆ暟鎹け璐�");
@@ -179,6 +181,163 @@
                 response.setMessage("鍛戒护涓嬪彂澶辫触");
             }
 
+            if (!Cools.isEmpty(command.getLocNo())){
+                OperateResult resultAck = siemensNet.Write("DB110." + command.getIndex() * 2, command.getValue());
+                if (resultAck.IsSuccess) {
+                    News.info("搴撲綅鐧借壊鐏懡浠や笅鍙慬locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+                } else {
+                    News.error("搴撲綅鐧借壊鐏懡浠や笅鍙戝け璐locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+                }
+            }
+
+            return response;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return response;
+    }
+
+    @Override
+    public CommandResponse sendCommand1(CrnCommand command) {
+        CommandResponse response = new CommandResponse(false);
+        try {
+            if (null == command) {
+                News.error("鍫嗗灈鏈哄啓鍏ュ懡浠や负绌�");
+                response.setMessage("鍫嗗灈鏈哄啓鍏ュ懡浠や负绌�");
+                return response;
+            }
+
+            int writeAck = 0;
+            do {
+                OperateResult resultAck = siemensNet.Write("DB100.0", (short) 0);
+                if (resultAck.IsSuccess) {
+                    Thread.sleep(200);
+                    OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 2);
+                    short ack = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
+                    if (ack != 0) {
+                        writeAck++;
+                    } else {
+                        News.info("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}", command.getCrnNo(), "ack澶嶄綅瀹屾垚");
+                        break;
+                    }
+                }
+            } while (writeAck < 5);
+
+            short[] array = new short[10];
+            array[0] = (short) 1;
+            array[1] = command.getTaskNo().shortValue();
+            array[2] = command.getTaskMode().shortValue();
+            array[3] = command.getSourcePosX().shortValue();
+            array[4] = command.getSourcePosY().shortValue();
+            array[5] = command.getSourcePosZ().shortValue();
+            array[6] = command.getDestinationPosX().shortValue();
+            array[7] = command.getDestinationPosY().shortValue();
+            array[8] = command.getDestinationPosZ().shortValue();
+            array[9] = (short) 0;
+
+            OperateResult result = siemensNet.Write("DB100.0", array);
+            if (!result.IsSuccess) {
+                response.setMessage("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}" + command.getCrnNo() + "浠诲姟鐘舵�佷綅寮傚父");
+                return response;
+            }
+
+            int idx = 0;
+            do {
+                OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
+                if (resultRead.IsSuccess) {
+                    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("DB100.0", array);
+                    } else {
+                        break;
+                    }
+                }
+                idx++;
+                Thread.sleep(500);
+            } while (idx < 5);
+
+            if (result != null && result.IsSuccess) {
+                News.info("鍫嗗灈鏈哄懡浠や笅鍙慬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("鍐欏叆鍫嗗灈鏈簆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 (!Cools.isEmpty(command.getLocNo())){
+                OperateResult resultAck = siemensNet.Write("DB110." + command.getIndex() * 2, command.getValue());
+                if (resultAck.IsSuccess) {
+                    Integer index = command.getIndex()*2 + 200;
+                    OperateResult resultAck1 = siemensNet.Write("DB110." + index, command.getValue());
+                    if (resultAck1.IsSuccess) {
+                        News.info("搴撲綅姗欒壊鎸夐挳鍛戒护涓嬪彂[locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+                    } else {
+                        News.error("搴撲綅鐧借壊鐏懡浠や笅鍙戝け璐locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+                    }
+                    News.info("搴撲綅鐧借壊鐏懡浠や笅鍙慬locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+                } else {
+                    News.error("搴撲綅鐧借壊鐏懡浠や笅鍙戝け璐locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+                }
+            }
+
+            return response;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return response;
+    }
+
+    @Override
+    public CommandResponse sendCommand2(CrnCommand command) {
+        CommandResponse response = new CommandResponse(false);
+        try {
+            if (null == command) {
+                News.error("鍫嗗灈鏈哄啓鍏ュ懡浠や负绌�");
+                response.setMessage("鍫嗗灈鏈哄啓鍏ュ懡浠や负绌�");
+                return response;
+            }
+
+
+            OperateResult resultAck = siemensNet.Write("DB110." + command.getIndex() * 2, command.getValue());
+            if (resultAck.IsSuccess) {
+                News.info("搴撲綅鐧借壊鐏懡浠や笅鍙慬locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+            } else {
+                News.error("搴撲綅鐧借壊鐏懡浠や笅鍙戝け璐locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+            }
+            return response;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return response;
+    }
+
+    @Override
+    public CommandResponse sendCommand3(CrnCommand command) {
+        CommandResponse response = new CommandResponse(false);
+        try {
+            if (null == command) {
+                News.error("鍫嗗灈鏈哄啓鍏ュ懡浠や负绌�");
+                response.setMessage("鍫嗗灈鏈哄啓鍏ュ懡浠や负绌�");
+                return response;
+            }
+            Integer index = command.getIndex()*2 + 200;
+            OperateResult resultAck = siemensNet.Write("DB110." + index, command.getValue());
+            if (resultAck.IsSuccess) {
+                News.info("搴撲綅姗欒壊鎸夐挳鍛戒护涓嬪彂[locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+            } else {
+                News.error("搴撲綅鐧借壊鐏懡浠や笅鍙戝け璐locNo:{}] >>>>> {}", command.getLocNo(), command.getValue());
+            }
             return response;
         } catch (Exception e) {
             e.printStackTrace();
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 cd57da7..ca224d8 100644
--- a/src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyDualCrnRealConnect.java
@@ -58,43 +58,33 @@
     @Override
     public ZyDualCrnStatusEntity getStatus() {
         try {
-            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 66);
+            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 56);
             if (result.IsSuccess) {
                 ZyDualCrnStatusEntity crnStatus = new ZyDualCrnStatusEntity();
                 crnStatus.setCrnNo(deviceConfig.getDeviceNo());
-                crnStatus.setMode((int) siemensNet.getByteTransform().TransInt16(result.Content, 0));
 
-                //宸ヤ綅1
-                crnStatus.setTaskNo((int) siemensNet.getByteTransform().TransInt16(result.Content, 2));
-                crnStatus.setStatus((int) siemensNet.getByteTransform().TransInt16(result.Content, 4));
-                crnStatus.setForkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 6));
-                crnStatus.setLoaded((int) siemensNet.getByteTransform().TransInt16(result.Content, 8));
-                crnStatus.setTaskReceive((int) siemensNet.getByteTransform().TransInt16(result.Content, 10));
-
-                //宸ヤ綅2
-                crnStatus.setTaskNoTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 12));
-                crnStatus.setStatusTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 14));
-                crnStatus.setForkPosTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 16));
-                crnStatus.setLoadedTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 18));
-                crnStatus.setTaskReceiveTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 20));
-
-                crnStatus.setBay((int) siemensNet.getByteTransform().TransInt16(result.Content, 22));
-                crnStatus.setLevel((int) siemensNet.getByteTransform().TransInt16(result.Content, 24));
-                crnStatus.setLiftPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 26));
-                crnStatus.setWalkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 28));
-                crnStatus.setAlarm((int) siemensNet.getByteTransform().TransInt16(result.Content, 30));
-                crnStatus.setTemp1((int) siemensNet.getByteTransform().TransInt16(result.Content, 34));
-                crnStatus.setTemp2((int) siemensNet.getByteTransform().TransInt16(result.Content, 36));
-                crnStatus.setTemp3((int) siemensNet.getByteTransform().TransInt16(result.Content, 38));
-                crnStatus.setTemp4((int) siemensNet.getByteTransform().TransInt16(result.Content, 40));
-                crnStatus.setXSpeed((int) siemensNet.getByteTransform().TransInt16(result.Content, 42));
-                crnStatus.setYSpeed((int) siemensNet.getByteTransform().TransInt16(result.Content, 44));
-                crnStatus.setZSpeed((int) siemensNet.getByteTransform().TransInt16(result.Content, 46));
-                crnStatus.setXDistance((int) siemensNet.getByteTransform().TransInt16(result.Content, 48));
-                crnStatus.setYDistance((int) siemensNet.getByteTransform().TransInt16(result.Content, 50));
-                crnStatus.setXDuration((int) siemensNet.getByteTransform().TransInt16(result.Content, 52));
-                crnStatus.setYDuration((int) siemensNet.getByteTransform().TransInt16(result.Content, 54));
-                crnStatus.setGoodsType((int) siemensNet.getByteTransform().TransInt16(result.Content, 56));
+                crnStatus.setMode((int)siemensNet.getByteTransform().TransInt16(result.Content, 0));
+                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.setLiftPos((int)siemensNet.getByteTransform().TransInt16(result.Content, 12));
+                crnStatus.setWalkPos((int)siemensNet.getByteTransform().TransInt16(result.Content, 14));
+                crnStatus.setLoaded((int)siemensNet.getByteTransform().TransInt16(result.Content, 16));
+                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));
+                crnStatus.setTemp3((int)siemensNet.getByteTransform().TransInt16(result.Content, 24));
+                crnStatus.setTemp4((int)siemensNet.getByteTransform().TransInt16(result.Content, 26));
+                crnStatus.setXSpeed((int)siemensNet.getByteTransform().TransInt16(result.Content, 28));
+                crnStatus.setYSpeed((int)siemensNet.getByteTransform().TransInt16(result.Content, 32));
+                crnStatus.setZSpeed((int)siemensNet.getByteTransform().TransInt16(result.Content, 36));
+                crnStatus.setXDistance((int) siemensNet.getByteTransform().TransSingle(result.Content, 40));
+                crnStatus.setYDistance((int) siemensNet.getByteTransform().TransSingle(result.Content, 44));
+                crnStatus.setXDuration((int) siemensNet.getByteTransform().TransSingle(result.Content, 48));
+                crnStatus.setYDuration((int) siemensNet.getByteTransform().TransSingle(result.Content, 52));
+                crnStatus.setWeight(siemensNet.getByteTransform().TransSingle(result.Content, 56));
 
                 String barcode = siemensNet.getByteTransform().TransString(result.Content, 58, 8, "UTF-8");
                 crnStatus.setBarcode(barcode);
@@ -121,34 +111,37 @@
                  return response;
              }
 
+             int writeAck = 0;
+             do {
+                 OperateResult resultAck = siemensNet.Write("DB100.0", (short) 0);
+                 if (resultAck.IsSuccess){
+                     Thread.sleep(200);
+                     OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 2);
+                     short ack = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
+                     if (ack != 0) {
+                         writeAck++;
+                     }else {
+//                         News.info("鍫嗗灈鏈哄懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), "ack澶嶄綅瀹屾垚");
+                         break;
+                     }
+                 }
+             }while (writeAck <5);
+
              String address = "DB100.0";
-             if (command.getStation() == 1) {
-                 //宸ヤ綅1
-                 address = "DB100.0";
-             }else {
-                 //宸ヤ綅2
-                 address = "DB100.18";
-             }
 
-             String confirmAddress = "DB100.16";
-             if (command.getStation() == 1) {
-                 //宸ヤ綅1
-                 confirmAddress = "DB100.16";
-             }else {
-                 //宸ヤ綅2
-                 confirmAddress = "DB100.34";
-             }
+             String confirmAddress = "DB100.18";
 
-             short[] array = new short[9];
-             array[0] = command.getTaskNo().shortValue();
-             array[1] = command.getTaskMode().shortValue();
-             array[2] = command.getSourcePosX().shortValue();
-             array[3] = command.getSourcePosY().shortValue();
-             array[4] = command.getSourcePosZ().shortValue();
-             array[5] = command.getDestinationPosX().shortValue();
-             array[6] = command.getDestinationPosY().shortValue();
-             array[7] = command.getDestinationPosZ().shortValue();
-             array[8] = (short) 0;
+             short[] array = new short[10];
+             array[0] = 0;
+             array[1] = command.getTaskNo().shortValue();
+             array[2] = command.getTaskMode().shortValue();
+             array[3] = command.getSourcePosX().shortValue();
+             array[4] = command.getSourcePosY().shortValue();
+             array[5] = command.getSourcePosZ().shortValue();
+             array[6] = command.getDestinationPosX().shortValue();
+             array[7] = command.getDestinationPosY().shortValue();
+             array[8] = command.getDestinationPosZ().shortValue();
+             array[9] = (short) 0;
 
              OperateResult result = siemensNet.Write(address, array);
              if (!result.IsSuccess) {
@@ -159,7 +152,7 @@
 
              int idx = 0;
              do {
-                 OperateResultExOne<byte[]> resultRead = siemensNet.Read(address, (short) 18);
+                 OperateResultExOne<byte[]> resultRead = siemensNet.Read(address, (short) 20);
                  if (resultRead.IsSuccess) {
                     short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2);
                     short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4);
diff --git a/src/main/java/com/zy/core/network/real/ZyStationRealConnect.java b/src/main/java/com/zy/core/network/real/ZyStationRealConnect.java
index f3fab96..fe83d45 100644
--- a/src/main/java/com/zy/core/network/real/ZyStationRealConnect.java
+++ b/src/main/java/com/zy/core/network/real/ZyStationRealConnect.java
@@ -99,7 +99,7 @@
         if (result.IsSuccess) {
             for (int i = 0; i < statusList.size(); i++) {
                 ZyStationStatusEntity statusEntity = statusList.get(i); // 绔欑偣缂栧彿
-                statusEntity.setTaskNo((int) siemensNet.getByteTransform().TransInt16(result.Content, i * 8)); // 宸ヤ綔鍙�
+                statusEntity.setTaskNo(siemensNet.getByteTransform().TransInt32(result.Content, i * 8)); // 宸ヤ綔鍙�
                 statusEntity.setTargetStaNo((int) siemensNet.getByteTransform().TransInt16(result.Content, i * 8 + 4)); // 鐩爣绔�
 
                 boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, i * 8 + 6, 2);
@@ -109,25 +109,32 @@
                 statusEntity.setOutEnable(status[3]);// 鍙嚭
                 statusEntity.setEmptyMk(status[4]); // 绌烘澘淇″彿
                 statusEntity.setFullPlt(status[5]); // 婊℃墭鐩�
+
+                if (statusEntity.getStationId()==1015){
+                    OperateResultExOne<byte[]> result1 = siemensNet.Read("DB101.3826", (short) (4));
+                    if (result1.IsSuccess) {
+                        statusEntity.setWeight((double) siemensNet.getByteTransform().TransSingle(result1.Content, 0));
+                    }
+                }
             }
         }
 
         // 鏉$爜鎵弿鍣�
-        OperateResultExOne<byte[]> result2 = siemensNet.Read("DB101.840", (short) (barcodeOriginList.size() * 8));
+        OperateResultExOne<byte[]> result2 = siemensNet.Read("DB101.3760", (short) (barcodeOriginList.size() * 52));
         if (result2.IsSuccess) {
             for (int i = 0; i < barcodeOriginList.size(); i++) {
                 ZyStationStatusEntity barcodeEntity = findStatusEntityByBarcodeIdx(i + 1);
                 if (barcodeEntity == null) {
                     continue;
                 }
-                String barcode = siemensNet.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8");
+                String barcode = siemensNet.getByteTransform().TransString(result2.Content, i * 52, 52, "UTF-8");
                 barcode = barcode.trim();
                 barcodeEntity.setBarcode(barcode);
             }
         }
 
         // 鎶ヨ淇℃伅
-        OperateResultExOne<byte[]> result3 = siemensNet.Read("DB101.800", (short) (barcodeOriginList.size() * 3));
+        OperateResultExOne<byte[]> result3 = siemensNet.Read("DB101.2400", (short) (barcodeOriginList.size() * 3));
         if (result3.IsSuccess) {
             for (int i = 0; i < barcodeOriginList.size(); i++) {
                 ZyStationStatusEntity barcodeEntity = findStatusEntityByBarcodeIdx(i + 1);
@@ -189,15 +196,17 @@
         }
 
         OperateResult write = null;
+        OperateResult write1 = null;
         // 浠诲姟涓嬪彂娆℃暟
         int writeCount = 0;
         do {
-            short[] data = new short[2];
-            data[0] = command.getTaskNo().shortValue();
-            data[1] = command.getTargetStaNo().shortValue();
+//            short[] data = new short[2];
+//            data[0] = command.getTaskNo();
+//            data[1] = command.getTargetStaNo().shortValue();
 
-            write = siemensNet.Write("DB100." + index * 4, data);
-            if (write.IsSuccess) {
+            write = siemensNet.Write("DB100." + index * 6, command.getTaskNo());
+            write1 =siemensNet.Write("DB100." + (index * 6+4), command.getTargetStaNo().shortValue());
+            if (write.IsSuccess&&write1.IsSuccess) {
                 log.error("鍐欏叆杈撻�佺嚎鍛戒护鎴愬姛銆傜珯鐐圭紪鍙�={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", command.getStationId(), JSON.toJSON(command),
                         writeCount);
                 commandResponse.setResult(true);
diff --git a/src/main/java/com/zy/core/plugin/FakeProcess.java b/src/main/java/com/zy/core/plugin/FakeProcess.java
index 4a137df..1c8841b 100644
--- a/src/main/java/com/zy/core/plugin/FakeProcess.java
+++ b/src/main/java/com/zy/core/plugin/FakeProcess.java
@@ -327,8 +327,8 @@
 
                     CreateInTaskParam taskParam = new CreateInTaskParam();
                     taskParam.setTaskNo(String.valueOf(commonService.getWorkNo(WrkIoType.IN.id)));
-                    taskParam.setSourceStaNo(stationId);
-                    taskParam.setStaNo(targetStationId);
+                    taskParam.setSourceStaNo(String.valueOf(stationId));
+                    taskParam.setStaNo(String.valueOf(targetStationId));
                     taskParam.setLocNo(locMast.getLocNo());
                     taskParam.setBarcode(stationProtocol.getBarcode());
                     WrkMast wrkMast = commonService.createInTask(taskParam);
@@ -491,7 +491,7 @@
                                 News.error("WMS鍏ュ簱璇锋眰澶辫触锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
                                         stationIdVal, response);
                                 wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
+                                        stationProtocol.getPalletHeight(),stationProtocol.getWeight());
                                 redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
                                 continue;
                             }
@@ -502,7 +502,7 @@
                                 StartupDto dto = jsonObject.getObject("data", StartupDto.class);
 
                                 CreateInTaskParam taskParam = new CreateInTaskParam();
-                                taskParam.setTaskNo(dto.getTaskNo());
+                                taskParam.setTaskNo(String.valueOf(dto.getTaskNo()));
                                 taskParam.setLocNo(dto.getLocNo());
                                 taskParam.setTaskPri(dto.getTaskPri());
                                 taskParam.setBarcode(barcode);
@@ -520,7 +520,7 @@
                                 News.error("WMS鍏ュ簱鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
                                         stationIdVal, response);
                                 wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
+                                        stationProtocol.getPalletHeight(),stationProtocol.getWeight());
                                 redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
                             }
                         } else {
@@ -529,7 +529,7 @@
                                 // 娌℃湁璇锋眰杩涜涓紝鍙戣捣鏂扮殑寮傛璇锋眰
                                 News.info("鍙戣捣寮傛WMS鍏ュ簱璇锋眰锛宐arcode={}锛宻tationId={}", barcode, stationIdVal);
                                 wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
+                                        stationProtocol.getPalletHeight(),stationProtocol.getWeight());
                                 redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
                             }
                         }
@@ -789,6 +789,7 @@
 
                 wrkMast.setWrkSts(updateWrkSts);
                 wrkMast.setSystemMsg("");
+                wrkMast.setWeight(Cools.isEmpty(crnProtocol.getWeight()) ? 11.11 : crnProtocol.getWeight());
                 wrkMast.setIoTime(new Date());
                 if (wrkMastService.updateById(wrkMast)) {
                     CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getCrnNo());
diff --git a/src/main/java/com/zy/core/plugin/NormalProcess.java b/src/main/java/com/zy/core/plugin/NormalProcess.java
index 46d5934..018cbfc 100644
--- a/src/main/java/com/zy/core/plugin/NormalProcess.java
+++ b/src/main/java/com/zy/core/plugin/NormalProcess.java
@@ -70,6 +70,8 @@
         stationOperateProcessUtils.stationInExecute();
         //鎵ц杈撻�佺珯鐐瑰嚭搴撲换鍔�
         stationOperateProcessUtils.stationOutExecute();
+        //妫�娴嬪嚭搴撲换鍔″埌杈剧洰鐨勫湴
+        stationOperateProcessUtils.arriveAtTheDestination();
         //妫�娴嬭緭閫佺珯鐐瑰嚭搴撲换鍔℃墽琛屽畬鎴�
         stationOperateProcessUtils.stationOutExecuteFinish();
 
@@ -120,18 +122,29 @@
                     if (stationProtocol == null) {
                         continue;
                     }
+                    String barcode = stationProtocol.getBarcode();
 
                     // 婊¤冻鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙凤紝鐢熸垚鍏ュ簱鏁版嵁
                     if (stationProtocol.isAutoing()
                             && stationProtocol.isLoading()
-                            && stationProtocol.getTaskNo() > 0) {
+                            && stationProtocol.getTaskNo() == 0) {
                         if (Cools.isEmpty(stationProtocol.getBarcode())) {
                             continue;
                         }
+                        //鏄惁鎶ヨ
+                        if (stationProtocol.getError()>0){
+                            StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO,
+                                    9991, 1015, 1013, 0);
+                            stationProtocol.setSystemWarning(stationProtocol.getErrorMsg());
+                            MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
+                            continue;
+                        }
 
+                        String[] split = barcode.split(",");
+                        String bar = split[0];
                         // 妫�娴嬩换鍔℃槸鍚︾敓鎴�
                         List<WrkMast> wrkMasts = wrkMastService
-                                .selectList(new EntityWrapper<WrkMast>().eq("barcode", stationProtocol.getBarcode()));
+                                .selectList(new EntityWrapper<WrkMast>().eq("barcode", bar));
                         if (!wrkMasts.isEmpty()) {
                             continue;
                         }
@@ -141,7 +154,7 @@
                             continue;
                         }
 
-                        String barcode = stationProtocol.getBarcode();
+
                         Integer stationIdVal = stationProtocol.getStationId();
 
                         // 1. 棣栧厛鏌ヨ鏄惁鏈夊凡瀹屾垚鐨勫紓姝ュ搷搴�
@@ -154,8 +167,9 @@
                                 News.error("WMS鍏ュ簱璇锋眰澶辫触锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
                                         stationIdVal, response);
                                 wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
+                                        stationProtocol.getPalletHeight(),stationProtocol.getWeight());
                                 redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
+//                                stationProtocol.setSys
                                 continue;
                             }
 
@@ -165,25 +179,34 @@
                                 StartupDto dto = jsonObject.getObject("data", StartupDto.class);
 
                                 CreateInTaskParam taskParam = new CreateInTaskParam();
-                                taskParam.setTaskNo(dto.getTaskNo());
+                                taskParam.setTaskNo(String.valueOf(dto.getTaskNo()));
                                 taskParam.setLocNo(dto.getLocNo());
                                 taskParam.setTaskPri(dto.getTaskPri());
-                                taskParam.setBarcode(barcode);
+                                taskParam.setBarcode(dto.getBarcode());
+                                taskParam.setSourceStaNo(String.valueOf(dto.getSourceStaNo()));
+                                taskParam.setStaNo(String.valueOf(dto.getStaNo()));
+                                taskParam.setCrnNo(dto.getCrnNo());
                                 WrkMast wrkMast = commonService.createInTask(taskParam);
 
                                 StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO,
-                                        wrkMast.getWrkNo(), stationId, stationId, 0);
+                                        wrkMast.getWrkNo(), dto.getSourceStaNo(), dto.getStaNo(), 0);
                                 if (command == null) {
                                     News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
                                     continue;
                                 }
+                                stationProtocol.setSystemWarning("");
                                 MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
                             } else {
+
+                                stationProtocol.setSystemWarning(jsonObject.getString("msg"));
+                                StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO,
+                                        9991, 1015, 1013, 0);
+                                MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
                                 // 鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹�
                                 News.error("WMS鍏ュ簱鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
                                         stationIdVal, response);
                                 wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
+                                        stationProtocol.getPalletHeight(),stationProtocol.getWeight());
                                 redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
                             }
                         } else {
@@ -192,7 +215,7 @@
                                 // 娌℃湁璇锋眰杩涜涓紝鍙戣捣鏂扮殑寮傛璇锋眰
                                 News.info("鍙戣捣寮傛WMS鍏ュ簱璇锋眰锛宐arcode={}锛宻tationId={}", barcode, stationIdVal);
                                 wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal,
-                                        stationProtocol.getPalletHeight());
+                                        stationProtocol.getPalletHeight(),stationProtocol.getWeight());
                                 redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
                             }
                             // 濡傛灉鏈夎姹傝繘琛屼腑锛岀瓑寰呬笅娆″惊鐜啀妫�鏌�
diff --git a/src/main/java/com/zy/core/thread/CrnThread.java b/src/main/java/com/zy/core/thread/CrnThread.java
index 46cbd00..50011bc 100644
--- a/src/main/java/com/zy/core/thread/CrnThread.java
+++ b/src/main/java/com/zy/core/thread/CrnThread.java
@@ -17,4 +17,9 @@
 
     CommandResponse sendCommand(CrnCommand command);//涓嬪彂鍛戒护
 
+    CommandResponse sendCommand1(CrnCommand command);
+
+    CommandResponse sendCommand2(CrnCommand command);
+
+    CommandResponse sendCommand3(CrnCommand command);
 }
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 b680358..f3bbd8a 100644
--- a/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
@@ -30,6 +30,9 @@
 
 import java.text.MessageFormat;
 import java.util.Date;
+import java.util.List;
+import java.util.ArrayList;
+import com.zy.core.utils.WmsOperateUtils;
 import com.zy.asrs.entity.BasCrnpErrLog;
 import com.zy.asrs.service.BasCrnpErrLogService;
 
@@ -45,6 +48,7 @@
     private ZyCrnConnectDriver zyCrnConnectDriver;
     private CrnProtocol crnProtocol;
     private int deviceLogCollectTime = 200;
+    private List<Integer> lastReportedIndices = new ArrayList<>();
 
     public ZySiemensCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
         this.deviceConfig = deviceConfig;
@@ -81,6 +85,16 @@
                     if (step == 2) {
                         sendCommand((CrnCommand) task.getData());
                     }
+                    if (step == 3) {
+                        sendCommand1((CrnCommand) task.getData());
+                    }
+                    if (step == 4) {
+                        sendCommand2((CrnCommand) task.getData());
+                    }
+                    if (step == 5) {
+                        sendCommand3((CrnCommand) task.getData());
+                    }
+
 
                     Thread.sleep(100);
                 } catch (Exception e) {
@@ -178,6 +192,33 @@
         crnProtocol.setYDistance(crnStatus.getYDistance());
         crnProtocol.setXDuration(crnStatus.getXDuration());
         crnProtocol.setYDuration(crnStatus.getYDuration());
+        crnProtocol.setWeight(crnStatus.getWeight());
+        crnProtocol.setDb110Data(crnStatus.getDb110Data());
+
+        // 涓婃姤鍫嗗灈鏈篋B110鐘舵�佹暟鎹�
+        short[] db110Data = crnProtocol.getDb110Data();
+        List<Integer> currentIndices = new ArrayList<>();
+        if (db110Data != null) {
+            for (int i = 0; i < db110Data.length; i++) {
+                if (db110Data[i] == 1) {
+                    currentIndices.add(i);
+                }
+            }
+        }
+        //!currentIndices.equals(lastReportedIndices)
+        boolean changed = true;
+        
+        if (changed) {
+            try {
+                WmsOperateUtils wmsOperateUtils = SpringUtils.getBean(WmsOperateUtils.class);
+                if (wmsOperateUtils != null) {
+                    wmsOperateUtils.reportCrnDb110Status(crnProtocol.getCrnNo(), currentIndices);
+                    lastReportedIndices = new ArrayList<>(currentIndices);
+                }
+            } catch (Exception e) {
+                log.error("Report Crn Db110 Status Fail", e);
+            }
+        }
 
         OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), deviceConfig.getDeviceNo()));
 
@@ -331,4 +372,119 @@
             }
         }
     }
+
+    @Override
+    public synchronized CommandResponse sendCommand1(CrnCommand command) {
+        this.crnProtocol.setLastCommandTime(System.currentTimeMillis());
+        CommandResponse response = null;
+        try {
+            response = zyCrnConnectDriver.sendCommand1(command);
+            return response;
+        } 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);
+            ZyCrnStatusEntity statusEntity = zyCrnConnectDriver.getStatus();
+            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(statusEntity),
+                    1,
+                    JSON.toJSONString(response)
+            );
+            if (bean != null) {
+                bean.insert(basCrnpOpt);
+            }
+        }
+    }
+
+    /**
+     * 绠$悊绔欑偣鐨勭櫧鐏儏鍐�
+     * 1(浜紝闂儊锛屼笂浣嶄笅鍙戜换鍔�)
+     * 榛樿0(鏆�)
+     * @param command
+     * @return
+     */
+
+    @Override
+    public synchronized CommandResponse sendCommand2(CrnCommand command) {
+        this.crnProtocol.setLastCommandTime(System.currentTimeMillis());
+        CommandResponse response = null;
+        try {
+            response = zyCrnConnectDriver.sendCommand2(command);
+            return response;
+        } 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);
+            ZyCrnStatusEntity statusEntity = zyCrnConnectDriver.getStatus();
+            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(statusEntity),
+                    1,
+                    JSON.toJSONString(response)
+            );
+            if (bean != null) {
+                bean.insert(basCrnpOpt);
+            }
+        }
+    }
+
+    /**
+     * 绠$悊绔欑偣鐨勯粍鑹叉寜閽姸鎬佸強棰滆壊
+     * 1:浜哄伐鎸夋寜閽‘璁�
+     * 2:涓婁綅鏈烘帴鏀跺畬鎴愶紝杩愯缁�
+     * 0:浠诲姟缁撴潫涓婁綅鏈烘竻闄ょ姸鎬�
+     * @param command
+     * @return
+     */
+    @Override
+    public synchronized CommandResponse sendCommand3(CrnCommand command) {
+        this.crnProtocol.setLastCommandTime(System.currentTimeMillis());
+        CommandResponse response = null;
+        try {
+            response = zyCrnConnectDriver.sendCommand3(command);
+            return response;
+        } 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);
+            ZyCrnStatusEntity statusEntity = zyCrnConnectDriver.getStatus();
+            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(statusEntity),
+                    1,
+                    JSON.toJSONString(response)
+            );
+            if (bean != null) {
+                bean.insert(basCrnpOpt);
+            }
+        }
+    }
 }
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 62ea5a9..544fb8b 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyStationThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyStationThread.java
@@ -82,7 +82,6 @@
                     if (step == 2) {
                         sendCommand((StationCommand) task.getData());
                     }
-
                     Thread.sleep(100);
                 } catch (Exception e) {
                     log.error("StationProcess Fail", e);
diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index 52ff58a..d1bd424 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -28,13 +28,11 @@
 import com.zy.core.model.protocol.StationProtocol;
 import com.zy.core.thread.CrnThread;
 import com.zy.core.thread.StationThread;
+import lombok.Synchronized;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Component
 public class CrnOperateProcessUtils {
@@ -123,7 +121,8 @@
         }
     }
 
-    private synchronized void crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) {
+    @Synchronized
+    private void crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) {
         CrnProtocol crnProtocol = crnThread.getStatus();
         if(crnProtocol == null){
             return;
@@ -204,12 +203,19 @@
             String sourceLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev());
 
             CrnCommand command = crnThread.getPickAndPutCommand(sourceLocNo, wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
-
             wrkMast.setWrkSts(WrkStsType.INBOUND_RUN.sts);
             wrkMast.setCrnNo(crnNo);
             wrkMast.setSystemMsg("");
             wrkMast.setIoTime(new Date());
+            //缁欏簱浣嶇櫧鑹叉寚绀虹伅浜伅
+            String[] split = basCrnp.getArr().split(",");
+            int i = Arrays.asList(split).indexOf(wrkMast.getLocNo());
             if (wrkMastService.updateById(wrkMast)) {
+                if (i>-1){
+                    command.setLocNo(wrkMast.getLocNo());
+                    command.setIndex(i);
+                    command.setValue((short)1);
+                }
                 MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
                 notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_RUN, null);
                 News.info("鍫嗗灈鏈哄懡浠や笅鍙戞垚鍔燂紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(command));
@@ -298,7 +304,15 @@
                 wrkMast.setCrnNo(crnNo);
                 wrkMast.setSystemMsg("");
                 wrkMast.setIoTime(new Date());
+                //缁欏簱浣嶇櫧鑹叉寚绀虹伅浜伅
+                String[] split = basCrnp.getArr().split(",");
+                int i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo());
                 if (wrkMastService.updateById(wrkMast)) {
+                    if (i>-1){
+                        command.setLocNo(wrkMast.getSourceLocNo());
+                        command.setIndex(i);
+                        command.setValue((short)1);
+                    }
                     MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
                     notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_RUN, null);
                     News.info("鍫嗗灈鏈哄懡浠や笅鍙戞垚鍔燂紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(command));
@@ -530,7 +544,20 @@
             wrkMast.setCrnNo(crnNo);
             wrkMast.setSystemMsg("");
             wrkMast.setIoTime(new Date());
+            //缁欏簱浣嶇櫧鑹叉寚绀虹伅浜伅
+            String[] split = basCrnp.getArr().split(",");
+            int i = Arrays.asList(split).indexOf(wrkMast.getLocNo());
+            String locNo = wrkMast.getLocNo();
+            if (i == -1) {
+                i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo());
+                locNo = wrkMast.getSourceLocNo();
+            }
             if (wrkMastService.updateById(wrkMast)) {
+                if (i>-1){
+                    command.setLocNo(locNo);
+                    command.setIndex(i);
+                    command.setValue((short)1);
+                }
                 MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
                 notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_RUN, null);
                 News.info("鍫嗗灈鏈哄懡浠や笅鍙戞垚鍔燂紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", crnNo, JSON.toJSON(command));
@@ -568,16 +595,29 @@
                     News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
                     continue;
                 }
-
+                //缁欏簱浣嶇櫧鑹叉寚绀虹伅浜伅
+                String[] split = basCrnp.getArr().split(",");
+                int i = -1;
+                String locNo = "";
                 Long updateWrkSts = null;
                 if(wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts){
                     updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
+                    i = Arrays.asList(split).indexOf(wrkMast.getLocNo());
+                    locNo = wrkMast.getLocNo();
                     notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_COMPLETE, null);
                 }else if(wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts){
                     updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
+                    i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo());
+                    locNo = wrkMast.getSourceLocNo();
                     notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_COMPLETE, null);
                 }else if(wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts){
                     updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
+                    i = Arrays.asList(split).indexOf(wrkMast.getLocNo());
+                    locNo = wrkMast.getLocNo();
+                    if(i==-1){
+                        i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo());
+                        locNo = wrkMast.getSourceLocNo();
+                    }
                     notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_COMPLETE, null);
                 }else{
                     News.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗗伐浣滅姸鎬佸紓甯搞�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
@@ -587,9 +627,15 @@
                 wrkMast.setWrkSts(updateWrkSts);
                 wrkMast.setSystemMsg("");
                 wrkMast.setIoTime(new Date());
+                wrkMast.setWeight(crnProtocol.getWeight());
                 if (wrkMastService.updateById(wrkMast)) {
                     CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getCrnNo());
-                    MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
+                    if (i>-1){
+                        resetCommand.setLocNo(locNo);
+                        resetCommand.setIndex(i);
+                        resetCommand.setValue((short)0);
+                    }
+                    MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(3, resetCommand));
                     News.info("鍫嗗灈鏈轰换鍔$姸鎬佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
                 }
 
@@ -794,7 +840,7 @@
                 String moveLocNo = dto.getLocNo();
 
                 CreateLocMoveTaskParam moveTaskParam = new CreateLocMoveTaskParam();
-                moveTaskParam.setTaskNo(dto.getTaskNo());
+                moveTaskParam.setTaskNo(String.valueOf(dto.getTaskNo()));
                 moveTaskParam.setSourceLocNo(shallowLocNo);
                 moveTaskParam.setLocNo(moveLocNo);
                 try {
diff --git a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
index 409f546..70adfcf 100644
--- a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
@@ -606,6 +606,7 @@
                 wrkMast.setWrkSts(updateWrkSts);
                 wrkMast.setSystemMsg("");
                 wrkMast.setIoTime(new Date());
+                wrkMast.setWeight(300D);
                 if (wrkMastService.updateById(wrkMast)) {
                     News.info("鍙屽伐浣嶅爢鍨涙満浠诲姟鐘舵�佹洿鏂版垚鍔燂紝鍫嗗灈鏈哄彿={}锛屽伐浣滃彿={}", basDualCrnp.getCrnNo(), taskNo);
                 }
@@ -672,7 +673,7 @@
                 String moveLocNo = dto.getLocNo();
 
                 CreateLocMoveTaskParam moveTaskParam = new CreateLocMoveTaskParam();
-                moveTaskParam.setTaskNo(dto.getTaskNo());
+                moveTaskParam.setTaskNo(String.valueOf(dto.getTaskNo()));
                 moveTaskParam.setSourceLocNo(shallowLocNo);
                 moveTaskParam.setLocNo(moveLocNo);
                 try {
diff --git a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
index 8237bbe..4a14a33 100644
--- a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
@@ -4,8 +4,10 @@
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.exception.CoolException;
+import com.zy.asrs.domain.enums.NotifyMsgType;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.service.*;
+import com.zy.asrs.utils.NotifyUtils;
 import com.zy.common.entity.FindCrnNoResult;
 import com.zy.common.model.StartupDto;
 import com.zy.common.service.CommonService;
@@ -17,7 +19,9 @@
 import com.zy.core.model.StationObjModel;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.StationCommand;
+import com.zy.core.model.protocol.CrnProtocol;
 import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.thread.CrnThread;
 import com.zy.core.thread.StationThread;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -43,13 +47,15 @@
     private LocMastService locMastService;
     @Autowired
     private WmsOperateUtils wmsOperateUtils;
+    @Autowired
+    private NotifyUtils notifyUtils;
 
     //鎵ц杈撻�佺珯鐐瑰叆搴撲换鍔�
     public synchronized void stationInExecute() {
         List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
         for (BasDevp basDevp : basDevps) {
             StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-            if(stationThread == null){
+            if (stationThread == null) {
                 continue;
             }
 
@@ -58,7 +64,7 @@
             List<StationObjModel> list = basDevp.getBarcodeStationList$();
             for (StationObjModel entity : list) {
                 Integer stationId = entity.getStationId();
-                if(!stationMap.containsKey(stationId)){
+                if (!stationMap.containsKey(stationId)) {
                     continue;
                 }
 
@@ -68,7 +74,7 @@
                 }
 
                 Object lock = redisUtil.get(RedisKeyType.STATION_IN_EXECUTE_LIMIT.key + stationId);
-                if(lock != null){
+                if (lock != null) {
                     continue;
                 }
 
@@ -101,7 +107,7 @@
                     }
 
                     StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(), stationId, targetStationId, 0);
-                    if(command == null){
+                    if (command == null) {
                         News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", wrkMast.getWrkNo());
                         continue;
                     }
@@ -130,7 +136,7 @@
             BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", wrkMast.getCrnNo()));
             if (basCrnp != null) {
                 outStationList = basCrnp.getOutStationList$();
-                if(outStationList.isEmpty()){
+                if (outStationList.isEmpty()) {
                     News.info("鍫嗗灈鏈�:{} 鍑哄簱绔欑偣鏈缃�", basCrnp.getCrnNo());
                     continue;
                 }
@@ -139,7 +145,7 @@
             BasDualCrnp basDualCrnp = basDualCrnpService.selectOne(new EntityWrapper<BasDualCrnp>().eq("crn_no", wrkMast.getDualCrnNo()));
             if (basDualCrnp != null) {
                 outStationList = basDualCrnp.getOutStationList$();
-                if(outStationList.isEmpty()){
+                if (outStationList.isEmpty()) {
                     News.info("鍙屽伐浣嶅爢鍨涙満:{} 鍑哄簱绔欑偣鏈缃�", basDualCrnp.getCrnNo());
                     continue;
                 }
@@ -147,7 +153,7 @@
 
             for (StationObjModel stationObjModel : outStationList) {
                 StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
-                if(stationThread == null){
+                if (stationThread == null) {
                     continue;
                 }
 
@@ -168,7 +174,7 @@
                         && stationProtocol.getTaskNo() == 0
                 ) {
                     StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(), stationProtocol.getStationId(), wrkMast.getStaNo(), 0);
-                    if(command == null){
+                    if (command == null) {
                         News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
                         continue;
                     }
@@ -181,15 +187,96 @@
                         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);
+                        redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_DESTINATION_LIMIT.key + wrkMast.getWrkNo(), "lock", 60 * 5);
                     }
                 }
             }
         }
     }
 
+    //妫�娴嬪嚭搴撲换鍔″埌杈剧洰鐨勫湴
+    public synchronized void arriveAtTheDestination() {
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", WrkStsType.STATION_RUN.sts));
+        for (WrkMast wrkMast : wrkMasts) {
+            Integer wrkNo = wrkMast.getWrkNo();
+
+//            Object lock = redisUtil.get(RedisKeyType.STATION_OUT_EXECUTE_DESTINATION_LIMIT.key + wrkNo);
+//            if (lock != null) {
+//                continue;
+//            }
+
+            boolean complete = false;
+
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, 1);
+            if (stationThread == null) {
+                continue;
+            }
+            List<StationProtocol> list = stationThread.getStatus();
+            for (StationProtocol stationProtocol : list) {
+                if (stationProtocol.getTaskNo().equals(wrkNo)&&stationProtocol.getStationId().equals(wrkMast.getStaNo())) {
+                    complete = true;
+                }
+            }
+            if (complete) {
+                //涓婃姤--鍒拌揪鐩殑鍦颁笂鎶ms
+                notifyUtils.notify("task", 1, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.ARRIVE_AT_THE_DESTINATION, JSON.toJSONString(wrkMast));
+                wrkMast.setWrkSts(WrkStsType.ARRIVE_AT_THE_DESTINATION.sts);
+                wrkMast.setIoTime(new Date());
+                wrkMastService.updateById(wrkMast);
+            }
+        }
+    }
+
+    //妫�娴嬪簱浣嶆鑹叉寜閽俊鍙� 1锛氬憳宸ョ‘璁わ紙甯镐寒锛� 2 锛氫笂浣嶆満纭锛堥棯鐑侊級0 锛氱唲鐏�
+    public synchronized void locNo() {
+        List<BasCrnp> basCrnps = basCrnpService.selectList(null);
+        for (BasCrnp basCrnp : basCrnps) {
+            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
+            if(crnThread == null){
+                continue;
+            }
+
+            CrnProtocol crnProtocol = crnThread.getStatus();
+            if(crnProtocol == null){
+                continue;
+            }
+
+
+        }
+//        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", WrkStsType.ARRIVE_AT_THE_DESTINATION.sts));
+//        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 = false;
+//
+//            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, wrkMast.getStaNo());
+//            if (stationThread == null) {
+//                continue;
+//            }
+//            List<StationProtocol> list = stationThread.getStatus();
+//            for (StationProtocol stationProtocol : list) {
+//                if (stationProtocol.getTaskNo().equals(wrkNo)) {
+//                    complete = true;
+//                }
+//            }
+//            if (complete) {
+//                //涓婃姤--鍒拌揪鐩殑鍦颁笂鎶ms
+//                notifyUtils.notify("task", 1, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.ARRIVE_AT_THE_DESTINATION, JSON.toJSONString(wrkMast));
+//                wrkMast.setWrkSts(WrkStsType.ARRIVE_AT_THE_DESTINATION.sts);
+//                wrkMast.setIoTime(new Date());
+//                wrkMastService.updateById(wrkMast);
+//            }
+//        }
+    }
+
     //妫�娴嬭緭閫佺珯鐐瑰嚭搴撲换鍔℃墽琛屽畬鎴�
     public synchronized void stationOutExecuteFinish() {
-        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", WrkStsType.STATION_RUN.sts));
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", WrkStsType.ARRIVE_AT_THE_DESTINATION.sts));
         for (WrkMast wrkMast : wrkMasts) {
             Integer wrkNo = wrkMast.getWrkNo();
 
@@ -227,7 +314,7 @@
         List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
         for (BasDevp basDevp : basDevps) {
             StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-            if(stationThread == null){
+            if (stationThread == null) {
                 continue;
             }
 
@@ -238,10 +325,10 @@
 
             List<StationProtocol> list = stationThread.getStatus();
             for (StationProtocol stationProtocol : list) {
-                if(stationProtocol.isAutoing()
-                    && stationProtocol.isLoading()
-                    && stationProtocol.getTaskNo() > 0
-                    && stationProtocol.isRunBlock()
+                if (stationProtocol.isAutoing()
+                        && stationProtocol.isLoading()
+                        && stationProtocol.getTaskNo() > 0
+                        && stationProtocol.isRunBlock()
                 ) {
                     WrkMast wrkMast = wrkMastService.selectByWorkNo(stationProtocol.getTaskNo());
                     if (wrkMast == null) {
@@ -306,7 +393,7 @@
                             }
 
                             StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(), stationProtocol.getStationId(), targetStationId, 0);
-                            if(command == null){
+                            if (command == null) {
                                 News.taskInfo(wrkMast.getWrkNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", wrkMast.getWrkNo());
                                 continue;
                             }
@@ -329,7 +416,7 @@
                                 wrkMast.setCrnNo(crnNo);
                             } else if (findCrnNoResult.getCrnType().equals(SlaveType.DualCrn)) {
                                 wrkMast.setDualCrnNo(crnNo);
-                            }else {
+                            } else {
                                 throw new CoolException("鏈煡璁惧绫诲瀷");
                             }
 
@@ -339,10 +426,10 @@
                         } else {
                             News.error("璇锋眰WMS鎺ュ彛澶辫触锛侊紒锛乺esponse锛歿}", response);
                         }
-                    }else {
+                    } else {
                         //杩愯鍫靛锛岄噸鏂拌绠楄矾绾�
                         StationCommand command = stationThread.getCommand(StationCommandType.MOVE, wrkMast.getWrkNo(), stationProtocol.getStationId(), wrkMast.getStaNo(), 0);
-                        if(command == null){
+                        if (command == null) {
                             News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
                             continue;
                         }
diff --git a/src/main/java/com/zy/core/utils/WmsOperateUtils.java b/src/main/java/com/zy/core/utils/WmsOperateUtils.java
index 42e682a..107733a 100644
--- a/src/main/java/com/zy/core/utils/WmsOperateUtils.java
+++ b/src/main/java/com/zy/core/utils/WmsOperateUtils.java
@@ -5,24 +5,24 @@
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;
 import com.core.exception.CoolException;
-import com.zy.asrs.entity.BasCrnp;
-import com.zy.asrs.entity.BasDualCrnp;
-import com.zy.asrs.entity.BasStation;
-import com.zy.asrs.entity.HttpRequestLog;
-import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.entity.*;
 import com.zy.asrs.service.BasCrnpService;
 import com.zy.asrs.service.BasDualCrnpService;
 import com.zy.asrs.service.BasStationService;
 import com.zy.asrs.service.HttpRequestLogService;
 import com.zy.asrs.service.WrkMastService;
+import com.zy.asrs.service.impl.LocMastServiceImpl;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.entity.FindCrnNoResult;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.HttpHandler;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.News;
+import com.zy.core.cache.MessageQueue;
 import com.zy.core.enums.RedisKeyType;
 import com.zy.core.enums.SlaveType;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.CrnCommand;
 import com.zy.system.entity.Config;
 import com.zy.system.service.ConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,14 +53,17 @@
     private BasStationService basStationService;
     @Autowired
     private RedisUtil redisUtil;
+    @Autowired
+    private LocMastServiceImpl locMastService;
 
     // 鐢宠鍏ュ簱浠诲姟
-    public synchronized String applyInTask(String barcode, Integer sourceStaNo, Integer locType1) {
+    public synchronized String applyInTask(String barcode, Integer sourceStaNo, Integer locType1,Double weight) {
         Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
         if (systemConfigMapObj == null) {
             News.error("绯荤粺Config缂撳瓨澶辨晥");
             return null;
         }
+
         HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
 
         String wmsUrl = systemConfigMap.get("wmsSystemUri");
@@ -95,6 +98,8 @@
             requestParam.put("sourceStaNo", stationNo);
             requestParam.put("locType1", locType1);
             requestParam.put("row", Utils.getInTaskEnableRow(sourceStaNo));
+            requestParam.put("ioType",1);
+            requestParam.put("weight", weight);
 
             response = new HttpHandler.Builder()
                     .setUri(wmsUrl)
@@ -134,13 +139,12 @@
 
     /**
      * 寮傛鐢宠鍏ュ簱浠诲姟 - 闈為樆濉炵増鏈�
-     * 灏嗚姹傛彁浜ゅ埌绾跨▼姹犲紓姝ユ墽琛岋紝缁撴灉瀛樺偍鍒癛edis涓�
      * 
      * @param barcode     鎵樼洏鐮�
      * @param sourceStaNo 绔欑偣缂栧彿
      * @param locType1    鎵樼洏楂樺害
      */
-    public void applyInTaskAsync(String barcode, Integer sourceStaNo, Integer locType1) {
+    public void applyInTaskAsync(String barcode, Integer sourceStaNo, Integer locType1,Double weight) {
         String requestKey = RedisKeyType.ASYNC_WMS_IN_TASK_REQUEST.key + barcode + "_" + sourceStaNo;
         String responseKey = RedisKeyType.ASYNC_WMS_IN_TASK_RESPONSE.key + barcode + "_" + sourceStaNo;
 
@@ -156,18 +160,18 @@
         // 鎻愪氦寮傛浠诲姟
         new Thread(() -> {
             try {
-                String response = applyInTask(barcode, sourceStaNo, locType1);
+                String response = applyInTask(barcode, sourceStaNo, locType1,weight);
                 if (response != null) {
                     // 瀛樺偍鍝嶅簲缁撴灉锛岃缃�60绉掕秴鏃�
                     redisUtil.set(responseKey, response, 60);
-                    News.info("寮傛WMS鍏ュ簱璇锋眰瀹屾垚锛宐arcode={}锛宻tationId={}锛宺esponse={}", barcode, sourceStaNo, response);
+                    News.info("寮傛WMS鍏ュ簱璇锋眰瀹屾垚锛宐arcode={}锛宻tationId={}锛宺esponse={},weight={}", barcode, sourceStaNo, response,weight);
                 } else {
                     // 璇锋眰澶辫触锛屽瓨鍌ㄥけ璐ユ爣璁�
                     redisUtil.set(responseKey, "FAILED", 10);
-                    News.error("寮傛WMS鍏ュ簱璇锋眰澶辫触锛宐arcode={}锛宻tationId={}", barcode, sourceStaNo);
+                    News.error("寮傛WMS鍏ュ簱璇锋眰澶辫触锛宐arcode={}锛宻tationId={},weight={}", barcode, sourceStaNo,weight);
                 }
             } catch (Exception e) {
-                News.error("寮傛WMS鍏ュ簱璇锋眰寮傚父锛宐arcode={}锛宻tationId={}锛宔rror={}", barcode, sourceStaNo, e.getMessage());
+                News.error("寮傛WMS鍏ュ簱璇锋眰寮傚父锛宐arcode={}锛宻tationId={}锛宔rror={},weight={}", barcode, sourceStaNo, e.getMessage(),weight);
                 redisUtil.set(responseKey, "ERROR:" + e.getMessage(), 10);
             } finally {
                 // 娓呴櫎璇锋眰杩涜涓爣璁�
@@ -388,4 +392,87 @@
         return response;
     }
 
+    // 涓婃姤鍫嗗灈鏈篋B110鐘舵�佹暟鎹�
+    public void reportCrnDb110Status(Integer crnNo, List<Integer> indices) {
+        Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
+        if (systemConfigMapObj == null) {
+            News.error("绯荤粺Config缂撳瓨澶辨晥");
+            return;
+        }
+        HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+
+        String wmsUrl = systemConfigMap.get("wmsSystemUri");
+        if (wmsUrl == null) {
+            News.error("鏈厤缃甒MS绯荤粺URI锛岄厤缃枃浠禖ode缂栫爜锛歸msSystemUri");
+            return;
+        }
+
+        String wmsSystemCrnStatusUrl = systemConfigMap.get("wmsSystemCrnStatusUrl");
+        if (wmsSystemCrnStatusUrl == null) {
+            News.error("鏈厤缃甒MS鍫嗗灈鏈虹姸鎬佷笂鎶ユ帴鍙e湴鍧�锛岄厤缃枃浠禖ode缂栫爜锛歸msSystemCrnStatusUrl");
+            return;
+        }
+
+        String response = null;
+        int result = 0;
+        BasCrnp crnNo1 = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", crnNo));
+        if (crnNo1 == null) {
+            return;
+        }
+        // 鏍规嵁indices涓嬫爣浠巆rnNo1鐨刟rr鏁扮粍涓彇鍑哄搴斿��
+        String[] split = crnNo1.getArr().split(",");
+        for (Integer idx : indices) {
+            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", split[idx]));
+            if (locMast == null||Cools.isEmpty(locMast.getBarcode())) {
+                News.info("娌℃湁鏌ヨ鍒拌搴撲綅鎴栬�呮病鏈夋壘鍒拌搴撲綅瀵瑰簲鎵樼洏鐮� 锛歿}", split[idx]);
+                CrnCommand command = new CrnCommand();
+                command.setLocNo(locMast.getLocNo());
+                command.setIndex(idx);
+                command.setValue((short)0);
+                MessageQueue.offer(SlaveType.Crn, crnNo, new Task(5, command));
+                continue;
+            }
+            try {
+                response = new HttpHandler.Builder()
+                        .setUri(wmsUrl)
+                        .setPath(wmsSystemCrnStatusUrl)
+                        .setJson(locMast.getBarcode())
+                        .setTimeout(30, TimeUnit.SECONDS)
+                        .build()
+                        .doPost();
+                if (response != null) {
+                    JSONObject jsonObject = JSON.parseObject(response);
+                    if (jsonObject.getInteger("code") == 200) {
+                        result = 1;
+                        CrnCommand command = new CrnCommand();
+                        command.setLocNo(locMast.getLocNo());
+                        command.setIndex(idx);
+                        command.setValue((short)2);
+                        MessageQueue.offer(SlaveType.Crn, crnNo, new Task(5, command));
+
+                        News.info("璇锋眰WMS鍫嗗灈鏈虹姸鎬佷笂鎶ユ帴鍙f垚鍔燂紒锛侊紒url锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + wmsSystemCrnStatusUrl,
+                                JSON.toJSONString(locMast.getBarcode()), response);
+                    } else {
+                        News.info("璇锋眰WMS鍫嗗灈鏈虹姸鎬佷笂鎶ユ帴鍙eけ璐ワ紝鎺ュ彛杩斿洖Code寮傚父锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}",
+                                wmsUrl + wmsSystemCrnStatusUrl, JSON.toJSONString(locMast.getBarcode()), response);
+                    }
+                } else {
+                    News.info("璇锋眰WMS鍫嗗灈鏈虹姸鎬佷笂鎶ユ帴鍙eけ璐ワ紝鎺ュ彛鏈搷搴旓紒锛侊紒url锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + wmsSystemCrnStatusUrl,
+                            JSON.toJSONString(locMast.getBarcode()), response);
+                }
+            } catch (Exception e) {
+                News.error("璇锋眰WMS鍫嗗灈鏈虹姸鎬佷笂鎶ユ帴鍙e紓甯革紒锛侊紒url锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + wmsSystemCrnStatusUrl,
+                        JSON.toJSONString(locMast.getBarcode()), response, e);
+            } finally {
+                HttpRequestLog httpRequestLog = new HttpRequestLog();
+                httpRequestLog.setName(wmsUrl + wmsSystemCrnStatusUrl);
+                httpRequestLog.setRequest(JSON.toJSONString(locMast.getBarcode()));
+                httpRequestLog.setResponse(response);
+                httpRequestLog.setCreateTime(new Date());
+                httpRequestLog.setResult(result);
+                httpRequestLogService.insert(httpRequestLog);
+            }
+        }
+
+    }
 }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 751358e..841d4cb 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -17,7 +17,7 @@
       validation-timeout: 3000
       connection-test-query: select 1
     driver-class-name: com.mysql.jdbc.Driver
-    url: jdbc:mysql://127.0.0.1:3306/wcs?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://127.0.0.1:3306/hcwcs?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     username: root
     password: root
   mvc:
@@ -61,7 +61,7 @@
 
 #License鐩稿叧閰嶇疆
 license:
-  subject: crnWcsDev
+  subject: jxhcwcs
   publicAlias: publicCert
   storePass: public_zhongyang_123456789
   licensePath: license.lic
@@ -72,7 +72,8 @@
   threadControlCount: 10
   liftType: lift
 
-mainProcessPlugin: FakeProcess
+#mainProcessPlugin: FakeProcess
+mainProcessPlugin: NormalProcess
 
 deviceLogStorage:
   # 璁惧鏃ュ織瀛樺偍鏂瑰紡 mysql file
diff --git a/src/main/resources/mapper/BasCrnpMapper.xml b/src/main/resources/mapper/BasCrnpMapper.xml
index 8751e37..a8391d8 100644
--- a/src/main/resources/mapper/BasCrnpMapper.xml
+++ b/src/main/resources/mapper/BasCrnpMapper.xml
@@ -20,6 +20,7 @@
         <result column="max_in_task" property="maxInTask" />
         <result column="max_out_task" property="maxOutTask" />
         <result column="deep_rows" property="deepRows" />
+        <result column="arr" property="arr" />
 
     </resultMap>
 
diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml
index 8af8efe..39d9de3 100644
--- a/src/main/resources/mapper/WrkMastMapper.xml
+++ b/src/main/resources/mapper/WrkMastMapper.xml
@@ -29,6 +29,7 @@
         <result column="system_msg" property="systemMsg" />
         <result column="batch" property="batch" />
         <result column="batch_seq" property="batchSeq" />
+        <result column="weight" property="weight" />
 
     </resultMap>
 
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 1b9840b..146effc 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
-var baseUrl = "/wcs";
+var baseUrl = "/hcwcs";
 
 // 璧嬪��
 function setVal(el, val) {
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index f970799..58fdc5a 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -3,7 +3,7 @@
 
 <head>
   <meta charset="utf-8">
-  <title>娴欐睙涓壃 - 鑷姩鍖栫珛浣撲粨搴� - WCS</title>
+  <title>WCS</title>
   <meta name="renderer" content="webkit">
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   <meta name="viewport"
@@ -87,7 +87,7 @@
   <!-- 澶撮儴 -->
   <div class="layui-header">
     <div class="layui-logo">
-      <img src="../static/images/zy-logo-dark.png" style="display: inline-block; width: 60%;height: auto">
+<!--      <img src="../static/images/zy-logo-dark.png" style="display: inline-block; width: 60%;height: auto">-->
       <!--          <span style="margin-top: 0; letter-spacing: 10px">涓壃绔嬪簱</span>-->
       <!--          <img src="../static/image/logo.svg"/>-->
       <!--          <cite>涓壃 - Zoneyung</cite>-->
@@ -142,10 +142,6 @@
   <!-- 涓讳綋閮ㄥ垎 -->
   <div class="layui-body"></div>
   <!-- 搴曢儴 -->
-  <div class="layui-footer layui-text">
-    copyright 漏 2026 娴欐睙涓壃绔嬪簱鎶�鏈湁闄愬叕鍙� all rights reserved.
-    <span class="pull-right" id="system-version">Version loading...</span>
-  </div>
 
 </div>
 
diff --git a/src/main/webapp/views/locMast/locMast_detail.html b/src/main/webapp/views/locMast/locMast_detail.html
index e10ea1d..f36efee 100644
--- a/src/main/webapp/views/locMast/locMast_detail.html
+++ b/src/main/webapp/views/locMast/locMast_detail.html
@@ -57,6 +57,12 @@
                 <input id="locType" class="layui-input" type="text" autocomplete="off">
             </div>
         </div>
+        <div class="layui-inline"  style="width:80%;">
+            <label class="layui-form-label">鎵樼洏鐮侊細</label>
+            <div class="layui-input-inline">
+                <input id="barcode" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
 
         <div id="data-detail-btn" class="layui-btn-container layui-form-item">
             <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="save">淇濆瓨</div>

--
Gitblit v1.9.1