|  |  |  | 
|---|
|  |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
|---|
|  |  |  | import com.core.common.DateUtils; | 
|---|
|  |  |  | import com.core.common.SpringUtils; | 
|---|
|  |  |  | import com.core.exception.CoolException; | 
|---|
|  |  |  | import com.fasterxml.jackson.databind.ObjectMapper; | 
|---|
|  |  |  | import com.zy.asrs.entity.BasShuttle; | 
|---|
|  |  |  | import com.zy.asrs.entity.DeviceDataLog; | 
|---|
|  |  |  | import com.zy.asrs.entity.DeviceConfig; | 
|---|
|  |  |  | import com.zy.asrs.entity.LocMast; | 
|---|
|  |  |  | import com.zy.asrs.service.BasShuttleService; | 
|---|
|  |  |  | import com.zy.asrs.service.DeviceDataLogService; | 
|---|
|  |  |  | import com.zy.asrs.service.LocMastService; | 
|---|
|  |  |  | import com.zy.asrs.utils.Utils; | 
|---|
|  |  |  | import com.zy.common.ExecuteSupport; | 
|---|
|  |  |  | 
|---|
|  |  |  | import com.zy.common.utils.NavigateMapData; | 
|---|
|  |  |  | import com.zy.common.utils.NavigatePositionConvert; | 
|---|
|  |  |  | import com.zy.common.utils.RedisUtil; | 
|---|
|  |  |  | import com.zy.common.utils.ShuttleOperaUtils; | 
|---|
|  |  |  | import com.zy.core.News; | 
|---|
|  |  |  | import com.zy.core.action.ShuttleAction; | 
|---|
|  |  |  | import com.zy.core.model.DeviceCommandMsgModel; | 
|---|
|  |  |  | import com.zy.core.model.command.ShuttleAssignCommand; | 
|---|
|  |  |  | import com.zy.core.utils.DeviceMsgUtils; | 
|---|
|  |  |  | import com.zy.core.cache.OutputQueue; | 
|---|
|  |  |  | import com.zy.core.enums.*; | 
|---|
|  |  |  | import com.zy.core.model.CommandResponse; | 
|---|
|  |  |  | import com.zy.core.model.ShuttleSlave; | 
|---|
|  |  |  | import com.zy.core.model.DeviceMsgModel; | 
|---|
|  |  |  | import com.zy.core.model.command.NyShuttleHttpCommand; | 
|---|
|  |  |  | import com.zy.core.model.command.ShuttleCommand; | 
|---|
|  |  |  | import com.zy.core.model.command.ShuttleRedisCommand; | 
|---|
|  |  |  | 
|---|
|  |  |  | import lombok.Data; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.io.BufferedReader; | 
|---|
|  |  |  | import java.io.IOException; | 
|---|
|  |  |  | import java.io.InputStreamReader; | 
|---|
|  |  |  | import java.io.OutputStreamWriter; | 
|---|
|  |  |  | import java.net.Socket; | 
|---|
|  |  |  | import java.text.MessageFormat; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | @SuppressWarnings("all") | 
|---|
|  |  |  | public class NyShuttleThread implements ShuttleThread { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private ShuttleSlave slave; | 
|---|
|  |  |  | private DeviceConfig deviceConfig; | 
|---|
|  |  |  | private RedisUtil redisUtil; | 
|---|
|  |  |  | private ShuttleProtocol shuttleProtocol; | 
|---|
|  |  |  | private Socket socket; | 
|---|
|  |  |  | private ShuttleAction shuttleAction = null; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private static final boolean DEBUG = false;//调试模式 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private List<JSONObject> socketReadResults = new ArrayList<>(); | 
|---|
|  |  |  | private List<JSONObject> socketResults = new ArrayList<>(); | 
|---|
|  |  |  | private List<DeviceMsgModel> socketResults = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Long requestReadTime = System.currentTimeMillis(); | 
|---|
|  |  |  | //原始设备数据 | 
|---|
|  |  |  | private Object originDeviceData; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public NyShuttleThread(ShuttleSlave slave, RedisUtil redisUtil) { | 
|---|
|  |  |  | this.slave = slave; | 
|---|
|  |  |  | public NyShuttleThread(DeviceConfig deviceConfig, RedisUtil redisUtil) { | 
|---|
|  |  |  | this.deviceConfig = deviceConfig; | 
|---|
|  |  |  | this.redisUtil = redisUtil; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void run() { | 
|---|
|  |  |  | News.info("{}号四向车线程启动", slave.getId()); | 
|---|
|  |  |  | this.connect(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //监听消息并存储 | 
|---|
|  |  |  | Thread innerThread = new Thread(() -> { | 
|---|
|  |  |  | while (true) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | listenSocketMessage(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | innerThread.start(); | 
|---|
|  |  |  | News.info("{}号四向车线程启动", deviceConfig.getDeviceNo()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //设备读取 | 
|---|
|  |  |  | Thread readThread = new Thread(() -> { | 
|---|
|  |  |  | while (true) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | read(); | 
|---|
|  |  |  | Thread.sleep(50); | 
|---|
|  |  |  | listenMessageFromRedis(); | 
|---|
|  |  |  | listenInit();//监听初始化事件 | 
|---|
|  |  |  | readStatus(); | 
|---|
|  |  |  | Thread.sleep(100); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //                    //小车空闲且有跑库程序 | 
|---|
|  |  |  | //                    shuttleAction.moveLoc(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | } 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(RedisKeyType.SHUTTLE_FLAG.key + slave.getId()); | 
|---|
|  |  |  | if (object == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer taskNo = Integer.valueOf(String.valueOf(object)); | 
|---|
|  |  |  | if (taskNo != 0) { | 
|---|
|  |  |  | //存在任务需要执行 | 
|---|
|  |  |  | boolean result = shuttleAction.executeWork(slave.getId(), taskNo); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //                    //小车空闲且有跑库程序 | 
|---|
|  |  |  | //                    shuttleAction.moveLoc(slave.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //演示模式 | 
|---|
|  |  |  | shuttleAction.demo(slave.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | //        //设备执行 | 
|---|
|  |  |  | //        Thread executeThread = new Thread(() -> { | 
|---|
|  |  |  | //            while (true) { | 
|---|
|  |  |  | //                try { | 
|---|
|  |  |  | //                    if (shuttleAction == null) { | 
|---|
|  |  |  | //                        try { | 
|---|
|  |  |  | //                            shuttleAction = SpringUtils.getBean(ShuttleAction.class); | 
|---|
|  |  |  | //                        }catch (Exception e){ | 
|---|
|  |  |  | //                        } | 
|---|
|  |  |  | //                        continue; | 
|---|
|  |  |  | //                    } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //                    Object object = redisUtil.get(RedisKeyType.SHUTTLE_FLAG.key + deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | //                    if (object == null) { | 
|---|
|  |  |  | //                        continue; | 
|---|
|  |  |  | //                    } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //                    Integer taskNo = Integer.valueOf(String.valueOf(object)); | 
|---|
|  |  |  | //                    if (taskNo != 0) { | 
|---|
|  |  |  | //                        //存在任务需要执行 | 
|---|
|  |  |  | //                        boolean result = shuttleAction.executeWork(deviceConfig.getDeviceNo(), taskNo); | 
|---|
|  |  |  | //                    } | 
|---|
|  |  |  | //                    Thread.sleep(100); | 
|---|
|  |  |  | //                } catch (Exception e) { | 
|---|
|  |  |  | //                    e.printStackTrace(); | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //        }); | 
|---|
|  |  |  | //        executeThread.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); | 
|---|
|  |  |  | if (deviceDataLogService == null) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | DeviceDataLog deviceDataLog = new DeviceDataLog(); | 
|---|
|  |  |  | deviceDataLog.setOriginData(JSON.toJSONString(this.originDeviceData)); | 
|---|
|  |  |  | deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol)); | 
|---|
|  |  |  | deviceDataLog.setType(String.valueOf(SlaveType.Shuttle)); | 
|---|
|  |  |  | deviceDataLog.setDeviceNo(slave.getId()); | 
|---|
|  |  |  | deviceDataLog.setCreateTime(new Date()); | 
|---|
|  |  |  | deviceDataLogService.insert(deviceDataLog); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //更新采集时间 | 
|---|
|  |  |  | shuttleProtocol.setDeviceDataLog(System.currentTimeMillis()); | 
|---|
|  |  |  | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void listenSocketMessage() { | 
|---|
|  |  |  | private void listenMessageFromRedis() { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | if (this.socket == null) { | 
|---|
|  |  |  | DeviceMsgUtils deviceMsgUtils = null; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (deviceMsgUtils == null) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | DeviceMsgModel deviceMsg = deviceMsgUtils.getDeviceMsg(SlaveType.Shuttle, deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | if(deviceMsg == null){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取输入流 | 
|---|
|  |  |  | BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); | 
|---|
|  |  |  | // 读取服务器的响应 | 
|---|
|  |  |  | StringBuffer sb = new StringBuffer(); | 
|---|
|  |  |  | char[] chars = new char[2048];//缓冲区 | 
|---|
|  |  |  | while (true) { | 
|---|
|  |  |  | reader.read(chars); | 
|---|
|  |  |  | String trim = new String(chars); | 
|---|
|  |  |  | sb.append(trim); | 
|---|
|  |  |  | if (trim.lastIndexOf("\r\n") != -1) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | JSONObject data = JSON.parseObject(JSON.toJSONString(deviceMsg.getDeviceMsg())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONObject result = JSON.parseObject(sb.toString());//得到响应结果集 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String msgType = result.getString("msgType"); | 
|---|
|  |  |  | if ("responseMsg".equals(msgType)) { | 
|---|
|  |  |  | JSONObject response = result.getJSONObject("response"); | 
|---|
|  |  |  | JSONObject body = response.getJSONObject("body"); | 
|---|
|  |  |  | if (body.containsKey("workingMode")) { | 
|---|
|  |  |  | //read | 
|---|
|  |  |  | socketReadResults.add(body); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (deviceMsg.getDeviceMsgType().equals("status")) { | 
|---|
|  |  |  | data.put("originDeviceData", deviceMsg.getDeviceOriginMsg()); | 
|---|
|  |  |  | socketReadResults.add(data); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | socketResults.add(deviceMsg);//添加数据 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!socketResults.isEmpty() && socketResults.size() >= 20) { | 
|---|
|  |  |  | socketResults.remove(0);//清理头节点 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | socketResults.add(result);//添加数据 | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | //            e.printStackTrace(); | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public JSONObject getRequestBody(String type, String taskId) { | 
|---|
|  |  |  | public JSONObject getRequestBody(String resultKey) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | // 获取服务器响应 | 
|---|
|  |  |  | JSONObject result = null; | 
|---|
|  |  |  | if (type.equals("readState")) { | 
|---|
|  |  |  | type = "state"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int idx = -1; | 
|---|
|  |  |  | for (int i = 0; i < socketResults.size(); i++) { | 
|---|
|  |  |  | JSONObject socketResult = socketResults.get(i); | 
|---|
|  |  |  | if (!socketResult.get("msgType").equals("responseMsg")) {//不是响应内容 | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONObject resultResponse = JSON.parseObject(socketResult.get("response").toString()); | 
|---|
|  |  |  | JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString()); | 
|---|
|  |  |  | String responseType = resultBody.get("responseType").toString(); | 
|---|
|  |  |  | if (DEBUG) { | 
|---|
|  |  |  | result = socketResult; | 
|---|
|  |  |  | DeviceMsgModel deviceMsgModel = socketResults.get(i); | 
|---|
|  |  |  | if(deviceMsgModel.getResultKey().equals(resultKey)){ | 
|---|
|  |  |  | idx = i; | 
|---|
|  |  |  | result = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg())); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!responseType.equals(type)) { | 
|---|
|  |  |  | continue;//响应类型与请求类型不一致,不在调试模式下 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (taskId != null) { | 
|---|
|  |  |  | String responseTaskId = resultBody.get("taskId").toString(); | 
|---|
|  |  |  | if (!responseTaskId.equals(taskId)) { | 
|---|
|  |  |  | continue;//响应ID与请求ID不一致,不在调试模式下 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | result = socketResult; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | return null;//无响应结果 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | socketResults.remove(idx); | 
|---|
|  |  |  | return filterBodyData(result);//返回Body结果集 | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void read() { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | if (this.socket == null || this.socket.isClosed()) { | 
|---|
|  |  |  | //链接断开重新链接 | 
|---|
|  |  |  | this.connect(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | readStatus(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】读取四向穿梭车状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | if (null == shuttleProtocol) { | 
|---|
|  |  |  | shuttleProtocol = new ShuttleProtocol(); | 
|---|
|  |  |  | shuttleProtocol.setShuttleNo(slave.getId()); | 
|---|
|  |  |  | shuttleProtocol.setShuttleNo(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | InnerSuhttleExtend extend = new InnerSuhttleExtend(); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //----------读取四向穿梭车状态----------- | 
|---|
|  |  |  | NyShuttleHttpCommand readStatusCommand = getReadStatusCommand(slave.getId()); | 
|---|
|  |  |  | requestCommandAsync(readStatusCommand);//请求状态 | 
|---|
|  |  |  | DeviceMsgUtils deviceMsgUtils = null; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(deviceMsgUtils == null){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | NyShuttleHttpCommand readStatusCommand = getReadStatusCommand(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | //指令超过2条,不再下发任务状态请求 | 
|---|
|  |  |  | TreeSet<String> deviceCommandMsgListKey = deviceMsgUtils.getDeviceCommandMsgListKey(SlaveType.Shuttle, deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | if (deviceCommandMsgListKey.size() < 2) { | 
|---|
|  |  |  | if ((System.currentTimeMillis() - requestReadTime) > 500) { | 
|---|
|  |  |  | requestCommand(readStatusCommand);//请求状态 | 
|---|
|  |  |  | requestReadTime = System.currentTimeMillis(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (this.socketReadResults.isEmpty()) { | 
|---|
|  |  |  | if (System.currentTimeMillis() - shuttleProtocol.getLastOnlineTime() > 1000 * 60) { | 
|---|
|  |  |  | //最后一次上线时间超过60s,认定离线 | 
|---|
|  |  |  | this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONObject data = this.socketReadResults.get(0); | 
|---|
|  |  |  | this.socketReadResults.remove(0); | 
|---|
|  |  |  | if (data == null) { | 
|---|
|  |  |  | if (System.currentTimeMillis() - shuttleProtocol.getLastOnlineTime() > 1000 * 60) { | 
|---|
|  |  |  | //最后一次上线时间超过60s,认定离线 | 
|---|
|  |  |  | 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 { | 
|---|
|  |  |  | //----------读取四向穿梭车状态----------- | 
|---|
|  |  |  | //小车设备状态 | 
|---|
|  |  |  | shuttleProtocol.setDeviceStatus(data.getInteger("deviceStatus")); | 
|---|
|  |  |  | //小车模式 | 
|---|
|  |  |  | shuttleProtocol.setMode(data.getInteger("mode")); | 
|---|
|  |  |  | //当前二维码 | 
|---|
|  |  |  | shuttleProtocol.setCurrentCode(data.getString("currentCode")); | 
|---|
|  |  |  | //电池电量 | 
|---|
|  |  |  | shuttleProtocol.setBatteryPower(data.getString("batteryPower")); | 
|---|
|  |  |  | //电池电压 | 
|---|
|  |  |  | shuttleProtocol.setBatteryVoltage(data.getInteger("batteryVoltage")); | 
|---|
|  |  |  | //故障 | 
|---|
|  |  |  | shuttleProtocol.setErrorCode(data.getString("errorCode")); | 
|---|
|  |  |  | //是否顶升 | 
|---|
|  |  |  | shuttleProtocol.setHasLift(data.getBoolean("hasLift")); | 
|---|
|  |  |  | //是否有托盘 | 
|---|
|  |  |  | shuttleProtocol.setHasPallet(data.getBoolean("hasPallet")); | 
|---|
|  |  |  | //行驶方向 | 
|---|
|  |  |  | shuttleProtocol.setRunDirection(data.getString("runDirection")); | 
|---|
|  |  |  | //是否为充电状态 | 
|---|
|  |  |  | shuttleProtocol.setHasCharge(data.getBoolean("hasCharge")); | 
|---|
|  |  |  | //运行速度 | 
|---|
|  |  |  | shuttleProtocol.setSpeed(data.getInteger("speed")); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //----------读取四向穿梭车状态----------- | 
|---|
|  |  |  | //小车设备状态 | 
|---|
|  |  |  | shuttleProtocol.setDeviceStatus(data.getInteger("free")); | 
|---|
|  |  |  | //小车模式 | 
|---|
|  |  |  | shuttleProtocol.setMode(data.getInteger("workingMode")); | 
|---|
|  |  |  | //当前二维码 | 
|---|
|  |  |  | shuttleProtocol.setCurrentCode(data.getString("point")); | 
|---|
|  |  |  | //电池电量 | 
|---|
|  |  |  | shuttleProtocol.setBatteryPower(data.getString("powerPercent")); | 
|---|
|  |  |  | //电池电压 | 
|---|
|  |  |  | shuttleProtocol.setBatteryVoltage(data.getInteger("voltage")); | 
|---|
|  |  |  | //故障 | 
|---|
|  |  |  | shuttleProtocol.setErrorCode(data.getJSONArray("errCode").getString(0)); | 
|---|
|  |  |  | //*********读取扩展字段********** | 
|---|
|  |  |  | JSONObject extendData = data.getJSONObject("extend"); | 
|---|
|  |  |  | InnerSuhttleExtend extend = (InnerSuhttleExtend) shuttleProtocol.getExtend(); | 
|---|
|  |  |  | //管制状态 | 
|---|
|  |  |  | extend.setSuspendState(extendData.getInteger("suspendState")); | 
|---|
|  |  |  | //最高电芯电压(mV) | 
|---|
|  |  |  | extend.setMaxCellVoltage(extendData.getInteger("maxCellVoltage")); | 
|---|
|  |  |  | //最低电芯电压(mV) | 
|---|
|  |  |  | extend.setMinCellVoltage(extendData.getInteger("minCellVoltage")); | 
|---|
|  |  |  | //电池电压 | 
|---|
|  |  |  | extend.setVoltage(extendData.getInteger("voltage")); | 
|---|
|  |  |  | //充放电循环次数 | 
|---|
|  |  |  | extend.setChargeCycleTimes(extendData.getInteger("chargeCycleTimes")); | 
|---|
|  |  |  | //剩余电量 | 
|---|
|  |  |  | extend.setSurplusQuantity(extendData.getInteger("surplusQuantity")); | 
|---|
|  |  |  | //总电量 | 
|---|
|  |  |  | extend.setCountQuantity(extendData.getInteger("countQuantity")); | 
|---|
|  |  |  | shuttleProtocol.setExtend(extend);//扩展字段 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //是否顶升 | 
|---|
|  |  |  | 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("runDir")); | 
|---|
|  |  |  | //是否为充电状态 | 
|---|
|  |  |  | shuttleProtocol.setHasCharge(data.getInteger("chargState") == 1 ? true : false); | 
|---|
|  |  |  | //运行速度 | 
|---|
|  |  |  | shuttleProtocol.setSpeed(data.getInteger("speed")); | 
|---|
|  |  |  | //最近一次在线时间 | 
|---|
|  |  |  | shuttleProtocol.setLastOnlineTime(System.currentTimeMillis()); | 
|---|
|  |  |  | //读取四向穿梭车状态-end | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //*********读取扩展字段********** | 
|---|
|  |  |  | InnerSuhttleExtend extend = (InnerSuhttleExtend) shuttleProtocol.getExtend(); | 
|---|
|  |  |  | //管制状态 | 
|---|
|  |  |  | extend.setSuspendState(data.getInteger("suspendState")); | 
|---|
|  |  |  | //最高电芯电压(mV) | 
|---|
|  |  |  | extend.setMaxCellVoltage(data.getInteger("maxCellVoltage")); | 
|---|
|  |  |  | //最低电芯电压(mV) | 
|---|
|  |  |  | extend.setMinCellVoltage(data.getInteger("minCellVoltage")); | 
|---|
|  |  |  | //电池电压 | 
|---|
|  |  |  | extend.setVoltage(data.getInteger("voltage")); | 
|---|
|  |  |  | //充放电循环次数 | 
|---|
|  |  |  | extend.setChargeCycleTimes(data.getInteger("chargeCycleTimes")); | 
|---|
|  |  |  | //剩余电量 | 
|---|
|  |  |  | extend.setSurplusQuantity(data.getInteger("surplusQuantity")); | 
|---|
|  |  |  | //总电量 | 
|---|
|  |  |  | extend.setCountQuantity(data.getInteger("countQuantity")); | 
|---|
|  |  |  | shuttleProtocol.setExtend(extend);//扩展字段 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //最近一次在线时间 | 
|---|
|  |  |  | shuttleProtocol.setLastOnlineTime(System.currentTimeMillis()); | 
|---|
|  |  |  | ///读取四向穿梭车状态-end | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //小车处于运行中,将标记置为true | 
|---|
|  |  |  | if (shuttleProtocol.getDeviceStatus() == 0) { | 
|---|
|  |  |  | shuttleProtocol.setPakMk(true); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 0) { | 
|---|
|  |  |  | //小车空闲状态、小车任务状态为未知,认定曾离线过,需要复位成空闲 | 
|---|
|  |  |  | shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | this.originDeviceData = data; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); | 
|---|
|  |  |  | //小车处于运行中,将标记置为true | 
|---|
|  |  |  | if (shuttleProtocol.getDeviceStatus() == 0) { | 
|---|
|  |  |  | shuttleProtocol.setPakMk(true); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 1) { | 
|---|
|  |  |  | //小车空闲状态、小车任务状态为未知,认定曾离线过,需要复位成空闲 | 
|---|
|  |  |  | this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE) && shuttleProtocol.getDeviceStatus().intValue() == 1) { | 
|---|
|  |  |  | this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | this.originDeviceData = data.getString("originDeviceData"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), deviceConfig.getDeviceNo())); | 
|---|
|  |  |  | } 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车Socket状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | // 获取服务器响应 | 
|---|
|  |  |  | JSONObject result = null; | 
|---|
|  |  |  | int removeIdx = -1; | 
|---|
|  |  |  | JSONObject socketResult = null; | 
|---|
|  |  |  | for (int i = 0; i < socketResults.size(); i++) { | 
|---|
|  |  |  | JSONObject socketResult = socketResults.get(i); | 
|---|
|  |  |  | if (socketResult == null) { | 
|---|
|  |  |  | DeviceMsgModel deviceMsgModel = socketResults.get(i); | 
|---|
|  |  |  | if (!deviceMsgModel.getDeviceMsgType().equals("shuttleInit")) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!socketResult.get("msgType").equals("requestMsg")) {//不是请求内容 | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString()); | 
|---|
|  |  |  | JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString()); | 
|---|
|  |  |  | JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString()); | 
|---|
|  |  |  | String requestType = resultBody.getString("requestType"); | 
|---|
|  |  |  | Integer requestId = resultHeader.getInteger("requestId"); | 
|---|
|  |  |  | if (requestType.equals("init")) { | 
|---|
|  |  |  | Integer code = resultBody.getInteger("code"); | 
|---|
|  |  |  | //小车复位请求 | 
|---|
|  |  |  | ShuttleCommand initCommand = getInitCommand(requestId, code); | 
|---|
|  |  |  | //发出请求 | 
|---|
|  |  |  | NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class); | 
|---|
|  |  |  | JSONObject requestResult = requestCommand(httpCommand); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | removeIdx = i;//此数据已经处理,从结果集中剔除 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | log.info(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", slave.getId(), code, slave.getIp(), slave.getPort())); | 
|---|
|  |  |  | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", slave.getId(), code, slave.getIp(), slave.getPort())); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | removeIdx = i; | 
|---|
|  |  |  | socketResult = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg())); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (removeIdx != -1) { | 
|---|
|  |  |  | if (socketResult == null) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString()); | 
|---|
|  |  |  | JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString()); | 
|---|
|  |  |  | JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString()); | 
|---|
|  |  |  | String requestType = resultBody.getString("requestType"); | 
|---|
|  |  |  | Integer requestId = resultHeader.getInteger("requestId"); | 
|---|
|  |  |  | if (requestType.equals("init")) { | 
|---|
|  |  |  | socketResults.remove(removeIdx); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer code = resultBody.getInteger("code"); | 
|---|
|  |  |  | //小车复位请求 | 
|---|
|  |  |  | ShuttleCommand initCommand = getInitCommand(requestId, code); | 
|---|
|  |  |  | //发出请求 | 
|---|
|  |  |  | NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class); | 
|---|
|  |  |  | requestCommand(httpCommand); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | log.info(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort())); | 
|---|
|  |  |  | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | 
|---|
|  |  |  | return response; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //    @Override | 
|---|
|  |  |  | //    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()) { | 
|---|
|  |  |  | //                ArrayList<Map<String, Object>> list = new ArrayList<>(); | 
|---|
|  |  |  | //                if (path.size() > 10) { | 
|---|
|  |  |  | //                    List<JSONObject> subList = path.subList(0, 10); | 
|---|
|  |  |  | //                    list.addAll(subList); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //                    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 httpCommandCopy = JSON.parseObject(JSON.toJSONString(httpCommand), NyShuttleHttpCommand.class); | 
|---|
|  |  |  | //                JSONObject bodyCopy = JSON.parseObject(JSON.toJSONString(body)); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //                NyShuttleHttpCommand.NyRequest request = httpCommandCopy.getRequest(); | 
|---|
|  |  |  | //                bodyCopy.put("path", list); | 
|---|
|  |  |  | //                bodyCopy.put("taskId", taskId++); | 
|---|
|  |  |  | //                request.setBody(bodyCopy); | 
|---|
|  |  |  | //                httpCommandCopy.setRequest(request); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //                commandList.add(httpCommandCopy);//add copy | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            for (NyShuttleHttpCommand requestCommand : commandList) { | 
|---|
|  |  |  | //                while (true) { | 
|---|
|  |  |  | //                    JSONObject result = requestCommand(requestCommand); | 
|---|
|  |  |  | //                    if (result == null) { | 
|---|
|  |  |  | ////                        return response;//请求失败 | 
|---|
|  |  |  | //                        continue;//请求失败尝试重新请求 | 
|---|
|  |  |  | //                    } | 
|---|
|  |  |  | //                    this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间 | 
|---|
|  |  |  | //                    response.setMessage(JSON.toJSONString(result)); | 
|---|
|  |  |  | //                    response.setResult(true); | 
|---|
|  |  |  | //                    break; | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            return response; | 
|---|
|  |  |  | //        } catch (Exception e) { | 
|---|
|  |  |  | //            e.printStackTrace(); | 
|---|
|  |  |  | //            response.setMessage(e.getMessage()); | 
|---|
|  |  |  | //            return response; | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | 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()) { | 
|---|
|  |  |  | ArrayList<Map<String, Object>> list = new ArrayList<>(); | 
|---|
|  |  |  | if (path.size() > 10) { | 
|---|
|  |  |  | List<JSONObject> subList = path.subList(0, 10); | 
|---|
|  |  |  | list.addAll(subList); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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 httpCommandCopy = JSON.parseObject(JSON.toJSONString(httpCommand), NyShuttleHttpCommand.class); | 
|---|
|  |  |  | JSONObject bodyCopy = JSON.parseObject(JSON.toJSONString(body)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | NyShuttleHttpCommand.NyRequest request = httpCommandCopy.getRequest(); | 
|---|
|  |  |  | bodyCopy.put("path", list); | 
|---|
|  |  |  | bodyCopy.put("taskId", taskId++); | 
|---|
|  |  |  | request.setBody(bodyCopy); | 
|---|
|  |  |  | httpCommandCopy.setRequest(request); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | commandList.add(httpCommandCopy);//add copy | 
|---|
|  |  |  | String resultKey = requestCommand(httpCommand); | 
|---|
|  |  |  | //查询请求结果 | 
|---|
|  |  |  | JSONObject result = queryCommandStatus(resultKey); | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | return response;//请求失败 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (NyShuttleHttpCommand requestCommand : commandList) { | 
|---|
|  |  |  | while (true) { | 
|---|
|  |  |  | JSONObject result = requestCommand(requestCommand); | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | //                        return response;//请求失败 | 
|---|
|  |  |  | continue;//请求失败尝试重新请求 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间 | 
|---|
|  |  |  | response.setMessage(JSON.toJSONString(result)); | 
|---|
|  |  |  | response.setResult(true); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间 | 
|---|
|  |  |  | response.setMessage(JSON.toJSONString(result)); | 
|---|
|  |  |  | response.setResult(true); | 
|---|
|  |  |  | return response; | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | //发出请求 | 
|---|
|  |  |  | NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); | 
|---|
|  |  |  | JSONObject result = requestCommand(httpCommand); | 
|---|
|  |  |  | String resultKey = requestCommand(httpCommand); | 
|---|
|  |  |  | //查询请求结果 | 
|---|
|  |  |  | JSONObject result = queryCommandStatus(resultKey); | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | return response;//请求失败 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | //发出请求 | 
|---|
|  |  |  | NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); | 
|---|
|  |  |  | JSONObject result = requestCommand(httpCommand); | 
|---|
|  |  |  | String resultKey = requestCommand(httpCommand); | 
|---|
|  |  |  | //查询请求结果 | 
|---|
|  |  |  | JSONObject result = queryCommandStatus(resultKey); | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | return response;//请求失败 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | //发出请求 | 
|---|
|  |  |  | NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class); | 
|---|
|  |  |  | JSONObject result = requestCommand(httpCommand); | 
|---|
|  |  |  | String resultKey = requestCommand(httpCommand); | 
|---|
|  |  |  | //查询请求结果 | 
|---|
|  |  |  | JSONObject result = queryCommandStatus(resultKey); | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | return response;//请求失败 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public boolean isRequireCharge() { | 
|---|
|  |  |  | public ShuttleRequireChargeType isRequireCharge() { | 
|---|
|  |  |  | if (this.shuttleProtocol.getDeviceStatus() == null | 
|---|
|  |  |  | || this.shuttleProtocol.getPakMk() == null | 
|---|
|  |  |  | || this.shuttleProtocol.getErrorCode() == null | 
|---|
|  |  |  | 
|---|
|  |  |  | || this.shuttleProtocol.getMode() == null | 
|---|
|  |  |  | || this.shuttleProtocol.getExtend() == null | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | return ShuttleRequireChargeType.NONE; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend(); | 
|---|
|  |  |  | 
|---|
|  |  |  | && extend.getSuspendState() == 0 | 
|---|
|  |  |  | ; | 
|---|
|  |  |  | if (!res) { | 
|---|
|  |  |  | return res; | 
|---|
|  |  |  | return ShuttleRequireChargeType.NONE; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 电量小于阈值需要进行充电 | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class); | 
|---|
|  |  |  | if (shuttleService == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | return ShuttleRequireChargeType.NONE; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasShuttle basShuttle = shuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", slave.getId())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | BasShuttle basShuttle = shuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", deviceConfig.getDeviceNo())); | 
|---|
|  |  |  | if (basShuttle == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | return ShuttleRequireChargeType.NONE; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer chargeLine = basShuttle.getChargeLine(); | 
|---|
|  |  |  | if (chargeLine == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | return ShuttleRequireChargeType.NONE; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < chargeLine; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | boolean chargeResult = Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < chargeLine; | 
|---|
|  |  |  | if (chargeResult) { | 
|---|
|  |  |  | return ShuttleRequireChargeType.FORCE_CHARGE;//需要强制充电 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer suggestChargeLine = basShuttle.getSuggestChargeLine(); | 
|---|
|  |  |  | if (suggestChargeLine == null) { | 
|---|
|  |  |  | return ShuttleRequireChargeType.NONE; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | boolean suggestChargeResult = Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < suggestChargeLine; | 
|---|
|  |  |  | if (suggestChargeResult) { | 
|---|
|  |  |  | return ShuttleRequireChargeType.SUGGEST_CHARGE;//建议充电 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return ShuttleRequireChargeType.NONE; | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | return ShuttleRequireChargeType.NONE; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //***************判断是否满充校准*************** | 
|---|
|  |  |  | Config shuttleMaxPowerVerifyConfig = configService.selectOne(new EntityWrapper<Config>() | 
|---|
|  |  |  | .eq("code", "shuttleMaxPowerVerify") | 
|---|
|  |  |  | .eq("status", 1)); | 
|---|
|  |  |  | if (shuttleMaxPowerVerifyConfig != null) { | 
|---|
|  |  |  | if (shuttleMaxPowerVerifyConfig.getValue().equals("true")) { | 
|---|
|  |  |  | if (this.shuttleProtocol.getBatteryVoltage() < 5630) { | 
|---|
|  |  |  | return false;//电压不够继续充电 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //***************判断是否满充校准*************** | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (this.shuttleProtocol.getHasCharge() == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (this.shuttleProtocol.getMode() == 0) { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!this.shuttleProtocol.getErrorCode().equals("0")) { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend(); | 
|---|
|  |  |  | boolean res = this.shuttleProtocol.getMode() == 0 | 
|---|
|  |  |  | && !this.shuttleProtocol.getErrorCode().equals("0") | 
|---|
|  |  |  | && extend.getSuspendState() == 1 | 
|---|
|  |  |  | ; | 
|---|
|  |  |  | return res; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (extend.getSuspendState() == 1) { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | 
|---|
|  |  |  | //将路径锁与小车路径进行匹配 | 
|---|
|  |  |  | ArrayList<NavigateNode> tmp = new ArrayList<>(); | 
|---|
|  |  |  | //检测路径是否被锁定 | 
|---|
|  |  |  | int[][] map = navigateMapData.getDataFromRedis(lev, NavigationMapType.DFX.id, null, null); | 
|---|
|  |  |  | int[][] map = navigateMapData.getDataFromRedis(lev, NavigationMapType.getDfxWithDevice(), null, null); | 
|---|
|  |  |  | for (NavigateNode node : path) { | 
|---|
|  |  |  | if(map[node.getX()][node.getY()] == -999) { | 
|---|
|  |  |  | tmp.add(node); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public synchronized boolean setProtocolStatus(ShuttleProtocolStatusType status) { | 
|---|
|  |  |  | if (status.equals(ShuttleProtocolStatusType.IDLE)) { | 
|---|
|  |  |  | this.shuttleProtocol.setIdleTime(System.currentTimeMillis()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.shuttleProtocol.setProtocolStatus(status); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public synchronized boolean setTaskNo(Integer taskNo) { | 
|---|
|  |  |  | redisUtil.set(RedisKeyType.SHUTTLE_FLAG.key + shuttleProtocol.getShuttleNo(), taskNo); | 
|---|
|  |  |  | this.shuttleProtocol.setTaskNo(taskNo); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public synchronized boolean setSyncTaskNo(Integer taskNo) { | 
|---|
|  |  |  | this.shuttleProtocol.setSyncTaskNo(taskNo); | 
|---|
|  |  |  | redisUtil.setSync(RedisKeyType.SHUTTLE_FLAG.key + shuttleProtocol.getShuttleNo(), taskNo); | 
|---|
|  |  |  | this.shuttleProtocol.setTaskNo(taskNo); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes) { | 
|---|
|  |  |  | public boolean setTrafficControl(boolean enable, List<NavigateNode> nodeList) { | 
|---|
|  |  |  | shuttleProtocol.setTrafficControl(enable); | 
|---|
|  |  |  | shuttleProtocol.setTrafficControlNodes(nodeList); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void updateDeviceDataLogTime(long time) { | 
|---|
|  |  |  | shuttleProtocol.setDeviceDataLog(time); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public JSONObject parseStatusToMsg(ShuttleProtocol shuttleProtocol) { | 
|---|
|  |  |  | JSONObject result = new JSONObject(); | 
|---|
|  |  |  | result.put("msgType", "responseMsg"); | 
|---|
|  |  |  | result.put("robotId", 5002); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONObject header = new JSONObject(); | 
|---|
|  |  |  | header.put("responseId", 5005631); | 
|---|
|  |  |  | header.put("version", "RGV-APP-F427-N24036-1112"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONObject body = new JSONObject(); | 
|---|
|  |  |  | body.put("responseType", "state"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public boolean restartCalcPath() { | 
|---|
|  |  |  | ConfigService configService = SpringUtils.getBean(ConfigService.class); | 
|---|
|  |  |  | if (configService == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleAction shuttleAction = SpringUtils.getBean(ShuttleAction.class); | 
|---|
|  |  |  | if (shuttleAction == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleOperaUtils shuttleOperaUtils = SpringUtils.getBean(ShuttleOperaUtils.class); | 
|---|
|  |  |  | if (shuttleOperaUtils == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); | 
|---|
|  |  |  | if (objectMapper == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | boolean trafficControlRestartCalcPath = false; | 
|---|
|  |  |  | Config trafficControlRestartCalcPathConfig = configService.selectOne(new EntityWrapper<Config>() | 
|---|
|  |  |  | .eq("code", "trafficControlRestartCalcPath") | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | if(trafficControlRestartCalcPathConfig != null) { | 
|---|
|  |  |  | trafficControlRestartCalcPath = trafficControlRestartCalcPathConfig.getValue().equals("Y") ? true : false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!trafficControlRestartCalcPath) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (shuttleProtocol.getTaskNo() == 0) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!this.isDeviceIdle()) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Object object = redisUtil.get(RedisKeyType.SHUTTLE_RESTART_CALC_PATH.key + shuttleProtocol.getShuttleNo()); | 
|---|
|  |  |  | if (object != null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer taskNo = shuttleProtocol.getTaskNo(); | 
|---|
|  |  |  | Object obj = redisUtil.get(RedisKeyType.SHUTTLE_WORK_FLAG.key + taskNo); | 
|---|
|  |  |  | if (obj == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleRedisCommand redisCommand = null; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | redisCommand = objectMapper.readValue(String.valueOf(obj), ShuttleRedisCommand.class); | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | throw new RuntimeException(e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (redisCommand == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand(); | 
|---|
|  |  |  | String locNo = assignCommand.getLocNo(); | 
|---|
|  |  |  | List<NavigationMapType> mapTypes = assignCommand.getMapTypes(); | 
|---|
|  |  |  | if (locNo == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (mapTypes == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<NavigationMapType> restartCalcMapTypes = new ArrayList<>(mapTypes); | 
|---|
|  |  |  | restartCalcMapTypes.add(NavigationMapType.SHUTTLE); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (assignCommand.getTaskMode() == ShuttleTaskModeType.TRANSPORT.id) { | 
|---|
|  |  |  | restartCalcMapTypes.add(NavigationMapType.DFX); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String currentLocNo = shuttleProtocol.getCurrentLocNo(); | 
|---|
|  |  |  | List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(currentLocNo, locNo, restartCalcMapTypes, assignCommand, this); | 
|---|
|  |  |  | if (commands == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (assignCommand.getTaskMode() == ShuttleTaskModeType.TRANSPORT.id) { | 
|---|
|  |  |  | List<ShuttleCommand> originCommands = assignCommand.getCommands(); | 
|---|
|  |  |  | if (originCommands == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleCommand firstCommand = originCommands.get(0); | 
|---|
|  |  |  | ShuttleCommand endCommand = originCommands.get(originCommands.size() - 1); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (firstCommand.getMode() != ShuttleCommandModeType.PALLET_LIFT.id) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (endCommand.getMode() != ShuttleCommandModeType.PALLET_DOWN.id) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | commands.add(0, firstCommand); | 
|---|
|  |  |  | commands.add(endCommand); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | assignCommand.setCommands(commands); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //下发任务 | 
|---|
|  |  |  | shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand); | 
|---|
|  |  |  | redisUtil.set(RedisKeyType.SHUTTLE_RESTART_CALC_PATH.key + shuttleProtocol.getShuttleNo(), true, 60); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes, Boolean shuttleDirectionReverse) { | 
|---|
|  |  |  | NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(slave.getId(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ArrayList<HashMap<String, Object>> path = new ArrayList<>(); | 
|---|
|  |  |  | 
|---|
|  |  |  | HashMap<String, Object> body = new HashMap<>(); | 
|---|
|  |  |  | body.put("requestType", "move");//移动命令 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | request.setBody(body); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | NavigateNode startNode = nodes.get(0); | 
|---|
|  |  |  | List<List<MapNode>> mapData = navigateMapData.getJsonData(startNode.getZ(), NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null); | 
|---|
|  |  |  | for (NavigateNode node : nodes) { | 
|---|
|  |  |  | HashMap<String, Object> data = new HashMap<>(); | 
|---|
|  |  |  | String codeNum = NavigatePositionConvert.xyToPosition(node.getX(), node.getY(), node.getZ()); | 
|---|
|  |  |  | Map<String, Object> nyNode = navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(codeNum)); | 
|---|
|  |  |  | int xp = Integer.parseInt(String.valueOf(nyNode.get("y"))); | 
|---|
|  |  |  | int yp = Integer.parseInt(String.valueOf(nyNode.get("x"))); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int xp = Integer.parseInt(String.valueOf(nyNode.get("x"))); | 
|---|
|  |  |  | int yp = Integer.parseInt(String.valueOf(nyNode.get("y"))); | 
|---|
|  |  |  | if (shuttleDirectionReverse) { | 
|---|
|  |  |  | xp = Integer.parseInt(String.valueOf(nyNode.get("y"))); | 
|---|
|  |  |  | yp = Integer.parseInt(String.valueOf(nyNode.get("x"))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int z = Integer.parseInt(String.valueOf(nyNode.get("z"))); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<List<MapNode>> mapData = navigateMapData.getJsonData(startNode.getZ(), NavigationMapType.NONE.id, null, null); | 
|---|
|  |  |  | List<MapNode> mapNodes = mapData.get(node.getX()); | 
|---|
|  |  |  | MapNode mapNode = mapNodes.get(node.getY()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | httpStandard.setRequest(request); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | LocMastService locMastService = SpringUtils.getBean(LocMastService.class); | 
|---|
|  |  |  | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>() | 
|---|
|  |  |  | .eq("qr_code_value", distCodeNum)); | 
|---|
|  |  |  | if (locMast == null) { | 
|---|
|  |  |  | throw new CoolException("库位信息不存在"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Object object = redisUtil.get(RedisKeyType.LOC_MAP.key); | 
|---|
|  |  |  | HashMap<String, String> locMap = (HashMap<String, String>) object; | 
|---|
|  |  |  | String targetLocNo = locMap.get(distCodeNum); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleCommand command = new ShuttleCommand(); | 
|---|
|  |  |  | command.setShuttleNo(slave.getId()); | 
|---|
|  |  |  | command.setShuttleNo(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | command.setBody(JSON.toJSONString(httpStandard)); | 
|---|
|  |  |  | command.setMode(ShuttleCommandModeType.MOVE.id); | 
|---|
|  |  |  | command.setTargetLocNo(locMast.getLocNo()); | 
|---|
|  |  |  | command.setTargetLocNo(targetLocNo); | 
|---|
|  |  |  | command.setTaskNo(taskId); | 
|---|
|  |  |  | return command; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ShuttleCommand getMoveLiftCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes, Boolean moveIn, Boolean shuttleDirectionReverse) { | 
|---|
|  |  |  | NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ArrayList<HashMap<String, Object>> path = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer taskId = getTaskId(); | 
|---|
|  |  |  | HashMap<String, Object> body = new HashMap<>(); | 
|---|
|  |  |  | //        if (moveIn) { | 
|---|
|  |  |  | //            body.put("requestType", "intoLift");//进提升机 | 
|---|
|  |  |  | //        } else { | 
|---|
|  |  |  | //            body.put("requestType", "outLift");//出提升机 | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | body.put("requestType", "move");//移动命令 | 
|---|
|  |  |  | body.put("taskId", taskId);//TaskID需要随机 | 
|---|
|  |  |  | body.put("path", path); | 
|---|
|  |  |  | request.setBody(body); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | NavigateNode startNode = nodes.get(0); | 
|---|
|  |  |  | List<List<MapNode>> mapData = navigateMapData.getJsonData(startNode.getZ(), NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null); | 
|---|
|  |  |  | for (NavigateNode node : nodes) { | 
|---|
|  |  |  | HashMap<String, Object> data = new HashMap<>(); | 
|---|
|  |  |  | String codeNum = NavigatePositionConvert.xyToPosition(node.getX(), node.getY(), node.getZ()); | 
|---|
|  |  |  | Map<String, Object> nyNode = navigateNodeToNyPointNode(NavigatePositionConvert.codeToNode(codeNum)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int xp = Integer.parseInt(String.valueOf(nyNode.get("x"))); | 
|---|
|  |  |  | int yp = Integer.parseInt(String.valueOf(nyNode.get("y"))); | 
|---|
|  |  |  | if (shuttleDirectionReverse) { | 
|---|
|  |  |  | xp = Integer.parseInt(String.valueOf(nyNode.get("y"))); | 
|---|
|  |  |  | yp = Integer.parseInt(String.valueOf(nyNode.get("x"))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int z = Integer.parseInt(String.valueOf(nyNode.get("z"))); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<MapNode> mapNodes = mapData.get(node.getX()); | 
|---|
|  |  |  | MapNode mapNode = mapNodes.get(node.getY()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | data.put("xp", xp); | 
|---|
|  |  |  | data.put("yp", yp); | 
|---|
|  |  |  | data.put("z", z); | 
|---|
|  |  |  | data.put("x", mapNode.getXBase()); | 
|---|
|  |  |  | data.put("y", mapNode.getYBase()); | 
|---|
|  |  |  | path.add(data); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | httpStandard.setRequest(request); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Object object = redisUtil.get(RedisKeyType.LOC_MAP.key); | 
|---|
|  |  |  | HashMap<String, String> locMap = (HashMap<String, String>) object; | 
|---|
|  |  |  | String targetLocNo = locMap.get(distCodeNum); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleCommand command = new ShuttleCommand(); | 
|---|
|  |  |  | command.setShuttleNo(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | command.setBody(JSON.toJSONString(httpStandard)); | 
|---|
|  |  |  | command.setMode(ShuttleCommandModeType.MOVE.id); | 
|---|
|  |  |  | command.setTargetLocNo(targetLocNo); | 
|---|
|  |  |  | command.setTaskNo(taskId); | 
|---|
|  |  |  | return command; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ShuttleCommand getLiftCommand(Integer taskNo, Boolean lift) { | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(slave.getId(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer taskId = getTaskId();//TaskID需要随机 | 
|---|
|  |  |  | 
|---|
|  |  |  | httpStandard.setRequest(request); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleCommand command = new ShuttleCommand(); | 
|---|
|  |  |  | command.setShuttleNo(slave.getId()); | 
|---|
|  |  |  | command.setShuttleNo(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | command.setBody(JSON.toJSONString(httpStandard)); | 
|---|
|  |  |  | command.setMode(lift ? ShuttleCommandModeType.PALLET_LIFT.id : ShuttleCommandModeType.PALLET_DOWN.id); | 
|---|
|  |  |  | command.setTaskNo(taskId); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ShuttleCommand getChargeCommand(Integer taskNo, Boolean charge) { | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(slave.getId(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Integer taskId = getTaskId();//TaskID需要随机 | 
|---|
|  |  |  | 
|---|
|  |  |  | httpStandard.setRequest(request); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleCommand command = new ShuttleCommand(); | 
|---|
|  |  |  | command.setShuttleNo(slave.getId()); | 
|---|
|  |  |  | command.setShuttleNo(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | command.setBody(JSON.toJSONString(httpStandard)); | 
|---|
|  |  |  | command.setMode(charge ? ShuttleCommandModeType.CHARGE_OPEN.id : ShuttleCommandModeType.CHARGE_CLOSE.id); | 
|---|
|  |  |  | command.setTaskNo(taskId); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ShuttleCommand getUpdateLocationCommand(Integer taskNo, String locNo) { | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(slave.getId(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | HashMap<String, Object> body = new HashMap<>(); | 
|---|
|  |  |  | 
|---|
|  |  |  | httpStandard.setRequest(request); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleCommand command = new ShuttleCommand(); | 
|---|
|  |  |  | command.setShuttleNo(slave.getId()); | 
|---|
|  |  |  | command.setShuttleNo(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | command.setBody(JSON.toJSONString(httpStandard)); | 
|---|
|  |  |  | command.setMode(ShuttleCommandModeType.UPDATE_LOCATION.id); | 
|---|
|  |  |  | command.setTaskNo(taskNo); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //获取小车复位响应命令 | 
|---|
|  |  |  | public ShuttleCommand getInitCommand(Integer taskNo, Integer code) { | 
|---|
|  |  |  | LocMastService locMastService = SpringUtils.getBean(LocMastService.class); | 
|---|
|  |  |  | NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(slave.getId(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand httpStandard = getHttpStandard(deviceConfig.getDeviceNo(), taskNo); | 
|---|
|  |  |  | NyShuttleHttpCommand.NyRequest request = httpStandard.getRequest(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //code -> {Integer@13781} 1101101 | 
|---|
|  |  |  | 
|---|
|  |  |  | map.put("z", lev); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String mapStr = JSON.toJSONString(map); | 
|---|
|  |  |  | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>() | 
|---|
|  |  |  | .eq("qr_code_value", mapStr)); | 
|---|
|  |  |  | if (locMast == null) { | 
|---|
|  |  |  | throw new CoolException("地址码不存在"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<List<MapNode>> mapData = navigateMapData.getJsonData(lev, NavigationMapType.NONE.id, null, null); | 
|---|
|  |  |  | List<MapNode> mapNodes = mapData.get(locMast.getRow1()); | 
|---|
|  |  |  | MapNode mapNode = mapNodes.get(locMast.getBay1()); | 
|---|
|  |  |  | Object object = redisUtil.get(RedisKeyType.LOC_MAP.key); | 
|---|
|  |  |  | HashMap<String, String> locMap = (HashMap<String, String>) object; | 
|---|
|  |  |  | String targetLocNo = locMap.get(mapStr); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<List<MapNode>> mapData = navigateMapData.getJsonData(lev, NavigationMapType.getMapTypes(NavigationMapType.NONE), null, null); | 
|---|
|  |  |  | List<MapNode> mapNodes = mapData.get(Utils.getRow(targetLocNo)); | 
|---|
|  |  |  | MapNode mapNode = mapNodes.get(Utils.getBay(targetLocNo)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | HashMap<String, Object> location = new HashMap<>(); | 
|---|
|  |  |  | location.put("xp", row); | 
|---|
|  |  |  | 
|---|
|  |  |  | httpStandard.setRequest(request); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ShuttleCommand command = new ShuttleCommand(); | 
|---|
|  |  |  | command.setShuttleNo(slave.getId()); | 
|---|
|  |  |  | command.setShuttleNo(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | command.setBody(JSON.toJSONString(httpStandard)); | 
|---|
|  |  |  | command.setMode(ShuttleCommandModeType.RESET.id); | 
|---|
|  |  |  | command.setTaskNo(taskNo); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public boolean connect() { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | Socket socket = new Socket(slave.getIp(), slave.getPort()); | 
|---|
|  |  |  | socket.setSoTimeout(10000); | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //发出请求 | 
|---|
|  |  |  | private JSONObject requestCommand(NyShuttleHttpCommand httpCommand) throws IOException { | 
|---|
|  |  |  | if (this.socket == null) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //压缩数据包 | 
|---|
|  |  |  | JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand)); | 
|---|
|  |  |  | data.remove("nodes"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取输出流 | 
|---|
|  |  |  | OutputStreamWriter writer = new OutputStreamWriter(this.socket.getOutputStream()); | 
|---|
|  |  |  | writer.write(JSON.toJSONString(data) + "\r\n"); | 
|---|
|  |  |  | writer.flush(); | 
|---|
|  |  |  | //            System.out.println("Sent message to server: " + JSON.toJSONString(httpCommand)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String requestType = null; | 
|---|
|  |  |  | String taskId = null; | 
|---|
|  |  |  | private String requestCommand(NyShuttleHttpCommand httpCommand) throws IOException { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | requestType = httpCommand.getRequest().getBody().get("requestType").toString(); | 
|---|
|  |  |  | taskId = httpCommand.getRequest().getBody().get("taskId").toString(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | //            return null; | 
|---|
|  |  |  | //taskId可能取空,不报错,正常情况 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); | 
|---|
|  |  |  | if (deviceMsgUtils == null) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //压缩数据包 | 
|---|
|  |  |  | JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand)); | 
|---|
|  |  |  | data.remove("nodes"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | DeviceCommandMsgModel commandMsgModel = new DeviceCommandMsgModel(); | 
|---|
|  |  |  | commandMsgModel.setDeviceId(deviceConfig.getDeviceNo()); | 
|---|
|  |  |  | commandMsgModel.setDeviceType(String.valueOf(SlaveType.Shuttle)); | 
|---|
|  |  |  | commandMsgModel.setCommand(data); | 
|---|
|  |  |  | String key = deviceMsgUtils.sendDeviceCommand(SlaveType.Shuttle, deviceConfig.getDeviceNo(), commandMsgModel); | 
|---|
|  |  |  | return key; | 
|---|
|  |  |  | }catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private JSONObject queryCommandStatus(String resultKey) { | 
|---|
|  |  |  | // 获取服务器响应 | 
|---|
|  |  |  | // 尝试10次 | 
|---|
|  |  |  | JSONObject result = null; | 
|---|
|  |  |  | for (int i = 0; i < 10; i++) { | 
|---|
|  |  |  | result = getRequestBody(requestType, taskId); | 
|---|
|  |  |  | long startTime = System.currentTimeMillis(); | 
|---|
|  |  |  | while (true) { | 
|---|
|  |  |  | if((System.currentTimeMillis() - startTime) > 1000 * 10) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | result = getRequestBody(resultKey); | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | Thread.sleep(100); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return result;//返回Body结果集 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void requestCommandAsync(NyShuttleHttpCommand httpCommand) throws IOException { | 
|---|
|  |  |  | if (this.socket == null) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //压缩数据包 | 
|---|
|  |  |  | JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand)); | 
|---|
|  |  |  | data.remove("nodes"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取输出流 | 
|---|
|  |  |  | OutputStreamWriter writer = new OutputStreamWriter(this.socket.getOutputStream()); | 
|---|
|  |  |  | writer.write(JSON.toJSONString(data) + "\r\n"); | 
|---|
|  |  |  | writer.flush(); | 
|---|
|  |  |  | //            System.out.println("Sent message to server: " + JSON.toJSONString(httpCommand)); | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private JSONObject filterBodyData(JSONObject data) { | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //WCS系统坐标转牛眼坐标 | 
|---|
|  |  |  | private static int[] WCSXyzToNyXyz(int x, int y, int z) { | 
|---|
|  |  |  | //        //WCS系统Y轴 => 牛眼X轴转换公式 | 
|---|
|  |  |  | //        int x1 = Math.abs(y - 61) + 11; | 
|---|
|  |  |  | //        //WCS系统X轴 => 牛眼Y轴转换公式 | 
|---|
|  |  |  | //        int y1 = x + 10; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //        int x1 = x + 10; | 
|---|
|  |  |  | //        int y1 = y + 10; | 
|---|
|  |  |  | LocMastService locMastService = SpringUtils.getBean(LocMastService.class); | 
|---|
|  |  |  | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>() | 
|---|
|  |  |  | .eq("row1", x) | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String qrCodeValue = locMast.getQrCodeValue(); | 
|---|
|  |  |  | JSONObject data = JSON.parseObject(qrCodeValue); | 
|---|
|  |  |  | return new int[]{data.getInteger("y"), data.getInteger("x"), z}; | 
|---|
|  |  |  | return new int[]{data.getInteger("x"), data.getInteger("y"), z}; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Object getOriginDeviceData() { | 
|---|
|  |  |  | return this.originDeviceData; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Data | 
|---|