From dca1ee5b00f00dcf8c43776eb60bdd23e5cca056 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期二, 26 三月 2024 15:23:29 +0800
Subject: [PATCH] Merge branch 'Four-Way-Rack' of http://47.97.1.152:5880/r/zy-asrs-master into Four-Way-Rack

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/MotionCtgService.java              |    2 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/ShuttleProtocol.java        |   24 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/ShuttleRunDirection.java      |   63 ++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/ShuttleTaskModeType.java      |   63 ++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java        |  112 ++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java        |   36 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java               |  217 ++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java            |   84 +++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleCommand.java         |   90 ---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java                  |  278 ++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java                          |   50 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java |  472 +++++++++--------
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Motion.java                         |    9 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/ShuttleThread.java                  |    8 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/MotionCtgServiceImpl.java     |    6 
 15 files changed, 1,195 insertions(+), 319 deletions(-)

diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
index 19a0fed..52006b7 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
@@ -1,102 +1,108 @@
-//package com.zy.asrs.wcs.core.kernel.command;
-//
-//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-//import com.zy.asrs.wcs.core.model.command.ShuttleAssignCommand;
-//import com.zy.asrs.wcs.core.model.command.ShuttleCommand;
-//import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
-//import com.zy.asrs.wcs.core.model.enums.MotionStsType;
-//import com.zy.asrs.wcs.core.service.BasShuttleService;
-//import com.zy.asrs.wcs.core.service.LocService;
-//import com.zy.asrs.wcs.core.service.TaskService;
-//import com.zy.asrs.wcs.core.utils.NavigateMapUtils;
-//import com.zy.asrs.wcs.core.utils.RedisUtil;
-//import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
-//import com.zy.asrs.wcs.rcs.entity.Motion;
-//import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
-//import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
-//import com.zy.asrs.wcs.rcs.service.MotionService;
-//import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.stereotype.Service;
-//
-//import java.util.ArrayList;
-//import java.util.List;
-//import java.util.Objects;
-//import java.util.Optional;
-//
-///**
-// * Created by vincent on 2023/10/23
-// */
-//@Slf4j
-//@Service
-//public class ShuttleCommandService {
-//
-//    public static final Integer SHUTTLE_ADDITION_COMMAND_SPEED = 500;
-//
-//    @Autowired
-//    private RedisUtil redisUtil;
-//    @Autowired
-//    private MotionService motionService;
-//    @Autowired
-//    private TaskService taskService;
-//    @Autowired
-//    private BasShuttleService basShuttleService;
-//    @Autowired
-//    private LocService locService;
-//    @Autowired
-//    private NavigateMapUtils navigateMapUtils;
-//
-//    // 璁$畻
-//    public Boolean accept(Motion motion) {
-//        Integer deviceNo = Integer.parseInt(motion.getDevice());
-//        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo);
-//        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
-//        if (null == shuttleProtocol) {
-//            return false;
-//        }
-//        if (!shuttleProtocol.getIdle()) {//璁惧涓嶇┖闂�
-//            return false;
-//        }
-//        if (!shuttleProtocol.getPakMk()) {
-//            return false;
-//        }
-//        if (motionService.count(new LambdaQueryWrapper<Motion>()
-//                .eq(Motion::getDeviceCtg, DeviceCtgType.SHUTTLE.val())
-//                .eq(Motion::getDevice, motion.getDevice())
-//                .eq(Motion::getMotionSts, MotionStsType.EXECUTING.val())) > 0) {
-//            return false;
-//        }
-//
-//        ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
-//        assignCommand.setShuttleNo(deviceNo.shortValue());
-//        assignCommand.setTaskNo(motion.getWrkNo().shortValue());
-//        assignCommand.setSourceLocNo(motion.getOrigin());
-//        assignCommand.setLocNo(motion.getTarget());
-//
-//        List<ShuttleCommand> shuttleCommands = new ArrayList<>();
-//        ShuttleTaskModeType shuttleTaskModeType = null;
-//
+package com.zy.asrs.wcs.core.kernel.command;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wcs.core.entity.Loc;
+import com.zy.asrs.wcs.core.model.NavigateNode;
+import com.zy.asrs.wcs.core.model.command.ShuttleAssignCommand;
+import com.zy.asrs.wcs.core.model.command.ShuttleCommand;
+import com.zy.asrs.wcs.core.model.enums.*;
+import com.zy.asrs.wcs.core.service.BasShuttleService;
+import com.zy.asrs.wcs.core.service.LocService;
+import com.zy.asrs.wcs.core.service.TaskService;
+import com.zy.asrs.wcs.core.utils.*;
+import com.zy.asrs.wcs.rcs.News;
+import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
+import com.zy.asrs.wcs.rcs.entity.Motion;
+import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType;
+import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
+import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
+import com.zy.asrs.wcs.rcs.service.MotionService;
+import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * Created by vincent on 2023/10/23
+ */
+@Slf4j
+@Service
+public class ShuttleCommandService {
+
+    public static final Integer SHUTTLE_ADDITION_COMMAND_SPEED = 500;
+
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private MotionService motionService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private BasShuttleService basShuttleService;
+    @Autowired
+    private LocService locService;
+    @Autowired
+    private NavigateMapUtils navigateMapUtils;
+
+    // 璁$畻
+    public Boolean accept(Motion motion) {
+        Integer deviceNo = Integer.parseInt(motion.getDevice());
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo);
+        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+        if (null == shuttleProtocol) {
+            return false;
+        }
+        if (!shuttleProtocol.getIdle()) {//璁惧涓嶇┖闂�
+            return false;
+        }
+        if (!shuttleProtocol.getPakMk()) {
+            return false;
+        }
+        if (motionService.count(new LambdaQueryWrapper<Motion>()
+                .eq(Motion::getDeviceCtg, DeviceCtgType.SHUTTLE.val())
+                .eq(Motion::getDevice, motion.getDevice())
+                .eq(Motion::getMotionSts, MotionStsType.EXECUTING.val())) > 0) {
+            return false;
+        }
+
+        ShuttleAssignCommand assignCommand = new ShuttleAssignCommand();
+        assignCommand.setShuttleNo(deviceNo.shortValue());
+        assignCommand.setTaskNo(motion.getWrkNo().shortValue());
+        assignCommand.setSourceLocNo(motion.getOrigin());
+        assignCommand.setLocNo(motion.getTarget());
+
+        List<ShuttleCommand> shuttleCommands = new ArrayList<>();
+        ShuttleTaskModeType shuttleTaskModeType = null;
+
 //        SiemensLiftThread liftThread = null;
 //        LiftProtocol liftProtocol = null;
-//
-//        //鍒ゆ柇灏忚溅鐘舵��
-//        if (shuttleProtocol.getBusyStatusType().equals(ShuttleStatusType.IDLE)
-//                && shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.IDLE)
-//                && shuttleProtocol.getTaskNo().intValue() != 0
-//        ) {
-//            return false;
-//        }
-//
-//        switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){
-//            case SHUTTLE_MOVE:
-//                // 濡傛灉宸茬粡鍦ㄥ綋鍓嶆潯鐮佸垯杩囨护
-//                if (String.valueOf(shuttleProtocol.getCurrentCode()).equals(locMastService.selectById(motion.getTarget()).getQrCodeValue())) {
-//                    return true;
-//                }
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO;
-//                break;
+
+        //鍒ゆ柇灏忚溅鐘舵��
+        if (shuttleProtocol.getIdle()
+                && shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.IDLE)
+                && shuttleProtocol.getTaskNo() != 0
+        ) {
+            return false;
+        }
+
+        switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){
+            case SHUTTLE_MOVE:
+                // 濡傛灉宸茬粡鍦ㄥ綋鍓嶆潯鐮佸垯杩囨护
+                if (String.valueOf(shuttleProtocol.getCurrentCode()).equals(locService.getOne(new LambdaQueryWrapper<Loc>()
+                        .eq(Loc::getLocNo, motion.getTarget())
+                        .eq(Loc::getHostId, motion.getHostId())).getCode())) {
+                    return true;
+                }
+                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
+                shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO;
+                break;
 //            case SHUTTLE_MOVE_LIFT_PALLET://绌挎杞﹂《鍗囧苟绉诲姩
 //                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
 //                shuttleTaskModeType = ShuttleTaskModeType.PAK_IN;
@@ -345,76 +351,76 @@
 //                shuttleCommands.add(shuttleThread.getChargeSwitchCommand((short) 1));
 //                assignCommand.setCharge(Boolean.TRUE);
 //                break;
-//            default:
-//                throw new CoolException(motion.getMotionCtgEl() + "娌℃湁鎸囧畾浠诲姟浣滀笟娴佺▼锛侊紒锛�");
-//        }
-//
-//        if (Cools.isEmpty(shuttleCommands)) {
-//            return false;
-//        }
-//
-//        assert null != shuttleTaskModeType;
-//        assignCommand.setTaskMode(shuttleTaskModeType.id.shortValue());//鍏ュ嚭搴撴ā寮�
-//        assignCommand.setCommands(shuttleCommands);
-//
-//        if (motion.getOrigin() != null && motion.getTarget() != null) {
-//            //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
-//            boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(motion.getTarget()), shuttleProtocol.getShuttleNo().intValue(), assignCommand.getNodes(), true);//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
-//            if (!lockResult) {
-//                return false;//閿佸畾澶辫触
-//            }
+            default:
+                throw new CoolException(motion.getMotionCtgEl() + "娌℃湁鎸囧畾浠诲姟浣滀笟娴佺▼锛侊紒锛�");
+        }
+
+        if (Cools.isEmpty(shuttleCommands)) {
+            return false;
+        }
+
+        assert null != shuttleTaskModeType;
+        assignCommand.setTaskMode(shuttleTaskModeType.id.shortValue());//鍏ュ嚭搴撴ā寮�
+        assignCommand.setCommands(shuttleCommands);
+
+        if (motion.getOrigin() != null && motion.getTarget() != null) {
+            //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
+            boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(motion.getTarget()), Integer.parseInt(shuttleProtocol.getShuttleNo()), assignCommand.getNodes(), true);//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
+            if (!lockResult) {
+                return false;//閿佸畾澶辫触
+            }
 //            shuttleThread.assignWork(assignCommand);
-//        }else {
+        }else {
 //            shuttleThread.assignWork(assignCommand);
-//        }
-//
-//        return Boolean.TRUE;
-//    }
-//
-//    public Boolean finish(Motion motion) {
-//        Integer deviceNo = Integer.parseInt(motion.getDevice());
-//        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo);
-//        ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-//        if (null == shuttleProtocol) {
-//            return false;
-//        }
-//
-//        if (shuttleProtocol.getTaskNo() != 0 && shuttleProtocol.getTaskNo().intValue() != motion.getWrkNo()) {
-//            return false;
-//        }
-//
-//        //鍏呯數浠诲姟
-//        if (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl())).equals(MotionCtgType.SHUTTLE_CHARGE_ON)) {
-//            // 澶嶄綅绌挎杞�
-//            shuttleProtocol.setTaskNo((short) 0);
-//            shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
-//            shuttleProtocol.setPakMk(true);
-//            return true;
-//        }
-//
-//        if (!shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.WAITING)
-//            && !shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.CHARGING_WAITING)
-//        ) {
-//            return false;
-//        }
-//
-//        if (shuttleProtocol.getBusyStatusType().equals(ShuttleStatusType.BUSY)) {
-//            return false;
-//        }
-//
+        }
+
+        return Boolean.TRUE;
+    }
+
+    public Boolean finish(Motion motion) {
+        Integer deviceNo = Integer.parseInt(motion.getDevice());
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo);
+        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+        if (null == shuttleProtocol) {
+            return false;
+        }
+
+        if (shuttleProtocol.getTaskNo() != 0 && shuttleProtocol.getTaskNo().intValue() != motion.getWrkNo()) {
+            return false;
+        }
+
+        //鍏呯數浠诲姟
+        if (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl())).equals(MotionCtgType.SHUTTLE_CHARGE_ON)) {
+            // 澶嶄綅绌挎杞�
+            shuttleProtocol.setTaskNo(0);
+            shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+            shuttleProtocol.setPakMk(true);
+            return true;
+        }
+
+        if (!shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.WAITING)
+            && !shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.CHARGING_WAITING)
+        ) {
+            return false;
+        }
+
+        if (!shuttleProtocol.getIdle()) {
+            return false;
+        }
+
 //        SiemensLiftThread liftThread = null;
 //        LiftProtocol liftProtocol = null;
-//
-//        switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){
-//            case SHUTTLE_MOVE:
-//            case SHUTTLE_MOVE_LIFT_PALLET:
-//            case SHUTTLE_MOVE_DOWN_PALLET:
-//            case SHUTTLE_MOVE_TO_CONVEYOR:
-//            case SHUTTLE_MOVE_FROM_CONVEYOR:
-//                if (!shuttleProtocol.getCurrentLocNo().equals(motion.getTarget())) {
-//                    return false;
-//                }
-//                break;
+
+        switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){
+            case SHUTTLE_MOVE:
+            case SHUTTLE_MOVE_LIFT_PALLET:
+            case SHUTTLE_MOVE_DOWN_PALLET:
+            case SHUTTLE_MOVE_TO_CONVEYOR:
+            case SHUTTLE_MOVE_FROM_CONVEYOR:
+                if (!shuttleProtocol.getCurrentLocNo().equals(motion.getTarget())) {
+                    return false;
+                }
+                break;
 //            case SHUTTLE_MOVE_TO_LIFT:
 //            case SHUTTLE_MOVE_FROM_LIFT:
 //            case SHUTTLE_TRANSPORT_FROM_LIFT:
@@ -451,73 +457,73 @@
 //                }
 //
 //                break;
-//            default:
-//                break;
-//        }
-//
-//        // 澶嶄綅绌挎杞�
-//        shuttleProtocol.setTaskNo((short) 0);
-//        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
-//        shuttleProtocol.setPakMk(true);
-//
-//        return true;
-//    }
-//
-//    public synchronized List<ShuttleCommand> shuttleAssignCommand(String startLocNo, String endLocNo, Integer mapType, ShuttleAssignCommand assignCommand, ShuttleThread shuttleThread) {
-//        //鑾峰彇灏忚溅绉诲姩閫熷害
-//        Integer runSpeed = Optional.ofNullable(basShuttleService.selectById(assignCommand.getShuttleNo()).getRunSpeed()).orElse(1000);
-//
-//        List<NavigateNode> nodeList = NavigateUtils.calc(startLocNo, endLocNo, mapType, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), Utils.getLev(startLocNo)));
-//        if (nodeList == null) {
-//            News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo);
-//            return null;
-//        }
-//        List<NavigateNode> allNode = new ArrayList<>(nodeList);
-//
-//        List<ShuttleCommand> commands = new ArrayList<>();
-//        //鑾峰彇鍒嗘璺緞
-//        ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodeList);
-//        //灏嗘瘡涓�娈佃矾寰勫垎鎴恈ommand鎸囦护
-//        for (ArrayList<NavigateNode> nodes : data) {
-//            //寮�濮嬭矾寰�
-//            NavigateNode startPath = nodes.get(0);
-//
-//            //涓棿璺緞
-//            NavigateNode middlePath = null;
-//            //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
-//            Short middleCodeNum = null;
-//            Integer middleToDistDistance = null;//璁$畻涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
-//            if (nodes.size() > 10) {//涓鐮佷紶鍊掓暟绗笁涓�
-//                //涓棿璺緞
-//                middlePath = nodes.get(nodes.size() - 3);
-//                //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
-//                middleCodeNum = NavigatePositionConvert.xyToPosition(middlePath.getX(), middlePath.getY(), middlePath.getZ());
-//                middleToDistDistance = NavigateUtils.getMiddleToDistDistance(nodes, middlePath);//璁$畻涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
-//            } else if (nodes.size() > 5) {//涓鐮佷紶鍊掓暟绗簩涓�
-//                //涓棿璺緞
-//                middlePath = nodes.get(nodes.size() - 2);
-//                //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
-//                middleCodeNum = NavigatePositionConvert.xyToPosition(middlePath.getX(), middlePath.getY(), middlePath.getZ());
-//                middleToDistDistance = NavigateUtils.getMiddleToDistDistance(nodes, middlePath);//璁$畻涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
-//            }
-//
-//            //鐩爣璺緞
-//            NavigateNode endPath = nodes.get(nodes.size() - 1);
-//            Integer allDistance = NavigateUtils.getCurrentPathAllDistance(nodes);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
-//            //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
-//            Short startCodeNum = NavigatePositionConvert.xyToPosition(startPath.getX(), startPath.getY(), startPath.getZ());
-//            //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
-//            Short distCodeNum = NavigatePositionConvert.xyToPosition(endPath.getX(), endPath.getY(), endPath.getZ());
-//            //鑾峰彇绉诲姩鍛戒护
-//            ShuttleCommand command = shuttleThread.getMoveCommand(startCodeNum, distCodeNum, allDistance, ShuttleRunDirection.get(startPath.getDirection()).id, middleCodeNum, middleToDistDistance, runSpeed);
-//            command.setNodes(nodes);//灏嗚璧拌妭鐐规坊鍔犲埌姣忎竴姝ュ懡浠や腑
-//            commands.add(command);
-//        }
-//
-//        assignCommand.setNodes(allNode);//褰撳墠浠诲姟鎵�鍗犵敤鐨勮妭鐐筶ist
-//
-//        return commands;
-//    }
-//
-//
-//}
+            default:
+                break;
+        }
+
+        // 澶嶄綅绌挎杞�
+        shuttleProtocol.setTaskNo(0);
+        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+        shuttleProtocol.setPakMk(true);
+
+        return true;
+    }
+
+    public synchronized List<ShuttleCommand> shuttleAssignCommand(String startLocNo, String endLocNo, Integer mapType, ShuttleAssignCommand assignCommand, ShuttleThread shuttleThread) {
+        //鑾峰彇灏忚溅绉诲姩閫熷害
+        Integer runSpeed = Optional.ofNullable(basShuttleService.getById(assignCommand.getShuttleNo()).getRunSpeed()).orElse(1000);
+        Long hostId = shuttleThread.getDevice().getHostId();
+        List<NavigateNode> nodeList = NavigateUtils.calc(startLocNo, endLocNo, mapType, Utils.getShuttlePoints(Integer.parseInt(shuttleThread.getDevice().getDeviceNo()), Utils.getLev(startLocNo)));
+        if (nodeList == null) {
+            News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo);
+            return null;
+        }
+        List<NavigateNode> allNode = new ArrayList<>(nodeList);
+
+        List<ShuttleCommand> commands = new ArrayList<>();
+        //鑾峰彇鍒嗘璺緞
+        ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodeList);
+        //灏嗘瘡涓�娈佃矾寰勫垎鎴恈ommand鎸囦护
+        for (ArrayList<NavigateNode> nodes : data) {
+            //寮�濮嬭矾寰�
+            NavigateNode startPath = nodes.get(0);
+
+            //涓棿璺緞
+            NavigateNode middlePath = null;
+            //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
+            String middleCodeNum = null;
+            Integer middleToDistDistance = null;//璁$畻涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
+            if (nodes.size() > 10) {//涓鐮佷紶鍊掓暟绗笁涓�
+                //涓棿璺緞
+                middlePath = nodes.get(nodes.size() - 3);
+                //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
+                middleCodeNum = NavigatePositionConvert.xyToPosition(middlePath.getX(), middlePath.getY(), middlePath.getZ(), hostId);
+                middleToDistDistance = NavigateUtils.getMiddleToDistDistance(nodes, middlePath);//璁$畻涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
+            } else if (nodes.size() > 5) {//涓鐮佷紶鍊掓暟绗簩涓�
+                //涓棿璺緞
+                middlePath = nodes.get(nodes.size() - 2);
+                //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
+                middleCodeNum = NavigatePositionConvert.xyToPosition(middlePath.getX(), middlePath.getY(), middlePath.getZ(), hostId);
+                middleToDistDistance = NavigateUtils.getMiddleToDistDistance(nodes, middlePath);//璁$畻涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
+            }
+
+            //鐩爣璺緞
+            NavigateNode endPath = nodes.get(nodes.size() - 1);
+            Integer allDistance = NavigateUtils.getCurrentPathAllDistance(nodes);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
+            //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
+            String startCodeNum = NavigatePositionConvert.xyToPosition(startPath.getX(), startPath.getY(), startPath.getZ(), hostId);
+            //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
+            String distCodeNum = NavigatePositionConvert.xyToPosition(endPath.getX(), endPath.getY(), endPath.getZ(), hostId);
+            //鑾峰彇绉诲姩鍛戒护
+            ShuttleCommand command = shuttleThread.getMoveCommand(assignCommand.getTaskNo().intValue(), startCodeNum, distCodeNum, allDistance, ShuttleRunDirection.get(startPath.getDirection()).id.intValue(), runSpeed);
+            command.setNodes(nodes);//灏嗚璧拌妭鐐规坊鍔犲埌姣忎竴姝ュ懡浠や腑
+            commands.add(command);
+        }
+
+        assignCommand.setNodes(allNode);//褰撳墠浠诲姟鎵�鍗犵敤鐨勮妭鐐筶ist
+
+        return commands;
+    }
+
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleCommand.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleCommand.java
index 6756dc6..fcd1325 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleCommand.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleCommand.java
@@ -14,99 +14,17 @@
     /**
      * 鍥涘悜绌挎杞﹀彿
      */
-    private Short shuttleNo = 0;
+    private Integer shuttleNo;
 
     /**
      * 浠诲姟鍙�
      */
-    private Short taskNo = 0;
+    private Integer taskNo = 0;
 
     /**
-     * 浣滀笟绫诲瀷
+     * 鎶ユ枃鍐呭
      */
-    private Short taskMode = 0;
-
-    /**
-     * 鍔熻兘璇存槑
-     * 0銆佺┖
-     * 1銆佹甯哥Щ鍔�
-     * 2銆佹墭鐩橀《鍗�
-     * 3銆佸己鍒剁Щ鍔�
-     * 4銆佹煡鎵惧畾浣嶇偣
-     * 5銆佸厖鐢靛紑鍏�
-     * 6銆佺郴缁熷浣�
-     * 7銆佺揣鎬ュ仠姝�
-     * 8銆両O鎺у埗
-     * 9銆佽璧扮數鏈哄己鍒剁Щ鍔紙杈撳叆涓鸿剦鍐叉寚浠わ級
-     * 10銆佸崌闄嶄己鏈嶅己鍒剁Щ鍔紙杈撳叆涓鸿剦鍐叉寚浠わ級
-     * 鎺у埗鎸囦护瀛�
-     */
-    private Short commandWord;
-
-    /**
-     * 鍚浜岀淮缂栧彿
-     */
-    private Short startCodeNum;
-
-    /**
-     * 涓棿浜岀淮缂栧彿
-     */
-    private Short middleCodeNum;
-
-    /**
-     * 鐩爣浜岀淮缂栧彿
-     */
-    private Short distCodeNum;
-
-    /**
-     * 璧风偣鍒扮洰鏍囩偣鐨勮窛绂婚暱搴�
-     */
-    private Integer startToDistDistance;
-
-    /**
-     * 涓棿鐐瑰埌鐩爣鐐圭殑璺濈闀垮害
-     */
-    private Integer middleToDistDistance;
-
-    /**
-     * 灏忚溅杩愯鏂瑰悜
-     */
-    private Short runDirection;
-
-    /**
-     * 鎵樼洏椤跺崌
-     */
-    private Short palletLift;
-
-    /**
-     * 灏忚溅寮哄埗绉诲姩璺濈
-     */
-    private Integer forceMoveDistance;
-
-    /**
-     * 鍏呯數寮�鍏�
-     */
-    private Short chargeSwitch;
-
-    /**
-     * 灏忚溅IO鎺у埗
-     */
-    private Short IOControl;
-
-    /**
-     * 灏忚溅杩愯閫熷害
-     */
-    private Short runSpeed;
-
-    /**
-     * 灏忚溅闆疯揪澶囩敤
-     */
-    private Short radarTmp;
-
-    /**
-     * 鎸囦护缁撴潫浣�
-     */
-    private Short commandEnd;
+    private String body;
 
     /**
      * 鍛戒护鏄惁瀹屾垚,榛樿false鏈畬鎴�
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
new file mode 100644
index 0000000..18c91ed
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
@@ -0,0 +1,84 @@
+package com.zy.asrs.wcs.core.model.enums;
+
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wcs.rcs.entity.MotionCtg;
+import com.zy.asrs.wcs.rcs.service.MotionCtgService;
+
+import static com.zy.asrs.wcs.core.model.enums.DeviceCtgType.*;
+
+public enum MotionCtgType {
+
+    // 杈撻�佺嚎 --------------------------------------------
+    CONVEYOR_INBOUND(CONVEYOR),
+
+    CONVEYOR_INBOUND_TO_LIFT(CONVEYOR),
+
+    CONVEYOR_OUTBOUND(CONVEYOR),
+
+    CONVEYOR_OUTBOUND_FROM_LIFT(CONVEYOR),
+
+    // 鍫嗗灈鏈� --------------------------------------------
+
+    // 鎻愬崌鏈� --------------------------------------------
+    LIFT_MOVE(LIFT),
+
+    LIFT_WITH_GOODS(LIFT),
+    LIFT_WITH_SHUTTLE(LIFT),
+    LIFT_WITH_GOODS_AND_SHUTTLE(LIFT),
+
+    LIFT_TRANSPORT_TO_CONVEYOR(LIFT),
+
+    LIFT_MISSION_COMPLETE(LIFT),
+
+    // 绌挎杞� --------------------------------------------
+    SHUTTLE_MOVE(SHUTTLE),
+    SHUTTLE_MOVE_LIFT_PALLET(SHUTTLE),//绌挎杞﹂《鍗囧苟绉诲姩
+    SHUTTLE_MOVE_DOWN_PALLET(SHUTTLE),//绌挎杞︾Щ鍔ㄥ苟鎵樼洏涓嬮檷
+    SHUTTLE_MOVE_FROM_LIFT(SHUTTLE),
+    SHUTTLE_MOVE_TO_LIFT(SHUTTLE),
+    SHUTTLE_MOVE_FROM_CONVEYOR(SHUTTLE),
+    SHUTTLE_MOVE_TO_CONVEYOR(SHUTTLE),
+
+    SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR(SHUTTLE),
+
+    SHUTTLE_TRANSPORT(SHUTTLE),
+    SHUTTLE_TRANSPORT_FROM_LIFT(SHUTTLE),
+    SHUTTLE_TRANSPORT_TO_LIFT(SHUTTLE),
+    SHUTTLE_TRANSPORT_FROM_CONVEYOR(SHUTTLE),
+    SHUTTLE_TRANSPORT_TO_CONVEYOR(SHUTTLE),
+
+    SHUTTLE_CHARGE_ON(SHUTTLE),
+    SHUTTLE_CHARGE_OFF(SHUTTLE),
+
+    // AGV ----------------------------------------------
+    AGV_TRANSPORT(AGV),
+
+    ;
+
+    public DeviceCtgType deviceCtg;
+
+    MotionCtgType(DeviceCtgType deviceCtg) {
+        this.deviceCtg = deviceCtg;
+    }
+
+    public long val() {
+        MotionCtgService service = SpringUtils.getBean(MotionCtgService.class);
+        MotionCtg entity = service.selectByFlag(this.toString());
+        if (entity == null) {
+            throw new CoolException("MotionCtgType Error!");
+        }
+        return entity.getId();
+    }
+
+    public static MotionCtgType get(String el) {
+        for (MotionCtgType value : MotionCtgType.values()) {
+            if (el.equals(value.toString())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/ShuttleRunDirection.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/ShuttleRunDirection.java
new file mode 100644
index 0000000..667b194
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/ShuttleRunDirection.java
@@ -0,0 +1,63 @@
+package com.zy.asrs.wcs.core.model.enums;
+
+/**
+ * 鍥涘悜绌挎杞﹁繍琛屾柟鍚�
+ */
+public enum ShuttleRunDirection {
+
+    TOP((short)2, "璐х墿鏂瑰悜-"),
+    BOTTOM((short)1, "璐х墿鏂瑰悜+"),
+    LEFT((short)3, "杩囬亾鏂瑰悜-"),
+    RIGHT((short)4, "杩囬亾鏂瑰悜+"),
+    ;
+
+    public Short id;
+    public String desc;
+
+    ShuttleRunDirection(Short id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static ShuttleRunDirection get(String direction) {
+        if (null == direction) {
+            return null;
+        }
+        if (direction.equals("top")) {
+            return TOP;
+        } else if (direction.equals("bottom")) {
+            return BOTTOM;
+        } else if (direction.equals("left")) {
+            return LEFT;
+        } else if (direction.equals("right")) {
+            return RIGHT;
+        }else {
+            return null;
+        }
+    }
+
+    public static ShuttleRunDirection get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (ShuttleRunDirection type : ShuttleRunDirection.values()) {
+            if (type.id.equals(id.shortValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static ShuttleRunDirection get(ShuttleRunDirection type) {
+        if (null == type) {
+            return null;
+        }
+        for (ShuttleRunDirection shuttleRunDirection : ShuttleRunDirection.values()) {
+            if (shuttleRunDirection == type) {
+                return shuttleRunDirection;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/ShuttleTaskModeType.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/ShuttleTaskModeType.java
new file mode 100644
index 0000000..6bf4461
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/ShuttleTaskModeType.java
@@ -0,0 +1,63 @@
+package com.zy.asrs.wcs.core.model.enums;
+
+public enum ShuttleTaskModeType {
+
+    INIT(0, "鍒濆"),    // 鍒濆
+    PAK_IN(1, "鍏ュ簱"),
+    PAK_OUT(2, "鍑哄簱"),
+    PALLET_LIFT(3, "鎵樼洏椤跺崌"),
+    PALLET_DOWN(4, "鎵樼洏涓嬮檷"),
+    X_NEGATIVE(5, "X-鏂瑰悜"),
+    X_POSITIVE(6, "X+鏂瑰悜"),
+    Y_POSITIVE(7, "Y+鏂瑰悜"),
+    Y_NEGATIVE(8, "Y-鏂瑰悜"),
+    RESET(9, "鐘舵�佸浣�"),
+    SEARCH_LEFT(10, "姝f柟鍚�(鍙�)瀵诲簱浣�"),
+    SEARCH_RIGHT(11, "璐熸柟鍚�(宸�)瀵诲簱浣�"),
+    SEARCH_TOP(12, "璐熸柟鍚�(鍓�)瀵诲簱浣�"),
+    SEARCH_BOTTOM(13, "璐熸柟鍚�(鍚�)瀵诲簱浣�"),
+    MOVE_LOC_NO(14, "绉诲姩鍒扮洰鏍囧簱浣�"),
+    CHARGE(15, "鍏呯數"),
+    MOVE_LIFT(16, "绉诲姩鍒版彁鍗囨満"),
+    AVOID(17, "閬胯浠诲姟"),
+    TRANSPORT(18, "鎼繍浠诲姟"),
+    SHUTTLE_MOVE_LOC_NO(19, "灏忚溅绉诲簱浠诲姟"),
+    SHUTTLE_LOC_TO_LOC(20, "搴撲綅绉昏浆"),
+    SHUTTLE_CONTROL(21, "灏忚溅绠″埗"),
+    SHUTTLE_CANCEL_CONTROL(22, "灏忚溅鍙栨秷绠″埗"),
+    MOVE_LOC_NO_WRK_MAST(23, "绉诲姩鍒扮洰鏍囧簱浣�(鐢熸垚绉诲姩浠诲姟)"),
+    ;
+
+    public Integer id;
+    public String desc;
+
+    ShuttleTaskModeType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+    public static ShuttleTaskModeType get(Short id) {
+        if (null == id) {
+            return null;
+        }
+        for (ShuttleTaskModeType type : ShuttleTaskModeType.values()) {
+            if (type.id.equals(id.intValue())) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static ShuttleTaskModeType get(ShuttleTaskModeType type) {
+        if (null == type) {
+            return null;
+        }
+        for (ShuttleTaskModeType shuttleTaskModeType : ShuttleTaskModeType.values()) {
+            if (shuttleTaskModeType == type) {
+                return shuttleTaskModeType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java
new file mode 100644
index 0000000..a44bd3d
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java
@@ -0,0 +1,112 @@
+package com.zy.asrs.wcs.core.utils;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wcs.core.entity.Loc;
+import com.zy.asrs.wcs.core.model.NavigateNode;
+import com.zy.asrs.wcs.core.service.LocService;
+
+/**
+ * 搴撲綅缂栧彿鍜孉*绠楁硶鐨剎y杞磋浆鎹㈠伐鍏风被
+ */
+public class NavigatePositionConvert {
+
+    public static String xyToPosition(int x, int y, int z, Long hostId) {
+        StringBuffer sb = new StringBuffer();
+        if (x < 10) {
+            sb.append("0");
+        }
+        sb.append(x);
+
+        if (y < 10) {
+            sb.append("00");
+        } else if (y < 100) {
+            sb.append("0");
+        }
+        sb.append(y);
+
+        if (z < 10) {
+            sb.append("0");
+        }
+        sb.append(z);
+        String position = sb.toString();//搴撲綅鍙�
+
+        //搴撲綅鍙疯浆灏忚溅浜岀淮鐮�
+        LocService locMastService = SpringUtils.getBean(LocService.class);
+        Loc locMast = locMastService.getOne(new LambdaQueryWrapper<Loc>()
+                .eq(Loc::getLocNo, position)
+                .eq(Loc::getHostId, hostId));
+        if (locMast == null) {
+//            //褰撳墠搴撲綅鍙锋煡涓嶅埌锛屽彲鑳芥槸绔欑偣搴撲綅鍙�
+//            BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
+//            BasDevp basDevp = basDevpService.queryByLocNo(position);
+//            if (basDevp == null) {
+//                return null;
+//            }
+//            return Short.parseShort(basDevp.getQrCodeValue());
+            return null;
+        }
+        return locMast.getCode();
+    }
+
+    //鍧愭爣缂栧彿杞瑇y杞�
+    public static int[] positionToXY(String position) {
+        int col = Integer.parseInt(position.substring(0, 2));
+        int row = Integer.parseInt(position.substring(2, 5));
+        int[] newPosition = coverPosition(col,row);
+        //杩斿洖x鍜寉
+//        return new int[]{row, col};
+        return newPosition;
+    }
+
+    //WCS绯荤粺搴撲綅鍙疯浆璺緞绠楁硶鑺傜偣
+    public static NavigateNode locNoToNode(String locNo) {
+        int col = Integer.parseInt(locNo.substring(0, 2));
+        int row = Integer.parseInt(locNo.substring(2, 5));
+        int[] newPosition = coverPosition(col,row);
+        NavigateNode node = new NavigateNode(col, row);
+        node.setZ(Utils.getLev(locNo));
+        return node;
+    }
+
+    //璺緞绠楁硶鑺傜偣杞琖CS绯荤粺搴撲綅鍙�
+    public static String nodeToLocNo(NavigateNode node) {
+        return xyzToLocNo(node.getX(), node.getY(), node.getZ());
+    }
+
+    //WCS鍧愭爣杞琖CS搴撲綅鍙�
+    public static String xyzToLocNo(int x, int y, int z) {
+        String locNo = Utils.getLocNo(x, y, z);
+        return locNo;
+    }
+
+    //鐗涚溂鍧愭爣杞琖CS搴撲綅鍙�
+    public static String nyXyzToLocNo(int x, int y, int z) {
+        int[] ints = NyXyzToWCSXyz(x, y, z);
+        String locNo = Utils.getLocNo(ints[0],ints[1],ints[2]);
+        return locNo;
+    }
+
+    //WCS绯荤粺鍧愭爣杞墰鐪煎潗鏍�
+    public static int[] WCSXyzToNyXyz(int x, int y, int z) {
+        //WCS绯荤粺Y杞� => 鐗涚溂X杞磋浆鎹㈠叕寮�
+        int x1 = Math.abs(y - 61) + 11;
+        //WCS绯荤粺X杞� => 鐗涚溂Y杞磋浆鎹㈠叕寮�
+        int y1 = x + 10;
+        return new int[]{x1, y1, z};
+    }
+
+    //鐗涚溂鍧愭爣杞琖CS绯荤粺鍧愭爣
+    public static int[] NyXyzToWCSXyz(int x, int y, int z) {
+        //鐗涚溂X杞� => WCS绯荤粺Y杞村叕寮�
+        int y1 = Math.abs(x - 11 - 61);
+        //鐗涚溂Y杞� => WCS绯荤粺X杞村叕寮�
+        int x1 = y - 10;
+        return new int[]{x1, y1, z};
+    }
+
+    public static int[] coverPosition(int col,int row) {
+        return new int[]{col, row};
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java
new file mode 100644
index 0000000..1934fc0
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java
@@ -0,0 +1,217 @@
+package com.zy.asrs.wcs.core.utils;
+
+import com.zy.asrs.wcs.core.model.NavigateNode;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.PriorityQueue;
+
+/**
+ * 鍥涘悜搴撴牳蹇�
+ * A*绠楁硶瀹炵幇绫�
+ */
+public class NavigateSolution {
+
+    // -1 -> 澧欏锛� 1 -> 璧风偣  2 -> 缁堢偣  3-> 姣嶈建  4->绔欑偣
+
+    int[][] map = {{}};
+
+    public NavigateSolution() {
+        //杞藉叆鍦板浘
+        NavigateMapData mapData = new NavigateMapData();
+        int[][] data = mapData.getData();
+        this.map = data;
+    }
+
+    public NavigateSolution(Integer mapType, Integer lev, List<int[]> whitePoints, List<int[]> shuttlePoints) {
+        //杞藉叆鍦板浘鎸囧畾灞傞珮鍦板浘
+        NavigateMapData mapData = new NavigateMapData(lev);
+        int[][] data = mapData.getDataFromRedis(mapType, whitePoints, shuttlePoints);
+        if (data == null) {
+            data = mapData.getData(mapType, whitePoints, shuttlePoints);
+        }
+        this.map = data;
+    }
+
+    public NavigateSolution(int[][] data) {
+        this.map = data;
+    }
+
+    // Open琛ㄧ敤浼樺厛闃熷垪
+    public PriorityQueue<NavigateNode> Open = new PriorityQueue<NavigateNode>();
+    //Close琛ㄧ敤鏅�氱殑鏁扮粍
+    public ArrayList<NavigateNode> Close = new ArrayList<NavigateNode>();
+    //Exist琛ㄧ敤鏉ュ瓨鏀惧凡缁忓嚭鐜拌繃鐨勭粨鐐广��
+    public ArrayList<NavigateNode> Exist = new ArrayList<NavigateNode>();
+
+    public NavigateNode astarSearch(NavigateNode start, NavigateNode end) {
+        //鎶婄涓�涓紑濮嬬殑缁撶偣鍔犲叆鍒癘pen琛ㄤ腑
+        this.Open.add(start);
+        //鎶婂嚭鐜拌繃鐨勭粨鐐瑰姞鍏ュ埌Exist琛ㄤ腑
+        this.Exist.add(start);
+        //涓诲惊鐜�
+        while (Open.size() > 0) {
+            //鍙栦紭鍏堥槦鍒楅《閮ㄥ厓绱犲苟涓旀妸杩欎釜鍏冪礌浠嶰pen琛ㄤ腑鍒犻櫎
+            NavigateNode current_node = Open.poll();
+            //灏嗚繖涓粨鐐瑰姞鍏ュ埌Close琛ㄤ腑
+            Close.add(current_node);
+            //瀵瑰綋鍓嶇粨鐐硅繘琛屾墿灞曪紝寰楀埌涓�涓洓鍛ㄧ粨鐐圭殑鏁扮粍
+            ArrayList<NavigateNode> neighbour_node = extend_current_node(current_node);
+            //瀵硅繖涓粨鐐归亶鍘嗭紝鐪嬫槸鍚︽湁鐩爣缁撶偣鍑虹幇
+            for (NavigateNode node : neighbour_node) {
+                // G + H + E (瀵瑰惎鍙戝嚱鏁板鍔犲幓鎷愮偣鏂规calcNodeExtraCost)
+                int gCost = calcNodeCost(current_node, node) * calcNodeExtraCost(current_node, node, end);
+                if (node.getX() == end.getX() && node.getY() == end.getY()) {//鎵惧埌鐩爣缁撶偣灏辫繑鍥�
+                    //init_node鎿嶄綔鎶婅繖涓偦灞呯粨鐐圭殑鐖惰妭鐐硅缃负褰撳墠缁撶偣
+                    //骞朵笖璁$畻鍑篏锛� F锛� H绛夊��
+                    node.init_node(current_node, end);
+                    return node;
+                }
+
+                //(瀵瑰惎鍙戝嚱鏁板鍔犲幓鎷愮偣鏂规calcNodeExtraCost)
+                if (is_exist(node)) {
+                    if (gCost < node.getG()) {
+                        node.setFather(current_node);
+                        node.setG(gCost);
+                        node.setF(node.getG() + node.getH());
+                    }
+                }else {
+                    //娌″嚭鐜拌繃鐨勭粨鐐瑰姞鍏ュ埌Open琛ㄤ腑骞朵笖璁剧疆鐖惰妭鐐�
+                    //杩涜璁$畻瀵笹, F, H 绛夊��
+                    node.init_node(current_node, end);
+                    node.setG(gCost);
+                    node.setH(calcNodeCost(node, end));
+                    node.setF(node.getG() + node.getH());
+
+                    Open.add(node);
+                    Exist.add(node);
+                }
+            }
+        }
+        //濡傛灉閬嶅巻瀹屾墍鏈夊嚭鐜扮殑缁撶偣閮芥病鏈夋壘鍒版渶缁堢殑缁撶偣锛岃繑鍥瀗ull
+        return null;
+    }
+
+
+    public ArrayList<NavigateNode> extend_current_node(NavigateNode current_node) {
+        //鑾峰彇褰撳墠缁撶偣鐨剎, y
+        int x = current_node.getX();
+        int y = current_node.getY();
+        //濡傛灉褰撳墠缁撶偣鐨勯偦缁撶偣鍚堟硶锛屽氨鍔犲叆鍒皀eighbour_node
+        ArrayList<NavigateNode> neighbour_node = new ArrayList<NavigateNode>();
+//        if (map[x][y] == 0 || map[x][y] == 3) {
+//            //鍙湁瀛愯建鍜屾瘝杞ㄦ墠鑳借繘琛屽乏鍙崇Щ鍔�
+//            if (is_valid(x, y + 1))
+//            {
+//                Node node = new Node(x, y + 1);
+//                neighbour_node.add(node);
+//            }
+//            if (is_valid(x, y - 1))
+//            {
+//                Node node = new Node(x, y - 1);
+//                neighbour_node.add(node);
+//            }
+//        }
+//
+//        if (map[x][y] == 3) {
+//            //鍙湁姣嶈建鎵嶈兘杩涜涓婁笅绉诲姩
+//            if (is_valid(x + 1, y))
+//            {
+//                Node node = new Node(x + 1, y);
+//                neighbour_node.add(node);
+//            }
+//            if (is_valid(x - 1, y))
+//            {
+//                Node node = new Node(x -1, y);
+//                neighbour_node.add(node);
+//            }
+//        }
+        if (map[x][y] == 3) {
+            //姣嶈建鎵嶈兘杩涜宸﹀彸绉诲姩
+            if (is_valid(x, y + 1))
+            {
+                NavigateNode node = new NavigateNode(x, y + 1);
+                neighbour_node.add(node);
+            }
+            if (is_valid(x, y - 1))
+            {
+                NavigateNode node = new NavigateNode(x, y - 1);
+                neighbour_node.add(node);
+            }
+        }
+
+        if (map[x][y] == 0 || map[x][y] == 3 || map[x][y] == 4 || map[x][y] == 5) {
+            //瀛愯建鍜屾瘝杞ㄣ�佽緭閫佺嚎銆佸厖鐢垫々鎵嶈兘杩涜涓婁笅绉诲姩
+            if (is_valid(x + 1, y))
+            {
+                NavigateNode node = new NavigateNode(x + 1, y);
+                neighbour_node.add(node);
+            }
+            if (is_valid(x - 1, y))
+            {
+                NavigateNode node = new NavigateNode(x -1, y);
+                neighbour_node.add(node);
+            }
+        }
+
+        return neighbour_node;
+    }
+
+    public boolean is_valid(int x, int y) {
+        // 濡傛灉缁撶偣鐨勪綅缃皬浜�0锛屽垯涓嶅悎娉�
+        if (map[x][y] < 0) return false;
+        for (NavigateNode node : Exist) {
+            //濡傛灉缁撶偣鍑虹幇杩囷紝涓嶅悎娉�
+            if (node.getX() == x && node.getY() == y) {
+                return false;
+            }
+            if (is_exist(new NavigateNode(x, y))) {
+                return false;
+            }
+        }
+        //浠ヤ笂鎯呭喌閮芥病鏈夊垯鍚堟硶
+        return true;
+    }
+
+    public boolean is_exist(NavigateNode node)
+    {
+        for (NavigateNode exist_node : Exist) {
+            if (node.getX() == exist_node.getX() && node.getY() == exist_node.getY()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    //------------------A*鍚彂鍑芥暟------------------//
+
+    //璁$畻閫氳繃鐜板湪鐨勭粨鐐圭殑浣嶇疆鍜屾渶缁堢粨鐐圭殑浣嶇疆璁$畻H鍊�(鏇煎搱椤挎硶锛氬潗鏍囧垎鍒彇宸�肩浉鍔�)
+    private int calcNodeCost(NavigateNode node1, NavigateNode node2) {
+        return Math.abs(node2.getX() - node1.getX()) + Math.abs(node2.getY() - node1.getY());
+    }
+
+    //鍘婚櫎鎷愮偣绠楁硶锛岀粰鐩寸嚎澧炲姞浼樺厛绾�
+    private int calcNodeExtraCost(NavigateNode currNode, NavigateNode nextNode, NavigateNode endNode) {
+        // 绗竴涓偣鎴栫洿绾跨偣
+        if (currNode.getFather() == null || nextNode.getX() == currNode.getFather().getX()
+                || nextNode.getY() == currNode.getFather().getY()) {
+            return 0;
+        }
+
+        // 鎷愬悜缁堢偣鐨勭偣
+        if (nextNode.getX() == endNode.getX() || nextNode.getY() == endNode.getY()) {
+            return 1;
+        }
+
+        // 鏅�氭嫄鐐�
+        /*
+        鎷愮偣鍒ゆ柇閫昏緫
+        鎷垮埌鐖惰妭鐐瑰拰涓嬩竴鑺傜偣
+        閫氳繃鍒ゆ柇鐖惰妭鐐瑰拰涓嬩竴鑺傜偣鐨剎鏁版嵁鍜寉鏁版嵁閮戒笉鐩稿悓鏃讹紝鍒欒〃鏄庡綋鍓嶅潗鏍囨槸涓�涓嫄鐐�
+         */
+        return 2;
+    }
+
+    //------------------A*鍚彂鍑芥暟-end------------------//
+
+}
\ No newline at end of file
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java
new file mode 100644
index 0000000..1aa29cd
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java
@@ -0,0 +1,278 @@
+package com.zy.asrs.wcs.core.utils;
+
+import com.zy.asrs.wcs.core.model.MapNode;
+import com.zy.asrs.wcs.core.model.NavigateNode;
+import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * A*绠楁硶浣跨敤宸ュ叿
+ */
+public class NavigateUtils {
+
+    public static List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints) {
+        //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍�
+        int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐�
+        int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣
+
+        ArrayList<int[]> whiteList = new ArrayList<>();//璁剧疆璁$畻鑺傜偣鐨勭櫧鍚嶅崟
+        whiteList.add(startArr);//灏嗗紑濮嬭妭鐐硅缃负鐧藉悕鍗曪紝浠ラ槻琚繃婊�
+
+        //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑
+        int lev = Utils.getLev(startPoint);
+
+        //鍒濆鍖栧紑濮嬭妭鐐�
+        NavigateNode start = new NavigateNode(startArr[0], startArr[1]);
+        //寮�濮嬭妭鐐规棤鐖惰妭鐐�
+        start.setFather(null);
+
+        NavigateNode end = new NavigateNode(endArr[0], endArr[1]);
+        NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints);
+        //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻
+
+        NavigateNode res_node = solution.astarSearch(start, end);
+        if (res_node == null) {
+            System.err.println("鏈壘鍒拌矾寰�");
+            return null;
+        }
+        ArrayList<NavigateNode> list = new ArrayList<>();
+
+        //娓叉煋
+        NavigateNode fatherNode = null;//褰撳墠寰幆涓婁竴鑺傜偣锛岀敤浜庢嫄鐐硅绠�
+        while (res_node != null) {
+            res_node.setDirection(null);
+            res_node.setIsInflectionPoint(false);
+            res_node.setZ(lev);//璁剧疆灞傞珮
+
+            //瀵绘壘鎷愮偣
+            HashMap<String, Object> result = searchInflectionPoint(res_node, fatherNode, res_node.getFather());//鍒嗗埆浼犲叆褰撳墠鑺傜偣銆佺埗鑺傜偣銆佷笅涓�鑺傜偣
+            //鍒ゆ柇褰撳墠鑺傜偣鏄惁涓烘嫄鐐�
+            if (Boolean.parseBoolean(result.get("result").toString())) {
+                //褰撳墠涓烘嫄鐐�
+                res_node.setIsInflectionPoint(true);
+                //鎷愮偣鏂瑰悜
+                res_node.setDirection(result.get("direction").toString());
+            }
+            list.add(res_node);
+
+            fatherNode = res_node;//鎶婂綋鍓嶈妭鐐逛繚瀛樻垚涓�涓埗鑺傜偣
+            res_node = res_node.getFather();//杩唬鎿嶄綔
+        }
+
+        Collections.reverse(list);
+
+        //灏嗘瘡涓妭鐐归噷闈㈢殑fatherNode鑷充负null(鏂逛究鍚庣画璁$畻鏃剁埗鑺傜偣杩囧瀵艰嚧鏄剧ず鐨勮妭鐐瑰お澶�)
+        for (NavigateNode navigateNode : list) {
+            //鐖惰妭鐐硅缃负null锛屼笉褰卞搷璁$畻缁撴灉锛屼笉褰卞搷鍚庣画鎿嶄綔銆�
+            //姝ゆ搷浣滀粎涓哄悗缁帓鏌ュ鐞嗘彁渚涜瑙夋柟渚裤��
+            navigateNode.setFather(null);
+        }
+
+        //璧峰鑺傜偣璁$畻鏂瑰悜
+        String direction = calcDirection(list.get(0), list.get(1));
+        NavigateNode startNode = list.get(0);
+        startNode.setDirection(direction);
+        //鏇存柊鑺傜偣鍒楄〃
+        list.set(0, startNode);
+        return list;
+    }
+
+    //鍒ゆ柇褰撳墠鑺傜偣鍒颁笅涓�涓妭鐐规槸鍚︿负鎷愮偣
+    public static HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) {
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("result", false);//鏄惁涓烘嫄鐐癸紝true锛氭嫄鐐癸紝false锛氱洿绾�
+        // 绗竴涓偣鎴栫洿绾跨偣
+        if (fatherNode == null || nextNode == null || nextNode.getX() == fatherNode.getX() || nextNode.getY() == fatherNode.getY()) {
+            return map;//涓嶆槸鎷愮偣鐩存帴杩斿洖
+        }
+
+        //鎷愮偣鏂瑰悜
+        String direction = calcDirection(currentNode, fatherNode);
+
+        map.put("result", true);//鎷愮偣
+        map.put("direction", direction);//鎷愮偣鏂瑰悜锛堜粠褰撳墠鑺傜偣瑙嗚鐪嬬殑鏂瑰悜锛�
+        return map;
+    }
+
+    /**
+     * 璁$畻鏂瑰悜
+     */
+    public static String calcDirection(NavigateNode currentNode, NavigateNode fatherNode) {
+        //鎷愮偣鏂瑰悜
+        String direction = "";
+        // 鏅�氭嫄鐐�
+        //璁$畻鎷愮偣鏂瑰悜
+        if (fatherNode.getX() != currentNode.getX()) {
+            //x杞存暟鎹湁宸紓锛屽垽鏂瓁杞存柟鍚�
+            //褰撳墠鑺傜偣X - 鐖惰妭鐐筙
+            if (currentNode.getX() - fatherNode.getX() > 0) {
+                //澶т簬0锛屾柟鍚憈op
+                direction = "top";
+            }else {
+                //灏忎簬0锛屾柟鍚慴ottom
+                direction = "bottom";
+            }
+        }
+
+        if (fatherNode.getY() != currentNode.getY()) {
+            //y杞存暟鎹湁宸紓锛屽垽鏂瓂杞存柟鍚�
+            //褰撳墠鑺傜偣Y - 鐖惰妭鐐筜
+            if (currentNode.getY() - fatherNode.getY() > 0) {
+                //澶т簬0锛屾柟鍚憀eft
+                direction = "left";
+            }else {
+                //灏忎簬0锛屾柟鍚憆ight
+                direction = "right";
+            }
+        }
+
+        return direction;
+    }
+
+    /**
+     * 鍔犺浆寮妭鐐�
+     * 鑾峰彇鍒嗘璺緞锛屾瘡褰撴湁涓�涓嫄鐐瑰垯杩涜涓�娆″垎娈碉紝鏈�缁堣繑鍥炴�诲垎娈垫暟鎹�
+     */
+    public static ArrayList<ArrayList<NavigateNode>> getSectionPath(List<NavigateNode> mapList) {
+        ArrayList<ArrayList<NavigateNode>> list = new ArrayList<>();
+
+        ArrayList<NavigateNode> data = new ArrayList<>();
+        String direction = mapList.get(0).getDirection();//琛岃蛋鏂瑰悜
+
+        for (NavigateNode navigateNode : mapList) {
+            data.add(navigateNode);
+            //鎷愮偣
+            if (navigateNode.getIsInflectionPoint()) {
+                //鍒嗗壊鏁版嵁
+                list.add(data);//娣诲姞鏌愪竴娈垫暟鎹�
+                direction = navigateNode.getDirection();//鏇存柊琛岃蛋鏂瑰悜
+                data = new ArrayList<>();
+                data.add(navigateNode);//灏嗘嫄鐐圭殑缁堢偣锛屾洿鏂版垚涓嬩竴娈靛懡浠ょ殑璧风偣鍧愭爣
+            } else {
+                //鐩磋绾胯矾
+                navigateNode.setDirection(direction);//璁剧疆琛岃蛋鏂瑰悜
+            }
+            Integer distance = getXToNextDistance(navigateNode);//鑾峰彇褰撳墠鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈
+            navigateNode.setMoveDistance(distance);
+        }
+
+        //灏嗘渶鍚庝竴娈垫暟鎹坊鍔犺繘鍏�
+        list.add(data);
+
+        return list;
+    }
+
+    //鑾峰彇浠巟鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈
+    public static Integer getXToNextDistance(NavigateNode xNode) {
+        NavigateMapData mapData = new NavigateMapData();
+        List<List<MapNode>> lists = mapData.getJsonData(NavigationMapType.NONE.id, null, null);
+        if (lists != null) {
+            MapNode mapNode = lists.get(xNode.getX()).get(xNode.getY());
+            if (mapNode != null) {
+                switch (xNode.getDirection()) {
+                    case "top":
+                        return mapNode.getTop();
+                    case "bottom":
+                        return mapNode.getBottom();
+                    case "left":
+                        return mapNode.getLeft();
+                    case "right":
+                        return mapNode.getRight();
+                }
+            }
+            return 0;
+        }
+        return 0;
+    }
+
+    /**
+     * 鏍规嵁鍘熷鑺傜偣缁撴灉锛岃绠楁�昏璧拌窛绂�
+     */
+    public static Integer getOriginPathAllDistance(List<NavigateNode> path) {
+        ArrayList<ArrayList<NavigateNode>> sectionPath = NavigateUtils.getSectionPath(path);
+        Integer allDistance = 0;
+        for (ArrayList<NavigateNode> navigateNodes : sectionPath) {
+            Integer distance = NavigateUtils.getCurrentPathAllDistance(navigateNodes);
+            allDistance += distance;
+        }
+        return allDistance;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠璺緞鎬昏璧拌窛绂�
+     */
+    public static Integer getCurrentPathAllDistance(List<NavigateNode> path) {
+        if (path.size() == 1) {
+            //璺緞鍙湁涓�鏉℃暟鎹紝鍒欑洿鎺ヨ繑鍥炶璧拌窛绂�
+            return path.get(0).getMoveDistance();
+        }
+
+        //鎬昏窛绂�
+        int allDistance = 0;
+        for (int i = 0; i < path.size() - 1; i++) {//璺緞涓渶鍚庝竴涓妭鐐逛笉缁熻鍒版�昏窛绂伙紝鏈�鍚庝竴涓妭鐐瑰苟涓嶄細鍐嶈璧�
+            allDistance += path.get(i).getMoveDistance();
+        }
+        return allDistance;
+    }
+
+    /**
+     * 鑾峰彇涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
+     */
+    public static Integer getMiddleToDistDistance(List<NavigateNode> path, NavigateNode middlePath) {
+        //鏈�鍚庝竴鏉¤妭鐐逛笉璁$畻杩涜璧拌窛绂�
+        NavigateNode lastPath = path.get(path.size() - 1);
+        //鎬昏窛绂�
+        int allDistance = 0;
+        boolean flag = false;
+        for (NavigateNode navigateNode : path) {
+            if (!flag && navigateNode.equals(middlePath)) {
+                flag = true;
+            }
+
+            if (navigateNode.equals(lastPath)) {
+                continue;//鏈�鍚庝竴鏉¤妭鐐逛笉璁$畻杩涜璧拌窛绂�
+            }
+
+            if (flag) {
+                allDistance += navigateNode.getMoveDistance();
+            }
+        }
+        return allDistance;
+    }
+
+    /**
+     * 妫�娴嬭矾寰勬槸鍚﹀彲鐢�(鍙蛋)
+     */
+    public static boolean checkPathIsAvailable(List<NavigateNode> path, Integer shuttleNo, Integer lev) {
+        NavigateSolution solution = new NavigateSolution(NavigationMapType.DFX.id, lev, null, Utils.getShuttlePoints(shuttleNo, lev));//鑾峰彇鏃犵櫧鍚嶅崟鍦板浘(璇ュ湴鍥惧寘鍚皬杞﹀潗鏍�)
+        int[][] map = solution.map;
+        for (NavigateNode node : path) {
+            int value = map[node.getX()][node.getY()];
+            if (value != 0 && value != 3 && value != 5) {//姣嶈建閬�3銆佸瓙杞ㄩ亾0銆佸厖鐢垫々5
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static void main(String[] args) {
+        //璁$畻璺緞
+        List<NavigateNode> calc = calc("1000901", "1800201", NavigationMapType.NONE.id, null);
+        System.out.println(calc);
+        System.out.println("------------------------");
+//        List<NavigateNode> calc = calc("0501401", "0201801", "out");
+        //灏嗚矾寰勫垎鍓叉垚澶氭
+        ArrayList<ArrayList<NavigateNode>> data = getSectionPath(calc);
+        for (ArrayList<NavigateNode> list : data) {
+            Integer currentPathAllDistance = getCurrentPathAllDistance(list);//璁$畻褰撳墠璺緞鎬昏窛绂�
+            System.out.println(currentPathAllDistance);
+            System.out.println(list);
+        }
+
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java
index 81dae25..26dbb6f 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/Utils.java
@@ -1,10 +1,60 @@
 package com.zy.asrs.wcs.core.utils;
 
+import com.zy.asrs.framework.common.Cools;
+
 import java.util.ArrayList;
 import java.util.List;
 
 public class Utils {
 
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 鎺�
+     */
+    public static int getRow(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            return Integer.parseInt(locNo.substring(0, 2));
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 鍒�
+     */
+    public static int getBay(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            return Integer.parseInt(locNo.substring(2, 5));
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 灞�
+     */
+    public static int getLev(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            return Integer.parseInt(locNo.substring(5, 7));
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    public static String getLocNo(Number row, Number bay, Number lev) {
+        return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
+    }
+
+    public static String zerofill(String msg, Integer count){
+        if (msg.length() == count){
+            return msg;
+        } else if (msg.length() > count){
+            return msg.substring(0, 16);
+        } else {
+            StringBuilder msgBuilder = new StringBuilder(msg);
+            for (int i = 0; i<count-msg.length(); i++){
+                msgBuilder.insert(0,"0");
+            }
+            return msgBuilder.toString();
+        }
+    }
+
     //鑾峰彇闄ょ櫧鍚嶅崟澶栫殑鎸囧畾妤煎眰鍏ㄩ儴绌挎杞y鍧愭爣鐐�
     public static List<int[]> getShuttlePoints(Integer whiteShuttle, Integer lev) {
 //        SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class);
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Motion.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Motion.java
index 574c505..1aeec03 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Motion.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Motion.java
@@ -438,5 +438,14 @@
         return null;
     }
 
+    public String getMotionCtgEl(){
+        MotionCtgService service = SpringUtils.getBean(MotionCtgService.class);
+        MotionCtg entity = service.getById(this.motionCtg);
+        if (!Cools.isEmpty(entity)){
+            return String.valueOf(entity.getFlag());
+        }
+        return null;
+    }
+
 
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/ShuttleProtocol.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/ShuttleProtocol.java
index b0ff291..d9a3147 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/ShuttleProtocol.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/ShuttleProtocol.java
@@ -3,12 +3,15 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wcs.core.entity.Loc;
+import com.zy.asrs.wcs.core.service.LocService;
 import com.zy.asrs.wcs.core.utils.RedisUtil;
 import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
 import com.zy.asrs.wcs.rcs.model.enums.ShuttleDeviceStatusType;
 import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType;
 import com.zy.asrs.wcs.rcs.entity.Device;
 import com.zy.asrs.wcs.rcs.entity.ShuttleDeviceStatus;
+import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
 import com.zy.asrs.wcs.rcs.service.ShuttleDeviceStatusService;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
@@ -225,4 +228,25 @@
         return this.taskNo == null ? 0 : this.taskNo;
     }
 
+    //閫氳繃褰撳墠浜岀淮鐮佽幏鍙栧綋鍓嶅簱浣嶅彿
+    public String getCurrentLocNo() {
+        LocService locService = SpringUtils.getBean(LocService.class);
+        if (locService == null) {
+            return null;
+        }
+        if (this.currentCode == null) {
+            return null;
+        }
+
+        //婧愬簱浣�(灏忚溅褰撳墠浣嶇疆)
+        Loc currentLoc = locService.getOne(new LambdaQueryWrapper<Loc>()
+                .eq(Loc::getCode, this.currentCode)
+                .eq(Loc::getHostId, this.device.getHostId()));
+        if (currentLoc == null) {
+            return null;
+        }
+
+        return currentLoc.getLocNo();
+    }
+
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/MotionCtgService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/MotionCtgService.java
index cb44786..a2aa422 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/MotionCtgService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/MotionCtgService.java
@@ -5,4 +5,6 @@
 
 public interface MotionCtgService extends IService<MotionCtg> {
 
+    MotionCtg selectByFlag(String flag);
+
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/MotionCtgServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/MotionCtgServiceImpl.java
index 037d573..01c2ffb 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/MotionCtgServiceImpl.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/MotionCtgServiceImpl.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.wcs.rcs.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.asrs.wcs.rcs.mapper.MotionCtgMapper;
 import com.zy.asrs.wcs.rcs.entity.MotionCtg;
 import com.zy.asrs.wcs.rcs.service.MotionCtgService;
@@ -9,4 +10,9 @@
 @Service("motionCtgService")
 public class MotionCtgServiceImpl extends ServiceImpl<MotionCtgMapper, MotionCtg> implements MotionCtgService {
 
+    @Override
+    public MotionCtg selectByFlag(String flag) {
+        return this.getOne(new LambdaQueryWrapper<MotionCtg>().eq(MotionCtg::getFlag, flag));
+    }
+
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/ShuttleThread.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/ShuttleThread.java
index 6dc13a8..4488848 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/ShuttleThread.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/ShuttleThread.java
@@ -1,15 +1,23 @@
 package com.zy.asrs.wcs.rcs.thread;
 
+import com.zy.asrs.wcs.core.model.command.ShuttleCommand;
+import com.zy.asrs.wcs.rcs.entity.Device;
 import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
 
 public interface ShuttleThread extends ThreadHandler{
 
     ShuttleProtocol getStatus();//鑾峰彇鍥涘悜绌挎杞︾姸鎬�
 
+    Device getDevice();//鑾峰彇璁惧淇℃伅
+
     boolean movePath();//璺緞涓嬪彂
 
     boolean move();//绉诲姩
 
     boolean lift();//椤跺崌
 
+
+    //***************鑾峰彇鍛戒护*****************
+    ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed);
+
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
index f2a3918..1091fc4 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
@@ -2,9 +2,14 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.asrs.common.utils.HttpHandler;
 import com.zy.asrs.framework.common.DateUtils;
+import com.zy.asrs.framework.common.SpringUtils;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wcs.core.entity.Loc;
+import com.zy.asrs.wcs.core.model.command.ShuttleCommand;
+import com.zy.asrs.wcs.core.service.LocService;
 import com.zy.asrs.wcs.rcs.News;
 import com.zy.asrs.wcs.rcs.cache.OutputQueue;
 import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType;
@@ -148,6 +153,11 @@
     }
 
     @Override
+    public Device getDevice() {
+        return this.device;
+    }
+
+    @Override
     public synchronized boolean movePath() {
         return false;
     }
@@ -162,6 +172,32 @@
         return false;
     }
 
+    @Override
+    public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed) {
+        HashMap<String, Object> body = new HashMap<>();
+        body.put("messageName", "runOrder");
+        body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        body.put("deviceNo", Integer.parseInt(this.device.getDeviceNo()));
+        body.put("taskId", taskNo);
+
+        LocService locService = SpringUtils.getBean(LocService.class);
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>()
+                .eq(Loc::getCode, distCodeNum)
+                .eq(Loc::getHostId, this.device.getHostId()));
+        if (loc == null) {
+            throw new CoolException("搴撲綅淇℃伅涓嶅瓨鍦�");
+        }
+        body.put("nodeX", loc.getRow());
+        body.put("nodeY", loc.getBay());
+        body.put("nodeZ", loc.getLev());
+
+        ShuttleCommand command = new ShuttleCommand();
+        command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo()));
+        command.setBody(JSON.toJSONString(body));
+        return command;
+    }
+
+
     //***************璁惧灞傞�氳-涓嶅悓鍘傚晢璁惧閫氳鏂规涓嶄竴鑷�***************
 
     //璇锋眰鐧诲綍

--
Gitblit v1.9.1