#
zjj
2024-06-22 dcc528dae89242366a86e8b3709479621b95b0c0
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
@@ -3,11 +3,13 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.wcs.core.domain.dto.MotionDto;
import com.zy.asrs.wcs.core.entity.BasConveyorPath;
import com.zy.asrs.wcs.core.entity.ShuttleStandby;
import com.zy.asrs.wcs.core.entity.Task;
import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
import com.zy.asrs.wcs.core.model.enums.MotionCtgType;
import com.zy.asrs.wcs.core.model.enums.TaskStsType;
import com.zy.asrs.wcs.core.service.BasConveyorPathService;
import com.zy.asrs.wcs.core.service.ShuttleStandbyService;
import com.zy.asrs.wcs.core.service.TaskService;
import com.zy.asrs.wcs.core.utils.ConveyorDispatcher;
@@ -53,15 +55,11 @@
    private DeviceService deviceService;
    @Autowired
    private ShuttleStandbyService shuttleStandbyService;
    @Autowired
    private BasConveyorPathService basConveyorPathService;
    public List<Motion> generateMotion(Task task) {
        List<Motion> motionList = new ArrayList<>();
//        switch (Objects.requireNonNull(WorkZoneType.query(task.getTaskSts() == TaskStsType.NEW_INBOUND.sts ? task.getOriginSite() : task.getDestSite()))) {
//            case FIRST_ZONE:
//                motionList = this.generateFirstZoneMotion(task);
//                break;
//            default:
//        }
        motionList = this.generateFirstZoneMotion(task);
        return motionList;
    }
@@ -69,8 +67,6 @@
    public List<Motion> generateFirstZoneMotion(Task task) {
        List<Motion> motionList = new ArrayList<>();
        String shuttleNo = null;
        String liftNo = null;
        /**
         * 入库
         * 一、入库目标层有穿梭车
@@ -81,172 +77,188 @@
         * 5.穿梭车入库至目标库位
         */
        if (task.getTaskSts() == TaskStsType.NEW_INBOUND.sts) {
//            // lift
//            LiftThread liftThread = liftDispatcher.queryLiftForTransport(task.getOriginSite());
//            LiftProtocol liftProtocol = liftThread.getStatus();
//            if (liftProtocol == null) {
//                return motionList;
//            }
            // locNo
            String destLoc = task.getDestLoc();
            // shuttle
//            ShuttleThread shuttleThread = shuttleDispatcher.queryShuttleWhichConvenient(task, Integer.parseInt(liftThread.getStatus().getLiftNo()));
//            ShuttleThread shuttleThread = shuttleDispatcher.queryShuttleWhichConvenient(task, 1);
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, 6);
            if (Cools.isEmpty(shuttleThread)) { return motionList; }
            Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper<Device>()
                    .eq(Device::getDeviceNo, task.getShuttleNo())
                    .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())
                    .eq(Device::getHostId, task.getHostId())
                    .eq(Device::getStatus, 1));
            if (shuttleDevice == null) {
                return motionList;
            }
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleDevice.getId().intValue());
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
//            String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
            String shuttleLocNo = "0100201";
            if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
                return motionList;
            }
            if (!shuttleThread.isIdle()) {
                return motionList;
            }
//            // conveyor
//            DevpSlave devpSlave = conveyorDispatcher.queryByInBound(task.getSourceStaNo());
//            DevpSlave.Sta slaveInSta = devpSlave.queryInSta(wrkMast.getSourceStaNo());
            String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
//            //检测穿梭车是否有任务绑定
//            boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleProtocol.getShuttleNo().intValue());
//            if (shuttleResult) {
//                //存在任务,禁止解析
//                return motionList;
//            }
//
//            //检测提升机是否有任务绑定
//            boolean liftResult = Utils.checkLiftHasBinding(liftSlave.getId());
//            if (liftResult) {
//                //存在任务,禁止解析
//                return motionList;
//            }
            //获取距离目标位置最近的空闲可换层提升机
            LiftThread liftThread = liftDispatcher.searchIdleLift(shuttleLocNo, task.getHostId(), true);
            if (liftThread == null) {
                return motionList;
            }
            Device transferLiftDevice = liftThread.getDevice();
//            //穿梭车到提升机库位号
//            String liftLocNoTo = LiftCodeType.getLocNo(Integer.parseInt(liftNo), Utils.getLev(shuttleLocNo), task.getHostId());
//
//            //穿梭车出提升机库位号
//            String liftLocNoFrom = LiftCodeType.getLocNo(Integer.parseInt(liftNo), Utils.getLev(task.getDestLoc()), task.getHostId());
//
//            //穿梭车到提升机待机位库位号
//            String standbyLocNoTo = LiftCodeType.getStandbyLocNo(Integer.parseInt(liftNo), Utils.getLev(shuttleLocNo));
//
//            //穿梭车出提升机待机位库位号
//            String standbyLocNoFrom = LiftCodeType.getStandbyLocNo(Integer.parseInt(liftNo), Utils.getLev(task.getDestLoc()));
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null || liftProtocol.getLiftNo() == null) {
                return motionList;
            }
            //检测穿梭车是否有任务绑定
            boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleDevice, task.getTaskNo());
            if (shuttleResult) {
                //存在任务,禁止解析
                return motionList;
            }
            //检测提升机是否有任务绑定
            boolean liftResult = Utils.checkLiftHasBinding(Integer.parseInt(transferLiftDevice.getDeviceNo()));
            if (liftResult) {
                //存在任务,禁止解析
                return motionList;
            }
            //获取小车待机库位 ==> 进提升机
            ShuttleStandby shuttleStandbyTo = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
                    .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId())
                    .eq(ShuttleStandby::getDeviceLev, Utils.getLev(shuttleLocNo))
                    .eq(ShuttleStandby::getStatus, 1));
            //获取小车待机库位 ==> 出提升机
            ShuttleStandby shuttleStandbyFrom = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
                    .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId())
                    .eq(ShuttleStandby::getDeviceLev, Utils.getLev(destLoc))
                    .eq(ShuttleStandby::getStatus, 1));
            if (shuttleStandbyTo == null || shuttleStandbyFrom == null) {
                return motionList;
            }
            //穿梭车进提升机库位号
            String liftLocNoTo = shuttleStandbyTo.getDeviceLoc();
            //穿梭车出提升机库位号
            String liftLocNoFrom = shuttleStandbyFrom.getDeviceLoc();
            //穿梭车进提升机待机位库位号
            String standbyLocNoTo = shuttleStandbyTo.getDeviceStandbyLoc();
            //穿梭车出提升机待机位库位号
            String standbyLocNoFrom = shuttleStandbyFrom.getDeviceStandbyLoc();
            // 入库目标层有穿梭车
            if (Utils.getLev(shuttleLocNo) == Utils.getLev(task.getDestLoc())) {
                // 穿梭车走行至库位
                // 提升机载货移动
                motionList.addAll(kernelService.liftMoveGoods(
                        MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(5);//索牌项目5层是输送线层
                            dto.setStaNo(1);//提升机左侧
                        }))
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(task.getDestLoc()));
                            dto.setStaNo(0);//提升机内侧
                        }))
                ));
                // 穿梭车走行至提升机库位待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(Integer.valueOf(shuttleProtocol.getShuttleNo()));
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(shuttleLocNo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(Integer.valueOf(shuttleProtocol.getShuttleNo()));
                            dto.setLocNo(task.getDestLoc());
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
//                // 提升机空载移动
//                motionList.addAll(kernelService.liftMove(
//                        null
//                        , MotionDto.build((dto -> {
//                            dto.setLiftNo(Integer.valueOf(liftProtocol.getLiftNo()));
////                            dto.setLev(slaveInSta.getLiftLev());
//                            dto.setLev(1);
//                        }))
//                ));
//
//                // 输送线入库至提升机口
//                motionList.addAll(kernelService.conveyorInbound(
//                        MotionDto.build((dto -> {
////                            dto.setDevpNo(devpSlave.getId());
//                            dto.setDevpNo(1);
//                            dto.setStaNo(Integer.valueOf(task.getOriginSite()));
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setLiftNo(Integer.valueOf(liftProtocol.getLiftNo()));
////                            dto.setLev(slaveInSta.getLiftLev());
//                            dto.setLev(1);
//                        })),
//                        MotionCtgType.CONVEYOR_INBOUND_TO_LIFT
//                ));
//
//                // 目标库位是否与输送线入库站属于同一层
//                if (!slaveInSta.getLiftLev().equals(Utils.getLev(wrkMast.getLocNo()))) {
//                    // 提升机载货移动
//                    motionList.addAll(kernelService.liftMoveGoods(
//                            MotionDto.build((dto -> {
//                                dto.setLiftNo(liftSlave.getId());
//                                dto.setLev(slaveInSta.getLiftLev());
//                            }))
//                            , MotionDto.build((dto -> {
//                                dto.setLiftNo(liftSlave.getId());
//                                dto.setLev(Utils.getLev(wrkMast.getLocNo()));
//                            }))
//                    ));
//                }
//
//                // 穿梭车走行至提升机库位待机位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(shuttleLocNo);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(standbyLocNoTo);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE
//                ));
//
//                // 提升机移动至小车楼层
//                motionList.addAll(kernelService.liftMove(
//                        null
//                        , MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(Utils.getLev(shuttleLocNo));
//                        }))
//                ));
//
//                // 穿梭车待机位至提升机库位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoTo);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoTo);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_TO_LIFT
//                ));
//
//                // 穿梭车入库顶升并移动至提升机待机位
//                motionList.addAll(kernelService.shuttleTransport(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionCtgType.SHUTTLE_TRANSPORT_FROM_LIFT
//                ));
//
//                // 穿梭车走行至提升机库位待机位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(wrkMast.getLocNo());
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_DOWN_PALLET
//                ));
                // 锁定提升机
                motionList.addAll(kernelService.liftLock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车待机位至提升机
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_TO_LIFT
                ));
                // 穿梭车入库顶升
                motionList.addAll(kernelService.shuttleAction(
                        null,
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                        })),
                        MotionCtgType.SHUTTLE_PALLET_LIFT
                ));
                // 穿梭车入库移动至提升机待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
                ));
                // 解锁提升机
                motionList.addAll(kernelService.liftUnlock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车走行至目标库位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(destLoc);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 穿梭车入库托盘下降
                motionList.addAll(kernelService.shuttleAction(
                        null,
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                        })),
                        MotionCtgType.SHUTTLE_PALLET_DOWN
                ));
            /**
             * 二、入库目标层没有穿梭车
@@ -258,458 +270,654 @@
             * 6.穿梭车入库至目标库位
             */
            } else {
//
//                // 穿梭车走行至提升机库位待机位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(shuttleLocNo);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(standbyLocNoTo);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE
//                ));
//
//                // 提升机空载移动到穿梭车层
//                motionList.addAll(kernelService.liftMove(
//                        null
//                        , MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(Utils.getLev(shuttleLocNo));
//                        }))
//                ));
//
//                // 穿梭车待机位至提升机库位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoTo);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoTo);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_TO_LIFT
//                ));
//
//                // 提升机搬车 至 输送线层
//                motionList.addAll(kernelService.liftMoveShuttle(
//                        MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(Utils.getLev(shuttleLocNo));
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(slaveInSta.getLiftLev());
//                        }))
//                ));
//
//                // 输送线入库至提升机口
//                motionList.addAll(kernelService.conveyorInbound(
//                        MotionDto.build((dto -> {
//                            dto.setDevpNo(devpSlave.getId());
//                            dto.setStaNo(wrkMast.getSourceStaNo());
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(slaveInSta.getLiftLev());
//                        })),
//                        MotionCtgType.CONVEYOR_INBOUND_TO_LIFT
//                ));
//
//                // 目标库位是否与输送线入库站属于同一层
//                if (!slaveInSta.getLiftLev().equals(Utils.getLev(wrkMast.getLocNo()))) {
//                    // 提升机载货移动
//                    motionList.addAll(kernelService.liftMoveGoodsAndShuttle(
//                            MotionDto.build((dto -> {
//                                dto.setLiftNo(liftSlave.getId());
//                                dto.setLev(slaveInSta.getLiftLev());
//                            }))
//                            , MotionDto.build((dto -> {
//                                dto.setLiftNo(liftSlave.getId());
//                                dto.setLev(Utils.getLev(wrkMast.getLocNo()));
//                            }))
//                    ));
//                }
//
//                // 穿梭车入库顶升并移动至提升机待机位
//                motionList.addAll(kernelService.shuttleTransport(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionCtgType.SHUTTLE_TRANSPORT_FROM_LIFT
//                ));
//
//                // 穿梭车待机位至入库库位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(wrkMast.getLocNo());
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_DOWN_PALLET
//                ));
                // 穿梭车走行至提升机库位待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(shuttleLocNo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 提升机空载移动到穿梭车层
                motionList.addAll(kernelService.liftMove(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(shuttleLocNo));
                        }))
                ));
                // 锁定提升机
                motionList.addAll(kernelService.liftLock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车待机位至提升机
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_TO_LIFT
                ));
                // 解锁提升机
                motionList.addAll(kernelService.liftUnlock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 提升机载货移动
                motionList.addAll(kernelService.liftMoveGoods(
                        MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(5);//索牌项目5层是输送线层
                            dto.setStaNo(1);//提升机左侧
                        }))
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(task.getDestLoc()));
                            dto.setStaNo(0);//提升机内侧
                        }))
                ));
                // 锁定提升机
                motionList.addAll(kernelService.liftLock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车入库顶升
                motionList.addAll(kernelService.shuttleAction(
                        null,
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                        })),
                        MotionCtgType.SHUTTLE_PALLET_LIFT
                ));
                // 更新小车坐标
                motionList.addAll(kernelService.shuttleUpdateLocation(
                        null
                        , MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(liftLocNoFrom);
                        }))
                ));
                // 穿梭车入库移动至提升机待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
                ));
                // 解锁提升机
                motionList.addAll(kernelService.liftUnlock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车走行至目标库位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(destLoc);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 穿梭车入库托盘下降
                motionList.addAll(kernelService.shuttleAction(
                        null,
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                        })),
                        MotionCtgType.SHUTTLE_PALLET_DOWN
                ));
            }
            shuttleNo = String.valueOf(shuttleProtocol.getShuttleNo());
//            liftNo = String.valueOf(liftProtocol.getLiftNo());
        }
        /**
         * 出库
         */
        if (task.getTaskSts() == TaskStsType.NEW_OUTBOUND.sts) {
//            // lift
//            LiftProtocol liftProtocol = liftDispatcher.queryLiftForTransport(wrkMast.getStaNo());
//            LiftSlave liftSlave = liftProtocol.querySlave();
//
//            // shuttle
//            ShuttleProtocol shuttleProtocol = shuttleDispatcher.queryShuttleWhichConvenient(wrkMast, liftProtocol.getLiftNo().intValue());
//            if (Cools.isEmpty(shuttleProtocol)) { return motionList; }
//            String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
//
//            // conveyor
//            DevpSlave devpSlave = conveyorDispatcher.queryByOutBound(wrkMast.getSourceStaNo());
//            DevpSlave.Sta slaveOutSta = devpSlave.queryOutSta(wrkMast.getSourceStaNo());
//
//            //检测穿梭车是否有任务绑定
//            boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleProtocol.getShuttleNo().intValue());
//            if (shuttleResult) {
//                //存在任务,禁止解析
//                return motionList;
//            }
//
//            //检测提升机是否有任务绑定
//            boolean liftResult = Utils.checkLiftHasBinding(liftSlave.getId());
//            if (liftResult) {
//                //存在任务,禁止解析
//                return motionList;
//            }
//
//            //穿梭车到提升机库位号
//            String liftLocNoTo = LiftCodeType.getLocNo(liftSlave.getId(), Utils.getLev(shuttleLocNo));
//
//            //穿梭车出提升机库位号
//            String liftLocNoFrom = LiftCodeType.getLocNo(liftSlave.getId(), Utils.getLev(wrkMast.getSourceLocNo()));
//
//            //穿梭车到提升机待机位库位号
//            String standbyLocNoTo = LiftCodeType.getStandbyLocNo(liftSlave.getId(), Utils.getLev(shuttleLocNo));
//
//            //穿梭车出提升机待机位库位号
//            String standbyLocNoFrom = LiftCodeType.getStandbyLocNo(liftSlave.getId(), Utils.getLev(wrkMast.getSourceLocNo()));
//
//            /**
//             * 出库
//             * 一、出库起始层有穿梭车
//             * 1.穿梭车走行至出库库位
//             * 2.提升机到出库起始层
//             * 3.穿梭车出库至提升机
//             * 4.穿梭车离开提升机
//             * 5.提升机载货移动(非必需)
//             * 6.输送线运输至出库口
//             */
//            if (Utils.getLev(shuttleLocNo) == Utils.getLev(wrkMast.getSourceLocNo())) {
//
//                //穿梭车不在出库库位
//                if (!shuttleLocNo.equals(wrkMast.getSourceLocNo())) {
//                    // 穿梭车走行至出库库位
//                    motionList.addAll(kernelService.shuttleMove(
//                            MotionDto.build((dto -> {
//                                dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                                dto.setLocNo(shuttleLocNo);
//                            })),
//                            MotionDto.build((dto -> {
//                                dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                                dto.setLocNo(wrkMast.getSourceLocNo());
//                            })),
//                            MotionCtgType.SHUTTLE_MOVE
//                    ));
//                }
//
//                // 穿梭车出库至提升机待机位
//                motionList.addAll(kernelService.shuttleTransport(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(wrkMast.getSourceLocNo());
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(standbyLocNoTo);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_LIFT_PALLET
//                ));
//
//                // 提升机空载移动
//                motionList.addAll(kernelService.liftMove(
//                        null
//                        , MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(Utils.getLev(wrkMast.getSourceLocNo()));
//                        }))
//                ));
//
//                // 穿梭车待机位至提升机
//                motionList.addAll(kernelService.shuttleTransport(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoTo);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoTo);
//                        })),
//                        MotionCtgType.SHUTTLE_TRANSPORT_TO_LIFT
//                ));
//
//                // 穿梭车离开提升机 - 到提升机待机位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
//                ));
//
//                // 提升机载货移动
//                // 出库库位是否与输送线出库站属于同一层
//                if (!slaveOutSta.getLiftLev().equals(Utils.getLev(wrkMast.getSourceLocNo()))) {
//                    motionList.addAll(kernelService.liftMoveGoods(
//                            MotionDto.build((dto -> {
//                                dto.setLiftNo(liftSlave.getId());
//                                dto.setLev(Utils.getLev(wrkMast.getSourceLocNo()));
//                            })),
//                            MotionDto.build((dto -> {
//                                dto.setLiftNo(liftSlave.getId());
//                                dto.setLev(slaveOutSta.getLiftLev());
//                            }))
//                    ));
//                }
//
//                LiftNeighborType neighborType = LiftNeighborType.query(liftSlave.getId(), slaveOutSta.getLiftLev(), false, wrkMast.getStaNo());
//
//                // 提升机运输到输送线
//                motionList.addAll(kernelService.liftTransportGoodsToConveyor(
//                        MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(slaveOutSta.getLiftLev());
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setDevpNo(devpSlave.getId());
//                            dto.setStaNo(neighborType.staNo);
//                        }))
//                ));
//
//                // 穿梭车提升机待机位 - 到待机位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(
//                                    ShuttleTempLocType.query(shuttleProtocol.getShuttleNo().intValue(), liftSlave.getId(), Utils.getLev(wrkMast.getSourceLocNo())).locNo
//                            );
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE
//                ));
//
//            /**
//             * 二、出库起始层没有穿梭车
//             *
//             * 1.提升机到穿梭车层
//             * 2.穿梭车走行至提升机
//             * 3.提升机载车至出库起始层
//             * 4.穿梭车走行至出库库位
//             * 5.穿梭车出库至提升机
//             * 6.穿梭车离开提升机
//             * 7.提升机载货移动(非必需)
//             * 8.输送线运输至出库口
//             *
//             */
//            } else {
//
//                // 穿梭车走行至提升机待机位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(shuttleLocNo);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(standbyLocNoTo);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE
//                ));
//
//                // 提升机到穿梭车层
//                motionList.addAll(kernelService.liftMove(
//                        null
//                        , MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(Utils.getLev(shuttleLocNo));
//                        }))
//                ));
//
//                // 穿梭车待机位至提升机
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoTo);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoTo);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_TO_LIFT
//                ));
//
//                // 提升机载车至出库起始层
//                motionList.addAll(kernelService.liftMoveShuttle(
//                        MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(Utils.getLev(shuttleLocNo));
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(Utils.getLev(wrkMast.getSourceLocNo()));
//                        }))
//                ));
//
//                // 穿梭车走行至提升机待机位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
//                ));
//
//                // 穿梭车提升机待机位至出库库位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(wrkMast.getSourceLocNo());
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE
//                ));
//
//                // 穿梭车出库至提升机待机位
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(wrkMast.getSourceLocNo());
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_LIFT_PALLET
//                ));
//
//                // 穿梭车提升机待机位至提升机
//                motionList.addAll(kernelService.shuttleTransport(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(standbyLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoFrom);
//                        })),
//                        MotionCtgType.SHUTTLE_TRANSPORT_TO_LIFT
//                ));
//
//                // 穿梭车离开提升机
//                motionList.addAll(kernelService.shuttleMove(
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLocNo(liftLocNoFrom);
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
//                            dto.setLocNo(
//                                ShuttleTempLocType.query(shuttleProtocol.getShuttleNo().intValue(), liftSlave.getId(), Utils.getLev(wrkMast.getSourceLocNo())).locNo
//                            );
//                        })),
//                        MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
//                ));
//
//                // 提升机载货移动
//                // 出库库位是否与输送线出库站属于同一层
//                if (!slaveOutSta.getLiftLev().equals(Utils.getLev(wrkMast.getSourceLocNo()))) {
//                    motionList.addAll(kernelService.liftMoveGoods(
//                            MotionDto.build((dto -> {
//                                dto.setLiftNo(liftSlave.getId());
//                                dto.setLev(Utils.getLev(wrkMast.getSourceLocNo()));
//                            })),
//                            MotionDto.build((dto -> {
//                                dto.setLiftNo(liftSlave.getId());
//                                dto.setLev(slaveOutSta.getLiftLev());
//                            }))
//                    ));
//                }
//
//                LiftNeighborType neighborType = LiftNeighborType.query(liftSlave.getId(), slaveOutSta.getLiftLev(), false, wrkMast.getStaNo());
//
//                // 提升机运输到输送线
//                motionList.addAll(kernelService.liftTransportGoodsToConveyor(
//                        MotionDto.build((dto -> {
//                            dto.setLiftNo(liftSlave.getId());
//                            dto.setLev(slaveOutSta.getLiftLev());
//                        })),
//                        MotionDto.build((dto -> {
//                            dto.setDevpNo(devpSlave.getId());
//                            dto.setStaNo(neighborType.staNo);
//                        }))
//                ));
//
//            }
//
//            shuttleNo = String.valueOf(shuttleProtocol.getShuttleNo());
//            liftNo = String.valueOf(liftProtocol.getLiftNo());
        }
            // locNo
            String originLoc = task.getOriginLoc();
        assert !Cools.isEmpty(shuttleNo);
//        task.setShuttleNo(Integer.parseInt(shuttleNo));
//        task.setLiftNo(Integer.parseInt(liftNo));
            // shuttle
            Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper<Device>()
                    .eq(Device::getDeviceNo, task.getShuttleNo())
                    .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())
                    .eq(Device::getHostId, task.getHostId())
                    .eq(Device::getStatus, 1));
            if (shuttleDevice == null) {
                return motionList;
            }
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleDevice.getId().intValue());
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
                return motionList;
            }
            if (!shuttleThread.isIdle()) {
                return motionList;
            }
            String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
            //获取距离目标位置最近的空闲可换层提升机
            LiftThread liftThread = liftDispatcher.searchIdleLift(shuttleLocNo, task.getHostId(), true);
            if (liftThread == null) {
                return motionList;
            }
            Device transferLiftDevice = liftThread.getDevice();
            LiftProtocol liftProtocol = liftThread.getStatus();
            if (liftProtocol == null || liftProtocol.getLiftNo() == null) {
                return motionList;
            }
            //检测穿梭车是否有任务绑定
            boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleDevice, task.getTaskNo());
            if (shuttleResult) {
                //存在任务,禁止解析
                return motionList;
            }
            //检测提升机是否有任务绑定
            boolean liftResult = Utils.checkLiftHasBinding(Integer.parseInt(transferLiftDevice.getDeviceNo()));
            if (liftResult) {
                //存在任务,禁止解析
                return motionList;
            }
            //获取小车待机库位 ==> 进提升机
            ShuttleStandby shuttleStandbyTo = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
                    .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId())
                    .eq(ShuttleStandby::getDeviceLev, Utils.getLev(shuttleLocNo))
                    .eq(ShuttleStandby::getStatus, 1));
            //获取小车待机库位 ==> 出提升机
            ShuttleStandby shuttleStandbyFrom = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
                    .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId())
                    .eq(ShuttleStandby::getDeviceLev, Utils.getLev(originLoc))
                    .eq(ShuttleStandby::getStatus, 1));
            if (shuttleStandbyTo == null || shuttleStandbyFrom == null) {
                return motionList;
            }
            //穿梭车进提升机库位号
            String liftLocNoTo = shuttleStandbyTo.getDeviceLoc();
            //穿梭车出提升机库位号
            String liftLocNoFrom = shuttleStandbyFrom.getDeviceLoc();
            //穿梭车进提升机待机位库位号
            String standbyLocNoTo = shuttleStandbyTo.getDeviceStandbyLoc();
            //穿梭车出提升机待机位库位号
            String standbyLocNoFrom = shuttleStandbyFrom.getDeviceStandbyLoc();
            //穿梭车出提升机后小车待机位
            String shuttleFromLiftStandbyLoc = shuttleStandbyFrom.getStandbyLoc();
            //获取输送线路径
            BasConveyorPath basConveyorPath = basConveyorPathService.getOne(new LambdaQueryWrapper<BasConveyorPath>()
                    .eq(BasConveyorPath::getDeviceStn, task.getOriginSite())
                    .eq(BasConveyorPath::getDeviceNo, liftProtocol.getLiftNo()));
            if (basConveyorPath == null) {
                return motionList;
            }
            /**
             * 出库
             * 一、出库起始层有穿梭车
             * 1.穿梭车走行至出库库位
             * 2.提升机到出库起始层
             * 3.穿梭车出库至提升机
             * 4.穿梭车离开提升机
             * 5.提升机载货移动(非必需)
             * 6.输送线运输至出库口
             */
            if (Utils.getLev(shuttleLocNo) == Utils.getLev(originLoc)) {
                //穿梭车不在出库库位
                if (!shuttleLocNo.equals(task.getOriginLoc())) {
                    // 穿梭车走行至出库库位
                    motionList.addAll(kernelService.shuttleMove(
                            MotionDto.build((dto -> {
                                dto.setShuttleNo(shuttleDevice.getId().intValue());
                                dto.setLocNo(shuttleLocNo);
                            })),
                            MotionDto.build((dto -> {
                                dto.setShuttleNo(shuttleDevice.getId().intValue());
                                dto.setLocNo(originLoc);
                            })),
                            MotionCtgType.SHUTTLE_MOVE
                    ));
                }
                // 穿梭车出库顶升
                motionList.addAll(kernelService.shuttleAction(
                        null,
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                        })),
                        MotionCtgType.SHUTTLE_PALLET_LIFT
                ));
                // 穿梭车出库至提升机待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(originLoc);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 提升机空载移动到穿梭车层
                motionList.addAll(kernelService.liftMove(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(shuttleLocNo));
                        }))
                ));
                // 锁定提升机
                motionList.addAll(kernelService.liftLock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车待机位至提升机
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_TO_LIFT
                ));
                // 穿梭车出库托盘下降
                motionList.addAll(kernelService.shuttleAction(
                        null,
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                        })),
                        MotionCtgType.SHUTTLE_PALLET_DOWN
                ));
                // 穿梭车离开提升机 - 到提升机待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
                ));
                // 解锁提升机
                motionList.addAll(kernelService.liftUnlock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 提升机载货移动
                motionList.addAll(kernelService.liftMoveGoods(
                        MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(task.getOriginLoc()));
                            dto.setStaNo(0);//提升机内侧
                        }))
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(5);//索牌项目5层是输送线层
                            dto.setStaNo(1);//提升机左侧
                        }))
                ));
                // 穿梭车提升机待机位 - 到待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(shuttleFromLiftStandbyLoc);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 输送线运输至出库口
                motionList.addAll(kernelService.conveyorOutbound(
                        MotionDto.build((dto -> {
                            dto.setDevpNo(basConveyorPath.getDeviceId().intValue());
                            dto.setStaNo(basConveyorPath.getDeviceStn());
                        })),
                        MotionDto.build((dto -> {
                            dto.setDevpNo(basConveyorPath.getDeviceId().intValue());
                            dto.setStaNo(basConveyorPath.getStnNo());
                        })),
                        MotionCtgType.CONVEYOR_OUTBOUND
                ));
            /**
             * 二、出库起始层没有穿梭车
             *
             * 1.提升机到穿梭车层
             * 2.穿梭车走行至提升机
             * 3.提升机载车至出库起始层
             * 4.穿梭车走行至出库库位
             * 5.穿梭车出库至提升机
             * 6.穿梭车离开提升机
             * 7.提升机载货移动(非必需)
             * 8.输送线运输至出库口
             *
             */
            } else {
                // 穿梭车走行至提升机库位待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(shuttleLocNo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 提升机空载移动到穿梭车层
                motionList.addAll(kernelService.liftMove(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(shuttleLocNo));
                        }))
                ));
                // 锁定提升机
                motionList.addAll(kernelService.liftLock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车待机位至提升机
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_TO_LIFT
                ));
                // 解锁提升机
                motionList.addAll(kernelService.liftUnlock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 提升机搬车 至 目标位置层
                motionList.addAll(kernelService.liftMoveShuttle(
                        MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(shuttleLocNo));
                        })),
                        MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(liftLocNoFrom));
                        }))
                ));
                // 锁定提升机
                motionList.addAll(kernelService.liftLock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 更新小车坐标
                motionList.addAll(kernelService.shuttleUpdateLocation(
                        null
                        , MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(liftLocNoFrom);
                        }))
                ));
                // 穿梭车走行至提升机待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
                ));
                // 解锁提升机
                motionList.addAll(kernelService.liftUnlock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车提升机待机位至出库库位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(originLoc);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 穿梭车出库顶升
                motionList.addAll(kernelService.shuttleAction(
                        null,
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                        })),
                        MotionCtgType.SHUTTLE_PALLET_LIFT
                ));
                // 穿梭车出库至提升机待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(originLoc);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 提升机空载移动到穿梭车层
                motionList.addAll(kernelService.liftMove(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(shuttleLocNo));
                        }))
                ));
                // 锁定提升机
                motionList.addAll(kernelService.liftLock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 穿梭车待机位至提升机
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_TO_LIFT
                ));
                // 穿梭车出库托盘下降
                motionList.addAll(kernelService.shuttleAction(
                        null,
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                        })),
                        MotionCtgType.SHUTTLE_PALLET_DOWN
                ));
                // 穿梭车离开提升机 - 到提升机待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
                ));
                // 解锁提升机
                motionList.addAll(kernelService.liftUnlock(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                        }))
                ));
                // 提升机载货移动
                motionList.addAll(kernelService.liftMoveGoods(
                        MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(task.getOriginLoc()));
                            dto.setStaNo(0);//提升机内侧
                        }))
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(5);//索牌项目5层是输送线层
                            dto.setStaNo(1);//提升机左侧
                        }))
                ));
                // 穿梭车提升机待机位 - 到待机位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(shuttleFromLiftStandbyLoc);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 输送线运输至出库口
                motionList.addAll(kernelService.conveyorOutbound(
                        MotionDto.build((dto -> {
                            dto.setDevpNo(basConveyorPath.getDeviceId().intValue());
                            dto.setStaNo(basConveyorPath.getDeviceStn());
                        })),
                        MotionDto.build((dto -> {
                            dto.setDevpNo(basConveyorPath.getDeviceId().intValue());
                            dto.setStaNo(basConveyorPath.getStnNo());
                        })),
                        MotionCtgType.CONVEYOR_OUTBOUND
                ));
            }
        }
        return motionList;
    }
@@ -747,19 +955,20 @@
        String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
        // lift
        Device transferLiftDevice = Utils.getRecentTransferLift(shuttleLocNo, shuttleProtocol.getShuttleNo());
        if (transferLiftDevice == null) {
        //获取距离目标位置最近的空闲可换层提升机
        LiftThread liftThread = liftDispatcher.searchIdleLift(shuttleLocNo, task.getHostId(), true);
        if (liftThread == null) {
            return motionList;
        }
        LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, transferLiftDevice.getId().intValue());
        Device transferLiftDevice = liftThread.getDevice();
        LiftProtocol liftProtocol = liftThread.getStatus();
        if (liftProtocol == null || liftProtocol.getLiftNo() == null) {
            return motionList;
        }
        //检测穿梭车是否有任务绑定
        boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleDevice);
        boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleDevice, task.getTaskNo());
        if (shuttleResult) {
            //存在任务,禁止解析
            return motionList;
@@ -839,7 +1048,15 @@
                    }))
            ));
            // 穿梭车提升机待机位至提升机库位
            // 锁定提升机
            motionList.addAll(kernelService.liftLock(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(transferLiftDevice.getId().intValue());
                    }))
            ));
            // 穿梭车提升机待机位至提升机
            motionList.addAll(kernelService.shuttleMove(
                    MotionDto.build((dto -> {
                        dto.setShuttleNo(shuttleDevice.getId().intValue());
@@ -853,7 +1070,15 @@
                    MotionCtgType.SHUTTLE_MOVE_TO_LIFT
            ));
            // 提升机搬车 至 输送线层
            // 解锁提升机
            motionList.addAll(kernelService.liftUnlock(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(transferLiftDevice.getId().intValue());
                    }))
            ));
            // 提升机搬车 至 充电层
            motionList.addAll(kernelService.liftMoveShuttle(
                    MotionDto.build((dto -> {
                        dto.setLiftNo(transferLiftDevice.getId().intValue());
@@ -862,6 +1087,23 @@
                    MotionDto.build((dto -> {
                        dto.setLiftNo(transferLiftDevice.getId().intValue());
                        dto.setLev(Utils.getLev(chargeLocNo));
                    }))
            ));
            // 锁定提升机
            motionList.addAll(kernelService.liftLock(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(transferLiftDevice.getId().intValue());
                    }))
            ));
            // 更新小车坐标
            motionList.addAll(kernelService.shuttleUpdateLocation(
                    null
                    , MotionDto.build((dto -> {
                        dto.setShuttleNo(shuttleDevice.getId().intValue());
                        dto.setLocNo(liftLocNoFrom);
                    }))
            ));
@@ -877,6 +1119,14 @@
                        dto.setLocNo(standbyLocNoFrom);
                    })),
                    MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
            ));
            // 解锁提升机
            motionList.addAll(kernelService.liftUnlock(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(transferLiftDevice.getId().intValue());
                    }))
            ));
            // 穿梭车提升机待机位至充电位
@@ -992,24 +1242,26 @@
        // 判断穿梭车是否在目标层
        if (Utils.getLev(shuttleLocNo) == Utils.getLev(locNo)) {
            // 穿梭车走行至目标库位
            motionList.addAll(kernelService.shuttleMove(
                    MotionDto.build((dto -> {
                        dto.setShuttleNo(shuttleDevice.getId().intValue());
                        dto.setLocNo(shuttleLocNo);
                    })),
                    MotionDto.build((dto -> {
                        dto.setShuttleNo(shuttleDevice.getId().intValue());
                        dto.setLocNo(locNo);
                    })),
                    MotionCtgType.SHUTTLE_MOVE
            ));
            if (!shuttleLocNo.equals(locNo)) {//小车不在目标库位
                // 穿梭车走行至目标库位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(shuttleLocNo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLocNo(locNo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
            }
        } else {
            //小车跨层
            //获取距离目标位置最近的空闲提升机
            LiftThread liftThread = liftDispatcher.searchIdleLift(locNo, task.getHostId());
            //获取距离目标位置最近的空闲可换层提升机
            LiftThread liftThread = liftDispatcher.searchIdleLift(locNo, task.getHostId(), true);
            if (liftThread == null) {
                return motionList;
            }
@@ -1051,7 +1303,15 @@
                    }))
            ));
            // 穿梭车待机位至提升机库位
            // 锁定提升机
            motionList.addAll(kernelService.liftLock(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(liftDevice.getId().intValue());
                    }))
            ));
            // 穿梭车待机位至提升机
            motionList.addAll(kernelService.shuttleMove(
                    MotionDto.build((dto -> {
                        dto.setShuttleNo(shuttleDevice.getId().intValue());
@@ -1065,6 +1325,22 @@
                    MotionCtgType.SHUTTLE_MOVE_TO_LIFT
            ));
            // 向提升机发送小车已到位信号
            motionList.addAll(kernelService.liftShuttleArrival(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(liftDevice.getId().intValue());
                    }))
            ));
            // 解锁提升机
            motionList.addAll(kernelService.liftUnlock(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(liftDevice.getId().intValue());
                    }))
            ));
            // 提升机搬车 至 目标位置层
            motionList.addAll(kernelService.liftMoveShuttle(
                    MotionDto.build((dto -> {
@@ -1074,6 +1350,23 @@
                    MotionDto.build((dto -> {
                        dto.setLiftNo(liftDevice.getId().intValue());
                        dto.setLev(Utils.getLev(locNo));
                    }))
            ));
            // 锁定提升机
            motionList.addAll(kernelService.liftLock(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(liftDevice.getId().intValue());
                    }))
            ));
            // 更新小车坐标
            motionList.addAll(kernelService.shuttleUpdateLocation(
                    null
                    , MotionDto.build((dto -> {
                        dto.setShuttleNo(shuttleDevice.getId().intValue());
                        dto.setLocNo(liftLocNoFrom);
                    }))
            ));
@@ -1089,6 +1382,14 @@
                        dto.setLocNo(standbyLocNoFrom);
                    })),
                    MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
            ));
            // 解锁提升机
            motionList.addAll(kernelService.liftUnlock(
                    null
                    , MotionDto.build((dto -> {
                        dto.setLiftNo(liftDevice.getId().intValue());
                    }))
            ));
            // 穿梭车提升机待机位至目标位置
@@ -1198,18 +1499,20 @@
            // 判断穿梭车是否在目标层
            if (Utils.getLev(shuttleLocNo) == Utils.getLev(targetLoc)) {
                // 穿梭车走行至源库位
                motionList.addAll(kernelService.shuttleMove(
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(device.getId().intValue());
                            dto.setLocNo(shuttleLocNo);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(device.getId().intValue());
                            dto.setLocNo(sourceLoc);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                if (!shuttleLocNo.equals(sourceLoc)) {//小车不在目标库位
                    // 穿梭车走行至源库位
                    motionList.addAll(kernelService.shuttleMove(
                            MotionDto.build((dto -> {
                                dto.setShuttleNo(device.getId().intValue());
                                dto.setLocNo(shuttleLocNo);
                            })),
                            MotionDto.build((dto -> {
                                dto.setShuttleNo(device.getId().intValue());
                                dto.setLocNo(sourceLoc);
                            })),
                            MotionCtgType.SHUTTLE_MOVE
                    ));
                }
                //托盘顶升
                motionList.add(Motion.build(motion -> {