#
Junjie
2 天以前 6cf4a3e2ba925e75b60f13bb8ebc5e92d37809b2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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;
    }
 
}