From 95d5396759ffbf36411131376f3896d07603362b Mon Sep 17 00:00:00 2001 From: caozehui <2427765068@qq.com> Date: Mon, 21 Jul 2025 08:42:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E8=AE=A1=E5=88=92=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8A=9F=E8=83=BD=E4=BB=A3=E7=A0=81-=E8=A1=A5?= =?UTF-8?q?=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PreDetectionController.java | 20 +++- .../SocketContrastResponseService.java | 44 +++++++++ .../handler/SocketDevResponseService.java | 97 +++++++++---------- .../handler/SocketSourceResponseService.java | 29 ++---- .../pojo/param/ContrastDetectionParam.java | 41 ++++++++ .../service/PreDetectionService.java | 7 ++ .../service/impl/PreDetectionServiceImpl.java | 45 ++++++++- .../business/DetectionCommunicateUtil.java | 26 +++++ .../detection/util/socket/CnSocketUtil.java | 38 ++++++-- .../util/socket/FormalTestManager.java | 5 + .../util/socket/cilent/HeartbeatHandler.java | 9 +- .../util/socket/cilent/NettyClient.java | 19 ++-- .../cilent/NettyContrastClientHandler.java | 23 +++++ .../gather/device/pojo/param/PqDevParam.java | 5 +- .../gather/device/pojo/vo/PreDetection.java | 2 +- .../plan/controller/AdPlanController.java | 8 +- .../gather/plan/service/IAdPlanService.java | 2 +- .../plan/service/impl/AdPlanServiceImpl.java | 69 ++++++++----- .../pojo/constant/DetectionValidMessage.java | 5 +- .../gather/result/pojo/param/ResultParam.java | 4 +- 20 files changed, 354 insertions(+), 144 deletions(-) create mode 100644 detection/src/main/java/com/njcn/gather/detection/handler/SocketContrastResponseService.java create mode 100644 detection/src/main/java/com/njcn/gather/detection/pojo/param/ContrastDetectionParam.java create mode 100644 detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyContrastClientHandler.java 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 12f28c0b..9e3b2a74 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 @@ -3,13 +3,10 @@ package com.njcn.gather.detection.controller; 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.param.ContrastDetectionParam; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.param.SimulateDetectionParam; import com.njcn.gather.detection.service.PreDetectionService; -import com.njcn.gather.detection.service.impl.DetectionServiceImpl; -import com.njcn.gather.device.service.IPqDevService; -import com.njcn.gather.script.service.IPqScriptDtlsService; import com.njcn.web.controller.BaseController; import com.njcn.web.utils.HttpResultUtil; import io.swagger.annotations.Api; @@ -35,6 +32,7 @@ public class PreDetectionController extends BaseController { /** * 开始检测通用入口 + * * @param param 实体参数 */ @PostMapping("/startPreTest") @@ -130,4 +128,18 @@ public class PreDetectionController extends BaseController { preDetectionService.restartTemTest(param); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); } + + + /** + * 开始比对检测(包括预检测、正式检测)通用入口 + */ + @PostMapping("/startContrastTest") + @OperateInfo + @ApiOperation("开始比对检测") + @ApiImplicitParam(name = "param", value = "查询参数", required = true) + public HttpResult startContrastTest(@RequestBody @Validated ContrastDetectionParam param) { + String methodDescribe = getMethodDescribe("startContrastTest"); + preDetectionService.startContrastTest(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } } diff --git a/detection/src/main/java/com/njcn/gather/detection/handler/SocketContrastResponseService.java b/detection/src/main/java/com/njcn/gather/detection/handler/SocketContrastResponseService.java new file mode 100644 index 00000000..cb663bde --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/handler/SocketContrastResponseService.java @@ -0,0 +1,44 @@ +package com.njcn.gather.detection.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.njcn.gather.detection.pojo.param.ContrastDetectionParam; +import com.njcn.gather.detection.util.socket.FormalTestManager; +import com.njcn.gather.plan.service.IAdPlanService; +import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum; +import com.njcn.gather.system.dictionary.pojo.po.DictData; +import com.njcn.gather.system.dictionary.service.IDictDataService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * @author caozehui + * @data 2025-07-18 + */ +@Service +@RequiredArgsConstructor +public class SocketContrastResponseService { + + private final IAdPlanService adPlanService; + private final IDictDataService dictDataService; + + /** + * 数据处理原则 + */ + private DictDataEnum dataRule; + + /** + * 初始化操作 + * + * @param param + */ + public void init(ContrastDetectionParam param) { + FormalTestManager.currentTestPlan = adPlanService.getById(param.getPlanId()); + + DictData dictData = dictDataService.getDictDataById(FormalTestManager.currentTestPlan.getDataRule()); + if (ObjectUtil.isNotNull(dictData)) { + this.dataRule = DictDataEnum.getDictDataEnumByCode(dictData.getCode()); + } else { + this.dataRule = DictDataEnum.SECTION_VALUE; + } + } +} 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 e9c89ba7..8d5dff35 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 @@ -65,13 +65,6 @@ import static com.njcn.gather.detection.util.socket.FormalTestManager.harmonicRe @Service @RequiredArgsConstructor public class SocketDevResponseService { - - private final String handlerStr = "_Dev"; - private final String handlerSourceStr = "_Source"; - private final String stepTag = "&&"; - private final String splitTag = "_"; - private final String stepBegin = "_Start"; - private final String stepEnd = "_End"; // ISO 8601格式 private final DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; @@ -99,8 +92,6 @@ public class SocketDevResponseService { @Value("${phaseAngle.isEnable}") private Boolean isPhaseAngle; -// private final ExecutorService executorPool = Executors.newFixedThreadPool(10); - /** * 存储的装置相序数据 @@ -133,7 +124,7 @@ public class SocketDevResponseService { //标识当前检测小项是否结束 public void deal(PreDetectionParam param, String msg) throws Exception { SocketDataMsg socketDataMsg = MsgUtil.socketDataMsg(msg); - String[] tem = socketDataMsg.getRequestId().split(stepTag); + String[] tem = socketDataMsg.getRequestId().split(CnSocketUtil.STEP_TAG); SourceOperateCodeEnum sourceOperateCodeEnum = SourceOperateCodeEnum.getDictDataEnumByCode(tem[0]); switch (Objects.requireNonNull(sourceOperateCodeEnum)) { @@ -163,12 +154,12 @@ public class SocketDevResponseService { SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: - SocketManager.removeUser(param.getUserPageId() + handlerStr); + SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.DEV_TAG); break; case UNPROCESSED_BUSINESS: break; default: - SocketManager.removeUser(param.getUserPageId() + handlerStr); + SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.DEV_TAG); System.out.println(socketDataMsg); } break; @@ -206,7 +197,7 @@ public class SocketDevResponseService { 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)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(xiSocket)); } } break; @@ -236,7 +227,7 @@ public class SocketDevResponseService { 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)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.DEV_TAG, JSON.toJSONString(xiSocket)); } else { if (XiNumberManager.stepNumber == 0) { //为空则认为所有装置都已经下发,开始进行小电压的申请,步骤进行+1 @@ -247,7 +238,7 @@ public class SocketDevResponseService { System.out.println("第一步结束开始配置小电压电流参数下发给源----------------------"); xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(1))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(xiSocket)); } else if (XiNumberManager.stepNumber == 1) { //小电流系数下发完毕;开始重新测试一次大电压 sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_end.getValue(), XiNumberManager.devParameterList.get(0)); @@ -255,7 +246,7 @@ public class SocketDevResponseService { xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(0))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(xiSocket)); XiNumberManager.stepNumber = 2; } FormalTestManager.realDataXiList.clear(); @@ -328,7 +319,7 @@ 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])); + Map> realDataXiMap = FormalTestManager.realDataXiList.stream().collect(Collectors.groupingBy(it -> it.getId().split(CnSocketUtil.SPLIT_TAG)[0])); realDataXiMap.forEach((devIp, dataList) -> processDeviceData(devIp, dataList, param)); handleStep(XiNumberManager.stepNumber, param, xiSocket); @@ -359,7 +350,7 @@ public class SocketDevResponseService { 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)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.DEV_TAG, JSON.toJSONString(xiSocket)); } private void handleSmallVoltageStep(PreDetectionParam param, SocketMsg xiSocket) { @@ -376,7 +367,7 @@ public class SocketDevResponseService { 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)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.DEV_TAG, JSON.toJSONString(xiSocket)); } else { //存在小电压系数在误差范围内情况,直接结束。 sendWebSocket(param.getUserPageId(), SourceOperateCodeEnum.Coefficient_Check.getValue(), SourceOperateCodeEnum.small_end.getValue(), XiNumberManager.devParameterList.get(1)); @@ -384,7 +375,7 @@ public class SocketDevResponseService { //小电流系数下发完毕;开始重新测试一次大电压 xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(0))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(xiSocket)); XiNumberManager.stepNumber = 2; FormalTestManager.realDataXiList.clear(); successComm.clear(); @@ -399,7 +390,7 @@ public class SocketDevResponseService { xiSocket.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); xiSocket.setData(JSON.toJSONString(XiNumberManager.xiSourceIssueList.get(1))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xiSocket)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(xiSocket)); XiNumberManager.stepNumber = 3; FormalTestManager.realDataXiList.clear(); successComm.clear(); @@ -462,12 +453,12 @@ public class SocketDevResponseService { SocketManager.initMap(sourceIssueMap); socketMsg.setData(JSON.toJSONString(sourceIssues.get(0))); - socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + stepTag + sourceIssues.get(0).getType()); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(socketMsg)); + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + sourceIssues.get(0).getType()); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg)); //告诉前端当前项开始了 WebSocketVO webSocketVO = new WebSocketVO<>(); - webSocketVO.setRequestId(sourceIssues.get(0).getType() + stepBegin); + webSocketVO.setRequestId(sourceIssues.get(0).getType() + CnSocketUtil.START_TAG); webSocketVO.setDesc(null); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); } else { @@ -552,7 +543,7 @@ public class SocketDevResponseService { DevXiNumData.F F = new DevXiNumData.F(); CoefficientVO.DevParameter devParameter = getDevParameter(); - assemblyEntity(list, F, gfMap.get(Integer.parseInt(monitorId.split(splitTag)[1]) - 1), coefficientVO, devParameter); + assemblyEntity(list, F, gfMap.get(Integer.parseInt(monitorId.split(CnSocketUtil.SPLIT_TAG)[1]) - 1), coefficientVO, devParameter); if (Objects.nonNull(coefficientVO.getResultFlag()) && coefficientVO.getResultFlag() == 0) { xiFlag.set(false); } @@ -568,7 +559,7 @@ public class SocketDevResponseService { private CoefficientVO createCoefficientVO(String monitorId) { CoefficientVO coefficientVO = new CoefficientVO(); - String[] splitStr = monitorId.split(splitTag); + String[] splitStr = monitorId.split(CnSocketUtil.SPLIT_TAG); if (XiNumberManager.stepNumber == 0 || XiNumberManager.stepNumber == 2) { coefficientVO.setType("big"); } else { @@ -586,7 +577,7 @@ public class SocketDevResponseService { 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.setUMonitorPoint(Integer.parseInt(monitorId.split(CnSocketUtil.SPLIT_TAG)[1]) - 1); gfItem.setF(F); return gfItem; } @@ -715,7 +706,7 @@ public class SocketDevResponseService { */ private void devComm(SocketDataMsg socketDataMsg, PreDetectionParam param, String msg) { SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); - String s = param.getUserPageId() + handlerStr; + String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; SocketMsg socketMsg = new SocketMsg<>(); switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: @@ -806,7 +797,7 @@ public class SocketDevResponseService { private void protocolDeal(SocketDataMsg socketDataMsg, PreDetectionParam param, String msg) { SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); SocketMsg socketMsg = new SocketMsg<>(); - String s = param.getUserPageId() + handlerStr; + String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: @@ -914,7 +905,7 @@ public class SocketDevResponseService { sourceIssues = pqScriptDtlsService.listSourceIssue(issueParam); socketMsg.setRequestId(SourceOperateCodeEnum.YJC_XUJY.getValue()); socketMsg.setData(JSON.toJSONString(sourceIssues.get(0))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(socketMsg)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg)); } else if (param.getTestItemList().get(2)) { // 后续做正式检测 if (param.getOperateType().equals(SourceOperateCodeEnum.RE_ERROR_TEST.getValue())) { @@ -954,12 +945,12 @@ public class SocketDevResponseService { SocketManager.initMap(sourceIssueMap); socketMsg.setData(JSON.toJSONString(sourceIssues.get(0))); - socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + stepTag + sourceIssues.get(0).getType()); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(socketMsg)); + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + sourceIssues.get(0).getType()); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg)); //告诉前端当前项开始了 WebSocketVO webSocketVO = new WebSocketVO<>(); - webSocketVO.setRequestId(sourceIssues.get(0).getType() + stepBegin); + webSocketVO.setRequestId(sourceIssues.get(0).getType() + CnSocketUtil.START_TAG); webSocketVO.setDesc(null); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); } @@ -968,10 +959,10 @@ public class SocketDevResponseService { // System.out.println("进入暂停后的继续检测》》》》》》》》》》》》》》》》》》》》》》》》》》》" + "剩余检测小项" + SocketManager.getSourceList().size()); // if (CollUtil.isNotEmpty(SocketManager.getSourceList())) { // SourceIssue sourceIssue = SocketManager.getSourceList().get(0); -// socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + stepTag + sourceIssue.getType()); +// socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + sourceIssue.getType()); // socketMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); // socketMsg.setData(JSON.toJSONString(sourceIssue)); -// SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(socketMsg)); +// SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg)); // } // } else { // @@ -1087,7 +1078,7 @@ public class SocketDevResponseService { dataMsg.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); for (SourceCompareDev sourceCompareDev : info) { - dataMsg.setData(sourceCompareDev.getDevName() + splitTag + sourceCompareDev.getLineNum() + "校验结果:" + sourceCompareDev.getDesc()); + dataMsg.setData(sourceCompareDev.getDevName() + CnSocketUtil.SPLIT_TAG + sourceCompareDev.getLineNum() + "校验结果:" + sourceCompareDev.getDesc()); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(dataMsg)); } @@ -1130,7 +1121,7 @@ public class SocketDevResponseService { map.put("devIP", preDetection.getDevIP()); map.put("chnNum", preDetection.getDevChns()); socketMsg.setData(JSON.toJSONString(map)); - SocketManager.sendMsg(param.getUserPageId() + handlerStr, JSON.toJSONString(socketMsg)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.DEV_TAG, JSON.toJSONString(socketMsg)); XiNumberManager.stepNumber = 0; @@ -1184,13 +1175,13 @@ public class SocketDevResponseService { SocketManager.initMap(sourceIssueMap); socketMsg.setData(JSON.toJSONString(sourceIssues.get(0))); - socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + stepTag + sourceIssues.get(0).getType()); + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + sourceIssues.get(0).getType()); socketMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(socketMsg)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg)); //告诉前端当前项开始了 WebSocketVO webSocketVO = new WebSocketVO<>(); - webSocketVO.setRequestId(sourceIssues.get(0).getType() + stepBegin); + webSocketVO.setRequestId(sourceIssues.get(0).getType() + CnSocketUtil.START_TAG); webSocketVO.setDesc(null); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); } else { @@ -1260,7 +1251,7 @@ public class SocketDevResponseService { //当成功的通道数量和检测通道数量相同时进入 if (successComm.size() == FormalTestManager.monitorIdListComm.size()) { - System.out.println(sourceIssue.getType() + splitTag + sourceIssue.getIndex() + "当前测试小项读取数据已经全部结束。。。。。。。。。"); + System.out.println(sourceIssue.getType() + CnSocketUtil.SPLIT_TAG + sourceIssue.getIndex() + "当前测试小项读取数据已经全部结束。。。。。。。。。"); //修改装置为监测中 // adPlanService.updateTestState(param.getPlanId(), param.getDevIds()); //开启线程进行入库原始数据操作 @@ -1275,7 +1266,7 @@ public class SocketDevResponseService { //当小项结束后需要删除集合中的小项 SocketManager.delSource(sourceIssue.getIndex()); - System.out.println("当前小项结束进行删除============" + sourceIssue.getType() + splitTag + sourceIssue.getIndex()); + System.out.println("当前小项结束进行删除============" + sourceIssue.getType() + CnSocketUtil.SPLIT_TAG + sourceIssue.getIndex()); //小项检测完后小项数减一,并更新map long residueCount = SocketManager.getSourceTarget(sourceIssue.getType()) - 1; @@ -1303,7 +1294,7 @@ public class SocketDevResponseService { resultList.add(devTem); }); allDevTestList.clear(); - CnSocketUtil.sendToWebSocket(param.getUserPageId(), socketDataMsg.getRequestId().split(stepTag)[1] + stepEnd, null, resultList, null); + CnSocketUtil.sendToWebSocket(param.getUserPageId(), socketDataMsg.getRequestId().split(CnSocketUtil.STEP_TAG)[1] + CnSocketUtil.END_TAG, null, resultList, null); } //在这一步判断是否已经触发暂停按钮 if (FormalTestManager.stopFlag && CollUtil.isNotEmpty(SocketManager.getSourceList())) { @@ -1321,15 +1312,15 @@ public class SocketDevResponseService { SourceIssue sourceIssues = SocketManager.getSourceList().get(0); // 如果上一个大项检测完成,则检测下一个大项,并向前端推送消息 if (residueCount == 0) { - CnSocketUtil.sendToWebSocket(param.getUserPageId(), sourceIssues.getType() + stepBegin, null, new ArrayList<>(), null); + CnSocketUtil.sendToWebSocket(param.getUserPageId(), sourceIssues.getType() + CnSocketUtil.START_TAG, null, new ArrayList<>(), null); } //控源下发下一个小项脚本 SocketMsg xuMsg = new SocketMsg<>(); xuMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); xuMsg.setData(JSON.toJSONString(sourceIssues)); - xuMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + stepTag + sourceIssues.getType()); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(xuMsg)); + xuMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + sourceIssues.getType()); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(xuMsg)); } else { //TODO 是否最终检测完成需要推送给用户 PqScriptCheckDataParam checkDataParam = new PqScriptCheckDataParam(); @@ -1391,7 +1382,7 @@ public class SocketDevResponseService { List resultFlagList = new ArrayList<>(); List monitorListDTOList = dev.getMonitorList(); for (PreDetection.MonitorListDTO point : monitorListDTOList) { - Integer resultFlag = textResult.get(dev.getDevIP() + splitTag + point.getLine()); + Integer resultFlag = textResult.get(dev.getDevIP() + CnSocketUtil.SPLIT_TAG + point.getLine()); resultFlagList.add(resultFlag); } devLineTestResult.setChnResult(resultFlagList.toArray(new Integer[monitorListDTOList.size()])); @@ -1406,7 +1397,7 @@ public class SocketDevResponseService { } WebSocketVO> webSocketVO = new WebSocketVO<>(); - webSocketVO.setRequestId(socketDataMsg.getRequestId().split(stepTag)[1] + stepEnd); + webSocketVO.setRequestId(socketDataMsg.getRequestId().split(CnSocketUtil.STEP_TAG)[1] + CnSocketUtil.END_TAG); webSocketVO.setDesc(sourceIssue.getDesc()); webSocketVO.setData(devListRes); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); @@ -1465,7 +1456,7 @@ public class SocketDevResponseService { SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); SourceOperateCodeEnum operateCodeEnum = SourceOperateCodeEnum.getDictDataEnumByCode(socketDataMsg.getOperateCode()); SocketMsg socketMsg = new SocketMsg<>(); - String s = param.getUserPageId() + handlerStr; + String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: @@ -1603,7 +1594,7 @@ public class SocketDevResponseService { List dataV = sqlData.stream().filter(x -> type.get(0).equals(x.getDesc())).collect(Collectors.toList()); List dataVPhase = sqlData.stream().filter(x -> type.get(1).equals(x.getDesc())).collect(Collectors.toList()); SourceCompareDev compareDev = new SourceCompareDev(); - String[] split = key.split(splitTag); + String[] split = key.split(CnSocketUtil.SPLIT_TAG); String devName = null; if (FormalTestManager.devNameMapComm.containsKey(split[0])) { devName = FormalTestManager.devNameMapComm.get(split[0]); @@ -1642,7 +1633,7 @@ public class SocketDevResponseService { Boolean c = getaBoolean(sourceMap.get(type + "c"), CollUtil.isNotEmpty(data) ? data.get(0).getList().getC() : null, CollUtil.isNotEmpty(dataPhase) ? dataPhase.get(0).getList().getC() : null); compareDev.setIsQualified(a && b && c); - compareDev.setDesc(name + (compareDev.getIsQualified() ? "合格->" : "不合格->") + stepTag + desc + stepTag + devMessage(type, data, dataPhase)); + compareDev.setDesc(name + (compareDev.getIsQualified() ? "合格->" : "不合格->") + CnSocketUtil.STEP_TAG + desc + CnSocketUtil.STEP_TAG + devMessage(type, data, dataPhase)); return compareDev; } @@ -1831,8 +1822,8 @@ public class SocketDevResponseService { LocalDateTime localDateTime = timeFormat(data.getTime(), formatter); if (Objects.nonNull(localDateTime)) { - String[] splitArr = data.getId().split(splitTag); - String temId = FormalTestManager.devIdMapComm.get(splitArr[0]) + splitTag + splitArr[1]; + String[] splitArr = data.getId().split(CnSocketUtil.SPLIT_TAG); + String temId = FormalTestManager.devIdMapComm.get(splitArr[0]) + CnSocketUtil.SPLIT_TAG + splitArr[1]; if (nonHarmonicList.contains(sourceIssue.getType())) { for (DevData.SqlDataDTO sqlDataDTO : data.getSqlData()) { 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 6707c9a1..45d08bc6 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 @@ -33,18 +33,9 @@ public class SocketSourceResponseService { /** * 向webSocket客户端发送消息 */ - private final SocketDevResponseService socketDevResponseService; private final IPqDevService iPqDevService; - private final String DEV = "_Dev"; - private final String source = "_Source"; - - private final String stepTag = "&&"; - private final String stepBegin = "_Start"; - private final String stepEnd = "_End"; - - @Value("${socket.device.ip}") private String ip; @@ -57,7 +48,7 @@ public class SocketSourceResponseService { public void deal(PreDetectionParam param, String msg) throws Exception { SocketDataMsg socketDataMsg = MsgUtil.socketDataMsg(msg); - String[] tem = socketDataMsg.getRequestId().split(stepTag); + String[] tem = socketDataMsg.getRequestId().split(CnSocketUtil.STEP_TAG); SourceOperateCodeEnum enumByCode = SourceOperateCodeEnum.getDictDataEnumByCode(tem[0]); if (ObjectUtil.isNotNull(enumByCode)) { switch (enumByCode) { @@ -192,7 +183,7 @@ public class SocketSourceResponseService { //向前端推送信息 WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - String s = param.getUserPageId() + DEV; + String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; socketMsg.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue()); socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam(); @@ -233,7 +224,7 @@ public class SocketSourceResponseService { case SUCCESS: //todo 前端推送收到的消息暂未处理好 WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - String s = param.getUserPageId() + DEV; + String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; //开始设备通讯检测(发送设备初始化) //List devList = iPqDevService.getDevInfo(param.getDevIds()); Map> map = new HashMap<>(1); @@ -307,7 +298,7 @@ public class SocketSourceResponseService { //向前端推送信息 WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - String s = param.getUserPageId() + DEV; + String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; socketMsg.setRequestId(SourceOperateCodeEnum.YJC_XUJY.getValue()); socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); List pqDevList = iPqDevService.getDevInfo(param.getDevIds()); @@ -356,11 +347,11 @@ public class SocketSourceResponseService { //向前端推送信息 // webSocketHandler.sendMsgToUser(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - String s = param.getUserPageId() + DEV; + String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; SourceIssue sourceIssue = SocketManager.getSourceList().get(0); List comm = sourceIssue.getDevValueTypeList(); //形如:类型&小项code这种形式。例如:real$VRMS、real$IRMS System.out.println("向装置下发的参数>>>>>>>>" + comm); - socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + stepTag + sourceIssue.getType()); + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + sourceIssue.getType()); int ignoreCount; int readData; if (DicDataEnum.F.getCode().equals(sourceIssue.getType())) { @@ -401,7 +392,7 @@ public class SocketSourceResponseService { }); WebSocketVO webSocketVO = new WebSocketVO<>(); - webSocketVO.setRequestId(socketDataMsg.getRequestId().split(stepTag)[1] + stepBegin); + webSocketVO.setRequestId(socketDataMsg.getRequestId().split(CnSocketUtil.STEP_TAG)[1] + CnSocketUtil.START_TAG); webSocketVO.setDesc(SocketManager.getSourceList().get(0).getDesc()); webSocketVO.setData(devListRes); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); @@ -429,16 +420,16 @@ public class SocketSourceResponseService { switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: //通讯校验成功 - SocketManager.removeUser(param.getUserPageId() + source); + SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.SOURCE_TAG); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); break; case UNPROCESSED_BUSINESS: break; case MESSAGE_PARSING_ERROR: - SocketManager.removeUser(param.getUserPageId() + source); + SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.SOURCE_TAG); break; case UNABLE_TO_RESPOND: - SocketManager.removeUser(param.getUserPageId() + source); + SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.SOURCE_TAG); break; default: CnSocketUtil.quitSendSource(param); diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/param/ContrastDetectionParam.java b/detection/src/main/java/com/njcn/gather/detection/pojo/param/ContrastDetectionParam.java new file mode 100644 index 00000000..9568e74c --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/param/ContrastDetectionParam.java @@ -0,0 +1,41 @@ +package com.njcn.gather.detection.pojo.param; + +import com.njcn.gather.pojo.constant.DetectionValidMessage; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; +import java.util.Map; + +/** + * @author caozehui + * @data 2025-07-18 + */ +@Data +public class ContrastDetectionParam { + + @ApiModelProperty("检测计划ID") + @NotBlank(message = DetectionValidMessage.PLAN_ID_NOT_BLANK) + private String planId; + + @ApiModelProperty("用户ID,唯一标识") + private String userId; + + @ApiModelProperty("被检设备ID列表") + @NotEmpty(message = DetectionValidMessage.DEV_IDS_NOT_EMPTY) + private List devIds; + + @ApiModelProperty("标准设备ID列表") + @NotEmpty(message = DetectionValidMessage.STANDARD_DEV_IDS_NOT_EMPTY) + private List standardDevIds; + + @ApiModelProperty("配对关系") + @NotEmpty(message = DetectionValidMessage.PAIRS_NOT_EMPTY) + private Map pairs; + /** + * 检测项列表。第一个元素为预检测、第二个元素为系数校准、第三个元素为正式检测 + */ + private List testItemList; +} diff --git a/detection/src/main/java/com/njcn/gather/detection/service/PreDetectionService.java b/detection/src/main/java/com/njcn/gather/detection/service/PreDetectionService.java index 62f6ea3d..cec2d88c 100644 --- a/detection/src/main/java/com/njcn/gather/detection/service/PreDetectionService.java +++ b/detection/src/main/java/com/njcn/gather/detection/service/PreDetectionService.java @@ -1,5 +1,6 @@ package com.njcn.gather.detection.service; +import com.njcn.gather.detection.pojo.param.ContrastDetectionParam; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.param.SimulateDetectionParam; @@ -49,4 +50,10 @@ public interface PreDetectionService { * @param param */ void closeTestSimulate(SimulateDetectionParam param); + + /** + * + * @param param + */ + void startContrastTest(ContrastDetectionParam param); } 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 8d554dae..7dd192d5 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 @@ -6,11 +6,13 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.gather.detection.handler.SocketContrastResponseService; import com.njcn.gather.detection.handler.SocketDevResponseService; import com.njcn.gather.detection.handler.SocketSourceResponseService; import com.njcn.gather.detection.pojo.constant.DetectionCommunicateConstant; import com.njcn.gather.detection.pojo.enums.DetectionResponseEnum; import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; +import com.njcn.gather.detection.pojo.param.ContrastDetectionParam; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.param.SimulateDetectionParam; import com.njcn.gather.detection.pojo.vo.SocketMsg; @@ -65,6 +67,7 @@ public class PreDetectionServiceImpl implements PreDetectionService { private final SocketDevResponseService socketDevResponseService; private final SocketSourceResponseService socketSourceResponseService; + private final SocketContrastResponseService socketContrastResponseService; private final IPqScriptCheckDataService iPqScriptCheckDataService; @Value("${socket.source.ip:192.168.1.138}") @@ -79,7 +82,7 @@ public class PreDetectionServiceImpl implements PreDetectionService { @Override public void sourceCommunicationCheck(PreDetectionParam param) { // 参数校验,目前仅检查IP是否重复,后续可在里面扩展 - checkDevIp(param); + checkDevIp(param.getDevIds()); //用于处理异常导致的socket通道未关闭,socket交互异常 DetectionCommunicateUtil.checkCommunicateChannel(param); /* @@ -269,14 +272,48 @@ public class PreDetectionServiceImpl implements PreDetectionService { WebServiceManager.removePreDetectionParam(); } + @Override + public void startContrastTest(ContrastDetectionParam param) { + // 参数校验,目前仅检查IP是否重复,后续可在里面扩展 + checkDevIp(param.getDevIds()); + //用于处理异常导致的socket通道未关闭,socket交互异常 + DetectionCommunicateUtil.checkContrastCommunicateChannel(param.getUserId()); + socketContrastResponseService.init(param); + + // 和通信模块进行连接 + this.sendContrastSocket(param); + } + + /** + * 比对式-与通信模块进行连接 + * + * @param param + */ + private void sendContrastSocket(ContrastDetectionParam param) { + String s = param.getUserId() + CnSocketUtil.DEV_TAG; + +// Map> map = new HashMap<>(1); +// List preDetections = BeanUtil.copyToList(FormalTestManager.devList, PreDetection.class); +// preDetections.forEach(x -> { +// x.setDevType(x.getIcdType()); +// }); +// map.put("deviceList", preDetections); +// String jsonString = JSON.toJSONString(map); +// socketMsg.setRequestId(SourceOperateCodeEnum.YJC_SBTXJY.getValue()); +// socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_01.getValue()); +// socketMsg.setData(jsonString); +// String json = JSON.toJSONString(socketMsg); + // SocketManager.sendMsg(s,json); +// NettyClient.socketClient(ip, port, param, json, new NettyDevClientHandler(param, socketDevResponseService)); + } /** * 校验被检设备中是否存在IP重复的 */ - private void checkDevIp(PreDetectionParam param) { - List pqDevList = iPqDevService.listByIds(param.getDevIds()); + private void checkDevIp(List devIds) { + List pqDevList = iPqDevService.listByIds(devIds); List ipList = pqDevList.stream().map(PqDev::getIp).distinct().collect(Collectors.toList()); - if (ipList.size() != param.getDevIds().size()) { + if (ipList.size() != devIds.size()) { throw new BusinessException(DetectionResponseEnum.PLAN_DEV_IP_HAS); } } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/business/DetectionCommunicateUtil.java b/detection/src/main/java/com/njcn/gather/detection/util/business/DetectionCommunicateUtil.java index afa13166..36716463 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/business/DetectionCommunicateUtil.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/business/DetectionCommunicateUtil.java @@ -54,4 +54,30 @@ public class DetectionCommunicateUtil { } + /** + * 比对式-检测是否存在已有的Socket通道,有则强行关闭 + * + * @param userId + */ + public static void checkContrastCommunicateChannel(String userId) { + Channel channel = SocketManager.getChannelByUserId(userId); + + if (Objects.nonNull(channel) && channel.isActive()) { + System.out.println("存在已有的Socket通道,强行关闭。。。。。。。。"); + CnSocketUtil.contrastSendquit(userId); + } + + try { + Thread.sleep(4000); + } catch (InterruptedException e) { + log.error(e.getMessage()); + } + + SocketManager.removeUser(userId); + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + log.error(e.getMessage()); + } + } } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/CnSocketUtil.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/CnSocketUtil.java index 454b7f9f..76ee7074 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/CnSocketUtil.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/CnSocketUtil.java @@ -14,8 +14,17 @@ import com.njcn.gather.detection.pojo.vo.WebSocketVO; */ public class CnSocketUtil { - private final static String devTag = "_Dev"; - private final static String sourceTag = "_Source"; + public final static String DEV_TAG = "_Dev"; + + public final static String SOURCE_TAG = "_Source"; + + public final static String START_TAG = "_Start"; + + public final static String END_TAG = "_End"; + + public final static String STEP_TAG = "&&"; + + public final static String SPLIT_TAG = "_"; /** * 退出检测 @@ -24,7 +33,7 @@ public class CnSocketUtil { SocketMsg socketMsg = new SocketMsg<>(); socketMsg.setRequestId(SourceOperateCodeEnum.QUITE.getValue()); socketMsg.setOperateCode(SourceOperateCodeEnum.QUIT_INIT_03.getValue()); - SocketManager.sendMsg(param.getUserPageId() + devTag, JSON.toJSONString(socketMsg)); + SocketManager.sendMsg(param.getUserPageId() + DEV_TAG, JSON.toJSONString(socketMsg)); WebServiceManager.removePreDetectionParam(); } @@ -38,31 +47,44 @@ public class CnSocketUtil { JSONObject jsonObject = new JSONObject(); jsonObject.put("sourceId", param.getSourceId()); socketMsg.setData(jsonObject.toJSONString()); - SocketManager.sendMsg(param.getUserPageId() + sourceTag, JSON.toJSONString(socketMsg)); + SocketManager.sendMsg(param.getUserPageId() + SOURCE_TAG, JSON.toJSONString(socketMsg)); WebServiceManager.removePreDetectionParam(); } /** * 推送webSocket数据 */ - public static void sendToWebSocket(String userId, String requestId, String operatorType, Object data, String desc){ + public static void sendToWebSocket(String userId, String requestId, String operatorType, Object data, String desc) { WebSocketVO webSocketVO = new WebSocketVO<>(); webSocketVO.setRequestId(requestId); webSocketVO.setOperateCode(operatorType); webSocketVO.setData(data); webSocketVO.setDesc(desc); - WebServiceManager.sendMessage(userId,webSocketVO); + WebServiceManager.sendMessage(userId, webSocketVO); } /** * 推送未知异常的webSocket数据 */ - public static void sendUnSocket(String userId){ + public static void sendUnSocket(String userId) { WebSocketVO webSocketVO = new WebSocketVO<>(); webSocketVO.setRequestId(SourceOperateCodeEnum.UNKNOWN_OPERATE.getValue()); webSocketVO.setData(SourceOperateCodeEnum.UNKNOWN_OPERATE.getMsg()); webSocketVO.setOperateCode(SourceOperateCodeEnum.UNKNOWN_OPERATE.getMsg()); - WebServiceManager.sendMessage(userId,webSocketVO); + WebServiceManager.sendMessage(userId, webSocketVO); + } + + + /** + * 比对式-退出检测 + */ + public static void contrastSendquit(String userId) { + System.out.println("比对式-发送关闭备通讯模块指令。。。。。。。。"); + SocketMsg socketMsg = new SocketMsg<>(); + socketMsg.setRequestId(SourceOperateCodeEnum.QUITE.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.QUIT_INIT_03.getValue()); + SocketManager.sendMsg(userId + DEV_TAG, JSON.toJSONString(socketMsg)); + WebServiceManager.removePreDetectionParam(); } } 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 2c6e141b..749e46bb 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 @@ -2,6 +2,7 @@ package com.njcn.gather.detection.util.socket; import com.njcn.gather.detection.pojo.po.DevData; import com.njcn.gather.device.pojo.vo.PreDetection; +import com.njcn.gather.plan.pojo.po.AdPlan; import java.util.ArrayList; import java.util.HashMap; @@ -72,4 +73,8 @@ public class FormalTestManager { public static Map harmonicRelationMap = new HashMap<>(); + /** + * 当前正在检测的计划 + */ + public static AdPlan currentTestPlan; } 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 index 2e4fe12f..a249db6b 100644 --- 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 @@ -23,13 +23,8 @@ import java.util.concurrent.TimeUnit; * @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; @@ -74,7 +69,7 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { if (consecutiveHeartbeatMisses >= MAX_HEARTBEAT_MISSES) { // 连续三次未收到心跳响应,断开连接 System.out.println(handlerType + "连续三次未收到心跳响应,断开连接"); - if (dev.equals(handlerType)) { + if (CnSocketUtil.DEV_TAG.equals(handlerType)) { //CnSocketUtil.sendToWebSocket(param.getUserPageId(),); CnSocketUtil.quitSend(param); } else { @@ -86,7 +81,7 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { Thread.currentThread().interrupt(); System.err.println("线程中断异常: " + e.getMessage()); } - String key = dev.equals(handlerType) ? param.getUserPageId() + dev : param.getUserPageId() + sourceTag; + String key = CnSocketUtil.DEV_TAG.equals(handlerType) ? param.getUserPageId() + CnSocketUtil.DEV_TAG : param.getUserPageId() + CnSocketUtil.SOURCE_TAG; SocketManager.removeUser(key); consecutiveHeartbeatMisses = 0; // 重置连续心跳丢失次数 } 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 eccf0268..9218b9ee 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,9 +31,6 @@ 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(); @@ -52,7 +49,7 @@ public class NettyClient { // .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(new HeartbeatHandler(param, CnSocketUtil.SOURCE_TAG)) .addLast(handler); } else { ch.pipeline() @@ -61,7 +58,7 @@ public class NettyClient { .addLast(new LineBasedFrameDecoder(10240)) .addLast(new StringDecoder(CharsetUtil.UTF_8)) .addLast(new StringEncoder(CharsetUtil.UTF_8)) - .addLast(new HeartbeatHandler(param, dev)) + .addLast(new HeartbeatHandler(param, CnSocketUtil.DEV_TAG)) //空闲状态的handler //readerIdleTimeSeconds:在指定的秒数内如果没有读取到任何数据,则触发IdleState.READER_IDLE事件。 //writerIdleTimeSeconds:在指定的秒数内如果没有写入任何数据,则触发IdleState.WRITER_IDLE事件。 @@ -81,17 +78,17 @@ public class NettyClient { } else { System.out.println("链接服务端成功..."); if (handler instanceof NettySourceClientHandler) { - NioEventLoopGroup groupByUserId = SocketManager.getGroupByUserId(param.getUserPageId() + source); - if(ObjectUtil.isNotNull(groupByUserId)){ + NioEventLoopGroup groupByUserId = SocketManager.getGroupByUserId(param.getUserPageId() + CnSocketUtil.SOURCE_TAG); + if (ObjectUtil.isNotNull(groupByUserId)) { groupByUserId.shutdownGracefully().sync(); } - SocketManager.addGroup(param.getUserPageId() + source, group); + SocketManager.addGroup(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, group); } else { - NioEventLoopGroup groupByUserId = SocketManager.getGroupByUserId(param.getUserPageId() + dev); - if(ObjectUtil.isNotNull(groupByUserId)){ + NioEventLoopGroup groupByUserId = SocketManager.getGroupByUserId(param.getUserPageId() + CnSocketUtil.DEV_TAG); + if (ObjectUtil.isNotNull(groupByUserId)) { groupByUserId.shutdownGracefully().sync(); } - SocketManager.addGroup(param.getUserPageId() + dev, group); + SocketManager.addGroup(param.getUserPageId() + CnSocketUtil.DEV_TAG, group); } System.out.println("客户端向服务端发送消息:" + port + msg); diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyContrastClientHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyContrastClientHandler.java new file mode 100644 index 00000000..82615cd6 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyContrastClientHandler.java @@ -0,0 +1,23 @@ +package com.njcn.gather.detection.util.socket.cilent; + +import com.njcn.gather.detection.handler.SocketContrastResponseService; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.RequiredArgsConstructor; + +/** + * @author caozehui + * @data 2025-07-18 + */ +@RequiredArgsConstructor +public class NettyContrastClientHandler extends SimpleChannelInboundHandler { + + + + private final SocketContrastResponseService socketContrastResponseService; + + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception { + + } +} diff --git a/detection/src/main/java/com/njcn/gather/device/pojo/param/PqDevParam.java b/detection/src/main/java/com/njcn/gather/device/pojo/param/PqDevParam.java index 40ea09eb..8c526b7f 100644 --- a/detection/src/main/java/com/njcn/gather/device/pojo/param/PqDevParam.java +++ b/detection/src/main/java/com/njcn/gather/device/pojo/param/PqDevParam.java @@ -213,12 +213,15 @@ public class PqDevParam { @Data public static class BindPlanParam { @ApiModelProperty("检测计划ID") - @NotNull(message = DetectionValidMessage.PLAN_ID_NOT_NULL) + @NotBlank(message = DetectionValidMessage.PLAN_ID_NOT_BLANK) @Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.PLAN_ID_FORMAT_ERROR) private String planId; @ApiModelProperty("被检设备ID列表") @NotNull(message = DetectionValidMessage.PQ_DEV_IDS_NOT_NULL) private List devIds; + + @ApiModelProperty("0-解绑、1-绑定") + private Integer bindFlag; } } diff --git a/detection/src/main/java/com/njcn/gather/device/pojo/vo/PreDetection.java b/detection/src/main/java/com/njcn/gather/device/pojo/vo/PreDetection.java index 207eabcb..f457acd5 100644 --- a/detection/src/main/java/com/njcn/gather/device/pojo/vo/PreDetection.java +++ b/detection/src/main/java/com/njcn/gather/device/pojo/vo/PreDetection.java @@ -103,7 +103,7 @@ public class PreDetection { /** * 监测点线路号 */ - @JSONField(name = "pt") //todo 是否改为ct + @JSONField(name = "ct") //todo 是否改为ct private Integer ct; } diff --git a/detection/src/main/java/com/njcn/gather/plan/controller/AdPlanController.java b/detection/src/main/java/com/njcn/gather/plan/controller/AdPlanController.java index debcd093..b007e49d 100644 --- a/detection/src/main/java/com/njcn/gather/plan/controller/AdPlanController.java +++ b/detection/src/main/java/com/njcn/gather/plan/controller/AdPlanController.java @@ -40,7 +40,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; - /** * @author caozehui * @date 2024-12-09 @@ -186,7 +185,6 @@ public class AdPlanController extends BaseController { adPlanService.analyse(ids); } - @OperateInfo(info = LogEnum.BUSINESS_COMMON) @PostMapping("/listByPlanId") @ApiOperation("查询出所有已绑定的设备") @@ -247,7 +245,7 @@ public class AdPlanController extends BaseController { for (PqDevVO pqDevVO : pqDevVOPage.getRecords()) { if (StrUtil.isNotBlank(pqDevVO.getPlanId())) { AdPlan plan1 = planList.stream().filter(p -> p.getId().equals(pqDevVO.getPlanId())).findFirst().get(); - if (!ObjectUtil.isNotNull(plan1) && plan.getId().equals(plan1.getFatherPlanId())) { + if (ObjectUtil.isNotNull(plan1) && plan.getId().equals(plan1.getFatherPlanId())) { pqDevVO.setBoundPlanName(plan1.getName()); pqDevVO.setAssign(DataStateEnum.ENABLE.getCode()); } else { @@ -317,7 +315,6 @@ public class AdPlanController extends BaseController { } } - @OperateInfo(info = LogEnum.BUSINESS_COMMON) @PostMapping("/updateBindDev") @ApiOperation("子计划绑定/解绑被检设备") @@ -326,7 +323,7 @@ public class AdPlanController extends BaseController { String methodDescribe = getMethodDescribe("updateBindDev"); LogUtil.njcnDebug(log, "{},绑定/解绑参数为:{}", methodDescribe, param); - boolean result = adPlanService.updateBindDev(param.getPlanId(), param.getDevIds()); + boolean result = adPlanService.updateBindDev(param); if (result) { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe); } else { @@ -334,7 +331,6 @@ public class AdPlanController extends BaseController { } } - // @OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DELETE) // @PostMapping("/deleteSubPlan") // @ApiOperation("删除子计划") diff --git a/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java b/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java index ed0113d0..e6a13de0 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java @@ -163,7 +163,7 @@ public interface IAdPlanService extends IService { * @param pqDevIds * @return */ - boolean updateBindDev(String planId, List pqDevIds); + boolean updateBindDev(PqDevParam.BindPlanParam param); /** * 子计划绑定/解绑标准设备 diff --git a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java index 882df622..4bb08ef1 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java @@ -324,12 +324,25 @@ public class AdPlanServiceImpl extends ServiceImpl impleme // 修改检测计划、检测源关联 adPlanSourceService.updateAdPlanSource(param.getId(), param.getSourceIds()); } + // 若修改了名称,则修改相关子计划的来源字段 + if (!plan1.getName().equals(param.getName()) && CommonEnum.FATHER_ID.getValue().equals(plan1.getFatherPlanId())) { + this.lambdaUpdate().in(AdPlan::getFatherPlanId, plan1.getId()).eq(AdPlan::getState, DataStateEnum.ENABLE.getCode()) + .set(AdPlan::getOrigin, param.getName()).update(); + } return this.updateById(plan2); } @Override @Transactional public boolean deleteAdPlan(List ids, String pattern) { + for (String id : ids) { + PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); + queryParam.setPlanIdList(Arrays.asList(id)); + if (ObjectUtils.isNotEmpty(pqDevService.listByPlanId(queryParam))) { + throw new BusinessException(DetectionResponseEnum.PLAN_HAS_DEVICE_BIND); + } + } + DictData dictData = dictDataService.getDictDataById(pattern); if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) { List planList = this.lambdaQuery().in(AdPlan::getFatherPlanId, ids).eq(AdPlan::getState, DataStateEnum.ENABLE.getCode()).list(); @@ -339,23 +352,14 @@ public class AdPlanServiceImpl extends ServiceImpl impleme // 删除检测计划、标准设备关联 adPlanStandardDevService.deleteAdPlanStandardDev(ids); + } else { + // 删除相关检测表格 + List codeList = this.listByIds(ids).stream().map(plan -> String.valueOf(plan.getCode())).collect(Collectors.toList()); + tableGenService.deleteTable(codeList); + // 删除检测计划、检测源关联 + adPlanSourceService.deleteAdPlanSourceByPlanIds(ids); } - for (String id : ids) { - PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); - queryParam.setPlanIdList(Arrays.asList(id)); - if (ObjectUtils.isNotEmpty(pqDevService.listByPlanId(queryParam))) { - throw new BusinessException(DetectionResponseEnum.PLAN_HAS_DEVICE_BIND); - } - } - - // 删除检测计划、检测源关联 - adPlanSourceService.deleteAdPlanSourceByPlanIds(ids); - - // 删除相关检测表格 - List codeList = this.listByIds(ids).stream().map(plan -> String.valueOf(plan.getCode())).collect(Collectors.toList()); - tableGenService.deleteTable(codeList); - return this.lambdaUpdate().in(AdPlan::getId, ids).set(AdPlan::getState, DataStateEnum.DELETED.getCode()).update(); } @@ -702,26 +706,39 @@ public class AdPlanServiceImpl extends ServiceImpl impleme @Override @Transactional public boolean updateSubPlanName(String planId, String name) { - AdPlan plan = new AdPlan(); - plan.setId(planId); + AdPlan plan = this.getById(planId); plan.setName(name); return this.updateById(plan); } @Override - public boolean updateBindDev(String planId, List pqDevIds) { + public boolean updateBindDev(PqDevParam.BindPlanParam param) { + List list = new ArrayList<>(); - AdPlan plan = this.getById(planId); - plan.setTestState(pqDevService.bind(planId, pqDevIds)); + AdPlan plan = this.getById(param.getPlanId()); + AdPlan fatherPlan = this.getById(plan.getFatherPlanId()); + + List pqDevList1 = pqDevService.list(new QueryWrapper().eq("Plan_Id", param.getPlanId()).eq("State", DataStateEnum.ENABLE.getCode())); + List devIds1 = pqDevList1.stream().map(PqDev::getId).collect(Collectors.toList()); + + List pqDevList2 = pqDevService.list(new QueryWrapper().eq("Plan_Id", fatherPlan.getId()).eq("State", DataStateEnum.ENABLE.getCode())); + List devIds2 = pqDevList2.stream().map(PqDev::getId).collect(Collectors.toList()); + + if (param.getBindFlag().equals(1)) { + devIds1.addAll(param.getDevIds()); + devIds2.removeAll(param.getDevIds()); + } else { + devIds1.removeAll(param.getDevIds()); + devIds2.addAll(param.getDevIds()); + } + + plan.setTestState(pqDevService.bind(param.getPlanId(), devIds1)); list.add(plan); - // 同时修改父计划的绑定 - AdPlan fatherPlan = this.getById(plan.getFatherPlanId()); - if (ObjectUtil.isNotNull(fatherPlan)) { - fatherPlan.setTestState(pqDevService.bind(fatherPlan.getId(), pqDevIds)); - list.add(fatherPlan); - } + fatherPlan.setTestState(pqDevService.bind(fatherPlan.getId(), devIds2)); + list.add(fatherPlan); + return this.updateBatchById(list); } diff --git a/detection/src/main/java/com/njcn/gather/pojo/constant/DetectionValidMessage.java b/detection/src/main/java/com/njcn/gather/pojo/constant/DetectionValidMessage.java index f5c2d3fd..2d6f8321 100644 --- a/detection/src/main/java/com/njcn/gather/pojo/constant/DetectionValidMessage.java +++ b/detection/src/main/java/com/njcn/gather/pojo/constant/DetectionValidMessage.java @@ -52,7 +52,7 @@ public interface DetectionValidMessage { String RECHECK_NUM_NOT_NULL = "检测次数不能为空,请检查reCheckNum参数"; - String PLAN_ID_NOT_NULL = "检测计划ID不能为空,请检查planId参数"; + String PLAN_ID_NOT_BLANK = "检测计划ID不能为空,请检查planId参数"; String PQ_DEV_IDS_NOT_NULL = "设备ID集合不能为null,请检查pqDevIds参数"; @@ -196,4 +196,7 @@ public interface DetectionValidMessage { String INSPECT_DATE_NOT_NULL = "定检日期不能为空"; String HARM_SYS_ID_NOT_BLANK = "谐波系统设备id不能为空"; String FATHER_PLAN_ID_FORMAT_ERROR = "父计划ID格式错误"; + String DEV_IDS_NOT_EMPTY = "被检设备不能为空"; + String STANDARD_DEV_IDS_NOT_EMPTY = "标准设备不能为空"; + String PAIRS_NOT_EMPTY = "配对关系不能为空"; } diff --git a/detection/src/main/java/com/njcn/gather/result/pojo/param/ResultParam.java b/detection/src/main/java/com/njcn/gather/result/pojo/param/ResultParam.java index 2f202424..8c934d58 100644 --- a/detection/src/main/java/com/njcn/gather/result/pojo/param/ResultParam.java +++ b/detection/src/main/java/com/njcn/gather/result/pojo/param/ResultParam.java @@ -49,7 +49,7 @@ public class ResultParam { public static class QueryParam { @ApiModelProperty(value = "检测计划Id", required = true) - @NotBlank(message = DetectionValidMessage.PLAN_ID_NOT_NULL) + @NotBlank(message = DetectionValidMessage.PLAN_ID_NOT_BLANK) @Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.PLAN_ID_FORMAT_ERROR) private String planId; @@ -68,7 +68,7 @@ public class ResultParam { @Data public static class ChangeErrorSystemParam { @ApiModelProperty(value = "检测计划Id", required = true) - @NotBlank(message = DetectionValidMessage.PLAN_ID_NOT_NULL) + @NotBlank(message = DetectionValidMessage.PLAN_ID_NOT_BLANK) @Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.PLAN_ID_FORMAT_ERROR) private String planId;