| | |
| | | @Autowired |
| | | private WrkChargeMapper wrkChargeMapper; |
| | | @Autowired |
| | | private BasMapService basMapService; |
| | | @Autowired |
| | | private ErpService erpService; |
| | | @Autowired |
| | | private OrderMapper orderMapper; |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获取/更新实时地图 |
| | | * 初始化实时地图 |
| | | */ |
| | | public synchronized void refreshMap() { |
| | | public synchronized void initRealtimeBasMap() { |
| | | for (int i = 1; i <= 4; i++) {//总共四层楼 |
| | | Object data = redisUtil.get("realtimeBasMap_" + i); |
| | | if (data == null) {//redis地图数据为空,从数据库中获取 |
| | | BasMap basMap = basMapService.selectLatestMap(i); |
| | | if (basMap == null) { |
| | | //数据库中也不存在地图数据,从地图文件中获取 |
| | | //载入地图 |
| | | NavigateMapData mapData = new NavigateMapData(i); |
| | | List<List<MapNode>> lists = mapData.getJsonData(-1);//获取完整地图(包括入库出库) |
| | | |
| | | //存入数据库 |
| | | basMap = new BasMap(); |
| | | basMap.setData(JSON.toJSONString(lists)); |
| | | basMap.setCreateTime(new Date()); |
| | | basMap.setUpdateTime(new Date()); |
| | | basMap.setLev(i); |
| | | |
| | | if (!basMapService.insert(basMap)) { |
| | | log.info("地图数据存储失败"); |
| | | } |
| | | } |
| | | |
| | | //将数据库地图数据存入redis |
| | | redisUtil.set("realtimeBasMap_" + i, JSON.toJSONString(basMap)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | if (wrkMast.getWrkSts() == 8 || Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) { |
| | | //同一层直接取货无需经过提升机 |
| | | //直接计算车到提升机取货再到库位路径指令 |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, locNo); |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, locNo, assignCommand); |
| | | if (wrkMast.getWrkSts() == 8) { |
| | | //此时车在提升机内部,需要多下达一步指令让车移动到提升机口 |
| | | BasDevp basDevp = basDevpService.selectById(109);//获取提升机信息 |
| | |
| | | //不同层,将目标库位分配成提升机库位号 |
| | | |
| | | //小车移动到提升机口,计算路径 |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, ShuttleTaskModeType.PAK_IN.id); |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, ShuttleTaskModeType.PAK_IN.id, assignCommand); |
| | | //分配目标库位 |
| | | shuttleProtocol.setLocNo(liftLocNo); |
| | | //目标库位 |
| | |
| | | } |
| | | |
| | | //获取起点-终点指令。mapType:1=》无货地图,2=》有货地图 |
| | | public synchronized List<ShuttleCommand> shuttleAssignCommand(String startLocNo, String locNO,Integer mapType) { |
| | | public synchronized List<ShuttleCommand> shuttleAssignCommand(String startLocNo, String locNo, Integer mapType, ShuttleAssignCommand assignCommand) { |
| | | //计算小车起点到中点所需命令 |
| | | List<NavigateNode> calc = NavigateUtils.calc(startLocNo, locNO, mapType); |
| | | List<NavigateNode> calc = NavigateUtils.calc(startLocNo, locNo, mapType); |
| | | List<ShuttleCommand> commands = new ArrayList<>(); |
| | | if (calc == null) { |
| | | return null; |
| | | } |
| | | |
| | | List<NavigateNode> allNode = new ArrayList<>(); |
| | | allNode.addAll(calc); |
| | | |
| | | //获取分段路径 |
| | | ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc); |
| | |
| | | command.setCommandEnd((short) 1); |
| | | commands.add(command); |
| | | } |
| | | |
| | | assignCommand.setNodes(allNode);//当前任务所占用的节点list |
| | | //所使用的路径进行锁定禁用 |
| | | NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(startLocNo)); |
| | | navigateMapData.writeNavigateNodeToRedisMap(allNode, true);////所使用的路径进行锁定禁用 |
| | | |
| | | return commands; |
| | | } |
| | | |
| | | //获取起点-中点-终点指令 |
| | | public synchronized List<ShuttleCommand> shuttleAssignCommand(String startLocNo, String middleLocNo, String locNO) { |
| | | public synchronized List<ShuttleCommand> shuttleAssignCommand(String startLocNo, String middleLocNo, String locNo, ShuttleAssignCommand assignCommand) { |
| | | //计算小车起点到中点所需命令 |
| | | List<NavigateNode> calc = NavigateUtils.calc(startLocNo, middleLocNo, 1);//小车无货,走入库地图 |
| | | List<ShuttleCommand> commands = new ArrayList<>(); |
| | | if (calc == null) { |
| | | return null; |
| | | } |
| | | |
| | | List<NavigateNode> allNode = new ArrayList<>(); |
| | | allNode.addAll(calc); |
| | | |
| | | //获取分段路径 |
| | | ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc); |
| | |
| | | commands.add(command); |
| | | |
| | | //计算小车中点到终点所需命令 |
| | | List<NavigateNode> calc2 = NavigateUtils.calc(middleLocNo, locNO, 2);//小车有货,走出库地图(出库地图有专用货道) |
| | | List<NavigateNode> calc2 = NavigateUtils.calc(middleLocNo, locNo, 2);//小车有货,走出库地图(出库地图有专用货道) |
| | | if (calc2 == null) { |
| | | return null; |
| | | } |
| | | |
| | | allNode.addAll(calc2); |
| | | |
| | | //获取分段路径 |
| | | ArrayList<ArrayList<NavigateNode>> data2 = NavigateUtils.getSectionPath(calc2); |
| | |
| | | command.setPalletLift((short) 2); |
| | | command.setCommandEnd((short) 1); |
| | | commands.add(command); |
| | | |
| | | assignCommand.setNodes(allNode);//当前任务所占用的节点list |
| | | //所使用的路径进行锁定禁用 |
| | | NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(startLocNo)); |
| | | navigateMapData.writeNavigateNodeToRedisMap(allNode, true);////所使用的路径进行锁定禁用 |
| | | |
| | | return commands; |
| | | } |
| | |
| | | if (Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) { |
| | | //同一层(将小车移动到货物位置) |
| | | |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, wrkMast.getSourceLocNo(), liftLocNo); |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, wrkMast.getSourceLocNo(), liftLocNo, assignCommand); |
| | | //分配目标库位 |
| | | shuttleProtocol.setLocNo(wrkMast.getSourceLocNo()); |
| | | //目标库位 |
| | |
| | | //不同层,将目标库位分配成提升机库位号(将小车移动到提升机位置) |
| | | |
| | | //小车到提升机口指令 |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, ShuttleTaskModeType.PAK_IN.id); |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, ShuttleTaskModeType.PAK_IN.id, assignCommand); |
| | | shuttleProtocol.setLocNo(liftLocNo); |
| | | //目标库位 |
| | | assignCommand.setLocNo(liftLocNo); |
| | |
| | | wrkMast.setWrkSts(22L);//小车迁移状态 |
| | | } |
| | | } else if (wrkMast.getWrkSts() == 25) { |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, wrkMast.getSourceLocNo(), liftLocNo); |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, wrkMast.getSourceLocNo(), liftLocNo, assignCommand); |
| | | //此时车在提升机内部,需要多下达一步指令让车移动到提升机口 |
| | | BasDevp basDevp = basDevpService.selectById(109);//获取提升机信息 |
| | | ShuttleCommand moveCommand = new ShuttleCommand(); |
| | |
| | | if (currentLev == chargeLocNoLev) { |
| | | //同一层无需经过提升机 |
| | | //直接计算车到充电库位 |
| | | |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | |
| | | //获取小车到充电库位路径指令 |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, chargeLocNo, ShuttleTaskModeType.PAK_IN.id); |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, chargeLocNo, ShuttleTaskModeType.PAK_IN.id, assignCommand); |
| | | //进行充电中 |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING); |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); |
| | | assignCommand.setTaskMode((short) 9);//充电 |
| | | assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); |
| | |
| | | }else { |
| | | //不同层,将目标库位分配成提升机库位号 |
| | | |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | |
| | | //小车移动到提升机口,计算路径 |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, ShuttleTaskModeType.PAK_IN.id); |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftLocNo, ShuttleTaskModeType.PAK_IN.id, assignCommand); |
| | | //分配目标库位 |
| | | shuttleProtocol.setLocNo(liftLocNo); |
| | | |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); |
| | | assignCommand.setTaskMode((short) 9);//充电 |
| | | assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); |