package com.zy.asrs.wcs.core.kernel; import com.zy.asrs.wcs.core.domain.dto.MotionDto; import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; import com.zy.asrs.wcs.core.model.enums.MotionCtgType; import com.zy.asrs.wcs.core.entity.Motion; import com.zy.asrs.wcs.core.service.MotionService; import com.zy.asrs.wcs.core.utils.LiftDispatcher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; /** * Created by vincent on 2023/10/9 */ @Service(value = "kernelService") public class KernelService { @Autowired private MotionService motionService; @Autowired private LiftDispatcher liftDispatcher; // agv ----------------------------------------------------------------------------- @Deprecated public List agvTransport() { List motionList = new ArrayList<>(); // 1.AGV搬运货物 motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.AGV.val()); motion.setMotionCtg(MotionCtgType.AGV_TRANSPORT.val()); })); return motionList; } // lift ----------------------------------------------------------------------------- /** * 提升机移动 */ public List liftMove(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(target.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_MOVE.val()); if (null != origin) { motion.setOrigin(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), origin.getLev()))); } motion.setTarget(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), target.getLev()))); if (target.getSync() != null) { motion.setSync(target.getSync()); } if (target.getReleaseLift() != null) { motion.setReleaseLift(target.getReleaseLift()); } })); return motionList; } /** * 提升机载货移动 */ public List liftMoveGoods(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(target.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_WITH_GOODS.val()); if (null != origin) { motion.setOrigin(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), origin.getLev()))); motion.setOriDrt(origin.getStaNo());//源站 } motion.setTarget(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), target.getLev()))); motion.setTarDrt(target.getStaNo());//目标站 motion.setDockNo(String.valueOf(target.getDevpNo()));//输送线ID if (target.getSync() != null) { motion.setSync(target.getSync()); } if (target.getReleaseLift() != null) { motion.setReleaseLift(target.getReleaseLift()); } })); return motionList; } /** * 提升机搬运穿梭车 */ public List liftMoveShuttle(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(target.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_WITH_SHUTTLE.val()); if (null != origin) { motion.setOrigin(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), origin.getLev()))); } motion.setTarget(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), target.getLev()))); })); return motionList; } /** * 提升机载穿梭车与货移动 */ public List liftMoveGoodsAndShuttle(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(target.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_WITH_GOODS_AND_SHUTTLE.val()); if (null != origin) { motion.setOrigin(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), origin.getLev()))); } motion.setTarget(String.valueOf(liftDispatcher.getLiftLevOffset(target.getLiftNo(), target.getLev()))); })); return motionList; } /** * 提升机载穿梭车与货移动 */ public List liftTransportGoodsToConveyor(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(origin.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_TRANSPORT_TO_CONVEYOR.val()); motion.setOrigin(String.valueOf(liftDispatcher.getLiftLevOffset(origin.getLiftNo(), origin.getLev()))); motion.setDockNo(String.valueOf(target.getDevpNo())); motion.setTarget(String.valueOf(target.getStaNo())); })); return motionList; } /** * 提升机锁定 */ public List liftLock(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(target.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_LOCK.val()); if (target.getSync() != null) { motion.setSync(target.getSync()); } if (target.getReleaseLift() != null) { motion.setReleaseLift(target.getReleaseLift()); } })); return motionList; } /** * 提升机解锁 */ public List liftUnlock(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(target.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_UNLOCK.val()); if (target.getSync() != null) { motion.setSync(target.getSync()); } if (target.getReleaseLift() != null) { motion.setReleaseLift(target.getReleaseLift()); } })); return motionList; } /** * 提升机-小车已到位 */ public List liftShuttleArrival(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(target.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_SHUTTLE_ARRIVAL.val()); })); return motionList; } /** * 提升机-小车已驶离 */ public List liftShuttleLeave(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.LIFT.val()); motion.setDevice(String.valueOf(target.getLiftNo())); motion.setMotionCtg(MotionCtgType.LIFT_SHUTTLE_LEAVE.val()); })); return motionList; } // shuttle ----------------------------------------------------------------------------- /** * 小车坐标更新 */ public List shuttleUpdateLocation(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); motion.setDevice(String.valueOf(target.getShuttleNo())); motion.setMotionCtg(MotionCtgType.SHUTTLE_UPDATE_LOCATION.val()); motion.setTarget(target.getLocNo()); })); return motionList; } /** * 穿梭车空载移动 */ public List shuttleMove(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); motion.setDevice(String.valueOf(target.getShuttleNo())); motion.setMotionCtg(motionCtgType.val()); motion.setOrigin(origin.getLocNo()); motion.setTarget(target.getLocNo()); switch (motionCtgType) { case SHUTTLE_MOVE_FROM_LIFT://穿梭车移出提升机 motion.setTemp(String.valueOf(origin.getLiftNo()));//保存提升机号 break; case SHUTTLE_MOVE_TO_LIFT://穿梭车移动到提升机 motion.setTemp(String.valueOf(target.getLiftNo()));//保存提升机号 break; case SHUTTLE_MOVE_FROM_CONVEYOR: motion.setDockNo(String.valueOf(origin.getStaNo())); break; case SHUTTLE_MOVE_TO_CONVEYOR: motion.setDockNo(String.valueOf(target.getStaNo())); break; case SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR://穿梭车移出提升机去输送线 motion.setTemp(String.valueOf(origin.getLiftNo()));//保存提升机号 motion.setDockNo(String.valueOf(target.getStaNo())); break; default: break; } })); return motionList; } /** * 穿梭车载货移动 */ public List shuttleTransport(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); motion.setDevice(String.valueOf(target.getShuttleNo())); motion.setMotionCtg(motionCtgType.val()); switch (motionCtgType) { case SHUTTLE_TRANSPORT_FROM_LIFT: motion.setTemp(String.valueOf(origin.getLiftNo()));//保存提升机号 break; case SHUTTLE_TRANSPORT_TO_LIFT: motion.setTemp(String.valueOf(target.getLiftNo()));//保存提升机号 break; case SHUTTLE_TRANSPORT_FROM_CONVEYOR: motion.setDockNo(String.valueOf(origin.getStaNo())); break; case SHUTTLE_TRANSPORT_TO_CONVEYOR: motion.setDockNo(String.valueOf(target.getStaNo())); break; default: break; } motion.setOrigin(origin.getLocNo()); motion.setTarget(target.getLocNo()); })); return motionList; } /** * 穿梭车动作 */ public List shuttleAction(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val()); motion.setDevice(String.valueOf(target.getShuttleNo())); motion.setMotionCtg(motionCtgType.val()); switch (motionCtgType) { case SHUTTLE_PALLET_LIFT://托盘顶升 break; case SHUTTLE_PALLET_DOWN://托盘下降 break; case SHUTTLE_CHARGE_ON://充电开 break; case SHUTTLE_CHARGE_OFF://充电关 break; default: break; } })); return motionList; } // conveyor ----------------------------------------------------------------------------- /** * 输送线入库 */ public List conveyorInbound(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.CONVEYOR.val()); motion.setDevice(String.valueOf(origin.getDevpNo())); motion.setMotionCtg(motionCtgType.val()); switch (motionCtgType) { case CONVEYOR_INBOUND: motion.setTarget(String.valueOf(target.getStaNo())); break; case CONVEYOR_INBOUND_TO_LIFT: motion.setDockNo(String.valueOf(target.getLiftNo())); motion.setTarget(String.valueOf(target.getLev())); break; default: break; } motion.setOrigin(String.valueOf(origin.getStaNo())); })); return motionList; } /** * 输送线出库 */ public List conveyorOutbound(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.CONVEYOR.val()); motion.setDevice(String.valueOf(origin.getDevpNo())); motion.setMotionCtg(motionCtgType.val()); switch (motionCtgType) { case CONVEYOR_OUTBOUND: motion.setOrigin(String.valueOf(origin.getStaNo())); break; case CONVEYOR_OUTBOUND_FROM_LIFT: motion.setDockNo(String.valueOf(origin.getLiftNo())); break; default: break; } motion.setTarget(String.valueOf(target.getStaNo())); })); return motionList; } }