#
Junjie
2024-10-16 0f5a5a759221bde50ace126eae797326837f5f72
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateMapUtils.java
@@ -1,10 +1,14 @@
package com.zy.asrs.wcs.core.utils;
import com.alibaba.fastjson.JSON;
import com.zy.asrs.framework.common.SpringUtils;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zy.asrs.wcs.core.domain.dto.RedisMapDto;
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.NavigationMapType;
import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,13 +23,16 @@
    @Autowired
    private NavigateMapData navigateMapData;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private ObjectMapper objectMapper;
    /**
     * 写入路径节点数据到redis地图中
     * lock为true 禁用库位,lock为false恢复库位
     */
    public synchronized boolean writeNavigateNodeToRedisMap(Integer lev, Integer shuttleNo, List<NavigateNode> nodes, boolean lock) {
        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
        try {
            if (nodes.isEmpty()) {
                return true;
@@ -46,15 +53,28 @@
            List<List<MapNode>> listsHasShuttle = navigateMapData.filterMap(NavigationMapType.NONE.id, arrayList, lev, null, shuttlePoints);//获取带小车地图数据
            List<List<MapNode>> lists = navigateMapData.filterMap(NavigationMapType.NONE.id, arrayList, lev, null, null);//获取全部地图数据
            //检测节点是否为当前设备
            for (NavigateNode node : nodes) {
                List<MapNode> listX = listsHasShuttle.get(node.getX());
                MapNode mapNode = listX.get(node.getY());
                if (mapNode.getLockDeviceNo() == null) {
                    continue;
                }
                if (!mapNode.getLockDeviceNo().equals(shuttleNo)) {
                    return false;//路径所属权不是当前设备
                }
            }
            //检测路径是否被锁定
            if (lock) {
                for (NavigateNode node : nodes) {
                    List<MapNode> listX = listsHasShuttle.get(node.getX());
                    MapNode mapNode = listX.get(node.getY());
                    if (mapNode.getValue() == -999) {
                    if (mapNode.getValue().equals(MapNodeType.LOCK.id)) {
                        return false;//路径被锁定过,禁止再次锁定
                    }
                    if (mapNode.getValue() == 66) {
                    if (mapNode.getValue().equals(MapNodeType.CAR.id)) {
                        return false;//路径存在小车,禁止锁定
                    }
                }
@@ -71,12 +91,14 @@
                List<MapNode> listX = lists.get(node.getX());
                MapNode mapNode = listX.get(node.getY());
                if (lock) {
                    mapNode.setValue(-999);//禁用库位
                    mapNode.setValue(MapNodeType.LOCK.id);//禁用库位
                    mapNode.setLockDeviceNo(shuttleNo);
                } else {
                    //获取原始节点数据
                    List<MapNode> rows = realMap.get(node.getX());
                    MapNode col = rows.get(node.getY());
                    mapNode.setValue(col.getValue());//恢复库位
                    mapNode.setLockDeviceNo(null);
                }
                listX.set(node.getY(), mapNode);
@@ -85,7 +107,10 @@
            redisMap.setData(JSON.toJSONString(lists));
            redisMap.setUpdateTime(new Date());
            //将数据库地图数据存入redis
            redisUtil.set(DeviceRedisConstant.MAP + lev, JSON.toJSONString(redisMap));
            redisUtil.set(DeviceRedisConstant.MAP + lev, JSON.toJSONString(redisMap, SerializerFeature.DisableCircularReferenceDetect));
            //保存路径锁节点
            saveLockPath(lev, nodes, lock);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
@@ -93,4 +118,66 @@
        return false;
    }
    //保存路径锁节点
    public void saveLockPath(Integer lev, List<NavigateNode> nodes, boolean lock) {
        Object o = redisUtil.get(DeviceRedisConstant.LOCK_PATH + lev);
        List<NavigateNode> navigateNodes = new ArrayList<>();
        if (o != null) {
            try {
                navigateNodes = objectMapper.readValue(o.toString(), new TypeReference<List<NavigateNode>>() {});
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
        }
        String nodeStr = null;
        if (lock) {
            navigateNodes.addAll(nodes);
            try {
                nodeStr = objectMapper.writeValueAsString(navigateNodes);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
            redisUtil.set(DeviceRedisConstant.LOCK_PATH + lev, nodeStr);
        }else {
            List<NavigateNode> tmp = new ArrayList<>();
            for (NavigateNode navigateNode : navigateNodes) {
                boolean flag = true;
                for (NavigateNode node : nodes) {
                    if (navigateNode.getX() == node.getX()
                            && navigateNode.getY() == node.getY()
                            && navigateNode.getZ() == node.getZ()) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    tmp.add(navigateNode);
                }
            }
            try {
                nodeStr = objectMapper.writeValueAsString(tmp);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
            redisUtil.set(DeviceRedisConstant.LOCK_PATH + lev, nodeStr);
        }
    }
    //获取路径锁节点
    public List<NavigateNode> getLockPath(Integer lev) {
        Object obj = redisUtil.get(DeviceRedisConstant.LOCK_PATH + lev);
        List<NavigateNode> navigateNodes = new ArrayList<>();
        if (obj != null) {
            try {
                navigateNodes = objectMapper.readValue(obj.toString(), new TypeReference<List<NavigateNode>>() {});
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
        }
        return navigateNodes;
    }
}