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 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 nodes) { if (nodes.isEmpty()) { return false; } HashMap lockMap = new HashMap<>(); Object o = redisUtil.get(RedisKeyType.LOCK_MAP_NODES.key + lev); if (o != null) { lockMap = (HashMap) o; } List shuttleList = new ArrayList<>(); //获取小车节点-获取除白名单外的指定楼层全部穿梭车xy坐标点 List shuttlePoints = Utils.getShuttlePoints(shuttleNo, lev); for (int[] point : shuttlePoints) { String key = Utils.getLocNo(point[0], point[1], lev); shuttleList.add(key); } HashMap 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 nodes) { if (nodes.isEmpty()) { return false; } HashMap lockMap = new HashMap<>(); Object o = redisUtil.get(RedisKeyType.LOCK_MAP_NODES.key + lev); if (o != null) { lockMap = (HashMap) 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; } }