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.BasMapService;
|
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.stereotype.Component;
|
|
import java.io.*;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* A*算法地图获取类
|
*/
|
@Component
|
public class NavigateMapData {
|
|
@Autowired
|
private SlaveProperties slaveProperties;
|
@Autowired
|
private BasMapService basMapService;
|
|
public int[][] getData(Integer lev, Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
|
try {
|
BasMap basMap = basMapService.selectLatestMap(lev);
|
String originData = basMap.getOriginData();
|
|
//解析json地图数据
|
ArrayList arrayList = JSON.parseObject(originData, 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;
|
} 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 lev, Integer mapType, List<int[]> whitePoints, List<int[]> shuttlePoints) {
|
try {
|
BasMap basMap = basMapService.selectLatestMap(lev);
|
String originData = basMap.getOriginData();
|
//解析json地图数据
|
ArrayList arrayList = JSON.parseObject(originData, ArrayList.class);
|
//重建数据格式
|
List<List<MapNode>> lists = rebuildData(arrayList);
|
return lists;
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
public int[][] parseJsonDataArr(List<List<MapNode>> lists) {
|
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;
|
}
|
|
/**
|
* 过滤地图数据
|
* 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 = rebuildData(arrayList);
|
|
//载入库位信息
|
lists = loadLocMast(mapType, lists, lev, whitePoints);
|
|
//加载车辆
|
lists = loadShuttle(lists, shuttlePoints);
|
|
//加载货叉提升机点位
|
lists = loadForkLift(lists, mapType, lev);
|
|
//加载白名单节点
|
lists = loadWhite(lists, lev, whitePoints);
|
|
return lists;
|
}
|
|
//重建数据格式
|
public List<List<MapNode>> rebuildData(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);
|
list.set(j, mapNode);
|
}
|
lists.add(list);
|
}
|
|
return lists;
|
}
|
|
//载入库位信息
|
public List<List<MapNode>> loadLocMast(Integer mapType, List<List<MapNode>> lists, Integer lev, List<int[]> whitePoints) {
|
//过滤数据
|
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();
|
}
|
|
return lists;
|
}
|
|
//加载车辆
|
public List<List<MapNode>> loadShuttle(List<List<MapNode>> lists, List<int[]> shuttlePoints) {
|
//加载车辆坐标到地图中
|
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);
|
}
|
}
|
|
return lists;
|
}
|
|
//加载白名单节点
|
public List<List<MapNode>> loadWhite(List<List<MapNode>> lists, Integer lev, List<int[]> whitePoints) {
|
//加载白名单节点
|
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);
|
}
|
}
|
return lists;
|
}
|
|
//加载货叉提升机点位
|
public List<List<MapNode>> loadForkLift(List<List<MapNode>> lists, Integer mapType, Integer lev) {
|
try {
|
//加载货叉提升机放货点位数据
|
for (ForkLiftSlave forkLiftSlave : slaveProperties.getForkLift()) {
|
ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, forkLiftSlave.getId());
|
if (forkLiftThread == null) {
|
continue;
|
}
|
|
for (ForkLiftStaProtocol staProtocol : forkLiftThread.getForkLiftStaProtocols()) {
|
if (staProtocol.getLev() != lev) {
|
continue;
|
}
|
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;
|
}
|
|
}
|