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 nodes = new ArrayList<>(); String target = motion.getTarget(); List 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 nodes = new ArrayList<>(); String target = motion.getTarget(); List 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 shuttlePoints = Utils.getShuttlePoints(shuttleProtocol.getShuttleNo(), lev); navigateMapData.setLev(lev); List> map = navigateMapData.getJsonData(NavigationMapType.DFX.id, null, shuttlePoints); for (NavigateNode node : nodes) { List 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; } }