package com.zy.common.utils;
|
|
import com.alibaba.fastjson.JSON;
|
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 {
|
|
private Integer lev;//地图楼层
|
|
public NavigateMapData() {
|
this.lev = 1;
|
}
|
|
public NavigateMapData(Integer lev) {
|
this.lev = lev;
|
}
|
|
public int[][] getData() {
|
return getData(ShuttleTaskModeType.PAK_IN.id);
|
}
|
|
public int[][] getData(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);//过滤地图数据
|
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;
|
} else {
|
System.out.println("文件不存在!");
|
}
|
} catch (IOException ioException) {
|
ioException.printStackTrace();
|
}
|
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;
|
}
|
|
}
|