自动化立体仓库 - WCS系统
#
Junjie
2025-03-29 d51e29f60353ba3941489aed453997ee423c7bd5
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -57,6 +57,7 @@
    private static final boolean DEBUG = false;//调试模式
    private List<JSONObject> socketReadResults = new ArrayList<>();
    private List<JSONObject> socketResults = new ArrayList<>();
    //原始设备数据
@@ -194,7 +195,19 @@
            }
            JSONObject result = JSON.parseObject(sb.toString());//得到响应结果集
            if (!socketResults.isEmpty() && socketResults.size() >= 5) {
            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 (!socketResults.isEmpty() && socketResults.size() >= 20) {
                socketResults.remove(0);//清理头节点
            }
            socketResults.add(result);//添加数据
@@ -220,7 +233,6 @@
                JSONObject resultResponse = JSON.parseObject(socketResult.get("response").toString());
                JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString());
                String responseType = resultBody.get("responseType").toString();
                String responseTaskId = resultBody.get("taskId").toString();
                if (DEBUG) {
                    result = socketResult;
                    break;
@@ -230,8 +242,11 @@
                    continue;//响应类型与请求类型不一致,不在调试模式下
                }
                if (!responseTaskId.equals(taskId)) {
                    continue;//响应ID与请求ID不一致,不在调试模式下
                if (taskId != null) {
                    String responseTaskId = resultBody.get("taskId").toString();
                    if (!responseTaskId.equals(taskId)) {
                        continue;//响应ID与请求ID不一致,不在调试模式下
                    }
                }
                result = socketResult;
@@ -274,7 +289,14 @@
            //----------读取四向穿梭车状态-----------
            NyShuttleHttpCommand readStatusCommand = getReadStatusCommand(slave.getId());
            JSONObject data = requestCommand(readStatusCommand);
            requestCommandAsync(readStatusCommand);//请求状态
            if (this.socketReadResults.isEmpty()) {
                return;
            }
            JSONObject data = this.socketReadResults.get(0);
            this.socketReadResults.remove(0);
            if (data == null) {
                if (System.currentTimeMillis() - shuttleProtocol.getLastOnlineTime() > 1000 * 60) {
                    //最后一次上线时间超过60s,认定离线
@@ -400,7 +422,7 @@
                socketResults.remove(removeIdx);
            }
        } catch (Exception e) {
//            e.printStackTrace();
            e.printStackTrace();
        }
    }
@@ -464,18 +486,14 @@
            for (NyShuttleHttpCommand requestCommand : commandList) {
                while (true) {
                    int i = 0;
                    i++;
                    JSONObject result = requestCommand(requestCommand);
                    if (result == null) {
//                        return response;//请求失败
                        News.info("Socket命令下发失败,任务数据={},次数={}", JSON.toJSON(requestCommand), i);
                        continue;//请求失败尝试重新请求
                    }
                    this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间
                    response.setMessage(JSON.toJSONString(result));
                    response.setResult(true);
                    News.info("Socket命令下发成功,任务数据={},次数={},响应数据={}", JSON.toJSON(requestCommand), i, JSON.toJSONString(result));
                    break;
                }
            }
@@ -714,6 +732,23 @@
            return true;
        }
        return false;
    }
    @Override
    public boolean isFault() {
        if (this.shuttleProtocol.getErrorCode() == null
                || this.shuttleProtocol.getMode() == null
                || this.shuttleProtocol.getExtend() == null
        ) {
            return false;
        }
        InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend();
        boolean res = this.shuttleProtocol.getMode() == 0
                && !this.shuttleProtocol.getErrorCode().equals("0")
                && extend.getSuspendState() == 1
                ;
        return res;
    }
    @Override
@@ -1089,13 +1124,14 @@
            requestType = httpCommand.getRequest().getBody().get("requestType").toString();
            taskId = httpCommand.getRequest().getBody().get("taskId").toString();
        } catch (Exception e) {
            return null;
//            return null;
            //taskId可能取空,不报错,正常情况
        }
        // 获取服务器响应
        // 尝试100次
        // 尝试10次
        JSONObject result = null;
        for (int i = 0; i < 100; i++) {
        for (int i = 0; i < 10; i++) {
            result = getRequestBody(requestType, taskId);
            if (result == null) {
                try {
@@ -1110,6 +1146,22 @@
        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));
    }
    private JSONObject filterBodyData(JSONObject data) {
        Object response = data.get("response");
        if (response == null) {