检测计划相关功能代码-补充

This commit is contained in:
caozehui
2025-07-21 08:42:37 +08:00
parent 858fc9aa05
commit 95d5396759
20 changed files with 354 additions and 144 deletions

View File

@@ -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<String> startContrastTest(@RequestBody @Validated ContrastDetectionParam param) {
String methodDescribe = getMethodDescribe("startContrastTest");
preDetectionService.startContrastTest(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
}

View File

@@ -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;
}
}
}

View File

@@ -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<String> xiSocket) {
System.out.println(XiNumberManager.stepNumber + "从装置中已经完成获取测试数据,准备开始计算----------------------");
Map<String, List<DevData>> realDataXiMap = FormalTestManager.realDataXiList.stream().collect(Collectors.groupingBy(it -> it.getId().split(splitTag)[0]));
Map<String, List<DevData>> 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<String> 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<Object> 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<String> 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<String> 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<Object> 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<Object> 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<String> 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<Integer> resultFlagList = new ArrayList<>();
List<PreDetection.MonitorListDTO> 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<List<DevLineTestResult>> 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<String> 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<DevData.SqlDataDTO> dataV = sqlData.stream().filter(x -> type.get(0).equals(x.getDesc())).collect(Collectors.toList());
List<DevData.SqlDataDTO> 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()) {

View File

@@ -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<PreDetection> devList = iPqDevService.getDevInfo(param.getDevIds());
Map<String, List<PreDetection>> 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<PreDetection> 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<String> 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<Object> 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);

View File

@@ -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<String> devIds;
@ApiModelProperty("标准设备ID列表")
@NotEmpty(message = DetectionValidMessage.STANDARD_DEV_IDS_NOT_EMPTY)
private List<String> standardDevIds;
@ApiModelProperty("配对关系")
@NotEmpty(message = DetectionValidMessage.PAIRS_NOT_EMPTY)
private Map<String,String> pairs;
/**
* 检测项列表。第一个元素为预检测、第二个元素为系数校准、第三个元素为正式检测
*/
private List<Boolean> testItemList;
}

View File

@@ -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);
}

View File

@@ -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<String, List<PreDetection>> map = new HashMap<>(1);
// List<PreDetection> 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<PqDev> pqDevList = iPqDevService.listByIds(param.getDevIds());
private void checkDevIp(List<String> devIds) {
List<PqDev> pqDevList = iPqDevService.listByIds(devIds);
List<String> 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);
}
}

View File

@@ -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());
}
}
}

View File

@@ -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<String> 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<Object> 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<Object> 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<String> 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();
}
}

View File

@@ -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<String,String> harmonicRelationMap = new HashMap<>();
/**
* 当前正在检测的计划
*/
public static AdPlan currentTestPlan;
}

View File

@@ -23,13 +23,8 @@ import java.util.concurrent.TimeUnit;
* @Description: 心跳处理类
*/
public class HeartbeatHandler extends SimpleChannelInboundHandler<String> {
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<String> {
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<String> {
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; // 重置连续心跳丢失次数
}

View File

@@ -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<String> 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);

View File

@@ -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<String> {
private final SocketContrastResponseService socketContrastResponseService;
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
}
}

View File

@@ -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<String> devIds;
@ApiModelProperty("0-解绑、1-绑定")
private Integer bindFlag;
}
}

View File

@@ -103,7 +103,7 @@ public class PreDetection {
/**
* 监测点线路号
*/
@JSONField(name = "pt") //todo 是否改为ct
@JSONField(name = "ct") //todo 是否改为ct
private Integer ct;
}

View File

@@ -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("删除子计划")

View File

@@ -163,7 +163,7 @@ public interface IAdPlanService extends IService<AdPlan> {
* @param pqDevIds
* @return
*/
boolean updateBindDev(String planId, List<String> pqDevIds);
boolean updateBindDev(PqDevParam.BindPlanParam param);
/**
* 子计划绑定/解绑标准设备

View File

@@ -324,12 +324,25 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> 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<String> 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<AdPlan> planList = this.lambdaQuery().in(AdPlan::getFatherPlanId, ids).eq(AdPlan::getState, DataStateEnum.ENABLE.getCode()).list();
@@ -339,23 +352,14 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
// 删除检测计划、标准设备关联
adPlanStandardDevService.deleteAdPlanStandardDev(ids);
} else {
// 删除相关检测表格
List<String> 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<String> 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<AdPlanMapper, AdPlan> 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<String> pqDevIds) {
public boolean updateBindDev(PqDevParam.BindPlanParam param) {
List<AdPlan> 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<PqDev> pqDevList1 = pqDevService.list(new QueryWrapper<PqDev>().eq("Plan_Id", param.getPlanId()).eq("State", DataStateEnum.ENABLE.getCode()));
List<String> devIds1 = pqDevList1.stream().map(PqDev::getId).collect(Collectors.toList());
List<PqDev> pqDevList2 = pqDevService.list(new QueryWrapper<PqDev>().eq("Plan_Id", fatherPlan.getId()).eq("State", DataStateEnum.ENABLE.getCode()));
List<String> 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);
}

View File

@@ -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 = "配对关系不能为空";
}

View File

@@ -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;