package com.zy.common.utils;
|
|
import com.zy.asrs.utils.Utils;
|
import com.zy.common.model.NavigateNode;
|
import com.zy.core.enums.RedisKeyType;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
|
@Component
|
public class NavigateMapUtils {
|
|
@Autowired
|
private RedisUtil redisUtil;
|
|
/**
|
* 写入路径节点数据到redis地图中
|
* lock为true 禁用库位,lock为false恢复库位
|
*/
|
public synchronized boolean writeNavigateNodeToRedisMap(Integer lev, Integer shuttleNo, List<NavigateNode> nodes, boolean lock) {
|
if (lock) {
|
return lockNodes(lev, shuttleNo, nodes);
|
}else {
|
return unlockNodes(lev, shuttleNo, nodes);
|
}
|
}
|
|
public synchronized boolean lockNodes(Integer lev, Integer shuttleNo, List<NavigateNode> nodes) {
|
if (nodes.isEmpty()) {
|
return false;
|
}
|
|
HashMap<String, Object> lockMap = new HashMap<>();
|
Object o = redisUtil.get(RedisKeyType.LOCK_MAP_NODES.key + lev);
|
if (o != null) {
|
lockMap = (HashMap<String, Object>) o;
|
}
|
|
List<String> shuttleList = new ArrayList<>();
|
//获取小车节点-获取除白名单外的指定楼层全部穿梭车xy坐标点
|
List<int[]> shuttlePoints = Utils.getShuttlePoints(shuttleNo, lev);
|
for (int[] point : shuttlePoints) {
|
String key = Utils.getLocNo(point[0], point[1], lev);
|
shuttleList.add(key);
|
}
|
|
HashMap<String, Object> tmpMap = new HashMap<>();
|
for (NavigateNode node : nodes) {
|
String key = Utils.getLocNo(node.getX(), node.getY(), lev);
|
|
//判断节点是否有小车
|
if(shuttleList.contains(key)) {
|
return false;
|
}
|
|
//判断节点是否被锁定
|
if(lockMap.containsKey(key)) {
|
Integer deviceNo = (Integer) lockMap.get(key);
|
if (!shuttleNo.equals(deviceNo)) {//等待锁定的节点已被当前小车锁定,认定锁定成功
|
return false;
|
}
|
}
|
|
tmpMap.put(key, shuttleNo);
|
}
|
|
lockMap.putAll(tmpMap);
|
|
redisUtil.set(RedisKeyType.LOCK_MAP_NODES.key + lev, lockMap);
|
return true;
|
}
|
|
public synchronized boolean unlockNodes(Integer lev, Integer shuttleNo, List<NavigateNode> nodes) {
|
if (nodes.isEmpty()) {
|
return false;
|
}
|
|
HashMap<String, Object> lockMap = new HashMap<>();
|
Object o = redisUtil.get(RedisKeyType.LOCK_MAP_NODES.key + lev);
|
if (o != null) {
|
lockMap = (HashMap<String, Object>) o;
|
}
|
|
for (NavigateNode node : nodes) {
|
String key = Utils.getLocNo(node.getX(), node.getY(), lev);
|
|
if(!lockMap.containsKey(key)) {
|
continue;
|
}
|
|
Integer deviceNo = (Integer) lockMap.get(key);
|
if(deviceNo.equals(shuttleNo)) {
|
lockMap.remove(key);
|
}
|
}
|
lockMap.putAll(lockMap);
|
redisUtil.set(RedisKeyType.LOCK_MAP_NODES.key + lev, lockMap);
|
return true;
|
}
|
|
}
|