自动化立体仓库 - WCS系统
Junjie
2023-05-11 8d6708ad6b4353fd1da4d3d950fa61514ed41add
src/main/java/com/zy/common/utils/NavigateMapData.java
@@ -1,28 +1,40 @@
package com.zy.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasMap;
import com.zy.common.model.MapNode;
import com.zy.common.model.NavigateNode;
import com.zy.core.enums.ShuttleTaskModeType;
import org.springframework.stereotype.Component;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
 * A*算法地图获取类
 */
@Component
public class NavigateMapData {
    public int[][] getData() {
        return getData("in");
    private Integer lev;//地图楼层
    public NavigateMapData() {
        this.lev = 1;
    }
    public int[][] getData(String mapType) {
    public NavigateMapData(Integer lev) {
        this.lev = lev;
    }
    public int[][] getData() {
        return getData(ShuttleTaskModeType.PAK_IN.id);
    }
    public int[][] getData(Integer mapType) {
        try {
            String mapFilename = "";
            if (mapType.equals("in")) {
                mapFilename = "mapIn.json";
            }else {
                mapFilename = "mapOut.json";
            }
            String mapFilename = "map_" + lev + ".json";
            String fileName = this.getClass().getClassLoader().getResource(mapFilename).getPath();//获取文件路径
            File file = new File(fileName);
@@ -38,16 +50,15 @@
                //解析json地图数据
                ArrayList arrayList = JSON.parseObject(stringBuffer.toString(), ArrayList.class);
                int[][] map = new int[arrayList.size()][];
                List<List<MapNode>> lists = filterMap(mapType, arrayList);//过滤地图数据
                int[][] map = new int[lists.size()][];
                int j = 0;
                for (Object obj : arrayList) {
                    ArrayList list = JSON.parseObject(obj.toString(), ArrayList.class);
                for (List<MapNode> list : lists) {
                    int[] tmp = new int[list.size()];
                    int i = 0;
                    for (Object o : list) {
                        JSONObject jsonObject = JSON.parseObject(o.toString());
                    for (MapNode mapNode : list) {
                        //将数据添加进二维数组
                        tmp[i++] = Integer.parseInt(jsonObject.get("value").toString());
                        tmp[i++] = mapNode.getValue();
                    }
                    //数据添加进一维数组
                    map[j++] = tmp;
@@ -63,4 +74,143 @@
        return null;
    }
    /**
     * 尝试从redis获取数据
     */
    public int[][] getDataFromRedis(Integer mapType) {
        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
        Object o = redisUtil.get("realtimeBasMap_" + lev);
        if (o == null) {
            return null;
        }
        BasMap basMap = JSON.parseObject(o.toString(), BasMap.class);
        return this.getDataFormString(basMap.getData(), mapType);
    }
    /**
     * 从List数据中获取地图
     */
    public int[][] getDataFormString(String data, Integer mapType) {
        ArrayList arrayList = JSON.parseObject(data, ArrayList.class);
        List<List<MapNode>> lists = filterMap(mapType, arrayList);//过滤地图数据
        int[][] map = new int[lists.size()][];
        int j = 0;
        for (List<MapNode> list : lists) {
            int[] tmp = new int[list.size()];
            int i = 0;
            for (MapNode mapNode : list) {
                //将数据添加进二维数组
                tmp[i++] = mapNode.getValue();
            }
            //数据添加进一维数组
            map[j++] = tmp;
        }
        return map;
    }
    //获取JSON格式数据
    public List<List<MapNode>> getJsonData(Integer mapType) {
        try {
            String mapFilename = "map_" + lev + ".json";
            String fileName = this.getClass().getClassLoader().getResource(mapFilename).getPath();//获取文件路径
            File file = new File(fileName);
            StringBuffer stringBuffer = new StringBuffer();
            if (file.isFile() && file.exists()) {
                InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK");
                BufferedReader br = new BufferedReader(isr);
                String lineTxt = null;
                while ((lineTxt = br.readLine()) != null) {
                    stringBuffer.append(lineTxt);
                }
                br.close();
                //解析json地图数据
                ArrayList arrayList = JSON.parseObject(stringBuffer.toString(), ArrayList.class);
                List<List<MapNode>> lists = filterMap(mapType, arrayList);//过滤地图数据
                return lists;
            } else {
                System.out.println("文件不存在!");
            }
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
        return null;
    }
    /**
     * 过滤地图数据,入库操作则过滤出库的禁用库位,出库操作则过滤入库的禁用库位
     */
    public List<List<MapNode>> filterMap(Integer mapType,List arrayList) {
        List<List<MapNode>> lists = new ArrayList<>();
        for (int i = 0; i < arrayList.size(); i++) {
            Object obj = arrayList.get(i);
            List<MapNode> list = JSON.parseArray(obj.toString(), MapNode.class);
            for (int j = 0; j < list.size(); j++) {
                MapNode mapNode = list.get(j);
                if (mapType == ShuttleTaskModeType.PAK_IN.id) {
                    //入库地图
                    if (mapNode.getData().equals("IN_X")) {
                        //禁止使用的库位,设置为-1
                        mapNode.setValue(-1);
                    }
                }else if(mapType == ShuttleTaskModeType.PAK_OUT.id){
                    //出库地图
                    if (mapNode.getData().equals("OUT_X")) {
                        //禁止使用的库位,设置为-1
                        mapNode.setValue(-1);
                    }
                }
                list.set(j, mapNode);
            }
            lists.add(list);
        }
        return lists;
    }
    /**
     * 写入路径节点数据到redis地图中
     * lock为true 禁用库位,lock为false恢复库位
     */
    public boolean writeNavigateNodeToRedisMap(List<NavigateNode> nodes, boolean lock) {
        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
        Object o = redisUtil.get("realtimeBasMap_" + lev);
        if (o == null) {
            return false;
        }
        BasMap basMap = JSON.parseObject(o.toString(), BasMap.class);
        ArrayList arrayList = JSON.parseObject(basMap.getData(), ArrayList.class);
        List<List<MapNode>> lists = filterMap(-1, arrayList);//获取全部地图数据
        for (NavigateNode node : nodes) {
            if (node.getZ() != lev) {
                continue;
            }
            List<MapNode> listX = lists.get(node.getX());
            MapNode mapNode = listX.get(node.getY());
            if (lock) {
                mapNode.setValue(-999);//禁用库位
            }else {
                if (node.getX() == 11 || node.getX() == 19) {
                    mapNode.setValue(3);//恢复库位,母轨道
                }else {
                    mapNode.setValue(0);//恢复库位,普通库位
                }
            }
            listX.set(node.getY(), mapNode);
            lists.set(node.getX(), listX);
        }
        basMap.setData(JSON.toJSONString(lists));
        //将数据库地图数据存入redis
        redisUtil.set("realtimeBasMap_" + lev, JSON.toJSONString(basMap));
        return true;
    }
}