package com.zy.common.utils;
|
|
import com.core.common.SpringUtils;
|
import com.zy.asrs.utils.Utils;
|
import com.zy.common.model.NavigateNode;
|
import com.zy.common.model.NyShuttleOperaResult;
|
import com.zy.common.model.enums.NavigationMapType;
|
import com.zy.core.model.command.NyShuttleHttpCommand;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 牛眼四向车操作工具类
|
* 此工具类只要作用于获取小车的各类命令List,移动命令、搬运货物命令、复位命令等。如命令为移动命令,还将返回行走路径List
|
*/
|
public class NyShuttleOperaUtils {
|
|
/**
|
* 计算并获取小车从起点——中间点——目标点之间搬运货物动作命令
|
* @param shuttleNo 小车号
|
* @param wrkNo 工作号
|
* @param startPoint 起点(小车当前位置)
|
* @param targetPoint 目标点(货物目标位置)
|
*/
|
public static synchronized NyShuttleOperaResult getShuttleTransportCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint) {
|
//行走路径
|
ArrayList<NavigateNode> nodes = new ArrayList<>();
|
//命令集合
|
ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
|
|
//计算起点到目标点命令
|
NyShuttleOperaResult result = getStartToTargetCommands(shuttleNo, wrkNo, startPoint, targetPoint, NavigationMapType.DFX.id);
|
if (result == null) {
|
//计算结果必须不为空,否则计算失败
|
return null;
|
}
|
nodes.addAll(result.getNodes());
|
//起点位置下发一条顶升命令将货物进行搬运
|
commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, true));
|
commands.addAll(result.getCommands());//起点到目标点移动命令
|
//当小车行走到目标点后,需要下发一条下降命令将货物放置
|
commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, false));
|
return result(commands, nodes);
|
}
|
|
/**
|
* 计算并获取小车从起点——中间点——目标点之间搬运货物动作命令
|
* @param shuttleNo 小车号
|
* @param wrkNo 工作号
|
* @param startPoint 起点(小车当前位置)
|
* @param middlePoint 中间点(货物位置)
|
* @param targetPoint 目标点(货物目标位置)
|
*/
|
public static synchronized NyShuttleOperaResult getShuttleTransportCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String middlePoint, String targetPoint) {
|
//行走路径
|
ArrayList<NavigateNode> nodes = new ArrayList<>();
|
//命令集合
|
ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
|
|
if (!startPoint.equals(middlePoint)) {//起点和中间点不一致,需要计算起点到中间点路径
|
//计算起点到中间点命令
|
NyShuttleOperaResult result1 = getStartToTargetCommands(shuttleNo, wrkNo, startPoint, middlePoint, NavigationMapType.NORMAL.id);
|
if (result1 == null) {
|
//计算结果必须不为空,否则计算失败
|
return null;
|
}
|
nodes.addAll(result1.getNodes());
|
commands.addAll(result1.getCommands());
|
}
|
|
//计算中间点到目标点命令
|
NyShuttleOperaResult result2 = getStartToTargetCommands(shuttleNo, wrkNo, middlePoint, targetPoint, NavigationMapType.DFX.id);
|
if (result2 == null) {
|
//计算结果必须不为空,否则计算失败
|
return null;
|
}
|
nodes.addAll(result2.getNodes());
|
//当小车行走到中间点后,需要下发一条顶升命令将货物进行搬运
|
commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, true));
|
commands.addAll(result2.getCommands());//中间点到目标点移动命令
|
//当小车行走到目标点后,需要下发一条下降命令将货物放置
|
commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, false));
|
return result(commands, nodes);
|
}
|
|
/**
|
* 获取起点到目标点行走命令
|
*/
|
public static synchronized NyShuttleOperaResult getStartToTargetCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint, Integer mapType) {
|
NavigateMapUtils navigateMapUtils = SpringUtils.getBean(NavigateMapUtils.class);
|
//计算起点到目标点行走节点
|
List<NavigateNode> calc = NavigateUtils.calc(startPoint, targetPoint, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startPoint)), null);
|
if (calc == null) {
|
return null;
|
}
|
|
//命令集合
|
ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
|
List<NavigateNode> allNode = new ArrayList<>();
|
|
//获取分段路径
|
ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc);
|
//将每一段路径分成command指令
|
for (ArrayList<NavigateNode> nodes : data) {
|
//开始路径
|
NavigateNode startPath = nodes.get(0);
|
//目标路径
|
NavigateNode targetPath = nodes.get(nodes.size() - 1);
|
//获取移动命令
|
NyShuttleHttpCommand moveCommand = NyHttpUtils.getMoveCommand(shuttleNo, wrkNo, startPath, targetPath);
|
moveCommand.setNodes(nodes);//将行走节点添加到每一步命令中
|
commands.add(moveCommand);
|
|
allNode.addAll(nodes);
|
}
|
|
boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(startPoint), shuttleNo, allNode, true);//锁定路径
|
if (!result) {
|
return null;//路径锁定失败
|
}
|
return result(commands, calc);
|
}
|
|
/**
|
* 获取起点到目标点行走命令(可传白名单)
|
*/
|
public static synchronized NyShuttleOperaResult getStartToTargetCommandsByWhites(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint, Integer mapType, List<int[]> whites) {
|
NavigateMapUtils navigateMapUtils = SpringUtils.getBean(NavigateMapUtils.class);
|
//计算起点到目标点行走节点
|
List<NavigateNode> calc = NavigateUtils.calc(startPoint, targetPoint, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startPoint)), whites);
|
if (calc == null) {
|
return null;
|
}
|
|
//命令集合
|
ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
|
List<NavigateNode> allNode = new ArrayList<>();
|
|
//获取分段路径
|
ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc);
|
//将每一段路径分成command指令
|
for (ArrayList<NavigateNode> nodes : data) {
|
//开始路径
|
NavigateNode startPath = nodes.get(0);
|
//目标路径
|
NavigateNode targetPath = nodes.get(nodes.size() - 1);
|
//获取移动命令
|
NyShuttleHttpCommand moveCommand = NyHttpUtils.getMoveCommand(shuttleNo, wrkNo, startPath, targetPath);
|
moveCommand.setNodes(nodes);//将行走节点添加到每一步命令中
|
commands.add(moveCommand);
|
|
allNode.addAll(nodes);
|
}
|
|
//锁定路径时剔除白名单节点
|
ArrayList<NavigateNode> nodes = new ArrayList<>();
|
for (NavigateNode node : allNode) {
|
boolean flag = false;
|
for (int[] white : whites) {
|
if (node.getX() == white[0] && node.getY() == white[1]) {
|
flag = true;//存在白名单节点
|
break;//跳过白名单节点
|
}
|
}
|
|
if (!flag) {
|
nodes.add(node);
|
}
|
}
|
boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(startPoint), shuttleNo, nodes, true);//锁定路径
|
if (!result) {
|
return null;//路径锁定失败
|
}
|
return result(commands, calc);
|
}
|
|
//返回结果集
|
public static NyShuttleOperaResult result(List<NyShuttleHttpCommand> commands, List<NavigateNode> nodes) {
|
return new NyShuttleOperaResult(commands, nodes);
|
}
|
|
}
|