From 314e894c0d6ce2739344dcd1c94ae7770868a0f1 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 28 五月 2025 14:51:16 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 2243 ++++++++++++++++++++++++++--------------------------------
 1 files changed, 994 insertions(+), 1,249 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 3760f91..9aabe1c 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1,9 +1,9 @@
 package com.zy.asrs.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 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;
@@ -22,10 +22,10 @@
 import com.zy.core.model.protocol.*;
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.thread.*;
+import com.zy.system.entity.Config;
 import com.zy.system.service.ConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -38,18 +38,10 @@
 @Service("mainService")
 public class MainServiceImpl {
 
-    @Value("${wms.url}")
-    private String wmsUrl;
     @Autowired
     private SlaveProperties slaveProperties;
     @Autowired
     private WrkMastService wrkMastService;
-    @Autowired
-    private WrkMastLogMapper wrkMastLogMapper;
-    @Autowired
-    private LocMastService locMastService;
-    @Autowired
-    private BasDevpService basDevpService;
     @Autowired
     private BasShuttleErrLogService basShuttleErrLogService;
     @Autowired
@@ -63,13 +55,9 @@
     @Autowired
     private BasMapService basMapService;
     @Autowired
-    private BasLiftService basLiftService;
-    @Autowired
     private ShuttleDispatchUtils shuttleDispatchUtils;
     @Autowired
     private RedisUtil redisUtil;
-    @Autowired
-    private BasLiftOptService basLiftOptService;
     @Autowired
     private ConfigService configService;
     @Autowired
@@ -86,470 +74,58 @@
     private ForkLiftAction forkLiftAction;
     @Autowired
     private NotifyUtils notifyUtils;
-
-
-//    /**
-//     * 缁勬墭
-//     * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗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();
-//        }
-//    }
+    @Autowired
+    private BasShuttleChargeService basShuttleChargeService;
 
     /**
      * 鍒濆鍖栧疄鏃跺湴鍥�
      */
     public synchronized void initRealtimeBasMap() {
         try {
-            for (int i = 1; i <= 4; 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();
+        }
+    }
+
+    /**
+     * 鍏ュ簱  ===>>  鍥涘悜绌挎杞﹀叆搴撲綔涓氫笅鍙�
+     */
+    public synchronized void shuttleInExecute() {
+        try {
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .in("wrk_sts"
+                            , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts
+                    )
+                    .orderBy("io_pri", false)
+                    .orderBy("appe_time", true)
+            );
+            for (WrkMast wrkMast : wrkMasts) {
+                boolean step1 = this.shuttleInExecuteStep1(wrkMast);//灏忚溅鎼叆搴撲腑
+                Thread.sleep(100);
+                if (!step1) {
+                    continue;
                 }
             }
         } catch (Exception e) {
@@ -557,271 +133,288 @@
         }
     }
 
-//    /**
-//     * 鍏ュ簱  ===>>  鍥涘悜绌挎杞﹀叆搴撲綔涓氫笅鍙�
-//     */
-//    public synchronized void shuttleInExecute() {
-//        try {
-//            List<WrkMast> wrkMasts = wrkMastMapper.selectInStep4();
-//            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);//灏忚溅鎼叆搴撲腑
-//                if (!step1) {
-//                    continue;
-//                }
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//    }
+    /**
+     * 鍏ュ簱-灏忚溅鎼叆搴撲腑
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    public synchronized 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;
+            }
 
-//    /**
-//     * 鍏ュ簱-灏忚溅鎼叆搴撲腑
-//     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
-//     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
-//     */
-//    public boolean shuttleInExecuteStep1(WrkMast wrkMast, LiftStaProtocol liftStaProtocol) {
-//        if (wrkMast.getWrkSts() == 4) {
-//            if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
-//                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftStaProtocol.getLocNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐�
-//                News.info("{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
-//                return false;
-//            }
-//
-//            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
-//            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.isIdle()) {
-//                News.info("{}浠诲姟锛寋}灏忚溅蹇欑涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-//                return false;
-//            }
-////            //鍒ゆ柇灏忚溅浠ょ墝鏄惁鏈鍗犻
-////            if (shuttleProtocol.getToken() != 0) {
-////                News.info("{}浠诲姟锛寋}灏忚溅锛屼护鐗屽凡琚嫭鍗狅紝绂佹娲惧彂浠诲姟", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-////                return false;//灏忚溅宸茶鐙崰锛岀姝㈠啀娲惧彂浠诲姟
-////            }
-//
-//            //鍒ゆ柇灏忚溅鏄惁瀛樺湪绉诲姩浠诲姟
-//            WrkMast hasMoveWorking = wrkMastMapper.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
-//            if (hasMoveWorking != null) {
-//                News.info("{}浠诲姟锛寋}灏忚溅锛屽瓨鍦ㄧЩ鍔ㄤ换鍔★紝绂佹娲惧彂浠诲姟", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-//                return false;//瀛樺湪绉诲姩浠诲姟锛岀姝㈡墽琛屽叆搴撲换鍔�
-//            }
-//
-//            //鍒ゆ柇灏忚溅鏄惁鍒拌揪杈撻�佺珯鐐瑰簱浣�
-//            if (!shuttleProtocol.getCurrentLocNo().equals(liftStaProtocol.getLocNo())) {
-//                //灏忚溅涓嶅湪杈撻�佺珯鐐逛綅缃�
-//                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftStaProtocol.getLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐�
-//                News.info("{}浠诲姟锛寋}灏忚溅锛屾湭鍒拌揪杈撻�佺珯鐐癸紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-//                return false;
-//            }
-//
-//            //灏忚溅宸叉姷杈捐緭閫佺珯鐐逛綅缃紝杩涜鎼繍璐х墿
-//            ShuttleOperaResult result = ShuttleOperaUtils.getShuttleTransportCommands(wrkMast.getShuttleNo(), wrkMast.getWrkNo(), shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo());
-//            if (result == null) {//璺緞璁$畻澶辫触
-//                News.info("{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐ワ紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-//                return false;
-//            }
-//
-//            //鍒涘缓鍒嗛厤鍛戒护
-//            ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-//            assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//鍥涘悜绌挎杞﹀彿
-//            assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙�
-//            assignCommand.setTaskMode(ShuttleTaskModeType.PAK_IN.id);//鍏ュ簱妯″紡
-//            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));
-//            }
-//
-//            return false;
-//        }
-//        return true;
-//    }
+            if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
+                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftSta.getLocNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐�
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
+                return false;
+            }
 
-//    /**
-//     * 鍑哄簱  ===>>  鍥涘悜绌挎杞﹀嚭搴撲綔涓氫笅鍙�
-//     */
-//    public synchronized void shuttleOutExecute() {
-//        try {
-//            for (WrkMast wrkMast : wrkMastMapper.selectBy2125()) {
-//                boolean step1 = this.shuttleOutExecuteStep1(wrkMast);//灏忚溅鎼嚭搴撲腑
-//                if (!step1) {
-//                    continue;
-//                }
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//    }
-//
-//    /**
-//     * 鍑哄簱-灏忚溅鎼嚭搴撲腑
-//     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
-//     * 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;//鍑哄簱璺緞涓嶅瓨鍦�
-//            }
-//
-//            //鑾峰彇鍑哄簱绔欑偣
-//            BasDevp basDevp = basDevpService.selectById(wrkMast.getStaNo());
-//            if (basDevp == 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;//娴呭簱浣嶅瓨鍦ㄦ湭鎵ц浠诲姟
-//            }
-//
-//            //鑾峰彇婧愮珯
-//            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(basDevp.getLiftNo(), Utils.getLev(wrkMast.getSourceLocNo()));
-//            if (liftStaProtocol == null) {
-//                return false;//鎵句笉鍒扮珯鐐�
-//            }
-//
-//            if (!(liftStaProtocol.getModel() && !liftStaProtocol.getBusy() && !liftStaProtocol.getHasTray())) {
-//                News.info("{}浠诲姟锛寋}鍐呴儴杈撻�佺珯锛屼笉婊¤冻鑷姩銆佺┖闂层�佹棤鎵樼洏鐘舵��", wrkMast.getWrkNo(), liftStaProtocol.getStaNo());
-//                return false;//绔欑偣蹇呴』鑷姩銆佺┖闂层�佹病鏈夋墭鐩�
-//            }
-//
-//            if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
-//                //寮哄埗棰勭暀涓�鍙板皬杞︾粰鍏ュ簱浠诲姟
-//                int lev = Utils.getLev(wrkMast.getSourceLocNo());
-//                //鑾峰彇褰撳墠妤煎眰鏈夊嚑鍙板彲鐢ㄥ皬杞�
-//                int shuttleCount = shuttleDispatchUtils.getShuttleCountByLev(lev);
-//                if (shuttleCount >= 2) {//鍙湁鍙敤灏忚溅鏁伴噺澶т簬2锛屾墠杩涜鍏ュ簱浠诲姟棰勭暀灏忚溅
-//                    int shuttleWrkInObligateCount = 1;//棰勭暀灏忚溅鏁伴噺
-//                    Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleWrkInObligateCount").eq("status", 1));
-//                    if (config != null) {
-//                        shuttleWrkInObligateCount = Integer.parseInt(config.getValue());
-//                    }
-//                    //鍙敤鍑哄簱灏忚溅鏁伴噺(缁欏叆搴撲换鍔¢鐣欎竴鍙拌溅)
-//                    int useShuttleCount = shuttleCount - shuttleWrkInObligateCount;
-//                    //鏌ヨ妤煎眰宸插垎閰嶈溅杈嗙殑鍑哄簱浠诲姟鏁伴噺
-//                    List<WrkMast> wrkMasts = wrkMastService.selectShuttleOutWrkByLev(lev);
-//                    if (wrkMasts.size() >= useShuttleCount) {
-//                        News.info("{}浠诲姟锛屽綋鍓嶆ゼ灞傚彲鐢ㄥ皬杞}鍙帮紝鍑哄簱浠诲姟宸插垎閰峽}鍙帮紝绯荤粺绛夊緟涓��", wrkMast.getWrkNo(), useShuttleCount, wrkMasts.size());
-//                        return false;
-//                    }
-//                }
-//                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄥ簱浣嶈繘琛屽彇璐�
-//                News.info("{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓��", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
-//                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()) {
-//                News.info("{}浠诲姟锛寋}灏忚溅锛屽繖纰屼腑", 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());
-//                return false;
-//            }
-//
-//            //灏忚溅宸叉姷杈捐揣鐗╀綅缃紝杩涜鎼繍璐х墿
-//            ShuttleOperaResult result = ShuttleOperaUtils.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());//璺緞鑺傜偣
-//
-//            wrkMast.setWrkSts(22L);//21.鐢熸垚鍑哄簱浠诲姟 => 22.灏忚溅鎼繍涓�
-//            wrkMast.setModiTime(new Date());
-//            shuttleProtocol.setToken(wrkMast.getWrkNo());//鐙崰灏忚溅浠ょ墝
-//            if (wrkMastMapper.updateById(wrkMast) > 0) {
-//                //涓嬪彂浠诲姟
-//                MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand));
-//            }
-//            return false;
-//        }
-//        return true;
-//    }
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            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.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅蹇欑涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            //鍒ゆ柇灏忚溅鏄惁瀛樺湪绉诲姩浠诲姟
+            WrkMast hasMoveWorking = wrkMastService.selectShuttleHasMoveWorking(wrkMast.getShuttleNo());
+            if (hasMoveWorking != null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}鍙峰皬杞︼紝瀛樺湪绉诲姩浠诲姟锛岀姝㈡淳鍙戜换鍔�", wrkMast.getShuttleNo());
+                return false;//瀛樺湪绉诲姩浠诲姟锛岀姝㈡墽琛屽叆搴撲换鍔�
+            }
+
+            //鍒ゆ柇灏忚溅鏄惁鍒拌揪杈撻�佺珯鐐瑰簱浣�
+            if (!shuttleProtocol.getCurrentLocNo().equals(liftSta.getLocNo())) {
+                //灏忚溅涓嶅湪杈撻�佺珯鐐逛綅缃�
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftSta.getLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐�
+                News.info("{}浠诲姟锛寋}灏忚溅锛屾湭鍒拌揪杈撻�佺珯鐐癸紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            //妫�娴嬮殰纰嶇墿杞�
+            boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
+                add(shuttleProtocol.getShuttleNo());
+            }});
+            if (checkObstacle) {
+                News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
+                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(liftSta.getLocNo(), 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.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;
+    }
+
+    /**
+     * 鍑哄簱  ===>>  鍥涘悜绌挎杞﹀嚭搴撲綔涓氫笅鍙�
+     */
+    public synchronized void shuttleOutExecute() {
+        try {
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .in("wrk_sts"
+                            , WrkStsType.NEW_OUTBOUND.sts
+                    )
+                    .orderBy("io_pri", false)
+                    .orderBy("appe_time", true)
+            );
+            for (WrkMast wrkMast : wrkMasts) {
+                boolean step1 = this.shuttleOutExecuteStep1(wrkMast);//灏忚溅鎼嚭搴撲腑
+                Thread.sleep(100);
+                if (!step1) {
+                    continue;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鍑哄簱-灏忚溅鎼嚭搴撲腑
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    public synchronized boolean shuttleOutExecuteStep1(WrkMast wrkMast) {
+        //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;
+                }
+            }
+
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
+            if (forkLiftThread == null) {
+                return false;
+            }
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
+                return false;
+            }
+
+            //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀浜庡嚭搴撴ā寮�
+            if (!forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.OUT)) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾彁鍗囨満涓嶅浜庡嚭搴撴ā寮忥紝绂佹鍑哄簱", wrkMast.getWrkNo());
+                return false;
+            }
+
+            //鑾峰彇婧愮珯
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByLev(liftNo, Utils.getLev(wrkMast.getSourceLocNo()));
+            if (liftSta == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀己灏戠珯鐐逛俊鎭紝绂佹娲惧彂", wrkMast.getWrkNo());
+                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;
+            }
+
+            boolean checkLocPathIsAvailable = navigateUtils.checkLocPathIsAvailable(wrkMast.getSourceLocNo(), liftSta.getLocNo());
+            if(!checkLocPathIsAvailable) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭璁$畻鍒板彲鎵ц璺緞锛岀瓑寰呬腑", wrkMast.getWrkNo());
+                return false;
+            }
+
+            if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
+                //寮哄埗棰勭暀涓�鍙板皬杞︾粰鍏ュ簱浠诲姟
+                int lev = Utils.getLev(wrkMast.getSourceLocNo());
+                //鑾峰彇褰撳墠妤煎眰鏈夊嚑鍙板彲鐢ㄥ皬杞�
+                int shuttleCount = shuttleDispatchUtils.getShuttleCountByLev(lev);
+                if (shuttleCount >= 2) {//鍙湁鍙敤灏忚溅鏁伴噺澶т簬2锛屾墠杩涜鍏ュ簱浠诲姟棰勭暀灏忚溅
+                    int shuttleWrkInObligateCount = 1;//棰勭暀灏忚溅鏁伴噺
+                    Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleWrkInObligateCount").eq("status", 1));
+                    if (config != null) {
+                        shuttleWrkInObligateCount = Integer.parseInt(config.getValue());
+                    }
+                    //鍙敤鍑哄簱灏忚溅鏁伴噺(缁欏叆搴撲换鍔¢鐣欎竴鍙拌溅)
+                    int useShuttleCount = shuttleCount - shuttleWrkInObligateCount;
+                    //鏌ヨ妤煎眰宸插垎閰嶈溅杈嗙殑鍑哄簱浠诲姟鏁伴噺
+                    List<WrkMast> wrkMasts = wrkMastService.selectShuttleOutWrkByLev(lev);
+                    if (wrkMasts.size() >= useShuttleCount) {
+                        News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽綋鍓嶆ゼ灞傚彲鐢ㄥ皬杞}鍙帮紝鍑哄簱浠诲姟宸插垎閰峽}鍙帮紝绯荤粺绛夊緟涓��", wrkMast.getWrkNo(), useShuttleCount, wrkMasts.size());
+                        return false;
+                    }
+                }
+                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄥ簱浣嶈繘琛屽彇璐�
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓��", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
+                return false;
+            }
+
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            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.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽繖纰屼腑", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                return false;
+            }
+
+            //鍒ゆ柇灏忚溅鏄惁鍒拌揪璐х墿搴撲綅
+            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) {
+                //妫�娴嬮殰纰嶇墿杞�
+                boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getSourceLocNo(), new ArrayList<Integer>() {{
+                    add(shuttleProtocol.getShuttleNo());
+                }});
+                if (checkObstacle) {
+                    News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
+                    return false;
+                }
+
+                //灏忚溅涓嶅湪杈撻�佺珯鐐逛綅缃�
+                shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄥ簱浣嶈繘琛屽彇璐�
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屾湭鍒拌揪杈撻�佺珯鐐癸紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
+                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(), 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());
+            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;
+    }
 
     /**
      * 鍥涘悜绌挎杞︿换鍔″畬鎴�
@@ -843,53 +436,43 @@
                     //灏嗕换鍔℃。鏍囪涓哄畬鎴�
                     WrkMast wrkMast = wrkMastService.selectByWorkNo(shuttleProtocol.getTaskNo());
                     if (wrkMast != null) {
-                        if (wrkMast.getWrkSts() == WrkStsType.MOVE_SITE.sts) {
+                        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()), NotifyMsgType.SHUTTLE_MOVE_COMPLETE);//瑙﹀彂閫氱煡
+                            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()), NotifyMsgType.SHUTTLE_POWER_COMPLETE);//瑙﹀彂閫氱煡
-                        }else {
+                            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;
                         }
-//                        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 302:
-//                                wrkMast.setWrkSts(WrkStsType.MOVE_SITE_COMPLETE.sts);
-//                                break;
-//                            case WrkStsType.MOVE_SHUTTLE.sts:
-//                                wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts);
-//                                shuttleThread.setSyncTaskNo(0);
-//                                break;
-//                            default:
-//                        }
 
                         if (wrkMastService.updateById(wrkMast)) {
                             //璁剧疆鍥涘悜绌挎杞︿负绌洪棽鐘舵��
@@ -920,329 +503,396 @@
         }
     }
 
-//    /**
-//     * 鎻愬崌鏈轰换鍔�
-//     */
-//    public synchronized void liftIoExecute() {
-//        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) {
-//                    continue;
-//                }
-//
-//                if (!liftProtocol.isIdle()) {
-//                    News.info("{}鍙锋彁鍗囨満锛屽繖纰屼腑", liftSlave.getId());
-//                    continue;
-//                }
-//
-//                //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚﹁鍗犵敤
-//                if (liftProtocol.getToken() != 0) {
-//                    News.info("{}鍙锋彁鍗囨満锛屼护鐗屽凡琚嫭鍗�", liftSlave.getId());
-//                    continue;
-//                }
-//
-//                //鎼滅储鏄惁鏈夊緟澶勭悊鐨勪换鍔�
-//                List<WrkMast> wrkMasts = wrkMastMapper.selectLiftStep223103();
-//                if (wrkMasts.isEmpty()) {
-//                    continue;
-//                }
-//
-//                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());
-//                        continue;
-//                    }
-//
-//                    boolean stepIn = this.liftIoExecuteStepIn(wrkMast);//鎻愬崌鏈哄叆搴�
-//                    if (!stepIn) {
-//                        continue;
-//                    }
-//
-//                    boolean stepOut = this.liftIoExecuteStepOut(wrkMast);//鎻愬崌鏈哄嚭搴�
-//                    if (!stepOut) {
-//                        continue;
-//                    }
-//                }
-//
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//    }
-//
-//    /**
-//     * 鎻愬崌鏈哄叆搴�
-//     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
-//     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
-//     */
-//    private boolean liftIoExecuteStepIn(WrkMast wrkMast) {
-//        //--------------------------------------鎻愬崌鏈哄叆搴�-----------------------------------------//
-//        Date now = new Date();
-//
-//        //2.璁惧涓婅蛋 ==> 3.鎻愬崌鏈烘惉杩愪腑
-//        if (wrkMast.getWrkSts() == 2) {
-//            //鑾峰彇婧愮珯
-//            BasDevp sourceBasDevp = basDevpService.selectById(wrkMast.getSourceStaNo());
-//            if (sourceBasDevp == 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 {
-//                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) {
-//                return false;
-//            }
-//            LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-//            if (liftProtocol == null) {
-//                return false;
-//            }
-//            if (!liftProtocol.isIdle()) {
-//                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽繖纰屼腑", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-//                return false;
-//            }
-//            //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚︽湭琚崰棰�
-//            if (liftProtocol.getToken() != 0) {
-//                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屼护鐗屽凡琚嫭鍗狅紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.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;//鏈夋墭鐩橈紝绂佹娲惧彂
-//            }
-//
-//            //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
-//            WrkMast liftWrkMast = wrkMastMapper.selectLiftWrkMast(liftThread.getSlave().getId());
-//            if (liftWrkMast != null) {
-//                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽綋鍓嶆彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.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());
-//                    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_TRAY.id.shortValue());
-//
-//            wrkMast.setWrkSts(3L);//2.璁惧涓婅蛋 ==> 3.鎻愬崌鏈烘惉杩愪腑
-//            wrkMast.setLiftNo(liftThread.getSlave().getId());//浠诲姟妗g粦瀹氭彁鍗囨満鍙�
-//            wrkMast.setModiTime(now);
-//            liftProtocol.setToken(wrkMast.getWrkNo());//鐙崰鎻愬崌鏈轰护鐗�
-//            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 liftIoExecuteStepOut(WrkMast wrkMast) {
-//        //--------------------------------------鎻愬崌鏈哄嚭搴�-----------------------------------------//
-//        Date now = new Date();
-//
-//        //23.灏忚溅鎼繍瀹屾垚 ==> 24.鎻愬崌鏈烘惉杩愪腑
-//        if (wrkMast.getWrkSts() == 23) {
-//            NyShuttleThread shuttleThread = (NyShuttleThread) 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;//鍑哄簱绔欑偣涓嶅瓨鍦�
-//            }
-//
-//            //鑾峰彇婧愮珯瀵瑰簲鐨勭墰鐪兼彁鍗囨満绔欑偣缂栧彿(璧风偣缂栧彿)
-//            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(basDevp.getLiftNo(), Utils.getLev(wrkMast.getSourceLocNo()));
-//            if (liftStaProtocol == null) {
-//                News.info("{}浠诲姟锛屾壘涓嶅埌绔欑偣锛岀姝㈡淳鍙�", wrkMast.getWrkNo());
-//                return false;//鎵句笉鍒扮珯鐐�
-//            }
-//            Integer startSta = liftStaProtocol.getStaNo();
-//
-//            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-//            if (shuttleProtocol.getCurrentLocNo().equals(liftStaProtocol.getLocNo())) {
-//                //灏忚溅杩樺湪杈撻�佺珯鐐�
-//                //璋冨害灏忚溅閬胯
-//                boolean result = Utils.searchEmptyGroupToMoveShuttle(Utils.getLev(wrkMast.getSourceLocNo()), wrkMast.getShuttleNo(), shuttleThread);
-//                if (!result) {
-//                    News.info("{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀湪杈撻�佺珯鐐硅皟搴﹀皬杞﹂伩璁╁け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
-//                    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) {
-//                return false;
-//            }
-//
-//            if (!liftProtocol.isIdle()) {
-//                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽繖纰屼腑", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-//                return false;
-//            }
-//            //鍒ゆ柇鎻愬崌鏈轰护鐗屾槸鍚︽湭琚崰棰�
-//            if (liftProtocol.getToken() != 0) {
-//                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屼护鐗屽凡琚嫭鍗狅紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-//                return false;//鎻愬崌鏈哄凡琚嫭鍗狅紝绂佹鍐嶆淳鍙戜换鍔�
-//            }
-//            //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
-//            WrkMast liftWrkMast = wrkMastMapper.selectLiftWrkMast(liftThread.getSlave().getId());
-//            if (liftWrkMast != null) {
-//                News.info("{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽綋鍓嶆彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftProtocol.getLiftNo());
-//                return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
-//            }
-//
-//            //鑾风洰鏍囩珯婧愮珯瀵瑰簲鐨勮緭閫佺珯鐐�
-//            BasDevp targetBasDevp = basDevpService.selectById(wrkMast.getStaNo());
-//            if (targetBasDevp == null) {
-//                News.info("{}浠诲姟锛寋}绔欑偣锛岀珯鐐逛笉瀛樺湪锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), wrkMast.getStaNo());
-//                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);
-//
-//            //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
-//            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.setModiTime(now);
-//            liftProtocol.setToken(wrkMast.getWrkNo());//鐙崰鎻愬崌鏈轰护鐗�
-//            if (wrkMastMapper.updateById(wrkMast) > 0) {
-//                //涓嬪彂浠诲姟
-//                MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand));
-//            }
-//
-//            return false;
-//        }
-//        return true;
-//    }
-//
+    /**
+     * 鎵ц绉诲簱浠诲姟
+     */
+    public synchronized void shuttleLocMoveExecute() {
+        try {
+            //鏌ヨ绉诲簱浠诲姟
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .in("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts)
+                    .orderBy("io_pri", false)
+                    .orderBy("appe_time", true)
+            );
+            for (WrkMast wrkMast : wrkMasts) {
+                boolean stepToTarget = this.shuttleLocMoveExecuteToTarget(wrkMast);//绉诲簱浠诲姟-灏忚溅鍘荤洰鏍囩偣
+                if (!stepToTarget) {
+                    continue;
+                }
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 绉诲簱浠诲姟-灏忚溅鍘荤洰鏍囩偣
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    private boolean shuttleLocMoveExecuteToTarget(WrkMast wrkMast) {
+        //--------------------------------------灏忚溅绉诲姩鑷崇珯鐐�-----------------------------------------//
+        Date now = new Date();
+
+        //灏忚溅绉诲姩鑷崇珯鐐�  501.鐢熸垚绉诲簱浠诲姟 ==> 502.灏忚溅鎼繍涓�
+        if (wrkMast.getWrkSts() == WrkStsType.NEW_LOC_MOVE.sts) {
+            boolean checkLocPathIsAvailable = navigateUtils.checkLocPathIsAvailable(wrkMast.getSourceLocNo(), wrkMast.getLocNo());
+            if(!checkLocPathIsAvailable) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭璁$畻鍒板彲鎵ц璺緞锛岀瓑寰呬腑", wrkMast.getWrkNo());
+                return false;
+            }
+
+            if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴�
+                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒拌揣鐗╃偣杩涜鍙栬揣
+                News.info("{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触");
+                return false;
+            }
+
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            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;
+            }
+
+            //妫�娴嬮殰纰嶇墿杞�
+            boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{
+                add(shuttleProtocol.getShuttleNo());
+            }});
+            if (checkObstacle) {
+                News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
+                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) {
+                boolean stepIn = this.liftIoExecuteStepIn(wrkMast);//鎻愬崌鏈哄叆搴�
+                if (!stepIn) {
+                    continue;
+                }
+
+                boolean stepOut = this.liftIoExecuteStepOut(wrkMast);//鎻愬崌鏈哄嚭搴�
+                if (!stepOut) {
+                    continue;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鎻愬崌鏈哄叆搴�
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    private boolean liftIoExecuteStepIn(WrkMast wrkMast) {
+        //--------------------------------------鎻愬崌鏈哄叆搴�-----------------------------------------//
+        Date now = new Date();
+
+        //1.鐢熸垚鍏ュ簱浠诲姟 ==> 3.鎻愬崌鏈烘惉杩愪腑
+        if (wrkMast.getWrkSts() == WrkStsType.NEW_INBOUND.sts) {
+            //鑾峰彇鐩爣杈撻�佺珯
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
+            if (liftSta == null) {
+                return false;//鎵句笉鍒扮珯鐐�
+            }
+
+            if (liftSta.getHasTray()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪鎵樼洏", wrkMast.getWrkNo());
+                return false;
+            }
+
+            if (liftSta.getHasCar()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪灏忚溅", wrkMast.getWrkNo());
+                return false;
+            }
+
+            Integer liftNo = wrkMast.getLiftNo();
+            if (liftNo == null) {
+                //鏈垎閰嶆彁鍗囨満
+                Integer staNo = wrkMast.getSourceStaNo();
+                liftNo = ForkLiftUtils.getConveyorBindLiftNo(staNo);
+                if(liftNo == null) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo());
+                    return false;
+                }
+
+                //鐢宠鎻愬崌鏈鸿祫婧�
+                boolean applyForkLift = forkLiftAction.applyForkLift(liftNo, wrkMast.getWrkNo());
+                if(!applyForkLift) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀敵璇锋彁鍗囨満璧勬簮澶辫触锛岀姝㈠叆搴�", wrkMast.getWrkNo());
+                    return false;
+                }
+                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 (!forkLiftThread.isIdle()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屽繖纰屼腑", wrkMast.getWrkNo(), liftSta.getLiftNo());
+                return false;
+            }
+
+            //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀浜庡叆搴撴ā寮�
+            if (!forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.IN)) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾彁鍗囨満涓嶅浜庡叆搴撴ā寮忥紝绂佹鍏ュ簱", wrkMast.getWrkNo());
+                return false;
+            }
+
+            //妫�娴嬫ゼ灞傛槸鍚︽湁鍙敤绌挎杞�
+            boolean checkLevHasShuttle = Utils.checkLevHasShuttle(liftSta.getLev());
+            if (!checkLevHasShuttle) {
+                if (wrkMast.getShuttleNo() != null) {
+                    return false;
+                }
+
+                //鑾峰彇灏忚溅寰呮満浣�
+                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;
+            }
+
+            //璇锋眰涓婄骇绯荤粺锛屾槸鍚﹀厑璁稿叆搴�
+            boolean inMission = ForkLiftUtils.queryInMission(wrkMast.getSourceStaNo(), liftSta.getLiftNo(), wrkMast.getWmsWrkNo());
+            if (!inMission) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屼笂绾х郴缁熶笉鍏佽鍏ュ簱", wrkMast.getWrkNo());
+                return false;
+            }
+
+            //鑾峰彇鎻愬崌鏈哄懡浠�
+            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(liftNo.shortValue());
+            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
+            assignCommand.setTaskMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue());
+
+            wrkMast.setWrkSts(WrkStsType.INBOUND_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑  1.鐢熸垚鍏ュ簱浠诲姟 ==> 3.鎻愬崌鏈烘惉杩愪腑
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
+            wrkMast.setModiTime(now);
+            if (wrkMastService.updateById(wrkMast)) {
+                //涓嬪彂浠诲姟
+                forkLiftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 鎻愬崌鏈哄嚭搴�
+     * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false
+     * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue
+     */
+    private boolean liftIoExecuteStepOut(WrkMast wrkMast) {
+        //--------------------------------------鎻愬崌鏈哄嚭搴�-----------------------------------------//
+        //103.灏忚溅鎼繍瀹屾垚 ==> 104.鎻愬崌鏈烘惉杩愪腑
+        if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts) {
+            //鑾峰彇婧愮珯
+            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo());
+            if (liftSta == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾壘涓嶅埌绔欑偣锛岀姝㈡淳鍙�", wrkMast.getWrkNo());
+                return false;//鎵句笉鍒扮珯鐐�
+            }
+
+            if(wrkMast.getShuttleNo() != null) {
+                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(liftSta.getLocNo())) {
+                    //灏忚溅杩樺湪杈撻�佺珯鐐�
+                    //鑾峰彇灏忚溅寰呮満浣�
+                    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;
+                    }
+                } else {
+                    //灏忚溅宸蹭笉鍦ㄨ緭閫佺珯鐐逛綅缃紝閲婃斁灏忚溅
+                    wrkMast.setShuttleNo(null);//閲婃斁灏忚溅
+                    wrkMast.setModiTime(new Date());
+                    wrkMastService.updateById(wrkMast);
+                    return false;
+                }
+                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;
+            }
+
+            Integer liftNo = wrkMast.getLiftNo();
+            if (liftNo == null) {
+                //鏈垎閰嶆彁鍗囨満
+                Integer staNo = wrkMast.getStaNo();
+                liftNo = ForkLiftUtils.getConveyorBindLiftNo(staNo);
+                if(liftNo == null) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo());
+                    return false;
+                }
+                //鐢宠鎻愬崌鏈鸿祫婧�
+                boolean applyForkLift = forkLiftAction.applyForkLift(liftSta.getLiftNo(), wrkMast.getWrkNo());
+                if(!applyForkLift) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀敵璇锋彁鍗囨満璧勬簮澶辫触锛岀姝㈡墽琛屽嚭搴�", wrkMast.getWrkNo());
+                    return false;
+                }
+                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 (!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;
+            }
+
+            //璇锋眰涓婄骇绯荤粺锛屾槸鍚﹀厑璁稿嚭搴�
+            boolean outMission = ForkLiftUtils.queryOutMission(wrkMast.getStaNo());
+            if (!outMission) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屼笂绾х郴缁熶笉鍏佽鍑哄簱", wrkMast.getWrkNo());
+                return false;
+            }
+
+            //鑾峰彇鎻愬崌鏈哄懡浠�
+            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(liftNo.shortValue());
+            assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue());
+            assignCommand.setTaskMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue());
+
+            wrkMast.setWrkSts(WrkStsType.OUTBOUND_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑  103.鐢熸垚鍏ュ簱浠诲姟 ==> 104.鎻愬崌鏈烘惉杩愪腑
+            wrkMast.setShuttleNo(null);//閲婃斁灏忚溅
+            wrkMast.setSystemMsg("");//娓呯┖娑堟伅
+            wrkMast.setModiTime(new Date());
+            if (wrkMastService.updateById(wrkMast)) {
+                //涓嬪彂浠诲姟
+                forkLiftAction.assignWork(wrkMast.getLiftNo(), assignCommand);
+            }
+            return false;
+        }
+        return true;
+    }
+
     /**
      * 璐у弶鎻愬崌鏈轰换鍔″畬鎴�
      */
@@ -1263,42 +913,37 @@
                     //灏嗕换鍔℃。鏍囪涓哄畬鎴�
                     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());
-//                                    }
-//                                }
-//                                break;
-                            case 306://306.鎻愬崌鏈烘惉杩愪腑 ==> 307.鎻愬崌鏈烘惉杩愬畬鎴�
-                                wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts);
-                                forkLiftThread.setSyncTaskNo(0);
-                                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);
+                            redisUtil.set(RedisKeyType.FORK_LIFT_PUT_COMPLETE.key + forkLiftProtocol.getLiftNo(), wrkMast.getWmsWrkNo(), 60 * 3);
+                        } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_LIFT_RUN.sts) {
+                            //306.鎻愬崌鏈烘惉杩愪腑 ==> 307.鎻愬崌鏈烘惉杩愬畬鎴�
+                            wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts);
+                            forkLiftThread.setSyncTaskNo(0);
                         }
-
                         wrkMast.setModiTime(new Date());
                         if (wrkMastService.updateById(wrkMast)) {
                             forkLiftThread.reset();
                             News.info("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬併�傛彁鍗囨満鍙�={}", forkLiftProtocol.getLiftNo());
                         } else {
                             News.error("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傛彁鍗囨満鍙�={}锛屽伐浣滃彿={}", forkLiftProtocol.getLiftNo(), forkLiftProtocol.getWrkNo());
+                        }
+                    }else {
+                        boolean checkPreviewDispatchForkLift = commonService.checkWorkNoContainMk(forkLiftProtocol.getWrkNo(), WrkIoType.FORKLIFT_MOVE.id);
+                        if (checkPreviewDispatchForkLift) {
+                            //灞炰簬鎻愬崌鏈洪璋冨害绉诲姩浠诲姟
+                            //鏃犲伐浣滄。鏀拺锛岀洿鎺ョ‘璁ゅ畬鎴�
+                            forkLiftThread.setSyncTaskNo(0);
+                            forkLiftThread.reset();
+                            News.info("宸茬‘璁ゆ彁鍗囨満棰勮皟搴︾Щ鍔ㄤ换鍔°�傛彁鍗囨満鍙�={}", forkLiftProtocol.getLiftNo());
                         }
                     }
                 }
@@ -1465,112 +1110,17 @@
         }
     }
 
-    // -------------------------------------------------------------------------------
-
-//    /**
-//     * 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
-//     */
-//    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();
-//        }
-//    }
-
     /**
      * 鍥涘悜绌挎杞︾數閲忔娴� ===>> 鍙戣捣鍏呯數
      */
     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()) {
                 //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
                 ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
@@ -1591,17 +1141,21 @@
 
                 //灏忚溅鎵�鍦ㄦゼ灞�
                 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 (wrkMastService.selectChargeWorkingByChargeSta(chargeType.id) == null) {
-                        shuttleCharge = chargeType;
+                    if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) {
+                        shuttleCharge = charge;
                         break;
                     }
                 }
@@ -1609,17 +1163,22 @@
                 if (shuttleCharge == null) {
                     //鍚屾ゼ灞傛病鏈夋壘鍒板厖鐢垫々锛屾壘鍙敤鍏呯數妗�
                     //灏忚溅鍚屾ゼ灞傛病鏈夊厖鐢垫々锛屽彧瑕佸厖鐢垫々鍙敤灏辩敓鎴愬厖鐢典换鍔�
-                    for (ShuttleChargeType chargeType : ShuttleChargeType.values()) {
-                        if (wrkMastService.selectChargeWorkingByChargeSta(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;
                         }
                     }
@@ -1629,9 +1188,9 @@
                     continue;
                 }
 
-                String chargeLocNo = shuttleCharge.locNo;
+                String chargeLocNo = shuttleCharge.getLocNo();
                 wrkMast = new WrkMast();
-                wrkMast.setMk(String.valueOf(shuttleCharge.id));
+                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.鍏呯數
@@ -1750,7 +1309,7 @@
                 return false;
             }
 
-            if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getLocNo())) {
+            if (!wrkMast.getLocNo().equals(shuttleProtocol.getCurrentLocNo())) {
                 return false;
             }
 
@@ -1795,7 +1354,7 @@
             //涓嬪彂浠诲姟
             shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
 
-            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), NotifyMsgType.SHUTTLE_POWER_START);//瑙﹀彂閫氱煡
+            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_POWER_START);//瑙﹀彂閫氱煡
             return false;
         }
         return true;
@@ -1846,13 +1405,22 @@
                 return false;
             }
 
-            ShuttleChargeType chargeType = ShuttleChargeType.get(Integer.parseInt(wrkMast.getMk()));
-            if(chargeType == null) {
+            BasShuttleCharge basShuttleCharge = basShuttleChargeService.selectOne(new EntityWrapper<BasShuttleCharge>().eq("charge_id", wrkMast.getMk()));
+            if(basShuttleCharge == null) {
+                return false;
+            }
+
+            //妫�娴嬮殰纰嶇墿杞�
+            boolean checkObstacle = shuttleOperaUtils.checkObstacle(basShuttleCharge.getWaitLocNo(), new ArrayList<Integer>() {{
+                add(shuttleProtocol.getShuttleNo());
+            }});
+            if (checkObstacle) {
+                News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo());
                 return false;
             }
 
             //璋冨害灏忚溅鍘诲緟鏈轰綅
-            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), chargeType.waitLocNo, wrkMast.getShuttleNo());
+            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), basShuttleCharge.getWaitLocNo(), wrkMast.getShuttleNo());
             if (!dispatched) {
                 return false;
             }
@@ -1945,11 +1513,40 @@
                 return false;//鎵句笉鍒扮珯鐐�
             }
 
-            //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟(璇ヤ换鍔¢渶瑕佹崲灞傚繀椤绘彁鍓嶇嫭鍗犳彁鍗囨満)
-            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftSta.getLiftNo());
-            if (liftWrkMast != null) {
-                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getLiftNo());
-                return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
+            if (liftSta.getHasTray()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾簮绔欏瓨鍦ㄦ墭鐩�", wrkMast.getWrkNo());
+                return false;
+            }
+
+            if (liftSta.getHasCar()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾簮绔欏瓨鍦ㄥ皬杞�", wrkMast.getWrkNo());
+                return false;
+            }
+
+            //鑾峰彇鐩爣杈撻�佺珯
+            ForkLiftStaProtocol liftStaTarget = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
+            if (liftStaTarget == null) {
+                return false;//鎵句笉鍒扮珯鐐�
+            }
+
+            if (liftStaTarget.getHasTray()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪鎵樼洏", wrkMast.getWrkNo());
+                return false;
+            }
+
+            if (liftStaTarget.getHasCar()) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪灏忚溅", wrkMast.getWrkNo());
+                return false;
+            }
+
+            if (wrkMast.getLiftNo() == null) {
+                //鐢宠鎻愬崌鏈鸿祫婧�(璇ヤ换鍔¢渶瑕佹崲灞傚繀椤绘彁鍓嶇嫭鍗犳彁鍗囨満)
+                boolean applyForkLift = forkLiftAction.applyForkLift(liftSta.getLiftNo(), wrkMast.getWrkNo());
+                if(!applyForkLift) {
+                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀敵璇锋彁鍗囨満璧勬簮澶辫触锛岀姝㈢Щ鍔ㄨ嚦绔欑偣", wrkMast.getWrkNo());
+                    return false;
+                }
+                return false;
             }
 
             //*************灏濊瘯閿佸畾鐩爣绔欒矾寰�***************
@@ -1990,14 +1587,12 @@
 
             wrkMast.setWrkSts(WrkStsType.MOVE_SITE.sts);//灏忚溅绉诲姩鍒版彁鍗囨満涓�  301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷崇珯鐐�
             wrkMast.setModiTime(now);
-            wrkMast.setLiftNo(liftSta.getLiftNo());//鎻愬墠閿佸畾鎻愬崌鏈�
             wrkMast.setSystemMsg("");//娓呯┖娑堟伅
-//            shuttleProtocol.setToken(wrkMast.getWrkNo());//鐙崰璇ュ皬杞︿护鐗�
             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);
                 //瑙﹀彂閫氱煡
-                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), NotifyMsgType.SHUTTLE_MOVING);
                 return false;
             }
             return false;
@@ -2027,14 +1622,6 @@
             if (!forkLiftThread.isIdle()) {
                 News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満蹇欑涓紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                 return false;
-            }
-            //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
-            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo());
-            if (liftWrkMast != null) {
-                if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚�
-                    News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo());
-                    return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇�
-                }
             }
 
             //鑾峰彇婧愮珯
@@ -2176,6 +1763,10 @@
             List<ShuttleCommand> commands = null;
             //璺ㄦゼ灞傜Щ鍔ㄤ换鍔�
             if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
+                if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
+                    return false;//灏忚溅鏈埌杈剧洰鏍囧眰
+                }
+
                 //闇�瑕佸皢鍓嶄袱涓妭鐐逛綔涓虹櫧鍚嶅崟鑺傜偣浼犲叆
                 List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo());
                 if (targetNodes == null) {
@@ -2213,4 +1804,158 @@
         return true;
     }
 
+    //鑷姩鍒囨崲鍑哄叆搴撴ā寮�
+    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;
+            }
+
+            List<Integer> liftAllStaNo = ForkLiftUtils.getLiftAllStaNo(liftNo);
+            if (liftAllStaNo.isEmpty()) {
+                continue;
+            }
+
+            List<Integer> conveyorBindLiftAllStaNo = ForkLiftUtils.getConveyorBindLiftAllStaNo(liftNo);
+            if (conveyorBindLiftAllStaNo.isEmpty()) {
+                continue;
+            }
+
+            //鑾峰彇鍏ュ簱浠诲姟
+            List<WrkMast> inWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .in("sta_no", liftAllStaNo)
+                    .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
+                    ));
+
+            //鑾峰彇鍑哄簱浠诲姟
+            List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                    .in("sta_no", conveyorBindLiftAllStaNo)
+                    .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);
+                }
+            }
+        }
+    }
+
+    //鍑哄簱浠诲姟棰勮皟搴︽彁鍗囨満
+    public void outTaskPreviewDispatchForkLift() {
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                .in("wrk_sts"
+                        , WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts
+                ));
+        for (WrkMast wrkMast : wrkMasts) {
+            if(wrkMast.getShuttleNo() == null){
+                continue;
+            }
+
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                continue;
+            }
+
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+
+            if(shuttleProtocol.getCurrentLocNo() == null){
+                continue;
+            }
+
+            //閫氳繃杈撻�佺嚎绔欏彿鑾峰彇鎻愬崌鏈哄彿
+            Integer liftNo = ForkLiftUtils.getConveyorBindLiftNo(wrkMast.getStaNo());
+            if (liftNo == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo());
+                continue;
+            }
+
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
+            if (forkLiftThread == null) {
+                continue;
+            }
+
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
+                continue;
+            }
+
+            //瀛樺湪璋冨害閿�
+            Object object = redisUtil.get(RedisKeyType.OUT_TASK_PREVIEW_DISPATCH_FORKLIFT.key + forkLiftProtocol.getLiftNo());
+            if (object != null) {
+                continue;
+            }
+
+            //鐢宠鎻愬崌鏈鸿祫婧�
+            boolean applyForkLift = forkLiftAction.applyForkLift(liftNo, null);
+            if(!applyForkLift) {
+                continue;//鎻愬崌鏈哄凡琚粦瀹氾紝涓嶅啀鎵ц棰勮皟搴︿换鍔�
+            }
+
+            if (!forkLiftThread.isIdle()) {
+                continue;
+            }
+
+            //鎻愬崌鏈轰笉鍦ㄥ嚭搴撳眰
+            if (forkLiftProtocol.getLev().equals(Utils.getLev(wrkMast.getSourceLocNo()))) {
+                continue;
+            }
+
+            //绉诲姩
+            int workNo = commonService.getWorkNo(WrkIoType.FORKLIFT_MOVE.id);//鑾峰彇浠诲姟鍙�
+
+            //鑾峰彇鎻愬崌鏈哄懡浠�
+            List<ForkLiftCommand> liftCommand = forkLiftThread.getMoveCommand(workNo, forkLiftProtocol.getLev(), Utils.getLev(wrkMast.getSourceLocNo()));
+            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
+            commands.addAll(liftCommand);
+
+            //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
+            LiftAssignCommand assignCommand = new LiftAssignCommand();
+            assignCommand.setCommands(commands);
+            assignCommand.setLiftNo(forkLiftProtocol.getLiftNo().shortValue());
+            assignCommand.setTaskNo((short) workNo);
+            assignCommand.setTaskMode(ForkLiftTaskModeType.MOVE.id.shortValue());
+
+            forkLiftAction.assignWork(forkLiftProtocol.getLiftNo(), assignCommand);
+
+            redisUtil.set(RedisKeyType.OUT_TASK_PREVIEW_DISPATCH_FORKLIFT.key + forkLiftProtocol.getLiftNo(), "lock", 30);//30绉掍笉鍐嶈皟搴�
+        }
+    }
+
 }

--
Gitblit v1.9.1