| | |
| | | NyShuttleHttpCommand readStatusCommand = NyHttpUtils.getReadStatusCommand(slave.getId()); |
| | | JSONObject jsonObject = NyHttpUtils.requestCommand(socket, readStatusCommand); |
| | | if (jsonObject == null) { |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE); |
| | | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车Socket状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | }else { |
| | | //手动状态/自动状态 |
| | |
| | | //小车处于运行中,将标记置为true |
| | | if (shuttleProtocol.getFree() == 0) { |
| | | shuttleProtocol.setPakMk(true); |
| | | }else { |
| | | //小车处于等待确认且空闲状态,如有工作号则清空路径 |
| | | if (shuttleProtocol.getTaskNo() != 0 && shuttleProtocol.getProtocolStatusType() == ShuttleProtocolStatusType.IDLE) { |
| | | Object o = redisUtil.get("shuttle_wrk_no_" + shuttleProtocol.getTaskNo()); |
| | | if (o != null) { |
| | | ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class); |
| | | ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand(); |
| | | NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | navigateMapData.writeNavigateNodeToRedisMap(assignCommand.getNodes(), false);//解锁路径 |
| | | |
| | | //删除redis |
| | | redisUtil.del("shuttle_wrk_no_" + redisCommand.getWrkNo()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //将四向穿梭车状态保存至数据库 |
| | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车Socket状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | try { |
| | | this.socket.close(); |
| | | this.socket = null; |
| | | Thread.sleep(1000); |
| | | this.connect(); |
| | | } catch (IOException | InterruptedException exception) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | socket.setSoTimeout(60000); |
| | | socket.setKeepAlive(true); |
| | | this.socket = socket; |
| | | log.info(MessageFormat.format("【{0}】四向穿梭车Socket链接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | } catch (IOException e) { |
| | | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车Socket链接失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | } |
| | |
| | | } |
| | | |
| | | //发出请求 |
| | | JSONObject result = NyHttpUtils.requestCommand(socket, command); |
| | | JSONObject result = null; |
| | | try { |
| | | result = NyHttpUtils.requestCommand(socket, command); |
| | | } catch (IOException e) { |
| | | try { |
| | | this.socket.close(); |
| | | this.socket = null; |
| | | Thread.sleep(1000); |
| | | this.connect(); |
| | | } catch (IOException exception) { |
| | | exception.printStackTrace(); |
| | | } catch (InterruptedException ex) { |
| | | throw new RuntimeException(ex); |
| | | } |
| | | } |
| | | if (result == null) { |
| | | return false;//请求失败 |
| | | } |
| | |
| | | NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | //取出命令 |
| | | NyShuttleHttpCommand command = commands.get(commandStep);//当前命令 |
| | | // if (commandStep != 0) { |
| | | // //判断上一条指令是否完成 |
| | | // NyShuttleHttpCommand lastCommand = commands.get(commandStep - 1); |
| | | // String requestType = lastCommand.getRequest().getBody().get("requestType").toString(); |
| | | // if (requestType.equals("move") || requestType.equals("intoLift") || requestType.equals("outLift")) { |
| | | // //移动命令、出入提升机命令 |
| | | // NyShuttleProtocol.NyShuttlePointClass target = JSON.parseObject(lastCommand.getRequest().getBody().get("target").toString(), NyShuttleProtocol.NyShuttlePointClass.class); |
| | | // if (shuttleProtocol.getPoint().equals(target)) { |
| | | // //上一条指令的目标位置和当前小车位置相同,则认定上一条任务完成 |
| | | // lastCommand.setComplete(true); |
| | | // //解锁锁定路径,上一条路径和当前路径 |
| | | // List<NavigateNode> nodes = lastCommand.getNodes(); |
| | | // nodes.addAll(command.getNodes()); |
| | | // navigateMapData.writeNavigateNodeToRedisMap(nodes, false);//解锁路径 |
| | | // } |
| | | // }else { |
| | | // lastCommand.setComplete(true);//其他命令默认认为完成 |
| | | // } |
| | | // //任务数据保存到redis |
| | | // redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); |
| | | // |
| | | // if (!lastCommand.getComplete()) { |
| | | // //上一条任务未完成,禁止下发命令 |
| | | // return false; |
| | | // } |
| | | // } |
| | | // |
| | | // List<NavigateNode> nextNodes = null;//下一步命令行走路径 |
| | | // if (commandStep + 1 < commands.size()) { |
| | | // NyShuttleHttpCommand nextCommand = commands.get(commandStep + 1);//下一步命令 |
| | | // nextNodes = nextCommand.getNodes();//下一步命令行走路径 |
| | | // } |
| | | // |
| | | // if (shuttleProtocol.getFree() == ShuttleStatusType.BUSY.id) { |
| | | // return false;//小车状态忙,禁止执行命令 |
| | | // } |
| | | // |
| | | if (commandStep != 0) { |
| | | //判断上一条指令是否完成 |
| | | NyShuttleHttpCommand lastCommand = commands.get(commandStep - 1); |
| | | String requestType = lastCommand.getRequest().getBody().get("requestType").toString(); |
| | | if (requestType.equals("move") || requestType.equals("intoLift") || requestType.equals("outLift")) { |
| | | //移动命令、出入提升机命令 |
| | | NyShuttleProtocol.NyShuttlePointClass target = JSON.parseObject(lastCommand.getRequest().getBody().get("target").toString(), NyShuttleProtocol.NyShuttlePointClass.class); |
| | | if (shuttleProtocol.getPoint().equals(target)) { |
| | | //上一条指令的目标位置和当前小车位置相同,则认定上一条任务完成 |
| | | lastCommand.setComplete(true); |
| | | //解锁锁定路径,上一条路径和当前路径 |
| | | List<NavigateNode> nodes = lastCommand.getNodes(); |
| | | nodes.addAll(command.getNodes()); |
| | | navigateMapData.writeNavigateNodeToRedisMap(nodes, false);//解锁路径 |
| | | } |
| | | }else { |
| | | lastCommand.setComplete(true);//其他命令默认认为完成 |
| | | } |
| | | //任务数据保存到redis |
| | | redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); |
| | | |
| | | if (!lastCommand.getComplete()) { |
| | | //上一条任务未完成,禁止下发命令 |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | List<NavigateNode> nextNodes = null;//下一步命令行走路径 |
| | | if (commandStep + 1 < commands.size()) { |
| | | NyShuttleHttpCommand nextCommand = commands.get(commandStep + 1);//下一步命令 |
| | | nextNodes = nextCommand.getNodes();//下一步命令行走路径 |
| | | } |
| | | |
| | | if (shuttleProtocol.getFree() == ShuttleStatusType.BUSY.id) { |
| | | return false;//小车状态忙,禁止执行命令 |
| | | } |
| | | |
| | | // //检测小车是否要进提升机,如需要进提升机则调度提升机 |
| | | // if (!checkLiftStation(wrkNo)) { |
| | | // return false; |
| | | // } |
| | | // |
| | | // //检测穿梭车是否在提升机内 |
| | | // if (!checkShuttleInTheLift(wrkNo)) { |
| | | // return false; |
| | | // } |
| | | // |
| | | // //检测路径是否可行走 |
| | | // if (!checkPath(command.getNodes(), nextNodes, redisCommand)) { |
| | | // return false; |
| | | // } |
| | | // |
| | | // //锁定路径,锁定当前路径和下一步路径 |
| | | // List<NavigateNode> nodes = command.getNodes(); |
| | | // nodes.addAll(nextNodes); |
| | | // navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//所使用的路径进行锁定禁用 |
| | | |
| | | //检测穿梭车是否在提升机内 |
| | | if (!checkShuttleInTheLift(wrkNo)) { |
| | | return false; |
| | | } |
| | | |
| | | //检测路径是否可行走 |
| | | if (!checkPath(command.getNodes(), nextNodes, redisCommand)) { |
| | | return false; |
| | | } |
| | | |
| | | //锁定路径,锁定当前路径和下一步路径 |
| | | List<NavigateNode> nodes = command.getNodes(); |
| | | if (nextNodes != null) { |
| | | nodes.addAll(nextNodes); |
| | | } |
| | | navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//所使用的路径进行锁定禁用 |
| | | |
| | | //可执行命令 |
| | | if (!write(command)) { |
| | |
| | | null, |
| | | null, |
| | | JSON.toJSONString(command), |
| | | null |
| | | null, |
| | | JSON.toJSONString(shuttleProtocol) |
| | | ); |
| | | shuttleOptService.insert(opt); |
| | | } |
| | |
| | | }else { |
| | | //已执行完成 |
| | | |
| | | //删除redis |
| | | redisUtil.del("shuttle_wrk_no_" + redisCommand.getWrkNo()); |
| | | //最后一段命令为移动命令,则暂缓删除redis等待清除路径时一次性删除 |
| | | //最后一段命令为不是移动命令,则删除redis |
| | | if (!command.getRequest().getBody().get("requestType").equals("move")) { |
| | | //删除redis |
| | | redisUtil.del("shuttle_wrk_no_" + redisCommand.getWrkNo()); |
| | | } |
| | | |
| | | if (!assignCommand.getCharge()) { |
| | | //对主线程抛出等待确认状态waiting |
| | |
| | | if (basLift == null) { |
| | | continue; |
| | | } |
| | | if (basLift.getPoint().equals(shuttleProtocol.getPoint())) { |
| | | Integer liftX = basLift.getPoint$().getX(); |
| | | Integer liftY = basLift.getPoint$().getY(); |
| | | if (liftX.equals(shuttleProtocol.getPoint().getX()) && liftY.equals(shuttleProtocol.getPoint().getY())) { |
| | | //小车在提升机内 |
| | | //判断提升机是否空闲 |
| | | LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId()); |
| | |
| | | //提升机处于空闲,放行 |
| | | return true; |
| | | } |
| | | }else { |
| | | return true;//不在提升机内,放行 |
| | | } |
| | | } |
| | | return false;//默认不放行 |
| | |
| | | //检测路径是否可行走(检查路径锁定状态,检测路径是否有其他小车) |
| | | //检测当前行走路径,和下一步路径 |
| | | boolean checkPathIsAvailable = NavigateUtils.checkPathIsAvailable(currentNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | boolean checkPathIsAvailable2 = NavigateUtils.checkPathIsAvailable(nextNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | if (checkPathIsAvailable && checkPathIsAvailable2) { |
| | | return true;//可行走 |
| | | if (nextNodes == null) { |
| | | if (checkPathIsAvailable) { |
| | | return true;//可行走 |
| | | } |
| | | }else { |
| | | boolean checkPathIsAvailable2 = NavigateUtils.checkPathIsAvailable(nextNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | if (checkPathIsAvailable && checkPathIsAvailable2) { |
| | | return true;//可行走 |
| | | } |
| | | } |
| | | |
| | | ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand(); |