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.searchLift(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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(device);
|
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.setShuttleDevice(device);
|
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.setShuttleDevice(device);
|
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;
|
}
|
|
/**
|
* 生成小车载货迁移动作
|
*/
|
public List<Motion> generateShuttleLadenMoveMotion(Task task) {
|
List<Motion> motionList = new ArrayList<>();
|
if (task.getTaskSts() != TaskStsType.NEW_LADEN_MOVE.sts) {
|
return motionList;
|
}
|
//originLoc 源库位
|
String originLoc = task.getOriginLoc();
|
// 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;
|
}
|
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(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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
// dto.setLiftNo(transferLiftDevice.getId().intValue());
|
// dto.setLocNo(standbyLocNoTo);
|
// dto.setStaNo(getStaByLev(Utils.getLev(task.getOriginLoc())));//输送站
|
// })),
|
// MotionCtgType.SHUTTLE_TRANSPORT_TO_CONVEYOR
|
// ));
|
|
// 穿梭车走行至目标库位
|
motionList.addAll(kernelService.shuttleMove(
|
MotionDto.build((dto -> {
|
dto.setShuttleNo(shuttleDevice.getId().intValue());
|
dto.setLocNo(lastPathStartLoc);
|
})),
|
MotionDto.build((dto -> {
|
dto.setShuttleNo(shuttleDevice.getId().intValue());
|
dto.setShuttleDevice(shuttleDevice);
|
dto.setLocNo(locNo);
|
})),
|
MotionCtgType.SHUTTLE_MOVE
|
));
|
|
// 穿梭车出库托盘下降
|
motionList.addAll(kernelService.shuttleAction(
|
null,
|
MotionDto.build((dto -> {
|
dto.setShuttleNo(shuttleDevice.getId().intValue());
|
})),
|
MotionCtgType.SHUTTLE_PALLET_DOWN
|
));
|
|
|
|
/**
|
* 二、出库起始层没有穿梭车
|
*/
|
} 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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
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.setShuttleDevice(shuttleDevice);
|
dto.setLocNo(locNo);
|
})),
|
MotionCtgType.SHUTTLE_MOVE
|
));
|
|
// 穿梭车出库托盘下降
|
motionList.addAll(kernelService.shuttleAction(
|
null,
|
MotionDto.build((dto -> {
|
dto.setShuttleNo(shuttleDevice.getId().intValue());
|
})),
|
MotionCtgType.SHUTTLE_PALLET_DOWN
|
));
|
|
}
|
return motionList;
|
}
|
}
|