| package com.zy.asrs.wcs.core.kernel; | 
|   | 
| import com.alibaba.fastjson.JSON; | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.zy.asrs.wcs.core.domain.dto.MotionDto; | 
| import com.zy.asrs.wcs.core.entity.*; | 
| import com.zy.asrs.wcs.core.model.NavigateNode; | 
| import com.zy.asrs.wcs.core.model.enums.*; | 
| import com.zy.asrs.wcs.core.service.*; | 
| import com.zy.asrs.wcs.core.utils.*; | 
| import com.zy.asrs.wcs.rcs.News; | 
| import com.zy.asrs.wcs.rcs.cache.SlaveConnection; | 
| import com.zy.asrs.wcs.rcs.entity.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.rcs.service.DeviceService; | 
| import com.zy.asrs.wcs.rcs.thread.LiftThread; | 
| import com.zy.asrs.wcs.rcs.thread.ShuttleThread; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.HashMap; | 
| import java.util.List; | 
|   | 
| /** | 
|  * 1.充电任务,2.库位移转,3.小车迁移,4.手动任务 | 
|  * Created by vincent on 2023/10/11 | 
|  */ | 
| @Service | 
| public class AnalyzeService { | 
|   | 
|     @Autowired | 
|     private TaskService taskService; | 
|     @Autowired | 
|     private MotionService motionService; | 
|     @Autowired | 
|     private KernelService kernelService; | 
|     @Autowired | 
|     private ShuttleDispatcher shuttleDispatcher; | 
|     @Autowired | 
|     private LiftDispatcher liftDispatcher; | 
|     @Autowired | 
|     private ConveyorDispatcher conveyorDispatcher; | 
|     @Autowired | 
|     private DeviceService deviceService; | 
|     @Autowired | 
|     private ShuttleStandbyService shuttleStandbyService; | 
|     @Autowired | 
|     private BasConveyorPathService basConveyorPathService; | 
|     @Autowired | 
|     private BasConveyorStaService basConveyorStaService; | 
|     @Autowired | 
|     private BasConveyorService basConveyorService; | 
|     @Autowired | 
|     private TaskCtgService taskCtgService; | 
|   | 
|     public Integer getStaByLev(Integer lev) { | 
|         HashMap<Integer, Integer> map = new HashMap<>(); | 
|         map.put(1, 31006); | 
|         map.put(2, 31007); | 
|         map.put(3, 31008); | 
|   | 
|         return map.get(lev); | 
|     } | 
|   | 
|     public List<Motion> generateMotion(Task task) { | 
|         List<Motion> motionList = new ArrayList<>(); | 
|         motionList = this.generateFirstZoneMotion(task); | 
|         return motionList; | 
|     } | 
|   | 
|     public List<Motion> generateFirstZoneMotion(Task task) { | 
|         List<Motion> motionList = new ArrayList<>(); | 
|   | 
|         /** | 
|          * 入库 | 
|          */ | 
|         if (task.getTaskSts() == TaskStsType.NEW_INBOUND.sts) { | 
|             // locNo | 
|             String destLoc = task.getDestLoc(); | 
|   | 
|             // 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; | 
|             } | 
|   | 
|             BasConveyorSta basConveyorStaDest = basConveyorStaService.selectBySiteNo(task.getDestSite()); | 
|             if (basConveyorStaDest == null) { | 
|                 return motionList; | 
|             } | 
|   | 
|             //检测穿梭车是否有任务绑定 | 
|             boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleDevice, task.getTaskNo()); | 
|             if (shuttleResult) { | 
|                 //存在任务,禁止解析 | 
|                 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(); | 
|   | 
|             //换层需要锁定的路径 | 
|             List<String> lockPath = shuttleStandbyFrom.getLockPath$(); | 
|   | 
|             // 入库目标层有穿梭车 | 
|             if (Utils.getLev(shuttleLocNo) == Utils.getLev(task.getDestLoc())) { | 
|   | 
|                 // 提升机载货移动 | 
|                 motionList.addAll(kernelService.liftMoveGoods( | 
|                         MotionDto.build((dto -> { | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLev(1);//光泰1层是输送线层 | 
|                             dto.setStaNo(31004);//入库站点 | 
|                         })) | 
|                         , MotionDto.build((dto -> { | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLev(Utils.getLev(task.getDestLoc())); | 
|                             dto.setStaNo(getStaByLev(Utils.getLev(task.getDestLoc()))); | 
|                             dto.setDevpNo(basConveyorStaDest.getConveyorDeviceId().intValue()); | 
|                             dto.setReleaseLift(1);//执行完成后释放提升机 | 
|                         })) | 
|                 )); | 
|   | 
|                 // 穿梭车走行至提升机库位待机位 | 
|                 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(standbyLocNoTo); | 
|                         })), | 
|                         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(standbyLocNoFrom); | 
|                         })), | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLocNo(destLoc); | 
| //                            dto.setReleaseLift(2);//执行中释放提升机 | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_TRANSPORT | 
|                 )); | 
|   | 
|                 // 穿梭车入库托盘下降 | 
|                 motionList.addAll(kernelService.shuttleAction( | 
|                         null, | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_PALLET_DOWN | 
|                 )); | 
|   | 
|             /** | 
|              * 二、入库目标层没有穿梭车 | 
|              */ | 
|             } else { | 
|   | 
|                 // 提升机载货移动 | 
|                 motionList.addAll(kernelService.liftMoveGoods( | 
|                         MotionDto.build((dto -> { | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLev(1);//光泰1层是输送线层 | 
|                             dto.setStaNo(31004);//入库站点 | 
|                         })) | 
|                         , MotionDto.build((dto -> { | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLev(Utils.getLev(task.getDestLoc())); | 
|                             dto.setStaNo(getStaByLev(Utils.getLev(task.getDestLoc()))); | 
|                             dto.setDevpNo(basConveyorStaDest.getConveyorDeviceId().intValue()); | 
|                             dto.setReleaseLift(1);//执行完成后释放提升机 | 
|                         })) | 
|                 )); | 
|   | 
|                 // 穿梭车走行至提升机库位待机位 | 
|                 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.mapLockPath( | 
|                         null, | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLocNo(JSON.toJSONString(lockPath)); | 
|                         })) | 
|                 )); | 
|   | 
|                 // 提升机空载移动到穿梭车层 | 
|                 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(destLoc)); | 
|                         })) | 
|                 )); | 
|   | 
|                 // 锁定提升机 | 
|                 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.mapUnlockPath( | 
|                         null, | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLocNo(JSON.toJSONString(lockPath)); | 
|                         })) | 
|                 )); | 
|   | 
|                 // 穿梭车入库顶升 | 
|                 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(standbyLocNoFrom); | 
|                         })), | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLocNo(destLoc); | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_TRANSPORT | 
|                 )); | 
|   | 
|                 // 穿梭车入库托盘下降 | 
|                 motionList.addAll(kernelService.shuttleAction( | 
|                         null, | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_PALLET_DOWN | 
|                 )); | 
|   | 
|             } | 
|   | 
|         } | 
|   | 
|         /** | 
|          * 出库 | 
|          */ | 
|         if (task.getTaskSts() == TaskStsType.NEW_OUTBOUND.sts) { | 
|             // locNo | 
|             String originLoc = task.getOriginLoc(); | 
|   | 
|             // 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; | 
|             } | 
|   | 
|             BasConveyorSta basConveyorStaOrigin = basConveyorStaService.selectBySiteNo(task.getOriginSite()); | 
|             if (basConveyorStaOrigin == null) { | 
|                 return motionList; | 
|             } | 
|   | 
|             //检测穿梭车是否有任务绑定 | 
|             boolean shuttleResult = Utils.checkShuttleHasBinding(shuttleDevice, task.getTaskNo()); | 
|             if (shuttleResult) { | 
|                 //存在任务,禁止解析 | 
|                 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 standbyLocs = shuttleStandbyFrom.getStandbyLoc();//获取全部待机位 | 
|   | 
|             //换层需要锁定的路径 | 
|             List<String> lockPath = shuttleStandbyFrom.getLockPath$(); | 
|   | 
|             //获取出库任务类型 | 
|             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; | 
|             } | 
|   | 
|             //分析出库路径待机库位 | 
|             String lastPathStartLoc = shuttleDispatcher.analyzeOutPathWaitLoc(originLoc, standbyLocNoTo, shuttleDevice); | 
|             if (lastPathStartLoc == null) { | 
|                 return motionList;//未分析成功 | 
|             } | 
|   | 
|             /** | 
|              * 出库 | 
|              */ | 
|             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 | 
|                 )); | 
|   | 
|                 if (!originLoc.equals(lastPathStartLoc)) { | 
|                     // 穿梭车载货出库至最后一段路径等待 | 
|                     motionList.addAll(kernelService.shuttleMove( | 
|                             MotionDto.build((dto -> { | 
|                                 dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                                 dto.setLocNo(originLoc); | 
|                             })), | 
|                             MotionDto.build((dto -> { | 
|                                 dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                                 dto.setLocNo(lastPathStartLoc); | 
|                             })), | 
|                             MotionCtgType.SHUTTLE_TRANSPORT | 
|                     )); | 
|                 } | 
|   | 
|                 // 穿梭车载货至提升机待机位 | 
|                 motionList.addAll(kernelService.shuttleMove( | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLocNo(lastPathStartLoc); | 
|                         })), | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLocNo(standbyLocNoTo); | 
|                             dto.setStaNo(getStaByLev(Utils.getLev(task.getOriginLoc())));//输送站 | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_TRANSPORT_TO_CONVEYOR | 
|                 )); | 
|   | 
|                 // 穿梭车出库托盘下降 | 
|                 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.setLocNo(standbyLocNoFrom); | 
|                         })), | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLocNo(standbyLocs); | 
|                             dto.setSync(0);//异步执行 | 
|                             dto.setReleaseShuttle(1);//执行完成后释放小车 | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_MOVE_STANDBY | 
|                 )); | 
|   | 
|                 // 提升机载货移动 | 
|                 motionList.addAll(kernelService.liftMoveGoods( | 
|                         MotionDto.build((dto -> { | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLev(Utils.getLev(task.getOriginLoc())); | 
|                             dto.setStaNo(getStaByLev(Utils.getLev(task.getOriginLoc())));//起始站点 | 
|                         })) | 
|                         , MotionDto.build((dto -> { | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLev(1);//光泰1层是输送线层 | 
|                             dto.setStaNo(31001);//出库站点 | 
|                             dto.setDevpNo(basConveyorStaOrigin.getConveyorDeviceId().intValue()); | 
|                             dto.setReleaseLift(1);//执行完成后释放提升机 | 
|                         })) | 
|                 )); | 
|   | 
|                 // 输送线运输至出库口 | 
| //                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 | 
| //                )); | 
|   | 
|             /** | 
|              * 二、出库起始层没有穿梭车 | 
|              */ | 
|             } 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.mapLockPath( | 
|                         null, | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLocNo(JSON.toJSONString(lockPath)); | 
|                         })) | 
|                 )); | 
|   | 
|                 // 提升机空载移动到穿梭车层 | 
|                 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.mapUnlockPath( | 
|                         null, | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLocNo(JSON.toJSONString(lockPath)); | 
|                         })) | 
|                 )); | 
|   | 
|                 // 穿梭车提升机待机位至出库库位 | 
|                 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 | 
|                 )); | 
|   | 
|                 if (!originLoc.equals(lastPathStartLoc)) { | 
|                     // 穿梭车载货出库至最后一段路径等待 | 
|                     motionList.addAll(kernelService.shuttleMove( | 
|                             MotionDto.build((dto -> { | 
|                                 dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                                 dto.setLocNo(originLoc); | 
|                             })), | 
|                             MotionDto.build((dto -> { | 
|                                 dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                                 dto.setLocNo(lastPathStartLoc); | 
|                             })), | 
|                             MotionCtgType.SHUTTLE_TRANSPORT | 
|                     )); | 
|                 } | 
|   | 
|                 // 穿梭车载货至提升机待机位 | 
|                 motionList.addAll(kernelService.shuttleMove( | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLocNo(lastPathStartLoc); | 
|                         })), | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLocNo(standbyLocNoFrom); | 
|                             dto.setStaNo(getStaByLev(Utils.getLev(task.getOriginLoc())));//输送站 | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_TRANSPORT_TO_CONVEYOR | 
|                 )); | 
|   | 
|                 // 穿梭车出库托盘下降 | 
|                 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.setLocNo(standbyLocNoFrom); | 
|                         })), | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                             dto.setLocNo(standbyLocs); | 
|                             dto.setSync(0);//异步执行 | 
|                             dto.setReleaseShuttle(1);//执行完成后释放小车 | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_MOVE_STANDBY | 
|                 )); | 
|   | 
|                 // 提升机载货移动 | 
|                 motionList.addAll(kernelService.liftMoveGoods( | 
|                         MotionDto.build((dto -> { | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLev(Utils.getLev(task.getOriginLoc())); | 
|                             dto.setStaNo(getStaByLev(Utils.getLev(task.getOriginLoc())));//起始站点 | 
|                         })) | 
|                         , MotionDto.build((dto -> { | 
|                             dto.setLiftNo(transferLiftDevice.getId().intValue()); | 
|                             dto.setLev(1);//光泰1层是输送线层 | 
|                             dto.setStaNo(31001);//出库站点 | 
|                             dto.setDevpNo(basConveyorStaOrigin.getConveyorDeviceId().intValue()); | 
|                             dto.setReleaseLift(1);//执行完成后释放提升机 | 
|                         })) | 
|                 )); | 
|   | 
|                 // 输送线运输至出库口 | 
| //                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; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 生成充电动作 | 
|      */ | 
|     public List<Motion> generateChargeMotion(Task task) { | 
|         List<Motion> motionList = new ArrayList<>(); | 
|         if (task.getTaskSts() != TaskStsType.NEW_CHARGE.sts) { | 
|             return motionList; | 
|         } | 
|   | 
|         // locNo | 
|         String chargeLocNo = task.getDestLoc(); | 
|   | 
|         // 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; | 
|         } | 
|   | 
|         //获取小车待机库位 ==> 进提升机 | 
|         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(chargeLocNo)) | 
|                 .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(chargeLocNo)) { | 
|   | 
|             // 穿梭车走行至充电桩库位 | 
|             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(chargeLocNo); | 
|                     })), | 
|                     MotionCtgType.SHUTTLE_MOVE | 
|             )); | 
|   | 
|         } 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.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(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); | 
|                     })) | 
|             )); | 
|   | 
|             // 穿梭车提升机至提升机待机位 | 
|             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.setLocNo(chargeLocNo); | 
|                     })), | 
|                     MotionCtgType.SHUTTLE_MOVE | 
|             )); | 
|   | 
|         } | 
|   | 
|         // 穿梭车开始充电 | 
|         motionList.addAll(kernelService.shuttleAction( | 
|                 null, | 
|                 MotionDto.build((dto -> { | 
|                     dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                 })), | 
|                 MotionCtgType.SHUTTLE_CHARGE_ON | 
|         )); | 
|   | 
|         return motionList; | 
|     } | 
|   | 
|     /** | 
|      * 生成充电完成动作 | 
|      */ | 
|     public List<Motion> generateShuttleChargeWrkComplete(Task task) { | 
|         List<Motion> motionList = new ArrayList<>(); | 
|         if (task.getTaskSts() != TaskStsType.NEW_MOVE.sts) { | 
|             return motionList; | 
|         } | 
|   | 
|         // locNo | 
|         String locNo = task.getDestLoc(); | 
|   | 
|         // 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; | 
|         } | 
|   | 
|         String shuttleLocNo = shuttleProtocol.getCurrentLocNo(); | 
|   | 
|         // 判断穿梭车是否在目标层 | 
|         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 -> { | 
|                         dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         dto.setLocNo(shuttleLocNo); | 
|                     })), | 
|                     MotionDto.build((dto -> { | 
|                         dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         dto.setLocNo(locNo); | 
|                     })), | 
|                     MotionCtgType.SHUTTLE_MOVE | 
|             )); | 
|   | 
|         } | 
|         return motionList; | 
|     } | 
|   | 
|     /** | 
|      * 生成小车迁移动作 | 
|      */ | 
|     public List<Motion> generateShuttleMoveMotion(Task task) { | 
|         List<Motion> motionList = new ArrayList<>(); | 
|         if (task.getTaskSts() != TaskStsType.NEW_MOVE.sts) { | 
|             return motionList; | 
|         } | 
|   | 
|         // locNo | 
|         String locNo = task.getDestLoc(); | 
|   | 
|         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()); | 
|         if (shuttleThread == null) { | 
|             return motionList; | 
|         } | 
|   | 
|         ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); | 
|         if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) { | 
|             return motionList; | 
|         } | 
|   | 
|         String shuttleLocNo = shuttleProtocol.getCurrentLocNo(); | 
|   | 
|         // 判断穿梭车是否在目标层 | 
|         if (Utils.getLev(shuttleLocNo) == Utils.getLev(locNo)) { | 
|   | 
|             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(), true); | 
|             if (liftThread == null) { | 
|                 return motionList; | 
|             } | 
|             Device liftDevice = liftThread.getDevice(); | 
|   | 
|             //穿梭车到提升机库位号 | 
|             String liftLocNoTo = liftDispatcher.getLiftLocNo(liftThread, Utils.getLev(shuttleLocNo)); | 
|   | 
|             //穿梭车出提升机库位号 | 
|             String liftLocNoFrom = liftDispatcher.getLiftLocNo(liftThread, Utils.getLev(task.getDestLoc())); | 
|   | 
|             //穿梭车到提升机待机位库位号 | 
|             String standbyLocNoTo = liftDispatcher.getLiftStandByLocNo(liftThread, Utils.getLev(shuttleLocNo)); | 
|   | 
|             //穿梭车出提升机待机位库位号 | 
|             String standbyLocNoFrom = liftDispatcher.getLiftStandByLocNo(liftThread, Utils.getLev(task.getDestLoc())); | 
|   | 
|             //换层需要锁定的路径 | 
|             List<String> lockPath = liftDispatcher.getLockPathByLocNo(liftThread, Utils.getLev(task.getDestLoc())); | 
|   | 
|   | 
|             // 穿梭车走行至提升机库位待机位 | 
|             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(liftDevice.getId().intValue()); | 
|                         dto.setLocNo(standbyLocNoTo); | 
|                     })), | 
|                     MotionCtgType.SHUTTLE_MOVE | 
|             )); | 
|   | 
|             // 锁定换层路径 | 
|             motionList.addAll(kernelService.mapLockPath( | 
|                     null, | 
|                     MotionDto.build((dto -> { | 
|                         dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         dto.setLocNo(JSON.toJSONString(lockPath)); | 
|                     })) | 
|             )); | 
|   | 
|             // 提升机空载移动到穿梭车层 | 
|             motionList.addAll(kernelService.liftMove( | 
|                     null | 
|                     , MotionDto.build((dto -> { | 
|                         dto.setLiftNo(liftDevice.getId().intValue()); | 
|                         dto.setLev(Utils.getLev(shuttleLocNo)); | 
|                     })) | 
|             )); | 
|   | 
|             // 锁定提升机 | 
|             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()); | 
|                         dto.setLocNo(standbyLocNoTo); | 
|                     })), | 
|                     MotionDto.build((dto -> { | 
|                         dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         dto.setLiftNo(liftDevice.getId().intValue()); | 
|                         dto.setLocNo(liftLocNoTo); | 
|                     })), | 
|                     MotionCtgType.SHUTTLE_MOVE_TO_LIFT | 
|             )); | 
|   | 
|             // 解锁提升机 | 
|             motionList.addAll(kernelService.liftUnlock( | 
|                     null | 
|                     , MotionDto.build((dto -> { | 
|                         dto.setLiftNo(liftDevice.getId().intValue()); | 
|                     })) | 
|             )); | 
|   | 
|             // 提升机搬车 至 目标位置层 | 
|             motionList.addAll(kernelService.liftMoveShuttle( | 
|                     MotionDto.build((dto -> { | 
|                         dto.setLiftNo(liftDevice.getId().intValue()); | 
|                         dto.setLev(Utils.getLev(shuttleLocNo)); | 
|                     })), | 
|                     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); | 
|                     })) | 
|             )); | 
|   | 
|             // 穿梭车走行至提升机待机位 | 
|             motionList.addAll(kernelService.shuttleMove( | 
|                     MotionDto.build((dto -> { | 
|                         dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         dto.setLiftNo(liftDevice.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(liftDevice.getId().intValue()); | 
|                     })) | 
|             )); | 
|   | 
|             // 解锁换层路径 | 
|             motionList.addAll(kernelService.mapUnlockPath( | 
|                     null, | 
|                     MotionDto.build((dto -> { | 
|                         dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         dto.setLocNo(JSON.toJSONString(lockPath)); | 
|                     })) | 
|             )); | 
|   | 
|             // 穿梭车提升机待机位至目标位置 | 
|             motionList.addAll(kernelService.shuttleMove( | 
|                     MotionDto.build((dto -> { | 
|                         dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         dto.setLiftNo(liftDevice.getId().intValue()); | 
|                         dto.setLocNo(standbyLocNoFrom); | 
|                     })), | 
|                     MotionDto.build((dto -> { | 
|                         dto.setShuttleNo(shuttleDevice.getId().intValue()); | 
|                         dto.setLocNo(locNo); | 
|                     })), | 
|                     MotionCtgType.SHUTTLE_MOVE | 
|             )); | 
|   | 
|         } | 
|         return motionList; | 
|     } | 
|   | 
|     /** | 
|      * 生成小车手动动作 | 
|      */ | 
|     public List<Motion> generateShuttleManualMotion(Task task) { | 
|         List<Motion> motionList = new ArrayList<>(); | 
|         if (task.getTaskSts() != TaskStsType.NEW_MANUAL.sts) { | 
|             return motionList; | 
|         } | 
|   | 
|         String sourceLoc = task.getOriginLoc();//源库位 | 
|         String targetLoc = task.getDestLoc();//任务目标(借用字段) | 
|         String targetSite = task.getMemo();//任务类型(借用字段) | 
|   | 
|         Device device = 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 (device == null) { | 
|             return motionList; | 
|         } | 
|   | 
|         ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); | 
|         if (shuttleThread == null) { | 
|             return motionList; | 
|         } | 
|   | 
|         ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); | 
|         if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) { | 
|             return motionList; | 
|         } | 
|   | 
|         if (targetSite.equals("moveLoc")) {//移动 | 
|             String shuttleLocNo = shuttleProtocol.getCurrentLocNo(); | 
|   | 
|             // 判断穿梭车是否在目标层 | 
|             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(targetLoc); | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_MOVE | 
|                 )); | 
|   | 
|             } | 
|         } else if (targetSite.equals("palletLift")) { | 
|             //托盘顶升 | 
|             motionList.add(Motion.build(motion -> { | 
|                 motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); | 
|                 motion.setDevice(String.valueOf(device.getId())); | 
|                 motion.setMotionCtg(MotionCtgType.SHUTTLE_PALLET_LIFT.val()); | 
|             })); | 
|         } else if (targetSite.equals("palletDown")) { | 
|             //托盘下降 | 
|             motionList.add(Motion.build(motion -> { | 
|                 motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); | 
|                 motion.setDevice(String.valueOf(device.getId())); | 
|                 motion.setMotionCtg(MotionCtgType.SHUTTLE_PALLET_DOWN.val()); | 
|             })); | 
|         } else if (targetSite.equals("chargeOpen")) { | 
|             //充电开 | 
|             motionList.add(Motion.build(motion -> { | 
|                 motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); | 
|                 motion.setDevice(String.valueOf(device.getId())); | 
|                 motion.setMotionCtg(MotionCtgType.SHUTTLE_CHARGE_ON.val()); | 
|             })); | 
|         } else if (targetSite.equals("chargeClose")) { | 
|             //充电关 | 
|             motionList.add(Motion.build(motion -> { | 
|                 motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); | 
|                 motion.setDevice(String.valueOf(device.getId())); | 
|                 motion.setMotionCtg(MotionCtgType.SHUTTLE_CHARGE_OFF.val()); | 
|             })); | 
|         } else if (targetSite.equals("reset")) { | 
|             //复位 | 
|         } else if (targetSite.equals("takeMove")) { | 
|             //取放货 | 
|             String shuttleLocNo = shuttleProtocol.getCurrentLocNo(); | 
|   | 
|             // 判断穿梭车是否在目标层 | 
|             if (Utils.getLev(shuttleLocNo) == Utils.getLev(targetLoc)) { | 
|   | 
|                 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 -> { | 
|                     motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); | 
|                     motion.setDevice(String.valueOf(device.getId())); | 
|                     motion.setMotionCtg(MotionCtgType.SHUTTLE_PALLET_LIFT.val()); | 
|                 })); | 
|   | 
|                 // 穿梭车载货走行至目标库位 | 
|                 motionList.addAll(kernelService.shuttleMove( | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(device.getId().intValue()); | 
|                             dto.setLocNo(sourceLoc); | 
|                         })), | 
|                         MotionDto.build((dto -> { | 
|                             dto.setShuttleNo(device.getId().intValue()); | 
|                             dto.setLocNo(targetLoc); | 
|                         })), | 
|                         MotionCtgType.SHUTTLE_TRANSPORT | 
|                 )); | 
|   | 
|                 //托盘下降 | 
|                 motionList.add(Motion.build(motion -> { | 
|                     motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); | 
|                     motion.setDevice(String.valueOf(device.getId())); | 
|                     motion.setMotionCtg(MotionCtgType.SHUTTLE_PALLET_DOWN.val()); | 
|                 })); | 
|   | 
|             } | 
|         } | 
|   | 
|         return motionList; | 
|     } | 
|   | 
|     /** | 
|      * 生成提升机手动动作 | 
|      */ | 
|     public List<Motion> generateLiftManualMotion(Task task) { | 
|         List<Motion> motionList = new ArrayList<>(); | 
|         if (task.getTaskSts() != TaskStsType.NEW_MANUAL.sts) { | 
|             return motionList; | 
|         } | 
|   | 
|         Device device = deviceService.getOne(new LambdaQueryWrapper<Device>() | 
|                 .eq(Device::getDeviceNo, task.getLiftNo()) | 
|                 .eq(Device::getDeviceType, DeviceCtgType.LIFT.val()) | 
|                 .eq(Device::getHostId, task.getHostId()) | 
|                 .eq(Device::getStatus, 1)); | 
|         if (device == null) { | 
|             return motionList; | 
|         } | 
|   | 
|         String destSite = task.getMemo();//任务目标(借用字段) | 
|         if (destSite.equals("move")) { | 
|             //提升机升降楼层 | 
|   | 
|             // 提升机空载移动到穿梭车层 | 
|             motionList.addAll(kernelService.liftMove( | 
|                     null | 
|                     , MotionDto.build((dto -> { | 
|                         dto.setLiftNo(device.getId().intValue()); | 
|                         dto.setLev(Integer.parseInt(task.getDestLoc())); | 
|                     })) | 
|             )); | 
|   | 
|         } else if (destSite.equals("movePallet")) { | 
|             //移动托盘 | 
|             BasConveyorSta basConveyorStaOrigin = basConveyorStaService.selectBySiteNo(task.getOriginSite()); | 
|             BasConveyorSta basConveyorStaDest = basConveyorStaService.selectBySiteNo(task.getDestSite()); | 
|             if(basConveyorStaOrigin == null || basConveyorStaDest == null) { | 
|                 return motionList; | 
|             } | 
|   | 
|             // 提升机移动托盘 | 
|             motionList.addAll(kernelService.liftMoveGoods( | 
|                     MotionDto.build((dto -> { | 
|                         dto.setLiftNo(device.getId().intValue()); | 
|                         dto.setLev(Utils.getLev(basConveyorStaOrigin.getLocNo())); | 
|                         dto.setStaNo(Integer.parseInt(task.getOriginSite())); | 
|                     })) | 
|                     , MotionDto.build((dto -> { | 
|                         dto.setLiftNo(device.getId().intValue()); | 
|                         dto.setLev(Utils.getLev(basConveyorStaDest.getLocNo())); | 
|                         dto.setDevpNo(basConveyorStaDest.getConveyorDeviceId().intValue()); | 
|                         dto.setStaNo(Integer.parseInt(task.getDestSite())); | 
|                     })) | 
|             )); | 
|   | 
|         } else if (destSite.equals("lock")) { | 
|             // 锁定提升机 | 
|             motionList.addAll(kernelService.liftLock( | 
|                     null | 
|                     , MotionDto.build((dto -> { | 
|                         dto.setLiftNo(device.getId().intValue()); | 
|                     })) | 
|             )); | 
|         } else if (destSite.equals("unlock")) { | 
|             // 解锁提升机 | 
|             motionList.addAll(kernelService.liftUnlock( | 
|                     null | 
|                     , MotionDto.build((dto -> { | 
|                         dto.setLiftNo(device.getId().intValue()); | 
|                     })) | 
|             )); | 
|         } | 
|   | 
|         return motionList; | 
|     } | 
|   | 
| } |