|  |  | 
 |  |  | import com.zy.asrs.framework.common.SpringUtils; | 
 |  |  | import com.zy.asrs.framework.exception.CoolException; | 
 |  |  | import com.zy.asrs.wcs.common.ExecuteSupport; | 
 |  |  | import com.zy.asrs.wcs.core.action.ShuttleAction; | 
 |  |  | import com.zy.asrs.wcs.core.domain.param.ShuttleMoveLocParam; | 
 |  |  | import com.zy.asrs.wcs.core.entity.BasShuttle; | 
 |  |  | import com.zy.asrs.wcs.core.entity.Loc; | 
 |  |  | 
 |  |  | import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant; | 
 |  |  | import com.zy.asrs.wcs.rcs.entity.Device; | 
 |  |  | import com.zy.asrs.wcs.rcs.entity.DeviceDataLog; | 
 |  |  | import com.zy.asrs.wcs.rcs.model.CommandResponse; | 
 |  |  | import com.zy.asrs.wcs.rcs.model.command.NyShuttleHttpCommand; | 
 |  |  | import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType; | 
 |  |  | import com.zy.asrs.wcs.rcs.model.enums.SlaveType; | 
 |  |  | 
 |  |  |  | 
 |  |  |     private List<JSONObject> socketResults = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |     //原始设备数据 | 
 |  |  |     private Object originDeviceData; | 
 |  |  |  | 
 |  |  |     public NyShuttleThread(Device device, RedisUtil redisUtil) { | 
 |  |  |         this.device = device; | 
 |  |  |         this.redisUtil = redisUtil; | 
 |  |  | 
 |  |  |         //监听消息并存储 | 
 |  |  |         Thread innerThread = new Thread(() -> { | 
 |  |  |             while (true) { | 
 |  |  |                 listenSocketMessage(); | 
 |  |  |                 try { | 
 |  |  |                     listenSocketMessage(); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     e.printStackTrace(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |         innerThread.start(); | 
 |  |  |  | 
 |  |  |         while (true) { | 
 |  |  |             try { | 
 |  |  |                 read(); | 
 |  |  |                 Thread.sleep(500); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("ShuttleThread Fail", e); | 
 |  |  |         //设备读取 | 
 |  |  |         Thread readThread = new Thread(() -> { | 
 |  |  |             while (true) { | 
 |  |  |                 try { | 
 |  |  |                     read(); | 
 |  |  |                     Thread.sleep(50); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     log.error("ShuttleThread Fail", e); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |         readThread.start(); | 
 |  |  |  | 
 |  |  |         //设备执行 | 
 |  |  |         Thread executeThread = new Thread(() -> { | 
 |  |  |             while (true) { | 
 |  |  |                 try { | 
 |  |  |                     ShuttleAction shuttleAction = SpringUtils.getBean(ShuttleAction.class); | 
 |  |  |                     if (shuttleAction == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_FLAG + device.getDeviceNo()); | 
 |  |  |                     if (object == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     Integer taskNo = Integer.valueOf(String.valueOf(object)); | 
 |  |  |                     if (taskNo != 0) { | 
 |  |  |                         //存在任务需要执行 | 
 |  |  |                         boolean result = shuttleAction.executeWork(device, taskNo); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     //小车空闲且有跑库程序 | 
 |  |  |                     shuttleAction.moveLoc(device); | 
 |  |  |  | 
 |  |  |                     Thread.sleep(200); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     e.printStackTrace(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |         executeThread.start(); | 
 |  |  |  | 
 |  |  |         //其他任务 | 
 |  |  |         Thread otherThread = new Thread(() -> { | 
 |  |  |             while (true) { | 
 |  |  |                 try { | 
 |  |  |                     listenInit();//监听初始化事件 | 
 |  |  |                     saveLog();//保存数据 | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     e.printStackTrace(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |         otherThread.start(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void saveLog() { | 
 |  |  |         if (shuttleProtocol == null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) { | 
 |  |  |             if (this.originDeviceData != null) { | 
 |  |  |                 //采集时间超过5s,保存一次数据记录 | 
 |  |  |                 //保存数据记录 | 
 |  |  |                 DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class); | 
 |  |  |                 DeviceDataLog deviceDataLog = new DeviceDataLog(); | 
 |  |  |                 deviceDataLog.setOriginData(JSON.toJSONString(this.originDeviceData)); | 
 |  |  |                 deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol)); | 
 |  |  |                 deviceDataLog.setType(String.valueOf(SlaveType.Shuttle)); | 
 |  |  |                 deviceDataLog.setDeviceNo(String.valueOf(shuttleProtocol.getShuttleNo())); | 
 |  |  |                 deviceDataLog.setCreateTime(new Date()); | 
 |  |  |                 deviceDataLog.setHostId(device.getHostId()); | 
 |  |  |                 deviceDataLogService.save(deviceDataLog); | 
 |  |  |  | 
 |  |  |                 //更新采集时间 | 
 |  |  |                 shuttleProtocol.setDeviceDataLog(System.currentTimeMillis()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //将四向穿梭车状态保存至数据库 | 
 |  |  |         BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class); | 
 |  |  |         BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>() | 
 |  |  |                 .eq(BasShuttle::getShuttleNo, device.getDeviceNo()) | 
 |  |  |                 .eq(BasShuttle::getHostId, device.getHostId())); | 
 |  |  |  | 
 |  |  |         if (basShuttle == null) { | 
 |  |  |             basShuttle = new BasShuttle(); | 
 |  |  |             //四向穿梭车号 | 
 |  |  |             basShuttle.setShuttleNo(Integer.valueOf(device.getDeviceNo())); | 
 |  |  |             basShuttle.setStatus(1); | 
 |  |  |             basShuttle.setDeleted(0); | 
 |  |  |             basShuttle.setHostId(device.getHostId()); | 
 |  |  |             basShuttle.setDeviceId(device.getId().intValue()); | 
 |  |  |             shuttleService.save(basShuttle); | 
 |  |  |         }else { | 
 |  |  |             Integer shuttleId = basShuttle.getId(); | 
 |  |  |             basShuttle = new BasShuttle(); | 
 |  |  |             basShuttle.setId(shuttleId); | 
 |  |  |         } | 
 |  |  |         //任务号 | 
 |  |  |         basShuttle.setTaskNo(shuttleProtocol.getTaskNo().intValue()); | 
 |  |  |         //修改时间 | 
 |  |  |         basShuttle.setUpdateTime(new Date()); | 
 |  |  |         //设备状态 | 
 |  |  |         basShuttle.setProtocol(JSON.toJSONString(shuttleProtocol)); | 
 |  |  |         if (shuttleService.updateById(basShuttle)) { | 
 |  |  |             OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), device.getDeviceNo())); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public JSONObject getRequestBody(String type) { | 
 |  |  |     public JSONObject getRequestBody(String type, String taskId) { | 
 |  |  |         try { | 
 |  |  |             // 获取服务器响应 | 
 |  |  |             JSONObject result = null; | 
 |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (!responseType.equals(type)) { | 
 |  |  |                     continue;//响应ID与请求ID不一致,不在调试模式下 | 
 |  |  |                     continue;//响应类型与请求类型不一致,不在调试模式下 | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (taskId != null) { | 
 |  |  |                     String responseTaskId = resultBody.get("taskId").toString(); | 
 |  |  |                     if (!responseTaskId.equals(taskId)) { | 
 |  |  |                         continue;//响应ID与请求ID不一致,不在调试模式下 | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 result = socketResult; | 
 |  |  | 
 |  |  |                 this.connect(); | 
 |  |  |             } | 
 |  |  |             readStatus(); | 
 |  |  |             listenInit();//监听初始化事件 | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】读取四向穿梭车状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort())); | 
 |  |  | 
 |  |  |                 shuttleProtocol.setErrorCode(data.getJSONArray("errCode").getString(0)); | 
 |  |  |  | 
 |  |  |                 //是否顶升 | 
 |  |  |                 shuttleProtocol.setHasLift(data.getInteger("liftPosition") == 1 ? true : false); | 
 |  |  |                 shuttleProtocol.setHasLift(data.getInteger("liftPosition") == 2 ? true : false); | 
 |  |  |                 //是否有托盘 | 
 |  |  |                 shuttleProtocol.setHasPallet(data.getInteger("loadState") == 1 ? true : false); | 
 |  |  |                 //行驶方向 | 
 |  |  |                 shuttleProtocol.setRunDirection(data.getString("runDir") == null ? "none" : data.getString("direction")); | 
 |  |  |                 shuttleProtocol.setRunDirection(data.getString("runDir") == null ? "none" : data.getString("runDir")); | 
 |  |  |                 //是否为充电状态 | 
 |  |  |                 shuttleProtocol.setHasCharge(data.getInteger("chargState") == 1 ? true : false); | 
 |  |  |  | 
 |  |  | 
 |  |  |                     shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) { | 
 |  |  |                     //采集时间超过5s,保存一次数据记录 | 
 |  |  |                     //保存数据记录 | 
 |  |  |                     DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class); | 
 |  |  |                     DeviceDataLog deviceDataLog = new DeviceDataLog(); | 
 |  |  |                     deviceDataLog.setOriginData(JSON.toJSONString(data)); | 
 |  |  |                     deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol)); | 
 |  |  |                     deviceDataLog.setType(String.valueOf(SlaveType.Shuttle)); | 
 |  |  |                     deviceDataLog.setDeviceNo(String.valueOf(shuttleProtocol.getShuttleNo())); | 
 |  |  |                     deviceDataLog.setCreateTime(new Date()); | 
 |  |  |                     deviceDataLog.setHostId(device.getHostId()); | 
 |  |  |                     deviceDataLogService.save(deviceDataLog); | 
 |  |  |                 this.originDeviceData = data; | 
 |  |  |  | 
 |  |  |                     //更新采集时间 | 
 |  |  |                     shuttleProtocol.setDeviceDataLog(System.currentTimeMillis()); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //将四向穿梭车状态保存至数据库 | 
 |  |  |                 BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class); | 
 |  |  |                 BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>() | 
 |  |  |                         .eq(BasShuttle::getShuttleNo, device.getDeviceNo()) | 
 |  |  |                         .eq(BasShuttle::getHostId, device.getHostId())); | 
 |  |  |                 if (basShuttle == null) { | 
 |  |  |                     basShuttle = new BasShuttle(); | 
 |  |  |                     //四向穿梭车号 | 
 |  |  |                     basShuttle.setShuttleNo(Integer.valueOf(device.getDeviceNo())); | 
 |  |  |                     basShuttle.setStatus(1); | 
 |  |  |                     basShuttle.setDeleted(0); | 
 |  |  |                     basShuttle.setHostId(device.getHostId()); | 
 |  |  |                     basShuttle.setDeviceId(device.getId().intValue()); | 
 |  |  |                     shuttleService.save(basShuttle); | 
 |  |  |                 } | 
 |  |  |                 //任务号 | 
 |  |  |                 basShuttle.setTaskNo(shuttleProtocol.getTaskNo().intValue()); | 
 |  |  |                 //修改时间 | 
 |  |  |                 basShuttle.setUpdateTime(new Date()); | 
 |  |  |                 //设备状态 | 
 |  |  |                 basShuttle.setProtocol(JSON.toJSONString(shuttleProtocol)); | 
 |  |  |                 if (shuttleService.updateById(basShuttle)) { | 
 |  |  |                     OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), device.getDeviceNo())); | 
 |  |  |                 } | 
 |  |  |                 OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), device.getDeviceNo())); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  | 
 |  |  |                 Integer requestId = resultHeader.getInteger("requestId"); | 
 |  |  |                 if (requestType.equals("init")) { | 
 |  |  |                     Integer code = resultBody.getInteger("code"); | 
 |  |  |                     OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", code, device.getId(), device.getIp(), device.getPort())); | 
 |  |  |                     //小车复位请求 | 
 |  |  |                     ShuttleCommand initCommand = getInitCommand(requestId, code); | 
 |  |  |                     //发出请求 | 
 |  |  | 
 |  |  |                     JSONObject requestResult = requestCommand(httpCommand); | 
 |  |  |  | 
 |  |  |                     removeIdx = i;//此数据已经处理,从结果集中剔除 | 
 |  |  |  | 
 |  |  |                     log.info(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", device.getId(), code, device.getIp(), device.getPort())); | 
 |  |  |                     OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", device.getId(), code, device.getIp(), device.getPort())); | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean movePath(List<NavigateNode> nodes, Integer taskNo) { | 
 |  |  |         return true; | 
 |  |  |     public CommandResponse movePath(List<NavigateNode> nodes, Integer taskNo) { | 
 |  |  |         CommandResponse response = new CommandResponse(true); | 
 |  |  |         return response; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean move(ShuttleCommand command) { | 
 |  |  |     public CommandResponse move(ShuttleCommand command) { | 
 |  |  |         CommandResponse response = new CommandResponse(false); | 
 |  |  |         try { | 
 |  |  |             //发出请求 | 
 |  |  |             NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); | 
 |  |  |             Map<String, Object> body = httpCommand.getRequest().getBody(); | 
 |  |  |             Object pathObj = body.get("path"); | 
 |  |  |             int taskId = Integer.parseInt(body.get("taskId").toString()); | 
 |  |  |             List<JSONObject> path = JSON.parseArray(JSON.toJSONString(pathObj), JSONObject.class); | 
 |  |  |             ArrayList<NyShuttleHttpCommand> commandList = new ArrayList<>(); | 
 |  |  |             while (!path.isEmpty()) { | 
 |  |  | 
 |  |  |                 if (path.size() > 10) { | 
 |  |  |                     List<JSONObject> subList = path.subList(0, 10); | 
 |  |  |                     list.addAll(subList); | 
 |  |  |                     subList.clear(); | 
 |  |  |  | 
 |  |  |                     List<JSONObject> tmp = new ArrayList<>(); | 
 |  |  |                     for (int i = 10; i < path.size(); i++) { | 
 |  |  |                         tmp.add(path.get(i)); | 
 |  |  |                     } | 
 |  |  |                     path = tmp; | 
 |  |  |                 }else  { | 
 |  |  |                     list.addAll(path); | 
 |  |  |                     path.clear(); | 
 |  |  | 
 |  |  |  | 
 |  |  |                 NyShuttleHttpCommand.NyRequest request = httpCommandCopy.getRequest(); | 
 |  |  |                 bodyCopy.put("path", list); | 
 |  |  |                 bodyCopy.put("taskId", taskId++); | 
 |  |  |                 request.setBody(bodyCopy); | 
 |  |  |                 httpCommandCopy.setRequest(request); | 
 |  |  |  | 
 |  |  | 
 |  |  |             for (NyShuttleHttpCommand requestCommand : commandList) { | 
 |  |  |                 JSONObject result = requestCommand(requestCommand); | 
 |  |  |                 if (result == null) { | 
 |  |  |                     return false;//请求失败 | 
 |  |  |                     return response;//请求失败 | 
 |  |  |                 } | 
 |  |  |                 this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间 | 
 |  |  |                 response.setMessage(JSON.toJSONString(result)); | 
 |  |  |                 response.setResult(true); | 
 |  |  |             } | 
 |  |  |             return true; | 
 |  |  |         } catch (IOException e) { | 
 |  |  |             return false; | 
 |  |  |             return response; | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             response.setMessage(e.getMessage()); | 
 |  |  |             return response; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean lift(ShuttleCommand command) { | 
 |  |  |     public CommandResponse lift(ShuttleCommand command) { | 
 |  |  |         CommandResponse response = new CommandResponse(false); | 
 |  |  |         try { | 
 |  |  |             //发出请求 | 
 |  |  |             NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); | 
 |  |  |             JSONObject result = requestCommand(httpCommand); | 
 |  |  |             if (result == null) { | 
 |  |  |                 return false;//请求失败 | 
 |  |  |                 return response;//请求失败 | 
 |  |  |             } | 
 |  |  |             this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间 | 
 |  |  |             return true; | 
 |  |  |         } catch (IOException e) { | 
 |  |  |             return false; | 
 |  |  |             response.setMessage(JSON.toJSONString(result)); | 
 |  |  |             response.setResult(true); | 
 |  |  |             return response; | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             return response; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean charge(ShuttleCommand command) { | 
 |  |  |     public CommandResponse charge(ShuttleCommand command) { | 
 |  |  |         CommandResponse response = new CommandResponse(false); | 
 |  |  |         try { | 
 |  |  |             //发出请求 | 
 |  |  |             NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); | 
 |  |  |             JSONObject result = requestCommand(httpCommand); | 
 |  |  |             if (result == null) { | 
 |  |  |                 return false;//请求失败 | 
 |  |  |                 return response;//请求失败 | 
 |  |  |             } | 
 |  |  |             this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间 | 
 |  |  |             return true; | 
 |  |  |         } catch (IOException e) { | 
 |  |  |             return false; | 
 |  |  |             response.setMessage(JSON.toJSONString(result)); | 
 |  |  |             response.setResult(true); | 
 |  |  |             return response; | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             return response; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean reset(ShuttleCommand command) { | 
 |  |  |     public CommandResponse reset(ShuttleCommand command) { | 
 |  |  |         setSyncTaskNo(0); | 
 |  |  |         setProtocolStatus(ShuttleProtocolStatusType.IDLE); | 
 |  |  |         enableMoveLoc(null, false); | 
 |  |  |         return true; | 
 |  |  |         return new CommandResponse(true, JSON.toJSONString(command)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean updateLocation(ShuttleCommand param) { | 
 |  |  |         return true;//还没移植过来 | 
 |  |  |     public CommandResponse updateLocation(ShuttleCommand command) { | 
 |  |  |         CommandResponse response = new CommandResponse(false); | 
 |  |  |         try { | 
 |  |  |             //发出请求 | 
 |  |  |             NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); | 
 |  |  |             JSONObject result = requestCommand(httpCommand); | 
 |  |  |             if (result == null) { | 
 |  |  |                 return response;//请求失败 | 
 |  |  |             } | 
 |  |  |             this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间 | 
 |  |  |             response.setMessage(JSON.toJSONString(result)); | 
 |  |  |             response.setResult(true); | 
 |  |  |             return response; | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             return response; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | 
 |  |  |                 if (shuttleService == null) { | 
 |  |  |                     return false; | 
 |  |  |                 } | 
 |  |  |                 BasShuttle basShuttle = shuttleService.getById(this.device.getDeviceNo()); | 
 |  |  |                 BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>().eq(BasShuttle::getDeviceId, this.device.getId())); | 
 |  |  |                 if (basShuttle == null) { | 
 |  |  |                     return false; | 
 |  |  |                 } | 
 |  |  | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (this.shuttleProtocol.getDeviceStatus() == 1 && this.shuttleProtocol.getHasCharge()) { | 
 |  |  |         if (this.shuttleProtocol.getDeviceStatus() == 0 && this.shuttleProtocol.getHasCharge()) { | 
 |  |  |             //运行中 && 充电中 | 
 |  |  |             return true; | 
 |  |  |         } | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean requestWaiting() { | 
 |  |  |         if (this.shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.IDLE)) { | 
 |  |  |             this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING); | 
 |  |  |             return true; | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes) { | 
 |  |  |         NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); | 
 |  |  |         NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); | 
 |  |  | 
 |  |  |  | 
 |  |  |         ArrayList<HashMap<String, Object>> path = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |         Integer taskId = getTaskId(); | 
 |  |  |         HashMap<String, Object> body = new HashMap<>(); | 
 |  |  |         body.put("requestType", "move");//移动命令 | 
 |  |  |         body.put("taskId", getTaskId());//TaskID需要随机 | 
 |  |  |         body.put("taskId", taskId);//TaskID需要随机 | 
 |  |  | //        body.put("start", navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(startCodeNum, device.getHostId())));//起点 | 
 |  |  | //        body.put("target", navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(distCodeNum, device.getHostId())));//终点 | 
 |  |  |         body.put("path", path); | 
 |  |  | 
 |  |  |         command.setBody(JSON.toJSONString(httpStandard)); | 
 |  |  |         command.setMode(ShuttleCommandModeType.MOVE.id); | 
 |  |  |         command.setTargetLocNo(loc.getLocNo()); | 
 |  |  |         command.setTaskNo(taskId); | 
 |  |  |         return command; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); | 
 |  |  |         NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
 |  |  |  | 
 |  |  |         Integer taskId = getTaskId();//TaskID需要随机 | 
 |  |  |         HashMap<String, Object> body = new HashMap<>(); | 
 |  |  |         body.put("requestType", lift ? "liftUp" : "liftDown");//顶升或下降命令 | 
 |  |  |         body.put("taskId", getTaskId());//TaskID需要随机 | 
 |  |  |         body.put("taskId", taskId); | 
 |  |  |         request.setBody(body); | 
 |  |  |  | 
 |  |  |         httpStandard.setRequest(request); | 
 |  |  | 
 |  |  |         command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); | 
 |  |  |         command.setBody(JSON.toJSONString(httpStandard)); | 
 |  |  |         command.setMode(lift ? ShuttleCommandModeType.PALLET_LIFT.id : ShuttleCommandModeType.PALLET_DOWN.id); | 
 |  |  |         command.setTaskNo(taskId); | 
 |  |  |         return command; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); | 
 |  |  |         NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
 |  |  |  | 
 |  |  |         Integer taskId = getTaskId();//TaskID需要随机 | 
 |  |  |         HashMap<String, Object> body = new HashMap<>(); | 
 |  |  |         body.put("requestType", charge ? "charge" : "stopCharge");//充电或停止充电 | 
 |  |  |         body.put("taskId", getTaskId());//TaskID需要随机 | 
 |  |  |         body.put("taskId", taskId); | 
 |  |  |         request.setBody(body); | 
 |  |  |  | 
 |  |  |         httpStandard.setRequest(request); | 
 |  |  | 
 |  |  |         command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); | 
 |  |  |         command.setBody(JSON.toJSONString(httpStandard)); | 
 |  |  |         command.setMode(charge ? ShuttleCommandModeType.CHARGE_OPEN.id : ShuttleCommandModeType.CHARGE_CLOSE.id); | 
 |  |  |         command.setTaskNo(taskId); | 
 |  |  |         return command; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public ShuttleCommand getUpdateLocationCommand(Integer taskNo, String locNo) { | 
 |  |  |         return null;//还没移植过来 | 
 |  |  |         NyShuttleHttpCommand httpStandard = getHttpStandard(Integer.parseInt(device.getDeviceNo()), taskNo); | 
 |  |  |         NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
 |  |  |  | 
 |  |  |         HashMap<String, Object> body = new HashMap<>(); | 
 |  |  |         body.put("requestType", "updateFloor");//更新层Z | 
 |  |  |         body.put("z", Utils.getLev(locNo));//坐标Z | 
 |  |  |         request.setBody(body); | 
 |  |  |  | 
 |  |  |         httpStandard.setRequest(request); | 
 |  |  |  | 
 |  |  |         ShuttleCommand command = new ShuttleCommand(); | 
 |  |  |         command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); | 
 |  |  |         command.setBody(JSON.toJSONString(httpStandard)); | 
 |  |  |         command.setMode(ShuttleCommandModeType.UPDATE_LOCATION.id); | 
 |  |  |         command.setTaskNo(taskNo); | 
 |  |  |         return command; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //获取小车复位响应命令 | 
 |  |  | 
 |  |  |         command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo())); | 
 |  |  |         command.setBody(JSON.toJSONString(httpStandard)); | 
 |  |  |         command.setMode(ShuttleCommandModeType.RESET.id); | 
 |  |  |         command.setTaskNo(taskNo); | 
 |  |  |         return command; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  | //            System.out.println("Sent message to server: " + JSON.toJSONString(httpCommand)); | 
 |  |  |  | 
 |  |  |         String requestType = null; | 
 |  |  |         String taskId = null; | 
 |  |  |         try { | 
 |  |  |             requestType = httpCommand.getRequest().getBody().get("requestType").toString(); | 
 |  |  |             taskId = httpCommand.getRequest().getBody().get("taskId").toString(); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             return null; | 
 |  |  | //            return null; | 
 |  |  |             //taskId可能取空,不报错,正常情况 | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 获取服务器响应 | 
 |  |  |         // 尝试10次 | 
 |  |  |         JSONObject result = null; | 
 |  |  |         for (int i = 0; i < 10; i++) { | 
 |  |  |             result = getRequestBody(requestType); | 
 |  |  |             result = getRequestBody(requestType, taskId); | 
 |  |  |             if (result == null) { | 
 |  |  |                 try { | 
 |  |  |                     Thread.sleep(100); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     e.printStackTrace(); | 
 |  |  |                 } | 
 |  |  |             }else { | 
 |  |  |                 break; | 
 |  |  |             } | 
 |  |  |             break; | 
 |  |  |         } | 
 |  |  |         return result;//返回Body结果集 | 
 |  |  |     } |