From e04f0981da6554606359e6de4e91b752a64aae6c Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期六, 29 三月 2025 15:59:20 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 3619 ++++++++++++++++-------------------------------------------
 1 files changed, 981 insertions(+), 2,638 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 d44fec1..2713265 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1,21 +1,21 @@
 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.zy.asrs.domain.enums.NotifyMsgType;
 import com.zy.asrs.entity.*;
-import com.zy.asrs.mapper.*;
 import com.zy.asrs.service.*;
+import com.zy.asrs.utils.NotifyUtils;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.model.*;
 import com.zy.common.model.enums.NavigationMapType;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.*;
-import com.zy.core.DevpThread;
 import com.zy.core.News;
-import com.zy.core.cache.MessageQueue;
+import com.zy.core.action.ForkLiftAction;
+import com.zy.core.action.ShuttleAction;
 import com.zy.core.cache.SlaveConnection;
+import com.zy.core.dispatcher.ShuttleDispatchUtils;
 import com.zy.core.enums.*;
 import com.zy.core.model.*;
 import com.zy.core.model.command.*;
@@ -26,10 +26,7 @@
 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.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.util.*;
 
@@ -41,20 +38,10 @@
 @Service("mainService")
 public class MainServiceImpl {
 
-    @Value("${wms.url}")
-    private String wmsUrl;
     @Autowired
     private SlaveProperties slaveProperties;
     @Autowired
-    private WrkMastMapper wrkMastMapper;
-    @Autowired
     private WrkMastService wrkMastService;
-    @Autowired
-    private LocMastService locMastService;
-    @Autowired
-    private StaDescService staDescService;
-    @Autowired
-    private BasDevpService basDevpService;
     @Autowired
     private BasShuttleErrLogService basShuttleErrLogService;
     @Autowired
@@ -62,788 +49,64 @@
     @Autowired
     private BasShuttleErrService basShuttleErrService;
     @Autowired
-    private WrkChargeService wrkChargeService;
+    private BasLiftErrService basLiftErrService;
     @Autowired
     private CommonService commonService;
     @Autowired
-    private WrkChargeMapper wrkChargeMapper;
-    @Autowired
     private BasMapService basMapService;
-    @Autowired
-    private BasLiftService basLiftService;
     @Autowired
     private ShuttleDispatchUtils shuttleDispatchUtils;
     @Autowired
     private RedisUtil redisUtil;
-    @Autowired
-    private WrkMastLogMapper wrkMastLogMapper;
-    @Autowired
-    private BasLiftOptService basLiftOptService;
     @Autowired
     private ConfigService configService;
     @Autowired
     private NavigateMapUtils navigateMapUtils;
     @Autowired
     private NavigateMapData navigateMapData;
-
-
-    /**
-     * 缁勬墭
-     * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗o紝宸ヤ綔鐘舵�� 2
-     */
-    public void generateStoreWrkFile() {
-        try {
-            // 鏍规嵁杈撻�佺嚎plc閬嶅巻
-            for (DevpSlave devp : slaveProperties.getDevp()) {
-                // 閬嶅巻鍏ュ簱鍙�
-                for (DevpSlave.Sta inSta : devp.getInSta()) {
-                    // 鑾峰彇鍏ュ簱绔欎俊鎭�
-                    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 = errMsg + "鍓嶈秴闄愶紱";
-                        back = true;
-                    }
-                    if (staProtocol.isBackErr()) {
-                        errMsg = errMsg + "鍚庤秴闄�";
-                        back = true;
-                    }
-                    if (staProtocol.isHighErr()) {
-                        errMsg = errMsg + "楂樿秴闄�";
-                        back = true;
-                    }
-                    if (staProtocol.isLeftErr()) {
-                        errMsg = errMsg + "宸﹁秴闄�";
-                        back = true;
-                    }
-                    if (staProtocol.isRightErr()) {
-                        errMsg = errMsg + "鍙宠秴闄�";
-                        back = true;
-                    }
-                    if (staProtocol.isWeightErr()) {
-                        errMsg = errMsg + "瓒呴噸";
-                        back = true;
-                    }
-                    if (staProtocol.isBarcodeErr()) {
-                        errMsg = errMsg + "鎵爜澶辫触";
-                        back = true;
-                    }
-                    // 閫�鍥�
-                    if (back) {
-                        // led 寮傚父鏄剧ず
-                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
-                        if (ledThread != null) {
-                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
-                        }
-                        continue;
-                    }
-
-                    // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
-                    if (staProtocol.isAutoing() && staProtocol.isLoading()
-                            && staProtocol.isInEnable()
-                            && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo >= 9990 && workNo <= 9999))
-                    ) {
-
-                        // 鑾峰彇鏉$爜鎵弿浠俊鎭�
-                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
-                        if (barcodeThread == null) {
-                            continue;
-                        }
-                        String barcode = barcodeThread.getBarcode();
-                        if (!Cools.isEmpty(barcode)) {
-//                        News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", inSta.getBarcode(), barcode);
-                            if ("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode) || "00000000".equals(barcode)) {
-//                            staProtocol.setWorkNo((short) 32002);
-//                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
-//                            devpThread.setPakMk(staProtocol.getSiteId(), false);
-//                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-
-                                // led 寮傚父鏄剧ず
-                                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
-                                if (ledThread != null) {
-                                    String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯";
-                                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
-                                }
-                                continue;
-                            }
-                        } else {
-//                        staProtocol.setWorkNo((short) 32002);
-//                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
-//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
-//                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-
-//                        // led 寮傚父鏄剧ず
-//                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
-//                        if (ledThread != null) {
-//                            String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯";
-//                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
-//                        }
-                            continue;
-                        }
-
-                        // 杩囨护鐩樼偣/鎷f枡/骞舵澘浠诲姟
-                        WrkMast wrkMast1 = wrkMastMapper.selectPickStepByBarcode(barcode);
-                        if (null != wrkMast1) {
-                            continue;
-                        }
-
-                        // 鍒ゆ柇閲嶅宸ヤ綔妗�
-                        WrkMast wrkMast2 = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
-                        if (wrkMast2 != null) {
-                            News.error("宸ヤ綔妗d腑宸插瓨鍦ㄨ绔欑姸鎬佷负锛� 2.璁惧涓婅蛋 锛夌殑鏁版嵁,宸ヤ綔鍙�={}", wrkMast2.getWrkNo());
-                            continue;
-                        }
-
-                        try {
-                            LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
-                            SearchLocParam param = new SearchLocParam();
-                            param.setBarcode(barcode);
-                            param.setIoType(1);
-                            param.setSourceStaNo(inSta.getStaNo());
-                            param.setLocType1(locTypeDto.getLocType1());
-                            String response = new HttpHandler.Builder()
-                                    .setUri(wmsUrl)
-                                    .setPath("/rpc/pakin/loc/v2")
-                                    .setJson(JSON.toJSONString(param))
-                                    .build()
-                                    .doPost();
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
-                            Integer code = jsonObject.getInteger("code");
-                            if (code.equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-                                // plc 澶勭悊
-                                barcodeThread.setBarcode("");
-//                            staProtocol.setWorkNo(dto.getWorkNo().shortValue());
-//                            staProtocol.setStaNo(dto.getStaNo().shortValue());
-//                            devpThread.setPakMk(staProtocol.getSiteId(), false);
-//
-//                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-//                            if (!result) {
-//                                throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触");
-//                            }
-
-                                // 鍒ゆ柇閲嶅宸ヤ綔妗�
-                                WrkMast wrkMast = wrkMastMapper.selectPakInStep11(inSta.getStaNo());
-                                if (wrkMast == null) {
-                                    continue;
-                                }
-
-                                // 鏇存柊宸ヤ綔涓绘。
-                                wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵�侊細2.璁惧涓婅蛋
-                                wrkMast.setModiTime(new Date());
-                                if (wrkMastMapper.updateById(wrkMast) == 0) {
-                                    News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", wrkMast.getWrkNo());
-                                }
-
-                            } else if (code == 500) {
-                                if (ledThread != null) {
-                                    String errorMsg = jsonObject.getString("msg");
-                                    if (!Cools.isEmpty(errorMsg)) {
-                                        MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
-                                        ledThread.setLedMk(false);
-                                    }
-                                }
-                                News.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v2", JSON.toJSONString(param), response);
-                            } else if (code == 700) {
-//                            staProtocol.setWorkNo((short) 32002);
-//                            staProtocol.setRollback102(1);//102绔欏洖閫�淇″彿
-//                            devpThread.setPakMk(staProtocol.getSiteId(), false);
-//                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(5, staProtocol));
-
-                                // led 寮傚父鏄剧ず
-                                if (ledThread != null) {
-                                    String errorMsg = barcode + "鎵樼洏璇嗗埆寮傚父锛岃鍏堣繘琛岀粍鎵橈紒";
-                                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
-                                    ledThread.setLedMk(false);
-                                }
-                            }
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 鎷f枡銆佸苟鏉垮啀鍏ュ簱
-     */
-    @Transactional
-    public synchronized void stnToCrnStnPick(){
-        try {
-            for (DevpSlave devp : slaveProperties.getDevp()) {
-                // 閬嶅巻鎷f枡鍏ュ簱鍙�
-                for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
-                    // 鑾峰彇鎷f枡鍏ュ簱绔欎俊鎭�
-                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                    StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
-                    if (staProtocol == null) {
-                        continue;
-                    } else {
-                        staProtocol = staProtocol.clone();
-                    }
-                    if (staProtocol.isAutoing()
-                            && staProtocol.isLoading()
-                            && staProtocol.isInEnable()
-//                        && (staProtocol.getWorkNo() > 0)
-                            && staProtocol.isPakMk()) {
-
-                        // 鑾峰彇鏉$爜鎵弿浠俊鎭�
-                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode());
-                        if (barcodeThread == null) {
-                            continue;
-                        }
-                        String barcode = barcodeThread.getBarcode();
-                        if (Cools.isEmpty(barcode)) {
-                            continue;
-                        }
-                        if ("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
-                            continue;
-                        }
-
-                        WrkMast wrkMast = wrkMastMapper.selectPickStepByBarcode(barcode);
-                        if (wrkMast == null) {//鎵句笉鍒板伐浣滄。
-                            continue;
-                        }
-
-                        if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104)
-                                || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) {
-                            continue;
-                        }
-
-//                        //*********************鍚屽簱浣嶇粍鏍¢獙*********************
-//                        boolean flag = false;
-//                        String th = "";
-//                        List<String> innerLoc = Utils.getGroupInnerLoc(wrkMast.getSourceLocNo());
-//                        for (String loc : innerLoc) {
-//                            LocMast locMast = locMastService.selectById(loc);
-//                            if (locMast == null) {
-//                                continue;
-//                            }
-//
-//                            if (!locMast.getLocSts().equals("F")) {
-//                                flag = true;
-//                                th = loc + "搴撲綅瀛樺湪鏈洖搴撲换鍔�";
-//                                break;
-//                            }
-//                        }
-//                        if (flag) {
-//                            News.info(th);
-//                            continue;
-//                        }
-//                        //*********************鍚屽簱浣嶇粍鏍¢獙*********************
-
-//                        // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-//                        if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
-//                            News.info(wrkMast.getWrkNo() + "淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗eけ璐�");
-//                            continue;
-//                        }
-
-                        try {
-                            LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());//婧愬簱浣�
-                            SearchLocParam param = new SearchLocParam();
-                            param.setWrkNo(wrkMast.getWrkNo());
-                            param.setBarcode(wrkMast.getBarcode());
-                            param.setIoType(wrkMast.getIoType());
-                            param.setSourceStaNo(pickSta.getStaNo());
-                            param.setLiftNo(pickSta.getLiftNo());
-                            param.setLocType1(locMast.getLocType1());
-                            String response = new HttpHandler.Builder()
-                                    .setUri(wmsUrl)
-                                    .setPath("/rpc/pakin/loc/v2")
-                                    .setJson(JSON.toJSONString(param))
-                                    .build()
-                                    .doPost();
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            Integer code = jsonObject.getInteger("code");
-                            if (code.equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-
-//                                //鑾峰彇鍥炲簱鎻愬崌鏈虹洰鏍囩珯
-//                                LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(dto.getLocNo()));
-//                                if (liftStaProtocol == null) {
-//                                    News.info(wrkMast.getWrkNo() + "鑾峰彇鍥炲簱鎻愬崌鏈虹洰鏍囩珯澶辫触");
-//                                    continue;
-//                                }
-//
-//                                // 鏇存柊宸ヤ綔妗f暟鎹姸鎬�
-//                                wrkMast.setIoType(wrkMast.getIoType() - 50); // 鍏ュ嚭搴撶被鍨�: 103->53,104->54
-//                                wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵��: 2.璁惧涓婅蛋
-//                                wrkMast.setSourceStaNo(dto.getSourceStaNo()); // 婧愮珯
-//                                wrkMast.setStaNo(liftStaProtocol.getStaNo());//鐩爣绔�
-//                                wrkMast.setLocNo(dto.getLocNo()); // 鐩爣搴撲綅
-//                                wrkMast.setShuttleNo(null); // 绌挎杞︽竻绌�
-//                                wrkMast.setLiftNo(null);// 鎻愬崌鏈烘竻绌�
-//                                wrkMast.setModiTime(new Date());
-//                                if (wrkMastMapper.updateById(wrkMast) == 0) {
-//                                    News.info(wrkMast.getWrkNo() + "鏇存柊宸ヤ綔妗f暟鎹姸鎬佸け璐�");
-//                                    continue;
-//                                }
-                            } else if (code == 500) {
-                                News.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v2", JSON.toJSONString(param), response);
-                            }
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                        }
-                    }
-                }
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 鐩樼偣鍐嶅叆搴�
-     */
-    @Transactional
-    public synchronized void stnToCrnStnPlate(){
-        try {
-            for (DevpSlave devp : slaveProperties.getDevp()) {
-                // 閬嶅巻鎷f枡鍏ュ簱鍙�
-                for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
-                    // 鑾峰彇鎷f枡鍏ュ簱绔欎俊鎭�
-                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                    StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
-                    if (staProtocol == null) {
-                        continue;
-                    } else {
-                        staProtocol = staProtocol.clone();
-                    }
-                    if (staProtocol.isAutoing()
-                            && staProtocol.isLoading()
-                            && staProtocol.isInEnable()
-//                            && (staProtocol.getWorkNo() > 0)
-                            && staProtocol.isPakMk()) {
-
-                        // 鑾峰彇鏉$爜鎵弿浠俊鎭�
-                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode());
-                        if (barcodeThread == null) {
-                            continue;
-                        }
-                        String barcode = barcodeThread.getBarcode();
-                        if (Cools.isEmpty(barcode)) {
-                            continue;
-                        }
-                        if ("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
-                            continue;
-                        }
-                        WrkMast wrkMast = wrkMastMapper.selectByBarcode(barcode);
-                        if (wrkMast == null) {//鎵句笉鍒板伐浣滄。
-                            continue;
-                        }
-
-                        if ((wrkMast.getIoType() != 107)
-                                || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) {
-                            continue;
-                        }
-
-//                        // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-//                        if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
-//                            News.info(wrkMast.getWrkNo() + "淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗eけ璐�");
-//                            continue;
-//                        }
-
-                        //鐩樼偣鎵炬柊搴撲綅
-                        try {
-                            LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());//婧愬簱浣�
-                            SearchLocParam param = new SearchLocParam();
-                            param.setWrkNo(wrkMast.getWrkNo());
-                            param.setBarcode(wrkMast.getBarcode());
-                            param.setIoType(107);//鐩樼偣
-                            param.setSourceStaNo(pickSta.getStaNo());
-                            param.setLiftNo(pickSta.getLiftNo());
-                            param.setLocType1(locMast.getLocType1());
-                            String response = new HttpHandler.Builder()
-                                    .setUri(wmsUrl)
-                                    .setPath("/rpc/pakin/loc/v2")
-                                    .setJson(JSON.toJSONString(param))
-                                    .build()
-                                    .doPost();
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            Integer code = jsonObject.getInteger("code");
-                            if (code.equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-
-//                                //鑾峰彇鍥炲簱鎻愬崌鏈虹洰鏍囩珯
-//                                LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(dto.getLocNo()));
-//                                if (liftStaProtocol == null) {
-//                                    News.info(wrkMast.getWrkNo() + "鑾峰彇鍥炲簱鎻愬崌鏈虹洰鏍囩珯澶辫触");
-//                                    continue;
-//                                }
-//
-//                                // 鏇存柊宸ヤ綔妗f暟鎹姸鎬�
-//                                wrkMast.setIoType(wrkMast.getIoType() - 50); // 鍏ュ嚭搴撶被鍨�: 107->57
-//                                wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵��: 2.璁惧涓婅蛋
-//                                wrkMast.setSourceStaNo(dto.getSourceStaNo()); // 婧愮珯
-//                                wrkMast.setStaNo(liftStaProtocol.getStaNo());//鐩爣绔�
-//                                wrkMast.setLocNo(dto.getLocNo()); // 鐩爣搴撲綅
-//                                wrkMast.setShuttleNo(null); // 绌挎杞︽竻绌�
-//                                wrkMast.setLiftNo(null);// 鎻愬崌鏈烘竻绌�
-//                                wrkMast.setModiTime(new Date());
-//                                if (wrkMastMapper.updateById(wrkMast) == 0) {
-//                                    News.info(wrkMast.getWrkNo() + "鏇存柊宸ヤ綔妗f暟鎹姸鎬佸け璐�");
-//                                    continue;
-//                                }
-
-//                                staProtocol.setStaNo(dto.getSourceStaNo().shortValue());//鍐欏叆鐩爣绔�
-//                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-
-                            } else if (code == 500) {
-                                News.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v2", JSON.toJSONString(param), response);
-                            }
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                        }
-
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-//    /**
-//     * 鎷f枡銆佸苟鏉裤�佺洏鐐瑰啀鍏ュ簱
-//     */
-//    @Transactional
-//    public synchronized void stnToCrnStnPick(){
-//        for (DevpSlave devp : slaveProperties.getDevp()) {
-//            // 閬嶅巻鎷f枡鍏ュ簱鍙�
-//            for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
-//
-//                // 鑾峰彇鎷f枡鍏ュ簱绔欎俊鎭�
-//                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-//                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
-//                if (staProtocol == null) {
-//                    continue;
-//                } else {
-//                    staProtocol = staProtocol.clone();
-//                }
-//                if (staProtocol.isAutoing()
-//                        && staProtocol.isLoading()
-////                        && (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() < 9999)
-////                        && staProtocol.getStaNo().equals(staProtocol.getSiteId().shortValue())
-//                        && staProtocol.isPakMk()){
-//
-//                    // 鑾峰彇鏉$爜鎵弿浠俊鎭�
-//                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode());
-//                    if (barcodeThread == null) {
-//                        continue;
-//                    }
-//                    String barcode = barcodeThread.getBarcode();
-//
-//                    WrkMast wrkMast = null;
-//                    wrkMast = wrkMastMapper.selectPickStepByBarcode(barcode);
-//                    if (wrkMast == null) {
-//                        continue;
-//                    }
-////                    if (staProtocol.getWorkNo() == 9996) {
-////                        String barcode = barcodeThread.getBarcode();
-////                        if(!Cools.isEmpty(barcode)) {
-////                            News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", pickSta.getBarcode(), barcode);
-////                            if("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
-////                                staProtocol.setWorkNo((short) 32002);
-////                                staProtocol.setStaNo(pickSta.getBackSta().shortValue());
-////                                devpThread.setPakMk(staProtocol.getSiteId(), false);
-////                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-////
-////                                // led 寮傚父鏄剧ず
-////                                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
-////                                if (ledThread != null) {
-////                                    String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯";
-////                                    MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
-////                                }
-////                                continue;
-////                            }
-////                        } else {
-////                            staProtocol.setWorkNo((short) 32002);
-////                            staProtocol.setStaNo(pickSta.getBackSta().shortValue());
-////                            devpThread.setPakMk(staProtocol.getSiteId(), false);
-////                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-////
-////                            // led 寮傚父鏄剧ず
-////                            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
-////                            if (ledThread != null) {
-////                                String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯";
-////                                MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
-////                            }
-////                            continue;
-////                        }
-////                        wrkMast = wrkMastMapper.selectPickStepByBarcode(barcode);
-////                        if (null == wrkMast) {
-////                            News.error("{}鏉$爜閿欒锛屾殏鏃犳嫞鏂欎换鍔★紒", barcode);
-////                        }
-////                    }
-//
-//                    if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107)
-//                        || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo()) ) {
-//                        continue;
-//                    }
-//
-//                    // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-//                    if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
-//                        throw new CoolException(wrkMast.getWrkNo() + "淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗eけ璐�");
-//                    }
-//
-//                    String sourceLocNo = wrkMast.getSourceLocNo().trim();
-//                    LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(sourceLocNo));//鑾峰彇鍥炲簱鎻愬崌鏈虹洰鏍囩珯
-//                    if (liftStaProtocol == null) {
-//                        continue;
-//                    }
-//
-//                    // 鏇存柊宸ヤ綔妗f暟鎹姸鎬�
-//                    wrkMast.setIoType(wrkMast.getIoType() - 50); // 鍏ュ嚭搴撶被鍨�: 103->53,104->54,107->57
-//                    wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵��: 2.璁惧涓婅蛋
-//                    wrkMast.setSourceStaNo(pickSta.getStaNo()); // 婧愮珯
-////                            wrkMast.setStaNo(dto.getStaNo()); // 鐩爣绔�
-////                            wrkMast.setCrnNo(dto.getCrnNo());
-//                    wrkMast.setStaNo(liftStaProtocol.getStaNo());//鐩爣绔�
-//                    wrkMast.setLocNo(sourceLocNo); // 鐩爣搴撲綅 = 鍑哄簱鏃剁殑婧愬簱浣�
-//                    wrkMast.setShuttleNo(null); // 绌挎杞︽竻绌�
-//                    wrkMast.setLiftNo(null);// 鎻愬崌鏈烘竻绌�
-//                    wrkMast.setModiTime(new Date());
-//                    if (wrkMastMapper.updateById(wrkMast) == 0) {
-//                        throw new CoolException(wrkMast.getWrkNo() + "鏇存柊宸ヤ綔妗f暟鎹姸鎬佸け璐�");
-//                    }
-//                    if (wrkMastMapper.setSteEmpty(wrkMast.getWrkNo()) == 0) {
-//                        throw new CoolException(wrkMast.getWrkNo() + "鏇存柊宸ヤ綔妗f暟鎹姸鎬佸け璐�");
-//                    }
-//
-//                    // 淇敼搴撲綅鐘舵�� Q.鎷f枡/鐩樼偣/骞舵澘鍐嶅叆搴�
-//                    LocMast locMast = locMastService.selectById(sourceLocNo);
-//                    locMast.setLocSts("Q");
-//                    locMast.setModiTime(new Date());
-//                    if (!locMastService.updateById(locMast)) {
-//                        throw new CoolException("淇敼搴撲綅鐘舵�佸け璐�");
-//                    }
-//                    barcodeThread.setBarcode("");//娓呯悊鏉$爜
-//
-////                    try {
-////                        // 璁块棶 WMS 鑾峰彇鍏ュ簱搴撲綅
-////                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
-////                        SearchLocParam param = new SearchLocParam();
-////                        param.setWrkNo(wrkMast.getWrkNo());
-////                        param.setIoType(wrkMast.getIoType());
-////                        param.setSourceStaNo(pickSta.getStaNo());
-//////                        param.setLocType1(locTypeDto.getLocType1());
-////                        String response = new HttpHandler.Builder()
-////                                .setUri(wmsUrl)
-////                                .setPath("/rpc/pakin/loc/v1")
-////                                .setJson(JSON.toJSONString(param))
-////                                .build()
-////                                .doPost();
-////                        JSONObject jsonObject = JSON.parseObject(response);
-////                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
-////                        Integer code = jsonObject.getInteger("code");
-////                        if (code.equals(200)) {
-////                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-////
-//////                            // 鑾峰彇鐩爣绔�
-//////                            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
-//////                                    .eq("type_no", wrkMast.getIoType() - 50)
-//////                                    .eq("stn_no", pickSta.getStaNo()) // 浣滀笟绔欑偣 = 鎷f枡鍑哄簱鐨勭洰鏍囩珯
-//////                                    .eq("crn_no", dto.getCrnNo()); // 鍫嗗灈鏈哄彿
-//////                            StaDesc staDesc = staDescService.selectOne(wrapper);
-//////                            if (Cools.isEmpty(staDesc)) {
-//////                                News.error("鍏ュ簱璺緞涓嶅瓨鍦紒type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
-//////                                continue;
-//////                            }
-//////                            // 鍫嗗灈鏈虹珯鐐�(鐩爣绔�)
-//////                            Integer staNo = staDesc.getCrnStn();
-////
-////                            // 淇濆瓨宸ヤ綔鏄庣粏妗e巻鍙叉。
-//////                        if (wrkMastMapper.saveWrkDetlLog(wrkMast.getWrkNo()) == 0) {
-//////                            throw new CoolException("淇濆瓨宸ヤ綔鏄庣粏妗e巻鍙叉。澶辫触");
-//////                        }
-////                            // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-////                            if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
-////                                throw new CoolException(wrkMast.getWrkNo() + "淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗eけ璐�");
-////                            }
-////
-////                            String sourceLocNo = wrkMast.getSourceLocNo().trim();
-////                            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(sourceLocNo));//鑾峰彇鍥炲簱鎻愬崌鏈虹洰鏍囩珯
-////                            if (liftStaProtocol == null) {
-////                                continue;
-////                            }
-////
-////                            // 鏇存柊宸ヤ綔妗f暟鎹姸鎬�
-////                            wrkMast.setIoType(wrkMast.getIoType() - 50); // 鍏ュ嚭搴撶被鍨�: 103->53,104->54,107->57
-////                            wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵��: 2.璁惧涓婅蛋
-////                            wrkMast.setSourceStaNo(pickSta.getStaNo()); // 婧愮珯
-//////                            wrkMast.setStaNo(dto.getStaNo()); // 鐩爣绔�
-//////                            wrkMast.setCrnNo(dto.getCrnNo());
-////                            wrkMast.setStaNo(liftStaProtocol.getStaNo());//鐩爣绔�
-////                            wrkMast.setLocNo(sourceLocNo); // 鐩爣搴撲綅 = 鍑哄簱鏃剁殑婧愬簱浣�
-////                            wrkMast.setShuttleNo(null); // 绌挎杞︽竻绌�
-////                            wrkMast.setLiftNo(null);// 鎻愬崌鏈烘竻绌�
-////                            wrkMast.setModiTime(new Date());
-////                            if (wrkMastMapper.updateById(wrkMast) == 0) {
-////                                throw new CoolException(wrkMast.getWrkNo() + "鏇存柊宸ヤ綔妗f暟鎹姸鎬佸け璐�");
-////                            }
-////                            if (wrkMastMapper.setSteEmpty(wrkMast.getWrkNo()) == 0) {
-////                                throw new CoolException(wrkMast.getWrkNo() + "鏇存柊宸ヤ綔妗f暟鎹姸鎬佸け璐�");
-////                            }
-////
-////                            // 淇敼搴撲綅鐘舵�� Q.鎷f枡/鐩樼偣/骞舵澘鍐嶅叆搴�
-////                            LocMast locMast = locMastService.selectById(sourceLocNo);
-////                            locMast.setLocSts("Q");
-////                            locMast.setModiTime(new Date());
-////                            if (!locMastService.updateById(locMast)) {
-////                                throw new CoolException("淇敼搴撲綅鐘舵�佸け璐�");
-////                            }
-////
-//////                            // 鏇存柊绔欑偣淇℃伅 涓� 涓嬪彂plc鍛戒护
-//////                            staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
-//////                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
-//////                            devpThread.setPakMk(staProtocol.getSiteId(), false);
-//////                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-//////                            if (!result) {
-//////                                News.error("鍙戝竷鍛戒护鑷宠緭閫佺嚎闃熷垪澶辫触锛侊紒锛� [plc缂栧彿{}]", devp.getId());
-//////                            }
-////
-////                            barcodeThread.setBarcode("");//娓呯悊鏉$爜
-////
-////                        } else if (code == 500){
-////                            if (ledThread != null) {
-////                                String errorMsg = jsonObject.getString("msg");
-////                                if (!Cools.isEmpty(errorMsg)) {
-////                                    MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
-////                                }
-////                            }
-////                            News.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
-////                        } else {
-//////                            staProtocol.setWorkNo((short) 32002);
-//////                            staProtocol.setStaNo(pickSta.getBackSta().shortValue());
-//////                            devpThread.setPakMk(staProtocol.getSiteId(), false);
-//////                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-////
-////                            // led 寮傚父鏄剧ず
-////                            if (ledThread != null) {
-////                                String errorMsg = jsonObject.getString("msg");
-//////                                String errorMsg = barcode + "鎵樼洏璇嗗埆寮傚父锛岃鍏堣繘琛岀粍鎵橈紒";
-////                                MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
-////                            }
-////                        }
-////
-////                    } catch (Exception e) {
-////                        e.printStackTrace();
-////                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-////                    }
-//
-//                }
-//            }
-//
-//        }
-//    }
+    @Autowired
+    private NavigateUtils navigateUtils;
+    @Autowired
+    private ShuttleOperaUtils shuttleOperaUtils;
+    @Autowired
+    private ShuttleAction shuttleAction;
+    @Autowired
+    private ForkLiftAction forkLiftAction;
+    @Autowired
+    private NotifyUtils notifyUtils;
+    @Autowired
+    private BasShuttleChargeService basShuttleChargeService;
 
     /**
      * 鍒濆鍖栧疄鏃跺湴鍥�
      */
     public synchronized void initRealtimeBasMap() {
         try {
-            for (int i = 1; i <= 10; i++) {//鎬诲叡鍥涘眰妤�
-                Object data = redisUtil.get(RedisKeyType.MAP.key + i);
-                if (data == null) {//redis鍦板浘鏁版嵁涓虹┖锛屼粠鏁版嵁搴撲腑鑾峰彇
-                    BasMap basMap = basMapService.selectLatestMap(i);
-                    if (basMap == null) {
-                        //鏁版嵁搴撲腑涔熶笉瀛樺湪鍦板浘鏁版嵁锛屼粠鍦板浘鏂囦欢涓幏鍙�
-                        //杞藉叆鍦板浘
-                        List<List<MapNode>> lists = navigateMapData.getJsonData(i, -1, null, null);//鑾峰彇瀹屾暣鍦板浘(鍖呮嫭鍏ュ簱鍑哄簱)
 
-                        //瀛樺叆鏁版嵁搴�
-                        basMap = new BasMap();
-                        basMap.setData(JSON.toJSONString(lists));
-                        basMap.setCreateTime(new Date());
-                        basMap.setUpdateTime(new Date());
-                        basMap.setLev(i);
+            List<BasMap> basMaps = basMapService.selectList(new EntityWrapper<BasMap>().orderBy("lev", true));
+            for (BasMap basMap : basMaps) {
+                Integer lev = basMap.getLev();
+                Object data = redisUtil.get(RedisKeyType.MAP.key + lev);
+                if (data == null) {//redis鍦板浘鏁版嵁涓虹┖
+                    //杞藉叆鍦板浘
+                    List<List<MapNode>> lists = navigateMapData.getJsonData(lev, -1, null, null);//鑾峰彇瀹屾暣鍦板浘(鍖呮嫭鍏ュ簱鍑哄簱)
 
-                        if (!basMapService.insert(basMap)) {
-                            log.info("鍦板浘鏁版嵁瀛樺偍澶辫触");
-                        }
+                    //瀛樺叆鏁版嵁搴�
+                    basMap.setData(JSON.toJSONString(lists));
+                    basMap.setCreateTime(new Date());
+                    basMap.setUpdateTime(new Date());
+                    if (!basMapService.updateById(basMap)) {
+                        log.info("鍦板浘鏁版嵁瀛樺偍澶辫触");
                     }
 
                     //灏嗘暟鎹簱鍦板浘鏁版嵁瀛樺叆redis
-                    redisUtil.set(RedisKeyType.MAP.key + i, JSON.toJSONString(basMap));
+                    redisUtil.set(RedisKeyType.MAP.key + lev, JSON.toJSONString(basMap));
                 }
+
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
-    }
-
-    /**
-     * 浠巖edis涓噸鍚换鍔�
-     */
-    public synchronized void restartTaskFromRedis() {
-        HashMap<Object, Object> map = redisUtil.getRedis();
-        for (Object key : map.keySet()) {
-            if (key.toString().contains(RedisKeyType.LIFT.key)) {//鎻愬崌鏈轰换鍔�
-                LiftRedisCommand redisCommand = JSON.parseObject(map.get(key).toString(), LiftRedisCommand.class);
-                if (redisCommand == null) {
-                    continue;
-                }
-
-                Short liftNo = redisCommand.getLiftNo();
-                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo.intValue());
-                if (liftThread == null) {
-                    continue;
-                }
-                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-                if (liftProtocol == null) {
-                    continue;
-                }
-                if (!liftProtocol.isIdle()) {
-                    continue;
-                }
-
-                //鎻愬崌鏈哄浜庣┖闂茬姸鎬侊紝杩涜浠诲姟鐨勬仮澶�
-                liftProtocol.setTaskNo(redisCommand.getWrkNo());//灏嗘彁鍗囨満绾跨▼鍒嗛厤浠诲姟鍙�
-                liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);//宸ヤ綔鐘舵��
-
-            }else if(key.toString().contains(RedisKeyType.SHUTTLE.key)){//鍥涘悜绌挎杞︿换鍔�
-                ShuttleRedisCommand redisCommand = JSON.parseObject(map.get(key).toString(), ShuttleRedisCommand.class);
-                if (redisCommand == null) {
-                    continue;
-                }
-
-                Short shuttleNo = redisCommand.getShuttleNo();
-                NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo.intValue());
-                if (shuttleThread == null) {
-                    continue;
-                }
-                NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-                if (shuttleProtocol == null) {
-                    continue;
-                }
-                if (!shuttleProtocol.isIdle()) {
-                    continue;
-                }
-
-                //鍥涘悜绌挎杞﹀浜庣┖闂茬姸鎬侊紝杩涜浠诲姟鐨勬仮澶�
-                shuttleProtocol.setTaskNo(redisCommand.getWrkNo().intValue());//灏嗗洓鍚戠┛姊溅绾跨▼鍒嗛厤浠诲姟鍙�
-                shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);//宸ヤ綔鐘舵��
-            }
-        }
-
     }
 
     /**
@@ -851,27 +114,12 @@
      */
     public synchronized void shuttleInExecute() {
         try {
-            List<WrkMast> wrkMasts = wrkMastMapper.selectInStep4();
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .in("wrk_sts"
+                            , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts
+                    ));
             for (WrkMast wrkMast : wrkMasts) {
-                //鑾峰彇婧愮珯
-                BasDevp sourceBasDevp = basDevpService.selectById(wrkMast.getSourceStaNo());
-                if (sourceBasDevp == null) {
-                    continue;//绔欑偣涓嶅瓨鍦�
-                }
-
-                //鑾峰彇鐩爣绔�
-                LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(sourceBasDevp.getLiftNo(), Utils.getLev(wrkMast.getLocNo()));
-                if (liftStaProtocol == null) {
-                    continue;//绔欑偣涓嶅瓨鍦�
-                }
-
-                // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢锛岃嚜鍔ㄣ�佺┖闂层�佹湁鐗�
-                if (!(liftStaProtocol.getModel() && !liftStaProtocol.getBusy() && liftStaProtocol.getHasTray())) {
-                    News.info("{}浠诲姟锛岃緭閫佺珯鐐圭姸鎬佷笉婊¤冻鍏ュ簱銆傝緭閫佺珯鐐�:{}", wrkMast.getWrkNo(), JSON.toJSONString(liftStaProtocol));
-                    continue;
-                }
-
-                boolean step1 = this.shuttleInExecuteStep1(wrkMast, liftStaProtocol);//灏忚溅鎼叆搴撲腑
+                boolean step1 = this.shuttleInExecuteStep1(wrkMast);//灏忚溅鎼叆搴撲腑
                 if (!step1) {
                     continue;
                 }
@@ -881,119 +129,94 @@
         }
     }
 
-//    /**
-//     * 鍏ュ簱  ===>>  鍥涘悜绌挎杞﹀叆搴撲綔涓氫笅鍙�
-//     */
-//    public synchronized void shuttleInExecute() {
-//        // 鏍规嵁杈撻�佺嚎plc閬嶅巻
-//        for (DevpSlave devp : slaveProperties.getDevp()) {
-//            // 閬嶅巻鍏ュ簱绔�
-//            for (DevpSlave.StaRack staRack : devp.getRackInStn()) {
-//                // 鑾峰彇鍏ュ簱绔欎俊鎭�
-//                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-//                StaProtocol staProtocol = devpThread.getStation().get(staRack.getStaNo());
-//                if (staProtocol == null) {
-//                    continue;
-//                } else {
-//                    staProtocol = staProtocol.clone();
-//                }
-//                Short workNo = staProtocol.getWorkNo();
-//                BasDevp basDevp = basDevpService.selectById(staProtocol.getSiteId());
-//                if (basDevp == null) {
-//                    continue;//绔欑偣淇℃伅涓嶅瓨鍦�
-//                }
-//
-//                // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢锛岃嚜鍔ㄣ�佹湁鐗┿�佸洓鍚戠┛姊溅鍙彇淇″彿
-//                if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isShuttleTakeEnable())) {
-//                    continue;
-//                }
-//
-//                WrkMast wrkMast = wrkMastMapper.selectRackInStep4(workNo, staProtocol.getSiteId());
-//                if (wrkMast == null) {
-//                    continue;
-//                }
-//
-//                boolean step1 = this.shuttleInExecuteStep1(wrkMast, basDevp);//灏忚溅鎼叆搴撲腑
-//                if (!step1) {
-//                    continue;
-//                }
-//
-//            }
-//        }
-//
-//    }
-
     /**
      * 鍏ュ簱-灏忚溅鎼叆搴撲腑
      * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
      * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
      */
-    public boolean shuttleInExecuteStep1(WrkMast wrkMast, LiftStaProtocol liftStaProtocol) {
-        if (wrkMast.getWrkSts() == 4) {
+    public boolean shuttleInExecuteStep1(WrkMast wrkMast) {
+        if (wrkMast.getWrkSts() == WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts) {
+            //鑾峰彇鐩爣绔�
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
+            if (liftSta == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀己灏戠珯鐐逛俊鎭紝绂佹娲惧彂", wrkMast.getWrkNo());
+                return false;
+            }
+
             if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
-                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftStaProtocol.getLocNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐�
-                News.info("{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
+                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftSta.getLocNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐�
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
                 return false;
             }
 
             //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
             }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
             if (shuttleProtocol == null) {
                 return false;
             }
-            if (!shuttleProtocol.isIdle()) {
-                News.info("{}浠诲姟锛寋}灏忚溅蹇欑涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+            if (!shuttleThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅蹇欑涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
-            }
-            //鍒ゆ柇灏忚溅浠ょ墝鏄惁鏈鍗犻
-            if (shuttleProtocol.getToken() != 0) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屼护鐗屽凡琚嫭鍗狅紝绂佹娲惧彂浠诲姟", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;//灏忚溅宸茶鐙崰锛岀姝㈠啀娲惧彂浠诲姟
             }
 
             //鍒ゆ柇灏忚溅鏄惁瀛樺湪绉诲姩浠诲姟
-            WrkMast hasMoveWorking = wrkMastMapper.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
+            WrkMast hasMoveWorking = wrkMastService.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
             if (hasMoveWorking != null) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽瓨鍦ㄧЩ鍔ㄤ换鍔★紝绂佹娲惧彂浠诲姟", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                News.taskInfo(wrkMast.getWrkNo(), "{}鍙峰皬杞︼紝瀛樺湪绉诲姩浠诲姟锛岀姝㈡淳鍙戜换鍔�", wrkMast.getShuttleNo());
                 return false;//瀛樺湪绉诲姩浠诲姟锛岀姝㈡墽琛屽叆搴撲换鍔�
             }
 
             //鍒ゆ柇灏忚溅鏄惁鍒拌揪杈撻�佺珯鐐瑰簱浣�
-            if (!shuttleProtocol.getCurrentLocNo().equals(liftStaProtocol.getLocNo())) {
+            if (!shuttleProtocol.getCurrentLocNo().equals(liftSta.getLocNo())) {
                 //灏忚溅涓嶅湪杈撻�佺珯鐐逛綅缃�
-                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftStaProtocol.getLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐�
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftSta.getLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐�
                 News.info("{}浠诲姟锛寋}灏忚溅锛屾湭鍒拌揪杈撻�佺珯鐐癸紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
             }
 
-            //灏忚溅宸叉姷杈捐緭閫佺珯鐐逛綅缃紝杩涜鎼繍璐х墿
-            NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo());
-            if (result == null) {//璺緞璁$畻澶辫触
-                News.info("{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐ワ紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.TRANSPORT.id);//灏忚溅绉诲簱浠诲姟
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setAuto(true);//鑷姩妯″紡
+
+            //鑾峰彇灏忚溅鍒拌緭閫佺珯鐐硅璧板懡浠�
+            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(liftSta.getLocNo(), wrkMast.getLocNo(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
+            if (commands == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
             }
 
-            //鍒涘缓鍒嗛厤鍛戒护
-            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.PAK_IN.id.shortValue());//鍏ュ簱妯″紡
-            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-            assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
-            assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
-
-            wrkMast.setWrkSts(5L);//4.鎻愬崌鏈烘惉杩愬畬鎴� => 5.灏忚溅鎼繍涓�
-            wrkMast.setModiTime(new Date());
-            shuttleProtocol.setToken(wrkMast.getWrkNo());//鐙崰灏忚溅浠ょ墝
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
-                //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+            List<ShuttleCommand> liftCommand = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, true);
+            if (liftCommand == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅鑾峰彇椤跺崌鍛戒护澶辫触", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
             }
 
+            List<ShuttleCommand> liftCommand2 = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, false);
+            if (liftCommand2 == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅鑾峰彇涓嬮檷鍛戒护澶辫触", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            commands.add(0, liftCommand.get(0));
+            commands.add(liftCommand2.get(0));
+            assignCommand.setCommands(commands);
+
+            wrkMast.setWrkSts(WrkStsType.INBOUND_SHUTTLE_RUN.sts);//灏忚溅鎼繍涓�  4.鎻愬崌鏈烘惉杩愬畬鎴� ==> 5.灏忚溅鎼繍涓�
+            wrkMast.setModiTime(new Date());
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
+            if (wrkMastService.updateById(wrkMast)) {
+                //涓嬪彂浠诲姟
+                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+                //瑙﹀彂閫氱煡
+                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_TRANSPORT);
+                return false;
+            }
             return false;
         }
         return true;
@@ -1004,7 +227,11 @@
      */
     public synchronized void shuttleOutExecute() {
         try {
-            for (WrkMast wrkMast : wrkMastMapper.selectBy2125()) {
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .in("wrk_sts"
+                            , WrkStsType.NEW_OUTBOUND.sts
+                    ));
+            for (WrkMast wrkMast : wrkMasts) {
                 boolean step1 = this.shuttleOutExecuteStep1(wrkMast);//灏忚溅鎼嚭搴撲腑
                 if (!step1) {
                     continue;
@@ -1021,57 +248,62 @@
      * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
      */
     public boolean shuttleOutExecuteStep1(WrkMast wrkMast) {
-        //21.鐢熸垚鍑哄簱浠诲姟 => 22.灏忚溅鎼繍涓�
-        if (wrkMast.getWrkSts() == 21) {
-            EntityWrapper<StaDesc> wrapper = new EntityWrapper<>();
-            wrapper.eq("type_no", wrkMast.getIoType());//璺緞绫诲瀷
-            wrapper.eq("stn_no", wrkMast.getStaNo());//鍑哄簱绔欑偣缂栧彿
-            StaDesc staDesc = staDescService.selectOne(wrapper);
-            if (staDesc == null) {
-                News.info("{}浠诲姟锛屽嚭搴撹矾寰勪笉瀛樺湪", wrkMast.getWrkNo());
-                return false;//鍑哄簱璺緞涓嶅瓨鍦�
+        //101.鐢熸垚鍑哄簱浠诲姟 => 102.灏忚溅鎼繍涓�
+        if (wrkMast.getWrkSts() == WrkStsType.NEW_OUTBOUND.sts) {
+            Integer liftNo = wrkMast.getLiftNo();
+            if (liftNo == null) {
+                //閫氳繃杈撻�佺嚎绔欏彿鑾峰彇鎻愬崌鏈哄彿
+                liftNo = ForkLiftUtils.getConveyorBindLiftNo(wrkMast.getStaNo());
+                if (liftNo == null) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo());
+                    return false;
+                }
+
+                //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
+                WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftNo);
+                if (liftWrkMast != null) {
+                    if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚�
+                        News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftNo);
+                        return false;
+                    }
+                }
+
+                wrkMast.setLiftNo(liftNo);
+                wrkMast.setModiTime(new Date());
+                wrkMastService.updateById(wrkMast);
+                return false;
             }
 
-            //鑾峰彇鍑哄簱绔欑偣
-            BasDevp basDevp = basDevpService.selectById(wrkMast.getStaNo());
-            if (basDevp == null) {
-                return false;//鍑哄簱绔欑偣涓嶅瓨鍦�
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
+            if (forkLiftThread == null) {
+                return false;
+            }
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
+                return false;
             }
 
-//            if (!basDevp.getAutoing().equals("Y")) {
-//                News.info("{}浠诲姟锛寋}绔欑偣锛屼笉鏄嚜鍔ㄧ姸鎬�",wrkMast.getWrkNo(),basDevp.getDevNo());
-//                return false;//涓嶆槸鑷姩鐘舵��
-//            }
-//
-//            if (!basDevp.getOutEnable().equals("Y")) {
-//                News.info("{}浠诲姟锛寋}绔欑偣锛屾病鏈夊彲鍑轰俊鍙�", wrkMast.getWrkNo(), basDevp.getDevNo());
-//                return false;//鍑哄簱绔欑偣涓嶅彲鍑�
-//            }
-
-            Integer liftNo = basDevp.getLiftNo();//鎼滅储鍑哄簱鎻愬崌鏈烘槸鍚﹀瓨鍦ㄥ叆搴撲换鍔★紝濡傚瓨鍦ㄧ姝㈠嚭搴�
-            List<WrkMast> liftWrkMasts = wrkMastMapper.selectInWrkMastByLiftNo(liftNo);
-            if (!liftWrkMasts.isEmpty()) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽瓨鍦ㄥ叆搴撲换鍔★紝绯荤粺绂佹鍑哄簱", wrkMast.getWrkNo(), liftNo);
-                return false;//瀛樺湪鍏ュ簱浠诲姟锛岀姝㈠嚭搴�
-            }
-
-            //鍚屽簱浣嶇粍鏍¢獙
-            List<String> outerLoc = Utils.getGroupOuterLoc(wrkMast.getSourceLocNo());
-            List<LocMast> outerLocMasts = locMastService.selectNotEmptyLocNos(outerLoc);
-            if (!outerLocMasts.isEmpty()) {
-                News.info("{}浠诲姟锛屾祬搴撲綅瀛樺湪璐х墿锛岀郴缁熺瓑寰呬腑", wrkMast.getWrkNo());
-                return false;//娴呭簱浣嶅瓨鍦ㄦ湭鎵ц浠诲姟
+            //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀浜庡嚭搴撴ā寮�
+            if (!forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.OUT)) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾彁鍗囨満涓嶅浜庡嚭搴撴ā寮忥紝绂佹鍑哄簱", wrkMast.getWrkNo());
+                return false;
             }
 
             //鑾峰彇婧愮珯
-            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(basDevp.getLiftNo(), Utils.getLev(wrkMast.getSourceLocNo()));
-            if (liftStaProtocol == null) {
-                return false;//鎵句笉鍒扮珯鐐�
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByLev(liftNo, Utils.getLev(wrkMast.getSourceLocNo()));
+            if (liftSta == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀己灏戠珯鐐逛俊鎭紝绂佹娲惧彂", wrkMast.getWrkNo());
+                return false;
             }
 
-            if (!(liftStaProtocol.getModel() && !liftStaProtocol.getBusy() && !liftStaProtocol.getHasTray())) {
-                News.info("{}浠诲姟锛寋}鍐呴儴杈撻�佺珯锛屼笉婊¤冻鑷姩銆佺┖闂层�佹棤鎵樼洏鐘舵��", wrkMast.getWrkNo(), liftStaProtocol.getStaNo());
-                return false;//绔欑偣蹇呴』鑷姩銆佺┖闂层�佹病鏈夋墭鐩�
+            if (liftSta.getHasCar()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣瀛樺湪灏忚溅锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), liftSta.getStaNo());
+                return false;
+            }
+
+            if (liftSta.getHasTray()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣鏈夋墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getStaNo());
+                return false;
             }
 
             if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
@@ -1090,64 +322,76 @@
                     //鏌ヨ妤煎眰宸插垎閰嶈溅杈嗙殑鍑哄簱浠诲姟鏁伴噺
                     List<WrkMast> wrkMasts = wrkMastService.selectShuttleOutWrkByLev(lev);
                     if (wrkMasts.size() >= useShuttleCount) {
-                        News.info("{}浠诲姟锛屽綋鍓嶆ゼ灞傚彲鐢ㄥ皬杞}鍙帮紝鍑哄簱浠诲姟宸插垎閰峽}鍙帮紝绯荤粺绛夊緟涓��", wrkMast.getWrkNo(), useShuttleCount, wrkMasts.size());
+                        News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽綋鍓嶆ゼ灞傚彲鐢ㄥ皬杞}鍙帮紝鍑哄簱浠诲姟宸插垎閰峽}鍙帮紝绯荤粺绛夊緟涓��", wrkMast.getWrkNo(), useShuttleCount, wrkMasts.size());
                         return false;
                     }
                 }
                 boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄥ簱浣嶈繘琛屽彇璐�
-                News.info("{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓��", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓��", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
                 return false;
             }
 
             //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
             }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
             if (shuttleProtocol == null) {
                 return false;
             }
-            if (!shuttleProtocol.isIdle()) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽繖纰屼腑", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+            if (!shuttleThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽繖纰屼腑", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
-            }
-            //鍒ゆ柇灏忚溅浠ょ墝鏄惁鏈鍗犻
-            if (shuttleProtocol.getToken() != 0) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屼护鐗屽凡琚嫭鍗狅紝绂佹娲惧彂浠诲姟", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;//灏忚溅宸茶鐙崰锛岀姝㈠啀娲惧彂浠诲姟
             }
 
             //鍒ゆ柇灏忚溅鏄惁鍒拌揪璐х墿搴撲綅
             if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
                 //灏忚溅涓嶅湪杈撻�佺珯鐐逛綅缃�
                 shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄥ簱浣嶈繘琛屽彇璐�
-                News.info("{}浠诲姟锛寋}灏忚溅锛屾湭鍒拌揪杈撻�佺珯鐐癸紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屾湭鍒拌揪杈撻�佺珯鐐癸紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
             }
 
-            //灏忚溅宸叉姷杈捐揣鐗╀綅缃紝杩涜鎼繍璐х墿
-            NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), liftStaProtocol.getLocNo());//灏嗚揣鐗╂惉杩愯嚦鎻愬崌鏈鸿緭閫佺珯鐐�
-            if (result == null) {//鍑哄簱璺緞璁$畻澶辫触
-                News.info("{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐ワ紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;
-            }
-
-            //鍒涘缓鍒嗛厤鍛戒护
             ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.PAK_OUT.id.shortValue());//鍑哄簱妯″紡
-            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-            assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
-            assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.TRANSPORT.id);//灏忚溅绉诲簱浠诲姟
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setAuto(true);//鑷姩妯″紡
 
-            wrkMast.setWrkSts(22L);//21.鐢熸垚鍑哄簱浠诲姟 => 22.灏忚溅鎼繍涓�
+            //鑾峰彇灏忚溅鍒拌緭閫佺珯鐐硅璧板懡浠�
+            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(wrkMast.getSourceLocNo(), liftSta.getLocNo(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
+            if (commands == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            List<ShuttleCommand> liftCommand = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, true);
+            if (liftCommand == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅鑾峰彇椤跺崌鍛戒护澶辫触", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            List<ShuttleCommand> liftCommand2 = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, false);
+            if (liftCommand2 == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅鑾峰彇涓嬮檷鍛戒护澶辫触", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            commands.add(0, liftCommand.get(0));
+            commands.add(liftCommand2.get(0));
+            assignCommand.setCommands(commands);
+
+            wrkMast.setWrkSts(WrkStsType.OUTBOUND_SHUTTLE_RUN.sts);//灏忚溅鎼繍涓�  101.鐢熸垚鍑哄簱浠诲姟 ==> 102.灏忚溅鎼繍涓�
+            wrkMast.setSourceStaNo(liftSta.getStaNo());
             wrkMast.setModiTime(new Date());
-            shuttleProtocol.setToken(wrkMast.getWrkNo());//鐙崰灏忚溅浠ょ墝
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
+            if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+                //瑙﹀彂閫氱煡
+                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_TRANSPORT);
+                return false;
             }
             return false;
         }
@@ -1161,8 +405,8 @@
         try {
             for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
                 //鑾峰彇鍥涘悜绌挎杞︿俊鎭�
-                NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
-                NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
+                ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
                 if (shuttleProtocol == null) {
                     continue;
                 }
@@ -1170,93 +414,69 @@
                 //鍥涘悜绌挎杞︾姸鎬佷负绛夊緟纭銆佸皬杞﹀浜庣┖闂茬姸鎬�
                 if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id  //浠诲姟瀹屾垚绛夊緟纭
                         && shuttleProtocol.getTaskNo() != 0
-                        && shuttleProtocol.getFree() == ShuttleStatusType.IDLE.id
                 ) {
                     //灏嗕换鍔℃。鏍囪涓哄畬鎴�
-                    WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo());
+                    WrkMast wrkMast = wrkMastService.selectByWorkNo(shuttleProtocol.getTaskNo());
                     if (wrkMast != null) {
-                        switch (wrkMast.getWrkSts().intValue()) {
-                            case 5://5.灏忚溅鎼繍涓� ==> 9.鍏ュ簱瀹屾垚
-                                wrkMast.setWrkSts(9L);
-                                shuttleProtocol.setTaskNo(0);
-                                if (shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                                    //閲婃斁灏忚溅浠ょ墝
-                                    shuttleProtocol.setToken(0);
-                                }
-                                break;
-                            case 22://22.灏忚溅鎼繍涓� ==> 23.灏忚溅鎼繍瀹屾垚
-                                wrkMast.setWrkSts(23L);
-                                shuttleProtocol.setTaskNo(0);
-                                if (shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                                    //閲婃斁灏忚溅浠ょ墝
-                                    shuttleProtocol.setToken(0);
-                                }
-                                break;
-                            case 102://102.灏忚溅绉诲姩鑷崇珯鐐� ==> 103.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴�
-                                wrkMast.setWrkSts(103L);
-                                break;
-                            case 104://104.灏忚溅杩佸叆鎻愬崌鏈轰腑 ==> 105.灏忚溅杩佸叆鎻愬崌鏈哄畬鎴�
-                                wrkMast.setWrkSts(105L);
-                                shuttleProtocol.setTaskNo(0);//娓呯悊宸ヤ綔鍙�
-                                break;
-                            case 108://108.灏忚溅杩佸嚭鎻愬崌鏈轰腑 ==> 109.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴�
-                                wrkMast.setWrkSts(109L);
-                                break;
-                            case 110://110.灏忚溅绉诲姩涓� ==> 111.灏忚溅绉诲姩瀹屾垚
-                                wrkMast.setWrkSts(111L);
-                                shuttleProtocol.setTaskNo(0);
-                                if (shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                                    //閲婃斁灏忚溅浠ょ墝
-                                    shuttleProtocol.setToken(0);
-                                }
-                                break;
-                            default:
+                        if (wrkMast.getWrkSts() == WrkStsType.INBOUND_SHUTTLE_RUN.sts) {
+                            //5.灏忚溅鎼繍涓� ==> 9.鍏ュ簱瀹屾垚
+                            wrkMast.setWrkSts(WrkStsType.COMPLETE_INBOUND.sts);
+                            shuttleThread.setSyncTaskNo(0);
+                        } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_SHUTTLE_RUN.sts) {
+                            //102.灏忚溅鎼繍涓� ==> 103.灏忚溅鎼繍瀹屾垚
+                            wrkMast.setWrkSts(WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts);
+                            shuttleThread.setSyncTaskNo(0);
+                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_SITE.sts) {
+                            //302.灏忚溅绉诲姩鑷崇珯鐐� ==> 303.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴�
+                            wrkMast.setWrkSts(WrkStsType.MOVE_SITE_COMPLETE.sts);
+                            shuttleThread.setSyncTaskNo(0);
+                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_OUT_LIFT.sts) {
+                            //308.灏忚溅杩佸嚭鎻愬崌鏈轰腑 ==> 309.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴�
+                            if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
+                                continue;//灏忚溅鏈埌杈剧洰鏍囧眰
+                            }
+                            wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts);
+                            shuttleThread.setSyncTaskNo(0);
+                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_SHUTTLE.sts) {
+                            //310.灏忚溅绉诲姩涓� ==> 311.灏忚溅绉诲姩瀹屾垚
+                            wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts);
+                            shuttleThread.setSyncTaskNo(0);
+                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVE_COMPLETE);//瑙﹀彂閫氱煡
+                        } else if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_WORKING.sts) {
+                            //204.灏忚溅鍏呯數涓� ==> 205.灏忚溅鍏呯數瀹屾垚
+                            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts);
+                            shuttleThread.setSyncTaskNo(0);
+                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_POWER_COMPLETE);//瑙﹀彂閫氱煡
+                        } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_SHUTTLE_RUN.sts) {
+                            //502.灏忚溅鎼繍涓� ==> 509.绉诲簱瀹屾垚
+                            wrkMast.setWrkSts(WrkStsType.COMPLETE_LOC_MOVE.sts);
+                            shuttleThread.setSyncTaskNo(0);
+                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_DELIVERY);//瑙﹀彂閫氱煡
+                        } else {
+                            continue;
                         }
 
-                        if (wrkMastMapper.updateById(wrkMast) > 0) {
-                            if (wrkMast.getWrkSts() == 111) {
-                                // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-                                if (wrkMastLogMapper.save(wrkMast.getWrkNo()) <= 0) {
-                                    log.info("淇濆瓨宸ヤ綔鍘嗗彶妗workNo={0}]澶辫触", wrkMast.getWrkNo());
-                                }
-                                // 鍒犻櫎宸ヤ綔涓绘。
-                                if (!wrkMastService.deleteById(wrkMast)) {
-                                    log.info("鍒犻櫎宸ヤ綔涓绘。[workNo={0}]澶辫触", wrkMast.getWrkNo());
-                                }
-                            }
-
+                        if (wrkMastService.updateById(wrkMast)) {
                             //璁剧疆鍥涘悜绌挎杞︿负绌洪棽鐘舵��
-                            shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
-                            //婧愬簱浣嶆竻闆�
-                            shuttleProtocol.setSourceLocNo(null);
-                            //鐩爣搴撲綅娓呴浂
-                            shuttleProtocol.setLocNo(null);
-                            //浠诲姟鎸囦护娓呴浂
-                            shuttleProtocol.setAssignCommand(null);
+                            shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
                             News.info("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傚洓鍚戠┛姊溅鍙�={}", shuttleProtocol.getShuttleNo());
                         } else {
                             News.error("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傚洓鍚戠┛姊溅鍙�={}锛屽伐浣滃彿={}", shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo());
                         }
                     } else {
-                        ShuttleAssignCommand assignCommand = shuttleProtocol.getAssignCommand();
-                        if (!assignCommand.getAuto()) {
-                            //鎵嬪姩妯″紡
-                            //宸ヤ綔鍙锋竻闆�
-                            shuttleProtocol.setTaskNo(0);
-                            //璁剧疆鍥涘悜绌挎杞︿负绌洪棽鐘舵��
-                            shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
-                            //婧愬簱浣嶆竻闆�
-                            shuttleProtocol.setSourceLocNo(null);
-                            //鐩爣搴撲綅娓呴浂
-                            shuttleProtocol.setLocNo(null);
-                            //浠诲姟鎸囦护娓呴浂
-                            shuttleProtocol.setAssignCommand(null);
-                            //娓呴浂浠ょ墝
-                            shuttleProtocol.setToken(0);
-                            News.info("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傚洓鍚戠┛姊溅鍙�={}", shuttleProtocol.getShuttleNo());
+                        Object object = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + shuttleProtocol.getTaskNo());
+                        if(object != null){
+                            ShuttleAssignCommand assignCommand = JSON.parseObject(object.toString(), ShuttleAssignCommand.class);
+                            if (!assignCommand.getAuto()) {
+                                //鎵嬪姩妯″紡
+                                //宸ヤ綔鍙锋竻闆�
+                                shuttleThread.setTaskNo(0);
+                                //璁剧疆鍥涘悜绌挎杞︿负绌洪棽鐘舵��
+                                shuttleThread.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+                                News.info("鍥涘悜绌挎杞﹀凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅銆傚洓鍚戠┛姊溅鍙�={}", shuttleProtocol.getShuttleNo());
+                            }
                         }
                     }
-
                 }
 
             }
@@ -1266,56 +486,175 @@
     }
 
     /**
-     * 鎻愬崌鏈轰换鍔�
+     * 鎵ц绉诲簱浠诲姟
      */
-    public synchronized void liftIoExecute() {
+    public synchronized void shuttleLocMoveExecute() {
         try {
-            for (LiftSlave liftSlave : slaveProperties.getLift()) {
-                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
-                if (liftThread == null) {
-                    continue;
-                }
-                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-                if (liftProtocol == null) {
+            //鏌ヨ绉诲簱浠诲姟
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts));
+            for (WrkMast wrkMast : wrkMasts) {
+                boolean stepToTarget = this.shuttleLocMoveExecuteToTarget(wrkMast);//绉诲簱浠诲姟-灏忚溅鍘荤洰鏍囩偣
+                if (!stepToTarget) {
                     continue;
                 }
 
-                if (!liftProtocol.isIdle()) {
-                    News.info("{}鍙锋彁鍗囨満锛屽繖纰屼腑", liftSlave.getId());
-                    continue;
-                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 
-                //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚﹁鍗犵敤
-                if (liftProtocol.getToken() != 0) {
-                    News.info("{}鍙锋彁鍗囨満锛屼护鐗屽凡琚嫭鍗�", liftSlave.getId());
-                    continue;
-                }
+    /**
+     * 绉诲簱浠诲姟-灏忚溅鍘荤洰鏍囩偣
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    private boolean shuttleLocMoveExecuteToTarget(WrkMast wrkMast) {
+        //--------------------------------------灏忚溅绉诲姩鑷崇珯鐐�-----------------------------------------//
+        Date now = new Date();
 
-                //鎼滅储鏄惁鏈夊緟澶勭悊鐨勪换鍔�
-                List<WrkMast> wrkMasts = wrkMastMapper.selectLiftStep223103();
-                if (wrkMasts.isEmpty()) {
-                    continue;
-                }
+        //灏忚溅绉诲姩鑷崇珯鐐�  501.鐢熸垚绉诲簱浠诲姟 ==> 502.灏忚溅鎼繍涓�
+        if (wrkMast.getWrkSts() == WrkStsType.NEW_LOC_MOVE.sts) {
+            if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
+                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒拌揣鐗╃偣杩涜鍙栬揣
+                News.info("{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
+                return false;
+            }
 
-                for (WrkMast wrkMast : wrkMasts) {
-                    //鎼滅储鏄惁鏈夊叾浠栦换鍔″崰鐢ㄤ簡鎻愬崌鏈猴紝濡傛灉鍗犵敤鎻愬崌鏈虹殑浠诲姟鍜屽綋鍓嶄换鍔$浉鍚岋紝鍒欒繍琛屾墽琛�
-                    WrkMast wrkMast1 = wrkMastMapper.selectLiftWrkMast(liftProtocol.getLiftNo().intValue());
-                    if (wrkMast1 != null && wrkMast1.getWrkNo().intValue() != wrkMast.getWrkNo().intValue()) {
-                        News.info("{}鍙锋彁鍗囨満锛岃鍏朵粬浠诲姟{}鍗犵敤涓斿拰褰撳墠浠诲姟{}涓嶇浉鍚岋紝绂佹娲惧彂", liftSlave.getId(), wrkMast1.getWrkNo(), wrkMast.getWrkNo());
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+
+            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽皬杞︽湭鍒拌揪鍙栬揣浣嶇疆", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
+                return false;
+            }
+
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.TRANSPORT.id);//灏忚溅绉诲簱浠诲姟
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setAuto(true);//鑷姩妯″紡
+
+            //鑾峰彇灏忚溅鍒拌緭閫佺珯鐐硅璧板懡浠�
+            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(wrkMast.getSourceLocNo(), wrkMast.getLocNo(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
+            if (commands == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            List<ShuttleCommand> liftCommand = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, true);
+            if (liftCommand == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅鑾峰彇椤跺崌鍛戒护澶辫触", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            List<ShuttleCommand> liftCommand2 = shuttleOperaUtils.getShuttleLiftCommand(assignCommand, shuttleThread, false);
+            if (liftCommand2 == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅鑾峰彇涓嬮檷鍛戒护澶辫触", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            commands.add(0, liftCommand.get(0));
+            commands.add(liftCommand2.get(0));
+            assignCommand.setCommands(commands);
+
+            wrkMast.setWrkSts(WrkStsType.LOC_MOVE_SHUTTLE_RUN.sts);//灏忚溅鎼繍涓�  501.鐢熸垚绉诲簱浠诲姟 ==> 502.灏忚溅鎼繍涓�
+            wrkMast.setModiTime(now);
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
+            if (wrkMastService.updateById(wrkMast)) {
+                //涓嬪彂浠诲姟
+                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+                //瑙﹀彂閫氱煡
+                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVING);
+                return false;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 璐у弶鎻愬崌鏈轰换鍔�
+     */
+    public synchronized void forkLiftIoExecute() {
+        try {
+            //鎼滅储鏄惁鏈夊緟澶勭悊鐨勪换鍔�
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .in("wrk_sts", WrkStsType.NEW_INBOUND.sts, WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts));
+            if (wrkMasts.isEmpty()) {
+                return;
+            }
+
+            for (WrkMast wrkMast : wrkMasts) {
+                Integer liftNo = wrkMast.getLiftNo();
+                if (liftNo == null) {
+                    //鏈垎閰嶆彁鍗囨満
+                    Integer staNo = wrkMast.getIoType() == WrkIoType.IN.id ? wrkMast.getSourceStaNo() : wrkMast.getStaNo();
+                    liftNo = ForkLiftUtils.getConveyorBindLiftNo(staNo);
+                    if(liftNo == null) {
+                        News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo());
                         continue;
                     }
 
-                    boolean stepIn = this.liftIoExecuteStepIn(wrkMast);//鎻愬崌鏈哄叆搴�
-                    if (!stepIn) {
+                    ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
+                    if (forkLiftThread == null) {
+                        continue;
+                    }
+                    ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+                    if (forkLiftProtocol == null) {
                         continue;
                     }
 
-                    boolean stepOut = this.liftIoExecuteStepOut(wrkMast);//鎻愬崌鏈哄嚭搴�
-                    if (!stepOut) {
+                    if (!forkLiftThread.isIdle()) {
+                        News.info("{}鍙锋彁鍗囨満锛屽繖纰屼腑", liftNo);
                         continue;
                     }
+
+                    //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
+                    WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo());
+                    if (liftWrkMast != null) {
+                        if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚�
+                            News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo());
+                            continue;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
+                        }
+                    }
+
+                    wrkMast.setLiftNo(liftNo);
+                    wrkMast.setModiTime(new Date());
+                    wrkMastService.updateById(wrkMast);
+                    continue;
                 }
 
+                ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
+                if (forkLiftThread == null) {
+                    continue;
+                }
+                ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+                if (forkLiftProtocol == null) {
+                    continue;
+                }
+
+                if (!forkLiftThread.isIdle()) {
+                    News.info("{}鍙锋彁鍗囨満锛屽繖纰屼腑", liftNo);
+                    continue;
+                }
+
+                boolean stepIn = this.liftIoExecuteStepIn(wrkMast);//鎻愬崌鏈哄叆搴�
+                if (!stepIn) {
+                    continue;
+                }
+
+                boolean stepOut = this.liftIoExecuteStepOut(wrkMast);//鎻愬崌鏈哄嚭搴�
+                if (!stepOut) {
+                    continue;
+                }
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -1331,140 +670,94 @@
         //--------------------------------------鎻愬崌鏈哄叆搴�-----------------------------------------//
         Date now = new Date();
 
-        //2.璁惧涓婅蛋 ==> 3.鎻愬崌鏈烘惉杩愪腑
-        if (wrkMast.getWrkSts() == 2) {
-            //鑾峰彇婧愮珯
-            BasDevp sourceBasDevp = basDevpService.selectById(wrkMast.getSourceStaNo());
-            if (sourceBasDevp == null) {
+        //1.鐢熸垚鍏ュ簱浠诲姟 ==> 3.鎻愬崌鏈烘惉杩愪腑
+        if (wrkMast.getWrkSts() == WrkStsType.NEW_INBOUND.sts) {
+            //鑾峰彇鐩爣杈撻�佺珯
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
+            if (liftSta == null) {
                 return false;//鎵句笉鍒扮珯鐐�
             }
 
-            if (!sourceBasDevp.getInEnable().equals("Y")) {
-                News.info("{}浠诲姟锛寋}婧愮珯锛屾病鏈夊彲鍏ヤ俊鍙�", wrkMast.getWrkNo(), sourceBasDevp.getDevNo());
-                return false;//绔欑偣涓嶅彲鍏�
-            }
-
-            Integer barcodeId = Utils.getBarcodeIdByStaNo(wrkMast.getSourceStaNo());
-            if (barcodeId == null) {
-                News.info("{}浠诲姟锛寋}婧愮珯锛屾壘涓嶅埌鍙敤鏉$爜鍣↖D", wrkMast.getWrkNo(), sourceBasDevp.getDevNo());
-                return false;//绔欑偣涓嶅彲鍏�
-            }
-
-            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId);
-            if (barcodeThread == null) {
-                News.info("{}浠诲姟锛寋}婧愮珯锛屾潯鐮佸櫒{}绾跨▼涓虹┖", wrkMast.getWrkNo(), sourceBasDevp.getDevNo(), barcodeId);
-                return false;//绔欑偣涓嶅彲鍏�
-            }
-            String barcode = barcodeThread.getBarcode();
-            if(!Cools.isEmpty(barcode)) {
-                if(!("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode))) {
-                    //瀛樺湪鏉$爜鍊硷紝鍒ゆ柇鏄惁鍜屽綋鍓嶅伐浣滄。涓�鑷�
-                    if (!barcode.equals(wrkMast.getBarcode())) {
-                        News.info("{}浠诲姟,{}绔欑偣锛屾潯鐮佸櫒{}鍊納}涓庡伐浣滄。鏉$爜鍊納}涓嶄竴鑷达紝绯荤粺璺宠繃鎵ц", wrkMast.getWrkNo(), sourceBasDevp.getDevNo(), barcodeId, barcode,wrkMast.getBarcode());
-                        return false;//绔欑偣涓嶅彲鍏�
-                    }
-                }
-            }else {
+            if (liftSta.getHasTray()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪鎵樼洏", wrkMast.getWrkNo());
                 return false;
             }
 
-            //鍒ゆ柇鎻愬崌鏈烘暣涓笁妤兼槸鍚﹂兘澶勪簬鍏ュ簱妯″紡
-            Integer outInModel1 = Utils.getOutInModelByLift(sourceBasDevp.getLiftNo(), 1);
-            Integer outInModel2 = Utils.getOutInModelByLift(sourceBasDevp.getLiftNo(), 5);
-            Integer outInModel3 = Utils.getOutInModelByLift(sourceBasDevp.getLiftNo(), 8);
-            if (outInModel1 == null || outInModel2 == null || outInModel3 == null) {
-                News.info("{}浠诲姟锛屾病鏈夊嚭鍏ュ簱妯″紡", wrkMast.getWrkNo());
-                return false;//涓嶅瓨鍦ㄥ嚭鍏ュ簱妯″紡
-            }
-
-            if (outInModel1 == 2 || outInModel2 == 2 && outInModel3 == 2) {
-                News.info("{}浠诲姟锛屾湁绔欑偣澶勪簬鍑哄簱妯″紡锛岀姝㈠叆搴�", wrkMast.getWrkNo());
-                return false;//鍙鏈変竴涓浜庡嚭搴撴ā寮忥紝绂佹鍏ュ簱
-            }
-
-            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, sourceBasDevp.getLiftNo());
-            if (liftThread == null) {
+            if (liftSta.getHasCar()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪灏忚溅", wrkMast.getWrkNo());
                 return false;
             }
-            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-            if (liftProtocol == null) {
+
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftSta.getLiftNo());
+            if (forkLiftThread == null) {
                 return false;
             }
-            if (!liftProtocol.isIdle()) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽繖纰屼腑", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
                 return false;
             }
-            //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚︽湭琚崰棰�
-            if (liftProtocol.getToken() != 0) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屼护鐗屽凡琚嫭鍗狅紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//鎻愬崌鏈哄凡琚嫭鍗狅紝绂佹鍐嶆淳鍙戜换鍔�
+            if (!forkLiftThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽繖纰屼腑", wrkMast.getWrkNo(), liftSta.getLiftNo());
+                return false;
             }
 
-            //鍒ゆ柇鎻愬崌鏈哄唴鏄惁鏈夊皬杞�
-            if (liftProtocol.getHasCar()) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満鍐呴儴鏈夊皬杞︼紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//鏈夊皬杞︼紝绂佹娲惧彂
-            }
-
-            //鍒ゆ柇鎻愬崌鏈哄唴鏄惁鏈夋墭鐩�
-            if (liftProtocol.getHasTray()) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満鍐呴儴鏈夋墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//鏈夋墭鐩橈紝绂佹娲惧彂
+            //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀浜庡叆搴撴ā寮�
+            if (!forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.IN)) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾彁鍗囨満涓嶅浜庡叆搴撴ā寮忥紝绂佹鍏ュ簱", wrkMast.getWrkNo());
+                return false;
             }
 
             //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
-            WrkMast liftWrkMast = wrkMastMapper.selectLiftWrkMast(liftThread.getSlave().getId());
+            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo());
             if (liftWrkMast != null) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽綋鍓嶆彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
+                if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚�
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo());
+                    return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
+                }
             }
 
-            //鑾峰彇婧愮珯瀵瑰簲鐨勭墰鐪兼彁鍗囨満绔欑偣缂栧彿(璧风偣缂栧彿)
-            Integer startSta = Integer.parseInt(sourceBasDevp.getQrCodeValue());
-            //鑾峰彇鎻愬崌鏈虹珯鐐�
-            LiftStaProtocol targetStaProtocol = NyLiftUtils.getLiftStaByLev(liftThread.getSlave().getId(), Utils.getLev(wrkMast.getLocNo()));
-            if (targetStaProtocol == null) {
-                return false;//绔欑偣涓嶅瓨鍦�
-            }
-
-            if (targetStaProtocol.getHasTray()) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛寋}绔欑偣锛屾彁鍗囨満绔欑偣鏈夋墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo(), targetStaProtocol.getStaNo());
-                return false;//鎻愬崌鏈虹珯鐐规湁鎵樼洏锛岀姝㈡淳鍙�
-            }
-
-            Integer targetSta = targetStaProtocol.getStaNo();
-
-            //鑾峰彇鎻愬崌鏈哄懡浠�
-            NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftProtocol.getLiftNo().intValue(), NyLiftTaskModelType.MOVE_TRAY.id, startSta, targetSta, wrkMast.getWrkNo());
-            if (wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57) {
-                //鎷f枡鍐嶅洖搴擄紝閲嶆柊鍒嗛厤璁惧宸ヤ綔鍙�
-                int deviceWrk = commonService.getWorkNo(8);//鐢熸垚鎻愬崌鏈鸿澶囧伐浣滃彿
-                BasLiftOpt basLiftOpt = basLiftOptService.selectByDeviceWrk(String.valueOf(deviceWrk), liftThread.getSlave().getId());
-                if (basLiftOpt != null) {
-                    News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛岃澶囧伐浣滃彿鍑虹幇閲嶅鎯呭喌锛岃鑱旂郴鎶�鏈汉鍛樻敮鎸併��", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
+            //妫�娴嬫ゼ灞傛槸鍚︽湁鍙敤绌挎杞�
+            boolean checkLevHasShuttle = Utils.checkLevHasShuttle(liftSta.getLev());
+            if (!checkLevHasShuttle) {
+                if (wrkMast.getShuttleNo() != null) {
                     return false;
                 }
-                liftCommand.setTaskNo((short) deviceWrk);
+
+                //鑾峰彇灏忚溅寰呮満浣�
+                String standbyLocNo = Utils.getShuttleStandbyLocNo(liftSta.getLocNo());
+                if (standbyLocNo == null) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃幏鍙栧皬杞﹀緟鏈轰綅澶辫触", wrkMast.getWrkNo());
+                    return false;
+                }
+
+                //璋冨害灏忚溅鍘诲緟鏈轰綅
+                boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), standbyLocNo);
+                if (!dispatchShuttle) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃皟搴﹀皬杞﹀け璐�", wrkMast.getWrkNo());
+                    return false;
+                }
+                return false;
             }
-            ArrayList<NyLiftCommand> commands = new ArrayList<>();
-            commands.add(liftCommand);
+
+            //鑾峰彇鎻愬崌鏈哄懡浠�
+            List<ForkLiftCommand> liftCommands = forkLiftThread.getPickAndPutCommand(wrkMast.getWrkNo(), wrkMast.getSourceStaNo(), liftSta.getLev());
+            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
+            commands.addAll(liftCommands);
 
             //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
             LiftAssignCommand assignCommand = new LiftAssignCommand();
             assignCommand.setCommands(commands);
-            assignCommand.setLiftNo(liftProtocol.getLiftNo());
+            assignCommand.setLiftNo(wrkMast.getLiftNo().shortValue());
             assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
-            assignCommand.setTaskMode(NyLiftTaskModelType.MOVE_TRAY.id.shortValue());
+            assignCommand.setTaskMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue());
 
-            wrkMast.setWrkSts(3L);//2.璁惧涓婅蛋 ==> 3.鎻愬崌鏈烘惉杩愪腑
-            wrkMast.setLiftNo(liftThread.getSlave().getId());//浠诲姟妗g粦瀹氭彁鍗囨満鍙�
+            wrkMast.setWrkSts(WrkStsType.INBOUND_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑  1.鐢熸垚鍏ュ簱浠诲姟 ==> 3.鎻愬崌鏈烘惉杩愪腑
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
             wrkMast.setModiTime(now);
-            liftProtocol.setToken(wrkMast.getWrkNo());//鐙崰鎻愬崌鏈轰护鐗�
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
+            if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand));
+                forkLiftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
             }
-
             return false;
         }
         return true;
@@ -1477,202 +770,152 @@
      */
     private boolean liftIoExecuteStepOut(WrkMast wrkMast) {
         //--------------------------------------鎻愬崌鏈哄嚭搴�-----------------------------------------//
-        Date now = new Date();
-
-        //23.灏忚溅鎼繍瀹屾垚 ==> 24.鎻愬崌鏈烘惉杩愪腑
-        if (wrkMast.getWrkSts() == 23) {
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+        //103.灏忚溅鎼繍瀹屾垚 ==> 104.鎻愬崌鏈烘惉杩愪腑
+        if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts) {
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
             }
-
-            //鑾峰彇鍑哄簱绔欑偣(鐩爣绔�)
-            BasDevp basDevp = basDevpService.selectById(wrkMast.getStaNo());
-            if (basDevp == null) {
-                News.info("{}浠诲姟锛屽嚭搴撶珯鐐逛笉瀛樺湪锛岀姝㈡淳鍙�", wrkMast.getWrkNo());
-                return false;//鍑哄簱绔欑偣涓嶅瓨鍦�
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if(shuttleProtocol == null) {
+                return false;
             }
 
-            //鑾峰彇婧愮珯瀵瑰簲鐨勭墰鐪兼彁鍗囨満绔欑偣缂栧彿(璧风偣缂栧彿)
-            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(basDevp.getLiftNo(), Utils.getLev(wrkMast.getSourceLocNo()));
-            if (liftStaProtocol == null) {
-                News.info("{}浠诲姟锛屾壘涓嶅埌绔欑偣锛岀姝㈡淳鍙�", wrkMast.getWrkNo());
+            //鑾峰彇婧愮珯
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
+            if (liftSta == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾壘涓嶅埌绔欑偣锛岀姝㈡淳鍙�", wrkMast.getWrkNo());
                 return false;//鎵句笉鍒扮珯鐐�
             }
-            Integer startSta = liftStaProtocol.getStaNo();
 
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-            if (shuttleProtocol.getCurrentLocNo().equals(liftStaProtocol.getLocNo())) {
+            if (shuttleProtocol.getCurrentLocNo().equals(liftSta.getLocNo())) {
                 //灏忚溅杩樺湪杈撻�佺珯鐐�
-                //璋冨害灏忚溅閬胯
-                boolean result = Utils.searchEmptyGroupToMoveShuttle(Utils.getLev(wrkMast.getSourceLocNo()), wrkMast.getShuttleNo(), shuttleThread);
-                if (!result) {
-                    News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀湪杈撻�佺珯鐐硅皟搴﹀皬杞﹂伩璁╁け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                //鑾峰彇灏忚溅寰呮満浣�
+                String standbyLocNo = Utils.getShuttleStandbyLocNo(liftSta.getLocNo());
+                if(standbyLocNo == null) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃幏鍙栧皬杞﹀緟鏈轰綅澶辫触", wrkMast.getWrkNo());
+                    return false;
+                }
+                //璋冨害灏忚溅鍘诲緟鏈轰綅
+                boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), standbyLocNo, wrkMast.getShuttleNo());
+                if (!dispatchShuttle) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽皬杞﹀湪杈撻�佺珯鐐硅皟搴﹀皬杞﹂伩璁╁け璐�", wrkMast.getWrkNo());
                     return false;
                 }
             }
 
-            if (!basDevp.getAutoing().equals("Y")) {
-                News.info("{}浠诲姟锛寋}绔欑偣锛屾病鏈夎嚜鍔ㄤ俊鍙凤紝绂佹娲惧彂", wrkMast.getWrkNo(), basDevp.getDevNo());
-                return false;//鍑哄簱绔欑偣涓嶅彲鍑�
-            }
-
-            if (basDevp.getLoading().equals("Y")) {
-                News.info("{}浠诲姟锛寋}绔欑偣锛屽瓨鍦ㄦ湁鐗╀俊鍙凤紝绂佹娲惧彂", wrkMast.getWrkNo(), basDevp.getDevNo());
-                return false;//鍑哄簱绔欑偣涓嶅彲鍑�
-            }
-
-            if (!basDevp.getOutEnable().equals("Y")) {
-                News.info("{}浠诲姟锛寋}绔欑偣锛屾病鏈夊彲鍑轰俊鍙凤紝绂佹娲惧彂", wrkMast.getWrkNo(), basDevp.getDevNo());
-                return false;//鍑哄簱绔欑偣涓嶅彲鍑�
-            }
-
-            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, basDevp.getLiftNo());
-            if (liftThread == null) {
-                return false;
-            }
-            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-            if (liftProtocol == null) {
+            if (liftSta.getHasCar()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣瀛樺湪灏忚溅锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), liftSta.getStaNo());
                 return false;
             }
 
-            if (!liftProtocol.isIdle()) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽繖纰屼腑", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
+            if (!liftSta.getHasTray()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣鏃犳墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getStaNo());
                 return false;
             }
-            //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚︽湭琚崰棰�
-            if (liftProtocol.getToken() != 0) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屼护鐗屽凡琚嫭鍗狅紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//鎻愬崌鏈哄凡琚嫭鍗狅紝绂佹鍐嶆淳鍙戜换鍔�
+
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftSta.getLiftNo());
+            if (forkLiftThread == null) {
+                return false;
             }
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
+                return false;
+            }
+            if (!forkLiftThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽繖纰屼腑", wrkMast.getWrkNo(), liftSta.getLiftNo());
+                return false;
+            }
+
+            //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀浜庡嚭搴撴ā寮�
+            if (!forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.OUT)) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾彁鍗囨満涓嶅浜庡嚭搴撴ā寮忥紝绂佹鍑哄簱", wrkMast.getWrkNo());
+                return false;
+            }
+
             //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
-            WrkMast liftWrkMast = wrkMastMapper.selectLiftWrkMast(liftThread.getSlave().getId());
+            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo());
             if (liftWrkMast != null) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽綋鍓嶆彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
+                if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚�
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo());
+                    return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
+                }
             }
 
-            //鑾风洰鏍囩珯婧愮珯瀵瑰簲鐨勮緭閫佺珯鐐�
-            BasDevp targetBasDevp = basDevpService.selectById(wrkMast.getStaNo());
-            if (targetBasDevp == null) {
-                News.info("{}浠诲姟锛寋}绔欑偣锛岀珯鐐逛笉瀛樺湪锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), wrkMast.getStaNo());
-                return false;//绔欑偣涓嶅瓨鍦�
+            //璇锋眰涓婄骇绯荤粺锛屾槸鍚﹀厑璁稿嚭搴�
+            boolean outMission = ForkLiftUtils.queryOutMission(wrkMast.getStaNo());
+            if (!outMission) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屼笂绾х郴缁熶笉鍏佽鍑哄簱", wrkMast.getWrkNo());
+                return false;
             }
-            //鑾峰彇鐗涚溂鎻愬崌鏈虹珯鐐圭紪鍙�(鐩爣缂栧彿)
-            Integer targetSta = Integer.parseInt(targetBasDevp.getQrCodeValue());
 
             //鑾峰彇鎻愬崌鏈哄懡浠�
-            NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftThread.getSlave().getId(), NyLiftTaskModelType.MOVE_TRAY.id, startSta, targetSta, wrkMast.getWrkNo());
-
-            ArrayList<NyLiftCommand> commands = new ArrayList<>();
-            commands.add(liftCommand);
+            List<ForkLiftCommand> liftCommands = forkLiftThread.getPickAndPutCommand(wrkMast.getWrkNo(), liftSta.getLev(), wrkMast.getStaNo());
+            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
+            commands.addAll(liftCommands);
 
             //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
             LiftAssignCommand assignCommand = new LiftAssignCommand();
             assignCommand.setCommands(commands);
-            assignCommand.setLiftNo(liftProtocol.getLiftNo());
+            assignCommand.setLiftNo(wrkMast.getLiftNo().shortValue());
             assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
-            assignCommand.setTaskMode(NyLiftTaskModelType.MOVE_TRAY.id.shortValue());
+            assignCommand.setTaskMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue());
 
-            wrkMast.setWrkSts(24L);//23.灏忚溅鎼繍瀹屾垚 ==> 24.鎻愬崌鏈烘惉杩愪腑
-            wrkMast.setLiftNo(liftThread.getSlave().getId());//浠诲姟妗g粦瀹氭彁鍗囨満鍙�
-            wrkMast.setModiTime(now);
-            liftProtocol.setToken(wrkMast.getWrkNo());//鐙崰鎻愬崌鏈轰护鐗�
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
+            wrkMast.setWrkSts(WrkStsType.OUTBOUND_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑  103.鐢熸垚鍏ュ簱浠诲姟 ==> 104.鎻愬崌鏈烘惉杩愪腑
+            wrkMast.setShuttleNo(null);//閲婃斁灏忚溅
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
+            wrkMast.setModiTime(new Date());
+            if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand));
+                forkLiftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
             }
-
             return false;
         }
         return true;
     }
 
     /**
-     * 鎻愬崌鏈轰换鍔″畬鎴�
+     * 璐у弶鎻愬崌鏈轰换鍔″畬鎴�
      */
-    public synchronized void liftFinished() {
+    public synchronized void forkLiftFinished() {
         try {
-            for (LiftSlave liftSlave : slaveProperties.getLift()) {
+            for (ForkLiftSlave forkLiftSlave : slaveProperties.getForkLift()) {
                 //鑾峰彇鎻愬崌鏈轰俊鎭�
-                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
-                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-                if (liftProtocol == null) {
+                ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, forkLiftSlave.getId());
+                ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+                if (forkLiftProtocol == null) {
                     continue;
                 }
 
                 //鎻愬崌鏈轰负绛夊緟纭涓旂┖闂�
-                if (liftProtocol.getProtocolStatus() == LiftProtocolStatusType.WAITING.id
-                        && liftProtocol.getTaskNo() != 0
-                        && !liftProtocol.getBusy()
+                if (forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.WAITING.id
+                        && forkLiftProtocol.getWrkNo() != 0
                 ) {
-                    int taskNo = liftProtocol.getTaskNo().intValue();
-                    if (taskNo >= 20000 && taskNo <= 30000) {
-                        //鎻愬崌鏈鸿澶囧伐浣滃彿锛岄渶瑕佹煡璇㈠搴斾换鍔″彿
-                        BasLiftOpt basLiftOpt = basLiftOptService.selectByDeviceWrk(liftProtocol.getTaskNo().toString(), liftSlave.getId());
-                        if (basLiftOpt != null) {
-                            taskNo = basLiftOpt.getWrkNo();
-                        }
-                    }
-
                     //灏嗕换鍔℃。鏍囪涓哄畬鎴�
-                    WrkMast wrkMast = wrkMastMapper.selectByWorkNo324104(taskNo);
+                    WrkMast wrkMast = wrkMastService.selectByWorkNo(forkLiftProtocol.getWrkNo());
                     if (wrkMast != null) {
-                        switch (wrkMast.getWrkSts().intValue()) {
-                            case 3://3.鎻愬崌鏈烘惉杩愪腑 ==> 4.鎻愬崌鏈烘惉杩愬畬鎴�
-                                wrkMast.setWrkSts(4L);
-                                wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈�
-                                if (liftProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                                    //閲婃斁鎻愬崌鏈轰护鐗�
-                                    liftProtocol.setToken(0);
-                                }
-                                break;
-                            case 24://24.鎻愬崌鏈烘惉杩愪腑 ==> 25.鎻愬崌鏈烘惉杩愬畬鎴�
-                                wrkMast.setWrkSts(25L);
-                                if (wrkMast.getIoType() == 11) {//搴撲綅绉昏浆
-                                    wrkMast.setWrkSts(4L);//4.鎻愬崌鏈烘惉杩愬畬鎴�
-                                } else {
-                                    if (wrkMast.getMk() == null || !wrkMast.getMk().equals("Y")) {
-                                        //涓嶉渶瑕佺敤鍒版満姊拌噦锛岀洿鎺ヨ浆29.鍑哄簱瀹屾垚
-                                        wrkMast.setWrkSts(29L);
-                                        wrkMast.setShuttleNo(null);//閲婃斁灏忚溅
-                                        wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈�
-                                        wrkMast.setModiTime(new Date());
-                                    }
-                                }
-
-                                if (liftProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                                    //閲婃斁鎻愬崌鏈轰护鐗�
-                                    liftProtocol.setToken(0);
-                                }
-
-                                break;
-                            case 106://106.鎻愬崌鏈烘惉杩愪腑 ==> 107.鎻愬崌鏈烘惉杩愬畬鎴�
-                                wrkMast.setWrkSts(107L);
-                                break;
-                            default:
+                        if (wrkMast.getWrkSts() == WrkStsType.INBOUND_LIFT_RUN.sts) {
+                            //3.鎻愬崌鏈烘惉杩愪腑 ==> 4.鎻愬崌鏈烘惉杩愬畬鎴�
+                            wrkMast.setWrkSts(WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts);
+                            wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈�
+                            forkLiftThread.setSyncTaskNo(0);
+                        } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_LIFT_RUN.sts) {
+                            //104.鎻愬崌鏈烘惉杩愪腑 ==> 109.鍑哄簱瀹屾垚
+                            wrkMast.setWrkSts(WrkStsType.COMPLETE_OUTBOUND.sts);
+                            wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈�
+                            forkLiftThread.setSyncTaskNo(0);
+                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_LIFT_RUN.sts) {
+                            //306.鎻愬崌鏈烘惉杩愪腑 ==> 307.鎻愬崌鏈烘惉杩愬畬鎴�
+                            wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts);
+                            forkLiftThread.setSyncTaskNo(0);
                         }
 
-                        if (wrkMastMapper.updateById(wrkMast) > 0) {
-                            //璁剧疆鎻愬崌鏈轰负绌洪棽鐘舵��
-                            liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
-                            //浠诲姟鎸囦护娓呴浂
-                            liftProtocol.setAssignCommand(null);
-                            News.info("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬併�傛彁鍗囨満鍙�={}", liftProtocol.getLiftNo());
+                        wrkMast.setModiTime(new Date());
+                        if (wrkMastService.updateById(wrkMast)) {
+                            forkLiftThread.reset();
+                            News.info("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬併�傛彁鍗囨満鍙�={}", forkLiftProtocol.getLiftNo());
                         } else {
-                            News.error("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傛彁鍗囨満鍙�={}锛屽伐浣滃彿={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo());
-                        }
-                    } else {
-                        LiftAssignCommand assignCommand = liftProtocol.getAssignCommand();
-                        if (assignCommand != null) {
-                            if (!assignCommand.getAuto()) {
-                                //鎵嬪姩鎿嶄綔
-                                //璁剧疆鎻愬崌鏈轰负绌洪棽鐘舵��
-                                liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
-                                //浠诲姟鎸囦护娓呴浂
-                                liftProtocol.setAssignCommand(null);
-                                News.info("鎻愬崌鏈哄凡纭鎵嬪姩鎿嶄綔銆傛彁鍗囨満鍙�={}", liftProtocol.getLiftNo());
-                            }
+                            News.error("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傛彁鍗囨満鍙�={}锛屽伐浣滃彿={}", forkLiftProtocol.getLiftNo(), forkLiftProtocol.getWrkNo());
                         }
                     }
                 }
@@ -1680,338 +923,6 @@
         } catch (Exception e) {
             e.printStackTrace();
         }
-    }
-
-    /**
-     * 搴撲綅绉昏浆
-     */
-    public synchronized void locToLocExecute() {
-        try {
-            //鑾峰彇鍑哄叆搴撳伐浣滄。
-//        List<WrkMast> wrkMasts = wrkMastMapper.selectInOutWrkMast();
-//        if (wrkMasts.size() > 0) {
-//            //鏈夊嚭鍏ュ簱浠诲姟锛屽繀椤荤瓑寰呬换鍔℃墽琛屽畬姣曞啀鎵ц搴撲綅绉昏浆
-//            return;
-//        }
-
-            //鏌ヨ搴撲綅绉昏浆宸ヤ綔妗�
-            List<WrkMast> wrkMasts1 = wrkMastMapper.selectLocToLocWrkMast();
-            for (WrkMast wrkMast : wrkMasts1) {
-                if (Utils.getLev(wrkMast.getSourceLocNo()) == Utils.getLev(wrkMast.getLocNo())) {
-                    boolean step1 = this.locToLocExecuteStep1(wrkMast);//鍚屾ゼ灞傚簱浣嶇Щ杞�
-                    if (!step1) {
-                        continue;
-                    }
-                } else {
-                    //璺ㄦゼ灞傚簱浣嶇Щ杞�
-                    boolean step2 = this.locToLocExecuteStep2(wrkMast);//璋冨害杞﹁締鍙栬揣骞惰繍閫佸埌鍑哄簱鍙�
-                    if (!step2) {
-                        continue;
-                    }
-
-                    boolean step3 = this.locToLocExecuteStep3(wrkMast);//鎻愬崌鏈烘惉杩愯揣鐗�
-                    if (!step3) {
-                        continue;
-                    }
-
-                    boolean step4 = this.locToLocExecuteStep4(wrkMast);//璋冨害杞﹁締鍙栬揣骞惰繍閫佸埌鐩爣搴撲綅
-                    if (!step4) {
-                        continue;
-                    }
-
-                }
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 鍚屾ゼ灞傚簱浣嶇Щ杞�
-     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
-     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
-     */
-    private boolean locToLocExecuteStep1(WrkMast wrkMast) {
-        if (wrkMast.getWrkSts() == 21) {//21.鐢熸垚鍑哄簱浠诲姟
-            if (wrkMast.getShuttleNo() == null) {
-                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
-                return false;
-            }
-
-            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
-            if (shuttleThread == null) {
-                return false;
-            }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-            if (shuttleProtocol == null) {
-                return false;
-            }
-            if (!shuttleProtocol.isIdle()) {
-                return false;
-            }
-
-            //鍒ゆ柇灏忚溅鏄惁鍒拌揪婧愬簱浣�
-            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
-                //灏忚溅涓嶅湪婧愬簱浣嶄綅缃�
-                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
-                return false;
-            }
-
-            //灏忚溅宸叉姷杈炬簮搴撲綅锛岃繘琛屾惉杩愯揣鐗�
-            NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getLocNo());
-            if (result == null) {//璺緞璁$畻澶辫触
-                return false;
-            }
-
-            //鍒涘缓鍒嗛厤鍛戒护
-            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.PAK_IN.id.shortValue());//鍏ュ簱妯″紡
-            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-            assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
-            assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
-
-            wrkMast.setWrkSts(5L);//21.鐢熸垚鍑哄簱浠诲姟 => 5.灏忚溅鎼繍涓�
-            wrkMast.setModiTime(new Date());
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
-                //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-            }
-
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * 璺ㄦゼ灞傚簱浣嶇Щ杞�-璋冨害杞﹁締鍙栬揣骞惰繍閫佸埌鍑哄簱鍙�
-     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
-     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
-     */
-    private boolean locToLocExecuteStep2(WrkMast wrkMast) {
-        if (wrkMast.getWrkSts() == 21) {//21.鐢熸垚鍑哄簱浠诲姟
-            if (wrkMast.getShuttleNo() == null) {
-                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
-                return false;
-            }
-
-            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
-            if (shuttleThread == null) {
-                return false;
-            }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-            if (shuttleProtocol == null) {
-                return false;
-            }
-            if (!shuttleProtocol.isIdle()) {
-                return false;
-            }
-
-            //鍒ゆ柇灏忚溅鏄惁鍒拌揪婧愬簱浣�
-            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
-                //灏忚溅涓嶅湪婧愬簱浣嶄綅缃�
-                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒版簮搴撲綅杩涜鍙栬揣
-                return false;
-            }
-
-            //鑾峰彇绌挎杞︽渶杩戜笖绌洪棽鐨勬彁鍗囨満杈撻�佺珯鐐�
-            LiftStaProtocol liftSta = shuttleDispatchUtils.getRecentLiftSta(shuttleThread.getSlave().getId(), Utils.getLev(wrkMast.getLocNo()));
-            if (liftSta == null) {
-                return false;//娌℃湁鍙敤涓旂┖闂茬殑杈撻�佺珯鐐�
-            }
-            //婧愮珯
-            Integer sourceStaNo = liftSta.getStaNo();
-            //鎻愬崌鏈哄彿*100+鐩爣妤煎眰=鐩爣绔欑偣
-            Integer staNo = liftSta.getLiftNo() * 100 + Utils.getLev(wrkMast.getLocNo());//鐩爣绔�
-
-            //灏忚溅宸叉姷杈炬簮搴撲綅锛屽皢璐х墿鎼繍鍒拌緭閫佺珯鐐�
-            NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), liftSta.getLocNo());
-            if (result == null) {//璺緞璁$畻澶辫触
-                return false;
-            }
-
-            //鍒涘缓鍒嗛厤鍛戒护
-            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.SHUTTLE_LOC_TO_LOC.id.shortValue());//搴撲綅绉昏浆妯″紡
-            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-            assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
-            assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
-
-            wrkMast.setWrkSts(22L);//21.鐢熸垚鍑哄簱浠诲姟 => 22.灏忚溅鎼繍涓�
-            wrkMast.setSourceStaNo(sourceStaNo);//婧愮珯
-            wrkMast.setStaNo(staNo);//鐩爣绔�
-            wrkMast.setModiTime(new Date());
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
-                //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-            }
-
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * 璺ㄦゼ灞傚簱浣嶇Щ杞�-鎻愬崌鏈烘惉杩愯揣鐗�
-     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
-     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
-     */
-    private boolean locToLocExecuteStep3(WrkMast wrkMast) {
-        Date now = new Date();
-        if (wrkMast.getWrkSts() == 23) {//23.灏忚溅鎼繍瀹屾垚
-            //婧愮珯
-            Integer sourceStaNo = wrkMast.getSourceStaNo();
-            //鐩爣绔�
-            Integer staNo = wrkMast.getStaNo();
-            if (sourceStaNo == null || staNo == null) {
-                return false;//婧愮珯鎴栫洰鏍囩珯涓虹┖
-            }
-
-            int liftNo = staNo / 100;//鑾峰彇鎻愬崌鏈哄彿
-
-            //鑾峰彇鎻愬崌鏈虹嚎绋�
-            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftNo);
-            if (liftThread == null) {
-                return false;
-            }
-            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-            if (liftProtocol == null) {
-                return false;
-            }
-
-            //鑾峰彇婧愮珯瀵瑰簲鐨勮緭閫佺珯鐐�
-            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(liftNo, Utils.getLev(wrkMast.getSourceLocNo()));
-            if (liftStaProtocol == null) {
-                return false;//鎵句笉鍒扮珯鐐�
-            }
-
-            if (!(liftStaProtocol.getModel() && !liftStaProtocol.getBusy() && liftStaProtocol.getHasTray())) {
-                return false;//绔欑偣蹇呴』鑷姩銆佺┖闂层�佹湁鎵樼洏
-            }
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
-            if (shuttleThread == null) {
-                return false;
-            }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-            if (shuttleProtocol.getCurrentLocNo().equals(liftStaProtocol.getLocNo())) {
-                //灏忚溅杩樺湪杈撻�佺珯鐐�
-                //璋冨害灏忚溅閬胯
-                boolean result = Utils.searchEmptyGroupToMoveShuttle(Utils.getLev(wrkMast.getSourceLocNo()), wrkMast.getShuttleNo(), shuttleThread);
-                if (!result) {
-                    return false;
-                }
-            }
-
-            if (!liftProtocol.isIdle()) {
-                return false;
-            }
-
-            //鎼滅储鏄惁鏈夊叾浠栦换鍔″崰鐢ㄤ簡鎻愬崌鏈猴紝濡傛灉鍗犵敤鎻愬崌鏈虹殑浠诲姟鍜屽綋鍓嶄换鍔$浉鍚岋紝鍒欒繍琛屾墽琛�
-            WrkMast wrkMast1 = wrkMastMapper.selectLiftWrkMast(liftProtocol.getLiftNo().intValue());
-            if (wrkMast1 != null && wrkMast1.getWrkNo().intValue() != wrkMast.getWrkNo().intValue()) {
-                return false;
-            }
-
-            //鑾峰彇鎻愬崌鏈哄懡浠�
-            NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftProtocol.getLiftNo().intValue(), NyLiftTaskModelType.MOVE_TRAY.id, sourceStaNo, staNo, wrkMast.getWrkNo());
-
-            ArrayList<NyLiftCommand> commands = new ArrayList<>();
-            commands.add(liftCommand);
-
-            //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
-            LiftAssignCommand assignCommand = new LiftAssignCommand();
-            assignCommand.setCommands(commands);
-            assignCommand.setLiftNo(liftProtocol.getLiftNo());
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
-            assignCommand.setTaskMode(NyLiftTaskModelType.MOVE_TRAY.id.shortValue());
-
-            wrkMast.setWrkSts(24L);//23.灏忚溅鎼繍瀹屾垚 ==> 24.鎻愬崌鏈烘惉杩愪腑
-            wrkMast.setLiftNo(liftThread.getSlave().getId());//浠诲姟妗g粦瀹氭彁鍗囨満鍙�
-            wrkMast.setShuttleNo(null);//娓呯┖灏忚溅鍙凤紝绛夎揣鐗╂惉杩愬畬鎴愬悗锛屽埌鐩爣妤煎眰閲嶆柊鎼滅储灏忚溅
-            wrkMast.setModiTime(now);
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
-                //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand));
-            }
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * 璺ㄦゼ灞傚簱浣嶇Щ杞�-璋冨害杞﹁締鍙栬揣骞惰繍閫佸埌鐩爣搴撲綅
-     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
-     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
-     */
-    private boolean locToLocExecuteStep4(WrkMast wrkMast) {
-        if (wrkMast.getWrkSts() == 4) {//4.鎻愬崌鏈烘惉杩愬畬鎴�
-            //鑾峰彇鐩爣绔欏搴旂殑杈撻�佺珯鐐�
-            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(wrkMast.getLiftNo(), Utils.getLev(wrkMast.getLocNo()));
-            if (liftStaProtocol == null) {
-                return false;//鎵句笉鍒扮珯鐐�
-            }
-
-            if (!(liftStaProtocol.getModel() && !liftStaProtocol.getBusy() && liftStaProtocol.getHasTray())) {
-                return false;//绔欑偣蹇呴』鑷姩銆佺┖闂层�佹湁鎵樼洏
-            }
-
-            if (wrkMast.getShuttleNo() == null) {
-                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftStaProtocol.getLocNo());//璋冨害灏忚溅鍒扮洰鏍囪緭閫佺珯鐐硅繘琛屽彇璐�
-                return false;
-            }
-
-            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
-            if (shuttleThread == null) {
-                return false;
-            }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-            if (shuttleProtocol == null) {
-                return false;
-            }
-            if (!shuttleProtocol.isIdle()) {
-                return false;
-            }
-
-            //鍒ゆ柇灏忚溅鏄惁鍒拌揪鐩爣杈撻�佺珯鐐�
-            if (!shuttleProtocol.getCurrentLocNo().equals(liftStaProtocol.getLocNo())) {
-                //灏忚溅涓嶅湪鐩爣杈撻�佺珯鐐�
-                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftStaProtocol.getLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒扮洰鏍囪緭閫佺珯鐐硅繘琛屽彇璐�
-                return false;
-            }
-
-            //灏忚溅宸叉姷杈剧洰鏍囪緭閫佺珯鐐癸紝灏嗚揣鐗╂惉杩愬埌鐩爣搴撲綅
-            NyShuttleOperaResult result = NyShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), liftStaProtocol.getLocNo(), wrkMast.getLocNo());
-            if (result == null) {//璺緞璁$畻澶辫触
-                return false;
-            }
-
-            //鍒涘缓鍒嗛厤鍛戒护
-            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.SHUTTLE_LOC_TO_LOC.id.shortValue());//搴撲綅绉昏浆妯″紡
-            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-            assignCommand.setCommands(result.getCommands());//杩愯鍛戒护
-            assignCommand.setNodes(result.getNodes());//璺緞鑺傜偣
-
-            wrkMast.setWrkSts(5L);//4.鎻愬崌鏈烘惉杩愬畬鎴� => 5.灏忚溅鎼繍涓�
-            wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈�
-            wrkMast.setModiTime(new Date());
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
-                //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-            }
-
-            return false;
-        }
-        return true;
     }
 
     /**
@@ -2033,11 +944,11 @@
         Date now = new Date();
         for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
             // 鑾峰彇鍥涘悜绌挎杞︿俊鎭�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId());
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId());
             if (shuttleThread == null) {
                 continue;
             }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
             if (shuttleProtocol == null) {
                 continue;
             }
@@ -2047,12 +958,13 @@
                 BasShuttleErrLog latest = basShuttleErrLogService.findLatestByTaskNo(shuttleSlave.getId(), shuttleProtocol.getTaskNo());
                 // 鏈夊紓甯�
                 if (latest == null) {
-                    if (shuttleProtocol.getErrState() != null && shuttleProtocol.getErrState() == 1) {
-                        WrkMast wrkMast = wrkMastMapper.selectById(shuttleProtocol.getTaskNo());
+                    if (shuttleProtocol.getErrorCode() != null && Integer.parseInt(shuttleProtocol.getErrorCode()) != 0) {
+                        WrkMast wrkMast = wrkMastService.selectByWorkNo(shuttleProtocol.getTaskNo());
                         if (wrkMast == null) {
                             continue;
                         }
-                        BasShuttleErr basShuttleErr = basShuttleErrService.queryByCode(shuttleProtocol.getErrCode());
+                        int errorCode = Integer.parseInt(shuttleProtocol.getErrorCode());
+                        BasShuttleErr basShuttleErr = basShuttleErrService.queryByCode(errorCode);
                         String errName = basShuttleErr==null? "鏈煡寮傚父":basShuttleErr.getErrName();
                         BasShuttleErrLog basShuttleErrLog = new BasShuttleErrLog(
                                 null,    // 缂栧彿
@@ -2068,7 +980,7 @@
                                 wrkMast.getSourceStaNo(),    // 婧愮珯
                                 wrkMast.getSourceLocNo(),    // 婧愬簱浣�
                                 wrkMast.getBarcode(),    // 鏉$爜
-                                shuttleProtocol.getErrCode(),    // 寮傚父鐮�
+                                errorCode,    // 寮傚父鐮�
                                 errName,    // 寮傚父
                                 1,    // 寮傚父鎯呭喌
                                 now,    // 娣诲姞鏃堕棿
@@ -2084,7 +996,7 @@
                     }
                 } else {
                     // 寮傚父淇
-                    if (shuttleProtocol.getErrState() == null || shuttleProtocol.getErrState() == 0) {
+                    if (shuttleProtocol.getErrorCode() == null || Integer.parseInt(shuttleProtocol.getErrorCode()) == 0) {
                         latest.setEndTime(now);
                         latest.setUpdateTime(now);
                         latest.setStatus(2);
@@ -2093,54 +1005,6 @@
                         }
                     }
                 }
-            }else {
-//                //鏃犱换鍔�
-//                BasShuttleErrLog latest = basShuttleErrLogService.findLatest(shuttleSlave.getId());
-//                // 鏈夊紓甯�
-//                if (shuttleProtocol.getStatusErrorCode() != null && shuttleProtocol.getStatusErrorCode() > 0) {
-//                    // 璁板綍鏂板紓甯�
-//                    if (latest == null || (latest.getErrCode() != shuttleProtocol.getStatusErrorCode().intValue())) {
-//                        BasShuttleErr basShuttleErr = basShuttleErrService.queryByCode(shuttleProtocol.getStatusErrorCode().intValue());
-//                        String errName = basShuttleErr==null? "鏈煡寮傚父":basShuttleErr.getErrName();
-//                        BasShuttleErrLog basShuttleErrLog = new BasShuttleErrLog(
-//                                null,    // 缂栧彿
-//                                null,    // 宸ヤ綔鍙�
-//                                now,    // 鍙戠敓鏃堕棿
-//                                null,    // 缁撴潫鏃堕棿
-//                                null,    // 宸ヤ綔鐘舵��
-//                                null,    // 鍏ュ嚭搴撶被鍨�
-//                                shuttleSlave.getId(),    // 鍥涘悜绌挎杞�
-//                                null,    // plc
-//                                null,    // 鐩爣搴撲綅
-//                                null,    // 鐩爣绔�
-//                                null,    // 婧愮珯
-//                                null,    // 婧愬簱浣�
-//                                null,    // 鏉$爜
-//                                (int)shuttleProtocol.getStatusErrorCode(),    // 寮傚父鐮�
-//                                errName,    // 寮傚父
-//                                1,    // 寮傚父鎯呭喌
-//                                now,    // 娣诲姞鏃堕棿
-//                                null,    // 娣诲姞浜哄憳
-//                                now,    // 淇敼鏃堕棿
-//                                null,    // 淇敼浜哄憳
-//                                "鏃犱换鍔″紓甯�"    // 澶囨敞
-//                        );
-//                        if (!basShuttleErrLogService.insert(basShuttleErrLog)) {
-//                            News.error("鍥涘悜绌挎杞lc寮傚父璁板綍澶辫触 ===>> [id:{}] [error:{}]", shuttleSlave.getId(), errName);
-//                        }
-//                    }
-//                    // 鏃犲紓甯�
-//                } else {
-//                    // 寮傚父淇
-//                    if (latest != null && latest.getStatus() == 1) {
-//                        latest.setEndTime(now);
-//                        latest.setUpdateTime(now);
-//                        latest.setStatus(2);
-//                        if (!basShuttleErrLogService.updateById(latest)) {
-//                            News.error("鍥涘悜绌挎杞lc寮傚父璁板綍淇澶辫触 ===>> [id:{}] [errLogId:{}]", shuttleSlave.getId(), latest.getId());
-//                        }
-//                    }
-//                }
             }
         }
     }
@@ -2150,42 +1014,30 @@
      */
     private void recLiftErr() {
         Date now = new Date();
-        for (LiftSlave liftSlave : slaveProperties.getLift()) {
+        for (ForkLiftSlave forkLiftSlave : slaveProperties.getForkLift()) {
             // 鑾峰彇鎻愬崌鏈轰俊鎭�
-            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
-            if (liftThread == null) {
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, forkLiftSlave.getId());
+            if (forkLiftThread == null) {
                 continue;
             }
-            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-            if (liftProtocol == null) {
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
                 continue;
             }
 
-            if (liftProtocol.getTaskNo() != 0) {
+            if (forkLiftProtocol.getTaskNo() != 0) {
                 //鏈変换鍔�
-                BasLiftErrLog latest = basLiftErrLogService.findLatestByTaskNo(liftSlave.getId(), liftProtocol.getTaskNo().intValue());
+                BasLiftErrLog latest = basLiftErrLogService.findLatestByTaskNo(forkLiftSlave.getId(), forkLiftProtocol.getTaskNo());
                 // 鏈夊紓甯�
                 if (latest == null) {
-                    if (liftProtocol.getDeviceError() != null && liftProtocol.getDeviceError()) {
-                        WrkMast wrkMast = wrkMastMapper.selectById(liftProtocol.getTaskNo());
+                    if (forkLiftProtocol.getErrorCode() != null && forkLiftProtocol.getErrorCode() != 0) {
+                        WrkMast wrkMast = wrkMastService.selectByWorkNo(forkLiftProtocol.getWrkNo());
                         if (wrkMast == null) {
                             continue;
                         }
 
-                        String errName = "";
-                        if (liftProtocol.getFrontOverrun()) {
-                            errName = "鍓嶈秴闄�";
-                        } else if (liftProtocol.getBackOverrun()) {
-                            errName = "鍚庤秴闄�";
-                        } else if (liftProtocol.getLeftOverrun()) {
-                            errName = "宸﹁秴闄�";
-                        } else if (liftProtocol.getRightOverrun()) {
-                            errName = "鍙宠秴闄�";
-                        } else if (liftProtocol.getOverHeight()) {
-                            errName = "瓒呴珮";
-                        } else if (liftProtocol.getOverWeight()) {
-                            errName = "瓒呴噸";
-                        }
+                        BasLiftErr basLiftErr = basLiftErrService.queryByCode(forkLiftProtocol.getErrorCode());
+                        String errName = basLiftErr==null? "鏈煡寮傚父":basLiftErr.getErrName();
 
                         BasLiftErrLog basLiftErrLog = new BasLiftErrLog(
                                 null,    // 缂栧彿
@@ -2194,7 +1046,7 @@
                                 null,    // 缁撴潫鏃堕棿
                                 wrkMast.getWrkSts(),    // 宸ヤ綔鐘舵��
                                 wrkMast.getIoType(),    // 鍏ュ嚭搴撶被鍨�
-                                liftSlave.getId(),    // 鎻愬崌鏈�
+                                forkLiftSlave.getId(),    // 鎻愬崌鏈�
                                 null,    // plc
                                 wrkMast.getLocNo(),    // 鐩爣搴撲綅
                                 wrkMast.getStaNo(),    // 鐩爣绔�
@@ -2209,326 +1061,25 @@
                                 now,    // 淇敼鏃堕棿
                                 null,    // 淇敼浜哄憳
                                 "浠诲姟涓紓甯�",    // 澶囨敞
-                                JSON.toJSONString(liftProtocol)    // 绯荤粺鐘舵�佹暟鎹�
+                                JSON.toJSONString(forkLiftProtocol)    // 绯荤粺鐘舵�佹暟鎹�
                         );
                         if (!basLiftErrLogService.insert(basLiftErrLog)) {
-                            News.error("鎻愬崌鏈簆lc寮傚父璁板綍澶辫触 ===>> [id:{}] [error:{}]", liftSlave.getId(), errName);
+                            News.error("鎻愬崌鏈簆lc寮傚父璁板綍澶辫触 ===>> [id:{}] [error:{}]", forkLiftSlave.getId(), errName);
                         }
                     }
                 } else {
                     // 寮傚父淇
-                    if (liftProtocol.getDeviceError() == null || !liftProtocol.getDeviceError()) {
+                    if (forkLiftProtocol.getErrorCode() == null || forkLiftProtocol.getErrorCode() == 0) {
                         latest.setEndTime(now);
                         latest.setUpdateTime(now);
                         latest.setStatus(2);
                         if (!basLiftErrLogService.updateById(latest)) {
-                            News.error("鎻愬崌鏈簆lc寮傚父璁板綍淇澶辫触 ===>> [id:{}] [errLogId:{}]", liftSlave.getId(), latest.getId());
+                            News.error("鎻愬崌鏈簆lc寮傚父璁板綍淇澶辫触 ===>> [id:{}] [errLogId:{}]", forkLiftSlave.getId(), latest.getId());
                         }
                     }
                 }
             }
         }
-    }
-
-    // -------------------------------------------------------------------------------
-
-    /**
-     * 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
-     */
-    public void storeEmptyPlt(){
-        try {
-            for (DevpSlave devp : slaveProperties.getDevp()) {
-                // 閬嶅巻绌烘澘鍏ュ簱鍙�
-                for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) {
-                    // 鑾峰彇绌烘澘鍏ュ簱绔欎俊鎭�
-                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                    StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo());
-                    if (staProtocol == null) {
-                        continue;
-                    } else {
-                        staProtocol = staProtocol.clone();
-                    }
-                    // 绔欑偣鏉′欢鍒ゆ柇
-                    if (staProtocol.isAutoing()
-                            && staProtocol.isLoading()
-                            && staProtocol.isInEnable()
-                            && staProtocol.isEmptyMk()
-                            && (staProtocol.getWorkNo() == 0 || (staProtocol.getWorkNo() >= 9990 || staProtocol.getWorkNo() <= 9999))
-                            && staProtocol.isPakMk()) {
-
-                        // 鑾峰彇鏉$爜鎵弿浠俊鎭�
-                        String barcode = null;
-                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, emptyInSta.getBarcode());
-                        if (barcodeThread != null) {
-                            String barcode0 = barcodeThread.getBarcode();
-                            if (!Cools.isEmpty(barcode0)) {
-//                            News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", emptyInSta.getBarcode(), barcode0);
-                                if (!"NG".endsWith(barcode0) && !"NoRead".equals(barcode0) && !"empty".equals(barcode0)) {
-                                    barcode = barcode0;
-                                }
-                            }
-                        }
-
-                        if (!Cools.isEmpty(barcode)) {
-                            WrkMast wrkMast = wrkMastMapper.selectByBarcode(barcode);//鏉$爜瀛樺湪宸ヤ綔妗�
-                            if (wrkMast != null) {
-                                continue;
-                            }
-                        }
-
-                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, emptyInSta.getLed());
-
-                        try {
-                            LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
-
-                            SearchLocParam param = new SearchLocParam();
-                            param.setIoType(10);
-                            if (!Cools.isEmpty(barcode)) {
-                                param.setBarcode(barcode);
-                            }
-                            param.setSourceStaNo(emptyInSta.getStaNo());
-//                        param.setLocType1(locTypeDto.getLocType1());
-                            String response = new HttpHandler.Builder()
-                                    .setUri(wmsUrl)
-                                    .setPath("/rpc/pakin/loc/v2")
-                                    .setJson(JSON.toJSONString(param))
-                                    .build()
-                                    .doPost();
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            Integer code = jsonObject.getInteger("code");
-                            if (code.equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-                                barcodeThread.setBarcode("");
-//                            // 鏇存柊绔欑偣淇℃伅 涓� 涓嬪彂plc鍛戒护
-//                            staProtocol.setWorkNo(dto.getWorkNo().shortValue());
-//                            staProtocol.setStaNo(dto.getStaNo().shortValue());
-//                            devpThread.setPakMk(staProtocol.getSiteId(), false);
-//                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
-//                            if (!result) {
-//                                throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触");
-//                            }
-                            } else {
-                                if (ledThread != null) {
-                                    String errorMsg = jsonObject.getString("msg");
-                                    if (!Cools.isEmpty(errorMsg)) {
-                                        MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg));
-                                    }
-                                }
-                                News.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v2", JSON.toJSONString(param), response);
-                            }
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-                        }
-
-                    }
-
-
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
-     */
-    public void ledExecute() {
-//        try {
-//            for (LedSlave led : slaveProperties.getLed()) {
-//                // 鑾峰彇杈撻�佺嚎plc绾跨▼
-//                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
-//                // 鍛戒护闆嗗悎
-//                List<LedCommand> commands = new ArrayList<>();
-//                // 宸ヤ綔妗i泦鍚�
-//                List<WrkMast> wrkMasts = new ArrayList<>();
-//                List<WrkMastLog> wrkMastLogs = new ArrayList<>();
-//                for (Integer staNo : led.getStaArr()) {
-//                    // 鑾峰彇鍙夎溅绔欑偣
-//                    StaProtocol staProtocol = devpThread.getStation().get(staNo);
-//                    if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) {
-//                        continue;
-//                    } else {
-//                        staProtocol = staProtocol.clone();
-//                    }
-//                    // 鑾峰彇宸ヤ綔妗f暟鎹�
-//                    WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
-//                    Integer wrkNo = staProtocol.getWorkNo().intValue();
-//                    Integer ioType = null;
-//                    String sourceLocNo = null;
-//                    String locNo = null;
-//                    Integer wrkStaNo = null;
-//                    String barcode = null;
-//                    if (wrkMast == null) {
-//                        //鏌ヨ鍘嗗彶妗�
-//                        WrkMastLog wrkMastLog = wrkMastLogMapper.selectLatestByWorkNo(staProtocol.getWorkNo().intValue());
-//                        if (wrkMastLog == null) {
-//                            continue;
-//                        }
-//                        ioType = wrkMastLog.getIoType();
-//                        sourceLocNo = wrkMastLog.getSourceLocNo();
-//                        locNo = wrkMastLog.getLocNo();
-//                        wrkStaNo = wrkMastLog.getStaNo();
-//                        barcode = wrkMastLog.getBarcode();
-//                        wrkMastLogs.add(wrkMastLog);
-//                    }else {
-//                        if (wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) {
-//                            continue;
-//                        }
-//                        ioType = wrkMast.getIoType();
-//                        sourceLocNo = wrkMast.getSourceLocNo();
-//                        locNo = wrkMast.getLocNo();
-//                        wrkStaNo = wrkMast.getStaNo();
-//                        barcode = wrkMast.getBarcode();
-//                        wrkMasts.add(wrkMast);
-//                    }
-//                    // 缁勮鍛戒护
-//                    LedCommand ledCommand = new LedCommand();
-//                    ledCommand.setWorkNo(wrkNo);
-//                    ledCommand.setIoType(ioType);
-//                    // 鍑哄簱妯″紡
-//                    switch (ioType) {
-//                        case 101:
-//                            ledCommand.setTitle("鍏ㄦ澘鍑哄簱");
-//                            break;
-//                        case 103:
-//                            ledCommand.setTitle("鎷f枡鍑哄簱");
-//                            break;
-//                        case 104:
-//                            ledCommand.setTitle("骞舵澘鍑哄簱");
-//                            break;
-//                        case 107:
-//                            ledCommand.setTitle("鐩樼偣鍑哄簱");
-//                            break;
-//                        case 110:
-//                            ledCommand.setTitle("绌烘澘鍑哄簱");
-//                            ledCommand.setEmptyMk(true);
-//                            break;
-//                        default:
-//                            News.error("浠诲姟鍏ュ嚭搴撶被鍨嬮敊璇紒锛侊紒[宸ヤ綔鍙凤細{}] [鍏ュ嚭搴撶被鍨嬶細{}]", wrkNo, ioType);
-//                            break;
-//                    }
-//                    ledCommand.setSourceLocNo(sourceLocNo);
-//                    ledCommand.setLocNo(locNo);
-//                    ledCommand.setStaNo(wrkStaNo);
-//                    ledCommand.setBarcode(barcode);
-//                    if (ioType != 110 && ioType != 10) {
-//                        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkNo));
-//                        if (!wrkDetls.isEmpty()) {
-//                            wrkDetls.forEach(wrkDetl -> {
-//                                double remainNum = wrkDetl.getStock() - wrkDetl.getAnfme();//鍓╀綑鏁伴噺
-//                                if (remainNum < 0) {
-//                                    remainNum = 0;
-//                                }
-//                                String matnr = wrkDetl.getMatnr();
-//                                Mat mat = matService.selectByMatnr(wrkDetl.getMatnr());
-//                                if (mat != null) {
-//                                    if (!mat.getMatnr().equals(mat.getMatnr2())) {
-//                                        matnr += " - " + mat.getMatnr2();
-//                                    }
-//                                }
-//                                ledCommand.getMatDtos().add(new MatDto(matnr, wrkDetl.getMaktx(), wrkDetl.getAnfme(), remainNum, wrkDetl.getSpecs(), wrkDetl.getSuppCode(), wrkDetl.getOrderNo()));
-//                            });
-//                        }else {
-//                            List<WrkDetlLog> wrkDetlLogs = wrkDetlLogService.selectLatestByWorkNo(wrkNo, barcode);
-//                            for (WrkDetlLog wrkDetlLog : wrkDetlLogs) {
-//                                double remainNum = wrkDetlLog.getStock() - wrkDetlLog.getAnfme();//鍓╀綑鏁伴噺
-//                                if (remainNum < 0) {
-//                                    remainNum = 0;
-//                                }
-//                                String matnr = wrkDetlLog.getMatnr();
-//                                Mat mat = matService.selectByMatnr(wrkDetlLog.getMatnr());
-//                                if (mat != null) {
-//                                    if (!mat.getMatnr().equals(mat.getMatnr2())) {
-//                                        matnr += " - " + mat.getMatnr2();
-//                                    }
-//                                }
-//                                ledCommand.getMatDtos().add(new MatDto(matnr, wrkDetlLog.getMaktx(), wrkDetlLog.getAnfme(), remainNum, wrkDetlLog.getSpecs(), wrkDetlLog.getSuppCode()));
-//                            }
-//                        }
-//                    commands.add(ledCommand);
-//                }
-//                Set<Integer> workNos = null;
-//                if (!wrkMasts.isEmpty()) {
-//                    workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
-//                }else {
-//                    workNos = wrkMastLogs.stream().map(WrkMastLog::getWrkNo).collect(Collectors.toSet());
-//                }
-//                // 鑾峰彇LED绾跨▼
-//                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
-//                // 鐩稿悓宸ヤ綔鍙烽泦鍚堝垯杩囨护
-//                if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
-//                    continue;
-//                }
-//                // 鍛戒护涓嬪彂 -------------------------------------------------------------------------------
-//                if (!commands.isEmpty()) {
-//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
-//                        log.error("{}鍙稬ED鍛戒护涓嬪彂澶辫触锛侊紒锛乕ip锛歿}] [port锛歿}]", led.getId(), led.getIp(), led.getPort());
-//                        continue;
-//                    } else {
-//                        ledThread.setLedMk(false);
-//                    }
-//                }
-//
-//                try {
-//                    // 淇敼涓绘。led鏍囪
-//                    for (WrkMast wrkMast : wrkMasts) {
-//                        wrkMast.setOveMk("Y");
-//                        wrkMast.setModiTime(new Date());
-//                        if (wrkMastMapper.updateById(wrkMast) == 0) {
-//                            throw new CoolException("鏇存柊宸ヤ綔妗eけ璐�");
-//                        }
-//                    }
-//
-//                    // 鏇存柊绾跨▼褰撳墠宸ヤ綔鍙烽泦鍚�
-//                    ledThread.setWorkNos(workNos);
-//
-//                } catch (Exception e) {
-//                    e.printStackTrace();
-//                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-//                }
-//
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-    }
-
-    /**
-     * 鍏朵粬  ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅
-     */
-    public void ledReset() {
-//        try {
-//            for (LedSlave led : slaveProperties.getLed()) {
-//                // 鑾峰彇杈撻�佺嚎plc绾跨▼
-//                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
-//                // 鍛戒护闆嗗悎
-//                boolean reset = true;
-//                for (Integer staNo : led.getStaArr()) {
-//                    // 鑾峰彇鍙夎溅绔欑偣
-//                    StaProtocol staProtocol = devpThread.getStation().get(staNo);
-//                    if (staProtocol == null) {
-//                        continue;
-//                    }
-//                    if (staProtocol.isLoading()) {
-//                        reset = false;
-//                        break;
-//                    }
-//                }
-//                // 鑾峰彇led绾跨▼
-//                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
-//                // led鏄剧ず榛樿鍐呭
-//                if (reset) {
-//                    ledThread.setLedMk(true);
-//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) {
-//                        log.error("{}鍙稬ED鍛戒护涓嬪彂澶辫触锛侊紒锛乕ip锛歿}] [port锛歿}]", led.getId(), led.getIp(), led.getPort());
-//                    }
-//                }
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
     }
 
     /**
@@ -2536,37 +1087,47 @@
      */
     public synchronized void loopShuttleCharge() {
         try {
+
+            List<BasShuttleCharge> charges = basShuttleChargeService.selectList(new EntityWrapper<BasShuttleCharge>().orderBy("charge_id", true));
+            if (charges.isEmpty()) {
+                return;//鏃犲厖鐢垫々
+            }
+
             for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
                 //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-                NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
-                NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
+                ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
                 if (shuttleProtocol == null) {
                     continue;
                 }
 
                 //鍒ゆ柇褰撳墠灏忚溅鏄惁婊¤冻闇�瑕佸厖鐢佃姹�
-                if (!shuttleProtocol.isRequireCharge()) {
+                if (!shuttleThread.isRequireCharge()) {
                     continue;
                 }
 
-                WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttleProtocol.getShuttleNo().intValue());
-                if (wrkCharge != null) {//宸叉湁鍏呯數浠诲姟
+                WrkMast wrkMast = wrkMastService.selectChargeWorking(shuttleProtocol.getShuttleNo());
+                if (wrkMast != null) {//宸叉湁鍏呯數浠诲姟
                     continue;
                 }
 
                 //灏忚溅鎵�鍦ㄦゼ灞�
                 int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
-                ShuttleChargeType shuttleCharge = null;
+                BasShuttleCharge shuttleCharge = null;
 
                 //鎼滅储灏忚溅鎵�鍦ㄦゼ灞傛湁娌℃湁鍏呯數妗�
-                for (ShuttleChargeType chargeType : ShuttleChargeType.values()) {
-                    if (lev != Utils.getLev(chargeType.locNo)) {
+                for (BasShuttleCharge charge : charges) {
+                    if (lev != Utils.getLev(charge.getLocNo())) {
                         continue;//灏忚溅鍜屽厖鐢垫々涓嶅湪鍚屼竴灞�
                     }
 
+                    if (charge.getStatus() == 0) {
+                        continue;//鍏呯數妗╄绂佺敤
+                    }
+
                     //灏忚溅鍜屽厖鐢垫々鍦ㄥ悓涓�灞�
-                    if (wrkChargeService.selectWorkingOfCharge(chargeType.id) == null) {
-                        shuttleCharge = chargeType;
+                    if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) {
+                        shuttleCharge = charge;
                         break;
                     }
                 }
@@ -2574,17 +1135,22 @@
                 if (shuttleCharge == null) {
                     //鍚屾ゼ灞傛病鏈夋壘鍒板厖鐢垫々锛屾壘鍙敤鍏呯數妗�
                     //灏忚溅鍚屾ゼ灞傛病鏈夊厖鐢垫々锛屽彧瑕佸厖鐢垫々鍙敤灏辩敓鎴愬厖鐢典换鍔�
-                    for (ShuttleChargeType chargeType : ShuttleChargeType.values()) {
-                        if (wrkChargeService.selectWorkingOfCharge(chargeType.id) == null) {
-                            //鍒ゆ柇褰撳墠鍏呯數妗╂ゼ灞傛槸鍚︽湁灏忚溅锛屽鏈夊皬杞︼紝涓嶅垎閰嶈鍏呯數妗�
-                            int chargeLev = Utils.getLev(chargeType.locNo);//鍏呯數妗╂ゼ灞�
-                            boolean checkLevHasShuttle = Utils.checkLevHasShuttle(chargeLev);//妫�娴嬫ゼ灞傛槸鍚︽湁绌挎杞�
-                            if (checkLevHasShuttle) {
-                                //褰撳墠鍏呯數妗╂ゼ灞傛湁绌挎杞︼紝涓嶅垎閰嶈鍏呯數妗�
+                    for (BasShuttleCharge charge : charges) {
+                        if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) {
+                            //鍒ゆ柇褰撳墠鍏呯數妗╂槸鍚︽湁灏忚溅锛屽鏈夊皬杞︼紝涓嶅垎閰嶈鍏呯數妗�
+                            ArrayList<String> locs = new ArrayList<>();
+                            locs.add(charge.getLocNo());
+                            Integer checkHasShuttle = Utils.checkGroupLocHasShuttle(locs);
+                            if(checkHasShuttle != null) {
+                                //褰撳墠鍏呯數妗╂湁绌挎杞︼紝涓嶅垎閰嶈鍏呯數妗�
                                 continue;
                             }
 
-                            shuttleCharge = chargeType;
+                            if (charge.getStatus() == 0) {
+                                continue;//鍏呯數妗╄绂佺敤
+                            }
+
+                            shuttleCharge = charge;
                             break;
                         }
                     }
@@ -2594,17 +1160,18 @@
                     continue;
                 }
 
-                String chargeLocNo = shuttleCharge.locNo;
-                wrkCharge = new WrkCharge();
-                wrkCharge.setShuttleNo(shuttle.getId());
-                wrkCharge.setCharge(shuttleCharge.id);
-                wrkCharge.setWrkNo(commonService.getChargeWorkNo(4));
-                wrkCharge.setWrkSts(51L);   // 51.鍑嗗鍏呯數
-                wrkCharge.setIoPri((double) 10);
-                wrkCharge.setLocNo(chargeLocNo);
-                wrkCharge.setMemo("charge");
-                wrkCharge.setAppeTime(new Date());
-                if (!wrkChargeService.insert(wrkCharge)) {
+                String chargeLocNo = shuttleCharge.getLocNo();
+                wrkMast = new WrkMast();
+                wrkMast.setMk(String.valueOf(shuttleCharge.getChargeId()));
+                wrkMast.setWrkNo(commonService.getWorkNo(WrkIoType.SHUTTLE_CHARGE.id));
+                wrkMast.setWrkSts(WrkStsType.NEW_CHARGE.sts);
+                wrkMast.setIoType(WrkIoType.SHUTTLE_CHARGE.id);//300.鍏呯數
+                wrkMast.setIoPri((double) 999);
+                wrkMast.setLocNo(chargeLocNo);
+                wrkMast.setShuttleNo(shuttle.getId());
+                wrkMast.setMemo("charge");
+                wrkMast.setAppeTime(new Date());
+                if (!wrkMastService.insert(wrkMast)) {
                     News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", shuttle.getId());
                     continue;
                 }
@@ -2621,129 +1188,214 @@
      */
     public synchronized void executeShuttleCharge() {
         try {
+            //鏌ヨ灏忚溅鍏呯數浠诲姟
             for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
-                WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttle.getId());
-                if (wrkCharge == null) {
+                WrkMast wrkMast = wrkMastService.selectChargeWorking(shuttle.getId());
+                if(wrkMast == null) {
                     continue;
                 }
 
-                NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkCharge.getShuttleNo());
-                if (shuttleThread == null) {
-                    continue;
-                }
-                NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-                if (shuttleProtocol == null) {
+                boolean result1 = this.executeShuttleChargeStepGoToChargeSta(wrkMast);//灏忚溅绛夊緟鍏呯數妗�
+                if (!result1) {
                     continue;
                 }
 
-                if (wrkCharge.getWrkSts() == 51) {
-                    if (!shuttleProtocol.isIdleNoCharge()) {
-                        continue;
-                    }
-
-                    if (shuttleProtocol.getSuspendState() == 1) {
-                        continue;//绠″埗涓�
-                    }
-
-                    if (!shuttleProtocol.getCurrentLocNo().equals(wrkCharge.getLocNo())) {
-                        //灏忚溅涓嶅湪鍏呯數妗╀綅缃�
-                        shuttleDispatchUtils.dispatchShuttle(wrkCharge.getWrkNo(), wrkCharge.getLocNo(), shuttle.getId());//璋冨害灏忚溅鍘诲厖鐢垫々
-                        continue;
-                    }
-
-                    //灏忚溅宸茬粡鍦ㄥ厖鐢垫々浣嶇疆锛屼笅鍙戝厖鐢靛懡浠�
-                    NyShuttleHttpCommand chargeCommand = NyHttpUtils.getChargeCommand(shuttle.getId(), wrkCharge.getWrkNo(), true);
-                    ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
-                    commands.add(chargeCommand);
-                    //鍒涘缓鍒嗛厤鍛戒护
-                    ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-                    assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-                    assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue());//浠诲姟鍙�
-                    assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id.shortValue());//鍑哄簱妯″紡
-                    assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-                    assignCommand.setCommands(commands);//杩愯鍛戒护
-
-                    wrkCharge.setWrkSts(52L);//51.鐢熸垚鍏呯數浠诲姟 => 52.灏忚溅鍘诲厖鐢典腑
-                    wrkCharge.setModiTime(new Date());
-                    if (wrkChargeMapper.updateById(wrkCharge) > 0) {
-                        //涓嬪彂浠诲姟
-                        MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-                    }
-                } else if (wrkCharge.getWrkSts() == 52) {
-                    //妫�娴嬪皬杞︽槸鍚︽弧鐢�
-
-                    //鑾峰彇婊$數闃堝��
-                    int maxPower = 95;
-                    EntityWrapper<Config> wrapper = new EntityWrapper<>();
-                    wrapper.eq("code", "chargeMaxValue");
-                    Config config = configService.selectOne(wrapper);
-                    if (config != null) {
-                        maxPower = Integer.parseInt(config.getValue());
-                    }
-
-                    if (shuttleProtocol.getPowerPercent() < maxPower) {
-                        continue;
-                    }
-
-                    //***************鍒ゆ柇鏄惁婊″厖鏍″噯***************
-                    EntityWrapper<Config> wrapper1 = new EntityWrapper<>();
-                    wrapper.eq("code", "shuttleMaxPowerVerify");
-                    Config config1 = configService.selectOne(wrapper1);
-                    if (config1 != null) {
-                        if (config1.getValue().equals("true")) {
-                            if (shuttleProtocol.getVoltage() < 5630) {
-                                continue;//鐢靛帇涓嶅缁х画鍏呯數
-                            }
-                        }
-                    }
-                    //***************鍒ゆ柇鏄惁婊″厖鏍″噯***************
-
-                    //灏忚溅婊$數锛岀粨鏉熷厖鐢典换鍔�
-                    NyShuttleHttpCommand chargeCommand = NyHttpUtils.getChargeCommand(shuttle.getId(), wrkCharge.getWrkNo(), false);
-                    ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
-                    commands.add(chargeCommand);
-                    //鍒涘缓鍒嗛厤鍛戒护
-                    ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-                    assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-                    assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue());//浠诲姟鍙�
-                    assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id.shortValue());//鍑哄簱妯″紡
-                    assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
-                    assignCommand.setCommands(commands);//杩愯鍛戒护
-
-                    //涓嬪彂浠诲姟
-                    MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-                    try {
-                        Thread.sleep(3000);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-
-                    wrkCharge.setWrkSts(53L);//52.灏忚溅鍘诲厖鐢典腑 => 53.灏忚溅鍏呯數瀹屾垚
-                    wrkCharge.setModiTime(new Date());
-                    if (wrkChargeMapper.updateById(wrkCharge) > 0) {
-                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE.id);
-                        shuttleProtocol.setTaskNo(0);
-                        shuttleProtocol.setPakMk(false);
-                    }
-                } else if (wrkCharge.getWrkSts() == 53) {
-                    if (shuttleProtocol.getChargState() == 0) {//灏忚溅澶勪簬鏈厖鐢电姸鎬�
-                        boolean result = Utils.searchEmptyGroupToMoveShuttle(Utils.getLev(wrkCharge.getLocNo()), shuttleThread.getSlave().getId(), shuttleThread);
-                        if (!result) {
-                            continue;
-                        }
-
-                        wrkCharge.setWrkSts(60L);//53.灏忚溅鍏呯數瀹屾垚 => 60.鍏呯數浠诲姟瀹屾垚
-                        wrkCharge.setModiTime(new Date());
-                        if (wrkChargeMapper.updateById(wrkCharge) > 0) {
-
-                        }
-                    }
+                boolean result2 = this.executeShuttleChargeStepArrivalChargeSta(wrkMast);//灏忚溅鍒拌揪鍏呯數妗�
+                if (!result2) {
+                    continue;
                 }
 
+                boolean result3 = this.executeShuttleChargeStepStartCharge(wrkMast);//灏忚溅寮�濮嬪厖鐢�
+                if (!result3) {
+                    continue;
+                }
+
+                boolean result4 = this.executeShuttleChargeStepStopCharge(wrkMast);//灏忚溅鍋滄鍏呯數
+                if (!result4) {
+                    continue;
+                }
+
+                boolean result5 = this.executeShuttleChargeStepLeaveCharge(wrkMast);//灏忚溅绂诲紑鍏呯數妗�
+                if (!result5) {
+                    continue;
+                }
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
+    }
+
+    /**
+     * 灏忚溅鍓嶅線鍏呯數妗�
+     */
+    private synchronized boolean executeShuttleChargeStepGoToChargeSta(WrkMast wrkMast) {
+        if (wrkMast.getWrkSts() == WrkStsType.NEW_CHARGE.sts) {
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+
+            if (shuttleProtocol.getCurrentLocNo().equals(wrkMast.getLocNo())) {
+                //灏忚溅鍦ㄥ厖鐢垫々浣嶇疆
+                wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_RUN_COMPLETE.sts);
+                wrkMast.setModiTime(new Date());
+                wrkMastService.updateById(wrkMast);
+                return false;
+            }
+
+            //璋冨害灏忚溅鍘诲厖鐢垫々
+            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getLocNo(), wrkMast.getShuttleNo());
+            if (!dispatched) {
+                return false;
+            }
+
+            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_RUN.sts);//灏忚溅鍓嶅線鍏呯數妗�
+            wrkMast.setModiTime(new Date());
+            wrkMastService.updateById(wrkMast);
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 灏忚溅鍒拌揪鍏呯數妗�
+     */
+    private synchronized boolean executeShuttleChargeStepArrivalChargeSta(WrkMast wrkMast) {
+        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_RUN.sts) {
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+
+            //鍒ゆ柇鏄惁瀛樺湪鏈畬鎴愮殑绉诲姩浠诲姟
+            WrkMast moveWrk = wrkMastService.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
+            if(moveWrk != null) {
+                return false;
+            }
+
+            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getLocNo())) {
+                return false;
+            }
+
+            //灏忚溅鍦ㄥ厖鐢垫々浣嶇疆
+            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_RUN_COMPLETE.sts);//灏忚溅鍒拌揪鍏呯數妗�
+            wrkMast.setModiTime(new Date());
+            wrkMastService.updateById(wrkMast);
+
+            return false;
+        }
+        return true;
+    }
+
+    //灏忚溅寮�濮嬪厖鐢�
+    private synchronized boolean executeShuttleChargeStepStartCharge(WrkMast wrkMast) {
+        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_RUN_COMPLETE.sts) {
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+
+            //灏忚溅宸茬粡鍦ㄥ厖鐢垫々浣嶇疆锛屼笅鍙戝厖鐢靛懡浠�
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id);//鍑哄簱妯″紡
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
+
+            List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleChargeCommand(assignCommand, shuttleThread, true);
+            assignCommand.setCommands(commands);//杩愯鍛戒护
+
+            wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_WORKING.sts);
+            wrkMast.setModiTime(new Date());
+            if (!wrkMastService.updateById(wrkMast)) {
+                return false;
+            }
+
+            //涓嬪彂浠诲姟
+            shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+
+            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_POWER_START);//瑙﹀彂閫氱煡
+            return false;
+        }
+        return true;
+    }
+
+    //灏忚溅鍋滄鍏呯數
+    private synchronized boolean executeShuttleChargeStepStopCharge(WrkMast wrkMast) {
+        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_WORKING.sts) {
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+
+            if (!shuttleThread.isChargingCompleted()) {
+                return false;
+            }
+
+            //灏忚溅宸茬粡鍦ㄥ厖鐢垫々浣嶇疆锛屼笅鍙戝仠姝㈠厖鐢靛懡浠�
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id);//鍑哄簱妯″紡
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
+
+            List<ShuttleCommand> commands = shuttleOperaUtils.getShuttleChargeCommand(assignCommand, shuttleThread, false);
+            assignCommand.setCommands(commands);//杩愯鍛戒护
+
+            //涓嬪彂浠诲姟
+            shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+            return false;
+        }
+        return true;
+    }
+
+    //灏忚溅绂诲紑鍏呯數妗�
+    private synchronized boolean executeShuttleChargeStepLeaveCharge(WrkMast wrkMast) {
+        if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts) {
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                return false;
+            }
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                return false;
+            }
+
+            BasShuttleCharge basShuttleCharge = basShuttleChargeService.selectOne(new EntityWrapper<BasShuttleCharge>().eq("charge_id", wrkMast.getMk()));
+            if(basShuttleCharge == null) {
+                return false;
+            }
+
+            //璋冨害灏忚溅鍘诲緟鏈轰綅
+            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), basShuttleCharge.getWaitLocNo(), wrkMast.getShuttleNo());
+            if (!dispatched) {
+                return false;
+            }
+
+            wrkMast.setWrkSts(WrkStsType.COMPLETE_CHARGE.sts);
+            wrkMast.setModiTime(new Date());
+            if (wrkMastService.updateById(wrkMast)) {
+                return false;
+            }
+            return false;
+        }
+        return true;
     }
 
     /**
@@ -2752,15 +1404,10 @@
     public synchronized void shuttleMoveExecute() {
         try {
             //鏌ヨ灏忚溅绉诲簱浠诲姟
-            List<WrkMast> wrkMasts = wrkMastMapper.selectShuttleMoveWrk();
+            List<WrkMast> wrkMasts = wrkMastService.selectShuttleMoveWrk();
             for (WrkMast wrkMast : wrkMasts) {
                 boolean stepMoveSta = this.shuttleMoveExecuteStepMoveSta(wrkMast);//灏忚溅绉诲姩鍒扮珯鐐�
                 if (!stepMoveSta) {
-                    continue;
-                }
-
-                boolean stepIntoLift = this.shuttleMoveExecuteStepIntoLift(wrkMast);//灏忚溅杩佸叆鎻愬崌鏈�
-                if (!stepIntoLift) {
                     continue;
                 }
 
@@ -2769,8 +1416,8 @@
                     continue;
                 }
 
-                boolean stepOutLift = this.shuttleMoveExecuteStepOutLift(wrkMast);//灏忚溅杩佸嚭鎻愬崌鏈�
-                if (!stepOutLift) {
+                boolean updateShuttleLocation = this.shuttleMoveExecuteStepUpdateShuttleLocation(wrkMast);//鎻愬崌鏈烘惉杩愬畬鎴愭洿鏂板皬杞﹀潗鏍�
+                if (!updateShuttleLocation) {
                     continue;
                 }
 
@@ -2794,284 +1441,104 @@
         //--------------------------------------灏忚溅绉诲姩鑷崇珯鐐�-----------------------------------------//
         Date now = new Date();
 
-        //灏忚溅绉诲姩鑷崇珯鐐�  101.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 102.灏忚溅绉诲姩鑷崇珯鐐逛腑
-        if (wrkMast.getWrkSts() == 101) {
+        //灏忚溅绉诲姩鑷崇珯鐐�  301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷崇珯鐐逛腑
+        if (wrkMast.getWrkSts() == WrkStsType.NEW_MOVE.sts) {
             //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
             }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
             if (shuttleProtocol == null) {
                 return false;
             }
 
             //灏忚溅澶勪簬绌洪棽鐘舵��
-            if (!shuttleProtocol.isIdleNoCharge(wrkMast.getWrkNo())) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀繖纰屼腑", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+            if (!shuttleThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀繖纰屼腑", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
             }
 
-            //鍒ゆ柇灏忚溅浠ょ墝鏄惁鏈鍗犻
-            if (shuttleProtocol.getToken() != 0) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屼护鐗屽凡琚嫭鍗狅紝绂佹娲惧彂", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;//灏忚溅宸茶鐙崰锛岀姝㈠啀娲惧彂浠诲姟
-            }
-
-            if (Utils.getLev(wrkMast.getLocNo()) == shuttleProtocol.getPoint().getZ()) {
+            if (Utils.getLev(wrkMast.getLocNo()) == Utils.getLev(shuttleProtocol.getCurrentLocNo())) {
                 //鐩爣搴撲綅鍜屽皬杞﹀簱浣嶅浜庡悓涓�妤煎眰锛屼笉闇�瑕侀�氳繃鎻愬崌鏈鸿皟搴�
-                wrkMast.setWrkSts(109L);// 109.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� ==> 110.灏忚溅绉诲姩涓�
+                wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts);// 309.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� ==> 310.灏忚溅绉诲姩涓�
                 wrkMast.setModiTime(now);
-                shuttleProtocol.setToken(wrkMast.getWrkNo());//鐙崰璇ュ皬杞︿护鐗�
-                if (wrkMastMapper.updateById(wrkMast) > 0) {
+                if (wrkMastService.updateById(wrkMast)) {
                     //涓嬪彂浠诲姟
-                    return true;//鐩存帴杩涘叆109.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� ==> 110.灏忚溅绉诲姩涓�
+                    return true;//鐩存帴杩涘叆309.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� ==> 310.灏忚溅绉诲姩涓�
                 }
                 return false;
             }
 
             //鑾峰彇婧愯緭閫佺珯
-            LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
             if (liftSta == null) {
                 return false;//鎵句笉鍒扮珯鐐�
             }
 
-            //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟(璇ヤ换鍔¢渶瑕佹崲灞傚繀椤绘彁鍓嶇嫭鍗犳彁鍗囨満)
-            WrkMast liftWrkMast = wrkMastMapper.selectLiftWrkMast(liftSta.getLiftNo());
-            if (liftWrkMast != null) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getLiftNo());
-                return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
+            if (wrkMast.getLiftNo() == null) {
+                //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟(璇ヤ换鍔¢渶瑕佹崲灞傚繀椤绘彁鍓嶇嫭鍗犳彁鍗囨満)
+                WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftSta.getLiftNo());
+                if (liftWrkMast != null) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getLiftNo());
+                    return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
+                }
+
+                wrkMast.setModiTime(now);
+                wrkMast.setLiftNo(liftSta.getLiftNo());//鎻愬墠閿佸畾鎻愬崌鏈�
+                wrkMast.setSystemMsg("");//娓呯┖娑堟伅
+                wrkMastService.updateById(wrkMast);
+                return false;
             }
 
             //*************灏濊瘯閿佸畾鐩爣绔欒矾寰�***************
-            List<NavigateNode> targetNodes = NyLiftUtils.getLiftStaNodes(wrkMast.getStaNo());
+            List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo());
             if (targetNodes == null) {
                 return false;//鏈幏鍙栧埌鑺傜偣
             }
-            boolean checkPathIsAvailable = NavigateUtils.checkPathIsAvailable(targetNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(wrkMast.getLocNo()), null);
+            boolean checkPathIsAvailable = navigateUtils.checkPathIsAvailable(targetNodes, shuttleProtocol.getShuttleNo(), Utils.getLev(wrkMast.getLocNo()));
             if (!checkPathIsAvailable) {
                 News.info("{}浠诲姟锛寋}灏忚溅锛岀洰鏍囩珯鐐硅矾寰勮鍗犵敤锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;//妫�娴嬬洰鏍囩珯鐐硅矾寰勬槸鍚︽湭琚崰鐢�
             }
             //灏濊瘯閿佸畾鐩爣绔欒矾寰�
-            boolean result2 = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo().intValue(), targetNodes, true);//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
+            boolean result2 = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo(), targetNodes, true);//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
             if (!result2) {
                 News.info("{}浠诲姟锛寋}灏忚溅锛岃矾寰勯攣瀹氬け璐ワ紝绂佹娲惧彂", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;//璺緞閿佸畾澶辫触
             }
             //*************灏濊瘯閿佸畾鐩爣绔欒矾寰�***************
 
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//灏忚溅绉诲簱浠诲姟
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setAuto(true);//鑷姩妯″紡
+
             //鑾峰彇灏忚溅鍒拌緭閫佺珯鐐硅璧板懡浠�
-            NyShuttleOperaResult result = NyShuttleOperaUtils.getStartToTargetCommands(shuttleThread.getSlave().getId(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), liftSta.getLocNo(), NavigationMapType.NORMAL.id);
-            if (result == null) {
-                //璺緞鑾峰彇澶辫触锛岄渶瑕佽В閿佷笂闈㈤攣瀹氱殑璺緞
-                //灏濊瘯瑙i攣鐩爣绔欒矾寰�
-                boolean result3 = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo().intValue(), targetNodes, false);//鎵�浣跨敤鐨勮矾寰勮繘琛岃В閿�
-                if (!result3) {
-                    News.info("{}浠诲姟锛寋}灏忚溅锛岃矾寰勮В閿佸け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                    return false;//璺緞瑙i攣澶辫触
-                }
-                News.info("{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), liftSta.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
+            if (commands == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+
+                //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
+                navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo(), targetNodes, false);
                 return false;//璺緞瑙i攣澶辫触
             }
-            List<NyShuttleHttpCommand> commands = result.getCommands();
 
-            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO.id.shortValue());//灏忚溅绉诲簱浠诲姟
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-            assignCommand.setAuto(true);//鑷姩妯″紡
             assignCommand.setCommands(commands);
-            assignCommand.setNodes(result.getNodes());
 
-            wrkMast.setWrkSts(102L);//灏忚溅绉诲姩鍒版彁鍗囨満涓�  101.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 102.灏忚溅绉诲姩鑷崇珯鐐�
+            wrkMast.setWrkSts(WrkStsType.MOVE_SITE.sts);//灏忚溅绉诲姩鍒版彁鍗囨満涓�  301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷崇珯鐐�
             wrkMast.setModiTime(now);
-            wrkMast.setLiftNo(liftSta.getLiftNo());//鎻愬墠閿佸畾鎻愬崌鏈�
-            shuttleProtocol.setToken(wrkMast.getWrkNo());//鐙崰璇ュ皬杞︿护鐗�
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
+            if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVING);
+                //瑙﹀彂閫氱煡
                 return false;
             }
             return false;
         }
-        return true;
-    }
-
-    /**
-     * 灏忚溅杩佺Щ-灏忚溅杩佸叆鎻愬崌鏈�
-     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
-     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
-     */
-    private boolean shuttleMoveExecuteStepIntoLift(WrkMast wrkMast) {
-        //--------------------------------------灏忚溅杩佸叆鎻愬崌鏈�-----------------------------------------//
-        Date now = new Date();
-
-        //灏忚溅绉诲姩鍒版彁鍗囨満涓�  103.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴� ==> 104.灏忚溅杩佸叆鎻愬崌鏈轰腑
-        if (wrkMast.getWrkSts() == 103) {
-            //鑾峰彇婧愮珯
-            LiftStaProtocol sourceLiftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
-            if (sourceLiftSta == null) {
-                return false;//鎵句笉鍒扮珯鐐�
-            }
-
-            //鑾峰彇鐩爣杈撻�佺珯
-            LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
-            if (liftSta == null) {
-                return false;//鎵句笉鍒扮珯鐐�
-            }
-
-            //鑾峰彇鎻愬崌鏈烘暟鎹�
-            BasLift basLift = basLiftService.selectById(liftSta.getLiftNo());
-            if (basLift == null) {
-                return false;//娌℃湁鎻愬崌鏈烘暟鎹�
-            }
-
-            if (basLift.getPoint() == null) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾病鏈夋彁鍗囨満鐐逛綅鍧愭爣锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), basLift.getLiftNo());
-                return false;//娌℃湁璁剧疆鎻愬崌鏈虹偣浣嶅潗鏍�
-            }
-
-            //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
-            WrkMast liftWrkMast = wrkMastMapper.selectLiftWrkMast(basLift.getLiftNo());
-            if (liftWrkMast != null) {
-                if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚�
-                    News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), basLift.getLiftNo());
-                    return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
-                }
-            }
-
-            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSta.getLiftNo());
-            if (liftThread == null) {
-                return false;
-            }
-            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-            if (liftProtocol == null) {
-                return false;
-            }
-
-            if (!liftProtocol.isIdle(wrkMast.getWrkNo().shortValue())) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満蹇欑涓紝绂佹娲惧彂", wrkMast.getWrkNo(), basLift.getLiftNo());
-                return false;
-            }
-
-            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
-            if (shuttleThread == null) {
-                return false;
-            }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-            if (shuttleProtocol == null) {
-                return false;
-            }
-
-            //灏忚溅澶勪簬绌洪棽鐘舵��
-            if (!shuttleProtocol.isIdleNoCharge(wrkMast.getWrkNo())) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀繖纰屼腑锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;
-            }
-
-            //灏忚溅浠ょ墝鏄惁琚换鍔$嫭鍗�
-            if (!shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞︿护鐗岃鐙崰锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;
-            }
-
-            //鍒ゆ柇鎻愬崌鏈烘ゼ灞�
-            if (liftProtocol.getLev().intValue() != shuttleProtocol.getPoint().getZ()) {
-                //鎻愬崌鏈轰笉鍦ㄥ皬杞︽ゼ灞�
-                //璋冨害鎻愬崌鏈�
-
-                if (liftProtocol.getToken() != 0) {
-                    News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満浠ょ墝琚嫭鍗狅紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                    return false;//鎻愬崌鏈轰护鐗岃鍗犵敤
-                }
-
-                //鑾峰彇鎻愬崌鏈哄懡浠わ紝璋冨害鎻愬崌鏈哄埌婧愮珯浣嶇疆
-                NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftProtocol.getLiftNo().intValue(), NyLiftTaskModelType.MOVE_CAR.id, sourceLiftSta.getStaNo(), sourceLiftSta.getStaNo(), wrkMast.getWrkNo());
-
-                int deviceWrk = commonService.getWorkNo(8);//鐢熸垚鎻愬崌鏈鸿澶囧伐浣滃彿
-                BasLiftOpt basLiftOpt = basLiftOptService.selectByDeviceWrk(String.valueOf(deviceWrk), liftThread.getSlave().getId());
-                if (basLiftOpt != null) {
-                    News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛岃澶囧伐浣滃彿鍑虹幇閲嶅鎯呭喌锛岃鑱旂郴鎶�鏈汉鍛樻敮鎸併��", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                    return false;
-                }
-                liftCommand.setTaskNo((short) deviceWrk);//鏇存崲闅忔満浠诲姟鍙�
-
-                ArrayList<NyLiftCommand> commands = new ArrayList<>();
-                commands.add(liftCommand);
-
-                //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
-                LiftAssignCommand assignCommand = new LiftAssignCommand();
-                assignCommand.setCommands(commands);
-                assignCommand.setLiftNo(liftProtocol.getLiftNo());
-                assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
-                assignCommand.setTaskMode(NyLiftTaskModelType.MOVE_CAR.id.shortValue());
-                assignCommand.setAuto(false);
-
-                wrkMast.setLiftNo(liftThread.getSlave().getId());//閿佸畾鎻愬崌鏈洪槻姝㈣鍗犵敤
-                wrkMast.setModiTime(now);
-                liftProtocol.setToken(wrkMast.getShuttleNo());//鎻愬崌鏈轰护鐗岀粦瀹氬綋鍓嶅皬杞�
-                if (wrkMastMapper.updateById(wrkMast) > 0) {
-                    //涓嬪彂浠诲姟
-                    MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand));
-                }
-                return false;//绛夊緟鎻愬崌鏈哄埌灏忚溅妤煎眰
-            }
-
-            if (liftProtocol.getToken() == 0) {//鎻愬崌鏈轰护鐗屾湭琚崰鐢�
-                //鐙崰鎻愬崌鏈�
-                liftProtocol.setToken(wrkMast.getShuttleNo());
-                return false;//绛夊緟涓嬩竴娆℃墽琛�
-            }
-
-            //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚︿负褰撳墠灏忚溅
-            if (!liftProtocol.getToken().equals(wrkMast.getShuttleNo())) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満浠ょ墝琚嫭鍗狅紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//鎻愬崌鏈哄凡琚嫭鍗狅紝绂佹鍐嶆淳鍙戜换鍔�
-            }
-
-            //鍒ゆ柇灏忚溅鏄惁涓哄綋鍓嶄换鍔$嫭鍗�
-            if (!shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞︿护鐗岃鐙崰锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;
-            }
-
-            //绔欑偣鑺傜偣
-            NavigateNode staNode = NavigatePositionConvert.locNoToNode(sourceLiftSta.getLocNo());
-
-            //鎻愬崌鏈鸿妭鐐�
-            NavigateNode liftNode = new NavigateNode(basLift.getPoint$().getX(), basLift.getPoint$().getY());
-            liftNode.setZ(staNode.getZ());
-
-            //鑾峰彇灏忚溅杩涙彁鍗囨満琛岃蛋鍛戒护
-            NyShuttleHttpCommand moveCommand = NyHttpUtils.getInOutLiftCommand(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), staNode, liftNode, true);
-            List<NyShuttleHttpCommand> commands = new ArrayList<>();
-            commands.add(moveCommand);
-            List<NavigateNode> nodes = new ArrayList<>();//琛岃蛋鑺傜偣璺緞
-            nodes.add(staNode);
-            nodes.add(liftNode);
-
-            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO.id.shortValue());//灏忚溅绉诲簱浠诲姟
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-            assignCommand.setAuto(true);//鑷姩妯″紡
-            assignCommand.setCommands(commands);
-            assignCommand.setNodes(nodes);
-
-            wrkMast.setWrkSts(104L);//灏忚溅绉诲姩鍒版彁鍗囨満涓�  103.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴� ==> 104.灏忚溅杩佸叆鎻愬崌鏈轰腑
-            wrkMast.setModiTime(now);
-            wrkMast.setLiftNo(liftThread.getSlave().getId());//閿佸畾鎻愬崌鏈洪槻姝㈣鍗犵敤
-            liftProtocol.setToken(wrkMast.getShuttleNo());//鎻愬崌鏈轰护鐗岀粦瀹氬綋鍓嶅皬杞�
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
-                //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-                return false;
-            }
-            return false;
-        }
-
         return true;
     }
 
@@ -3084,203 +1551,116 @@
         //--------------------------------------鎻愬崌鏈烘惉杩愪腑-----------------------------------------//
         Date now = new Date();
 
-        //鎻愬崌鏈烘惉杩愪腑  105.灏忚溅杩佸叆鎻愬崌鏈哄畬鎴� ==> 106.鎻愬崌鏈烘惉杩愪腑
-        if (wrkMast.getWrkSts() == 105) {
-
-            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, wrkMast.getLiftNo());
-            if (liftThread == null) {
+        //鎻愬崌鏈烘惉杩愪腑  303.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴� ==> 306.鎻愬崌鏈烘惉杩愪腑
+        if (wrkMast.getWrkSts() == WrkStsType.MOVE_SITE_COMPLETE.sts) {
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, wrkMast.getLiftNo());
+            if (forkLiftThread == null) {
                 return false;
             }
-            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-            if (liftProtocol == null) {
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
                 return false;
             }
-            if (!liftProtocol.isIdle(wrkMast.getWrkNo().shortValue())) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満蹇欑涓紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
+            if (!forkLiftThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満蹇欑涓紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                 return false;
             }
             //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
-            WrkMast liftWrkMast = wrkMastMapper.selectLiftWrkMast(liftThread.getSlave().getId());
+            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo());
             if (liftWrkMast != null) {
                 if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚�
-                    News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                     return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
                 }
             }
 
-            //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚︿负褰撳墠灏忚溅
-            if (!liftProtocol.getToken().equals(wrkMast.getShuttleNo())) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満浠ょ墝鍜屽綋鍓嶅皬杞︿笉涓�鑷达紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//鎻愬崌鏈轰护鐗屽拰褰撳墠灏忚溅涓嶄竴鑷达紝绂佹娲惧彂
-            }
-
-            //鍒ゆ柇鎻愬崌鏈哄唴鏄惁鏈夊皬杞�
-            if (!liftProtocol.getHasCar()) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満鍐呮棤灏忚溅锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//鎻愬崌鏈哄唴鏃犲皬杞�
-            }
-
-            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
-            if (shuttleThread == null) {
-                return false;
-            }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-            if (shuttleProtocol == null) {
-                return false;
-            }
-
-            //灏忚溅澶勪簬绌洪棽鐘舵��
-            if (!shuttleProtocol.isIdleNoCharge()) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満蹇欑涓紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;
-            }
-
-            //鍒ゆ柇灏忚溅鏄惁涓哄綋鍓嶄换鍔$嫭鍗�
-            if (!shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀綋鍓嶄换鍔℃湭琚嫭鍗狅紝绂佹娲惧彂", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;
-            }
-
             //鑾峰彇婧愮珯
-            LiftStaProtocol sourceLiftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
+            ForkLiftStaProtocol sourceLiftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
             //鑾峰彇鐩爣绔�
-            LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
             if (sourceLiftSta == null || liftSta == null) {
-                News.info("{}浠诲姟锛岀己灏戠珯鐐逛俊鎭紝绂佹娲惧彂", wrkMast.getWrkNo());
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀己灏戠珯鐐逛俊鎭紝绂佹娲惧彂", wrkMast.getWrkNo());
                 return false;//缂哄皯绔欑偣淇℃伅
             }
 
-            //鑾峰彇鎻愬崌鏈哄懡浠�
-            NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftProtocol.getLiftNo().intValue(), NyLiftTaskModelType.MOVE_CAR.id, sourceLiftSta.getStaNo(), liftSta.getStaNo(), wrkMast.getWrkNo());
+            if (liftSta.getHasTray()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪鎵樼洏锛岀姝㈡淳鍙�", wrkMast.getWrkNo());
+                return false;//鏈夋墭鐩樿烦杩�
+            }
 
-            ArrayList<NyLiftCommand> commands = new ArrayList<>();
-            commands.add(liftCommand);
+            //鑾峰彇鎻愬崌鏈哄懡浠�
+            List<ForkLiftCommand> liftCommands = forkLiftThread.getShuttleSwitchCommand(wrkMast.getWrkNo(), sourceLiftSta.getLev(), liftSta.getLev());
+            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
+            commands.addAll(liftCommands);
 
             //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
             LiftAssignCommand assignCommand = new LiftAssignCommand();
             assignCommand.setCommands(commands);
-            assignCommand.setLiftNo(liftProtocol.getLiftNo());
+            assignCommand.setLiftNo(wrkMast.getLiftNo().shortValue());
             assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
-            assignCommand.setTaskMode(NyLiftTaskModelType.MOVE_CAR.id.shortValue());
+            assignCommand.setTaskMode(ForkLiftTaskModeType.SHUTTLE_SWITCH.id.shortValue());
 
-            wrkMast.setWrkSts(106L);//鎻愬崌鏈烘惉杩愪腑  105.灏忚溅杩佸叆鎻愬崌鏈哄畬鎴� ==> 106.鎻愬崌鏈烘惉杩愪腑
-            wrkMast.setLiftNo(liftThread.getSlave().getId());//閿佸畾鎻愬崌鏈洪槻姝㈣鍗犵敤
+            wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑  303.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴� ==> 306.鎻愬崌鏈烘惉杩愪腑
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
             wrkMast.setModiTime(now);
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
+            if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand));
+                forkLiftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
             }
-
         }
         return true;
     }
 
     /**
-     * 灏忚溅杩佺Щ-灏忚溅杩佸嚭鎻愬崌鏈�
+     * 灏忚溅杩佺Щ-鎻愬崌鏈烘惉杩愬畬鎴愭洿鏂板皬杞﹀潗鏍�
      * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
      * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
      */
-    private boolean shuttleMoveExecuteStepOutLift(WrkMast wrkMast) {
-        //--------------------------------------灏忚溅杩佸嚭鎻愬崌鏈�-----------------------------------------//
+    private boolean shuttleMoveExecuteStepUpdateShuttleLocation(WrkMast wrkMast) {
+        //--------------------------------------鎻愬崌鏈烘惉杩愪腑-----------------------------------------//
         Date now = new Date();
-        //灏忚溅绉诲姩鍒版彁鍗囨満涓�  107.鎻愬崌鏈烘惉杩愬畬鎴� ==> 108.灏忚溅杩佸嚭鎻愬崌鏈轰腑
-        if (wrkMast.getWrkSts() == 107) {
 
-            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, wrkMast.getLiftNo());
-            if (liftThread == null) {
-                return false;
-            }
-            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-            if (liftProtocol == null) {
-                return false;
-            }
-            if (!liftProtocol.isIdle(wrkMast.getWrkNo().shortValue())) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満蹇欑涓紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;
-            }
-
-            //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
-            WrkMast liftWrkMast = wrkMastMapper.selectLiftWrkMast(liftThread.getSlave().getId());
-            if (liftWrkMast != null) {
-                if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚�
-                    News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                    return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
-                }
-            }
-
-            //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚︿负褰撳墠灏忚溅
-            if (!liftProtocol.getToken().equals(wrkMast.getShuttleNo())) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満浠ょ墝鍜屽綋鍓嶅皬杞︿笉涓�鑷达紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//鎻愬崌鏈轰护鐗屽拰褰撳墠灏忚溅涓嶄竴鑷达紝绂佹娲惧彂
-            }
-
+        //鎻愬崌鏈烘惉杩愪腑  307.鎻愬崌鏈烘惉杩愬畬鎴� ==> 308.灏忚溅杩佸嚭鎻愬崌鏈轰腑
+        if (wrkMast.getWrkSts() == WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts) {
             //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
             }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
             if (shuttleProtocol == null) {
                 return false;
             }
 
             //灏忚溅澶勪簬绌洪棽鐘舵��
-            if (!shuttleProtocol.isIdleNoCharge()) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀繖纰屼腑锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+            if (!shuttleThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀繖纰屼腑锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
             }
-
-            //鍒ゆ柇灏忚溅鏄惁涓哄綋鍓嶄换鍔$嫭鍗�
-            if (!shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞︿护鐗岃鐙崰锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;
-            }
-
-            //鑾峰彇鐩爣绔�
-            LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
-            if (liftSta == null) {
-                return false;//鎵句笉鍒扮珯鐐�
-            }
-
-            //鑾峰彇鎻愬崌鏈烘暟鎹�
-            BasLift basLift = basLiftService.selectById(liftProtocol.getLiftNo().intValue());
-            if (basLift == null) {
-                return false;//娌℃湁鎻愬崌鏈烘暟鎹�
-            }
-            if (basLift.getPoint() == null) {
-                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛岀己灏戞彁鍗囨満鐐逛綅鍧愭爣锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-                return false;//娌℃湁璁剧疆鎻愬崌鏈虹偣浣嶅潗鏍�
-            }
-
-            NavigateNode liftNode = new NavigateNode(basLift.getPoint$().getX(), basLift.getPoint$().getY());
-            liftNode.setZ(liftSta.getLev());
-
-            List<NyShuttleHttpCommand> commands = new ArrayList<>();
-            //鑾峰彇灏忚溅鏇存柊妤煎眰鍛戒护
-            NyShuttleHttpCommand updateZCommand = NyHttpUtils.getUpdateZCommand(shuttleThread.getSlave().getId(), liftProtocol.getLev().intValue(), wrkMast.getWrkNo());
-            commands.add(updateZCommand);
-
-            //鑾峰彇灏忚溅鍑烘彁鍗囨満琛岃蛋鍛戒护
-            NyShuttleHttpCommand moveCommand = NyHttpUtils.getInOutLiftCommand(shuttleThread.getSlave().getId(), wrkMast.getWrkNo(), liftNode, NavigatePositionConvert.locNoToNode(liftSta.getLocNo()), false);
-            commands.add(moveCommand);//娣诲姞灏忚溅杩佸嚭鎻愬崌鏈哄懡浠�
 
             ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
             assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO.id.shortValue());//灏忚溅绉诲簱浠诲姟
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.UPDATE_LOCATION.id);//鏇存柊鍧愭爣
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
             assignCommand.setAuto(true);//鑷姩妯″紡
-            assignCommand.setCommands(commands);
-            assignCommand.setNodes(null);
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�
+            assignCommand.setLocNo(wrkMast.getLocNo());//鐩爣搴撲綅
 
-            wrkMast.setWrkSts(108L);//灏忚溅杩佸嚭鎻愬崌鏈轰腑  107.鎻愬崌鏈烘惉杩愬畬鎴� ==> 108.灏忚溅杩佸嚭鎻愬崌鏈轰腑
+            //鏇存柊灏忚溅鍧愭爣
+            ShuttleCommand command = shuttleThread.getUpdateLocationCommand(wrkMast.getWrkNo(), wrkMast.getLocNo());
+            ArrayList<ShuttleCommand> commands = new ArrayList<>();
+            commands.add(command);
+
+            assignCommand.setCommands(commands);
+
+            wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT.sts);//灏忚溅杩佸嚭鎻愬崌鏈轰腑
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
             wrkMast.setModiTime(now);
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
+
+            if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-                return false;
+                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
             }
-            return false;
         }
         return true;
     }
@@ -3294,90 +1674,51 @@
         //--------------------------------------灏忚溅绉诲姩鍒扮洰鏍囧簱浣嶄腑-----------------------------------------//
         Date now = new Date();
 
-        //灏忚溅绉诲姩鍒扮洰鏍囧簱浣嶄腑  109.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� ==> 110.灏忚溅绉诲姩涓�
-        if (wrkMast.getWrkSts() == 109) {
+        //灏忚溅绉诲姩鍒扮洰鏍囧簱浣嶄腑  309.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� ==> 310.灏忚溅绉诲姩涓�
+        if (wrkMast.getWrkSts() == WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts) {
 
             //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
             if (shuttleThread == null) {
                 return false;
             }
-            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
             if (shuttleProtocol == null) {
                 return false;
             }
 
             //灏忚溅澶勪簬绌洪棽鐘舵��
-            if (!shuttleProtocol.isIdleNoCharge(wrkMast.getWrkNo())) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀繖纰屼腑锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+            if (!shuttleThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀繖纰屼腑锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;
             }
-
-            //鍒ゆ柇灏忚溅浠ょ墝鏄惁涓哄綋鍓嶄换鍔�
-            if (shuttleProtocol.getToken() != 0 && !shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞︿护鐗岃鐙崰锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-                return false;
-            }
-
-//            //璺ㄦゼ灞傜Щ鍔ㄤ换鍔�
-//            if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
-//                //鑾峰彇鐩爣绔�
-//                LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
-//                if (liftSta == null) {
-//                    return false;//鎵句笉鍒扮珯鐐�
-//                }
-//
-//                //*************灏濊瘯瑙i攣鐩爣绔欒矾寰�***************
-//                List<NavigateNode> targetNodes = NyLiftUtils.getLiftStaNodes(liftSta.getStaNo());
-//                if (targetNodes == null) {
-//                    return false;//鏈幏鍙栧埌鑺傜偣
-//                }
-//                //灏濊瘯瑙i攣鐩爣绔欒矾寰�
-//                boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), targetNodes, false);//鎵�浣跨敤鐨勮矾寰勮繘琛岃В閿�
-//                if (!result) {
-//                    return false;//璺緞瑙i攣澶辫触
-//                }
-//                //*************灏濊瘯瑙i攣鐩爣绔欒矾寰�***************
-//            }
 
             //灏忚溅宸茬粡鍦ㄧ洰鏍囧簱浣嶏紝鐩存帴璁ゅ畾灏忚溅绉诲姩浠诲姟瀹屾垚
             if (shuttleProtocol.getCurrentLocNo().equals(wrkMast.getLocNo())) {
-                if (shuttleProtocol.getToken().equals(wrkMast.getWrkNo())) {
-                    //閲婃斁灏忚溅浠ょ墝
-                    shuttleProtocol.setToken(0);
-                }
-                wrkMast.setWrkSts(111L);//111.灏忚溅绉诲姩瀹屾垚
+                wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts);//311.灏忚溅绉诲姩瀹屾垚
                 wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈�
                 wrkMast.setModiTime(now);
-                wrkMastMapper.updateById(wrkMast);
-
-                shuttleProtocol.setShuttleNo((short) 0);//閲婃斁灏忚溅
-                shuttleProtocol.setToken(0);//閲婃斁灏忚溅
-
-                if (wrkMast.getWrkSts() == 111) {
-                    // 淇濆瓨宸ヤ綔涓绘。鍘嗗彶妗�
-                    if (wrkMastLogMapper.save(wrkMast.getWrkNo()) <= 0) {
-                        log.info("淇濆瓨宸ヤ綔鍘嗗彶妗workNo={0}]澶辫触", wrkMast.getWrkNo());
-                    }
-                    // 鍒犻櫎宸ヤ綔涓绘。
-                    if (!wrkMastService.deleteById(wrkMast)) {
-                        log.info("鍒犻櫎宸ヤ綔涓绘。[workNo={0}]澶辫触", wrkMast.getWrkNo());
-                    }
-                }
+                wrkMastService.updateById(wrkMast);
                 return false;
             }
 
-            NyShuttleOperaResult result = null;
+            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
+            assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//灏忚溅绉诲簱浠诲姟
+            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
+            assignCommand.setAuto(true);//鑷姩妯″紡
+            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�
+            assignCommand.setLocNo(wrkMast.getLocNo());//鐩爣搴撲綅
+
+            List<ShuttleCommand> commands = null;
             //璺ㄦゼ灞傜Щ鍔ㄤ换鍔�
             if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
-                //闇�瑕佸皢鍓嶄袱涓妭鐐逛綔涓虹櫧鍚嶅崟鑺傜偣浼犲叆
-                //鑾峰彇鐩爣绔�
-                LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
-                if (liftSta == null) {
-                    return false;//鎵句笉鍒扮珯鐐�
+                if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
+                    return false;//灏忚溅鏈埌杈剧洰鏍囧眰
                 }
 
-                List<NavigateNode> targetNodes = NyLiftUtils.getLiftStaNodes(liftSta.getStaNo());
+                //闇�瑕佸皢鍓嶄袱涓妭鐐逛綔涓虹櫧鍚嶅崟鑺傜偣浼犲叆
+                List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo());
                 if (targetNodes == null) {
                     return false;//鏈幏鍙栧埌鑺傜偣
                 }
@@ -3387,87 +1728,89 @@
                 for (NavigateNode node : targetNodes) {
                     whiteList.add(new int[]{node.getX(), node.getY()});
                 }
-                result = NyShuttleOperaUtils.getStartToTargetCommandsByWhites(shuttleThread.getSlave().getId(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, whiteList);
+                commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, whiteList, assignCommand, shuttleThread);
             }else {
                 //鑾峰彇灏忚溅鍒扮洰鏍囧簱浣嶅懡浠�
-                result = NyShuttleOperaUtils.getStartToTargetCommands(shuttleThread.getSlave().getId(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id);
+                commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
             }
 
-            if (result == null) {
+            if (commands == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                 return false;//璺緞璁$畻澶辫触
             }
-            List<NyShuttleHttpCommand> commands = result.getCommands();
 
-            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
-            assignCommand.setTaskMode(ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO.id.shortValue());//灏忚溅绉诲簱浠诲姟
-            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());//浠诲姟鍙�
-            assignCommand.setAuto(true);//鑷姩妯″紡
             assignCommand.setCommands(commands);
-            assignCommand.setNodes(result.getNodes());
-            assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣�
-            assignCommand.setLocNo(wrkMast.getLocNo());//鐩爣搴撲綅
 
-            if (wrkMast.getLiftNo() != null) {
-                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, wrkMast.getLiftNo());
-                if (liftThread == null) {
-                    return false;
-                }
-                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-                if (liftProtocol == null) {
-                    return false;
-                }
-                if (liftProtocol.getToken().equals(shuttleProtocol.getShuttleNo().intValue())) {
-                    liftProtocol.setToken(0);//閲婃斁鎻愬崌鏈轰护鐗�
-                }
-            }
-
-            wrkMast.setWrkSts(110L);//灏忚溅绉诲姩鍒扮洰鏍囧簱浣嶄腑  109.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� ==> 110.灏忚溅绉诲姩涓�
+            wrkMast.setWrkSts(WrkStsType.MOVE_SHUTTLE.sts);//灏忚溅绉诲姩鍒扮洰鏍囧簱浣嶄腑  309.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� ==> 310.灏忚溅绉诲姩涓�
             wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈�
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
             wrkMast.setModiTime(now);
 
-            if (wrkMastMapper.updateById(wrkMast) > 0) {
+            if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
-                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
+                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
             }
         }
         return true;
     }
 
-    //鎵弿璁惧PakMk鏍囪鏄惁瓒呮椂
-    public synchronized void scanDevicePakMk() {
-        try {
-            //鎵弿灏忚溅
-            for (ShuttleSlave slave : slaveProperties.getShuttle()) {
-                NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId());
-                NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-                if (shuttleProtocol == null) {
-                    continue;
-                }
-
-                if ((System.currentTimeMillis() - shuttleProtocol.getSendTime() > (1000 * 60 * 5)) && shuttleProtocol.getPakMk()) {
-                    //璁惧瓒呰繃5鍒嗛挓杩樻病澶嶄綅鏍囪
-                    shuttleProtocol.setPakMk(false);//澶嶄綅鏍囪
-                }
+    //鑷姩鍒囨崲鍑哄叆搴撴ā寮�
+    public void autoSwitchForkLiftIOMode() {
+        for (ForkLiftSlave forkLiftSlave : slaveProperties.getForkLift()) {
+            Integer liftNo = forkLiftSlave.getId();
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
+            if (forkLiftThread == null) {
+                continue;
+            }
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
+                continue;
             }
 
-            //鎵弿鎻愬崌鏈�
-            for (LiftSlave slave : slaveProperties.getLift()) {
-                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, slave.getId());
-                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-                if (liftProtocol == null) {
-                    continue;
-                }
+            //鑾峰彇鍏ュ簱浠诲姟
+            List<WrkMast> inWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .eq("lift_no", liftNo)
+                    .in("wrk_sts"
+                            , WrkStsType.NEW_INBOUND.sts
+                            , WrkStsType.INBOUND_DEVICE_RUN.sts
+                            , WrkStsType.INBOUND_LIFT_RUN.sts
+                            , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts
+                            , WrkStsType.INBOUND_SHUTTLE_RUN.sts
+                            , WrkStsType.INBOUND_SHUTTLE_RUN_COMPLETE.sts
+                    ));
 
-                if ((System.currentTimeMillis() - liftProtocol.getSendTime() > (1000 * 60 * 5)) && liftProtocol.getPakMk()) {
-                    //璁惧瓒呰繃5鍒嗛挓杩樻病澶嶄綅鏍囪
-                    liftProtocol.setPakMk(false);//澶嶄綅鏍囪
+            //鑾峰彇鍑哄簱浠诲姟
+            List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .eq("lift_no", liftNo)
+                    .in("wrk_sts"
+                            , WrkStsType.NEW_OUTBOUND.sts
+                            , WrkStsType.OUTBOUND_SHUTTLE_RUN.sts
+                            , WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts
+                            , WrkStsType.OUTBOUND_LIFT_RUN.sts
+                            , WrkStsType.OUTBOUND_LIFT_RUN_COMPLETE.sts
+                    ));
+
+            if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.NONE)) {
+                //鏈煡妯″紡
+                if (!inWrkMasts.isEmpty()) {
+                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
+                } else if (!outWrkMasts.isEmpty()) {
+                    forkLiftThread.switchIOMode(ForkLiftIoModeType.OUT);
+                }else {
+                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
+                }
+            } else if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.IN)) {
+                //鍏ュ簱妯″紡
+                if (inWrkMasts.isEmpty() && !outWrkMasts.isEmpty()) {
+                    forkLiftThread.switchIOMode(ForkLiftIoModeType.OUT);
+                }
+            } else if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.OUT)) {
+                //鍑哄簱妯″紡
+                if (outWrkMasts.isEmpty() && !inWrkMasts.isEmpty()) {
+                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
                 }
             }
-        } catch (Exception e) {
-            e.printStackTrace();
         }
-
     }
 
 }

--
Gitblit v1.9.1