| package com.zy.common.utils; | 
|   | 
| 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 middlePoint 中间点(货物位置) | 
|      * @param targetPoint 目标点(货物目标位置) | 
|      */ | 
|     public static 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); | 
|             if (result1 == null) { | 
|                 //计算结果必须不为空,否则计算失败 | 
|                 return null; | 
|             } | 
|             nodes.addAll(result1.getNodes()); | 
|             commands.addAll(result1.getCommands()); | 
|         } | 
|   | 
|         //计算中间点到目标点命令 | 
|         NyShuttleOperaResult result2 = getStartToTargetCommands(shuttleNo, wrkNo, middlePoint, targetPoint); | 
|         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 NyShuttleOperaResult getStartToTargetCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint) { | 
|         //计算起点到目标点行走节点 | 
|         List<NavigateNode> calc = NavigateUtils.calc(startPoint, targetPoint, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startPoint))); | 
|         if (calc == null) { | 
|             return null; | 
|         } | 
|   | 
|         //命令集合 | 
|         ArrayList<NyShuttleHttpCommand> commands = 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); | 
|         } | 
|   | 
|         return result(commands, calc); | 
|     } | 
|   | 
|     //返回结果集 | 
|     public static NyShuttleOperaResult result(List<NyShuttleHttpCommand> commands, List<NavigateNode> nodes) { | 
|         return new NyShuttleOperaResult(commands, nodes); | 
|     } | 
|   | 
| } |