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<Motion> agvTransport() {
|
List<Motion> 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<Motion> liftMove(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> liftMoveGoods(MotionDto origin, MotionDto target) {
|
List<Motion> 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.getSync() != null) {
|
motion.setSync(target.getSync());
|
}
|
|
if (target.getReleaseLift() != null) {
|
motion.setReleaseLift(target.getReleaseLift());
|
}
|
}));
|
|
return motionList;
|
}
|
|
/**
|
* 提升机搬运穿梭车
|
*/
|
public List<Motion> liftMoveShuttle(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> liftMoveGoodsAndShuttle(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> liftTransportGoodsToConveyor(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> liftLock(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> liftUnlock(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> liftShuttleArrival(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> liftShuttleLeave(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> shuttleUpdateLocation(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> shuttleMove(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) {
|
List<Motion> 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_MOVE_STANDBY://穿梭车移动到待机位
|
motion.setTarget(null);//等待自动搜索
|
motion.setTemp(target.getLocNo());//全部待机位
|
break;
|
default:
|
break;
|
}
|
|
}));
|
|
return motionList;
|
}
|
|
/**
|
* 穿梭车载货移动
|
*/
|
public List<Motion> shuttleTransport(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) {
|
List<Motion> 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<Motion> shuttleAction(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) {
|
List<Motion> 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<Motion> conveyorInbound(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) {
|
List<Motion> 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<Motion> conveyorOutbound(MotionDto origin, MotionDto target, MotionCtgType motionCtgType) {
|
List<Motion> 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<Motion> mapLockPath(MotionDto origin, MotionDto target) {
|
List<Motion> 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<Motion> mapUnlockPath(MotionDto origin, MotionDto target) {
|
List<Motion> 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;
|
}
|
|
}
|