diff --git a/detection/src/main/java/com/njcn/gather/detection/controller/PreDetectionController.java b/detection/src/main/java/com/njcn/gather/detection/controller/PreDetectionController.java index 7ba13d87..86236f2f 100644 --- a/detection/src/main/java/com/njcn/gather/detection/controller/PreDetectionController.java +++ b/detection/src/main/java/com/njcn/gather/detection/controller/PreDetectionController.java @@ -1,12 +1,21 @@ package com.njcn.gather.detection.controller; +import com.alibaba.fastjson.JSON; import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.response.HttpResult; +import com.njcn.gather.detection.handler.SocketDevResponseService; +import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; import com.njcn.gather.detection.pojo.param.PreDetectionParam; +import com.njcn.gather.detection.pojo.vo.SocketMsg; import com.njcn.gather.detection.service.PreDetectionService; import com.njcn.gather.detection.service.impl.DetectionServiceImpl; import com.njcn.gather.detection.util.socket.MsgUtil; +import com.njcn.gather.detection.util.socket.SocketManager; +import com.njcn.gather.detection.util.socket.XiNumberManager; +import com.njcn.gather.detection.util.socket.cilent.NettyClient; +import com.njcn.gather.detection.util.socket.cilent.NettyDevClientHandler; +import com.njcn.gather.detection.util.socket.cilent.NettySourceClientHandler; import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.device.service.IPqDevService; import com.njcn.gather.script.pojo.param.PqScriptIssueParam; @@ -22,6 +31,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -42,6 +52,8 @@ public class PreDetectionController extends BaseController { private final IPqDevService iPqDevService; + private final SocketDevResponseService socketDevResponseService; + @@ -113,104 +125,24 @@ public class PreDetectionController extends BaseController { String methodDescribe = getMethodDescribe("startTest"); //preDetectionService.startTest(param); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:50.815\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:50.815\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:50.815\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:53.815\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:53.815\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:53.815\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:53.815\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:56.815\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:56.815\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:56.815\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:56.815\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:59.815\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:59.815\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:59.815\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:49:59.815\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:02.8\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:02.8\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:02.8\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:02.8\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:03\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:03\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:03\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:03\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:06\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:06\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:06\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:06\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:09\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:09\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:09\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:09\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:12\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:12\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:12\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:12\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:15\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:15\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:15\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:15\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:18\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:18\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:18\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:18\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:21\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:21\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:21\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:21\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:24\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:24\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:24\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:24\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:27\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:27\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:27\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:27\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:30\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:30\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:30\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:30\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:33\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:33\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:33\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:33\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:36\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:36\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:36\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:36\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:39\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:39\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:39\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:39\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:42.001\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:42.001\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:42.001\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:42.001\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:45.001\",\"ID\":\"172.17.102.204_1\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:45.001\",\"ID\":\"172.17.102.204_2\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:45.001\",\"ID\":\"172.17.102.204_3\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001000\"}}],\"SqlDataHarm\":[]}"); - MsgUtil.socketDataMsg("{\"Time\":\"2025-01-15T15:50:45.001\",\"ID\":\"172.17.102.204_4\",\"result\":false,\"SqlData\":[{\"type\":\"real\",\"desc\":\"FREQ\",\"list\":{\"A\":null,\"B\":null,\"C\":null,\"T\":\"50.001100\"}}],\"SqlDataHarm\":[]}"); - PqScriptIssueParam issueParam = new PqScriptIssueParam(); - issueParam.setPlanId(param.getPlanId()); - issueParam.setSourceId(param.getSourceId()); - issueParam.setDevIds(param.getDevIds()); - issueParam.setScriptId("a303b2224845fcc6f60198b8ca23dca9"); - //issueParam.setIsPhaseSequence(false); - SourceIssue sourceIssues = pqScriptDtlsService.listSourceIssue(issueParam).get(0); List pqDevList = iPqDevService.getDevInfo(param.getDevIds()); - Map devIdMapComm = pqDevList.stream().collect(Collectors.toMap(PreDetection::getDevIP, PreDetection::getDevId)); + XiNumberManager.xiDevList = pqDevList; + String s = param.getUserPageId() + "_Dev"; + SocketMsg socketMsg = new SocketMsg<>(); + socketMsg.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$01.getValue()); + PreDetection preDetection = pqDevList.get(0); + Map map = new HashMap<>(); + map.put("devIP",preDetection.getDevIP()); + map.put("chnNum",preDetection.getDevChns()); + socketMsg.setData(JSON.toJSONString(map)); + + + NettyClient.socketClient("192.168.1.138", 61000, param, JSON.toJSONString(socketMsg), new NettyDevClientHandler(param, socketDevResponseService)); - //detectionServiceImpl.processing(devDataList,param,devIdMapComm,sourceIssues, DictDataEnum.AT_WILL_VALUE); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); } diff --git a/detection/src/main/java/com/njcn/gather/detection/handler/SocketDevResponseService.java b/detection/src/main/java/com/njcn/gather/detection/handler/SocketDevResponseService.java index 6daa3965..e641adf5 100644 --- a/detection/src/main/java/com/njcn/gather/detection/handler/SocketDevResponseService.java +++ b/detection/src/main/java/com/njcn/gather/detection/handler/SocketDevResponseService.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.njcn.gather.detection.pojo.dto.DevXiNumData; import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum; +import com.njcn.gather.detection.pojo.param.DevPhaseSequenceParam; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.po.DevData; import com.njcn.gather.detection.pojo.po.SourceCompareDev; @@ -142,12 +143,13 @@ public class SocketDevResponseService { case QUITE: quitDeal(socketDataMsg, param, msg); break; + case YXT: + break; } } - //用于存储所有测点的试试数据 - private final List realDataXiList = new ArrayList<>(); + /** * 系数校验 @@ -161,6 +163,39 @@ public class SocketDevResponseService { switch (Objects.requireNonNull(sourceOperateCodeEnum)) { case DATA_CHNFACTOR$01: //获取系数 + switch (Objects.requireNonNull(dictDataEnumByCode)) { + case SUCCESS: + if (CollUtil.isNotEmpty(XiNumberManager.xiDevList)) { + List gfList = JSON.parseArray(socketDataMsg.getData(), DevXiNumData.GF.class); + DevXiNumData devXiNumData = new DevXiNumData(); + devXiNumData.setDevIP(XiNumberManager.xiDevList.get(0).getDevIP()); + devXiNumData.setGf(gfList); + XiNumberManager.devXiNumDataMap.put(XiNumberManager.xiDevList.get(0).getDevIP(), devXiNumData); + XiNumberManager.xiDevList.remove(0); + if (CollUtil.isEmpty(XiNumberManager.xiDevList)) { + xiSocket.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue()); + xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); + xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(0))); + SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); + } + } + + break; + case UNPROCESSED_BUSINESS: + + break; + case NORMAL_RESPONSE: + + break; + case DATA_RESOLVE: + + + break; + case COMMUNICATION_ERR: + break; + default: + break; + } break; case DATA_CHNFACTOR$02: @@ -183,7 +218,6 @@ public class SocketDevResponseService { //为空则认为所有装置都已经下发,开始进行小电压的申请,步骤进行+1 XiNumberManager.stepNumber = 1; sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.big_end.getValue(), XiNumberManager.devParameterList.get(0)); - sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_start.getValue(), XiNumberManager.devParameterList.get(1)); System.out.println("第一步结束开始配置小电压电流参数下发给源----------------------"); @@ -200,7 +234,7 @@ public class SocketDevResponseService { SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); XiNumberManager.stepNumber = 2; } - realDataXiList.clear(); + FormalTestManager.realDataXiList.clear(); successComm.clear(); XiNumberManager.devXiList.clear(); } @@ -222,7 +256,7 @@ public class SocketDevResponseService { case COMMUNICATION_ERR: break; default: - + break; } break; case DEV_DATA_REQUEST_02: @@ -232,195 +266,19 @@ public class SocketDevResponseService { if (ObjectUtil.isNotNull(dictDataEnumByCode)) { switch (dictDataEnumByCode) { case SUCCESS: - realDataXiList.add(devData); + FormalTestManager.realDataXiList.add(devData); successComm.add(devData.getId()); - - System.out.println(successComm.size() + " ==" + FormalTestManager.monitorIdListComm.size() + "realDataXiList:" + realDataXiList.size() + "当前步骤" + XiNumberManager.stepNumber); + System.out.println(successComm.size() + " ==" + FormalTestManager.monitorIdListComm.size() + "FormalTestManager.realDataXiList:" + FormalTestManager.realDataXiList.size() + "当前步骤" + XiNumberManager.stepNumber); if (successComm.size() == FormalTestManager.monitorIdListComm.size()) { - System.out.println("从装置中已经完成获取原始数据,准备开始计算----------------------"); - //获取数据流程结束,先把所有数据存到内存中 - Map> realDataXiMap = realDataXiList.stream().collect(Collectors.groupingBy(it -> it.getId().split(splitTag)[0])); - realDataXiMap.forEach((devIp, dataList) -> { - AtomicBoolean xiFlag = new AtomicBoolean(true); - - XiNumberManager.devXiList.add(devIp); - Map> monitorMap = dataList.stream().collect(Collectors.groupingBy(DevData::getId)); - - List gf = new ArrayList<>(); - monitorMap.forEach((monitorId, list) -> { - DevXiNumData.F F = new DevXiNumData.F(); - CoefficientVO.DevParameter devParameter; - - CoefficientVO coefficientVO = new CoefficientVO(); - - if (XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 2) { - devParameter = XiNumberManager.devParameterList.get(0); - coefficientVO.setType("big"); - } else { - devParameter = XiNumberManager.devParameterList.get(1); - coefficientVO.setType("small"); - } - - String[] splitStr = monitorId.split(splitTag); - coefficientVO.setMonitorNum(splitStr[1]); - coefficientVO.setDevName(FormalTestManager.devNameMapComm.get(splitStr[0])); - coefficientVO.setDesc((XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 1) ? "系数下装" : "系数校准"); - - assemblyEntity(list, F, coefficientVO, devParameter); - if (Objects.nonNull(coefficientVO.getResultFlag()) && coefficientVO.getResultFlag() == 0) { - xiFlag.set(false); - } - - DevXiNumData.GF gfItem = new DevXiNumData.GF(); - gfItem.setUMonitorPoint(Integer.parseInt(splitStr[1]) - 1); - gfItem.setF(F); - gf.add(gfItem); - - //表格数据 - WebSocketVO webSocketVO = new WebSocketVO<>(); - webSocketVO.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue()); - webSocketVO.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$02.getValue()); - webSocketVO.setData(coefficientVO); - - WebServiceManager.sendMessage(param.getUserPageId(), webSocketVO); - }); - DevXiNumData devXiNumData = new DevXiNumData(); - devXiNumData.setChnNum(0); - devXiNumData.setDevIP(devIp); - devXiNumData.setGf(gf); - if (xiFlag.get()) { - devXiNumData.setResultFlag(1); - } else { - devXiNumData.setResultFlag(0); - } - - if (XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 2) { - XiNumberManager.devXiNumDataMap.put(devIp, devXiNumData); - } else if (XiNumberManager.stepNumber == 1 || XiNumberManager.stepNumber == 3) { - XiNumberManager.smallDevXiNumDataMap.put(devIp, devXiNumData); - } - }); - if (XiNumberManager.stepNumber == 0) { - //开始发送修改系数命令 - - xiSocket.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue()); - xiSocket.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$02.getValue()); - xiSocket.setData(JSON.toJSONString(XiNumberManager.devXiNumDataMap.get(XiNumberManager.devXiList.get(0)))); - SocketManager.sendMsg(param.getUserPageId() + handlerStr, JSON.toJSONString(xiSocket)); - } else if (XiNumberManager.stepNumber == 1) { - System.out.println("进入小电压步骤》》》》》》》》》》》》》》》》》》》》》》》》"); - - //判断小电压是否系数超过大电压10% - double limit = 0.1; - XiNumberManager.smallDevXiNumDataMap.forEach((devIp, devXiNumDataSmall) -> { - //定义一个标识: false:表示小电流系数和大电流系数 - boolean flag = true; - DevXiNumData devXiNumDataBig = XiNumberManager.devXiNumDataMap.get(devIp); - Map gfMapSmall = devXiNumDataSmall.getGf().stream().collect(Collectors.toMap(DevXiNumData.GF::getUMonitorPoint, Function.identity())); - - for (DevXiNumData.GF bigGf : devXiNumDataBig.getGf()) { - DevXiNumData.F smallF = gfMapSmall.get(bigGf.getUMonitorPoint()).getF(); - DevXiNumData.F bigF = bigGf.getF(); - - boolean ia = isWithinTenPercent(smallF.getIa_gain(), bigF.getIa_gain(), limit); - boolean ib = isWithinTenPercent(smallF.getIb_gain(), bigF.getIb_gain(), limit); - boolean ic = isWithinTenPercent(smallF.getIc_gain(), bigF.getIc_gain(), limit); - boolean va = isWithinTenPercent(smallF.getUa_gain(), bigF.getUa_gain(), limit); - boolean vb = isWithinTenPercent(smallF.getUb_gain(), bigF.getUb_gain(), limit); - boolean vc = isWithinTenPercent(smallF.getUc_gain(), bigF.getUc_gain(), limit); - if (ia && ib && ic && va && vb && vc) { - - - } else { - flag = false; - //继续下发一轮 - if (!ia) { - Integer newIa = (smallF.getIa_gain() + bigF.getIa_gain()) / 2; - bigF.setIa_gain(newIa); - } - if (!ib) { - Integer newIb = (smallF.getIb_gain() + bigF.getIb_gain()) / 2; - bigF.setIb_gain(newIb); - } - if (!ic) { - Integer newIc = (smallF.getIc_gain() + bigF.getIc_gain()) / 2; - bigF.setIc_gain(newIc); - } - if (!va) { - Integer newVa = (smallF.getUa_gain() + bigF.getUa_gain()) / 2; - bigF.setUa_gain(newVa); - } - if (!vb) { - Integer newUb = (smallF.getUb_gain() + bigF.getUb_gain()) / 2; - bigF.setUb_gain(newUb); - } - if (!vc) { - Integer newUc = (smallF.getUc_gain() + bigF.getUc_gain()) / 2; - bigF.setUc_gain(newUc); - } - } - } - if (flag) { - //如果系数没问题则不需要 - XiNumberManager.devXiList.removeIf(it -> it.equals(devIp)); - } - - }); - - //如果差距超过10%则再次下发系数 - if (CollUtil.isNotEmpty(XiNumberManager.devXiList)) { - xiSocket.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$02.getValue()); - xiSocket.setData(JSON.toJSONString(XiNumberManager.devXiNumDataMap.get(XiNumberManager.devXiList.get(0)))); - SocketManager.sendMsg(param.getUserPageId() + handlerStr, JSON.toJSONString(xiSocket)); - } else { - //存在小电压系数在误差范围内情况,直接结束。 - sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_end.getValue(), XiNumberManager.devParameterList.get(1)); - sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.big_comp_start.getValue(), XiNumberManager.devParameterList.get(0)); - //小电流系数下发完毕;开始重新测试一次大电压 - xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); - xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(0))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); - XiNumberManager.stepNumber = 2; - realDataXiList.clear(); - successComm.clear(); - } - } else if (XiNumberManager.stepNumber == 2) { - //大电压处理 - sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.big_comp_end.getValue(), XiNumberManager.devParameterList.get(0)); - sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_comp_start.getValue(), XiNumberManager.devParameterList.get(1)); - - xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); - xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(1))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); - XiNumberManager.stepNumber = 3; - realDataXiList.clear(); - successComm.clear(); - } else if (XiNumberManager.stepNumber == 3) { - sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_comp_end.getValue(), XiNumberManager.devParameterList.get(1)); - System.out.println("-------------------------已经全部结束----------------------"); - CnSocketUtil.quitSend(param); - //修改设备表Factor_Check_Result字段 - XiNumberManager.devXiNumDataMap.forEach((key, val) -> { - DevXiNumData small = XiNumberManager.smallDevXiNumDataMap.get(key); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(PqDev::getId, FormalTestManager.devIdMapComm.get(key)); - if (val.getResultFlag() == 0 || small.getResultFlag() == 0) { - updateWrapper.set(PqDev::getFactorCheckResult, 0); - } else { - updateWrapper.set(PqDev::getFactorCheckResult, 1); - } - iPqDevService.update(updateWrapper); - updateWrapper.clear(); - }); - } - + processData(param,xiSocket); } + break; case UNPROCESSED_BUSINESS: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); break; case NORMAL_RESPONSE: - realDataXiList.add(devData); + FormalTestManager.realDataXiList.add(devData); break; default: xiSocket.setRequestId(socketDataMsg.getRequestId()); @@ -440,9 +298,224 @@ public class SocketDevResponseService { } + + private void processData(PreDetectionParam param,SocketMsg xiSocket) { + System.out.println(XiNumberManager.stepNumber+"从装置中已经完成获取测试数据,准备开始计算----------------------"); + Map> realDataXiMap = FormalTestManager.realDataXiList.stream().collect(Collectors.groupingBy(it -> it.getId().split(splitTag)[0])); + realDataXiMap.forEach((devIp, dataList) -> processDeviceData(devIp, dataList,param)); + + handleStep(XiNumberManager.stepNumber,param,xiSocket); + } + + + private void handleStep(int stepNumber, PreDetectionParam param,SocketMsg xiSocket) { + switch (stepNumber) { + case 0: + sendModifyCoefficientCommand(param, xiSocket); + break; + case 1: + handleSmallVoltageStep(param,xiSocket); + break; + case 2: + handleBigVoltageStep(param,xiSocket); + break; + case 3: + handleFinalStep(param); + break; + } + } + /** - * 系数校验 + * 修改系数命令下发 */ + private void sendModifyCoefficientCommand(PreDetectionParam param,SocketMsg xiSocket) { + xiSocket.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue()); + xiSocket.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$02.getValue()); + xiSocket.setData(JSON.toJSONString(XiNumberManager.devXiNumDataMap.get(XiNumberManager.devXiList.get(0)))); + SocketManager.sendMsg(param.getUserPageId() + handlerStr, JSON.toJSONString(xiSocket)); + } + + private void handleSmallVoltageStep(PreDetectionParam param,SocketMsg xiSocket) { + System.out.println("进入小电压步骤》》》》》》》》》》》》》》》》》》》》》》》》"); + double limit = 0.1; + XiNumberManager.smallDevXiNumDataMap.forEach((devIp, devXiNumDataSmall) -> { + boolean flag = checkCoefficientDifference(devIp, devXiNumDataSmall, limit); + if (flag) { + XiNumberManager.devXiList.removeIf(it -> it.equals(devIp)); + } + }); + + //如果差距超过10%则再次下发系数 + if (CollUtil.isNotEmpty(XiNumberManager.devXiList)) { + xiSocket.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$02.getValue()); + xiSocket.setData(JSON.toJSONString(XiNumberManager.devXiNumDataMap.get(XiNumberManager.devXiList.get(0)))); + SocketManager.sendMsg(param.getUserPageId() + handlerStr, JSON.toJSONString(xiSocket)); + } else { + //存在小电压系数在误差范围内情况,直接结束。 + sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_end.getValue(), XiNumberManager.devParameterList.get(1)); + sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.big_comp_start.getValue(), XiNumberManager.devParameterList.get(0)); + //小电流系数下发完毕;开始重新测试一次大电压 + xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); + xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(0))); + SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); + XiNumberManager.stepNumber = 2; + FormalTestManager.realDataXiList.clear(); + successComm.clear(); + } + } + + + private void handleBigVoltageStep(PreDetectionParam param,SocketMsg xiSocket){ + //大电压处理 + sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.big_comp_end.getValue(), XiNumberManager.devParameterList.get(0)); + sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_comp_start.getValue(), XiNumberManager.devParameterList.get(1)); + + xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); + xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(1))); + SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); + XiNumberManager.stepNumber = 3; + FormalTestManager.realDataXiList.clear(); + successComm.clear(); + } + + private void handleFinalStep(PreDetectionParam param){ + sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_comp_end.getValue(), XiNumberManager.devParameterList.get(1)); + System.out.println("-------------------------已经全部结束----------------------"); + CnSocketUtil.quitSend(param); + //修改设备表Factor_Check_Result字段 + XiNumberManager.devXiNumDataMap.forEach((key, val) -> { + DevXiNumData small = XiNumberManager.smallDevXiNumDataMap.get(key); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(PqDev::getId, FormalTestManager.devIdMapComm.get(key)); + if (val.getResultFlag() == 0 || small.getResultFlag() == 0) { + updateWrapper.set(PqDev::getFactorCheckResult, 0); + } else { + updateWrapper.set(PqDev::getFactorCheckResult, 1); + } + iPqDevService.update(updateWrapper); + updateWrapper.clear(); + }); + } + + + private boolean checkCoefficientDifference(String devIp, DevXiNumData devXiNumDataSmall, double limit) { + boolean flag = true; + DevXiNumData devXiNumDataBig = XiNumberManager.devXiNumDataMap.get(devIp); + Map gfMapSmall = devXiNumDataSmall.getGf().stream().collect(Collectors.toMap(DevXiNumData.GF::getUMonitorPoint, Function.identity())); + + for (DevXiNumData.GF bigGf : devXiNumDataBig.getGf()) { + DevXiNumData.F smallF = gfMapSmall.get(bigGf.getUMonitorPoint()).getF(); + DevXiNumData.F bigF = bigGf.getF(); + + boolean ia = isWithinTenPercent(smallF.getIa_gain(), bigF.getIa_gain(), limit); + boolean ib = isWithinTenPercent(smallF.getIb_gain(), bigF.getIb_gain(), limit); + boolean ic = isWithinTenPercent(smallF.getIc_gain(), bigF.getIc_gain(), limit); + boolean va = isWithinTenPercent(smallF.getUa_gain(), bigF.getUa_gain(), limit); + boolean vb = isWithinTenPercent(smallF.getUb_gain(), bigF.getUb_gain(), limit); + boolean vc = isWithinTenPercent(smallF.getUc_gain(), bigF.getUc_gain(), limit); + if (!(ia && ib && ic && va && vb && vc)) { + flag = false; + adjustCoefficients(smallF, bigF); + } + } + return flag; + } + + /** + * 当小电压系数和大电压系数的差距超过 10% 时,对大电压系数进行调整,调整的方式是取小电压系数和大电压系数的平均值。 + */ + private void adjustCoefficients(DevXiNumData.F smallF, DevXiNumData.F bigF) { + if (!isWithinTenPercent(smallF.getIa_gain(), bigF.getIa_gain(), 0.1)) { + bigF.setIa_gain((smallF.getIa_gain() + bigF.getIa_gain()) / 2); + } + if (!isWithinTenPercent(smallF.getIb_gain(), bigF.getIb_gain(), 0.1)) { + bigF.setIb_gain((smallF.getIb_gain() + bigF.getIb_gain()) / 2); + } + if (!isWithinTenPercent(smallF.getIc_gain(), bigF.getIc_gain(), 0.1)) { + bigF.setIc_gain((smallF.getIc_gain() + bigF.getIc_gain()) / 2); + } + if (!isWithinTenPercent(smallF.getUa_gain(), bigF.getUa_gain(), 0.1)) { + bigF.setUa_gain((smallF.getUa_gain() + bigF.getUa_gain()) / 2); + } + if (!isWithinTenPercent(smallF.getUb_gain(), bigF.getUb_gain(), 0.1)) { + bigF.setUb_gain((smallF.getUb_gain() + bigF.getUb_gain()) / 2); + } + if (!isWithinTenPercent(smallF.getUc_gain(), bigF.getUc_gain(), 0.1)) { + bigF.setUc_gain((smallF.getUc_gain() + bigF.getUc_gain()) / 2); + } + } + + + private void processDeviceData(String devIp, List dataList,PreDetectionParam param) { + AtomicBoolean xiFlag = new AtomicBoolean(true); + XiNumberManager.devXiList.add(devIp); + + DevXiNumData startXiData = XiNumberManager.devXiNumDataMap.get(devIp); + Map gfMap = startXiData.getGf().stream().collect(Collectors.toMap(DevXiNumData.GF::getUMonitorPoint, Function.identity())); + Map> monitorMap = dataList.stream().collect(Collectors.groupingBy(DevData::getId)); + + List gf = new ArrayList<>(); + monitorMap.forEach((monitorId, list) -> { + CoefficientVO coefficientVO = createCoefficientVO(monitorId); + DevXiNumData.F F = new DevXiNumData.F(); + CoefficientVO.DevParameter devParameter = getDevParameter(); + + assemblyEntity(list, F, gfMap.get(Integer.parseInt(monitorId.split(splitTag)[1]) - 1), coefficientVO, devParameter); + if (Objects.nonNull(coefficientVO.getResultFlag()) && coefficientVO.getResultFlag() == 0) { + xiFlag.set(false); + } + + DevXiNumData.GF gfItem = createGFItem(monitorId, F); + gf.add(gfItem); + //表格数据 + CnSocketUtil.sendToWebSocket(param.getUserPageId(),SourceOperateCodeEnum.Coefficient_Check.getValue(),SourceOperateCodeEnum.DATA_CHNFACTOR$02.getValue(),coefficientVO,null); + }); + + DevXiNumData devXiNumData = createDevXiNumData(devIp, gf, xiFlag.get()); + saveDevXiNumData(devIp, devXiNumData); + } + + private CoefficientVO createCoefficientVO(String monitorId) { + CoefficientVO coefficientVO = new CoefficientVO(); + String[] splitStr = monitorId.split(splitTag); + if (XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 2) { + coefficientVO.setType("big"); + } else { + coefficientVO.setType("small"); + } + coefficientVO.setMonitorNum(splitStr[1]); + coefficientVO.setDevName(FormalTestManager.devNameMapComm.get(splitStr[0])); + coefficientVO.setDesc((XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 1) ? "系数下装" : "系数校准"); + return coefficientVO; + } + + private CoefficientVO.DevParameter getDevParameter() { + return (XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 2) ? XiNumberManager.devParameterList.get(0) : XiNumberManager.devParameterList.get(1); + } + + private DevXiNumData.GF createGFItem(String monitorId, DevXiNumData.F F) { + DevXiNumData.GF gfItem = new DevXiNumData.GF(); + gfItem.setUMonitorPoint(Integer.parseInt(monitorId.split(splitTag)[1]) - 1); + gfItem.setF(F); + return gfItem; + } + + private DevXiNumData createDevXiNumData(String devIp, List gf, boolean xiFlag) { + DevXiNumData devXiNumData = new DevXiNumData(); + devXiNumData.setChnNum(0); + devXiNumData.setDevIP(devIp); + devXiNumData.setGf(gf); + devXiNumData.setResultFlag(xiFlag ? 1 : 0); + return devXiNumData; + } + + private void saveDevXiNumData(String devIp, DevXiNumData devXiNumData) { + if (XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 2) { + XiNumberManager.devXiNumDataMap.put(devIp, devXiNumData); + } else if (XiNumberManager.stepNumber == 1 || XiNumberManager.stepNumber == 3) { + XiNumberManager.smallDevXiNumDataMap.put(devIp, devXiNumData); + } + } /** @@ -466,7 +539,7 @@ public class SocketDevResponseService { } - private void assemblyEntity(List deList, DevXiNumData.F F, CoefficientVO coefficientVO, CoefficientVO.DevParameter devParameter) { + private void assemblyEntity(List deList, DevXiNumData.F F, DevXiNumData.GF startF, CoefficientVO coefficientVO, CoefficientVO.DevParameter devParameter) { //表示接收完成,必须保证10个数 if (deList.size() >= 10) { @@ -494,12 +567,12 @@ public class SocketDevResponseService { coefficientVO.setCIeData(String.valueOf(optionalIC)); if (XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 1) { - Integer aXi = (int) ((2 - (optionalA / devParameter.getDevVolt())) * 10000); - Integer bXi = (int) ((2 - (optionalB / devParameter.getDevVolt())) * 10000); - Integer cXi = (int) ((2 - (optionalC / devParameter.getDevVolt())) * 10000); - Integer aIXi = (int) ((2 - (optionalIA / devParameter.getDevCurr())) * 10000); - Integer bIXi = (int) ((2 - (optionalIB / devParameter.getDevCurr())) * 10000); - Integer cIXi = (int) ((2 - (optionalIC / devParameter.getDevCurr())) * 10000); + Integer aXi = (int) (devParameter.getDevVolt() * startF.getF().getUa_gain() / optionalA); + Integer bXi = (int) (devParameter.getDevVolt() * startF.getF().getUb_gain() / optionalB); + Integer cXi = (int) (devParameter.getDevVolt() * startF.getF().getUc_gain() / optionalC); + Integer aIXi = (int) (devParameter.getDevCurr() * startF.getF().getIa_gain() / optionalIA); + Integer bIXi = (int) (devParameter.getDevCurr() * startF.getF().getIb_gain() / optionalIB); + Integer cIXi = (int) (devParameter.getDevCurr() * startF.getF().getIc_gain() / optionalIC); coefficientVO.setAVuXi(aXi.toString()); coefficientVO.setBVuXi(bXi.toString()); @@ -515,7 +588,7 @@ public class SocketDevResponseService { F.setIb_gain(bIXi); F.setIc_gain(cIXi); } else { - double vLimit = 0.1 * devParameter.getDevVolt() / 100; + double vLimit = 0.1 / 100 * devParameter.getDevVolt(); double iLimit = 0.005; coefficientVO.setAVuXi(isWithinTenPercent(optionalA, devParameter.getDevVolt(), vLimit) ? "合格" : "不合格"); coefficientVO.setBVuXi(isWithinTenPercent(optionalB, devParameter.getDevVolt(), vLimit) ? "合格" : "不合格"); @@ -731,7 +804,7 @@ public class SocketDevResponseService { //告诉前端当前项开始了 - WebSocketVO webSocketVO = new WebSocketVO(); + WebSocketVO webSocketVO = new WebSocketVO<>(); webSocketVO.setRequestId(sourceIssues.get(0).getType() + stepBegin); webSocketVO.setDesc(null); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); @@ -864,10 +937,17 @@ public class SocketDevResponseService { webSocketVO.setData(XiNumberManager.devParameterList.get(0)); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); + //下发命令获取所有装置通道系数,首先需要获取所有装置,通过所有装置下发获取系数命令,目前只支持单台装置获取系数 socketMsg.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue()); - socketMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); - socketMsg.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(0))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(socketMsg)); + socketMsg.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$01.getValue()); + PreDetection preDetection = XiNumberManager.xiDevList.get(0); + Map map = new HashMap<>(); + map.put("devIP", preDetection.getDevIP()); + map.put("chnNum", preDetection.getDevChns()); + socketMsg.setData(JSON.toJSONString(map)); + SocketManager.sendMsg(param.getUserPageId() + handlerStr, JSON.toJSONString(socketMsg)); + + XiNumberManager.stepNumber = 0; XiNumberManager.devXiList.clear(); @@ -919,11 +999,11 @@ public class SocketDevResponseService { switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: - realDataXiList.add(devData); + FormalTestManager.realDataXiList.add(devData); successComm.add(devData.getId()); if (SocketManager.clockMap.containsKey(sourceIssue.getIndex())) { - SocketManager.clockMap.put(sourceIssue.getIndex(), 0L); + // SocketManager.clockMap.put(sourceIssue.getIndex(), 0L); } if (successComm.size() == FormalTestManager.monitorIdListComm.size()) { @@ -931,10 +1011,10 @@ public class SocketDevResponseService { //修改装置为监测中 adPlanService.updateTestState(param.getPlanId(), param.getDevIds()); //开启线程进行入库原始数据操作 - baseDataInsert(realDataXiList, sourceIssue, param, SocketManager.valueTypeMap); + baseDataInsert(FormalTestManager.realDataXiList, sourceIssue, param, SocketManager.valueTypeMap); //调用判断方法 - Map textResult = detectionServiceImpl.processing(realDataXiList, param, FormalTestManager.devIdMapComm, sourceIssue, dataRule); + Map textResult = detectionServiceImpl.processing(FormalTestManager.realDataXiList, param, FormalTestManager.devIdMapComm, sourceIssue, dataRule); //组装实体推送给前台 assWebJson(param, textResult, socketDataMsg, sourceIssue); @@ -973,7 +1053,7 @@ public class SocketDevResponseService { FormalTestManager.stopTime = 0; FormalTestManager.hasStopFlag = true; successComm.clear(); - realDataXiList.clear(); + FormalTestManager.realDataXiList.clear(); sendWebSocket(param.getUserPageId(), "preStopTest", "stop", null); return; } @@ -1002,7 +1082,7 @@ public class SocketDevResponseService { CnSocketUtil.quitSend(param); } successComm.clear(); - realDataXiList.clear(); + FormalTestManager.realDataXiList.clear(); } break; @@ -1011,7 +1091,7 @@ public class SocketDevResponseService { break; case NORMAL_RESPONSE: - realDataXiList.add(devData); + FormalTestManager.realDataXiList.add(devData); break; case DEV_ERROR: @@ -1031,6 +1111,41 @@ public class SocketDevResponseService { } +/* + private void processData(List FormalTestManager.realDataXiList, List successComm, SourceIssue sourceIssue, PreDetectionParam param, SocketDataMsg socketDataMsg, Object dataRule, String handlerSourceStr) { + if (SocketManager.clockMap.containsKey(sourceIssue.getIndex())) { + SocketManager.clockMap.put(sourceIssue.getIndex(), 0L); + } + + if (successComm.size() == FormalTestManager.monitorIdListComm.size()) { + System.out.println(sourceIssue.getType() + stepTag + sourceIssue.getIndex() + "当前测试小项读取数据已经全部结束。。。。。。。。。"); + handleSmallItemCompletion(FormalTestManager.realDataXiList, sourceIssue, param, socketDataMsg, dataRule); + if (handlePauseCondition(param, successComm, FormalTestManager.realDataXiList)) { + return; + } + startNextDetection(sourceIssue, param, socketDataMsg, handlerSourceStr); + successComm.clear(); + FormalTestManager.realDataXiList.clear(); + } + } + + private static void handleSmallItemCompletion(List FormalTestManager.realDataXiList, SourceIssue sourceIssue, PreDetectionParam param, SocketDataMsg socketDataMsg, Object dataRule) { + adPlanService.updateTestState(param.getPlanId(), param.getDevIds()); + baseDataInsertService.insert(FormalTestManager.realDataXiList, sourceIssue, param, SocketManager.valueTypeMap); + Map textResult = detectionServiceImpl.processing(FormalTestManager.realDataXiList, param, FormalTestManager.devIdMapComm, sourceIssue, dataRule); + assWebJson(param, textResult, socketDataMsg, sourceIssue); + SocketManager.delSource(sourceIssue.getIndex()); + System.out.println("当前小项结束进行删除============" + sourceIssue.getType() + stepTag + sourceIssue.getIndex()); + long residueCount = SocketManager.getSourceTarget(sourceIssue.getType()) - 1; + SocketManager.addTargetMap(sourceIssue.getType(), residueCount); + System.out.println("该大项还有" + residueCount + "个小项没有进行检测!!!!!!!!"); + if (residueCount == 0) { + handleLargeItemCompletion(sourceIssue, param, socketDataMsg); + } + } +*/ + + /** * 组装实体推送给前端 */ @@ -1107,7 +1222,7 @@ public class SocketDevResponseService { case QUIT_INIT_01: //关闭所有 SocketManager.removeUser(s); - CnSocketUtil.quitSendSource(param); + // CnSocketUtil.quitSendSource(param); break; case QUIT_INIT_02: socketMsg.setRequestId(SourceOperateCodeEnum.QUITE.getValue()); @@ -1274,7 +1389,7 @@ public class SocketDevResponseService { /** * 判断相角(-180° ~ 180°) - * (+360° ~ -360°) + * (+360° ~ -360°) * * @param channelListDTO 源下发角度 * @param devPhase 装置返回角度 @@ -1309,7 +1424,7 @@ public class SocketDevResponseService { */ public void initRestart() { this.successComm.clear(); - this.realDataXiList.clear(); + FormalTestManager.realDataXiList.clear(); } @@ -1330,7 +1445,7 @@ public class SocketDevResponseService { //初始化相序集合 this.devInfo.clear(); this.devDataMap.clear(); - this.realDataXiList.clear(); + FormalTestManager.realDataXiList.clear(); this.targetTestMap.clear(); List pqDevList = iPqDevService.getDevInfo(param.getDevIds()); @@ -1493,9 +1608,7 @@ public class SocketDevResponseService { Class example = (Class) adHarmonicResult.getClass(); for (int i = 2; i <= 50; i++) { - // 通过反射设置name字段的值 try { - // 假设这些字段已经以正确的方式定义在AdHarmonicResult类中 Field aField = example.getDeclaredField("aValue" + i); Field bField = example.getDeclaredField("bValue" + i); Field cField = example.getDeclaredField("cValue" + i); @@ -1552,9 +1665,7 @@ public class SocketDevResponseService { private LocalDateTime timeFormat(String dateTimeStr, DateTimeFormatter formatter) { try { - // 假设输入是UTC时间,将其解析为ZonedDateTime ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTimeStr, formatter.withZone(ZoneId.of("UTC"))); - // 将ZonedDateTime转换为LocalDateTime(去除时区信息) LocalDateTime localDateTime = zonedDateTime.toLocalDateTime(); return localDateTime; } catch (DateTimeParseException e) { diff --git a/detection/src/main/java/com/njcn/gather/detection/handler/SocketSourceResponseService.java b/detection/src/main/java/com/njcn/gather/detection/handler/SocketSourceResponseService.java index 98775fad..e102cf6c 100644 --- a/detection/src/main/java/com/njcn/gather/detection/handler/SocketSourceResponseService.java +++ b/detection/src/main/java/com/njcn/gather/detection/handler/SocketSourceResponseService.java @@ -10,10 +10,7 @@ import com.njcn.gather.detection.pojo.vo.DevLineTestResult; import com.njcn.gather.detection.pojo.vo.SocketDataMsg; import com.njcn.gather.detection.pojo.vo.SocketMsg; import com.njcn.gather.detection.pojo.vo.WebSocketVO; -import com.njcn.gather.detection.util.socket.CnSocketUtil; -import com.njcn.gather.detection.util.socket.MsgUtil; -import com.njcn.gather.detection.util.socket.SocketManager; -import com.njcn.gather.detection.util.socket.WebServiceManager; +import com.njcn.gather.detection.util.socket.*; import com.njcn.gather.detection.util.socket.cilent.NettyClient; import com.njcn.gather.detection.util.socket.cilent.NettyDevClientHandler; import com.njcn.gather.device.pojo.vo.PreDetection; @@ -83,7 +80,6 @@ public class SocketSourceResponseService { break; case YXT: break; - } } else { System.out.println("fggggggggggggggggggggg" + enumByCode); @@ -116,7 +112,6 @@ public class SocketSourceResponseService { socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); - break; case UNPROCESSED_BUSINESS: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); @@ -166,6 +161,7 @@ public class SocketSourceResponseService { case SOURCE_CONNECTION_ERROR: CnSocketUtil.quitSendSource(param); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); + break; case CONTROLLED_SOURCE_ERROR: CnSocketUtil.quitSendSource(param); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); @@ -361,6 +357,7 @@ public class SocketSourceResponseService { this.monitorIdList = devList.stream().flatMap(x -> x.getMonitorList().stream()) .map(PreDetection.MonitorListDTO::getLineId) .collect(Collectors.toList()); + XiNumberManager.xiDevList = devList; } } diff --git a/detection/src/main/java/com/njcn/gather/detection/service/impl/PreDetectionServiceImpl.java b/detection/src/main/java/com/njcn/gather/detection/service/impl/PreDetectionServiceImpl.java index b1ecadc6..dd4a0a5f 100644 --- a/detection/src/main/java/com/njcn/gather/detection/service/impl/PreDetectionServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/detection/service/impl/PreDetectionServiceImpl.java @@ -18,9 +18,11 @@ import com.njcn.gather.detection.util.socket.CnSocketUtil; import com.njcn.gather.detection.util.socket.FormalTestManager; import com.njcn.gather.detection.util.socket.SocketManager; import com.njcn.gather.detection.util.socket.cilent.NettyClient; +import com.njcn.gather.detection.util.socket.cilent.NettyDevClientHandler; import com.njcn.gather.detection.util.socket.cilent.NettySourceClientHandler; import com.njcn.gather.device.pojo.enums.DevResponseEnum; import com.njcn.gather.device.pojo.po.PqDev; +import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.device.service.IPqDevService; import com.njcn.gather.script.pojo.param.PqScriptCheckDataParam; import com.njcn.gather.script.pojo.po.SourceIssue; @@ -36,16 +38,20 @@ import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum; import com.njcn.gather.system.dictionary.service.IDictDataService; import io.netty.channel.Channel; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Service @RequiredArgsConstructor +@Slf4j public class PreDetectionServiceImpl implements PreDetectionService { private final String source = "_Source"; @@ -62,10 +68,10 @@ public class PreDetectionServiceImpl implements PreDetectionService { private final SocketSourceResponseService socketSourceResponseService; private final IPqScriptCheckDataService iPqScriptCheckDataService; - @Value("${socket.source.ip:192.168.1.136}") + @Value("${socket.source.ip:192.168.1.138}") private String ip; - @Value("${socket.source.port:10086}") + @Value("${socket.source.port:61000}") private Integer port; private final SocketSourceResponseService sourceResponseService; @@ -138,12 +144,11 @@ public class PreDetectionServiceImpl implements PreDetectionService { //开始组装socket报文请求头 socketDevResponseService.initList(param); socketSourceResponseService.initList(param); - SocketMsg msg = new SocketMsg<>(); - msg.setRequestId(SourceOperateCodeEnum.YJC_YTXJY.getValue()); - msg.setOperateCode(SourceOperateCodeEnum.INIT_GATHER.getValue()); - msg.setData(JSON.toJSONString(sourceParam)); - - NettyClient.socketClient(ip, port, param, JSON.toJSONString(msg), new NettySourceClientHandler(param, sourceResponseService)); + SocketMsg socketMsg = new SocketMsg<>(); + socketMsg.setRequestId(SourceOperateCodeEnum.YJC_YTXJY.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.INIT_GATHER.getValue()); + socketMsg.setData(JSON.toJSONString(sourceParam)); + NettyClient.socketClient(ip, port, param, JSON.toJSONString(socketMsg), new NettySourceClientHandler(param, sourceResponseService)); } else { throw new BusinessException(DetectionResponseEnum.SOURCE_INFO_NOT); } @@ -170,6 +175,7 @@ public class PreDetectionServiceImpl implements PreDetectionService { @Override public boolean restartTemTest(PreDetectionParam param) { FormalTestManager.stopFlag = false; + socketDevResponseService.initRestart(); List sourceIssueList = SocketManager.getSourceList(); if (CollUtil.isNotEmpty(sourceIssueList)) { SourceIssue sourceIssues = SocketManager.getSourceList().get(0); @@ -199,23 +205,29 @@ public class PreDetectionServiceImpl implements PreDetectionService { */ private void specialDeal(PreDetectionParam param) { Channel channel = SocketManager.getChannelByUserId(param.getUserPageId() + source); + Channel channelDev = SocketManager.getChannelByUserId(param.getUserPageId() + dev); if (Objects.nonNull(channel) && channel.isActive()) { - System.out.println("进入关闭源。。//////"); + System.out.println("发送关闭源指令。。。。。。。。"); CnSocketUtil.quitSendSource(param); + } + if(Objects.nonNull(channelDev) && channelDev.isActive()){ + System.out.println("发送关闭设备通讯指令。。。。。。。。"); + CnSocketUtil.quitSend(param); + } - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - SocketManager.removeUser(param.getUserPageId() + source); - SocketManager.removeUser(param.getUserPageId() + dev); + try { + Thread.sleep(4000); + } catch (InterruptedException e) { + log.error(e.getMessage()); + } - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } + SocketManager.removeUser(param.getUserPageId() + source); + SocketManager.removeUser(param.getUserPageId() + dev); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + log.error(e.getMessage()); } } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/FormalTestManager.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/FormalTestManager.java index 93a8603a..f5888ce0 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/FormalTestManager.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/FormalTestManager.java @@ -1,5 +1,6 @@ package com.njcn.gather.detection.util.socket; +import com.njcn.gather.detection.pojo.po.DevData; import com.njcn.gather.device.pojo.vo.PreDetection; import java.util.ArrayList; @@ -33,7 +34,8 @@ public class FormalTestManager { - + //用于存储所有测点的试试数据 + public static List realDataXiList = new ArrayList<>(); /** diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/WebServiceManager.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/WebServiceManager.java index a64fd709..88a2c20b 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/WebServiceManager.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/WebServiceManager.java @@ -35,7 +35,7 @@ public class WebServiceManager { Iterator> iterator = userSessions.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = iterator.next(); - if (entry.getValue().id().equals(channelId)) { + if (entry.getValue().id().toString().equals(channelId)) { iterator.remove(); } } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/XiNumberManager.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/XiNumberManager.java index 23489bf6..02e69744 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/XiNumberManager.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/XiNumberManager.java @@ -2,6 +2,7 @@ package com.njcn.gather.detection.util.socket; import com.njcn.gather.detection.pojo.dto.DevXiNumData; import com.njcn.gather.detection.pojo.vo.CoefficientVO; +import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.script.pojo.po.SourceIssue; import java.util.ArrayList; @@ -27,7 +28,7 @@ public class XiNumberManager { public static List devXiList = new ArrayList<>(); /** - * 存储所有测点的大电压系数 + * 最开始存储装置通道原始系数,后续存储大电压计算出来的系数 */ public static Map devXiNumDataMap = new ConcurrentHashMap<>(); @@ -47,5 +48,13 @@ public class XiNumberManager { + /** + * 因为只支持单台装置获取系数,用于记录未获取到系数的装置,获取到一个删除一个 + */ + public static List xiDevList = new ArrayList<>(); + + + + } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/HeartbeatHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/HeartbeatHandler.java new file mode 100644 index 00000000..ee3d80aa --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/HeartbeatHandler.java @@ -0,0 +1,120 @@ +package com.njcn.gather.detection.util.socket.cilent; + +import com.alibaba.fastjson.JSON; +import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; +import com.njcn.gather.detection.pojo.param.PreDetectionParam; +import com.njcn.gather.detection.pojo.vo.SocketDataMsg; +import com.njcn.gather.detection.pojo.vo.SocketMsg; +import com.njcn.gather.detection.util.socket.CnSocketUtil; +import com.njcn.gather.detection.util.socket.MsgUtil; +import com.njcn.gather.detection.util.socket.SocketManager; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelDuplexHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDateTime; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * @Author: cdf + * @CreateTime: 2025-02-11 + * @Description: 心跳处理类 + */ + + +public class HeartbeatHandler extends SimpleChannelInboundHandler { + private final ScheduledExecutorService heartbeatExecutor = Executors.newScheduledThreadPool(1); + + private final String dev = "_Dev"; + private final String sourceTag = "_Source"; + + private final PreDetectionParam param; + private final String handlerType; + + // 允许连续未收到心跳响应的最大次数 + private static final int MAX_HEARTBEAT_MISSES = 3; + // 连续未收到心跳响应的次数 + private int consecutiveHeartbeatMisses = 0; + + + public HeartbeatHandler(PreDetectionParam param,String type){ + this.param = param; + this.handlerType = type; + } + + + @Override + public void channelActive(ChannelHandlerContext ctx) { + // 启动心跳定时任务 + scheduleHeartbeat(ctx); + ctx.fireChannelActive(); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + heartbeatExecutor.shutdown(); + super.channelInactive(ctx); + } + + // 每30秒发送一次心跳 + private void scheduleHeartbeat(ChannelHandlerContext ctx) { + heartbeatExecutor.scheduleAtFixedRate(() -> { + if (ctx.channel().isActive()) { + // 发送心跳包 + SocketMsg msg = new SocketMsg<>(); + msg.setRequestId("yxt"); + msg.setOperateCode(SourceOperateCodeEnum.HEARTBEAT.getValue()); + msg.setData(""); + ctx.channel().writeAndFlush(JSON.toJSONString(msg)+"\n"); + + System.out.println(handlerType+"♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥send"+LocalDateTime.now()); + consecutiveHeartbeatMisses++; + if (consecutiveHeartbeatMisses >= MAX_HEARTBEAT_MISSES) { + // 连续三次未收到心跳响应,断开连接 + System.out.println(handlerType+"连续三次未收到心跳响应,断开连接"); + if (dev.equals(handlerType)) { + //CnSocketUtil.sendToWebSocket(param.getUserPageId(),); + CnSocketUtil.quitSend(param); + } else { + CnSocketUtil.quitSendSource(param); + } + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.err.println("线程中断异常: " + e.getMessage()); + } + String key = dev.equals(handlerType) ? param.getUserPageId() + dev : param.getUserPageId() + sourceTag; + SocketManager.removeUser(key); + consecutiveHeartbeatMisses = 0; // 重置连续心跳丢失次数 + } + } + }, 3, 10, TimeUnit.SECONDS); + } + + + + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + // 过滤心跳包,避免进入业务逻辑 + if (isHeartbeatPacket(msg)) { + System.out.println(handlerType+"♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥response"+LocalDateTime.now()); + consecutiveHeartbeatMisses = 0; + return; + } + // 处理业务数据 + ctx.fireChannelRead(msg); + + } + + private boolean isHeartbeatPacket(String msg) { + // 判断是否为心跳包 + SocketDataMsg socketDataMsg = MsgUtil.socketDataMsg(msg); + return socketDataMsg.getOperateCode().equals(SourceOperateCodeEnum.HEARTBEAT.getValue()); + } +} diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyClient.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyClient.java index 024207cd..de88bdb6 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyClient.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyClient.java @@ -31,6 +31,9 @@ import java.util.concurrent.TimeUnit; @Getter public class NettyClient { + private static final String dev = "_Dev"; + private static final String source = "_Source"; + public static void socketClient(String ip, Integer port, PreDetectionParam param, String msg, SimpleChannelInboundHandler handler) { NioEventLoopGroup group = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); @@ -46,18 +49,21 @@ public class NettyClient { //空闲状态的handler // 添加LineBasedFrameDecoder来按行分割数据 .addLast(new LineBasedFrameDecoder(10240)) - .addLast(new IdleStateHandler(0, 10, 0, TimeUnit.SECONDS)) + // .addLast(new IdleStateHandler(0, 10, 0, TimeUnit.SECONDS)) .addLast(new StringDecoder(CharsetUtil.UTF_8)) .addLast(new StringEncoder(CharsetUtil.UTF_8)) + .addLast(new HeartbeatHandler(param,source)) .addLast(handler); } else { ch.pipeline() - //空闲状态的handler + // 添加LineBasedFrameDecoder来按行分割数据 .addLast(new LineBasedFrameDecoder(10240)) - .addLast(new IdleStateHandler(60, 0, 0, TimeUnit.SECONDS)) .addLast(new StringDecoder(CharsetUtil.UTF_8)) .addLast(new StringEncoder(CharsetUtil.UTF_8)) + .addLast(new HeartbeatHandler(param,dev)) + //空闲状态的handler + .addLast(new IdleStateHandler(60, 0, 0, TimeUnit.SECONDS)) .addLast(handler); } @@ -69,7 +75,7 @@ public class NettyClient { System.out.println("链接服务端失败..."); } else { System.out.println("链接服务端成功..."); - System.out.println("客户端向服务端发送消息:"+msg); + System.out.println("客户端向服务端发送消息:"+port+msg); channelFuture.channel().writeAndFlush(msg+"\n"); } }); @@ -78,9 +84,9 @@ public class NettyClient { groupByUserId.shutdownGracefully(); }else{ if (handler instanceof NettySourceClientHandler) { - SocketManager.addGroup(param.getUserPageId()+"_Source",group); + SocketManager.addGroup(param.getUserPageId()+source,group); }else{ - SocketManager.addGroup(param.getUserPageId()+"_Dev",group); + SocketManager.addGroup(param.getUserPageId()+dev,group); } } } catch (Exception e) { diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyDevClientHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyDevClientHandler.java index a55d1ca9..046b79b5 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyDevClientHandler.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyDevClientHandler.java @@ -6,6 +6,8 @@ import com.njcn.gather.detection.handler.SocketDevResponseService; import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.vo.DevLineTestResult; +import com.njcn.gather.detection.pojo.vo.SocketDataMsg; +import com.njcn.gather.detection.pojo.vo.SocketMsg; import com.njcn.gather.detection.pojo.vo.WebSocketVO; import com.njcn.gather.detection.util.socket.*; import com.njcn.gather.device.pojo.vo.PreDetection; @@ -22,9 +24,12 @@ import lombok.RequiredArgsConstructor; import java.io.IOException; import java.net.ConnectException; import java.net.ProtocolException; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** @@ -102,7 +107,8 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { Boolean fly = false; if (evt instanceof IdleStateEvent) { if (((IdleStateEvent) evt).state() == IdleState.READER_IDLE) { - if(!FormalTestManager.hasStopFlag) { + System.out.println(LocalDateTime.now() + "devHandler触发读超时函数**************************************"); + if (!FormalTestManager.hasStopFlag) { if (CollUtil.isNotEmpty(SocketManager.getSourceList())) { SourceIssue sourceIssue = SocketManager.getSourceList().get(0); if (SocketManager.clockMap.containsKey(sourceIssue.getIndex())) { @@ -114,7 +120,7 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { if (sourceIssue.getType().equals(DicDataEnum.F.getCode())) { //闪变,正常抛一轮最大等待20分钟超时 if (SocketManager.clockMap.get(sourceIssue.getIndex()) > 1300) { - fly=true; + fly = true; System.out.println("超时处理-----》" + sourceIssue.getType() + "已超时----------------关闭"); CnSocketUtil.quitSend(param); timeoutSend(sourceIssue); @@ -122,37 +128,35 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { } else if (sourceIssue.getType().equals(DicDataEnum.VOLTAGE.getCode()) || sourceIssue.getType().equals(DicDataEnum.HP.getCode())) { //统计数据项,正常抛一轮数据,超时 if (SocketManager.clockMap.get(sourceIssue.getIndex()) > 180) { - fly=true; + fly = true; CnSocketUtil.quitSend(param); System.out.println("超时处理-----》" + sourceIssue.getType() + "已超时----------------关闭"); timeoutSend(sourceIssue); } - } else { //实时数据 if (SocketManager.clockMap.get(sourceIssue.getIndex()) > 60) { - fly=true; + fly = true; CnSocketUtil.quitSend(param); System.out.println("超时处理-----》" + sourceIssue.getType() + "已超时----------------关闭"); timeoutSend(sourceIssue); } } } else { - fly=true; + fly = true; //为空则认为是常规步骤,设定一分钟超时 CnSocketUtil.quitSend(param); } - if(fly){ + if (fly) { socketResponseService.backCheckState(param); } - System.out.println("已经等了一分钟了。。。。。。。。。。。。"); - }else { + } else { //如果是暂停操作后 - FormalTestManager.stopTime+=60; - System.out.println("当前进入暂停操作超时函数-----------------"+FormalTestManager.stopTime); - if(FormalTestManager.stopTime > 600){ + FormalTestManager.stopTime += 60; + System.out.println("当前进入暂停操作超时函数-----------------" + FormalTestManager.stopTime); + if (FormalTestManager.stopTime > 600) { CnSocketUtil.quitSend(param); - CnSocketUtil.sendToWebSocket(param.getUserPageId(),SourceOperateCodeEnum.FORMAL_REAL.getValue(),SourceOperateCodeEnum.STOP_TIMEOUT.getValue(),SourceOperateCodeEnum.STOP_TIMEOUT.getMsg(),null); + CnSocketUtil.sendToWebSocket(param.getUserPageId(), SourceOperateCodeEnum.FORMAL_REAL.getValue(), SourceOperateCodeEnum.STOP_TIMEOUT.getValue(), SourceOperateCodeEnum.STOP_TIMEOUT.getMsg(), null); } } } @@ -162,8 +166,6 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { } - - @Override public void handlerAdded(ChannelHandlerContext ctx) { System.out.println("有通道准备接入" + ctx.channel()); @@ -183,7 +185,7 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { } else if (cause instanceof IOException) { // 处理I/O异常,例如读写错误 System.out.println("IOException caught: There was an I/O error."); - CnSocketUtil.sendToWebSocket(param.getUserPageId(),SourceOperateCodeEnum.SERVER_ERROR.getValue(),SourceOperateCodeEnum.SERVER_ERROR.getValue(),SourceOperateCodeEnum.SERVER_ERROR.getMsg(),null ); + CnSocketUtil.sendToWebSocket(param.getUserPageId(), SourceOperateCodeEnum.SERVER_ERROR.getValue(), SourceOperateCodeEnum.SERVER_ERROR.getValue(), SourceOperateCodeEnum.SERVER_ERROR.getMsg(), null); // 例如,可以记录更详细的I/O错误信息 } else if (cause instanceof TimeoutException) { @@ -206,9 +208,26 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { /** - * + * 发送业务消息时候开启计时器, + * @param requestId */ - private void timeoutSend(SourceIssue sourceIssue){ +/* private void scheduleTimeoutTask(String requestId) { + ScheduledFuture future = scheduler.schedule(() -> { + if (requestTimeoutTasks.containsKey(requestId)) { + // 处理超时逻辑 + System.out.println("Business request with ID " + requestId + " timed out."); + requestTimeoutTasks.remove(requestId); + ctx.close(); + } + }, BUSINESS_REQUEST_TIMEOUT, TimeUnit.MILLISECONDS); + requestTimeoutTasks.put(requestId, future); + }*/ + + + /** + * 超时后的处理 + */ + private void timeoutSend(SourceIssue sourceIssue) { List devListRes = new ArrayList<>(); FormalTestManager.devList.forEach(dev -> { DevLineTestResult devLineTestResult = new DevLineTestResult(); @@ -221,7 +240,7 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { devListRes.add(devLineTestResult); }); WebSocketVO> socketVO = new WebSocketVO<>(); - socketVO.setRequestId(sourceIssue.getType()+"_End"); + socketVO.setRequestId(sourceIssue.getType() + "_End"); socketVO.setOperateCode(sourceIssue.getType()); socketVO.setData(devListRes); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketVO)); diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettySourceClientHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettySourceClientHandler.java index bb8c488f..398d978a 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettySourceClientHandler.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettySourceClientHandler.java @@ -95,11 +95,11 @@ public class NettySourceClientHandler extends SimpleChannelInboundHandler msg = new SocketMsg<>(); msg.setRequestId("yxt"); msg.setOperateCode(SourceOperateCodeEnum.HEARTBEAT.getValue()); msg.setData(""); - ctx.writeAndFlush(JSON.toJSONString(msg)+"\n"); + ctx.writeAndFlush(JSON.toJSONString(msg)+"\n");*/ } } else { //防止堆栈溢出 @@ -126,6 +126,7 @@ public class NettySourceClientHandler extends SimpleChannelInboundHandler { + + private final String DEV = "_Dev"; + private final String source = "_Source"; + + private final String stepTag = "&&"; + private final String stepBegin = "_Start"; + private final String stepEnd = "_End"; + + + public static final DevNettyServerHandler INSTANCE = new DevNettyServerHandler(); + + /** + * @Description: 当通道进行连接时推送消息 + * @Author: wr + * @Date: 2024/12/10 14:19 + */ + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + System.out.println("服务端监听到" + ctx.channel().id() + "连接"); + super.channelActive(ctx); + } + + /** + * 处理消息信息 + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, String msg) { + System.out.println(ctx.channel().id() + "NettyServer服务端接收到客户端消息:" + msg); + Channel channel = ctx.channel(); + SocketDataMsg socketDataMsg = MsgUtil.socketDataMsg(msg); + String[] tem = socketDataMsg.getRequestId().split(stepTag); + SourceOperateCodeEnum sourceOperateCodeEnum = SourceOperateCodeEnum.getDictDataEnumByCode(tem[0]); + + switch (Objects.requireNonNull(sourceOperateCodeEnum)) { + //设备通讯校验 + case YJC_SBTXJY: + String aa = "{\"requestId\":\"yjc_sbtxjy\",\"operateCode\":\"INIT_GATHER$01\",\"data\":null,\"code\":10201}"; + String bb = "{\"requestId\":\"yjc_sbtxjy\",\"operateCode\":\"INIT_GATHER$01\",\"data\":null,\"code\":10201}"; + String cc = "{\"requestId\":\"yjc_sbtxjy\",\"operateCode\":\"INIT_GATHER$01\",\"data\":\"192.168.1.237_1\",\"code\":10200}"; + channel.writeAndFlush(aa+"\n"); + channel.writeAndFlush(bb+"\n"); + channel.writeAndFlush(cc+"\n"); + break; + //协议校验 + case YJC_XYJY: + String dd="{\"requestId\":\"yjc_xyjy\",\"operateCode\":\"INIT_GATHER$02\",\"data\":null,\"code\":10201}"; + String ee = "{\"requestId\":\"yjc_xyjy\",\"operateCode\":\"INIT_GATHER$02\",\"data\":\"192.168.1.237_1\",\"code\":10200}"; + channel.writeAndFlush(dd+"\n"); + channel.writeAndFlush(ee+"\n"); + + String ff = "{\"requestId\":\"yjc_xyjy\",\"operateCode\":\"INIT_GATHER$03\",\"data\":null,\"code\":10201}"; + String gg ="{\"requestId\":\"yjc_xyjy\",\"operateCode\":\"INIT_GATHER$03\",\"data\":\"192.168.1.237_1\",\"code\":10200}"; + channel.writeAndFlush(ff+"\n"); + channel.writeAndFlush(gg+"\n"); + break; + //相序校验 + case YJC_XUJY: + String hh = "{\"requestId\":\"YJC_xujy\",\"operateCode\":\"DATA_REQUEST$02\",\"data\":null,\"code\":10201}"; + String ii = "{\"requestId\":\"YJC_xujy\",\"operateCode\":\"DATA_REQUEST$02\",\"data\":\"{\\\"Time\\\":\\\"2025-02-14T15:09:06.004\\\",\\\"ID\\\":\\\"192.168.1.237_1\\\",\\\"result\\\":false,\\\"SqlData\\\":[{\\\"type\\\":\\\"real\\\",\\\"desc\\\":\\\"VRMS\\\",\\\"list\\\":{\\\"A\\\":\\\"59.969920\\\",\\\"B\\\":\\\"49.963360\\\",\\\"C\\\":\\\"39.971470\\\",\\\"T\\\":null}},{\\\"type\\\":\\\"real\\\",\\\"desc\\\":\\\"VA\\\",\\\"list\\\":{\\\"A\\\":\\\"0.000000\\\",\\\"B\\\":\\\"-119.864000\\\",\\\"C\\\":\\\"120.052000\\\",\\\"T\\\":null}},{\\\"type\\\":\\\"real\\\",\\\"desc\\\":\\\"IRMS\\\",\\\"list\\\":{\\\"A\\\":\\\"1.000979\\\",\\\"B\\\":\\\"1.998939\\\",\\\"C\\\":\\\"3.000807\\\",\\\"T\\\":null}},{\\\"type\\\":\\\"real\\\",\\\"desc\\\":\\\"IA\\\",\\\"list\\\":{\\\"A\\\":\\\"-0.038000\\\",\\\"B\\\":\\\"-120.052000\\\",\\\"C\\\":\\\"119.941000\\\",\\\"T\\\":null}}],\\\"SqlDataHarm\\\":[]}\",\"code\":10200}\n"; + channel.writeAndFlush(hh+"\n"); + channel.writeAndFlush(ii+"\n"); + break; + //正式检测 + case FORMAL_REAL: + + break; + //系数校验 + case Coefficient_Check: + String a = "{\"requestId\":\"Coefficient_Check\",\"operateCode\":\"DATA_CHNFACTOR$01\",\"data\":null,\"code\":10201}"; + String b = "{\"requestId\":\"Coefficient_Check\",\"operateCode\":\"DATA_CHNFACTOR$01\",\"data\":\"[{\\\"uMonitorPoint\\\":0,\\\"f\\\":{\\\"Ua_gain\\\":9999,\\\"Ub_gain\\\":10008,\\\"Uc_gain\\\":10000,\\\"U0_gain\\\":10000,\\\"Ia_gain\\\":9997,\\\"Ib_gain\\\":9997,\\\"Ic_gain\\\":10001,\\\"I0_gain\\\":10000,\\\"Uab_gain\\\":9999,\\\"Ubc_gain\\\":10008,\\\"Uca_gain\\\":10000}}]\",\"code\":10200}"; + channel.writeAndFlush(a+"\n"); + channel.writeAndFlush(b+"\n"); + + switch (Objects.requireNonNull(sourceOperateCodeEnum)) { + case DATA_CHNFACTOR$01: + break; + } + + + break; + //退出关闭 + case QUITE: + // quitDeal(socketDataMsg, param, msg); + break; + case YXT: + break; + } + + + } + + @Override + public void handlerAdded(ChannelHandlerContext ctx) { + System.out.println("有新连接加入了++++......" + ctx.channel()); + } + + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + // Client disconnected, close the server-side channel too + System.out.println("NettyServer服务端监听到" + ctx.channel().id() + "关闭连接"); + ctx.close(); // This will trigger the close event on the server side + super.channelInactive(ctx); + } + + /** + * 用户事件的回调方法(自定义事件用于心跳机制) + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + //空闲状态的事件 +// if (evt instanceof IdleStateEvent) { +// IdleStateEvent event = (IdleStateEvent) evt; +// System.out.println(event.state() + ">>>" + ctx.channel().id()); +// //已经10秒钟没有读时间了 +// if (event.state().equals(IdleState.READER_IDLE)){ +// // 心跳包丢失,10秒没有收到客户端心跳 (断开连接) +// ctx.channel().close().sync(); +// System.out.println("已与 "+ctx.channel().remoteAddress()+" 断开连接"); +// } +// } + } + +} diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/service/NettyServer.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/service/NettyServer.java index 824025a7..fcf5ddf7 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/service/NettyServer.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/service/NettyServer.java @@ -6,6 +6,11 @@ import io.netty.channel.ChannelInitializer; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.ServerSocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.LineBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.CharsetUtil; /** @@ -25,11 +30,17 @@ public class NettyServer { public static void main(String[] args) { NettyServer nettyServer = new NettyServer(); - nettyServer.run(); + nettyServer.runSource(); } - private void run() { + public static void sourceMain(String[] args) { + NettyServer nettyServer = new NettyServer(); + nettyServer.runDev(); + } + + + private void runSource() { NioEventLoopGroup boss = new NioEventLoopGroup(1); NioEventLoopGroup work = new NioEventLoopGroup(); try { @@ -39,19 +50,30 @@ public class NettyServer { .handler(new ChannelInitializer() { @Override protected void initChannel(ServerSocketChannel ch) { - System.out.println("服务正在启动中......"); + System.out.println("源通讯服务正在启动中......"); } }) //业务处理 - .childHandler(NettyServerChannelInitializer.INSTANCE); + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(NioSocketChannel ch) { + ch.pipeline() + //空闲状态的handler + // 添加LineBasedFrameDecoder来按行分割数据 + .addLast(new LineBasedFrameDecoder(10240)) + .addLast(new StringDecoder(CharsetUtil.UTF_8)) + .addLast(new StringEncoder(CharsetUtil.UTF_8)) + .addLast(new DevNettyServerHandler()); + } + }); ChannelFuture future = bootstrap.bind(port).sync(); future.addListener(f -> { if (future.isSuccess()) { - System.out.println("服务启动成功"); + System.out.println("源通讯服务启动成功"); } else { - System.out.println("服务启动失败"); + System.out.println("源通讯服务启动失败"); } }); future.channel().closeFuture().sync(); @@ -63,4 +85,52 @@ public class NettyServer { work.shutdownGracefully(); } } + + + private void runDev() { + NioEventLoopGroup boss = new NioEventLoopGroup(1); + NioEventLoopGroup work = new NioEventLoopGroup(); + try { + ServerBootstrap bootstrap = new ServerBootstrap().group(boss, work); + bootstrap.channel(NioServerSocketChannel.class) + //这个处理器可以不写 + .handler(new ChannelInitializer() { + @Override + protected void initChannel(ServerSocketChannel ch) { + System.out.println("设备通讯服务正在启动中......"); + } + }) + //业务处理 + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(NioSocketChannel ch) { + ch.pipeline() + //空闲状态的handler + // 添加LineBasedFrameDecoder来按行分割数据 + .addLast(new LineBasedFrameDecoder(10240)) + .addLast(new StringDecoder(CharsetUtil.UTF_8)) + .addLast(new StringEncoder(CharsetUtil.UTF_8)) + .addLast(new SourceNettyServerHandler()); + } + }); + + ChannelFuture future = bootstrap.bind(port).sync(); + + future.addListener(f -> { + if (future.isSuccess()) { + System.out.println("设备通讯服务启动成功"); + } else { + System.out.println("设备通讯服务启动失败"); + } + }); + future.channel().closeFuture().sync(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + boss.shutdownGracefully(); + work.shutdownGracefully(); + } + } + } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/service/NettyServerChannelInitializer.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/service/NettyServerChannelInitializer.java index c218c64b..60058dbe 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/service/NettyServerChannelInitializer.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/service/NettyServerChannelInitializer.java @@ -23,7 +23,7 @@ public class NettyServerChannelInitializer extends ChannelInitializer { - - public static final NettyServerHandler INSTANCE = new NettyServerHandler(); - - /** - * @Description: 当通道进行连接时推送消息 - * @Author: wr - * @Date: 2024/12/10 14:19 - */ - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - System.out.println("服务端监听到"+ctx.channel().id()+"连接"); - super.channelActive(ctx); - } - - /** - * 处理消息信息 - */ - @Override - public void channelRead0(ChannelHandlerContext ctx, String msg) { - System.out.println(ctx.channel().id()+"NettyServer服务端接收到客户端消息:"+msg); - Channel channel = ctx.channel(); - /* - if(msg.endsWith("结束")) { - channel.writeAndFlush("socket指令结果:"+msg); - for (int i = 0; i < 5; i++) { - channel.writeAndFlush("socket指令结果:"+msg); - } - }else{ - channel.writeAndFlush("socket指令结果:成功指令"); - }*/ - if(!msg.contains("HeartBeat")){ - if(msg.contains("start")){ - JSONObject jsonObject1 = new JSONObject(); - jsonObject1.put("requestId","yjc_ytxjy"); - jsonObject1.put("operateCode","INIT_GATHER"); - jsonObject1.put("code","10201"); - channel.writeAndFlush(jsonObject1.toJSONString()+'\n'); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - - JSONObject jsonObject = new JSONObject(); - jsonObject.put("requestId","yjc_ytxjy"); - jsonObject.put("operateCode","INIT_GATHER"); - jsonObject.put("code","10200"); - channel.writeAndFlush(jsonObject.toJSONString()+'\n'); - }else if(msg.contains("YJC_xujy")){ - JSONObject jsonObject = new JSONObject(); - jsonObject.put("requestId","YJC_xujy"); - jsonObject.put("operateCode","OPER_GATHER"); - jsonObject.put("code","10201"); - channel.writeAndFlush(jsonObject.toJSONString()+'\n'); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - - JSONObject jsonObject1 = new JSONObject(); - jsonObject1.put("requestId","YJC_xujy"); - jsonObject1.put("operateCode","OPER_GATHER"); - jsonObject1.put("code","10200"); - channel.writeAndFlush(jsonObject1.toJSONString()+'\n'); - - - } - - - } - - - } - - @Override - public void handlerAdded(ChannelHandlerContext ctx) { - System.out.println("有新连接加入了++++......" + ctx.channel()); - } - - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - cause.printStackTrace(); - ctx.close(); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - // Client disconnected, close the server-side channel too - System.out.println("NettyServer服务端监听到"+ctx.channel().id()+"关闭连接"); - ctx.close(); // This will trigger the close event on the server side - super.channelInactive(ctx); - } - - /** - * 用户事件的回调方法(自定义事件用于心跳机制) - */ - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { - //空闲状态的事件 -// if (evt instanceof IdleStateEvent) { -// IdleStateEvent event = (IdleStateEvent) evt; -// System.out.println(event.state() + ">>>" + ctx.channel().id()); -// //已经10秒钟没有读时间了 -// if (event.state().equals(IdleState.READER_IDLE)){ -// // 心跳包丢失,10秒没有收到客户端心跳 (断开连接) -// ctx.channel().close().sync(); -// System.out.println("已与 "+ctx.channel().remoteAddress()+" 断开连接"); -// } -// } - } - -} diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/service/SourceNettyServerHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/service/SourceNettyServerHandler.java new file mode 100644 index 00000000..9dbb1f1e --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/service/SourceNettyServerHandler.java @@ -0,0 +1,133 @@ +package com.njcn.gather.detection.util.socket.service; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; +import com.njcn.gather.detection.pojo.vo.SocketDataMsg; +import com.njcn.gather.detection.util.socket.MsgUtil; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + * @Description: 客户端业务处理 + * @Author: wr + * @Date: 2024/12/10 14:18 + */ + +public class SourceNettyServerHandler extends SimpleChannelInboundHandler { + + private final String DEV = "_Dev"; + private final String source = "_Source"; + + private final String stepTag = "&&"; + private final String stepBegin = "_Start"; + private final String stepEnd = "_End"; + + public static final SourceNettyServerHandler INSTANCE = new SourceNettyServerHandler(); + + /** + * @Description: 当通道进行连接时推送消息 + * @Author: wr + * @Date: 2024/12/10 14:19 + */ + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + System.out.println("服务端监听到" + ctx.channel().id() + "连接"); + super.channelActive(ctx); + } + + /** + * 处理消息信息 + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, String msg) { + System.out.println(ctx.channel().id() + "NettyServer服务端接收到客户端消息:" + msg); + Channel channel = ctx.channel(); + SocketDataMsg socketDataMsg = MsgUtil.socketDataMsg(msg); + String[] tem = socketDataMsg.getRequestId().split(stepTag); + SourceOperateCodeEnum enumByCode = SourceOperateCodeEnum.getDictDataEnumByCode(tem[0]); + JSONObject jsonObject1 = new JSONObject(); + if (ObjectUtil.isNotNull(enumByCode)) { + switch (enumByCode) { + //源初始化 + case YJC_YTXJY: + String aa = "{\"requestId\":\"yjc_ytxjy\",\"operateCode\":\"INIT_GATHER\",\"data\":null,\"code\":10201}"; + String bb = "{\"requestId\":\"yjc_ytxjy\",\"operateCode\":\"INIT_GATHER\",\"data\":null,\"code\":10200}"; + channel.writeAndFlush(aa+"/n"); + channel.writeAndFlush(bb+"/n"); + break; + //相序检测 + case YJC_XUJY: + String hh = "{\"requestId\":\"YJC_xujy\",\"operateCode\":\"OPER_GATHER\",\"data\":null,\"code\":10201}"; + String ii = "{\"requestId\":\"YJC_xujy\",\"operateCode\":\"OPER_GATHER\",\"data\":null,\"code\":10200}"; + channel.writeAndFlush(hh+"\n"); + channel.writeAndFlush(ii+"\n"); + break; + //正式检测 + case FORMAL_REAL: + + break; + //系数校验 + case Coefficient_Check: + String a = "{\"requestId\":\"Coefficient_Check\",\"operateCode\":\"OPER_GATHER\",\"data\":null,\"code\":10201}"; + String b= "{\"requestId\":\"Coefficient_Check\",\"operateCode\":\"OPER_GATHER\",\"data\":null,\"code\":10200}"; + + break; + case QUITE_SOURCE: + + break; + case YXT: + jsonObject1.put("requestId", "yjc_ytxjy"); + jsonObject1.put("operateCode", "INIT_GATHER"); + jsonObject1.put("code", "10201"); + channel.writeAndFlush(jsonObject1.toJSONString() + '\n'); + + break; + } + } else { + System.out.println("未知异常" + enumByCode); + } + + + } + + @Override + public void handlerAdded(ChannelHandlerContext ctx) { + System.out.println("有新连接加入了++++......" + ctx.channel()); + } + + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + // Client disconnected, close the server-side channel too + System.out.println("NettyServer服务端监听到" + ctx.channel().id() + "关闭连接"); + ctx.close(); // This will trigger the close event on the server side + super.channelInactive(ctx); + } + + /** + * 用户事件的回调方法(自定义事件用于心跳机制) + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + //空闲状态的事件 +// if (evt instanceof IdleStateEvent) { +// IdleStateEvent event = (IdleStateEvent) evt; +// System.out.println(event.state() + ">>>" + ctx.channel().id()); +// //已经10秒钟没有读时间了 +// if (event.state().equals(IdleState.READER_IDLE)){ +// // 心跳包丢失,10秒没有收到客户端心跳 (断开连接) +// ctx.channel().close().sync(); +// System.out.println("已与 "+ctx.channel().remoteAddress()+" 断开连接"); +// } +// } + } + +} diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/web/WebSocketHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/web/WebSocketHandler.java index 14f67601..d379cc49 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/web/WebSocketHandler.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/web/WebSocketHandler.java @@ -15,6 +15,8 @@ import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; + /** * @Description: 泛型 代表的是处理数据的单位 @@ -58,10 +60,12 @@ public class WebSocketHandler extends SimpleChannelInboundHandler 3) { - System.out.println("空闲次数超过三次 关闭连接"); + System.out.println("c端心跳检测空闲次数超过三次 关闭连接"); ctx.channel().close(); + WebServiceManager.removeChannel(ctx.channel().id().toString()); } break; case WRITER_IDLE: @@ -153,12 +158,6 @@ public class WebSocketHandler extends SimpleChannelInboundHandler pqScriptCheckData = this.baseMapper.selectList(queryWrapper); + if(CollUtil.isEmpty(pqScriptCheckData)){ + throw new BusinessException(CommonResponseEnum.FAIL,"测试脚本项暂无配置"); + } List valueTypeList = pqScriptCheckData.stream().map(PqScriptCheckData::getValueType).distinct().collect(Collectors.toList()); LambdaQueryWrapper dictTreeLambdaQueryWrapper = new LambdaQueryWrapper<>(); dictTreeLambdaQueryWrapper.in(DictTree::getId,valueTypeList).eq(DictTree::getState,DataStateEnum.DELETED.getCode());