#
Junjie
2024-07-10 e62c1e7ff1fa9623ac3f8e6aa35ad44b725a21ed
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
@@ -2,25 +2,23 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.common.R;
import com.zy.asrs.wcs.core.domain.dto.MotionDto;
import com.zy.asrs.wcs.core.entity.ShuttleStandby;
import com.zy.asrs.wcs.core.entity.Task;
import com.zy.asrs.wcs.core.entity.*;
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.TaskCtgType;
import com.zy.asrs.wcs.core.model.enums.TaskStsType;
import com.zy.asrs.wcs.core.service.ShuttleStandbyService;
import com.zy.asrs.wcs.core.service.TaskService;
import com.zy.asrs.wcs.core.service.*;
import com.zy.asrs.wcs.core.utils.ConveyorDispatcher;
import com.zy.asrs.wcs.core.utils.LiftDispatcher;
import com.zy.asrs.wcs.core.utils.ShuttleDispatcher;
import com.zy.asrs.wcs.core.utils.Utils;
import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
import com.zy.asrs.wcs.core.entity.Motion;
import com.zy.asrs.wcs.rcs.entity.Device;
import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol;
import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
import com.zy.asrs.wcs.core.service.MotionService;
import com.zy.asrs.wcs.rcs.service.DeviceService;
import com.zy.asrs.wcs.rcs.thread.LiftThread;
import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
@@ -53,6 +51,10 @@
    private DeviceService deviceService;
    @Autowired
    private ShuttleStandbyService shuttleStandbyService;
    @Autowired
    private BasConveyorPathService basConveyorPathService;
    @Autowired
    private TaskCtgService taskCtgService;
    public List<Motion> generateMotion(Task task) {
        List<Motion> motionList = new ArrayList<>();
@@ -115,13 +117,6 @@
                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())
@@ -163,6 +158,7 @@
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(task.getDestLoc()));
                            dto.setStaNo(0);//提升机内侧
                            dto.setSync(0);//异步执行
                        }))
                ));
@@ -174,7 +170,6 @@
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(standbyLocNoTo);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
@@ -230,6 +225,7 @@
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setReleaseLift(1);//执行完成后释放提升机
                        }))
                ));
@@ -379,6 +375,7 @@
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setReleaseLift(1);//执行完成后释放提升机
                        }))
                ));
@@ -455,13 +452,6 @@
                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())
@@ -489,298 +479,442 @@
            //穿梭车出提升机待机位库位号
            String standbyLocNoFrom = shuttleStandbyFrom.getDeviceStandbyLoc();
//            /**
//             * 出库
//             * 一、出库起始层有穿梭车
//             * 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());
            //穿梭车出提升机后小车待机位
            String shuttleFromLiftStandbyLoc = shuttleStandbyFrom.getStandbyLoc();
            //获取出库任务类型
            TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>()
                    .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.OUT))
                    .eq(TaskCtg::getStatus, 1));
            if (taskCtg == null) {
                return motionList;
            }
            //获取输送线路径
            BasConveyorPath basConveyorPath = basConveyorPathService.getOne(new LambdaQueryWrapper<BasConveyorPath>()
                    .eq(BasConveyorPath::getDeviceStn, task.getOriginSite())
                    .eq(BasConveyorPath::getDeviceNo, liftProtocol.getLiftNo())
                    .eq(BasConveyorPath::getTypeNo, taskCtg.getId()));
            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);//提升机左侧
                            dto.setSync(0);//异步执行
                            dto.setReleaseLift(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());
                            dto.setReleaseLift(1);//执行完成后释放提升机
                        }))
                ));
                // 穿梭车提升机待机位至出库库位
                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(standbyLocNoFrom);
                        })),
                        MotionCtgType.SHUTTLE_MOVE
                ));
                // 提升机空载移动到目标层
                motionList.addAll(kernelService.liftMove(
                        null
                        , MotionDto.build((dto -> {
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLev(Utils.getLev(originLoc));
                        }))
                ));
                // 锁定提升机
                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(standbyLocNoFrom);
                        })),
                        MotionDto.build((dto -> {
                            dto.setShuttleNo(shuttleDevice.getId().intValue());
                            dto.setLiftNo(transferLiftDevice.getId().intValue());
                            dto.setLocNo(liftLocNoFrom);
                        })),
                        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);//提升机左侧
                            dto.setSync(0);//异步执行
                        }))
                ));
                // 穿梭车提升机待机位 - 到待机位
                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;
@@ -834,13 +968,6 @@
        //检测穿梭车是否有任务绑定
        boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleDevice, task.getTaskNo());
        if (shuttleResult) {
            //存在任务,禁止解析
            return motionList;
        }
        //检测提升机是否有任务绑定
        boolean liftResult = Utils.checkLiftHasBinding(Integer.parseInt(transferLiftDevice.getDeviceNo()));
        if (liftResult) {
            //存在任务,禁止解析
            return motionList;
        }
@@ -1006,16 +1133,15 @@
                    MotionCtgType.SHUTTLE_MOVE
            ));
            task.setLiftNo(Integer.parseInt(transferLiftDevice.getDeviceNo()));
            taskService.updateById(task);
        }
        // 穿梭车开始充电
        motionList.addAll(kernelService.shuttleCharge(
        motionList.addAll(kernelService.shuttleAction(
                null,
                MotionDto.build((dto -> {
                    dto.setShuttleNo(shuttleDevice.getId().intValue());
                }))
                })),
                MotionCtgType.SHUTTLE_CHARGE_ON
        ));
        return motionList;
@@ -1053,6 +1179,15 @@
        // 判断穿梭车是否在目标层
        if (Utils.getLev(shuttleLocNo) == Utils.getLev(locNo)) {
            // 穿梭车关闭充电
            motionList.addAll(kernelService.shuttleAction(
                    null,
                    MotionDto.build((dto -> {
                        dto.setShuttleNo(shuttleDevice.getId().intValue());
                    })),
                    MotionCtgType.SHUTTLE_CHARGE_OFF
            ));
            // 穿梭车走行至目标库位
            motionList.addAll(kernelService.shuttleMove(
                    MotionDto.build((dto -> {