package com.zy.asrs.wcs.core.kernel; 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.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.*; 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.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.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 List generateMotion(Task task) { List motionList = new ArrayList<>(); motionList = this.generateFirstZoneMotion(task); return motionList; } public List generateFirstZoneMotion(Task task) { List motionList = new ArrayList<>(); /** * 入库 */ if (task.getTaskSts() == TaskStsType.NEW_INBOUND.sts) { // locNo String destLoc = task.getDestLoc(); // shuttle Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper() .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() .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId()) .eq(ShuttleStandby::getDeviceLev, Utils.getLev(shuttleLocNo)) .eq(ShuttleStandby::getStatus, 1)); //获取小车待机库位 ==> 出提升机 ShuttleStandby shuttleStandbyFrom = shuttleStandbyService.getOne(new LambdaQueryWrapper() .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId()) .eq(ShuttleStandby::getDeviceLev, Utils.getLev(destLoc)) .eq(ShuttleStandby::getStatus, 1)); if (shuttleStandbyTo == null || shuttleStandbyFrom == null) { return motionList; } //穿梭车进提升机库位号 String liftLocNoTo = shuttleStandbyTo.getDeviceLoc(); //穿梭车出提升机库位号 String liftLocNoFrom = shuttleStandbyFrom.getDeviceLoc(); //穿梭车进提升机待机位库位号 String standbyLocNoTo = shuttleStandbyTo.getDeviceStandbyLoc(); //穿梭车出提升机待机位库位号 String standbyLocNoFrom = shuttleStandbyFrom.getDeviceStandbyLoc(); // 入库目标层有穿梭车 if (Utils.getLev(shuttleLocNo) == Utils.getLev(task.getDestLoc())) { // 提升机载货移动 motionList.addAll(kernelService.liftMoveGoods( MotionDto.build((dto -> { dto.setLiftNo(transferLiftDevice.getId().intValue()); dto.setLev(1);//光泰1层是输送线层 dto.setStaNo(31004);//入库站点 })) , MotionDto.build((dto -> { dto.setLiftNo(transferLiftDevice.getId().intValue()); dto.setLev(Utils.getLev(task.getDestLoc())); dto.setStaNo(Integer.parseInt(task.getDestSite())); dto.setSync(0);//异步执行 })) )); // 穿梭车走行至提升机库位待机位 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); })), MotionCtgType.SHUTTLE_MOVE )); // 穿梭车入库托盘下降 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(Integer.parseInt(task.getDestSite())); })) )); // 穿梭车走行至提升机库位待机位 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(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.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_MOVE )); // 穿梭车入库托盘下降 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() .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() .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId()) .eq(ShuttleStandby::getDeviceLev, Utils.getLev(shuttleLocNo)) .eq(ShuttleStandby::getStatus, 1)); //获取小车待机库位 ==> 出提升机 ShuttleStandby shuttleStandbyFrom = shuttleStandbyService.getOne(new LambdaQueryWrapper() .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId()) .eq(ShuttleStandby::getDeviceLev, Utils.getLev(originLoc)) .eq(ShuttleStandby::getStatus, 1)); if (shuttleStandbyTo == null || shuttleStandbyFrom == null) { return motionList; } //穿梭车进提升机库位号 String liftLocNoTo = shuttleStandbyTo.getDeviceLoc(); //穿梭车出提升机库位号 String liftLocNoFrom = shuttleStandbyFrom.getDeviceLoc(); //穿梭车进提升机待机位库位号 String standbyLocNoTo = shuttleStandbyTo.getDeviceStandbyLoc(); //穿梭车出提升机待机位库位号 String standbyLocNoFrom = shuttleStandbyFrom.getDeviceStandbyLoc(); //穿梭车出提升机后小车待机位 String shuttleFromLiftStandbyLoc = shuttleStandbyFrom.getStandbyLoc(); //获取出库任务类型 TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper() .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.OUT)) .eq(TaskCtg::getStatus, 1)); if (taskCtg == null) { return motionList; } //获取输送线路径 BasConveyorPath basConveyorPath = basConveyorPathService.getOne(new LambdaQueryWrapper() .eq(BasConveyorPath::getDeviceStn, task.getOriginSite()) .eq(BasConveyorPath::getDeviceNo, liftProtocol.getLiftNo()) .eq(BasConveyorPath::getTypeNo, taskCtg.getId())); if (basConveyorPath == 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 )); // 穿梭车出库至提升机待机位 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.shuttleAction( null, MotionDto.build((dto -> { dto.setShuttleNo(shuttleDevice.getId().intValue()); })), MotionCtgType.SHUTTLE_PALLET_DOWN )); // 提升机载货移动 motionList.addAll(kernelService.liftMoveGoods( MotionDto.build((dto -> { dto.setLiftNo(transferLiftDevice.getId().intValue()); dto.setLev(Utils.getLev(task.getOriginLoc())); dto.setStaNo(Integer.parseInt(task.getOriginSite()));//起始站点 })) , MotionDto.build((dto -> { dto.setLiftNo(transferLiftDevice.getId().intValue()); dto.setLev(1);//光泰1层是输送线层 dto.setStaNo(31004);//出库站点 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 )); /** * 二、出库起始层没有穿梭车 */ } 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.shuttleAction( null, MotionDto.build((dto -> { dto.setShuttleNo(shuttleDevice.getId().intValue()); })), MotionCtgType.SHUTTLE_PALLET_DOWN )); // 提升机载货移动 motionList.addAll(kernelService.liftMoveGoods( MotionDto.build((dto -> { dto.setLiftNo(transferLiftDevice.getId().intValue()); dto.setLev(Utils.getLev(task.getOriginLoc())); dto.setStaNo(Integer.parseInt(task.getOriginSite()));//起始站点 })) , MotionDto.build((dto -> { dto.setLiftNo(transferLiftDevice.getId().intValue()); dto.setLev(1);//光泰1层是输送线层 dto.setStaNo(31004);//出库站点 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 )); } } return motionList; } /** * 生成充电动作 */ public List generateChargeMotion(Task task) { List motionList = new ArrayList<>(); if (task.getTaskSts() != TaskStsType.NEW_CHARGE.sts) { return motionList; } // locNo String chargeLocNo = task.getDestLoc(); // shuttle Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper() .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() .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId()) .eq(ShuttleStandby::getDeviceLev, Utils.getLev(shuttleLocNo)) .eq(ShuttleStandby::getStatus, 1)); //获取小车待机库位 ==> 出提升机 ShuttleStandby shuttleStandbyFrom = shuttleStandbyService.getOne(new LambdaQueryWrapper() .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 generateShuttleChargeWrkComplete(Task task) { List motionList = new ArrayList<>(); if (task.getTaskSts() != TaskStsType.NEW_MOVE.sts) { return motionList; } // locNo String locNo = task.getDestLoc(); // shuttle Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper() .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 generateShuttleMoveMotion(Task task) { List motionList = new ArrayList<>(); if (task.getTaskSts() != TaskStsType.NEW_MOVE.sts) { return motionList; } // locNo String locNo = task.getDestLoc(); Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper() .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())); // 穿梭车走行至提升机库位待机位 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.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.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 generateShuttleManualMotion(Task task) { List 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() .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_MOVE )); //托盘下降 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 generateLiftManualMotion(Task task) { List motionList = new ArrayList<>(); if (task.getTaskSts() != TaskStsType.NEW_MANUAL.sts) { return motionList; } Device device = deviceService.getOne(new LambdaQueryWrapper() .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; } }