package com.zy.asrs.wcs.core.kernel; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wcs.core.domain.dto.MotionDto; import com.zy.asrs.wcs.core.model.NavigateNode; 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.model.enums.NavigationMapType; import com.zy.asrs.wcs.core.service.MotionService; import com.zy.asrs.wcs.core.utils.LiftDispatcher; import com.zy.asrs.wcs.core.utils.NavigateUtils; import com.zy.asrs.wcs.core.utils.Utils; import com.zy.asrs.wcs.rcs.News; import com.zy.asrs.wcs.rcs.entity.Device; import com.zy.asrs.wcs.rcs.service.DeviceService; 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; @Autowired private NavigateUtils navigateUtils; @Autowired private DeviceService deviceService; // 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());//目标站 if (target.getDevpNo() != null) { 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()))); } if (target.getTaskNo() != null) { motion.setTaskNo(target.getTaskNo()); } 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; case SHUTTLE_TRANSPORT_TO_CONVEYOR://穿梭车载货进输送线 motion.setDockNo(String.valueOf(target.getStaNo())); break; case SHUTTLE_MOVE_STANDBY://穿梭车移动到待机位 motion.setTarget(null);//等待自动搜索 motion.setTemp(target.getLocNo());//全部待机位 break; default: break; } if (target.getSync() != null) { motion.setSync(target.getSync()); } if (target.getReleaseShuttle() != null) { motion.setReleaseShuttle(target.getReleaseShuttle()); } if (target.getReleaseLift() != null) { motion.setReleaseLift(target.getReleaseLift()); } List nodeList = navigateUtils.calc(motion.getOrigin(), motion.getTarget(), NavigationMapType.NONE_LOCK.id, Utils.getShuttlePoints(Integer.parseInt(target.getShuttleDevice().getDeviceNo()), Utils.getLev(motion.getTarget()))); if (nodeList == null) { throw new CoolException(motion.getOrigin() + " dash " + motion.getTarget() + " can't find navigate path!"); } motion.setMovePath(JSON.toJSONString(nodeList)); })); 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; } // Map ----------------------------------------------------------------------------- /** * 地图路径锁定 */ public List mapLockPath(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.MAP.val()); motion.setDevice(String.valueOf(target.getShuttleNo())); motion.setMotionCtg(MotionCtgType.MAP_LOCK_PATH.val()); motion.setTarget(target.getLocNo()); })); return motionList; } /** * 地图路径解锁 */ public List mapUnlockPath(MotionDto origin, MotionDto target) { List motionList = new ArrayList<>(); motionList.add(Motion.build(motion -> { motion.setDeviceCtg(DeviceCtgType.MAP.val()); motion.setDevice(String.valueOf(target.getShuttleNo())); motion.setMotionCtg(MotionCtgType.MAP_UNLOCK_PATH.val()); motion.setTarget(target.getLocNo()); })); return motionList; } }