From aa33e56e37cd19b88ae8eea69c5ebc7c6da8b1d2 Mon Sep 17 00:00:00 2001
From: Administrator <pjb>
Date: 星期四, 05 六月 2025 17:59:47 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/glccwcs' into glccwcs

---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 1199 +++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 905 insertions(+), 294 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index 1905621..fd462e2 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1,43 +1,48 @@
 package com.zy.asrs.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.common.Cools;
+import com.core.common.R;
 import com.core.exception.CoolException;
+import com.zy.asrs.controller.CrnController;
+import com.zy.asrs.domain.enums.TaskStatusType;
+import com.zy.asrs.domain.enums.WorkNoType;
+import com.zy.asrs.domain.param.CrnOperatorParam;
 import com.zy.asrs.entity.*;
-import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam;
+import com.zy.asrs.entity.wms.StorageEscalationParam;
 import com.zy.asrs.mapper.BasCrnErrorMapper;
+import com.zy.asrs.mapper.StaDescMapper;
 import com.zy.asrs.mapper.TaskWrkMapper;
-import com.zy.asrs.mapper.WaitPakinMapper;
 import com.zy.asrs.mapper.WrkMastMapper;
 import com.zy.asrs.service.*;
-import com.zy.asrs.utils.CommandUtils;
-import com.zy.asrs.utils.PostMesDataUtils;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.service.CommonService;
-import com.zy.common.utils.HttpHandler;
 import com.zy.core.CrnThread;
 import com.zy.core.DevpThread;
+import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.*;
 import com.zy.core.model.CrnSlave;
+import com.zy.core.model.DevpSlave;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.CrnCommand;
 import com.zy.core.model.protocol.CrnProtocol;
 import com.zy.core.model.protocol.StaProtocol;
 import com.zy.core.properties.SlaveProperties;
+import com.zy.core.thread.BarcodeThread;
 import com.zy.core.thread.SiemensDevpThread;
-import com.zy.system.entity.Config;
-import com.zy.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
+import java.util.Random;
 
 /**
  * 绔嬩綋浠撳簱WCS绯荤粺涓绘祦绋嬩笟鍔�
@@ -57,6 +62,8 @@
     @Autowired
     private LocMastService locMastService;
     @Autowired
+    private LocDetlService locDetlService;
+    @Autowired
     private BasCrnpService basCrnpService;
     @Autowired
     private BasDevpService basDevpService;
@@ -66,74 +73,194 @@
     private BasCrnErrorMapper basCrnErrorMapper;
     @Autowired
     private TaskWrkMapper taskWrkMapper;
+
     @Autowired
     private TaskWrkService taskWrkService;
     @Autowired
-    private ConfigService configService;
+    private CommonService commonService;
+    @Autowired
+    private StaDescMapper staDescMapper;
 
-    @Value("${wms.url}")
-    private String wmsUrl;
-    @Value("${wms.movePath}")
-    private String movePath;
+
+    @Autowired
+    private StaDescService staDescService;
+
+
+    @Autowired
+    private ToWmsService toWmsService;
+
+
+    @Autowired
+    private CrnController crnController;
+
+    @Autowired
+    private TransferTaskService transferTaskService;
+
+    @Autowired
+    private WrkMastService wrkMastService;
+
+    @Autowired
+    private WrkDetlService wrkDetlService;
+
+    @Value("${loc-move.enable}")
+    private boolean enable;
+
+
+    public synchronized void generateStoreWrkFile() {
+        try {
+            // 鏍规嵁杈撻�佺嚎plc閬嶅巻
+            for (DevpSlave devp : slaveProperties.getDevp()) {
+                // 閬嶅巻鍏ュ簱鍙�
+                for (DevpSlave.Sta inSta : devp.getInSta()) {
+                    StorageEscalationParam storageEscalationParam = new StorageEscalationParam();
+                    storageEscalationParam.setStationCode(inSta.getStaNo());
+                    // 鑾峰彇鍏ュ簱绔欎俊鎭�
+                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
+                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
+                    if (staProtocol == null) {
+                        continue;
+                    } else {
+                        staProtocol = staProtocol.clone();
+                    }
+                    Short workNo = staProtocol.getWorkNo();
+                    // 灏哄妫�娴嬪紓甯�
+                    boolean back = false;
+                    String errMsg = "";
+                    if (staProtocol.isFrontErr()) {
+                        errMsg = "鍓嶈秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isBackErr()) {
+                        errMsg = "鍚庤秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isHighErr()) {
+                        errMsg = "楂樿秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isLeftErr()) {
+                        errMsg = "宸﹁秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isRightErr()) {
+                        errMsg = "鍙宠秴闄�";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isWeightErr()) {
+                        errMsg = "瓒呴噸";
+                        back = true;
+                    }
+                    if (!back && staProtocol.isBarcodeErr()) {
+                        errMsg = "鎵爜澶辫触";
+                        back = true;
+                    }
+                    // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
+                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
+                            && !staProtocol.isEmptyMk() && workNo >= 9000 && staProtocol.isPakMk()) {
+                        // 鑾峰彇鏉$爜鎵弿浠俊鎭�
+                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
+                        if (barcodeThread == null) {
+                            continue;
+                        }
+                        String BoxNo = barcodeThread.getBarcode();
+                        if (Cools.isEmpty(BoxNo)) {
+                            log.error("{}鍙锋潯鐮佹壂鎻忓け璐ワ紝鍊硷細{}",inSta.getBarcode(),BoxNo);
+                            continue;
+                        }
+                        TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", BoxNo));
+                        if (!Cools.isEmpty(taskWrk1)) {
+                            log.info("鎵樼洏鐮侊細" + BoxNo + "浠诲姟妗e瓨鍦�");
+                            continue;
+                        }
+                        if (back) {
+                            storageEscalationParam.setWCSStatus(1);
+                            storageEscalationParam.setWCSErrorMessage(storageEscalationParam.getWCSErrorMessage() + errMsg);
+                        }
+                        storageEscalationParam.setBarcode(BoxNo);
+                        storageEscalationParam.setMatIdList(staProtocol.getMatIdList());
+                        log.info("缁勬墭鍏ュ簱={}", storageEscalationParam);
+                        TaskWrk taskWrk = toWmsService.getLocNoFromWms(storageEscalationParam);
+                        if (taskWrk == null) {
+                            log.error("鍏ュ簱璇锋眰wms鍒涘缓浠诲姟宸ヤ綔妗d负绌猴細{}",storageEscalationParam);
+                            continue;
+                        }
+                        if (back) {
+                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
+                            devpThread.setPakMk(staProtocol.getSiteId(), false);
+                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+                            log.info("缁勬墭鍏ュ簱鎵樼洏閫�鍥炲懡浠ゆ帹閫佽緭閫佺嚎闃熷垪鎴愬姛==>{}锛寋}", BoxNo, errMsg);
+                        } else {
+                            StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
+                                    .eq("crn_no", taskWrk.getCrnNo()).eq("type_no", 1).eq("stn_no", staProtocol.getSiteId()));
+                            if (staDesc == null) {
+                                log.error("缁勬墭鍏ュ簱璺緞涓嶅瓨鍦紝wrkNo={},crn={},stn_no={}",taskWrk.getWrkNo(),taskWrk.getCrnNo(),staProtocol.getSiteId());
+                                continue;
+                            }
+                            staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
+                            staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
+                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+                            log.info("缁勬墭鍏ュ簱鍛戒护鎺ㄩ�佽緭閫佺嚎闃熷垪鎴愬姛:{}",staProtocol);
+                        }
+
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("generateStoreWrkFile e", e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+    }
+
 
     /**
      * 鍫嗗灈鏈虹珯鍑哄簱鍒板嚭搴撶珯
      */
-    @Async
     public void crnStnToOutStn() {
         for (CrnSlave crnSlave : slaveProperties.getCrn()) {
             // 閬嶅巻鍫嗗灈鏈哄嚭搴撶珯
             for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
-                // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
-                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
-                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
-                if (staProtocol == null) {
-                    continue;
-                } else {
-                    staProtocol = staProtocol.clone();
-                }
-                if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
-                    // 鏌ヨ宸ヤ綔妗�
-                    TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), staProtocol.getSiteId().toString());
-                    if (taskWrk == null) {
-                        continue;
-                    }
-                    // 鍒ゆ柇宸ヤ綔妗f潯浠�
-                    if (taskWrk.getWrkSts() == 12 && taskWrk.getIoType() == 2) {
-                        // 鍒ゆ柇鍚婅溅鏄惁瀹為檯宸插畬鎴愶紝涓旂數鑴戠姸鎬佸湪move涓紝浠ュ鐢佃剳杩涜鏇存柊宸ヤ綔妗�
-                        CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, taskWrk.getCrnNo());
-                        CrnProtocol crnProtocol = crnThread.getCrnProtocol();
-                        if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
-                            // 绉诲姩涓�
+                    try {
+                        // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
+                        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
+                        StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+                        if (staProtocol == null) {
                             continue;
+                        } else {
+                            staProtocol = staProtocol.clone();
                         }
-                        //  鍒ゆ柇鍫嗗灈鏈虹姸鎬佺瓑寰呯‘璁�
-                        if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(taskWrk.getWrkNo().shortValue())
-                                && crnProtocol.getTaskFinish() == 1
-                                && crnProtocol.forkPosType == CrnForkPosType.HOME) {
-                            // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
-
-                            // 涓嬪彂绔欑偣淇℃伅
-                            staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
-                            String targetPoint = taskWrk.getTargetPoint();
-                            int i = Integer.parseInt(targetPoint);
-                            staProtocol.setStaNo((short)i);
-                            if (!CommandUtils.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) {
+                        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
+                            // 鏌ヨ宸ヤ綔妗�
+                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), String.valueOf(crnStn.getStaNo()-1));
+                            if (taskWrk == null) {
                                 continue;
                             }
+                                log.info("涓嬪彂杈撻�佺嚎浠诲姟锛歵askWrk:" + JSON.toJSONString(taskWrk));
+                                staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
+                                staProtocol.setStaNo(Short.valueOf(taskWrk.getTargetPoint()));
+                                boolean offer = false;
+                                try {
+                                    offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
+                                } catch (Exception e) {
+                                    log.error("涓嬪彂杈撻�佺嚎浠诲姟澶辫触锛氬紓甯�:" + e);
+                                    log.error("涓嬪彂杈撻�佺嚎浠诲姟澶辫触锛氬紓甯�:offer:" + offer);
+                                }
+                                if (offer) {
+                                    log.info("涓嬪彂杈撻�佺嚎浠诲姟鎴愬姛锛歵askWrk:" + JSON.toJSONString(taskWrk));
+                                    taskWrk.setStatus(5);
+                                    taskWrk.setWrkSts(14);
+                                    taskWrk.setCompleteTime(new Date());
+                                    taskWrkService.updateById(taskWrk);
 
-                            // 鏇存柊宸ヤ綔妗g姸鎬佷负14澶辫触
-                            taskWrk.setWrkSts(14);
-                            if (taskWrkMapper.updateById(taskWrk) != 0) {
-                                // 澶嶄綅鍫嗗灈鏈�
-                                crnThread.setResetFlag(true);
-                            } else {
-                                log.error("鏇存柊宸ヤ綔妗g殑宸ヤ綔鐘舵�佷负14澶辫触锛侊紒锛� [宸ヤ綔鍙�:{}]", taskWrk.getWrkNo());
-                            }
-
+                                } else {
+                                    log.error("涓嬪彂杈撻�佺嚎浠诲姟澶辫触锛歵askWrk:" + JSON.toJSONString(taskWrk));
+                                }
+//                            }
                         }
+                    } catch (Exception e) {
+                        log.error("鍑哄簱鍒板嚭搴撶珯寮傚父:寮傚父淇℃伅锛�" + e);
                     }
-                }
+//                }
+
             }
         }
     }
@@ -141,12 +268,14 @@
     /**
      * 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
      */
-    public synchronized void crnIoExecute(){
+    public synchronized void crnIoExecute() throws IOException {
         for (CrnSlave crn : slaveProperties.getCrn()) {
             // 鑾峰彇鍫嗗灈鏈轰俊鎭�
             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
             CrnProtocol crnProtocol = crnThread.getCrnProtocol();
-            if (crnProtocol == null) { continue; }
+            if (crnProtocol == null) {
+                continue;
+            }
             BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
             if (basCrnp == null) {
                 log.error("{}鍙峰爢鍨涙満灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", crn.getId());
@@ -176,9 +305,9 @@
                         crnProtocol.setLastIo("O");
                     }
                 }
+                // 搴撲綅绉昏浆
+                this.locToLoc(crn, crnProtocol);
             }
-            // 搴撲綅绉昏浆
-            this.locToLoc(crn, crnProtocol);
 
         }
     }
@@ -186,205 +315,47 @@
     /**
      * 鍏ュ簱  ===>>  鍫嗗灈鏈虹珯鍒板簱浣�
      */
-    public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol){
+    public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException {
         for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
-            boolean flag = false;
-            // 鑾峰彇鍫嗗灈鏈哄叆搴撶珯淇℃伅
-            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
-            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
-            if (staProtocol == null) {
-                continue;
-            } else {
-                staProtocol = staProtocol.clone();
-            }
-            // 鏌ヨ绔欑偣璇︾粏淇℃伅
-            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
-            if (staDetl == null) {
-                log.error("鍏ュ簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
-                continue;
-            }
-            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
-                    && staDetl.getCanining()!=null && staDetl.getCanining().equals("Y")) {
-                flag = true;
-            }
-            if (!flag) {
-                continue;
-            }
-            // 鑾峰彇宸ヤ綔鐘舵�佷负2锛堣澶囦笂璧帮級鐨勫叆搴撳伐浣滄。
-            TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo().toString());
-            if(null == taskWrk) {
-                continue;
-            }
-
-            // 鍫嗗灈鏈烘帶鍒惰繃婊�
-            if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
-                continue;
-            }
-
-            // 宸茬粡瀛樺湪鍚婅溅鎵ц浠诲姟鏃讹紝鍒欒繃婊�
-            if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
-                continue;
-            }
-
-            // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
-            CrnCommand crnCommand = new CrnCommand();
-            crnCommand.setCrnNo(slave.getId()); // 鍫嗗灈鏈虹紪鍙�
-            crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 宸ヤ綔鍙�
-            crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
-            crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 浠诲姟妯″紡:  搴撲綅绉昏浆
-            crnCommand.setSourcePosX(crnStn.getBay().shortValue());     // 婧愬簱浣嶅垪
-            crnCommand.setSourcePosY(crnStn.getLev().shortValue());     // 婧愬簱浣嶅眰
-            crnCommand.setSourcePosZ(crnStn.getRow().shortValue());     // 婧愬簱浣嶆帓
-            crnCommand.setDestinationPosX(Utils.getBayShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅鍒�
-            crnCommand.setDestinationPosY(Utils.getLevShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅灞�
-            crnCommand.setDestinationPosZ(Utils.getRowShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅鎺�
-            crnCommand.setCommand((short)1);
-            if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
-                log.error("鍫嗗灈鏈哄懡浠や笅鍙戝け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
-            } else {
-                // 淇敼宸ヤ綔妗g姸鎬� 2.璁惧涓婅蛋 => 3.鍚婅溅鍏ュ簱涓�
-                Date now = new Date();
-                taskWrk.setWrkSts(3);
-                taskWrk.setModiTime(now);
-                if (taskWrkMapper.updateById(taskWrk) == 0) {
-                    log.error("淇敼宸ヤ綔妗g姸鎬� 2.璁惧涓婅蛋 => 3.鍚婅溅鍏ュ簱涓� 澶辫触锛侊紒锛屽伐浣滃彿={}", taskWrk.getWrkNo());
-                }
-            }
-            return;
-        }
-    }
-
-    /**
-     * 鍑哄簱  ===>>  搴撲綅鍒板爢鍨涙満绔�
-     * 2022-06-09 TQS淇敼锛屾煡璇㈠伐浣滄。LIST锛岄亶鍘嗕笅鍙戯紝闃叉绗竴涓换鍔″牭濉炲嚭搴�
-     */
-    public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){
-        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
-            // 鑾峰彇宸ヤ綔鐘舵�佷负11锛堢敓鎴愬嚭搴揑D锛夌殑鍑哄簱宸ヤ綔妗�
-            List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(), crnStn.getStaNo().toString());
-            for (TaskWrk taskWrk : taskWrks){
-                if (taskWrk == null) {
-                    continue;
-                }
-                // 宸ヤ綔妗g姸鎬佸垽鏂�
-                if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null) {
-                    log.error("鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/绔欑偣, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", taskWrk.getWrkNo(), taskWrk.getTargetPoint(), taskWrk.getIoType());
-                    continue;
-                }
-                // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
-                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
+            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo()));
+            for (StaDesc staDesc : staDescs) {
+                boolean flag = false;
+                // 鑾峰彇鍫嗗灈鏈哄叆搴撶珯淇℃伅
+                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                 StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                 if (staProtocol == null) {
-                    break;
+                    continue;
                 } else {
                     staProtocol = staProtocol.clone();
                 }
-
                 // 鏌ヨ绔欑偣璇︾粏淇℃伅
                 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                 if (staDetl == null) {
-                    log.error("鍑哄簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
-                    break;
-                }
-
-                // 鍒ゆ柇鍫嗗灈鏈哄嚭搴撶珯鐘舵��
-                if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y")
-                        && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
-                    // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
-
-                    // 鍫嗗灈鏈烘帶鍒惰繃婊�
-                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
-                        break;
-                    }
-
-                    // 宸茬粡瀛樺湪鍚婅溅鎵ц浠诲姟鏃讹紝鍒欒繃婊�
-                    if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
-                        break;
-                    }
-
-                    // 鍙屾繁搴撲綅涓旀祬搴撲綅鏈夎揣锛屽垯闇�鍏堝娴呭簱浣嶈繘琛屽簱浣嶇Щ杞�
-                    if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) {
-
-                        taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo());
-
-                        List<TaskWrk> taskWrks1 = taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo());
-                        if (Cools.isEmpty(taskWrks1) && taskWrks1.size()!=0){
-                            continue;
-                        }
-                        String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint());
-                        TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo);
-                        if (!Cools.isEmpty(hallowLocNoTask)){
-                            if (!Cools.isEmpty(hallowLocNoTask.getTargetPoint())){
-                                continue;
-                            }
-//                            new PostMesDataUtils().postMesData("绉诲簱浠诲姟鍒嗛厤搴撲綅",wmsUrl,movePath,hallowLocNoTask);
-                            try {
-                                String response = new HttpHandler.Builder()
-                                        .setUri(wmsUrl)
-                                        .setPath(movePath)
-                                        .setJson(JSON.toJSONString(hallowLocNoTask))
-                                        .build()
-                                        .doPost();
-                                System.out.println("response:"+response);
-                                JSONObject jsonObject = JSON.parseObject(response);
-                                if (jsonObject.getInteger("code").equals(200)) {
-                                    //瑙f瀽
-                                }
-                            }catch (Exception e){
-                                log.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl+"/"+movePath, JSON.toJSONString(hallowLocNoTask), "璇锋眰绉诲簱浠诲姟鍒嗛厤搴撲綅");
-                            }
-                            continue;
-                        }
-                    }
-
-                    // 1.鍫嗗灈鏈哄紑濮嬬Щ鍔�
-                    CrnCommand crnCommand = new CrnCommand();
-                    crnCommand.setCrnNo(slave.getId()); // 鍫嗗灈鏈虹紪鍙�
-                    crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 宸ヤ綔鍙�
-                    crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
-                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 浠诲姟妯″紡:  搴撲綅绉昏浆
-                    crnCommand.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint()));     // 婧愬簱浣嶆帓
-                    crnCommand.setSourcePosY(Utils.getBayShort(taskWrk.getStartPoint()));     // 婧愬簱浣嶅垪
-                    crnCommand.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint()));     // 婧愬簱浣嶅眰
-                    crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 鐩爣搴撲綅鎺�
-                    crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 鐩爣搴撲綅鍒�
-                    crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 鐩爣搴撲綅灞�
-                    if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
-                        log.error("鍫嗗灈鏈哄懡浠や笅鍙戝け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
-                    } else {
-                        // 淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓�
-                        Date now = new Date();
-                        taskWrk.setWrkSts(12);
-                        taskWrk.setModiTime(now);
-                        if (taskWrkMapper.updateById(taskWrk) == 0) {
-                            log.error("淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓� 澶辫触锛侊紒锛屽伐浣滃彿={}", taskWrk.getWrkNo());
-                        }
-                        break;
-                    }
-                    return;
-                }
-            }
-        }
-    }
-
-    /**
-     * 搴撲綅绉昏浆
-     */
-    public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol){
-        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
-            // 鑾峰彇宸ヤ綔鐘舵�佷负11锛堢敓鎴愬嚭搴揑D锛夌殑绉诲簱宸ヤ綔妗�
-            List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut3(slave.getId(), crnStn.getStaNo().toString());
-            for (TaskWrk taskWrk : taskWrks){
-                if (taskWrk == null || Cools.isEmpty(taskWrk.getTargetPoint()) || taskWrk.getTargetPoint().equals("")) {
+                    log.error("鍏ュ簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
                     continue;
                 }
-                // 宸ヤ綔妗g姸鎬佸垽鏂�
-                if (taskWrk.getIoType() != 3 || taskWrk.getTargetPoint() == null) {
-                    log.error("鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/鐩爣搴撲綅鍙�, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", taskWrk.getWrkNo(), taskWrk.getTargetPoint(), taskWrk.getIoType());
+                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
+                        && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
+                    flag = true;
+                }
+                if (!flag) {
                     continue;
                 }
 
-                // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+                // 鑾峰彇宸ヤ綔鐘舵�佷负2锛堣澶囦笂璧帮級鐨勫叆搴撳伐浣滄。
+                TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString());
+                if (null == taskWrk) {
+                    continue;
+                }
+
+                LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
+                if(!locMast.getLocSts().equals("O") && taskWrk.getWrkSts() == 2) {
+                    log.error("鍏ュ簱WMS鍒嗛厤搴撲綅{}鏈夎锛屽簱浣嶇姸鎬佷负{}",locMast.getLocNo(),locMast.getLocSts());
+                    taskWrk.setWrkSts(5);
+                    taskWrk.setMemo("WMS鍒嗛厤搴撲綅鏈夎");
+                    taskWrkService.updateById(taskWrk);
+                    continue;
+                }
 
                 // 鍫嗗灈鏈烘帶鍒惰繃婊�
                 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
@@ -395,6 +366,209 @@
                 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                     continue;
                 }
+
+//                int workNo = commonService.getWorkNo(WorkNoType.PAKIN.type);//鑾峰彇鍏ュ簱宸ヤ綔鍙�
+//                taskWrk.setWrkNo(workNo);//宸ヤ綔鍙�
+                taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//娲惧彂鐘舵��
+                taskWrk.setExecuteTime(new Date());
+//                taskWrk.setAssignTime(new Date());//娲惧彂鏃堕棿
+                taskWrk.setWrkSts(3);//宸ヤ綔鐘舵�� 3.鍚婅溅鍏ュ簱
+                taskWrk.setCrnNo(staDesc.getCrnNo());//鍫嗗灈鏈哄彿
+//                taskWrk.setModiTime(new Date());
+//                taskWrk.setModiUser(9988L);
+
+                // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+                CrnCommand crnCommand = new CrnCommand();
+                crnCommand.setCrnNo(staDesc.getCrnNo()); // 鍫嗗灈鏈虹紪鍙�
+                crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 宸ヤ綔鍙�
+                crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
+                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 浠诲姟妯″紡:  搴撲綅绉昏浆
+                crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 婧愬簱浣嶅垪
+                crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 婧愬簱浣嶅眰
+                crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 婧愬簱浣嶆帓
+                crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅鍒�
+                crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅灞�
+                crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅鎺�
+                crnCommand.setCommand((short) 1);
+                log.info("鍫嗗灈鏈哄叆搴撲换鍔′笅鍙�={}", crnCommand);
+                if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
+                    log.error("鍫嗗灈鏈哄懡浠ょ敓鎴愬け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
+                    throw new CoolException("鍫嗗灈鏈哄懡浠ょ敓鎴愬け璐�");
+                } else {
+                    try {
+                        // 涓婃姤鎵ц鐘舵��
+                        toWmsService.executionStatusReport(taskWrk.getTaskNo(), taskWrk.getWrkSts());
+                        taskWrkService.updateById(taskWrk);
+                    } catch (Exception e) {
+                        log.error("淇敼宸ヤ綔妗g姸鎬� 2.璁惧涓婅蛋 => 3.鍚婅溅鍏ュ簱涓� 澶辫触锛侊紒锛屽伐浣滃彿={}", taskWrk.getWrkNo());
+                        log.error("淇敼宸ヤ綔妗g姸鎬� 2.璁惧涓婅蛋 => 3.鍚婅溅鍏ュ簱涓� 澶辫触锛侊紒锛屽紓甯革細" + e);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 鍑哄簱  ===>>  搴撲綅鍒板爢鍨涙満绔�
+     * 2022-06-09 TQS淇敼锛屾煡璇㈠伐浣滄。LIST锛岄亶鍘嗕笅鍙戯紝闃叉绗竴涓换鍔″牭濉炲嚭搴�
+     */
+    public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) {
+        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null);
+        if (taskWrksInitial.size() == 0) {
+            return;
+        }
+        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
+            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo()));
+            for (StaDesc staDesc : staDescs) {
+                // 鑾峰彇宸ヤ綔鐘舵�佷负11锛堢敓鎴愬嚭搴揑D锛夌殑鍑哄簱宸ヤ綔妗�
+                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(), staDesc.getStnNo().toString());
+                for (TaskWrk taskWrk : taskWrks) {
+                    if (taskWrk == null) {
+                        continue;
+                    }
+                    // 宸ヤ綔妗g姸鎬佸垽鏂�
+                    if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) {
+                        log.error("鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/绔欑偣, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType());
+                        continue;
+                    }
+
+                    LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
+                    //鍒ゆ柇鍏跺簱浣嶆槸鍚︿负娣卞簱浣嶏紝濡傛灉涓烘繁搴撲綅鎵惧叾娴呭簱浣嶆槸閮芥湁璐�
+                    int flag = 0;
+                    if (locMast.getRow1() == 1 || locMast.getRow1() == 5 || locMast.getRow1() == 9) {
+                        flag = 1;
+                    } else if (locMast.getRow1() == 4 || locMast.getRow1() == 8 || locMast.getRow1() == 12) {
+                        flag = 2;
+                    }
+                    if (flag == 1) {
+                        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
+                                .eq("row1", (locMast.getRow1() + 1))
+                                .eq("bay1", locMast.getBay1())
+                                .eq("lev1", locMast.getLev1()).eq("loc_sts", "F"));
+                        if (!Cools.isEmpty(locMast1)) {
+                            log.info(locMast.getLocNo() + "鍑烘繁搴撲綅锛屾祬搴撲綅鏈夎揣");
+                            continue;
+                        }
+                    } else if (flag == 2){
+                        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
+                                .eq("row1", (locMast.getRow1() - 1))
+                                .eq("bay1", locMast.getBay1())
+                                .eq("lev1", locMast.getLev1()).eq("loc_sts", "F"));
+                        if (!Cools.isEmpty(locMast1)) {
+                            log.info(locMast.getLocNo() + "鍑烘繁搴撲綅锛屾祬搴撲綅鏈夎揣");
+                            continue;
+                        }
+                    }
+
+
+                    // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
+                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
+                    StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+                    if (staProtocol == null) {
+                        break;
+                    } else {
+                        staProtocol = staProtocol.clone();
+                    }
+
+                    // 鏌ヨ绔欑偣璇︾粏淇℃伅
+                    BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
+                    if (staDetl == null) {
+                        log.error("鍑哄簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
+                        break;
+                    }
+
+                    // 鍒ゆ柇鍫嗗灈鏈哄嚭搴撶珯鐘舵��
+                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
+                            && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
+                        // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+
+                        // 鍫嗗灈鏈烘帶鍒惰繃婊�
+                        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
+                            break;
+                        }
+
+                        // 宸茬粡瀛樺湪鍚婅溅鎵ц浠诲姟鏃讹紝鍒欒繃婊�
+                        if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
+                            break;
+                        }
+                        CrnCommand command = new CrnCommand();
+                        command.setCrnNo(taskWrk.getCrnNo()); // 鍫嗗灈鏈虹紪鍙�
+                        command.setTaskNo(taskWrk.getWrkNo().shortValue()); // 宸ヤ綔鍙�
+                        command.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
+                        command.setTaskMode(CrnTaskModeType.PAKIN); // 浠诲姟妯″紡
+                        command.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint()));     // 婧愬簱浣嶆帓
+                        command.setSourcePosY(Utils.getBayShort(taskWrk.getStartPoint()));     // 婧愬簱浣嶅垪
+                        command.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint()));     // 婧愬簱浣嶅眰
+                        command.setDestinationPosX(crnStn.getRow().shortValue());     // 鐩爣搴撲綅鎺�
+                        command.setDestinationPosY(crnStn.getBay().shortValue());     // 鐩爣搴撲綅鍒�
+                        command.setDestinationPosZ(crnStn.getLev().shortValue());     // 鐩爣搴撲綅灞�
+                        command.setCommand((short) 1);
+
+                        if (Cools.isEmpty(taskWrk.getMarkStart()) || taskWrk.getMarkStart() == 0) {
+                            toWmsService.addReportLog(taskWrk);
+                            taskWrk.setMarkStart(1);
+                        }
+
+                        if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command))) {
+                            log.error("鍫嗗灈鏈哄懡浠ょ敓鎴愬け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", taskWrk.getCrnNo(), JSON.toJSON(command));
+                            throw new CoolException("鍫嗗灈鏈哄懡浠ょ敓鎴愬け璐�");
+                        } else {
+                            try {
+                                // 淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓�
+                                Date now = new Date();
+                                taskWrk.setWrkSts(12);
+                                taskWrk.setStatus(2);
+                                taskWrk.setExecuteTime(now);
+                                if (taskWrkMapper.updateById(taskWrk) == 0) {
+                                    log.error("淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓� 澶辫触锛侊紒锛屽伐浣滃彿={}", taskWrk.getWrkNo());
+                                }
+                                // 涓婃姤鎵ц鐘舵��
+                                toWmsService.executionStatusReport(taskWrk.getTaskNo(), taskWrk.getWrkSts());
+                            } catch (Exception e) {
+                                log.error("淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓� 澶辫触锛侊紒锛屽伐浣滃彿={}", taskWrk.getWrkNo());
+                                log.error("淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓� 澶辫触锛侊紒锛屽紓甯革細" + e);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 搴撲綅绉昏浆
+     */
+    public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol) {
+        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
+            // 鑾峰彇宸ヤ綔鐘舵�佷负11锛堢敓鎴愬嚭搴揑D锛夌殑绉诲簱宸ヤ綔妗�
+            List<TaskWrk> taskWrks = taskWrkMapper.selectList(new EntityWrapper<TaskWrk>()
+                    .eq("crn_no", slave.getId())
+                    .eq("wrk_sts", 11)
+                    .eq("io_type", 3)
+                    .orderBy("io_pri", false));
+            for (TaskWrk taskWrk : taskWrks) {
+
+
+                // 鍫嗗灈鏈烘帶鍒惰繃婊�
+                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
+                    continue;
+                }
+
+                // 宸茬粡瀛樺湪鍚婅溅鎵ц浠诲姟鏃讹紝鍒欒繃婊�
+                if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
+                    continue;
+                }
+
+                if (taskWrk == null || Cools.isEmpty(taskWrk.getTargetPoint()) || taskWrk.getTargetPoint().equals("") || taskWrk.getWrkNo() == null) {
+                    continue;
+                }
+                // 宸ヤ綔妗g姸鎬佸垽鏂�
+                if (taskWrk.getIoType() != 3 || taskWrk.getTargetPoint() == null) {
+                    log.error("鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/鐩爣搴撲綅鍙�, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", taskWrk.getWrkNo(), taskWrk.getTargetPoint(), taskWrk.getIoType());
+                    continue;
+                }
+
+                // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
 
 
                 // 1.鍫嗗灈鏈哄紑濮嬬Щ鍔�
@@ -409,17 +583,20 @@
                 crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅鎺�
                 crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅鍒�
                 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 鐩爣搴撲綅灞�
-                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
+                crnCommand.setCommand((short) 1);
+                if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
                     log.error("鍫嗗灈鏈哄懡浠や笅鍙戝け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                 } else {
                     // 淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓�
                     Date now = new Date();
                     taskWrk.setWrkSts(12);
+                    taskWrk.setStatus(2);
+                    taskWrk.setExecuteTime(now);
                     taskWrk.setModiTime(now);
                     if (taskWrkMapper.updateById(taskWrk) == 0) {
                         log.error("淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓� 澶辫触锛侊紒锛屽伐浣滃彿={}", taskWrk.getWrkNo());
                     }
-                    break;
+                    toWmsService.addReportLog(taskWrk);
                 }
                 return;
             }
@@ -427,38 +604,78 @@
 
     }
 
+
     /**
      * 鎵ц瀵瑰伐浣滄。鐨勫畬鎴愭搷浣�
      */
-    @Async
-    public void storeFinished() {
+    public void storeFinished() throws InterruptedException {
         for (CrnSlave crn : slaveProperties.getCrn()) {
             // 鑾峰彇鍫嗗灈鏈轰俊鎭�
             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
             CrnProtocol crnProtocol = crnThread.getCrnProtocol();
-            if (crnProtocol == null) { continue; }
+            if (crnProtocol == null) {
+                continue;
+            }
+
             //  鐘舵�侊細绛夊緟纭 骞朵笖  浠诲姟瀹屾垚浣� = 1
-            if (crnProtocol.getTaskFinish() == 1 && crnProtocol.getTaskNo() != 0) {
-                // 鑾峰彇鍏ュ簱寰呯‘璁ゅ伐浣滄。
-                TaskWrk taskWrk = taskWrkMapper.selectCrnNoWorking(crn.getId(),crnProtocol.getTaskNo().intValue());
-                if (taskWrk == null) {
+            if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) {
+                //鑾峰彇鍏ュ簱寰呯‘璁ゅ伐浣滄。
+                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(), crnProtocol.getTaskNo().intValue());
+                if (Cools.isEmpty(taskWrk) && crnProtocol.getTaskNo() != 999) {
                     log.error("鍫嗗灈鏈哄浜庣瓑寰呯‘璁や笖浠诲姟瀹屾垚鐘舵�侊紝浣嗘湭鎵惧埌宸ヤ綔妗c�傚爢鍨涙満鍙�={}锛屽伐浣滃彿={}", crn.getId(), crnProtocol.getTaskNo());
                     continue;
                 }
-                // 鍏ュ簱 + 搴撲綅杞Щ  ==> 4.鍏ュ簱瀹屾垚
-                if (taskWrk.getWrkSts() == 3 || (taskWrk.getWrkSts() == 12 && taskWrk.getIoType() == 3)) {
-                    taskWrk.setWrkSts(4);
-                } else {
-                    continue;
+                //纭瀹屾垚淇″彿
+                CrnOperatorParam crnOperatorParam = new CrnOperatorParam();
+                crnOperatorParam.setCrnNo(crn.getId());
+                R r = crnController.crnTaskComplete(crnOperatorParam);
+                Thread.sleep(1000);
+                if (!r.get("code").equals(200)) {
+                    return;
                 }
-                Date now = new Date();
-                taskWrk.setModiTime(now);
-                Integer integerTaskWrk = taskWrkMapper.updateById(taskWrk);
-                // 淇敼鎴愬姛鍚庡浣嶅爢鍨涙満
-                if (integerTaskWrk > 0) {
-                    // 鍫嗗灈鏈哄浣�
-                    crnThread.setResetFlag(true);
+                if (!Cools.isEmpty(taskWrk)) {
+                    if (taskWrk.getIoType() == 1 && taskWrk.getWrkSts() == 3) {
+                        taskWrk.setWrkSts(4);//鍏ュ簱瀹屾垚
+                        taskWrk.setStatus(5);//瀹岀粨
+                        //鏇存柊搴撲綅鐘舵��
+                        LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
+                        locMast.setLocSts("F");//F.鍦ㄥ簱
+                        locMast.setBarcode(taskWrk.getBarcode());//鎵樼洏鐮�
+                        locMast.setModiTime(new Date());
+                        locMast.setModiUser(9999L);
+                        locMastService.updateById(locMast);
+                    } else if (taskWrk.getIoType() == 2 && taskWrk.getWrkSts() == 12) {
+                        taskWrk.setWrkSts(13);//鍑哄簱瀹屾垚
+                        taskWrk.setStatus(5);//瀹岀粨
+                        //鏇存柊搴撲綅鐘舵��
+                        LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
+                        locMast.setLocSts("O");//O.绌哄簱浣�
+                        locMast.setBarcode("");//鎵樼洏鐮�
+                        locMast.setModiTime(new Date());
+                        locMast.setModiUser(9999L);
+                        locMastService.updateById(locMast);
+                    } else if (taskWrk.getIoType() == 3 && taskWrk.getWrkSts() == 12) {
+                        taskWrk.setWrkSts(4);//鍏ュ簱瀹屾垚
+                        taskWrk.setStatus(5);//瀹岀粨
+                        //鏇存柊搴撲綅鐘舵��
+                        LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
+                        locMast.setLocSts("F");//F.鍦ㄥ簱
+                        locMast.setBarcode(taskWrk.getBarcode());//鎵樼洏鐮�
+                        locMast.setModiTime(new Date());
+                        locMast.setModiUser(9999L);
+                        locMastService.updateById(locMast);
+
+                        LocMast locMast1 = locMastService.selectByLocNo(taskWrk.getStartPoint());
+                        locMast1.setLocSts("O");//O.绌哄簱浣�
+                        locMast1.setBarcode("");//鎵樼洏鐮�
+                        locMast1.setModiTime(new Date());
+                        locMast1.setModiUser(9999L);
+                        locMastService.updateById(locMast1);
+                    }
+                    taskWrk.setCompleteTime(new Date());
+                    taskWrkService.updateById(taskWrk);
                 }
+
             }
         }
     }
@@ -466,8 +683,7 @@
     /**
      * 鍫嗗灈鏈哄紓甯镐俊鎭褰�
      */
-    @Async
-    public void recCrnErr(){
+    public void recCrnErr() {
         Date now = new Date();
         for (CrnSlave crn : slaveProperties.getCrn()) {
             // 鑾峰彇鍫嗗灈鏈轰俊鎭�
@@ -476,20 +692,20 @@
             if (crnProtocol == null) {
                 continue;
             }
-            if (true) {
+            if (false) {
 //            if (crnProtocol.getModeType() != CrnModeType.STOP) {
                 // 鏈変换鍔�
                 if (crnProtocol.getTaskNo() != 0) {
                     BasErrLog latest = basErrLogService.findLatestByTaskNo(crn.getId(), crnProtocol.getTaskNo().intValue());
                     // 鏈夊紓甯�
                     if (latest == null) {
-                        if (crnProtocol.getAlarm1() != null && crnProtocol.getAlarm1() > 0) {
+                        if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) {
                             WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo());
                             if (wrkMast == null) {
                                 continue;
                             }
-                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1());
-                            String errName = crnError==null? String.valueOf(crnProtocol.getAlarm1()):crnError.getErrName();
+                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
+                            String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName();
                             BasErrLog basErrLog = new BasErrLog(
                                     null,    // 缂栧彿
                                     wrkMast.getWrkNo(),    // 宸ヤ綔鍙�
@@ -528,15 +744,15 @@
                             }
                         }
                     }
-                // 鏃犱换鍔�
+                    // 鏃犱换鍔�
                 } else {
                     BasErrLog latest = basErrLogService.findLatest(crn.getId());
                     // 鏈夊紓甯�
-                    if (crnProtocol.getAlarm1() != null && crnProtocol.getAlarm1() > 0) {
+                    if (crnProtocol.getAlarm1() != null && crnProtocol.getAlarm() > 0) {
                         // 璁板綍鏂板紓甯�
-                        if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm1().intValue())) {
-                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1());
-                            String errName = crnError==null? String.valueOf(crnProtocol.getAlarm1()):crnError.getErrName();
+                        if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) {
+                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
+                            String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName();
                             BasErrLog basErrLog = new BasErrLog(
                                     null,    // 缂栧彿
                                     null,    // 宸ヤ綔鍙�
@@ -551,7 +767,7 @@
                                     null,    // 婧愮珯
                                     null,    // 婧愬簱浣�
                                     null,    // 鏉$爜
-                                    (int)crnProtocol.getAlarm1(),    // 寮傚父鐮�
+                                    (int) crnProtocol.getAlarm1(),    // 寮傚父鐮�
                                     errName,    // 寮傚父
                                     1,    // 寮傚父鎯呭喌
                                     now,    // 娣诲姞鏃堕棿
@@ -564,7 +780,7 @@
                                 log.error("鍫嗗灈鏈簆lc寮傚父璁板綍澶辫触 ===>> [id:{}] [error:{}]", crn.getId(), errName);
                             }
                         }
-                    // 鏃犲紓甯�
+                        // 鏃犲紓甯�
                     } else {
                         // 寮傚父淇
                         if (latest != null && latest.getStatus() == 1) {
@@ -582,25 +798,420 @@
         }
     }
 
-    //鑷姩娲惧彂浠诲姟
-    public void autoDistribute() {
-        Config config = configService.selectByCode("autoDistribute");
-        if (config == null) {
-            return;
+
+    //agv鍙栨斁璐т换鍔″畬鎴�
+    public synchronized void autoCompleteAGV() {
+        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
+        try {
+            Thread.sleep(500);
+        } catch (Exception e) {
+
         }
 
-        if (config.getValue().equals("false")) {//鍒ゆ柇鏄惁寮�鍚嚜鍔ㄦ淳鍙戜换鍔�
-            return;
-        }
+        for (BasDevp basDevp : basDevps) {
+            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
+            StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo());
+            if (staProtocol == null) {
+                continue;
+            } else {
+                staProtocol = staProtocol.clone();
+            }
+            if (basDevp.getWrkNo() != 0) {
+                if (basDevp.getAgvTargetPick() != 0) {//鍙栬揣
+                    staProtocol.setAgvTypeSign((short) 0);
+                    staProtocol.setStaNo(basDevp.getDevNo().shortValue());
+                    MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
+                }
+                boolean sign = true;
+                if (basDevp.getAgvTargetPlace() != 0) {
+                    sign = false;
+                    basDevp.setAgvTargetPlace(0);
+                    basDevpService.updateById(basDevp);
+                    staProtocol.setAgvTypeSign((short) 3);//1
+                    staProtocol.setStaNo(basDevp.getDevNo().shortValue());
+                    MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
+                }
+            } else {
+                if (basDevp.getAgvTargetPlace() != 0) {
+                    if (basDevp.getLoading().equals("Y")) {
+                        staProtocol.setAgvTypeSign((short) 1);
+                        staProtocol.setStaNo(basDevp.getDevNo().shortValue());
+                        MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
+                    } else {
+                        log.error("AGV鏀捐揣瀹屾垚浣嗚緭閫佺嚎鏃犵墿锛屽浣嶄俊鍙� ===>> [staNo:{}] [basDevp:{}]", basDevp.getDevNo(), basDevp);
+                        basDevp.setAgvTargetPlace(0);
+                        basDevpService.updateById(basDevp);
+                        staProtocol.setAgvTypeSign((short) 3);//1
+                        staProtocol.setStaNo(basDevp.getDevNo().shortValue());
+                        MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
+                    }
 
-        for (TaskWrk taskWrk : taskWrkService.selectReceive()) {
-            try {
-                taskWrkService.distribute(taskWrk.getTaskNo(), 9527L);
-            } catch (CoolException e) {
-                e.printStackTrace();
+                }
+                if (basDevp.getAgvTargetPick() != 0) {
+                    basDevp.setAgvTargetPick(0);
+                    basDevpService.updateById(basDevp);
+                    staProtocol.setAgvTypeSign((short) 2);//0
+                    staProtocol.setStaNo(basDevp.getDevNo().shortValue());
+                    MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol));
+                }
             }
         }
     }
 
 
+    /**
+     * 鍏ュ嚭搴撴ā寮忓垏鎹㈠嚱鏁�
+     */
+    public synchronized void ioConvert() {
+        try {
+            // 鏍规嵁杈撻�佺嚎plc閬嶅巻
+            for (DevpSlave devp : slaveProperties.getDevp()) {
+                if (devp.getId() == 2) {
+                    continue;
+                }
+                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
+                for (DevpSlave.Sta inSta : devp.getInSta()) {
+                    WrkMast pakout = wrkMastMapper.selectWorkingPakout(inSta.getBackSta());
+                    switch (inSta.getBackSta()) {
+                        case 116:
+                            if (pakout != null) {
+                                if (devpThread.ioModeOf1F1 != IoModeType.PAKOUT_MODE) {
+                                    // 鍑哄簱鍒囨崲涓�
+                                    devpThread.ioModeOf1F1 = IoModeType.PAKOUT_BOOTING;
+                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
+                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
+                                            && !devpThread.getStation().get(inSta.getBackSta()).isLoading()
+                                            && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) {
+                                        // 鍑哄簱妯″紡
+                                        devpThread.ioModeOf1F1 = IoModeType.PAKOUT_MODE;
+                                    }
+                                }
+                            } else {
+                                // 鍏ュ簱妯″紡
+                                devpThread.ioModeOf1F1 = IoModeType.PAKIN_MODE;
+                            }
+                            break;
+                        case 117:
+                            if (pakout != null) {
+                                if (devpThread.ioModeOf1F2 != IoModeType.PAKOUT_MODE) {
+                                    // 鍑哄簱鍒囨崲涓�
+                                    devpThread.ioModeOf1F2 = IoModeType.PAKOUT_BOOTING;
+                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
+                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
+                                            && !devpThread.getStation().get(inSta.getBackSta()).isLoading()
+                                            && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) {
+                                        // 鍑哄簱妯″紡
+                                        devpThread.ioModeOf1F2 = IoModeType.PAKOUT_MODE;
+                                    }
+                                }
+                            } else {
+                                // 鍏ュ簱妯″紡
+                                devpThread.ioModeOf1F2 = IoModeType.PAKIN_MODE;
+                            }
+                            break;
+                        case 118:
+                            if (pakout != null) {
+                                if (devpThread.ioModeOf1F3 != IoModeType.PAKOUT_MODE) {
+                                    // 鍑哄簱鍒囨崲涓�
+                                    devpThread.ioModeOf1F3 = IoModeType.PAKOUT_BOOTING;
+                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
+                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
+                                            && !devpThread.getStation().get(inSta.getBackSta()).isLoading()
+                                            && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) {
+                                        // 鍑哄簱妯″紡
+                                        devpThread.ioModeOf1F3 = IoModeType.PAKOUT_MODE;
+                                    }
+                                }
+                            } else {
+                                // 鍏ュ簱妯″紡
+                                devpThread.ioModeOf1F3 = IoModeType.PAKIN_MODE;
+                            }
+                            break;
+                        case 119:
+                            if (pakout != null) {
+                                if (devpThread.ioModeOf1F4 != IoModeType.PAKOUT_MODE) {
+                                    // 鍑哄簱鍒囨崲涓�
+                                    devpThread.ioModeOf1F4 = IoModeType.PAKOUT_BOOTING;
+                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
+                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
+                                            && !devpThread.getStation().get(inSta.getBackSta()).isLoading()
+                                            && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) {
+                                        // 鍑哄簱妯″紡
+                                        devpThread.ioModeOf1F4 = IoModeType.PAKOUT_MODE;
+                                    }
+                                }
+                            } else {
+                                // 鍏ュ簱妯″紡
+                                devpThread.ioModeOf1F4 = IoModeType.PAKIN_MODE;
+                            }
+                            break;
+                        case 120:
+                            if (pakout != null) {
+                                if (devpThread.ioModeOf1F5 != IoModeType.PAKOUT_MODE) {
+                                    // 鍑哄簱鍒囨崲涓�
+                                    devpThread.ioModeOf1F5 = IoModeType.PAKOUT_BOOTING;
+                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
+                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
+                                            && !devpThread.getStation().get(inSta.getBackSta()).isLoading()
+                                            && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) {
+                                        // 鍑哄簱妯″紡
+                                        devpThread.ioModeOf1F5 = IoModeType.PAKOUT_MODE;
+                                    }
+                                }
+                            } else {
+                                // 鍏ュ簱妯″紡
+                                devpThread.ioModeOf1F5 = IoModeType.PAKIN_MODE;
+                            }
+                            break;
+                        case 203:
+                            if (pakout != null) {
+                                if (devpThread.ioModeOf2F1 != IoModeType.PAKOUT_MODE) {
+                                    // 鍑哄簱鍒囨崲涓�
+                                    devpThread.ioModeOf2F1 = IoModeType.PAKOUT_BOOTING;
+                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
+                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
+                                            && !devpThread.getStation().get(inSta.getBackSta()).isLoading()
+                                            && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) {
+                                        // 鍑哄簱妯″紡
+                                        devpThread.ioModeOf2F1 = IoModeType.PAKOUT_MODE;
+                                    }
+                                }
+                            } else {
+                                // 鍏ュ簱妯″紡
+                                devpThread.ioModeOf2F1 = IoModeType.PAKIN_MODE;
+                            }
+                            break;
+
+                        case 207:
+                            if (pakout != null) {
+                                if (devpThread.ioModeOf2F2 != IoModeType.PAKOUT_MODE) {
+                                    // 鍑哄簱鍒囨崲涓�
+                                    devpThread.ioModeOf2F2 = IoModeType.PAKOUT_BOOTING;
+                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
+                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
+                                            && !devpThread.getStation().get(inSta.getBackSta()).isLoading()
+                                            && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) {
+                                        // 鍑哄簱妯″紡
+                                        devpThread.ioModeOf2F2 = IoModeType.PAKOUT_MODE;
+                                    }
+                                }
+                            } else {
+                                // 鍏ュ簱妯″紡
+                                devpThread.ioModeOf2F2 = IoModeType.PAKIN_MODE;
+                            }
+                            break;
+
+                        case 212:
+                            if (pakout != null) {
+                                if (devpThread.ioModeOf2F3 != IoModeType.PAKOUT_MODE) {
+                                    // 鍑哄簱鍒囨崲涓�
+                                    devpThread.ioModeOf2F3 = IoModeType.PAKOUT_BOOTING;
+                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
+                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
+                                            && !devpThread.getStation().get(inSta.getBackSta()).isLoading()
+                                            && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) {
+                                        // 鍑哄簱妯″紡
+                                        devpThread.ioModeOf2F3 = IoModeType.PAKOUT_MODE;
+                                    }
+                                }
+                            } else {
+                                // 鍏ュ簱妯″紡
+                                devpThread.ioModeOf2F3 = IoModeType.PAKIN_MODE;
+                            }
+                            break;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 璺戝簱绋嬪簭
+     */
+    public void debug(String sts, Long modiUser, Integer loc_type1) {
+        if (!enable) {
+            return;
+        }
+        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>());
+        if (basCrnps.isEmpty()) {
+            return;
+        }
+        for (BasCrnp basCrnp : basCrnps) {
+            if (!basCrnp.getInEnable().equals("N") || !basCrnp.getOutEnable().equals("Y")) {
+                continue;
+            }
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", basCrnp.getCrnNo()).eq("io_type", 11));
+            if (Cools.isEmpty(wrkMasts) || wrkMasts.isEmpty()) {
+                int i = locMastService.selectCount(new EntityWrapper<LocMast>().eq("loc_sts", sts).eq("loc_type1", loc_type1).ne("modi_user", modiUser));
+                LocMast locMastStart = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", sts).eq("loc_type1", loc_type1).ne("modi_user", modiUser));
+                if (locMastStart == null || i > 1) {
+                    continue;
+                }
+                List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
+                        .eq("loc_sts", "O")
+                        .eq("crn_no", basCrnp.getCrnNo())
+                        .eq("loc_type1", locMastStart.getLocType1())
+                        .ne("modi_user", 77));
+                if (Cools.isEmpty(locMasts)) {
+                    continue;
+                }
+                Random random = new Random();
+                LocMast locMastEnd = locMasts.get(random.nextInt(locMasts.size()));
+                locMove(locMastStart, locMastEnd, Long.parseLong(basCrnp.getCrnNo().toString()));
+            }
+        }
+    }
+
+
+    public void locMove(LocMast sourceLoc, LocMast locNo, Long userId) {
+        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLoc.getLocNo()));
+        LocMast loc = locMastService.selectById(locNo);
+        if (!sourceLoc.getCrnNo().equals(loc.getCrnNo())) {
+            throw new CoolException("绉昏浆搴撲綅灞炰簬涓嶅悓鍫嗗灈鏈�");
+        }
+        Date now = new Date();
+        // 鑾峰彇宸ヤ綔鍙�
+        int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
+        // 淇濆瓨宸ヤ綔妗�
+        WrkMast wrkMast = new WrkMast();
+        wrkMast.setWrkNo(workNo);
+        wrkMast.setIoTime(now);
+        wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+        wrkMast.setIoType(11); // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
+        wrkMast.setIoPri(10D);
+        wrkMast.setCrnNo(sourceLoc.getCrnNo());
+        wrkMast.setSourceLocNo(sourceLoc.getLocNo()); // 婧愬簱浣�
+        wrkMast.setLocNo(locNo.getLocNo()); // 鐩爣搴撲綅
+        wrkMast.setFullPlt(Cools.isEmpty(locDetls) ? "N" : "Y"); // 婊℃澘锛歒
+        wrkMast.setPicking("N"); // 鎷f枡
+        wrkMast.setExitMk("N"); // 閫�鍑�
+        wrkMast.setEmptyMk(sourceLoc.getLocSts().equals("D") ? "Y" : "N"); // 绌烘澘
+        wrkMast.setBarcode(sourceLoc.getBarcode()); // 鎵樼洏鐮�
+        wrkMast.setLinkMis("N");
+        wrkMast.setAppeUser(userId);
+        wrkMast.setAppeTime(now);
+        wrkMast.setModiUser(userId);
+        wrkMast.setModiTime(now);
+        boolean res = wrkMastService.insert(wrkMast);
+        if (!res) {
+            throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+        }
+        // 宸ヤ綔妗f槑缁嗕繚瀛�
+        for (LocDetl locDetl : locDetls) {
+            WrkDetl wrkDetl = new WrkDetl();
+            wrkDetl.sync(locDetl);
+            wrkDetl.setWrkNo(workNo);
+            wrkDetl.setIoTime(now);
+            wrkDetl.setAnfme(locDetl.getAnfme());
+            wrkDetl.setAppeTime(now);
+            wrkDetl.setAppeUser(userId);
+            wrkDetl.setModiTime(now);
+            wrkDetl.setModiUser(userId);
+            if (!wrkDetlService.insert(wrkDetl)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+            }
+        }
+        // 淇敼婧愬簱浣嶇姸鎬�
+        if (sourceLoc.getLocSts().equals("D") || sourceLoc.getLocSts().equals("F")) {
+            sourceLoc.setLocSts("R"); // R.鍑哄簱棰勭害
+            sourceLoc.setModiUser(userId);
+            sourceLoc.setModiTime(now);
+            if (!locMastService.updateById(sourceLoc)) {
+                throw new CoolException("鏇存柊婧愬簱浣嶇姸鎬佸け璐�");
+            }
+        } else {
+            throw new CoolException("婧愬簱浣嶅嚭搴撳け璐ワ紝鐘舵�侊細" + sourceLoc.getLocSts$());
+        }
+        // 淇敼鐩爣搴撲綅鐘舵��
+        if (loc.getLocSts().equals("O")) {
+            loc.setLocSts("S"); // S.鍏ュ簱棰勭害
+            loc.setModiTime(now);
+            loc.setModiUser(userId);
+            if (!locMastService.updateById(loc)) {
+                throw new CoolException("鏇存柊鐩爣搴撲綅鐘舵�佸け璐�");
+            }
+        } else {
+            throw new CoolException("绉昏浆澶辫触锛岀洰鏍囧簱浣嶇姸鎬侊細" + loc.getLocSts$());
+        }
+    }
+
+    /**
+     * 杞Щ浠诲姟涓嬪彂
+     */
+    public void transferTaskStart() {
+        for (DevpSlave.Sta sta : slaveProperties.getDevp().get(1).getInSta()) {
+            try {
+                // 鑾峰彇鍏ュ簱绔欎俊鎭�
+                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 2);
+                StaProtocol staProtocol = devpThread.getStation().get(sta.getStaNo());
+                if (staProtocol == null) {
+                    continue;
+                } else {
+                    staProtocol = staProtocol.clone();
+                }
+                if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
+                    // 鏌ヨ宸ヤ綔妗�
+                    TransferTask transferTask = transferTaskService.selectByStartPoint(sta.getStaNo());
+                    if (transferTask == null) {
+                        continue;
+                    }
+                    log.info("涓嬪彂杈撻�佺嚎杞Щ浠诲姟锛歵askWrk:" + JSON.toJSONString(transferTask));
+                    staProtocol.setWorkNo(transferTask.getWrkNo().shortValue());
+                    staProtocol.setStaNo(transferTask.getTargetPoint().shortValue());
+                    boolean offer = false;
+                    try {
+                        offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
+                    } catch (Exception e) {
+                        log.error("涓嬪彂杈撻�佺嚎杞Щ浠诲姟锛氬紓甯�:" + e);
+                        log.error("涓嬪彂杈撻�佺嚎杞Щ浠诲姟锛氬紓甯�:offer:" + offer);
+                    }
+                    if (offer) {
+                        log.info("涓嬪彂杈撻�佺嚎浠诲姟鎴愬姛锛歵askWrk:" + JSON.toJSONString(transferTask));
+                        transferTask.setStatus(2);
+                        transferTaskService.updateById(transferTask);
+                    } else {
+                        log.error("涓嬪彂杈撻�佺嚎浠诲姟澶辫触锛歵askWrk:" + JSON.toJSONString(transferTask));
+                    }
+                }
+            } catch (Exception e) {
+                log.error("杞Щ浠诲姟寮傚父:寮傚父淇℃伅锛�" + e);
+            }
+        }
+
+    }
+
+    /**
+     * 杞Щ浠诲姟瀹屾垚
+     */
+    public void transferTaskEnd() {
+        for (DevpSlave.Sta sta : slaveProperties.getDevp().get(1).getInSta()) {
+            try {
+                // 鑾峰彇缁堢偣绔�
+                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 2);
+                StaProtocol staProtocol = devpThread.getStation().get(sta.getOverSta());
+                if (staProtocol == null) {
+                    continue;
+                } else {
+                    staProtocol = staProtocol.clone();
+                }
+                if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
+                    // 鏌ヨ宸ヤ綔妗�
+                    TransferTask transferTask = transferTaskService.selectByEndPoint(sta.getStaNo());
+                    if (transferTask == null) {
+                        continue;
+                    }
+                    log.info("杞Щ浠诲姟瀹屾垚锛歵ransferTask:" + JSON.toJSONString(transferTask));
+                    transferTask.setStatus(3);
+                    transferTaskService.updateById(transferTask);
+                }
+            } catch (Exception e) {
+                log.error("杞Щ浠诲姟寮傚父:寮傚父淇℃伅锛�" + e);
+            }
+        }
+
+    }
+
 }

--
Gitblit v1.9.1