package com.zy.asrs.wcs.core.kernel.command;
|
|
import com.alibaba.fastjson.JSON;
|
import com.zy.asrs.wcs.core.entity.Motion;
|
import com.zy.asrs.wcs.core.model.MapNode;
|
import com.zy.asrs.wcs.core.model.NavigateNode;
|
import com.zy.asrs.wcs.core.model.enums.MapNodeType;
|
import com.zy.asrs.wcs.core.model.enums.MotionCtgType;
|
import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
|
import com.zy.asrs.wcs.core.utils.*;
|
import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
|
import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
|
import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
|
import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
|
import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Objects;
|
|
@Slf4j
|
@Service
|
public class MapCommandService {
|
|
@Autowired
|
private RedisUtil redisUtil;
|
@Autowired
|
private NavigateMapUtils navigateMapUtils;
|
@Autowired
|
private NavigateMapData navigateMapData;
|
|
public Boolean accept(Motion motion) {
|
switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))) {
|
case MAP_LOCK_PATH:
|
return lockPath(motion, true);
|
case MAP_UNLOCK_PATH:
|
return lockPath(motion, false);
|
default:
|
break;
|
}
|
|
return Boolean.TRUE;
|
}
|
|
public Boolean finish(Motion motion) {
|
switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))) {
|
case MAP_LOCK_PATH:
|
return checkLockPath(motion, true);
|
case MAP_UNLOCK_PATH:
|
return checkLockPath(motion, false);
|
default:
|
break;
|
}
|
|
return Boolean.TRUE;
|
}
|
|
private boolean lockPath(Motion motion, boolean lock) {
|
Integer deviceNo = Integer.parseInt(motion.getDevice());
|
ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo);
|
if (shuttleThread == null) {
|
return false;
|
}
|
ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
|
if (null == shuttleProtocol) {
|
return false;
|
}
|
|
List<NavigateNode> nodes = new ArrayList<>();
|
|
String target = motion.getTarget();
|
List<String> lockPath = JSON.parseArray(target, String.class);
|
Integer lev = null;
|
for (String loc : lockPath) {
|
NavigateNode navigateNode = NavigatePositionConvert.locNoToNode(loc);
|
nodes.add(navigateNode);
|
|
lev = Utils.getLev(loc);
|
}
|
|
//所使用的路径进行锁定/解锁
|
boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(lev, shuttleProtocol.getShuttleNo(), nodes, lock);//所使用的路径进行锁定/解锁
|
if (!lockResult) {
|
return false;//锁定/解锁失败
|
}
|
return true;
|
}
|
|
private boolean checkLockPath(Motion motion, boolean lock) {
|
List<NavigateNode> nodes = new ArrayList<>();
|
|
String target = motion.getTarget();
|
List<String> lockPath = JSON.parseArray(target, String.class);
|
Integer lev = null;
|
for (String loc : lockPath) {
|
NavigateNode navigateNode = NavigatePositionConvert.locNoToNode(loc);
|
nodes.add(navigateNode);
|
|
lev = Utils.getLev(loc);
|
}
|
|
Object o = redisUtil.get(DeviceRedisConstant.MAP + lev);
|
if (o == null) {
|
return false;
|
}
|
|
Integer deviceNo = Integer.parseInt(motion.getDevice());
|
ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo);
|
if (shuttleThread == null) {
|
return false;
|
}
|
ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
|
if (null == shuttleProtocol) {
|
return false;
|
}
|
|
//获取小车节点
|
List<int[]> shuttlePoints = Utils.getShuttlePoints(shuttleProtocol.getShuttleNo(), lev);
|
navigateMapData.setLev(lev);
|
List<List<MapNode>> map = navigateMapData.getJsonData(NavigationMapType.DFX.id, null, shuttlePoints);
|
|
for (NavigateNode node : nodes) {
|
List<MapNode> listX = map.get(node.getX());
|
MapNode mapNode = listX.get(node.getY());
|
if (mapNode.getLockDeviceNo() != null && !mapNode.getLockDeviceNo().equals(shuttleProtocol.getShuttleNo())) {
|
return false;//路径所属权不是当前设备
|
}
|
|
if (lock) {//检测是否锁定
|
if (!mapNode.getValue().equals(MapNodeType.LOCK.id)) {
|
return false;//路径未锁定
|
}
|
}else {//检测是否未锁定
|
if(mapNode.getValue().equals(MapNodeType.LOCK.id)) {
|
return false;//路径已锁定
|
}
|
}
|
}
|
return true;
|
}
|
|
}
|