package com.zy.common.utils;
|
|
import com.alibaba.fastjson.JSON;
|
import com.core.common.SpringUtils;
|
import com.zy.asrs.entity.BasMap;
|
import com.zy.asrs.entity.LocMast;
|
import com.zy.asrs.service.LocMastService;
|
import com.zy.asrs.utils.Utils;
|
import com.zy.common.model.MapNode;
|
import com.zy.common.model.enums.NavigationMapType;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.MapNodeType;
|
import com.zy.core.enums.RedisKeyType;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.ForkLiftSlave;
|
import com.zy.core.model.protocol.ForkLiftStaProtocol;
|
import com.zy.core.properties.SlaveProperties;
|
import com.zy.core.thread.ForkLiftThread;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.stereotype.Component;
|
|
import java.io.*;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* A*算法地图获取类
|
*/
|
@Component
|
public class NavigateMapData {
|
|
@Autowired
|
private SlaveProperties slaveProperties;
|
|
public int[][] getData(Integer lev, Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
|
try {
|
// RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
|
// Object object = redisUtil.get(RedisKeyType.BASIC_MAP.key + lev);
|
// if (object == null) {
|
// return null;
|
// }
|
//
|
// //解析json地图数据
|
// ArrayList arrayList = JSON.parseObject(object.toString(), ArrayList.class);
|
// List<List<MapNode>> lists = filterMap(mapType, arrayList, lev, whitePoints, shuttlePoints);//过滤地图数据
|
// 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;
|
|
String mapFilename = "map_" + lev + ".json";
|
ClassPathResource classPathResource = new ClassPathResource(mapFilename);
|
InputStream inputStream = classPathResource.getInputStream();
|
byte[] buffer = new byte[inputStream.available()];
|
inputStream.read(buffer);
|
File file = File.createTempFile("prefix", "suffix");
|
try (OutputStream outStream = new FileOutputStream(file)) {
|
outStream.write(buffer);
|
}
|
|
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, lev, whitePoints, shuttlePoints);//过滤地图数据
|
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;
|
}
|
|
if (!file.delete()) {
|
System.out.println("临时文件删除失败");
|
}
|
return map;
|
} else {
|
System.out.println("文件不存在!");
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 尝试从redis获取数据
|
*/
|
public int[][] getDataFromRedis(Integer lev, Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
|
RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
|
Object o = redisUtil.get(RedisKeyType.MAP.key + lev);
|
if (o == null) {
|
return null;
|
}
|
|
BasMap basMap = JSON.parseObject(o.toString(), BasMap.class);
|
return this.getDataFormString(lev, basMap.getData(), mapType, whitePoints, shuttlePoints);
|
}
|
|
/**
|
* 从List数据中获取地图
|
*/
|
public int[][] getDataFormString(Integer lev, String data, Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
|
ArrayList arrayList = JSON.parseObject(data, ArrayList.class);
|
List<List<MapNode>> lists = filterMap(mapType, arrayList, lev, whitePoints, shuttlePoints);//过滤地图数据
|
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, List<int[]> whitePoints, List<int[]> shuttlePoints) {
|
// try {
|
//// RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
|
//// Object object = redisUtil.get(RedisKeyType.BASIC_MAP.key + lev);
|
//// if (object == null) {
|
//// return null;
|
//// }
|
////
|
//// //解析json地图数据
|
//// ArrayList arrayList = JSON.parseObject(object.toString(), ArrayList.class);
|
//// List<List<MapNode>> lists = filterMap(mapType, arrayList, lev, whitePoints, shuttlePoints);//过滤地图数据
|
//// return lists;
|
//
|
//
|
// String mapFilename = "map_" + lev + ".json";
|
// ClassPathResource classPathResource = new ClassPathResource(mapFilename);
|
// InputStream inputStream = classPathResource.getInputStream();
|
// byte[] buffer = new byte[inputStream.available()];
|
// inputStream.read(buffer);
|
// File file = File.createTempFile("prefix","suffix");
|
// try (OutputStream outStream = new FileOutputStream(file)) {
|
// outStream.write(buffer);
|
// }
|
//
|
// 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, lev, whitePoints, shuttlePoints);//过滤地图数据
|
//
|
// if (!file.delete()) {
|
// System.out.println("临时文件删除失败");
|
// }
|
//
|
// return lists;
|
// } else {
|
// System.out.println("文件不存在!");
|
// }
|
// } catch (Exception e) {
|
// e.printStackTrace();
|
// }
|
// return null;
|
// }
|
|
//获取JSON格式数据
|
public List<List<MapNode>> getJsonData(Integer lev, Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
|
try {
|
// RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
|
// Object object = redisUtil.get(RedisKeyType.BASIC_MAP.key + lev);
|
// if (object == null) {
|
// return null;
|
// }
|
//
|
// //解析json地图数据
|
// ArrayList arrayList = JSON.parseObject(object.toString(), ArrayList.class);
|
// List<List<MapNode>> lists = filterMap(mapType, arrayList, lev, whitePoints, shuttlePoints);//过滤地图数据
|
// return lists;
|
|
String mapFilename = "map_" + lev + ".json";
|
ClassPathResource classPathResource = new ClassPathResource(mapFilename);
|
InputStream inputStream = classPathResource.getInputStream();
|
byte[] buffer = new byte[inputStream.available()];
|
inputStream.read(buffer);
|
File file = File.createTempFile("prefix","suffix");
|
try (OutputStream outStream = new FileOutputStream(file)) {
|
outStream.write(buffer);
|
}
|
|
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, lev, whitePoints, shuttlePoints);//过滤地图数据
|
|
if (!file.delete()) {
|
System.out.println("临时文件删除失败");
|
}
|
|
return lists;
|
} else {
|
System.out.println("文件不存在!");
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 过滤地图数据
|
* mapType -1=>无过滤,1=》过滤库位状态DFX,2=》过滤库位状态X
|
*
|
* @param whitePoints 白名单节点,不需要被过滤
|
* @param shuttlePoints 穿梭车节点,需要加载进地图
|
*/
|
public List<List<MapNode>> filterMap(Integer mapType, List arrayList, Integer lev, List<int[]> whitePoints, List<int[]> shuttlePoints) {
|
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);
|
list.set(j, mapNode);
|
}
|
lists.add(list);
|
}
|
|
//过滤数据
|
LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
|
try {
|
//获取当前楼层库位数据
|
List<LocMast> locMasts = locMastService.selectLocByLev(lev);
|
for (LocMast locMast : locMasts) {
|
Integer row = locMast.getRow1();
|
Integer bay = locMast.getBay1();
|
|
boolean whiteFlag = false;//默认不存在白名单
|
if (whitePoints != null) {
|
for (int[] whitePoint : whitePoints) {
|
if (whitePoint[0] == row && whitePoint[1] == bay) {
|
//存在白名单
|
whiteFlag = true;
|
break;
|
}
|
}
|
}
|
if (whiteFlag) {
|
continue;//存在白名单,不执行下列过滤方案
|
}
|
|
|
List<MapNode> list = lists.get(row);
|
MapNode mapNode = list.get(bay);
|
|
if (mapType == NavigationMapType.NONE.id) {
|
//不过滤任何数据
|
} else if (mapType == NavigationMapType.DFX.id) {
|
//车辆有货
|
//读取对应库位数据,将DFX库位状态的节点置为-1(障碍物)
|
if (locMast.getLocSts().equals("F")
|
|| locMast.getLocSts().equals("D")
|
|| locMast.getLocSts().equals("X")
|
|| locMast.getLocSts().equals("R")
|
|| locMast.getLocSts().equals("P")
|
) {
|
mapNode.setValue(MapNodeType.DISABLE.id);//禁用节点
|
}
|
} else if (mapType == NavigationMapType.NORMAL.id) {
|
//过滤库位状态X
|
if (locMast.getLocSts().equals("X")) {
|
mapNode.setValue(MapNodeType.DISABLE.id);//禁用节点
|
}
|
}
|
|
//更新list
|
list.set(bay, mapNode);
|
lists.set(row, list);
|
}
|
}catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
//加载车辆坐标到地图中
|
if (shuttlePoints != null) {
|
for (int[] points : shuttlePoints) {
|
int x = points[0];
|
int y = points[1];
|
List<MapNode> list = lists.get(x);
|
MapNode mapNode = list.get(y);
|
mapNode.setValue(MapNodeType.CAR.id);//设置为车辆代码66
|
//更新list
|
list.set(y, mapNode);
|
lists.set(x, list);
|
}
|
}
|
|
//加载白名单节点
|
if (whitePoints != null) {
|
List<List<MapNode>> realMap = getJsonData(lev, -1, null, null);//获取完整地图
|
for (int[] points : whitePoints) {
|
//获取原始节点数据
|
int x = points[0];
|
int y = points[1];
|
List<MapNode> rows = realMap.get(x);
|
MapNode col = rows.get(y);
|
|
List<MapNode> list = lists.get(x);
|
MapNode mapNode = list.get(y);
|
mapNode.setValue(col.getValue());//恢复原始节点
|
|
//更新list
|
list.set(y, mapNode);
|
lists.set(x, list);
|
}
|
}
|
|
try {
|
//加载货叉提升机放货点位数据
|
for (ForkLiftSlave forkLiftSlave : slaveProperties.getForkLift()) {
|
ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, forkLiftSlave.getId());
|
if (forkLiftThread == null) {
|
continue;
|
}
|
|
for (ForkLiftStaProtocol staProtocol : forkLiftThread.getForkLiftStaProtocols()) {
|
int row = Utils.getRow(staProtocol.getLocNo());
|
int bay = Utils.getBay(staProtocol.getLocNo());
|
|
List<MapNode> list = lists.get(row);
|
MapNode mapNode = list.get(bay);
|
|
if (mapType == NavigationMapType.DFX.id) {
|
//车辆有货
|
if (staProtocol.getHasTray() != null && staProtocol.getHasTray()) {
|
mapNode.setValue(MapNodeType.DISABLE.id);
|
}
|
}else {
|
if (staProtocol.getHasCar() != null && staProtocol.getHasCar()) {
|
mapNode.setValue(MapNodeType.CAR.id);
|
}
|
}
|
|
//更新list
|
list.set(bay, mapNode);
|
lists.set(row, list);
|
}
|
|
}
|
}catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
return lists;
|
}
|
|
}
|