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 9e3b2a74..d2c23afa 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 @@ -9,6 +9,7 @@ import com.njcn.gather.detection.pojo.param.SimulateDetectionParam; import com.njcn.gather.detection.service.PreDetectionService; import com.njcn.web.controller.BaseController; import com.njcn.web.utils.HttpResultUtil; +import com.njcn.web.utils.RequestUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; 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 index f6769385..a15ad1cd 100644 --- a/detection/src/main/java/com/njcn/gather/detection/handler/SocketContrastResponseService.java +++ b/detection/src/main/java/com/njcn/gather/detection/handler/SocketContrastResponseService.java @@ -1,42 +1,58 @@ package com.njcn.gather.detection.handler; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; +import com.google.common.collect.HashBiMap; import com.njcn.gather.detection.pojo.enums.DetectionCodeEnum; import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum; import com.njcn.gather.detection.pojo.param.ContrastDetectionParam; +import com.njcn.gather.detection.pojo.param.DevPhaseSequenceParam; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.po.DevData; import com.njcn.gather.detection.pojo.po.IcdCheckData; +import com.njcn.gather.detection.pojo.vo.AlignDataVO; import com.njcn.gather.detection.pojo.vo.SocketDataMsg; import com.njcn.gather.detection.pojo.vo.SocketMsg; import com.njcn.gather.detection.pojo.vo.WebSocketVO; import com.njcn.gather.detection.util.DetectionUtil; -import com.njcn.gather.detection.util.socket.*; +import com.njcn.gather.detection.util.socket.CnSocketUtil; +import com.njcn.gather.detection.util.socket.FormalTestManager; +import com.njcn.gather.detection.util.socket.MsgUtil; +import com.njcn.gather.detection.util.socket.SocketManager; import com.njcn.gather.detection.util.socket.websocket.WebServiceManager; +import com.njcn.gather.device.pojo.enums.PatternEnum; import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.device.service.IPqDevService; import com.njcn.gather.device.service.IPqStandardDevService; import com.njcn.gather.plan.pojo.enums.DataSourceEnum; import com.njcn.gather.plan.service.IAdPlanService; +import com.njcn.gather.storage.pojo.po.ContrastHarmonicResult; +import com.njcn.gather.storage.pojo.po.ContrastNonHarmonicResult; +import com.njcn.gather.storage.service.DetectionDataDealService; import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum; import com.njcn.gather.system.dictionary.pojo.po.DictData; import com.njcn.gather.system.dictionary.pojo.po.DictTree; import com.njcn.gather.system.dictionary.service.IDictDataService; import com.njcn.gather.system.dictionary.service.IDictTreeService; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.lang.reflect.Field; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @author caozehui @@ -51,6 +67,19 @@ public class SocketContrastResponseService { private final IPqDevService pqDevService; private final IPqStandardDevService pqStandardDevService; private final IDictTreeService dictTreeService; + private final DetectionDataDealService detectionDataDealService; + private final List nonHarmonicList = Stream.of( + DetectionCodeEnum.FREQ.getCode(), + DetectionCodeEnum.VRMS.getCode(), + DetectionCodeEnum.IRMS.getCode(), + DetectionCodeEnum.V_UNBAN.getCode(), + DetectionCodeEnum.I_UNBAN.getCode(), + DetectionCodeEnum.U1.getCode(), + DetectionCodeEnum.V2_50.getCode(), + DetectionCodeEnum.I1.getCode(), + DetectionCodeEnum.I2_50.getCode(), + DetectionCodeEnum.MAG.getCode(), + DetectionCodeEnum.DUR.getCode()).collect(Collectors.toList()); /** * 定时器 @@ -70,7 +99,7 @@ public class SocketContrastResponseService { /** * 成功的配对 */ - private Map successPair = new HashMap<>(); + private Map successPair = HashBiMap.create(); /** * 接收数据成功的测点(设备ip_通道号) @@ -82,17 +111,6 @@ public class SocketContrastResponseService { */ Set failComm = new HashSet<>(); - /** - * 相序校验-电压或电流校验的组数 - */ - @Value("${detection.xujy.volOrCur}") - private Integer volOrCurCheckCount; - - /** - * 相序校验-相角校验的组数 - */ - @Value("${detection.xujy.phase}") - private Integer phaseCheckCount; private static final Map> testItemCodeMap = new HashMap() {{ put("FREQ", Arrays.asList("real$FREQ")); @@ -103,7 +121,6 @@ public class SocketContrastResponseService { put("HP", Arrays.asList("real$P2-50")); put("HSV", Arrays.asList("real$SV_1-49")); put("HSI", Arrays.asList("real$SI_1-49")); - put("VOLTAGE", Arrays.asList("avg$MAG", "avg$DUR")); // put("I", Arrays.asList("real$IRMS", "real$IA")); put("I", Arrays.asList("real$IRMS")); put("IMBV", Arrays.asList("real$V_UNBAN")); @@ -134,6 +151,8 @@ public class SocketContrastResponseService { FormalTestManager.pairsMap.putAll(param.getPairs()); FormalTestManager.currentTestPlan = adPlanService.getById(param.getPlanId()); + DictData pattern = dictDataService.getById(FormalTestManager.currentTestPlan.getPattern()); + FormalTestManager.patternEnum = PatternEnum.getEnum(pattern.getCode()); List pqDevList = pqDevService.getDevInfo(param.getDevIds()); // key为被检设备id_通道号,value为监测点DTO @@ -141,25 +160,25 @@ public class SocketContrastResponseService { pqDevList.forEach(x -> { List monitorList = x.getMonitorList(); //移除不做检测的监测点 - monitorList.removeIf(y -> !param.getPairs().containsValue(x.getDevId() + y.getLine())); + monitorList.removeIf(y -> !FormalTestManager.pairsMap.containsKey(x.getDevId() + CnSocketUtil.SPLIT_TAG + y.getLine())); monitorList.forEach(y -> { - devMonitorMap.put(x.getDevId() + "_" + y.getLine(), y); + devMonitorMap.put(x.getDevId() + CnSocketUtil.SPLIT_TAG + y.getLine(), y); }); }); FormalTestManager.devList.clear(); FormalTestManager.devList.addAll(pqDevList); - // key为标准设备id,value为标准设备下的监测点列表 + // key为标准设备id,value为标准设备下的监测点列表(Id_通道号) Map> pairsMap = new HashMap<>(); - param.getPairs().forEach((key, value) -> { - String[] split = key.split("_"); + FormalTestManager.pairsMap.forEach((key, value) -> { + String[] split = value.split(CnSocketUtil.SPLIT_TAG); List monitorIdList = pairsMap.getOrDefault(split[0], new ArrayList<>()); - monitorIdList.add(key); + monitorIdList.add(value); pairsMap.put(split[0], monitorIdList); }); FormalTestManager.standardDevList.clear(); - List standardDevIds = param.getPairs().keySet().stream().map(key -> key.split("_")[0]).distinct().collect(Collectors.toList()); + List standardDevIds = FormalTestManager.pairsMap.values().stream().map(key -> key.split(CnSocketUtil.SPLIT_TAG)[0]).distinct().collect(Collectors.toList()); FormalTestManager.standardDevList.addAll(pqStandardDevService.listStandardDevPreDetection(standardDevIds)); // 标准设备根据配对关系设置监测点 @@ -168,32 +187,32 @@ public class SocketContrastResponseService { pairsMap.get(x.getDevId()).forEach(y -> { PreDetection.MonitorListDTO monitorListDTO = new PreDetection.MonitorListDTO(); - monitorListDTO.setLineId(y); - String[] split = y.split("_"); + String[] split = y.split(CnSocketUtil.SPLIT_TAG); + monitorListDTO.setLineId(x.getDevIP() + CnSocketUtil.SPLIT_TAG + split[1]); monitorListDTO.setLine(Integer.valueOf(split[1])); - PreDetection.MonitorListDTO monitorListDTO1 = devMonitorMap.get(param.getPairs().get(y)); + PreDetection.MonitorListDTO monitorListDTO1 = devMonitorMap.get(FormalTestManager.pairsMap.inverse().get(y)); monitorListDTO.setConnection(monitorListDTO1.getConnection()); - monitorListDTO.setPt(monitorListDTO1.getPt()); - monitorListDTO.setCt(monitorListDTO1.getCt()); - monitorListDTO.setStatInterval(monitorListDTO.getStatInterval()); + monitorListDTO.setPtStr(monitorListDTO1.getPtStr()); + monitorListDTO.setCtStr(monitorListDTO1.getCtStr()); + monitorListDTO.setStatInterval(monitorListDTO1.getStatInterval()); monitorList.add(monitorListDTO); }); x.setMonitorList(monitorList); }); FormalTestManager.devDataMap.clear(); - FormalTestManager.devDataMap.putAll(param.getDevIds().stream().collect(Collectors.toMap(x -> x, x -> new ArrayList<>()))); + FormalTestManager.devDataMap.putAll(FormalTestManager.devList.stream().flatMap(x -> x.getMonitorList().stream()).collect(Collectors.toMap(PreDetection.MonitorListDTO::getLineId, x -> new ArrayList<>()))); FormalTestManager.standardDevDataMap.clear(); - FormalTestManager.standardDevDataMap.putAll(param.getStandardDevIds().stream().collect(Collectors.toMap(x -> x, x -> new ArrayList<>()))); + FormalTestManager.standardDevDataMap.putAll(FormalTestManager.standardDevList.stream().flatMap(x -> x.getMonitorList().stream()).collect(Collectors.toMap(PreDetection.MonitorListDTO::getLineId, x -> new ArrayList<>()))); FormalTestManager.monitorMap.clear(); - //FormalTestManager.monitorMap.putAll(FormalTestManager.standardDevList.stream().flatMap(x -> x.getMonitorList().stream()).collect(Collectors.toMap(PreDetection.MonitorListDTO::getLineId, obj -> obj))); FormalTestManager.monitorMap.putAll(FormalTestManager.devList.stream().flatMap(x -> x.getMonitorList().stream()).collect(Collectors.toMap(PreDetection.MonitorListDTO::getLineId, obj -> obj))); + FormalTestManager.monitorMap.putAll(FormalTestManager.standardDevList.stream().flatMap(x -> x.getMonitorList().stream()).collect(Collectors.toMap(PreDetection.MonitorListDTO::getLineId, obj -> obj))); FormalTestManager.devMapMonitorNum.clear(); - FormalTestManager.devMapMonitorNum.putAll(pqDevList.stream().collect(Collectors.toMap(PreDetection::getDevIP, it -> it.getMonitorList().stream().map(PreDetection.MonitorListDTO::getLineId).collect(Collectors.toList())))); + FormalTestManager.devMapMonitorNum.putAll(FormalTestManager.devList.stream().collect(Collectors.toMap(PreDetection::getDevIP, it -> it.getMonitorList().stream().map(PreDetection.MonitorListDTO::getLineId).collect(Collectors.toList())))); FormalTestManager.devMapMonitorNum.putAll(FormalTestManager.standardDevList.stream().collect(Collectors.toMap(PreDetection::getDevIP, it -> it.getMonitorList().stream().map(PreDetection.MonitorListDTO::getLineId).collect(Collectors.toList())))); FormalTestManager.testItemCodeList.clear(); @@ -209,26 +228,36 @@ public class SocketContrastResponseService { FormalTestManager.dataRule = DictDataEnum.SECTION_VALUE; } + FormalTestManager.harmonicRelationMap.put(DetectionCodeEnum.V2_50.getCode(), DetectionCodeEnum.U1.getCode()); + FormalTestManager.harmonicRelationMap.put(DetectionCodeEnum.I2_50.getCode(), DetectionCodeEnum.I1.getCode()); + FormalTestManager.devNameMapComm.clear(); + FormalTestManager.devNameMapComm.putAll(FormalTestManager.devList.stream().collect(Collectors.toMap(PreDetection::getDevIP, PreDetection::getDevName))); + FormalTestManager.devNameMapComm.putAll(FormalTestManager.standardDevList.stream().collect(Collectors.toMap(PreDetection::getDevIP, PreDetection::getDevName))); + + FormalTestManager.devIdMapComm.clear(); + FormalTestManager.devIdMapComm.putAll(FormalTestManager.devList.stream().collect(Collectors.toMap(PreDetection::getDevIP, PreDetection::getDevId))); + FormalTestManager.devIdMapComm.putAll(FormalTestManager.standardDevList.stream().collect(Collectors.toMap(PreDetection::getDevIP, PreDetection::getDevId))); + + FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_SBTXJY; } public void deal(PreDetectionParam param, String msg) throws Exception { SocketDataMsg socketDataMsg = MsgUtil.socketDataMsg(msg); - String[] tem = socketDataMsg.getRequestId().split(CnSocketUtil.STEP_TAG); - SourceOperateCodeEnum sourceOperateCodeEnum = SourceOperateCodeEnum.getDictDataEnumByCode(tem[0]); - switch (Objects.requireNonNull(sourceOperateCodeEnum)) { + switch (Objects.requireNonNull(FormalTestManager.currentStep)) { //设备通讯校验 case YJC_SBTXJY: this.devComm(socketDataMsg, param); break; - case YJC_ALIGN: - this.alignDeal(socketDataMsg, param); - break; //模型一致性校验 case YJC_MXYZXJY: this.modelDeal(socketDataMsg, param); break; + // 实时数据对齐校验 + case YJC_ALIGN: + this.alignDeal(socketDataMsg, param); + break; //相序校验 case YJC_XUJY: this.devXu(param, socketDataMsg); @@ -237,6 +266,12 @@ public class SocketContrastResponseService { case FORMAL_REAL: this.formalDeal(param, socketDataMsg); break; + //退出关闭 + case QUITE: + quitDeal(socketDataMsg, param); + break; + default: + break; } } @@ -247,7 +282,7 @@ public class SocketContrastResponseService { */ private void devComm(SocketDataMsg socketDataMsg, PreDetectionParam param) { SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); - String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; + String s = param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG; SocketMsg socketMsg = new SocketMsg<>(); if (ObjectUtil.isNotNull(dictDataEnumByCode)) { @@ -262,39 +297,27 @@ public class SocketContrastResponseService { if (successComm.size() == FormalTestManager.monitorMap.size()) { // 通知前端整个装置通讯检测过程成功 SocketDataMsg temMsg = new SocketDataMsg(); - temMsg.setCode(SourceResponseCodeEnum.DEV_COMM_ALL_SUCCESS.getCode()); + temMsg.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode()); temMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_01.getValue()); temMsg.setRequestId(SourceOperateCodeEnum.YJC_SBTXJY.getValue()); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(temMsg)); - successComm.clear(); - failComm.clear(); -// 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_MXYZXJY.getValue()); - socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_02.getValue()); -// socketMsg.setData(jsonString); - String json = JSON.toJSONString(socketMsg); - - - socketMsg.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); - socketMsg.setOperateCode(SourceOperateCodeEnum.VERIFY_MAPPING$01.getValue()); - Map map = new HashMap<>(2); - map.put("dataType", FormalTestManager.testItemCodeList); - icdTypeList = FormalTestManager.devList.stream().map(PreDetection::getIcdType).distinct().collect(Collectors.toList()); - icdTypeList.addAll(FormalTestManager.standardDevList.stream().map(PreDetection::getIcdType).distinct().collect(Collectors.toList())); - map.put("icdType", icdTypeList.get(0)); - socketMsg.setData(JSON.toJSONString(map)); - SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); - - + //开始模型一致性校验 System.out.println("装置通信成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始模型一致性校验》》》》》》》》》》》》》》》》"); - SocketManager.sendMsg(s, json); + + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam(); + phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()]))); + phaseSequenceParam.setDataType(FormalTestManager.testItemCodeList); + phaseSequenceParam.setReadCount(1); + phaseSequenceParam.setIgnoreCount(0); + socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); + + FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_MXYZXJY; + SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); + // 实时数据开始计时 + SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); } completeJudgment(param); break; @@ -313,10 +336,10 @@ public class SocketContrastResponseService { break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); break; case NO_INIT_DEV: - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -325,101 +348,170 @@ public class SocketContrastResponseService { } } + /** + * 协议检测 + */ +// private void protocolDeal(SocketDataMsg socketDataMsg, PreDetectionParam param) { +// SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); +// SocketMsg socketMsg = new SocketMsg<>(); +// String s = param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG; +// switch (Objects.requireNonNull(dictDataEnumByCode)) { +// case SUCCESS: +// if (socketDataMsg.getOperateCode().equals(SourceOperateCodeEnum.DEV_INIT_GATHER_02.getValue())) { +// successComm.add(socketDataMsg.getData()); +// // 推送前端单个测点协议校验成功 +// WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 1)); +// if (successComm.size() == FormalTestManager.monitorMap.size()) { +// for (String string : successComm) { +// //模拟统计协议校验,通讯校验已经校验过,模拟直接推送 +// SocketDataMsg webSend = new SocketDataMsg(); +// webSend.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); +// webSend.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_02.getValue()); +// webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); +// webSend.setData(string); +// WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 1)); +// } +// +// this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); +// +// SocketDataMsg webSend = new SocketDataMsg(); +// webSend.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); +// webSend.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_02.getValue()); +// webSend.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode()); +// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); +// +// System.out.println("协议校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始模型一致性校验》》》》》》》》》》》》》》》》"); +// socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue()); +// socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); +// DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam(); +// phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()]))); +// phaseSequenceParam.setDataType(FormalTestManager.testItemCodeList); +// phaseSequenceParam.setReadCount(this.getMaxReadCount(1)); +// phaseSequenceParam.setIgnoreCount(0); +// socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); +// +// FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_MXYZXJY; +// SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); +// // 实时数据开始计时 +// SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); +// } +// } +// completeJudgment(param); +// break; +// case UNPROCESSED_BUSINESS: +// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); +// break; +// case DEV_ERROR: +// failComm.addAll(FormalTestManager.devMapMonitorNum.get(socketDataMsg.getData())); +// WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 0)); +// completeJudgment(param); +// break; +// case DEV_TARGET: +// failComm.add(socketDataMsg.getData()); +// WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 1)); +// completeJudgment(param); +// break; +// case RE_OPERATE: +// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); +// CnSocketUtil.contrastSendquit(param.getUserPageId()); +// break; +// case ICD_NOT_FOUND: +// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); +// CnSocketUtil.contrastSendquit(param.getUserPageId()); +// break; +// default: +// break; +// } +// } /** * 模型一致性校验 */ private void modelDeal(SocketDataMsg socketDataMsg, PreDetectionParam param) { SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); - String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; + String s = param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG; SocketMsg socketMsg = new SocketMsg<>(); + DevData devData = JSON.parseObject(socketDataMsg.getData(), DevData.class); if (ObjectUtil.isNotNull(dictDataEnumByCode)) { switch (dictDataEnumByCode) { case SUCCESS: - if (socketDataMsg.getOperateCode().equals(SourceOperateCodeEnum.VERIFY_MAPPING$01.getValue())) { - String data = socketDataMsg.getData(); - IcdCheckData icdCheckData = JSON.parseObject(data, IcdCheckData.class); + //成功收到数据后重置超时统计时间 + SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); + String monitorId1 = devData.getId(); + successComm.add(monitorId1); - boolean isContinue = true; - for (int i = 0; i < icdCheckData.getResultData().size(); i++) { - IcdCheckData.ResultData item = icdCheckData.getResultData().get(i); - Integer errorType = SocketDevResponseService.getErrorType(item.getDesc(), item.getPhaseResult()); - // 校验脚本与icd校验失败 - if (errorType.equals(0)) { - isContinue = false; - Map map = new HashMap<>(2); - map.put("icdType", icdCheckData.getIcdType()); - DetectionCodeEnum anEnum = DetectionCodeEnum.getDetectionCodeByCode(item.getDesc()); - map.put("dataType", anEnum.getMessage()); - WebSocketVO webSocketVO = new WebSocketVO<>(); - webSocketVO.setData(JSON.toJSONString(map)); - webSocketVO.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); - webSocketVO.setOperateCode(SourceOperateCodeEnum.VERIFY_MAPPING$01.getValue()); - webSocketVO.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); - WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); - CnSocketUtil.quitSend(param); - break; - } - } - - - icdCheckDataMap.put(icdCheckData.getIcdType(), icdCheckData); - if (isContinue) { - if (icdCheckDataMap.size() == icdTypeList.size()) { - SocketDataMsg temMsg = new SocketDataMsg(); - temMsg.setCode(SourceResponseCodeEnum.DEV_COMM_ALL_SUCCESS.getCode()); - temMsg.setOperateCode(SourceOperateCodeEnum.VERIFY_MAPPING$01.getValue()); - temMsg.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); - WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(temMsg)); - - System.out.println("模型一致性校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始实时数据对齐校验》》》》》》》》》》》》》》》》"); - // 实时数据开始计时 - SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); -// socketMsg.setData(JSON.toJSONString(sourceIssues.get(0))); -// 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() + CnSocketUtil.START_TAG); -// webSocketVO.setDesc(null); -// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); - - } else { - // 发送下一个脚本与icd校验 - String icdType = icdTypeList.stream().filter(it -> !icdCheckDataMap.containsKey(it)).findFirst().orElse(null); - if (ObjectUtil.isNotNull(icdType)) { - Map map = new HashMap<>(2); - map.put("dataType", FormalTestManager.testItemCodeList); - map.put("icdType", icdType); - socketMsg.setData(JSON.toJSONString(map)); - socketMsg.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); - socketMsg.setOperateCode(SourceOperateCodeEnum.VERIFY_MAPPING$01.getValue()); - SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); - } - } - } + if (FormalTestManager.standardDevDataMap.containsKey(monitorId1)) { + FormalTestManager.standardDevDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.standardDevDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + } + if (FormalTestManager.devDataMap.containsKey(monitorId1)) { + FormalTestManager.devDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.devDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); } + if (successComm.size() == FormalTestManager.monitorMap.size()) { + + boolean modelCheckResult = this.modelCheck(param, FormalTestManager.devDataMap); + modelCheckResult = modelCheckResult && this.modelCheck(param, FormalTestManager.standardDevDataMap); + if (!modelCheckResult) { + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_MXYZXJY.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode()); //最终错误推送 + WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 0)); + + System.out.println("模型一致性校验失败!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》"); + CnSocketUtil.contrastSendquit(param.getUserPageId()); + return; + } else { + this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_MXYZXJY.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode());//最终成功推送 + WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 0)); + + System.out.println("模型一致性校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始实时数据对齐校验》》》》》》》》》》》》》》》》"); + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam(); + phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()]))); + phaseSequenceParam.setDataType(Arrays.asList("real$VRMS")); + phaseSequenceParam.setReadCount(this.getMaxReadCount(5)); + phaseSequenceParam.setIgnoreCount(0); + socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); + + FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_ALIGN; + SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); + // 实时数据开始计时 + SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); + } + } + completeJudgment(param); break; case UNPROCESSED_BUSINESS: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); break; case DEV_ERROR: + failComm.addAll(FormalTestManager.devMapMonitorNum.get(socketDataMsg.getData())); WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 0)); - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); + completeJudgment(param); break; case DEV_TARGET: + failComm.add(socketDataMsg.getData()); WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 1)); - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); + completeJudgment(param); break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); break; case NO_INIT_DEV: - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -436,48 +528,79 @@ public class SocketContrastResponseService { */ private void alignDeal(SocketDataMsg socketDataMsg, PreDetectionParam param) { SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); - String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; + String s = param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG; SocketMsg socketMsg = new SocketMsg<>(); - DevData devData = JSON.parseObject(socketMsg.getData(), DevData.class); - String id1 = devData.getId(); + DevData devData = JSON.parseObject(socketDataMsg.getData(), DevData.class); if (ObjectUtil.isNotNull(dictDataEnumByCode)) { switch (dictDataEnumByCode) { case SUCCESS: + case NORMAL_RESPONSE: + String monitorId1 = devData.getId(); + //成功收到数据后重置超时统计时间 + SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); if (Objects.isNull(scheduler)) { scheduler = Executors.newScheduledThreadPool(1); scheduledFuture = scheduler.schedule(() -> { if (!alignCheckResult) { System.out.println("1minute内实时数据对齐校验失败!"); + + // 向通讯模块发送不再接收数据 + this.sendNotReceiveData(s); + + successPair.clear(); + this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + + Collection disjunction = CollectionUtil.disjunction(FormalTestManager.pairsMap.keySet(), successPair.keySet()); + // 向前端推送实时数据对齐失败的配对项 + for (String key : disjunction) { + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_ALIGN.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(MsgUtil.getPairStr(key, FormalTestManager.pairsMap.inverse().get(key), FormalTestManager.devNameMapComm)); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + } + // 推送最终失败结果 + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_ALIGN.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode());//最终错误推送 + WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 0)); + + CnSocketUtil.contrastSendquit(param.getUserPageId()); + return; } scheduler.shutdown(); scheduler = null; }, 1, TimeUnit.MINUTES); } - String id2 = FormalTestManager.pairsMap.get(id1); - boolean isStandardDevData = true; - if (FormalTestManager.standardDevDataMap.containsKey(id1)) { - FormalTestManager.standardDevDataMap.get(id1).add(devData); - Collections.sort(FormalTestManager.standardDevDataMap.get(id1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + String devMonitorId = monitorId1; + String standardDevMonitorId = monitorId1; + if (FormalTestManager.devDataMap.containsKey(monitorId1)) { + standardDevMonitorId = FormalTestManager.pairsMap.get(monitorId1); + FormalTestManager.devDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.devDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); } - if (FormalTestManager.devDataMap.containsKey(id1)) { - isStandardDevData = false; - FormalTestManager.devDataMap.get(id1).add(devData); - Collections.sort(FormalTestManager.devDataMap.get(id1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); - } - - String standardDevId = id1; - String devId = id2; - if (!isStandardDevData) { - standardDevId = id2; - devId = id1; + if (FormalTestManager.standardDevDataMap.containsKey(monitorId1)) { + devMonitorId = FormalTestManager.pairsMap.inverse().get(monitorId1); + FormalTestManager.standardDevDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.standardDevDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); } // 进行单个监测点的对齐校验 - if (isStandardDevData && !successPair.containsKey(standardDevId) || !isStandardDevData && !successPair.containsKey(devId)) { - if (this.singleMonitorAlignCheck(FormalTestManager.devDataMap.get(devId), FormalTestManager.standardDevDataMap.get(standardDevId))) { - successPair.put(standardDevId, devId); + if (!successPair.containsKey(devMonitorId)) { + if (this.singleMonitorAlignCheck(FormalTestManager.devDataMap.get(devMonitorId), FormalTestManager.standardDevDataMap.get(standardDevMonitorId))) { + successPair.put(devMonitorId, standardDevMonitorId); + + //向前端推送实时数据对齐成功的配对 + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_ALIGN.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(MsgUtil.getPairStr(standardDevMonitorId, devMonitorId, FormalTestManager.devNameMapComm)); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); // 若成功的配对项等于总的配对项,则判定为成功 if (successPair.keySet().containsAll(FormalTestManager.pairsMap.keySet())) { @@ -485,14 +608,35 @@ public class SocketContrastResponseService { scheduledFuture.cancel(true); scheduler.shutdown(); - FormalTestManager.standardDevDataMap.forEach((k, v) -> { - v.clear(); - }); - FormalTestManager.devDataMap.forEach((k, v) -> { - v.clear(); - }); + // 将数据推送给前端 + this.sendAlignDataToWeb(param.getUserPageId()); + + // 向通讯模块发送不再接收数据 + this.sendNotReceiveData(s); + successPair.clear(); + this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + + SocketDataMsg webSend1 = new SocketDataMsg(); + webSend1.setRequestId(SourceOperateCodeEnum.YJC_ALIGN.getValue()); + webSend1.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend1.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode());//最终成功推送 + WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend1, FormalTestManager.devNameMapComm, 0)); + System.out.println("实时数据对齐校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始相序校验》》》》》》》》》》》》》》》》"); + + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam(); + phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()]))); + phaseSequenceParam.setDataType(Arrays.asList("real$VRMS", "real$VA", "real$IRMS", "real$IA", "real$V_UNBAN", "real$I_UNBAN")); + phaseSequenceParam.setReadCount(this.getMaxReadCount(1)); + phaseSequenceParam.setIgnoreCount(0); + socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); + + FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_XUJY; + SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); + // 实时数据开始计时 SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); } } @@ -502,19 +646,23 @@ public class SocketContrastResponseService { WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); break; case DEV_ERROR: + //failComm.addAll(FormalTestManager.devMapMonitorNum.get(socketDataMsg.getData())); WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 0)); - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); + //completeJudgment(param); break; case DEV_TARGET: + //failComm.add(socketDataMsg.getData()); WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 1)); - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); + //completeJudgment(param); break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); break; case NO_INIT_DEV: - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -523,73 +671,89 @@ public class SocketContrastResponseService { } } + /** - * 相序接线校验 + * 相序校验 */ private void devXu(PreDetectionParam param, SocketDataMsg socketDataMsg) { SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); - String s = param.getUserPageId() + CnSocketUtil.DEV_TAG; + String s = param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG; SocketMsg socketMsg = new SocketMsg<>(); - String data = socketDataMsg.getData(); - DevData devData = JSON.parseObject(data, DevData.class); - String id1 = devData.getId(); + DevData devData = JSON.parseObject(socketDataMsg.getData(), DevData.class); if (ObjectUtil.isNotNull(dictDataEnumByCode)) { switch (dictDataEnumByCode) { case SUCCESS: - String id2 = FormalTestManager.pairsMap.get(id1); - boolean isStandardDevData = true; - if (FormalTestManager.standardDevDataMap.containsKey(id1)) { - FormalTestManager.standardDevDataMap.get(id1).add(devData); - Collections.sort(FormalTestManager.standardDevDataMap.get(id1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); - } - if (FormalTestManager.devDataMap.containsKey(id1)) { - isStandardDevData = false; - FormalTestManager.devDataMap.get(id1).add(devData); - Collections.sort(FormalTestManager.devDataMap.get(id1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); - } + case NORMAL_RESPONSE: + String monitorId1 = devData.getId(); + //成功收到数据后重置超时统计时间 + SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); - String standardDevId = id1; - String devId = id2; - if (!isStandardDevData) { - standardDevId = id2; - devId = id1; + String devMonitorId = monitorId1; + String standardDevMonitorId = monitorId1; + + if (FormalTestManager.devDataMap.containsKey(monitorId1)) { + standardDevMonitorId = FormalTestManager.pairsMap.get(monitorId1); + FormalTestManager.devDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.devDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + } + if (FormalTestManager.standardDevDataMap.containsKey(monitorId1)) { + devMonitorId = FormalTestManager.pairsMap.inverse().get(monitorId1); + FormalTestManager.standardDevDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.standardDevDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); } // 进行单个监测点的相序校验 - if (isStandardDevData && !successPair.containsKey(standardDevId) || !isStandardDevData && !successPair.containsKey(devId)) { - - if (FormalTestManager.devDataMap.get(devId).size() > 6 + 5 && FormalTestManager.standardDevDataMap.get(standardDevId).size() > 6 + 5) { - successComm.add(id1); - List> singleMonitorAlignData = getSingleMonitorAlignData(FormalTestManager.devDataMap.get(devId), FormalTestManager.standardDevDataMap.get(standardDevId)); - if (this.singleMonitorXuCheck(devId, singleMonitorAlignData.get(0), singleMonitorAlignData.get(1))) { - successPair.put(standardDevId, devId); + if (!successPair.containsKey(devMonitorId)) { + if (FormalTestManager.devDataMap.get(devMonitorId).size() > 1 + 5 && FormalTestManager.standardDevDataMap.get(standardDevMonitorId).size() > 1 + 5) { // 电压、电流误差校验至少需要1组数据。加5是为了避免数据在传输过程中因为网络波动导致的数据延时接收。 + successComm.add(standardDevMonitorId); + successComm.add(devMonitorId); +// successComm.add(monitorId1); + List> singleMonitorAlignData = getSingleMonitorAlignData(FormalTestManager.devDataMap.get(devMonitorId), FormalTestManager.standardDevDataMap.get(standardDevMonitorId)); + if (this.singleMonitorXuCheck(devMonitorId, standardDevMonitorId, singleMonitorAlignData.get(0), singleMonitorAlignData.get(1), FormalTestManager.devNameMapComm, param.getUserPageId())) { + successPair.put(devMonitorId, standardDevMonitorId); // 若成功的配对项等于总的配对项,则判定为成功 if (successPair.keySet().containsAll(FormalTestManager.pairsMap.keySet())) { - FormalTestManager.standardDevDataMap.forEach((k, v) -> { - v.clear(); - }); - FormalTestManager.devDataMap.forEach((k, v) -> { - v.clear(); - }); successPair.clear(); successComm.clear(); failComm.clear(); + this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_XUJY.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode());//最终成功推送 + WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 0)); + System.out.println("相序校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始正式检测》》》》》》》》》》》》》》》》"); - SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam(); + phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()]))); + phaseSequenceParam.setDataType(FormalTestManager.testItemCodeList); + //phaseSequenceParam.setReadCount(this.getMaxReadCount(6 + 5)); + phaseSequenceParam.setIgnoreCount(0); + socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); + + FormalTestManager.currentStep = SourceOperateCodeEnum.FORMAL_REAL; + //SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); + // 实时数据开始计时 + //SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); } } else if (successComm.size() == FormalTestManager.monitorMap.size()) { + this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); successComm.clear(); failComm.clear(); - // 相序校验失败,最终向前端发送失败消息 - WebSocketVO webSocketVO = new WebSocketVO<>(); - webSocketVO.setRequestId(SourceOperateCodeEnum.YJC_XUJY.getValue()); - webSocketVO.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); - webSocketVO.setCode(SourceResponseCodeEnum.PHASE_CHECK_FAIL.getCode()); - webSocketVO.setData(SourceResponseCodeEnum.PHASE_CHECK_FAIL.getMessage()); - WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); + successPair.clear(); - CnSocketUtil.quitSend(param); + // 相序校验失败,最终向前端发送失败消息 + WebSocketVO webSend = new WebSocketVO<>(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_XUJY.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode()); //最终错误推送 + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + + CnSocketUtil.contrastSendquit(param.getUserPageId()); return; } } @@ -598,15 +762,6 @@ public class SocketContrastResponseService { case UNPROCESSED_BUSINESS: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); break; - case NORMAL_RESPONSE: -// if (devData.getResult()) { -// devXuData.add(devData); -// } else { -// SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); -// System.out.println("相序接线校验被抛除的数据:" + data); -// } - WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - break; case DEV_ERROR: failComm.addAll(FormalTestManager.devMapMonitorNum.get(socketDataMsg.getData())); WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 0)); @@ -618,7 +773,7 @@ public class SocketContrastResponseService { completeJudgment(param); break; case RE_OPERATE: - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -637,37 +792,32 @@ public class SocketContrastResponseService { String data = socketDataMsg.getData(); DevData devData = JSON.parseObject(data, DevData.class); //DevData的id值为 设备id_通道号 这种形式 SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); - String id1 = devData.getId(); + String monitorId1 = devData.getId(); switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: //成功收到数据后重置超时统计时间 SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); - if (devData.getResult()) { - String id2 = FormalTestManager.pairsMap.get(id1); - boolean isStandardDevData = true; - if (FormalTestManager.standardDevDataMap.containsKey(id1)) { - FormalTestManager.standardDevDataMap.get(id1).add(devData); - Collections.sort(FormalTestManager.standardDevDataMap.get(id1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); - } - if (FormalTestManager.devDataMap.containsKey(id1)) { - isStandardDevData = false; - FormalTestManager.devDataMap.get(id1).add(devData); - Collections.sort(FormalTestManager.devDataMap.get(id1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); - } + String devMonitorId = monitorId1; + String standardDevMonitorId = monitorId1; - String standardDevId = id1; - String devId = id2; - if (!isStandardDevData) { - standardDevId = id2; - devId = id1; - } - - if (isStandardDevData && !successPair.containsKey(standardDevId) || !isStandardDevData && !successPair.containsKey(devId)) { + if (FormalTestManager.standardDevDataMap.containsKey(monitorId1)) { + standardDevMonitorId = FormalTestManager.pairsMap.get(monitorId1); + FormalTestManager.standardDevDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.standardDevDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + } + if (FormalTestManager.devDataMap.containsKey(monitorId1)) { + devMonitorId = FormalTestManager.pairsMap.inverse().get(monitorId1); + FormalTestManager.devDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.devDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + } - } + if (!successPair.containsKey(devMonitorId)) { + + + } // //当成功的通道数量和检测通道数量相同时进入 // if (successComm.size() == FormalTestManager.monitorMap.size()) { // System.out.println(sourceIssue.getType() + CnSocketUtil.SPLIT_TAG + sourceIssue.getIndex() + "当前测试小项读取数据已经全部结束。。。。。。。。。"); @@ -748,15 +898,11 @@ public class SocketContrastResponseService { // List valueType = iPqScriptCheckDataService.getValueType(checkDataParam); // // iPqDevService.updateResult(param.getDevIds(), valueType, param.getCode(), param.getUserId(), param.getTemperature(), param.getHumidity()); -// CnSocketUtil.quitSend(param); +// CnSocketUtil.contrastSendquit(param.getUserPageId()); // } // successComm.clear(); // FormalTestManager.realDataXiList.clear(); // - } -// } else { -// System.out.println("被抛除的数据:" + data); -// } break; case UNPROCESSED_BUSINESS: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); @@ -792,13 +938,45 @@ public class SocketContrastResponseService { } } + /** + * 退出检测返回 + */ + private void quitDeal(SocketDataMsg socketDataMsg, PreDetectionParam param) { + SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); + SourceOperateCodeEnum operateCodeEnum = SourceOperateCodeEnum.getDictDataEnumByCode(socketDataMsg.getOperateCode()); + String s = param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG; + + switch (Objects.requireNonNull(dictDataEnumByCode)) { + case SUCCESS: + switch (Objects.requireNonNull(operateCodeEnum)) { + case QUIT_INIT_02: + SocketManager.removeUser(s); + break; + default: + } + break; + case UNPROCESSED_BUSINESS: + break; + case NO_INIT_DEV: + switch (operateCodeEnum) { + case QUIT_INIT_02: + SocketManager.removeUser(s); + break; + } + break; + default: + break; + } + + } + private void completeJudgment(PreDetectionParam param) { System.out.println("成功失败测点数量" + successComm.size() + ":" + failComm.size() + "监测点总数" + FormalTestManager.monitorMap.size()); if (successComm.size() + failComm.size() == FormalTestManager.monitorMap.size()) { //全部装置返回 if (!failComm.isEmpty()) { - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); WebSocketVO webSocketVO = new WebSocketVO<>(); webSocketVO.setRequestId(SourceOperateCodeEnum.ERROR_FLOW_END.getValue()); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); @@ -809,6 +987,168 @@ public class SocketContrastResponseService { } + /** + * 清空数据 + * + * @param devDataMap + * @param standardDevDataMap + */ + private void clearData(Map> devDataMap, Map> standardDevDataMap) { + standardDevDataMap.forEach((k, v) -> { + v.clear(); + }); + devDataMap.forEach((k, v) -> { + v.clear(); + }); + } + + /** + * 获取最大读取数据的组数 + * + * @param targetCount 目标数量 + * @return + */ + private Integer getMaxReadCount(int targetCount) { + return (int) (Math.ceil(targetCount / 5.0) * 20); + } + + /** + * 向通讯模块发送不再接收数据 + */ + private void sendNotReceiveData(String s) { + SocketMsg socketMsg = new SocketMsg<>(); + socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam(); + phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()]))); + phaseSequenceParam.setReadCount(0); + phaseSequenceParam.setIgnoreCount(0); + socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); + + SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); + } + + /** + * 实时数据对齐-将数据推送给前端 + */ + private void sendAlignDataToWeb(String userPageId) { + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_ALIGN.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode()); + List data = new ArrayList<>(); + + // key为被检设备的ip, value为该ip下所有通道的设备数据 + Map> ipDevDataMap = FormalTestManager.devDataMap.values().stream().flatMap(List::stream).collect(Collectors.groupingBy(obj -> obj.getId().split(CnSocketUtil.SPLIT_TAG)[0])); + + ipDevDataMap.forEach((ip, devDataList) -> { + AlignDataVO alignDataVO = new AlignDataVO(); + alignDataVO.setDevName(FormalTestManager.devNameMapComm.get(ip)); + + // 按照通道号分组。key为通道号,value为该通道号下所有设备数据 + Map> channelDataMap = devDataList.stream().collect(Collectors.groupingBy(obj -> obj.getId().split(CnSocketUtil.SPLIT_TAG)[1])); + + List channelDataList = new ArrayList<>(); + channelDataMap.forEach((channel, channelDevDataList) -> { + String standardDevMonitorId = FormalTestManager.pairsMap.get(ip + channel); + List standarDevDataList = BeanUtil.copyToList(FormalTestManager.standardDevDataMap.get(standardDevMonitorId), DevData.class); + channelDevDataList.sort(Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + + AlignDataVO.ChannelData channelData = new AlignDataVO.ChannelData(); + channelData.setDevNum(channel); + String[] split = standardDevMonitorId.split(CnSocketUtil.SPLIT_TAG); + channelData.setStandardDevInfo(FormalTestManager.devNameMapComm.get(split[0]) + "通道" + split[1]); + + List dataList = channelDevDataList.stream().map(obj -> { + AlignDataVO.RawData rawData = new AlignDataVO.RawData(); + DevData.SqlDataDTO.ListDTO list = obj.getSqlData().get(0).getList(); + rawData.setUaDev(list.getA()); + rawData.setUbDev(list.getB()); + rawData.setUcDev(list.getC()); + rawData.setTimeDev(obj.getTime()); + + DevData devData = standarDevDataList.stream().filter(obj1 -> DetectionUtil.isAlignData(obj1, obj)).findFirst().get(); + if (ObjectUtil.isNotNull(devData)) { + DevData.SqlDataDTO.ListDTO list1 = devData.getSqlData().get(0).getList(); + rawData.setUaStdDev(list1.getA()); + rawData.setUbStdDev(list1.getB()); + rawData.setUcStdDev(list1.getC()); + rawData.setTimeStdDev(devData.getTime()); + standarDevDataList.remove(devData); + } + return rawData; + }).collect(Collectors.toList()); + standarDevDataList.sort(Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + dataList.addAll(standarDevDataList.stream().map(obj -> { + AlignDataVO.RawData rawData = new AlignDataVO.RawData(); + DevData.SqlDataDTO.ListDTO list = obj.getSqlData().get(0).getList(); + rawData.setUaStdDev(list.getA()); + rawData.setUbStdDev(list.getB()); + rawData.setUcStdDev(list.getC()); + rawData.setTimeStdDev(obj.getTime()); + return rawData; + }).collect(Collectors.toList())); + channelData.setDataList(dataList); + channelDataList.add(channelData); + }); + alignDataVO.setChannelDataList(channelDataList); + data.add(alignDataVO); + }); + + webSend.setData(JSON.toJSONString(data)); + WebServiceManager.sendMsg(userPageId, JSON.toJSONString(webSend)); + } + + /** + * 模型一致性校验 + * + * @param param + * @param dataMap + */ + private boolean modelCheck(PreDetectionParam param, Map> dataMap) { + AtomicBoolean flag = new AtomicBoolean(true); + dataMap.forEach((k, v) -> { + v.stream().forEach(devData1 -> { + List descList = devData1.getSqlData().stream().map(DevData.SqlDataDTO::getDesc).collect(Collectors.toList()); + descList.addAll(devData1.getSqlDataHarm().stream().map(DevData.SqlDataHarmDTO::getDesc).collect(Collectors.toList())); + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_MXYZXJY.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + webSend.setData(k); + if (CollUtil.isNotEmpty(descList) && descList.containsAll(FormalTestManager.testItemCodeList)) { + // 成功信息 + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + } else { + // 错误信息 + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + flag.set(false); + } + WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 1)); + }); + }); + +// devDataMap.forEach((k, v) -> { +// v.stream().forEach(devData1 -> { +// List descList = devData1.getSqlData().stream().map(DevData.SqlDataDTO::getDesc).collect(Collectors.toList()); +// descList.addAll(devData1.getSqlDataHarm().stream().map(DevData.SqlDataHarmDTO::getDesc).collect(Collectors.toList())); +// SocketDataMsg webSend = new SocketDataMsg(); +// webSend.setRequestId(SourceOperateCodeEnum.YJC_MXYZXJY.getValue()); +// webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); +// webSend.setData(k); +// if (FormalTestManager.testItemCodeList.containsAll(descList)) { +// // 成功信息 +// webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); +// } else { +// // 错误信息 +// webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); +// flag.set(false); +// } +// WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 1)); +// }); +// }); + return flag.get(); + } + /** * 根据数据对齐算法,针对单个监测点进行数据对齐 * @@ -876,52 +1216,85 @@ public class SocketContrastResponseService { /** * 单个检测点相序校验 * - * @param lineId 单个检测点的被检设备线路id - * @param devData 单个检测点的被检设备数据 - * @param stdData 单个检测点的标准设备数据 + * @param devMonitorId 单个检测点的被检设备监测id + * @param standardDevMonitorId 单个检测点的标准设备监测id + * @param devData 单个检测点的被检设备数据 + * @param stdData 单个检测点的标准设备数据 + * @param devNameMapComm 设备名称映射表 key为设备IP,value为设备名称 + * @param userId 用户id(用于找到channel) * @return */ - private boolean singleMonitorXuCheck(String lineId, List devData, List stdData) { + private boolean singleMonitorXuCheck(String devMonitorId, String standardDevMonitorId, List devData, List stdData, Map devNameMapComm, String userId) { // 首先确保,至少有6组数据 - if (devData.size() < volOrCurCheckCount || stdData.size() < volOrCurCheckCount) { + Boolean flag = true; + if (devData.size() < 1 || stdData.size() < 1) { return false; } else { - // 电压&电流校验(校验6组数据即可) + // 电压&电流校验 + String pairStr = MsgUtil.getPairStr(devMonitorId, standardDevMonitorId, devNameMapComm); + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.YJC_XUJY.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); List uDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.VRMS.getCode()); List uStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.VRMS.getCode()); List iDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.IRMS.getCode()); List iStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.IRMS.getCode()); - for (int i = 0; i < volOrCurCheckCount; i++) { - DevData.SqlDataDTO.ListDTO uDevList = uDev.get(i).getList(); - DevData.SqlDataDTO.ListDTO uStdList = uStd.get(i).getList(); - DevData.SqlDataDTO.ListDTO iDevList = iDev.get(i).getList(); - DevData.SqlDataDTO.ListDTO iStdList = iStd.get(i).getList(); + DevData.SqlDataDTO.ListDTO uDevList = uDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO uStdList = uStd.get(0).getList(); + DevData.SqlDataDTO.ListDTO iDevList = iDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO iStdList = iStd.get(0).getList(); - if (!voltageOrCurrentCheck(uDevList.getA(), uDevList.getB(), uDevList.getC(), uStdList.getA(), uStdList.getB(), uStdList.getC(), true) - || !voltageOrCurrentCheck(iDevList.getA(), iDevList.getB(), iDevList.getC(), iStdList.getA(), iStdList.getB(), iStdList.getC(), false)) { - // todo 单个检测点电压&电流校验失败,推送失败消息 - return false; - } + if (!voltageOrCurrentCheck(uDevList.getA(), uDevList.getB(), uDevList.getC(), uStdList.getA(), uStdList.getB(), uStdList.getC(), true)) { + // 单个检测点电压校验失败,推送失败消息 + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":电压校验失败!被检设备:Ua=" + uDevList.getA() + ",Ub=" + uDevList.getB() + ",Uc=" + uDevList.getC() + ",标准设备:Ua=" + uStdList.getA() + ",Ub=" + uStdList.getB() + ",Uc=" + uStdList.getC()); + flag = false; + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":电压校验成功!被检设备:Ua=" + uDevList.getA() + ",Ub=" + uDevList.getB() + ",Uc=" + uDevList.getC() + ",标准设备:Ua=" + uStdList.getA() + ",Ub=" + uStdList.getB() + ",Uc=" + uStdList.getC()); } + if (!voltageOrCurrentCheck(iDevList.getA(), iDevList.getB(), iDevList.getC(), iStdList.getA(), iStdList.getB(), iStdList.getC(), false)) { + // 单个检测点电流校验失败,推送失败消息 + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":电流校验失败!被检设备:Ia=" + uDevList.getA() + ",Ib=" + uDevList.getB() + ",Ic=" + uDevList.getC() + ",标准设备:Ia=" + uStdList.getA() + ",Ib=" + uStdList.getB() + ",Ic=" + uStdList.getC()); + flag = false; + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":电流校验成功!被检设备:Ia=" + uDevList.getA() + ",Ib=" + uDevList.getB() + ",Ic=" + uDevList.getC() + ",标准设备:Ia=" + uStdList.getA() + ",Ib=" + uStdList.getB() + ",Ic=" + uStdList.getC()); + } + WebServiceManager.sendMsg(userId, JSON.toJSONString(webSend)); + // 根据接线方式(星型、角型)来决定是否进行三项不平衡校验 - if (DetectionCodeEnum.STAR.getCode().equals(FormalTestManager.monitorMap.get(lineId).getConnection())) { + if (DetectionCodeEnum.STAR.getCode().equals(FormalTestManager.monitorMap.get(devMonitorId).getConnection())) { //进行三项不平衡校验 List uUnblanceDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.V_UNBAN.getCode()); List uUnblanceStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.V_UNBAN.getCode()); List iUnblanceDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.I_UNBAN.getCode()); List iUnblanceStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.I_UNBAN.getCode()); - for (int i = 0; i < volOrCurCheckCount; i++) { - DevData.SqlDataDTO.ListDTO uUnblanceDevList = uUnblanceDev.get(i).getList(); - DevData.SqlDataDTO.ListDTO uUnblanceStdList = uUnblanceStd.get(i).getList(); - DevData.SqlDataDTO.ListDTO iUnblanceDevList = iUnblanceDev.get(i).getList(); - DevData.SqlDataDTO.ListDTO iUnblanceStdList = iUnblanceStd.get(i).getList(); - if (!unbalanceCheck(uUnblanceDevList.getT(), uUnblanceStdList.getT(), true) - || !unbalanceCheck(iUnblanceDevList.getT(), iUnblanceStdList.getT(), false)) { - // todo 单个检测点三项不平衡校验失败,推送失败消息 - return false; - } + DevData.SqlDataDTO.ListDTO uUnblanceDevList = uUnblanceDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO uUnblanceStdList = uUnblanceStd.get(0).getList(); + DevData.SqlDataDTO.ListDTO iUnblanceDevList = iUnblanceDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO iUnblanceStdList = iUnblanceStd.get(0).getList(); + + if (!unbalanceCheck(uUnblanceDevList.getT(), uUnblanceStdList.getT(), true)) { + // 单个检测点三项电压不平衡校验失败,推送失败消息 + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":三项电压不平衡校验失败!被检设备:IMBV=" + uUnblanceDevList.getT() + ",标准设备:IMBV=" + uUnblanceStdList.getT()); + flag = false; + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":三项电压不平衡校验成功!被检设备:IMBV=" + uUnblanceDevList.getT() + ",标准设备:IMBV=" + uUnblanceStdList.getT()); } + if (!unbalanceCheck(iUnblanceDevList.getT(), iUnblanceStdList.getT(), false)) { + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":三项电流不平衡校验失败!被检设备:IMBA=" + iUnblanceDevList.getT() + ",标准设备:IMBA=" + iUnblanceStdList.getT()); + flag = false; + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":三项电流不平衡校验成功!被检设备:IMBA=" + iUnblanceDevList.getT() + ",标准设备:IMBA=" + iUnblanceStdList.getT()); + } + WebServiceManager.sendMsg(userId, JSON.toJSONString(webSend)); } // 是否存在电流 @@ -935,20 +1308,23 @@ public class SocketContrastResponseService { List vaUnblanceStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.VA.getCode()); List iaUnblanceDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.IA.getCode()); List iaUnblanceStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.IA.getCode()); - for (int i = 0; i < phaseCheckCount; i++) { - DevData.SqlDataDTO.ListDTO vaUnblanceDevList = vaUnblanceDev.get(i).getList(); - DevData.SqlDataDTO.ListDTO vaUnblanceStdList = vaUnblanceStd.get(i).getList(); - DevData.SqlDataDTO.ListDTO iaUnblanceDevList = iaUnblanceDev.get(i).getList(); - DevData.SqlDataDTO.ListDTO iaUnblanceStdList = iaUnblanceStd.get(i).getList(); + DevData.SqlDataDTO.ListDTO vaUnblanceDevList = vaUnblanceDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO vaUnblanceStdList = vaUnblanceStd.get(0).getList(); + DevData.SqlDataDTO.ListDTO iaUnblanceDevList = iaUnblanceDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO iaUnblanceStdList = iaUnblanceStd.get(0).getList(); - if (!phaseCheck(vaUnblanceDevList.getA(), vaUnblanceDevList.getB(), vaUnblanceDevList.getC(), vaUnblanceStdList.getA(), vaUnblanceStdList.getB(), vaUnblanceStdList.getC()) - || !phaseCheck(iaUnblanceDevList.getA(), iaUnblanceDevList.getB(), iaUnblanceDevList.getC(), iaUnblanceStdList.getA(), iaUnblanceStdList.getB(), iaUnblanceStdList.getC())) { - // todo 单个检测点相角校验失败,推送失败消息 - return false; - } + if (!phaseCheck(vaUnblanceDevList, iaUnblanceDevList, vaUnblanceStdList, iaUnblanceStdList)) { + // 单个检测点相角校验失败,推送失败消息 + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + "相角校验失败!被检设备:a=" + vaUnblanceDevList.getA() + "°,b=" + vaUnblanceDevList.getB() + "°,c=" + vaUnblanceDevList.getC() + ",标准设备:a=" + vaUnblanceStdList.getA() + "°,b=" + vaUnblanceStdList.getB() + "°,c=" + vaUnblanceStdList.getC()); + flag = false; + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + "相角校验成功!被检设备:a=" + vaUnblanceDevList.getA() + "°,b=" + vaUnblanceDevList.getB() + "°,c=" + vaUnblanceDevList.getC() + ",标准设备:a=" + vaUnblanceStdList.getA() + "°,b=" + vaUnblanceStdList.getB() + "°,c=" + vaUnblanceStdList.getC()); } + WebServiceManager.sendMsg(userId, JSON.toJSONString(webSend)); } - return true; + return flag; } } @@ -1003,26 +1379,190 @@ public class SocketContrastResponseService { } } + /** * 相序校验中的相角校验 * - * @param a 被检设备a相相角 - * @param b 被检设备b相相角 - * @param c 被检设备c相相角 - * @param aStd 标准设备a相相角 - * @param bStd 标准设备b相相角 - * @param cStd 标准设备c相相角 + * @param uDevPhaseData 被检设备电压相角数据 + * @param iDevPhaseData 被检设备电流相角数据 + * @param uStandardDevPhaseData 标准设备电压相角数据 + * @param iStandardDevPhaseData 标准设备电流相角数据 * @return */ - private boolean phaseCheck(Double a, Double b, Double c, Double aStd, Double bStd, Double cStd) { - a = DetectionUtil.adjustPhase(a); - b = DetectionUtil.adjustPhase(b); - c = DetectionUtil.adjustPhase(c); - aStd = DetectionUtil.adjustPhase(aStd); - bStd = DetectionUtil.adjustPhase(bStd); - cStd = DetectionUtil.adjustPhase(cStd); - return NumberUtil.isIn(BigDecimal.valueOf(a), BigDecimal.valueOf(aStd - 1), BigDecimal.valueOf(aStd + 1)) - && NumberUtil.isIn(BigDecimal.valueOf(b), BigDecimal.valueOf(bStd - 1), BigDecimal.valueOf(bStd + 1)) - && NumberUtil.isIn(BigDecimal.valueOf(c), BigDecimal.valueOf(cStd - 1), BigDecimal.valueOf(cStd + 1)); + private boolean phaseCheck(DevData.SqlDataDTO.ListDTO uDevPhaseData, DevData.SqlDataDTO.ListDTO iDevPhaseData, DevData.SqlDataDTO.ListDTO uStandardDevPhaseData, DevData.SqlDataDTO.ListDTO iStandardDevPhaseData) { + Double ua1 = DetectionUtil.adjustPhase(uDevPhaseData.getA()); + Double ub1 = DetectionUtil.adjustPhase(uDevPhaseData.getB()); + Double uc1 = DetectionUtil.adjustPhase(uDevPhaseData.getC()); + Double ia1 = DetectionUtil.adjustPhase(iDevPhaseData.getA()); + Double ib1 = DetectionUtil.adjustPhase(iDevPhaseData.getB()); + Double ic1 = DetectionUtil.adjustPhase(iDevPhaseData.getC()); + + Double ua2 = DetectionUtil.adjustPhase(uStandardDevPhaseData.getA()); + Double ub2 = DetectionUtil.adjustPhase(uStandardDevPhaseData.getB()); + Double uc2 = DetectionUtil.adjustPhase(uStandardDevPhaseData.getC()); + Double ia2 = DetectionUtil.adjustPhase(iStandardDevPhaseData.getA()); + Double ib2 = DetectionUtil.adjustPhase(iStandardDevPhaseData.getB()); + Double ic2 = DetectionUtil.adjustPhase(iStandardDevPhaseData.getC()); + + return NumberUtil.isIn(BigDecimal.valueOf(ua1 - ia1), BigDecimal.valueOf(ua2 - ia2 - 1), BigDecimal.valueOf(ua2 - ia2 + 1)) + && NumberUtil.isIn(BigDecimal.valueOf(ub1 - ib1), BigDecimal.valueOf(ub2 - ib2 - 1), BigDecimal.valueOf(ub2 - ib2 + 1)) + && NumberUtil.isIn(BigDecimal.valueOf(uc1 - ic1), BigDecimal.valueOf(uc2 - ic2 - 1), BigDecimal.valueOf(uc2 - ic2 + 1)); + } + + /** + * 原始数据入库 + * + * @author cdf + * @date 2024/12/29 + */ + private void baseDataInsert(List devDataList, String errorSysId, Integer num, PreDetectionParam param, Map checkDataMap) { + // Runnable runnable = () -> { + + System.out.println("原始数据插入数据库开始执行========================================="); + List contrastNonHarmonicResults = new ArrayList<>(); + List contrastHarmonicResults = new ArrayList<>(); + for (DevData data : devDataList) { + LocalDateTime localDateTime = DetectionUtil.timeFormat(data.getTime(), DetectionUtil.FORMATTER); + if (Objects.nonNull(localDateTime)) { + + String[] splitArr = data.getId().split(CnSocketUtil.SPLIT_TAG); + String temId = FormalTestManager.devIdMapComm.get(splitArr[0]) + CnSocketUtil.SPLIT_TAG + splitArr[1]; + + if (data.getSqlData().size() != 0 && !DetectionCodeEnum.U1.getCode().equals(data.getSqlData().get(0).getDesc()) && !DetectionCodeEnum.I1.getCode().equals(data.getSqlData().get(0).getDesc())) { + for (DevData.SqlDataDTO sqlDataDTO : data.getSqlData()) { + DevData.SqlDataDTO.ListDTO listDTO = sqlDataDTO.getList(); + ContrastNonHarmonicResult adNonHarmonicResult = new ContrastNonHarmonicResult(); + adNonHarmonicResult.setTimeId(localDateTime); + adNonHarmonicResult.setMonitorId(temId); + adNonHarmonicResult.setErrorId(errorSysId); + adNonHarmonicResult.setNum(num); + //adNonHarmonicResult.setScriptId(param.getScriptId()); + //adNonHarmonicResult.setSort(sourceIssue.getIndex()); + + adNonHarmonicResult.setAdType(checkDataMap.get(sqlDataDTO.getDesc())); + adNonHarmonicResult.setDataType(DataSourceEnum.REAL_DATA.getValue()); + + Double a = listDTO.getA(); + Double b = listDTO.getB(); + Double c = listDTO.getC(); + Double d = listDTO.getT(); + if (Objects.nonNull(a)) { + adNonHarmonicResult.setAValue(String.format("%.7f", a)); + } + if (Objects.nonNull(b)) { + adNonHarmonicResult.setBValue(String.format("%.7f", b)); + } + if (Objects.nonNull(c)) { + adNonHarmonicResult.setCValue(String.format("%.7f", c)); + } + if (Objects.nonNull(d)) { + adNonHarmonicResult.setTValue(String.format("%.7f", d)); + } + contrastNonHarmonicResults.add(adNonHarmonicResult); + } + } + for (int j = 0; j < data.getSqlDataHarm().size(); j++) { + DevData.SqlDataHarmDTO sqlDataDTO = data.getSqlDataHarm().get(j); + String dui = FormalTestManager.harmonicRelationMap.get(sqlDataDTO.getDesc()); + ContrastHarmonicResult adHarmonicResult = new ContrastHarmonicResult(); + adHarmonicResult.setTimeId(localDateTime); + + adHarmonicResult.setMonitorId(temId); + adHarmonicResult.setErrorId(errorSysId); + adHarmonicResult.setNum(num); + adHarmonicResult.setAdType(checkDataMap.get(sqlDataDTO.getDesc())); + adHarmonicResult.setDataType(DataSourceEnum.REAL_DATA.getValue()); + + if (CollUtil.isNotEmpty(data.getSqlData())) { + DevData.SqlDataDTO.ListDTO vvv = data.getSqlData().stream().filter(it -> it.getDesc().equals(dui)).collect(Collectors.toList()).get(0).getList(); + Double aV = vvv.getA(); + Double bV = vvv.getB(); + Double cV = vvv.getC(); + if (Objects.nonNull(aV)) { + adHarmonicResult.setAValue1(String.format("%.7f", aV)); + } + if (Objects.nonNull(bV)) { + adHarmonicResult.setBValue1(String.format("%.7f", bV)); + } + if (Objects.nonNull(cV)) { + adHarmonicResult.setCValue1(String.format("%.7f", cV)); + } + } + + DevData.SqlDataHarmDTO.ListDTO tem = sqlDataDTO.getList(); + List a = tem.getA(); + List b = tem.getB(); + List c = tem.getC(); + + Class example = (Class) adHarmonicResult.getClass(); + + if (DetectionCodeEnum.SV_1_49.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.SI_1_49.getCode().equals(sqlDataDTO.getDesc())) { + for (int i = 1; i < a.size() + 1; i++) { + try { + Field aField = example.getDeclaredField("aValue" + i); + Field bField = example.getDeclaredField("bValue" + i); + Field cField = example.getDeclaredField("cValue" + i); + + aField.setAccessible(true); + aField.set(adHarmonicResult, a.get(i - 1)); + bField.setAccessible(true); + bField.set(adHarmonicResult, b.get(i - 1)); + cField.setAccessible(true); + cField.set(adHarmonicResult, c.get(i - 1)); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } + } else { + for (int i = 2; i <= a.size() + 1; i++) { + try { + Field aField = example.getDeclaredField("aValue" + i); + Field bField = example.getDeclaredField("bValue" + i); + Field cField = example.getDeclaredField("cValue" + i); + + aField.setAccessible(true); + aField.set(adHarmonicResult, a.get(i - 2)); + bField.setAccessible(true); + bField.set(adHarmonicResult, b.get(i - 2)); + cField.setAccessible(true); + cField.set(adHarmonicResult, c.get(i - 2)); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } + } + contrastHarmonicResults.add(adHarmonicResult); + } + } + } + + if (CollUtil.isNotEmpty(contrastNonHarmonicResults)) { + Map> map = contrastNonHarmonicResults.stream().collect(Collectors.groupingBy(x -> x.getMonitorId() + x.getTimeId() + x.getErrorId() + x.getNum() + x.getAdType() + x.getDataType())); + List info = new ArrayList<>(); + map.forEach((key, value) -> { + if (value.size() > 1) { + System.err.println("重复时间戳->" + key + value); + } else { + info.addAll(value); + } + }); + + detectionDataDealService.acceptAdNon(info, param.getCode()); + } + if (CollUtil.isNotEmpty(contrastHarmonicResults)) { + Map> map = contrastHarmonicResults.stream().collect(Collectors.groupingBy(x -> x.getMonitorId() + x.getTimeId() + x.getErrorId() + x.getNum() + x.getAdType() + x.getDataType())); + List info = new ArrayList<>(); + map.forEach((key, value) -> { + if (value.size() > 1) { + System.err.println("重复时间戳->" + key + value); + } else { + info.addAll(value); + } + }); + detectionDataDealService.acceptAd(info, param.getCode()); + } + System.out.println("原始数据插入数据库执行成功========================================="); + // }; + // executorPool.submit(runnable); } } 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 523dd16d..5b8f6179 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 @@ -20,6 +20,7 @@ import com.njcn.gather.detection.util.DetectionUtil; import com.njcn.gather.detection.util.socket.*; import com.njcn.gather.detection.util.socket.websocket.WebServiceManager; import com.njcn.gather.device.pojo.enums.CommonEnum; +import com.njcn.gather.device.pojo.enums.PatternEnum; import com.njcn.gather.device.pojo.po.PqDevSub; import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.device.service.IPqDevService; @@ -50,7 +51,6 @@ import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; @@ -63,8 +63,6 @@ import static com.njcn.gather.detection.util.socket.FormalTestManager.harmonicRe @Service @RequiredArgsConstructor public class SocketDevResponseService { - // ISO 8601格式 - private final DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; private List dataTypeList; @@ -409,7 +407,7 @@ public class SocketDevResponseService { issueParam.setDevIds(param.getDevIds()); issueParam.setScriptId(param.getScriptId()); - if (param.getOperateType().equals(SourceOperateCodeEnum.RE_ERROR_TEST.getValue())) { + if (param.getReCheckType().equals(SourceOperateCodeEnum.RE_ERROR_TEST.getValue())) { //不合格项复检 Set indexes = new HashSet<>(); StorageParam storageParam = new StorageParam(); @@ -717,7 +715,7 @@ public class SocketDevResponseService { if (successComm.size() == FormalTestManager.monitorIdListComm.size()) { // 通知前端整个装置通讯检测过程成功 SocketDataMsg temMsg = new SocketDataMsg(); - temMsg.setCode(SourceResponseCodeEnum.DEV_COMM_ALL_SUCCESS.getCode()); + temMsg.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode()); temMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_01.getValue()); temMsg.setRequestId(SourceOperateCodeEnum.YJC_SBTXJY.getValue()); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(temMsg)); @@ -874,7 +872,7 @@ public class SocketDevResponseService { //System.out.println("icdCheckDataMap.size()="+icdCheckDataMap.size()+",icdTypeList.size()="+icdTypeList.size()); if (icdCheckDataMap.size() == icdTypeList.size()) { SocketDataMsg temMsg = new SocketDataMsg(); - temMsg.setCode(SourceResponseCodeEnum.DEV_COMM_ALL_SUCCESS.getCode()); + temMsg.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode()); temMsg.setOperateCode(SourceOperateCodeEnum.VERIFY_MAPPING$01.getValue()); temMsg.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(temMsg)); @@ -897,7 +895,7 @@ public class SocketDevResponseService { 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())) { + if (param.getReCheckType().equals(SourceOperateCodeEnum.RE_ERROR_TEST.getValue())) { //不合格项复检 Set indexes = new HashSet<>(); StorageParam storageParam = new StorageParam(); @@ -1076,8 +1074,8 @@ public class SocketDevResponseService { WebSocketVO webSocketVO = new WebSocketVO<>(); webSocketVO.setRequestId(SourceOperateCodeEnum.YJC_XUJY.getValue()); webSocketVO.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); - webSocketVO.setCode(SourceResponseCodeEnum.PHASE_CHECK_FAIL.getCode()); - webSocketVO.setData(SourceResponseCodeEnum.PHASE_CHECK_FAIL.getMessage()); + webSocketVO.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode()); + webSocketVO.setData(SourceResponseCodeEnum.ALL_FAIL.getMessage()); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); CnSocketUtil.quitSend(param); @@ -1087,7 +1085,7 @@ public class SocketDevResponseService { //向前端推送消息 SocketDataMsg temMsg = new SocketDataMsg(); - temMsg.setCode(SourceResponseCodeEnum.DEV_COMM_ALL_SUCCESS.getCode()); + temMsg.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode()); temMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); temMsg.setRequestId(SourceOperateCodeEnum.YJC_XUJY.getValue()); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(temMsg)); @@ -1127,7 +1125,7 @@ public class SocketDevResponseService { issueParam.setDevIds(param.getDevIds()); issueParam.setScriptId(param.getScriptId()); - if (param.getOperateType().equals(SourceOperateCodeEnum.RE_ERROR_TEST.getValue())) { + if (param.getReCheckType().equals(SourceOperateCodeEnum.RE_ERROR_TEST.getValue())) { //不合格项复检 Set indexes = new HashSet<>(); StorageParam storageParam = new StorageParam(); @@ -1453,7 +1451,7 @@ public class SocketDevResponseService { case QUIT_INIT_01: //关闭所有 SocketManager.removeUser(s); - // CnSocketUtil.quitSendSource(param); + CnSocketUtil.quitSendSource(param); break; case QUIT_INIT_02: socketMsg.setRequestId(SourceOperateCodeEnum.QUITE.getValue()); @@ -1720,6 +1718,9 @@ public class SocketDevResponseService { } else { dataRule = DictDataEnum.SECTION_VALUE; } + + String code = dictDataService.getDictDataById(plan.getPattern()).getCode(); + FormalTestManager.patternEnum = PatternEnum.getEnum(code); //字典树 SocketManager.valueTypeMap = iPqScriptCheckDataService.getValueTypeMap(param.getScriptId()); @@ -1794,7 +1795,7 @@ public class SocketDevResponseService { List simAndDigNonHarmonicResultList = new ArrayList<>(); List adHarmonicResultList = new ArrayList<>(); for (DevData data : devDataList) { - LocalDateTime localDateTime = DetectionUtil.timeFormat(data.getTime(), formatter); + LocalDateTime localDateTime = DetectionUtil.timeFormat(data.getTime(), DetectionUtil.FORMATTER); if (Objects.nonNull(localDateTime)) { String[] splitArr = data.getId().split(CnSocketUtil.SPLIT_TAG); @@ -1958,7 +1959,8 @@ public class SocketDevResponseService { } public void backCheckState(PreDetectionParam param) { - if (CollUtil.isNotEmpty(param.getDevIds()) && StrUtil.isNotBlank(param.getPlanId()) && "1".equals(param.getOperateType())) { +// if (CollUtil.isNotEmpty(param.getDevIds()) && StrUtil.isNotBlank(param.getPlanId()) && "1".equals(param.getOperateType())) { + if (CollUtil.isNotEmpty(param.getDevIds()) && StrUtil.isNotBlank(param.getPlanId())) { adPlanService.updateBackTestState(param.getPlanId(), param.getDevIds()); } } diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceOperateCodeEnum.java b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceOperateCodeEnum.java index 5153669c..d4e86fdd 100644 --- a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceOperateCodeEnum.java +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceOperateCodeEnum.java @@ -48,8 +48,8 @@ public enum SourceOperateCodeEnum { YJC_SBTXJY("yjc_sbtxjy", "设备通讯检测"), YJC_XYJY("yjc_xyjy", "协议校验"), YJC_XUJY("YJC_xujy", "相序校验"), - YJC_ALIGN("YJC_align","实时数据对齐校验"), - YJC_MXYZXJY("YJC_mxyzxjy", "模型一致性校验"), + YJC_ALIGN("yjc_align","实时数据对齐校验"), + YJC_MXYZXJY("yjc_mxyzxjy", "模型一致性校验"), FORMAL_REAL("formal_real","正式检测"), // SIMULATE_REAL("simulate_real","模拟检测"), Coefficient_Check("Coefficient_Check","系数校验"), diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceResponseCodeEnum.java b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceResponseCodeEnum.java index d440c3e6..f988737a 100644 --- a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceResponseCodeEnum.java +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceResponseCodeEnum.java @@ -37,9 +37,10 @@ public enum SourceResponseCodeEnum { //自定义前端展示消息 SOCKET_ERROR(25000,"服务端连接失败"), - DEV_COMM_ALL_SUCCESS(25001,"校验成功"), - DEV_COMM_TEST_FAIL(25002,"设备通讯校验失败"), - PHASE_CHECK_FAIL(25003,"相序校验未通过"), + ALL_SUCCESS(25001,"校验成功"), + FAIL(25002,"失败"), + ALL_FAIL(25003,"校验失败"), + ALIGN_CHECK_FAIL(25007,"实时数据对齐校验未通过"), 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 index c8074369..7102ae2d 100644 --- 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 @@ -21,7 +21,7 @@ public class ContrastDetectionParam { private String planId; @ApiModelProperty("用户ID,唯一标识") - private String userId; + private String loginName; @ApiModelProperty("被检设备ID列表") @NotEmpty(message = DetectionValidMessage.DEV_IDS_NOT_EMPTY) @@ -32,7 +32,7 @@ public class ContrastDetectionParam { private List standardDevIds; /** - * key为 标准设备ID_检测点序号、value为 被检设备ID_检测点序号 + * key为被检设备ID_检测点序号、value为 标准设备ID_检测点序号 */ @ApiModelProperty("配对关系") @NotEmpty(message = DetectionValidMessage.PAIRS_NOT_EMPTY) diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/param/PreDetectionParam.java b/detection/src/main/java/com/njcn/gather/detection/pojo/param/PreDetectionParam.java index 85f8b781..3eaa2041 100644 --- a/detection/src/main/java/com/njcn/gather/detection/pojo/param/PreDetectionParam.java +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/param/PreDetectionParam.java @@ -14,7 +14,8 @@ import java.util.List; @Data public class PreDetectionParam { - private String operateType; + // "1"-"全部检测" , "2"-"不合格项复检" + private String reCheckType; /** * 检测计划id @@ -23,11 +24,6 @@ public class PreDetectionParam { private String planId; - /** - * 数字、模拟、比对 - */ - private String pattern; - /** * 用户功能组成唯一标识 zhangsan_test */ diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/vo/AlignDataExcel.java b/detection/src/main/java/com/njcn/gather/detection/pojo/vo/AlignDataExcel.java new file mode 100644 index 00000000..a50b635d --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/vo/AlignDataExcel.java @@ -0,0 +1,50 @@ +package com.njcn.gather.detection.pojo.vo; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +/** + * @author caozehui + * @data 2025-08-07 + */ +@Data +public class AlignDataExcel { + + private ExcelConfig devDataConfig = new ExcelConfig(""); + private ExcelConfig standardDevDataConfig = new ExcelConfig(""); + + @Excel(name = "时间", width = 20, groupName = "被检设备") + private String timeDev; + + @Excel(name = "Ua", groupName = "被检设备") + private Double uaDev; + + @Excel(name = "Ub", groupName = "被检设备") + private Double ubDev; + + @Excel(name = "Uc", groupName = "被检设备") + private Double ucDev; + + + @Excel(name = "时间", width = 20, groupName = "标准设备") + private String timeStdDev; + + @Excel(name = "Ua", groupName = "标准设备") + private Double uaStdDev; + + @Excel(name = "Ub", groupName = "标准设备") + private Double ubStdDev; + + @Excel(name = "Uc", groupName = "标准设备") + private Double ucStdDev; + + + @Data + public static class ExcelConfig { + private String name; + + public ExcelConfig(String name) { + this.name = name; + } + } +} diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/vo/AlignDataVO.java b/detection/src/main/java/com/njcn/gather/detection/pojo/vo/AlignDataVO.java new file mode 100644 index 00000000..b3877fc7 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/vo/AlignDataVO.java @@ -0,0 +1,57 @@ +package com.njcn.gather.detection.pojo.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author caozehui + * @data 2025-08-06 + */ +@Data +public class AlignDataVO { + + private String devName; + + private List channelDataList; + + + // 通道数据 + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class ChannelData { + + // 被检设备通道号 + private String devNum; + + // 与之对应的标准设备名称_通道号 + private String standardDevInfo; + + // 数据 + private List dataList; + } + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class RawData { + private String timeDev; + + private Double uaDev; + + private Double ubDev; + + private Double ucDev; + + private String timeStdDev; + + private Double uaStdDev; + + private Double ubStdDev; + + private Double ucStdDev; + } +} diff --git a/detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java b/detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java index 2db7a187..747f7051 100644 --- a/detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java @@ -23,10 +23,7 @@ import com.njcn.gather.result.pojo.enums.ResultUnitEnum; import com.njcn.gather.script.pojo.po.PqScriptCheckData; import com.njcn.gather.script.pojo.po.SourceIssue; import com.njcn.gather.script.service.IPqScriptCheckDataService; -import com.njcn.gather.storage.pojo.po.ContrastHarmonicResult; -import com.njcn.gather.storage.pojo.po.ContrastNonHarmonicResult; -import com.njcn.gather.storage.pojo.po.SimAndDigHarmonicResult; -import com.njcn.gather.storage.pojo.po.SimAndDigNonHarmonicResult; +import com.njcn.gather.storage.pojo.po.*; import com.njcn.gather.storage.service.DetectionDataDealService; import com.njcn.gather.system.cfg.pojo.po.SysTestConfig; import com.njcn.gather.system.cfg.service.ISysTestConfigService; @@ -72,6 +69,9 @@ public class DetectionServiceImpl { private final String MAG = "MAG"; private final String DUR = "DUR"; + private static final Integer INHARMONIC_FLAG = 1; + private static final Integer HARMONIC_FLAG = 2; + /** * 开始处理指标类型 @@ -129,16 +129,16 @@ public class DetectionServiceImpl { */ case HV: case HI: - SimAndDigHarmonicResult harmV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, sourceIssue, dataRule, 2); - SimAndDigHarmonicResult harmI = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, I, sourceIssue, dataRule, 2); + SimAndDigHarmonicResult harmV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, sourceIssue, dataRule, HARMONIC_FLAG); + SimAndDigHarmonicResult harmI = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, I, sourceIssue, dataRule, HARMONIC_FLAG); return resultFlag(harmV, harmI, code); /** * 间谐波 */ case HSV: case HSI: - SimAndDigHarmonicResult harmInV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, sourceIssue, dataRule, 1); - SimAndDigHarmonicResult harmInI = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, I, sourceIssue, dataRule, 1); + SimAndDigHarmonicResult harmInV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, sourceIssue, dataRule, INHARMONIC_FLAG); + SimAndDigHarmonicResult harmInI = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, I, sourceIssue, dataRule, INHARMONIC_FLAG); return resultFlag(harmInV, harmInI, code); /** * 三相电压不平衡度 @@ -166,7 +166,7 @@ public class DetectionServiceImpl { case HP: SimAndDigHarmonicResult harmP = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, HP, sourceIssue, dataRule, 2); if (ObjectUtil.isNotNull(harmP)) { - detectionDataDealService.acceptAdResult(Arrays.asList(harmP), code); + detectionDataDealService.acceptHarmonicResult(Arrays.asList(harmP), code); return harmP.getResultFlag(); } return 4; @@ -193,8 +193,8 @@ public class DetectionServiceImpl { } } - public Integer resultFlag(SimAndDigHarmonicResult v, SimAndDigHarmonicResult i, String code) { - List info = new ArrayList<>(); + public Integer resultFlag(T v, T i, String code) { + List info = new ArrayList<>(); if (ObjectUtil.isNotNull(v)) { info.add(v); } @@ -202,7 +202,7 @@ public class DetectionServiceImpl { info.add(i); } if (CollUtil.isNotEmpty(info)) { - detectionDataDealService.acceptAdResult(info, code); + detectionDataDealService.acceptHarmonicResult(info, code); return getInteger(info.stream().map(x -> x.getResultFlag()).distinct().collect(Collectors.toList())); } return 4; @@ -344,7 +344,7 @@ public class DetectionServiceImpl { detectionDataDealService.acceptNonHarmonicResult(info, code); } if (CollUtil.isNotEmpty(harmonicResultList)) { - detectionDataDealService.acceptAdResult(harmonicResultList, code); + detectionDataDealService.acceptHarmonicResult(harmonicResultList, code); } return 4; } @@ -904,12 +904,15 @@ public class DetectionServiceImpl { return map; } - private void reflectHarmonic(String phase, List integerBooleanA, SimAndDigHarmonicResult harmonicResult, Integer num) { + private void reflectHarmonic(String phase, List integerBooleanA, T harmonicResult, Integer num) { Map dataMap = integerBooleanA.stream().collect(Collectors.toMap(DetectionData::getNum, Function.identity())); dataMap.forEach((key, value) -> { try { // 设置 id 字段; Field idField = SimAndDigHarmonicResult.class.getDeclaredField(phase + "Value" + (num == 1 ? (int) (key + 0.5) : key.intValue())); + if(harmonicResult instanceof ContrastNonHarmonicResult){ + idField = ContrastNonHarmonicResult.class.getDeclaredField(phase + "Value" + (num == 1 ? (int) (key + 0.5) : key.intValue())); + } idField.setAccessible(true); if (ObjectUtil.isNull(value.getIsData())) { idField.set(harmonicResult, value.getData()); @@ -995,8 +998,8 @@ public class DetectionServiceImpl { DetectionData data = new DetectionData(); data.setIsData(isQualified); data.setNum(harm); + SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); if (CollUtil.isNotEmpty(harmDataList)) { - SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); BigDecimal bd = BigDecimal.valueOf(harmDataList.get(0)); bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP); data.setData(bd.doubleValue()); @@ -1005,10 +1008,10 @@ public class DetectionServiceImpl { data.setResultData(channelData); if (ObjectUtil.isNotNull(errSysDtl)) { PqErrSysDtls errSys = BeanUtil.copyProperties(errSysDtl, PqErrSysDtls.class); - errSys.setMaxErrorValue(maxErrorMultiply(errSys, fData, issueHarmMap.get(harm))); + errSys.setMaxErrorValue(maxErrorMultiply(errSys, fData, issueHarmMap.get(harm), oneConfig.getScale())); data.setUnit(errSysDtl.getErrorUnit()); data.setRadius(-errSys.getMaxErrorValue() + "~" + errSys.getMaxErrorValue()); - setDetection(dataRule, harmDataList, errSys, data, channelData, fData); + setDetection(dataRule, harmDataList, errSys, data, channelData, fData, oneConfig.getScale()); } info.add(data); }); @@ -1170,9 +1173,9 @@ public class DetectionServiceImpl { if (CollUtil.isNotEmpty(errSysDtls)) { PqErrSysDtls errSysDtl = BeanUtil.copyProperties(errSysDtls.get(0), PqErrSysDtls.class); detectionData.setUnit(errSysDtl.getErrorUnit()); - errSysDtl.setMaxErrorValue(maxErrorMultiply(errSysDtl, data, channelData)); + errSysDtl.setMaxErrorValue(maxErrorMultiply(errSysDtl, data, channelData, oneConfig.getScale())); detectionData.setRadius(-errSysDtl.getMaxErrorValue() + "~" + errSysDtl.getMaxErrorValue()); - setDetection(dataRule, list, errSysDtl, detectionData, channelData, data); + setDetection(dataRule, list, errSysDtl, detectionData, channelData, data, oneConfig.getScale()); } } return detectionData; @@ -1329,9 +1332,9 @@ public class DetectionServiceImpl { * @param ratedData 额定值 * @param harmData 谐波下发值(百分数->含油率) * @return + * @parm scale 小数点位数 */ - public Double maxErrorMultiply(PqErrSysDtls error, Double ratedData, Double harmData) { - SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); + public Double maxErrorMultiply(PqErrSysDtls error, Double ratedData, Double harmData, Integer scale) { Double errorValue = error.getMaxErrorValue(); //1绝对值 if (1 == error.getValueType()) { @@ -1339,11 +1342,11 @@ public class DetectionServiceImpl { //绝对值-标称值= 最大误差值 * 额定电压 case 0: return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(ratedData)) - .setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue(); + .setScale(scale, RoundingMode.HALF_UP).doubleValue(); //绝对值-标准值 = 最大误差值 * 谐波下发值 case 1: return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(harmData)) - .setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue(); + .setScale(scale, RoundingMode.HALF_UP).doubleValue(); } } //2相对值 @@ -1353,7 +1356,7 @@ public class DetectionServiceImpl { case 0: case 1: return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(100)) - .setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue(); + .setScale(scale, RoundingMode.HALF_UP).doubleValue(); } } return errorValue; @@ -1467,28 +1470,28 @@ public class DetectionServiceImpl { List pqErrSysDtls = pqErrSysDtlsService.listPqErrSysDtlsByPqErrSysIdAndScriptType(errorSysId, split[1]); DetectionCodeEnum anEnum = DetectionCodeEnum.getDetectionCodeByCode(split[1]); - Double fData = null; + Double fUn = Double.valueOf(monitorDto.getPtStr().split(":")[1]); + Double fIn = Double.valueOf(monitorDto.getCtStr().split(":")[1]); + Double fHz = 50.0; switch (anEnum) { case FREQ: - fData = 50.0; - return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fData, DetectionCodeEnum.FREQ.getCode(), dataRule, num, code); + return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fHz, DetectionCodeEnum.FREQ.getCode(), dataRule, num, code); case VRMS: - fData = Double.valueOf(monitorDto.getPt().split(":")[1]); - return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fData, DetectionCodeEnum.VRMS.getCode(), dataRule, num, code); + return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, DetectionCodeEnum.VRMS.getCode(), dataRule, num, code); case IRMS: - break; + return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fIn, DetectionCodeEnum.IRMS.getCode(), dataRule, num, code); case V_UNBAN: - break; + return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, DetectionCodeEnum.V_UNBAN.getCode(), dataRule, num, code); case I_UNBAN: - break; - case U1: - break; + return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fIn, DetectionCodeEnum.I_UNBAN.getCode(), dataRule, num, code); + //case U1: case V2_50: - break; - case I1: - break; + ContrastHarmonicResult harmV = isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, fIn, DetectionCodeEnum.V2_50.getCode(), dataRule, num, HARMONIC_FLAG); + return resultFlag(harmV, null, code); + //case I1: case I2_50: - break; + ContrastHarmonicResult harmI = isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, fIn, DetectionCodeEnum.V2_50.getCode(), dataRule, num, HARMONIC_FLAG); + return resultFlag(null, harmI, code); case MAG: break; case DUR: @@ -1636,22 +1639,14 @@ public class DetectionServiceImpl { harmonicResult.setDataType(DataSourceEnum.REAL_DATA.getValue()); List pqErrSysDtls = new ArrayList<>(); Integer isQualified = 4; -// if (CollUtil.isNotEmpty(errDtlsCheckData)) { -// String finalHarmCode = harmCode; -// List adDtlsCheckData = errDtlsCheckData.stream().filter(x -> finalHarmCode.equals(x.getValueTypeCode())).collect(Collectors.toList()); -// harmonicResult.setAdType(adDtlsCheckData.get(0).getValueType()); -// isQualified = adDtlsCheckData.get(0).getIsQualified(); -// if (CollUtil.isNotEmpty(adDtlsCheckData.get(0).getErrSysDtls())) { -// pqErrSysDtls = adDtlsCheckData.get(0).getErrSysDtls(); -// } -// } - List integerBooleanA = harmRangeComparison(isQualified, pqErrSysDtls, dataRule, devMap.get(TYPE_A).get(0), fData, harmonicFlag); - List integerBooleanB = harmRangeComparison(isQualified, pqErrSysDtls, dataRule, devMap.get(TYPE_B).get(0), fData, harmonicFlag); - List integerBooleanC = harmRangeComparison(isQualified, pqErrSysDtls, dataRule, devMap.get(TYPE_C).get(0), fData, harmonicFlag); + + List integerBooleanA = harmRangeComparison(isQualified, pqErrSysDtls, dataRule, devMap.get(TYPE_A).get(0), devMap.get(TYPE_A).get(1), fData); + List integerBooleanB = harmRangeComparison(isQualified, pqErrSysDtls, dataRule, devMap.get(TYPE_B).get(0), devMap.get(TYPE_A).get(1), fData); + List integerBooleanC = harmRangeComparison(isQualified, pqErrSysDtls, dataRule, devMap.get(TYPE_C).get(0), devMap.get(TYPE_A).get(1), fData); harmonicResult.setDataType(DataSourceEnum.REAL_DATA.getValue()); -// reflectHarmonic("a", integerBooleanA, harmonicResult, humonicFlag); -// reflectHarmonic("b", integerBooleanB, harmonicResult, humonicFlag); -// reflectHarmonic("c", integerBooleanC, harmonicResult, humonicFlag); + reflectHarmonic("a", integerBooleanA, harmonicResult, harmonicFlag); + reflectHarmonic("b", integerBooleanB, harmonicResult, harmonicFlag); + reflectHarmonic("c", integerBooleanC, harmonicResult, harmonicFlag); List list = new ArrayList<>(); list.addAll(integerBooleanA.stream().filter(x -> 1 != x.getNum()).distinct().collect(Collectors.toList())); list.addAll(integerBooleanB.stream().filter(x -> 1 != x.getNum()).distinct().collect(Collectors.toList())); @@ -1894,52 +1889,24 @@ public class DetectionServiceImpl { } /** - * @param pqErrSysDtls 误差体系 - * @param dataRule 数据处理原则 - * @param devMap - * @param fData 额定值 - * @param harmonicFlag 1:间谐波,2:谐波 + * @param isQualified 检测结果 + * @param pqErrSysDtls 误差体系 + * @param dataRule 数据处理原则 + * @param devMap 被检设备(间)谐波数据 + * @param standardDevMap 与之对齐的标准设备(间)谐波数据 + * @param fData 额定值 * @return */ public List harmRangeComparison(Integer isQualified, List pqErrSysDtls, DictDataEnum dataRule, Map> devMap, - Double fData, - Integer harmonicFlag) { + Map> standardDevMap, + Double fData) { List info = new ArrayList<>(); //根据谐波几次相值/额定值 - Map issueHarmMap=devMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, x -> x.getValue().get(0))); + Map issueHarmMap = standardDevMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, x -> x.getValue().get(0))); - -// if (HP.equals(type)) { -// List checkData = pqScriptCheckDataService.list(new MPJLambdaWrapper() -// .eq(PqScriptCheckData::getScriptIndex, sourceIssue.getIndex()) -// .eq(PqScriptCheckData::getPhase, phase) -// .eq(PqScriptCheckData::getScriptId, sourceIssue.getScriptId()) -// ); -// issueHarmMap = checkData.stream().collect(Collectors.toMap(PqScriptCheckData::getHarmNum, x -> x.getValue() * fData)); -// } else { -// Double percent; -// if (I.equals(type)) { -// //电流是百分比转换成赋值算的 -// percent = fData * 0.01; -// } else { -// //电压是百分比算的 -// percent = 1.0; -// } -// if (1 == harmonicFlag) { -// issueHarmMap = sourceIssue.getChannelList().stream() -// .filter(x -> (type + phase.toLowerCase()).equals(x.getChannelType())) -// .flatMap(x -> x.getInharmList().stream()) -// .collect(Collectors.toMap(SourceIssue.ChannelListDTO.InharmModel::getInharm, x -> BigDecimal.valueOf(x.getFAmp()).multiply(BigDecimal.valueOf(percent)).doubleValue())); -// } else { -// issueHarmMap = sourceIssue.getChannelList().stream() -// .filter(x -> (type + phase.toLowerCase()).equals(x.getChannelType())) -// .flatMap(x -> x.getHarmList().stream()) -// .collect(Collectors.toMap(SourceIssue.ChannelListDTO.HarmModel::getHarm, x -> BigDecimal.valueOf(x.getFAmp()).multiply(BigDecimal.valueOf(percent)).doubleValue())); -// } -// } Map errSysDtlMap = new LinkedHashMap<>(); issueHarmMap.forEach((key, value) -> { //获得误差体系 @@ -1960,8 +1927,8 @@ public class DetectionServiceImpl { DetectionData data = new DetectionData(); data.setIsData(isQualified); data.setNum(harm); + SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); if (CollUtil.isNotEmpty(harmDataList)) { - SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); BigDecimal bd = BigDecimal.valueOf(harmDataList.get(0)); bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP); data.setData(bd.doubleValue()); @@ -1970,10 +1937,10 @@ public class DetectionServiceImpl { data.setResultData(channelData); if (ObjectUtil.isNotNull(errSysDtl)) { PqErrSysDtls errSys = BeanUtil.copyProperties(errSysDtl, PqErrSysDtls.class); - errSys.setMaxErrorValue(maxErrorMultiply(errSys, fData, issueHarmMap.get(harm))); + errSys.setMaxErrorValue(maxErrorMultiply(errSys, fData, issueHarmMap.get(harm), oneConfig.getScale())); data.setUnit(errSysDtl.getErrorUnit()); data.setRadius(-errSys.getMaxErrorValue() + "~" + errSys.getMaxErrorValue()); - setDetection(dataRule, harmDataList, errSys, data, channelData, fData); + setDetection(dataRule, harmDataList, errSys, data, channelData, fData, oneConfig.getScale()); } info.add(data); }); @@ -2060,16 +2027,15 @@ public class DetectionServiceImpl { * @Author: wr * @Date: 2024/12/29 18:10 */ - private void setDetection(DictDataEnum dataRule, List harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue) { + private void setDetection(DictDataEnum dataRule, List harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue, Integer scale) { if (CollUtil.isNotEmpty(harmDataList)) { // 存放合格的数据 - SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); List qualifiedList = harmDataList.stream() - .filter(x -> channelData == 0 ? NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl, oneConfig.getScale()), + .filter(x -> channelData == 0 ? NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl, scale), BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()), BigDecimal.valueOf(errSysDtl.getMaxErrorValue())) : - x != 0 && NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl, oneConfig.getScale()), + x != 0 && NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl, scale), BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()), BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList()); if (CollUtil.isNotEmpty(qualifiedList)) { @@ -2077,23 +2043,23 @@ public class DetectionServiceImpl { case AT_WILL_VALUE: case CP95_VALUE: case AVG_VALUE: - data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale())); + data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl, scale)); break; case SECTION_VALUE: case Own_value: if (qualifiedList.size() == harmDataList.size()) { - data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale())); + data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl, scale)); } else { List subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList()); BigDecimal bd = BigDecimal.valueOf(subtract.get(0)); - bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP); + bd = bd.setScale(scale, RoundingMode.HALF_UP); data.setData(bd.doubleValue()); - data.setErrorData(devSubtractChannelData(subtract.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale())); + data.setErrorData(devSubtractChannelData(subtract.get(0), channelData, ratedValue, errSysDtl, scale)); } break; } } else { - data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale())); + data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl, scale)); } isData(dataRule, harmDataList, data, qualifiedList); } 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 daf621b1..55eb7620 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 @@ -1,7 +1,6 @@ package com.njcn.gather.detection.service.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; @@ -22,11 +21,10 @@ import com.njcn.gather.detection.util.business.DetectionCommunicateUtil; import com.njcn.gather.detection.util.socket.CnSocketUtil; import com.njcn.gather.detection.util.socket.FormalTestManager; import com.njcn.gather.detection.util.socket.SocketManager; -import com.njcn.gather.detection.util.socket.websocket.WebServiceManager; import com.njcn.gather.detection.util.socket.cilent.NettyClient; -import com.njcn.web.utils.RequestUtil; import com.njcn.gather.detection.util.socket.cilent.NettyContrastClientHandler; import com.njcn.gather.detection.util.socket.cilent.NettySourceClientHandler; +import com.njcn.gather.detection.util.socket.websocket.WebServiceManager; import com.njcn.gather.device.pojo.po.PqDev; import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.device.service.IPqDevService; @@ -43,6 +41,7 @@ import com.njcn.gather.source.pojo.po.SourceInitialize; import com.njcn.gather.source.service.IPqSourceService; import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum; import com.njcn.gather.system.dictionary.service.IDictDataService; +import com.njcn.web.utils.RequestUtil; import io.netty.channel.Channel; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -50,10 +49,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @@ -77,10 +73,10 @@ public class PreDetectionServiceImpl implements PreDetectionService { private final SocketContrastResponseService socketContrastResponseService; private final IPqScriptCheckDataService iPqScriptCheckDataService; - @Value("${socket.source.ip:192.168.1.138}") + @Value("${socket.device.ip:127.0.0.1}") private String ip; - @Value("${socket.source.port:61000}") + @Value("${socket.device.port:61000}") private Integer port; //private final SocketSourceResponseService sourceResponseService; @@ -323,9 +319,9 @@ public class PreDetectionServiceImpl implements PreDetectionService { public void startContrastTest(ContrastDetectionParam param) { // 参数校验,目前仅检查IP是否重复,后续可在里面扩展 checkDevIp(param.getDevIds()); - //用于处理异常导致的socket通道未关闭,socket交互异常 - DetectionCommunicateUtil.checkContrastCommunicateChannel(param.getUserId()); socketContrastResponseService.init(param); + //用于处理异常导致的socket通道未关闭,socket交互异常 + DetectionCommunicateUtil.checkContrastCommunicateChannel(param.getLoginName()); // 和通信模块进行连接 this.sendContrastSocket(param); @@ -337,22 +333,22 @@ public class PreDetectionServiceImpl implements PreDetectionService { * @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.addAll(BeanUtil.copyToList(FormalTestManager.standardDevList, PreDetection.class)); + List preDetections = new ArrayList<>(); + preDetections.addAll(FormalTestManager.devList); + preDetections.addAll(FormalTestManager.standardDevList); + preDetections.forEach(x -> { x.setDevType(x.getIcdType()); x.getMonitorList().forEach(y -> { - String pt = y.getPt(); - int i = pt.indexOf(":"); - y.setPt(BigDecimal.valueOf(Double.parseDouble(pt.substring(0, i))).divide(BigDecimal.valueOf(Double.parseDouble(pt.substring(i + 1))), 5, BigDecimal.ROUND_HALF_UP) + ""); + String ptStr = y.getPtStr(); + int i = ptStr.indexOf(":"); + y.setPt(BigDecimal.valueOf(Double.parseDouble(ptStr.substring(0, i))).divide(BigDecimal.valueOf(Double.parseDouble(ptStr.substring(i + 1))), 5, BigDecimal.ROUND_HALF_UP).doubleValue()); - String ct = y.getCt(); - i = ct.indexOf(":"); - y.setCt(BigDecimal.valueOf(Double.parseDouble(ct.substring(0, i))).divide(BigDecimal.valueOf(Double.parseDouble(ct.substring(i + 1))), 5, BigDecimal.ROUND_HALF_UP) + ""); + String ctStr = y.getCtStr(); + i = ctStr.indexOf(":"); + y.setCt(BigDecimal.valueOf(Double.parseDouble(ctStr.substring(0, i))).divide(BigDecimal.valueOf(Double.parseDouble(ctStr.substring(i + 1))), 5, BigDecimal.ROUND_HALF_UP).doubleValue()); }); }); map.put("deviceList", preDetections); @@ -360,13 +356,13 @@ public class PreDetectionServiceImpl implements PreDetectionService { SocketMsg socketMsg = new SocketMsg<>(); socketMsg.setRequestId(SourceOperateCodeEnum.YJC_SBTXJY.getValue()); - socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_01.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_02.getValue()); socketMsg.setData(jsonString); String json = JSON.toJSONString(socketMsg); - SocketManager.sendMsg(s, json); PreDetectionParam preDetectionParam = new PreDetectionParam(); - preDetectionParam.setUserPageId(param.getUserId()); + preDetectionParam.setUserPageId(param.getLoginName()); + WebServiceManager.addPreDetectionParam(param.getLoginName(), preDetectionParam); NettyClient.socketClient(ip, port, preDetectionParam, json, new NettyContrastClientHandler(preDetectionParam, socketContrastResponseService)); } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/DetectionUtil.java b/detection/src/main/java/com/njcn/gather/detection/util/DetectionUtil.java index 88110135..1a6bdd41 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/DetectionUtil.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/DetectionUtil.java @@ -3,7 +3,6 @@ package com.njcn.gather.detection.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.njcn.gather.detection.pojo.po.DevData; -import com.njcn.gather.detection.service.impl.DetectionServiceImpl; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -22,6 +21,10 @@ import java.util.stream.Stream; * @data 2025-07-28 */ public class DetectionUtil { + // ISO 8601格式 + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_DATE_TIME; + + /** * 相角矫正到统一个区间 * @@ -50,7 +53,7 @@ public class DetectionUtil { long devMillis = getMillis(devData.getTime()); long standardMillis = getMillis(standardDevData.getTime()); - if (BigDecimal.valueOf(devMillis).divide(BigDecimal.valueOf(10), 0, BigDecimal.ROUND_HALF_UP).compareTo(BigDecimal.valueOf(standardMillis).divide(BigDecimal.valueOf(10), 0, BigDecimal.ROUND_HALF_UP)) == 0) { + if (BigDecimal.valueOf(devMillis).divide(BigDecimal.valueOf(1000), 0, BigDecimal.ROUND_HALF_UP).compareTo(BigDecimal.valueOf(standardMillis).divide(BigDecimal.valueOf(1000), 0, BigDecimal.ROUND_HALF_UP)) == 0) { return true; } else if (Math.abs(devMillis - standardMillis) < 100) { return true; @@ -84,7 +87,7 @@ public class DetectionUtil { * @return */ public static long getMillis(String dateTimeStr) { - LocalDateTime localDateTime = timeFormat(dateTimeStr, DateTimeFormatter.ISO_DATE_TIME); + LocalDateTime localDateTime = timeFormat(dateTimeStr, FORMATTER); return getMillis(localDateTime); } @@ -100,12 +103,15 @@ public class DetectionUtil { /** * 判断value是否为0 + * * @param value * @return */ public static boolean isZero(Double value) { + // todo 电流为0判断 + BigDecimal bd = BigDecimal.valueOf(value); - if(bd.subtract(BigDecimal.ZERO).abs().compareTo(BigDecimal.valueOf(0.001)) < 0){ + if (bd.subtract(BigDecimal.ZERO).abs().compareTo(BigDecimal.valueOf(0.01)) < 0) { return true; } return false; 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 e17ff7f7..8a415a96 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 @@ -60,27 +60,20 @@ public class DetectionCommunicateUtil { /** * 比对式-检测是否存在已有的Socket通道,有则强行关闭 * - * @param userId + * @param loginName */ - public static void checkContrastCommunicateChannel(String userId) { - Channel channel = SocketManager.getChannelByUserId(userId); + public static void checkContrastCommunicateChannel(String loginName) { + Channel channel = SocketManager.getChannelByUserId(loginName + CnSocketUtil.CONTRAST_DEV_TAG); 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()); + CnSocketUtil.contrastSendquit(loginName); + SocketManager.removeUser(loginName + CnSocketUtil.CONTRAST_DEV_TAG); + try { + Thread.sleep(4000); + } 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 a3094748..d6e4f420 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 @@ -16,6 +16,8 @@ public class CnSocketUtil { public final static String DEV_TAG = "_Dev"; + public final static String CONTRAST_DEV_TAG = "_Contrast_Dev"; + public final static String SOURCE_TAG = "_Source"; public final static String START_TAG = "_Start"; @@ -57,12 +59,13 @@ public class CnSocketUtil { /** * 比对式-退出检测 */ - public static void contrastSendquit(String userId) { + public static void contrastSendquit(String loginName) { 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)); + socketMsg.setOperateCode(SourceOperateCodeEnum.QUIT_INIT_02.getValue()); + SocketManager.sendMsg(loginName + CONTRAST_DEV_TAG, JSON.toJSONString(socketMsg)); WebServiceManager.removePreDetectionParam(); + FormalTestManager.currentStep=SourceOperateCodeEnum.QUITE; } } 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 04dac9fe..729abcb0 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/FormalTestManager.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/FormalTestManager.java @@ -1,8 +1,9 @@ package com.njcn.gather.detection.util.socket; import com.google.common.collect.HashBiMap; +import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; import com.njcn.gather.detection.pojo.po.DevData; -import com.njcn.gather.device.pojo.po.PqStandardDev; +import com.njcn.gather.device.pojo.enums.PatternEnum; import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.plan.pojo.po.AdPlan; import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum; @@ -20,9 +21,11 @@ import java.util.concurrent.ConcurrentHashMap; */ public class FormalTestManager { + // 当前步骤 + public static SourceOperateCodeEnum currentStep; /** - * key:设备ip,value:当前设备下面的通道号 + * key:设备ip,value:当前设备下面的监测点ID(ip_通道号) */ public static Map> devMapMonitorNum = new ConcurrentHashMap<>(); @@ -59,7 +62,7 @@ public class FormalTestManager { /** * key:设备ip,value:装置id */ - public static Map devIdMapComm = new HashMap<>(); + public static Map devIdMapComm = HashBiMap.create(); /** * 停止触发标识 @@ -86,6 +89,11 @@ public class FormalTestManager { */ public static AdPlan currentTestPlan; + /** + * 当前正在检测的模式 + */ + public static PatternEnum patternEnum; + /** * 比对式检测-检测项。 */ @@ -97,9 +105,9 @@ public class FormalTestManager { public static DictDataEnum dataRule; /** - * 所有参与比对式检测的被检设备、标准设备配对关系。key:标准设备id_通道号,value:被检设备id_通道号 + * 所有参与比对式检测的被检设备、标准设备配对关系。key:被检设备id_通道号,value:标准设备id_通道号 */ - public static Map pairsMap = HashBiMap.create(); + public static HashBiMap pairsMap = HashBiMap.create(); /** * 被检设备的数据。key:设备ip_通道号,value:DevData数据集合 diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/MsgUtil.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/MsgUtil.java index 1672adbd..bb473a54 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/MsgUtil.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/MsgUtil.java @@ -65,4 +65,22 @@ public class MsgUtil { } return JSON.toJSONString(socketDataMsg); } + + /** + * 获取一组监测点配对的字符串 + * + * @param devMonitorId + * @param standardDevId + * @param devMap + * @return + */ + public static String getPairStr(String devMonitorId, String standardDevId, Map devMap) { + if (StrUtil.isBlank(devMonitorId) || StrUtil.isBlank(standardDevId)) { + return ""; + } else { + String[] split1 = devMonitorId.split("_"); + String[] split2 = standardDevId.split("_"); + return "被检设备" + devMap.get(split1[0]) + CnSocketUtil.SPLIT_TAG + split1[1] + "路" + " -> 标准设备" + devMap.get(split2[0]) + CnSocketUtil.SPLIT_TAG + split2[1] + "路"; + } + } } 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 a249db6b..ebba8df3 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 @@ -72,6 +72,8 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { if (CnSocketUtil.DEV_TAG.equals(handlerType)) { //CnSocketUtil.sendToWebSocket(param.getUserPageId(),); CnSocketUtil.quitSend(param); + } else if (CnSocketUtil.CONTRAST_DEV_TAG.equals(handlerType)) { + CnSocketUtil.contrastSendquit(param.getUserPageId()); } else { CnSocketUtil.quitSendSource(param); } @@ -81,7 +83,7 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { Thread.currentThread().interrupt(); System.err.println("线程中断异常: " + e.getMessage()); } - String key = CnSocketUtil.DEV_TAG.equals(handlerType) ? param.getUserPageId() + CnSocketUtil.DEV_TAG : param.getUserPageId() + CnSocketUtil.SOURCE_TAG; + String key = param.getUserPageId() + handlerType; 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 70a341f8..424d9a30 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 @@ -51,7 +51,7 @@ public class NettyClient { .addLast(new StringEncoder(CharsetUtil.UTF_8)) .addLast(new HeartbeatHandler(param, CnSocketUtil.SOURCE_TAG)) .addLast(handler); - } else { + } else if (handler instanceof NettyDevClientHandler) { ch.pipeline() // 添加LineBasedFrameDecoder来按行分割数据 .addLast(new LineBasedFrameDecoder(10240)) @@ -64,8 +64,21 @@ public class NettyClient { //allIdleTimeSeconds:在指定的秒数内如果没有发生任何读取或写入操作,则触发IdleState.ALL_IDLE事件。 .addLast(new IdleStateHandler(60, 0, 0, TimeUnit.SECONDS)) .addLast(handler); - } + } else if (handler instanceof NettyContrastClientHandler) { + ch.pipeline() + // 添加LineBasedFrameDecoder来按行分割数据 + .addLast(new LineBasedFrameDecoder(10240)) + .addLast(new StringDecoder(CharsetUtil.UTF_8)) + .addLast(new StringEncoder(CharsetUtil.UTF_8)) + .addLast(new HeartbeatHandler(param, CnSocketUtil.CONTRAST_DEV_TAG)) + //空闲状态的handler + //readerIdleTimeSeconds:在指定的秒数内如果没有读取到任何数据,则触发IdleState.READER_IDLE事件。 + //writerIdleTimeSeconds:在指定的秒数内如果没有写入任何数据,则触发IdleState.WRITER_IDLE事件。 + //allIdleTimeSeconds:在指定的秒数内如果没有发生任何读取或写入操作,则触发IdleState.ALL_IDLE事件。 + .addLast(new IdleStateHandler(60, 0, 0, TimeUnit.SECONDS)) + .addLast(handler); + } } }); ChannelFuture channelFuture = bootstrap.connect(ip, port).sync(); @@ -82,12 +95,18 @@ public class NettyClient { groupByUserId.shutdownGracefully().sync(); } SocketManager.addGroup(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, group); - } else { + } else if(handler instanceof NettyDevClientHandler){ NioEventLoopGroup groupByUserId = SocketManager.getGroupByUserId(param.getUserPageId() + CnSocketUtil.DEV_TAG); if (ObjectUtil.isNotNull(groupByUserId)) { groupByUserId.shutdownGracefully().sync(); } SocketManager.addGroup(param.getUserPageId() + CnSocketUtil.DEV_TAG, group); + }else if(handler instanceof NettyContrastClientHandler){ + NioEventLoopGroup groupByUserId = SocketManager.getGroupByUserId(param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG); + if (ObjectUtil.isNotNull(groupByUserId)) { + groupByUserId.shutdownGracefully().sync(); + } + SocketManager.addGroup(param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG, group); } System.out.println("客户端向服务端发送消息:" + port + msg); @@ -109,8 +128,8 @@ public class NettyClient { CnSocketUtil.quitSendSource(param); socketDataMsg.setOperateCode("Dev"); } else { - socketDataMsg.setOperateCode("Dev"); - CnSocketUtil.quitSend(param); + socketDataMsg.setOperateCode("Contrast_Dev"); + CnSocketUtil.contrastSendquit(param.getUserPageId()); } WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); } finally { 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 index 45b725b2..07d5c9e7 100644 --- 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 @@ -35,7 +35,7 @@ public class NettyContrastClientHandler extends SimpleChannelInboundHandler= 60) { - CnSocketUtil.quitSend(param); + CnSocketUtil.contrastSendquit(param.getUserPageId()); System.out.println("超时处理-----》" + "实时数据已超时----------------关闭"); timeoutSend(); } -// if (!FormalTestManager.hasStopFlag) { -// if (CollUtil.isNotEmpty(SocketManager.getSourceList())) { -// SourceIssue sourceIssue = SocketManager.getSourceList().get(0); -// if (SocketManager.clockMap.containsKey(sourceIssue.getIndex())) { -// SocketManager.clockMap.put(sourceIssue.getIndex(), SocketManager.clockMap.get(sourceIssue.getIndex()) + 60L); -// } else { -// SocketManager.clockMap.put(sourceIssue.getIndex(), 60L); -// } -// -// if (sourceIssue.getType().equals(DicDataEnum.F.getCode())) { -// //闪变,正常抛一轮最大等待20分钟超时 -// if (SocketManager.clockMap.get(sourceIssue.getIndex()) > 1300) { -// fly = true; -// System.out.println("超时处理-----》" + sourceIssue.getType() + "已超时----------------关闭"); -// CnSocketUtil.quitSend(param); -// timeoutSend(sourceIssue); -// } -// } else if (sourceIssue.getType().equals(DicDataEnum.VOLTAGE.getCode()) || sourceIssue.getType().equals(DicDataEnum.HP.getCode())) { -// //统计数据项,正常抛一轮数据,超时 -// if (SocketManager.clockMap.get(sourceIssue.getIndex()) > 180) { -// fly = true; -// CnSocketUtil.quitSend(param); -// System.out.println("超时处理-----》" + sourceIssue.getType() + "已超时----------------关闭"); -// timeoutSend(sourceIssue); -// } -// } else { -// //实时数据 -// if (SocketManager.clockMap.get(sourceIssue.getIndex()) > 60) { -// fly = true; -// CnSocketUtil.quitSend(param); -// System.out.println("超时处理-----》" + sourceIssue.getType() + "已超时----------------关闭"); -// timeoutSend(sourceIssue); -// } -// } -// } else { -// fly = true; -// //为空则认为是常规步骤,设定一分钟超时 -// CnSocketUtil.quitSend(param); -// CnSocketUtil.sendToWebSocket(param.getUserPageId(), SourceOperateCodeEnum.SOCKET_TIMEOUT.getValue(), SourceOperateCodeEnum.SOCKET_TIMEOUT.getValue(), SourceOperateCodeEnum.SOCKET_TIMEOUT.getMsg(), null); -// } -// if (fly) { -// socketContrastResponseService.backCheckState(param); -// } -// } else { -// //如果是暂停操作后 -// FormalTestManager.stopTime += 60; -// System.out.println("当前进入暂停操作超时函数-----------------" + FormalTestManager.stopTime); -// if (FormalTestManager.stopTime > 600) { -// CnSocketUtil.quitSend(param); -// CnSocketUtil.sendToWebSocket(param.getUserPageId(), SourceOperateCodeEnum.FORMAL_REAL.getValue(), SourceOperateCodeEnum.STOP_TIMEOUT.getValue(), SourceOperateCodeEnum.STOP_TIMEOUT.getMsg(), null); -// } -// } } } - - } @Override @@ -166,7 +112,7 @@ public class NettyContrastClientHandler extends SimpleChannelInboundHandler { private final PreDetectionParam webUser; - private final String sourceTag = "_Source"; private final SocketSourceResponseService sourceResponseService; /** @@ -40,7 +39,7 @@ public class NettySourceClientHandler extends SimpleChannelInboundHandler { // System.out.println("断线重连......"); diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/websocket/WebSocketHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/websocket/WebSocketHandler.java index e89c31b8..c12010b3 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/websocket/WebSocketHandler.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/websocket/WebSocketHandler.java @@ -3,13 +3,15 @@ package com.njcn.gather.detection.util.socket.websocket; import cn.hutool.core.util.ObjectUtil; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.util.socket.CnSocketUtil; +import com.njcn.gather.detection.util.socket.FormalTestManager; +import com.njcn.gather.device.pojo.enums.PatternEnum; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.CorruptedFrameException; +import io.netty.handler.codec.DecoderException; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.WebSocketHandshakeException; import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; -import io.netty.handler.codec.DecoderException; -import io.netty.handler.codec.CorruptedFrameException; import io.netty.handler.timeout.IdleStateEvent; import io.netty.util.AttributeKey; import lombok.extern.slf4j.Slf4j; @@ -368,17 +370,14 @@ public class WebSocketHandler extends SimpleChannelInboundHandler { - List listStandardDevPreDetection(@Param("devIds") List ids); + List listStandardDevPreDetection(@Param("ids") List ids); } diff --git a/detection/src/main/java/com/njcn/gather/device/mapper/mapping/PqStandardDevMapper.xml b/detection/src/main/java/com/njcn/gather/device/mapper/mapping/PqStandardDevMapper.xml index e3ac6ef9..2436e757 100644 --- a/detection/src/main/java/com/njcn/gather/device/mapper/mapping/PqStandardDevMapper.xml +++ b/detection/src/main/java/com/njcn/gather/device/mapper/mapping/PqStandardDevMapper.xml @@ -30,15 +30,16 @@ standard_dev.Name, standard_dev.IP, standard_dev.Port, - standard_dev.Dev_Type, + dev_type.name as Dev_Type, standard_dev.Series, standard_dev.Dev_Key, - dev_type.icdType, + icd_path.Name as icdType, dev_type.Dev_Chns, dev_type.Dev_Volt, dev_type.Dev_Curr from pq_standard_dev standard_dev inner join pq_dev_type dev_type on standard_dev.Dev_Type = dev_type.id + inner join pq_icd_path icd_path on dev_type.icd = icd_path.id where standard_dev.Id in #{id} diff --git a/detection/src/main/java/com/njcn/gather/device/pojo/enums/PatternEnum.java b/detection/src/main/java/com/njcn/gather/device/pojo/enums/PatternEnum.java index eb2b01ba..2f6b9693 100644 --- a/detection/src/main/java/com/njcn/gather/device/pojo/enums/PatternEnum.java +++ b/detection/src/main/java/com/njcn/gather/device/pojo/enums/PatternEnum.java @@ -19,4 +19,13 @@ public enum PatternEnum { this.value = value; this.msg = msg; } + + public static PatternEnum getEnum(String value) { + for (PatternEnum patternEnum : PatternEnum.values()) { + if (patternEnum.getValue().equals(value)) { + return patternEnum; + } + } + return null; + } } 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 4850475b..fc007cb4 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 @@ -97,25 +97,37 @@ public class PreDetection { /** * pt */ - @JSONField(name = "pt") - private String pt; + @JSONField(serialize = false) + private String ptStr; /** * ct */ - @JSONField(name = "ct") //todo 是否改为ct - private String ct; + @JSONField(serialize = false) + private String ctStr; + + /** + * pt + */ + @JSONField(name = "pt") + private Double pt; + + /** + * ct + */ + @JSONField(name = "ct") + private Double ct; /** * 统计间隔 */ - @JSONField(name = "statInterval") + @JSONField(serialize = false) private Integer statInterval; /** * 接线方式 */ - @JSONField(name = "connection") + @JSONField(serialize = false) private String connection; } diff --git a/detection/src/main/java/com/njcn/gather/device/service/impl/PqDevServiceImpl.java b/detection/src/main/java/com/njcn/gather/device/service/impl/PqDevServiceImpl.java index 3279b503..0e03f6dc 100644 --- a/detection/src/main/java/com/njcn/gather/device/service/impl/PqDevServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/device/service/impl/PqDevServiceImpl.java @@ -418,8 +418,8 @@ public class PqDevServiceImpl extends ServiceImpl implements monitorListDTO = new PreDetection.MonitorListDTO(); monitorListDTO.setLineId(preDetection.getDevIP() + "_" + i); monitorListDTO.setLine(i); - monitorListDTO.setPt("1"); - monitorListDTO.setCt("1"); + monitorListDTO.setPt(1.0); + monitorListDTO.setCt(1.0); monitorList.add(monitorListDTO); } preDetection.setMonitorList(monitorList); diff --git a/detection/src/main/java/com/njcn/gather/monitor/mapper/mapping/PqMonitorMapper.xml b/detection/src/main/java/com/njcn/gather/monitor/mapper/mapping/PqMonitorMapper.xml index 775d0959..aeb122ad 100644 --- a/detection/src/main/java/com/njcn/gather/monitor/mapper/mapping/PqMonitorMapper.xml +++ b/detection/src/main/java/com/njcn/gather/monitor/mapper/mapping/PqMonitorMapper.xml @@ -6,8 +6,8 @@ resultType="com.njcn.gather.device.pojo.vo.PreDetection$MonitorListDTO"> SELECT CONCAT(pq_dev.IP, '_', Num) as lineId, Num as line, - pt as pt, - ct as ct, + pt as ptStr, + ct as ctStr, Stat_Interval, sys_dict_data.Code as `Connection` FROM pq_monitor diff --git a/detection/src/main/java/com/njcn/gather/report/service/impl/PqReportServiceImpl.java b/detection/src/main/java/com/njcn/gather/report/service/impl/PqReportServiceImpl.java index 32b9df72..94f8ff19 100644 --- a/detection/src/main/java/com/njcn/gather/report/service/impl/PqReportServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/report/service/impl/PqReportServiceImpl.java @@ -74,6 +74,7 @@ import com.njcn.gather.type.pojo.po.DevType; import com.njcn.gather.type.service.IDevTypeService; import com.njcn.http.util.RestTemplateUtil; import com.njcn.web.factory.PageFactory; +import com.njcn.web.utils.RequestUtil; import io.netty.channel.Channel; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -698,11 +699,11 @@ public class PqReportServiceImpl extends ServiceImpl i data.set("file", base64String); sendFileMsg.setData(data.toString()); String msg = JSON.toJSONString(sendFileMsg); - Channel channel = SocketManager.getChannelByUserId("cdf" + DetectionCommunicateConstant.DEV); + Channel channel = SocketManager.getChannelByUserId(RequestUtil.getLoginName()+ DetectionCommunicateConstant.DEV); if (Objects.isNull(channel) || !channel.isActive()) { // 进行源通信连接 PreDetectionParam preDetectionParam = new PreDetectionParam(); - preDetectionParam.setUserPageId("cdf"); + preDetectionParam.setUserPageId(RequestUtil.getLoginName()); preDetectionParam.setSendWebMsg(false); NettyClient.socketClient(ip, port, preDetectionParam, msg, new NettyDevClientHandler(preDetectionParam, socketDevResponseService)); diff --git a/detection/src/main/java/com/njcn/gather/result/controller/ResultController.java b/detection/src/main/java/com/njcn/gather/result/controller/ResultController.java index f753883f..4e189baf 100644 --- a/detection/src/main/java/com/njcn/gather/result/controller/ResultController.java +++ b/detection/src/main/java/com/njcn/gather/result/controller/ResultController.java @@ -11,6 +11,7 @@ import com.njcn.gather.result.pojo.vo.FormContentVO; import com.njcn.gather.result.pojo.vo.ResultVO; import com.njcn.gather.result.pojo.vo.TreeDataVO; import com.njcn.gather.result.service.IResultService; +import com.njcn.gather.system.log.pojo.param.SysLogParam; import com.njcn.web.controller.BaseController; import com.njcn.web.utils.HttpResultUtil; import io.swagger.annotations.Api; @@ -119,4 +120,13 @@ public class ResultController extends BaseController { resultService.deleteTempTable(code); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); } + + @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.DOWNLOAD) + @PostMapping("/exportAlignData") + @ApiOperation("实时对齐数据导出为csv文件") + public void exportAlignData() { + String methodDescribe = getMethodDescribe("exportAlignData"); + LogUtil.njcnDebug(log, "{}", methodDescribe); + resultService.exportAlignData(); + } } diff --git a/detection/src/main/java/com/njcn/gather/result/service/IResultService.java b/detection/src/main/java/com/njcn/gather/result/service/IResultService.java index 7e891e67..e6158461 100644 --- a/detection/src/main/java/com/njcn/gather/result/service/IResultService.java +++ b/detection/src/main/java/com/njcn/gather/result/service/IResultService.java @@ -86,14 +86,20 @@ public interface IResultService { * @param planCode 计划编号 * @param devId 被检设备id * @param lineNo 回路号 - * @param tableKeys 表格key + * @param tableKeys 表格key */ SingleTestResult getFinalContent(List checkDataVOList, String planCode, String devId, Integer lineNo, List tableKeys); /** * 获取段落中指定的key对应的值 + * * @param itemCode 测试大项code - * @param pKeys 待填充的值 + * @param pKeys 待填充的值 */ Map getParagraphKeysValue(String itemCode, List pKeys); + + /** + * 导出实时数据对齐过程中的数据 + */ + void exportAlignData(); } diff --git a/detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java b/detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java index 836c1256..cd843535 100644 --- a/detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java @@ -16,8 +16,12 @@ import com.njcn.common.utils.PubUtils; import com.njcn.gather.detection.pojo.enums.DetectionCodeEnum; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.po.DevData; +import com.njcn.gather.detection.pojo.vo.AlignDataExcel; import com.njcn.gather.detection.pojo.vo.DetectionData; import com.njcn.gather.detection.service.impl.DetectionServiceImpl; +import com.njcn.gather.detection.util.DetectionUtil; +import com.njcn.gather.detection.util.socket.CnSocketUtil; +import com.njcn.gather.detection.util.socket.FormalTestManager; import com.njcn.gather.device.pojo.enums.CommonEnum; import com.njcn.gather.device.service.IPqDevService; import com.njcn.gather.plan.pojo.po.AdPlan; @@ -1491,6 +1495,73 @@ public class ResultServiceImpl implements IResultService { return map; } + @Override + public void exportAlignData() { + List> sheetsList = new ArrayList<>(); + + // key为被检设备的ip, value为该ip下所有通道的设备数据 + Map> ipDevDataMap = FormalTestManager.devDataMap.values().stream().flatMap(List::stream).collect(Collectors.groupingBy(obj -> obj.getId().split(CnSocketUtil.SPLIT_TAG)[0])); + + ipDevDataMap.forEach((ip, devDataList) -> { + // 按照通道号分组。key为通道号,value为该通道号下所有设备数据 + Map> channelDataMap = devDataList.stream().collect(Collectors.groupingBy(obj -> obj.getId().split(CnSocketUtil.SPLIT_TAG)[1])); + + channelDataMap.forEach((channel, channelDevDataList) -> { + String standardDevMonitorId = FormalTestManager.pairsMap.get(ip + channel); + List standarDevDataList = BeanUtil.copyToList(FormalTestManager.standardDevDataMap.get(standardDevMonitorId), DevData.class); + channelDevDataList.sort(Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + + HashMap sheet = new HashMap<>(); + ExportParams exportParams = new ExportParams(); + String devName = FormalTestManager.devNameMapComm.get(ip); + String[] split = standardDevMonitorId.split(CnSocketUtil.SPLIT_TAG); + String standardDevName = FormalTestManager.devNameMapComm.get(split[0]); + exportParams.setSheetName(devName + "通道" + channel); + sheet.put("title", exportParams); + + List dataList = new ArrayList<>(); + channelDevDataList.stream().forEach(obj -> { + AlignDataExcel alignDataExcel = new AlignDataExcel(); + alignDataExcel.getDevDataConfig().setName(devName + "通道" + channel); + alignDataExcel.getStandardDevDataConfig().setName(standardDevName + "通道" + split[1]); + DevData.SqlDataDTO.ListDTO list1 = obj.getSqlData().get(0).getList(); + alignDataExcel.setTimeDev(obj.getTime()); + alignDataExcel.setUaDev(list1.getA()); + alignDataExcel.setUbDev(list1.getB()); + alignDataExcel.setUcDev(list1.getC()); + + DevData devData = standarDevDataList.stream().filter(obj1 -> DetectionUtil.isAlignData(obj1, obj)).findFirst().get(); + if (ObjectUtil.isNotNull(devData)) { + DevData.SqlDataDTO.ListDTO list2 = devData.getSqlData().get(0).getList(); + alignDataExcel.setTimeStdDev(devData.getTime()); + alignDataExcel.setUaStdDev(list2.getA()); + alignDataExcel.setUbStdDev(list2.getB()); + alignDataExcel.setUcStdDev(list2.getC()); + standarDevDataList.remove(devData); + } + dataList.add(alignDataExcel); + }); + standarDevDataList.sort(Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + standarDevDataList.stream().forEach(obj -> { + AlignDataExcel alignDataExcel = new AlignDataExcel(); + alignDataExcel.getDevDataConfig().setName(devName + "通道" + channel); + alignDataExcel.getStandardDevDataConfig().setName(standardDevName + "通道" + split[1]); + DevData.SqlDataDTO.ListDTO list2 = obj.getSqlData().get(0).getList(); + alignDataExcel.setTimeStdDev(obj.getTime()); + alignDataExcel.setUaStdDev(list2.getA()); + alignDataExcel.setUbStdDev(list2.getB()); + alignDataExcel.setUcStdDev(list2.getC()); + dataList.add(alignDataExcel); + }); + + sheet.put("data", dataList); + sheet.put("entity", AlignDataExcel.class); + }); + }); + + ExcelUtil.exportExcel("实时数据.xlsx", sheetsList); + } + private Integer conform(Set numbers) { if (CollUtil.isNotEmpty(numbers)) { if (numbers.size() > 1) { diff --git a/storage/src/main/java/com/njcn/gather/storage/service/DetectionDataDealService.java b/storage/src/main/java/com/njcn/gather/storage/service/DetectionDataDealService.java index bc08a2a5..9db71206 100644 --- a/storage/src/main/java/com/njcn/gather/storage/service/DetectionDataDealService.java +++ b/storage/src/main/java/com/njcn/gather/storage/service/DetectionDataDealService.java @@ -13,13 +13,13 @@ public interface DetectionDataDealService extends IReplenishMybatisService SimAndDigNonHarmonicResultList,String code); + Boolean acceptAdNon(List nonHarmonicResultList,String code); - Boolean acceptAd(List SimAndDigHarmonicResultList,String code); + Boolean acceptAd(List harmonicResultList,String code); Boolean acceptNonHarmonicResult(List nonHarmonicResultList, String code); - Boolean acceptAdResult(List SimAndDigHarmonicResultList,String code); + Boolean acceptHarmonicResult(List SimAndDigHarmonicResultList,String code); /** * 根据终端id查询终端所有监测项目是否合格 diff --git a/storage/src/main/java/com/njcn/gather/storage/service/impl/DetectionDataServiceImpl.java b/storage/src/main/java/com/njcn/gather/storage/service/impl/DetectionDataServiceImpl.java index d7876bde..62fa9af6 100644 --- a/storage/src/main/java/com/njcn/gather/storage/service/impl/DetectionDataServiceImpl.java +++ b/storage/src/main/java/com/njcn/gather/storage/service/impl/DetectionDataServiceImpl.java @@ -6,13 +6,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.njcn.db.mybatisplus.handler.DynamicTableNameHandler; import com.njcn.db.mybatisplus.service.impl.ReplenishMybatisServiceImpl; import com.njcn.gather.storage.mapper.DetectionDataDealMapper; -import com.njcn.gather.storage.pojo.po.BaseResult; -import com.njcn.gather.storage.pojo.po.ContrastNonHarmonicResult; -import com.njcn.gather.storage.pojo.po.SimAndDigHarmonicResult; -import com.njcn.gather.storage.pojo.po.SimAndDigNonHarmonicResult; -import com.njcn.gather.storage.service.ContrastNonHarmonicService; -import com.njcn.gather.storage.service.DetectionDataDealService; -import com.njcn.gather.storage.service.SimAndDigNonHarmonicService; +import com.njcn.gather.storage.pojo.po.*; +import com.njcn.gather.storage.service.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,42 +27,81 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl implements DetectionDataDealService { - private final SimAndDigNonHarmonicService adNonHarmonicService; + private final SimAndDigNonHarmonicService simAndDigNonHarmonicService; + private final SimAndDigHarmonicService simAndDigHarmonicService; private final ContrastNonHarmonicService contrastNonHarmonicService; + private final ContrastHarmonicService contrastHarmonicService; private final DetectionDataDealMapper detectionDataDealMapper; @Override @Transactional - public Boolean acceptAdNon(List SimAndDigNonHarmonicResultList, String code) { - String adNonTable = "ad_non_harmonic_"; - DynamicTableNameHandler.setTableName(adNonTable + code); - List monitorIds = SimAndDigNonHarmonicResultList.stream().map(SimAndDigNonHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); - if (CollUtil.isNotEmpty(monitorIds)) { - adNonHarmonicService.remove(new LambdaQueryWrapper().in(SimAndDigNonHarmonicResult::getMonitorId, monitorIds) - .eq(SimAndDigNonHarmonicResult::getScriptId, SimAndDigNonHarmonicResultList.get(0).getScriptId()) - .eq(SimAndDigNonHarmonicResult::getSort, SimAndDigNonHarmonicResultList.get(0).getSort())); - adNonHarmonicService.saveBatch(SimAndDigNonHarmonicResultList, 100); + public Boolean acceptAdNon(List nonHarmonicResultList, String code) { + if (CollUtil.isNotEmpty(nonHarmonicResultList)) { + String adNonTable = "ad_non_harmonic_"; + DynamicTableNameHandler.setTableName(adNonTable + code); + + if (nonHarmonicResultList.get(0) instanceof SimAndDigNonHarmonicResult) { + List simAndDigNonHarmonicResults = BeanUtil.copyToList(nonHarmonicResultList, SimAndDigNonHarmonicResult.class); + List monitorIds = simAndDigNonHarmonicResults.stream().map(SimAndDigNonHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(monitorIds)) { + simAndDigNonHarmonicService.remove(new LambdaQueryWrapper().in(SimAndDigNonHarmonicResult::getMonitorId, monitorIds) + .eq(SimAndDigNonHarmonicResult::getScriptId, simAndDigNonHarmonicResults.get(0).getScriptId()) + .eq(SimAndDigNonHarmonicResult::getSort, simAndDigNonHarmonicResults.get(0).getSort())); + simAndDigNonHarmonicService.saveBatch(simAndDigNonHarmonicResults, 100); + } + } + + if (nonHarmonicResultList.get(0) instanceof ContrastNonHarmonicResult) { + List contrastNonHarmonicResults = BeanUtil.copyToList(nonHarmonicResultList, ContrastNonHarmonicResult.class); + List monitorIds = contrastNonHarmonicResults.stream().map(ContrastNonHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(monitorIds)) { + contrastNonHarmonicService.remove(new LambdaQueryWrapper().in(ContrastNonHarmonicResult::getMonitorId, monitorIds) + .eq(ContrastNonHarmonicResult::getErrorId, contrastNonHarmonicResults.get(0).getErrorId()) + .eq(ContrastNonHarmonicResult::getNum, contrastNonHarmonicResults.get(0).getNum())); + contrastNonHarmonicService.saveBatch(contrastNonHarmonicResults, 100); + } + } + + DynamicTableNameHandler.remove(); + return true; } - DynamicTableNameHandler.remove(); - return true; + return false; } @Override @Transactional - public Boolean acceptAd(List SimAndDigHarmonicResultList, String code) { - String adTable = "ad_harmonic_"; - DynamicTableNameHandler.setTableName(adTable + code); - List monitorIds = SimAndDigHarmonicResultList.stream().map(SimAndDigHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); - if (CollUtil.isNotEmpty(monitorIds)) { - this.remove(new LambdaQueryWrapper().in(SimAndDigHarmonicResult::getMonitorId, monitorIds) - .eq(SimAndDigHarmonicResult::getScriptId, SimAndDigHarmonicResultList.get(0).getScriptId()) - .eq(SimAndDigHarmonicResult::getSort, SimAndDigHarmonicResultList.get(0).getSort())); - this.saveBatch(SimAndDigHarmonicResultList, 100); + public Boolean acceptAd(List harmonicResultList, String code) { + if (CollUtil.isEmpty(harmonicResultList)) { + String adTable = "ad_harmonic_"; + DynamicTableNameHandler.setTableName(adTable + code); + if (harmonicResultList.get(0) instanceof SimAndDigHarmonicResult) { + List simAndDigHarmonicResultList = BeanUtil.copyToList(harmonicResultList, SimAndDigHarmonicResult.class); + List monitorIds = simAndDigHarmonicResultList.stream().map(SimAndDigHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(monitorIds)) { + simAndDigHarmonicService.remove(new LambdaQueryWrapper().in(SimAndDigHarmonicResult::getMonitorId, monitorIds) + .eq(SimAndDigHarmonicResult::getScriptId, simAndDigHarmonicResultList.get(0).getScriptId()) + .eq(SimAndDigHarmonicResult::getSort, simAndDigHarmonicResultList.get(0).getSort())); + simAndDigHarmonicService.saveBatch(simAndDigHarmonicResultList, 100); + } + } + + if (harmonicResultList.get(0) instanceof ContrastHarmonicResult) { + List contrastHarmonicResultList = BeanUtil.copyToList(harmonicResultList, ContrastHarmonicResult.class); + List monitorIds = contrastHarmonicResultList.stream().map(ContrastHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(monitorIds)) { + contrastHarmonicService.remove(new LambdaQueryWrapper().in(ContrastHarmonicResult::getMonitorId, monitorIds) + .eq(ContrastHarmonicResult::getErrorId, contrastHarmonicResultList.get(0).getErrorId()) + .eq(ContrastHarmonicResult::getNum, contrastHarmonicResultList.get(0).getNum())); + contrastHarmonicService.saveBatch(contrastHarmonicResultList, 100); + } + } + + DynamicTableNameHandler.remove(); + return true; } - DynamicTableNameHandler.remove(); - return true; + return false; } @Override @@ -80,10 +114,10 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl simAndDigNonHarmonicResultList = BeanUtil.copyToList(nonHarmonicResultList, SimAndDigNonHarmonicResult.class); List monitorIds = simAndDigNonHarmonicResultList.stream().map(SimAndDigNonHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); if (CollUtil.isNotEmpty(monitorIds)) { - adNonHarmonicService.remove(new LambdaQueryWrapper().in(SimAndDigNonHarmonicResult::getMonitorId, monitorIds) + simAndDigNonHarmonicService.remove(new LambdaQueryWrapper().in(SimAndDigNonHarmonicResult::getMonitorId, monitorIds) .eq(SimAndDigNonHarmonicResult::getScriptId, simAndDigNonHarmonicResultList.get(0).getScriptId()) .eq(SimAndDigNonHarmonicResult::getSort, simAndDigNonHarmonicResultList.get(0).getSort())); - adNonHarmonicService.saveBatch(simAndDigNonHarmonicResultList, 100); + simAndDigNonHarmonicService.saveBatch(simAndDigNonHarmonicResultList, 100); } } if (nonHarmonicResultList.get(0) instanceof ContrastNonHarmonicResult) { @@ -103,18 +137,35 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl simAndDigHarmonicResultList, String code) { - String adTableResult = "ad_harmonic_result_"; - DynamicTableNameHandler.setTableName(adTableResult + code); - List monitorIds = simAndDigHarmonicResultList.stream().map(SimAndDigHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); - if (CollUtil.isNotEmpty(monitorIds)) { - this.remove(new LambdaQueryWrapper().in(SimAndDigHarmonicResult::getMonitorId, monitorIds) - .eq(SimAndDigHarmonicResult::getScriptId, simAndDigHarmonicResultList.get(0).getScriptId()) - .eq(SimAndDigHarmonicResult::getSort, simAndDigHarmonicResultList.get(0).getSort())); - this.saveBatch(simAndDigHarmonicResultList, 100); + public Boolean acceptHarmonicResult(List harmonicResultList, String code) { + if (CollUtil.isNotEmpty(harmonicResultList)) { + String adTableResult = "ad_harmonic_result_"; + DynamicTableNameHandler.setTableName(adTableResult + code); + if (harmonicResultList.get(0) instanceof SimAndDigHarmonicResult) { + List simAndDigHarmonicResultList = BeanUtil.copyToList(harmonicResultList, SimAndDigHarmonicResult.class); + List monitorIds = simAndDigHarmonicResultList.stream().map(SimAndDigHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(monitorIds)) { + simAndDigHarmonicService.remove(new LambdaQueryWrapper().in(SimAndDigHarmonicResult::getMonitorId, monitorIds) + .eq(SimAndDigHarmonicResult::getScriptId, simAndDigHarmonicResultList.get(0).getScriptId()) + .eq(SimAndDigHarmonicResult::getSort, simAndDigHarmonicResultList.get(0).getSort())); + simAndDigHarmonicService.saveBatch(simAndDigHarmonicResultList, 100); + } + } + + if (harmonicResultList.get(0) instanceof ContrastHarmonicResult) { + List contrastHarmonicResultList = BeanUtil.copyToList(harmonicResultList, ContrastHarmonicResult.class); + List monitorIds = contrastHarmonicResultList.stream().map(ContrastHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(monitorIds)) { + contrastHarmonicService.remove(new LambdaQueryWrapper().in(ContrastHarmonicResult::getMonitorId, monitorIds) + .eq(ContrastHarmonicResult::getErrorId, contrastHarmonicResultList.get(0).getErrorId()) + .eq(ContrastHarmonicResult::getNum, contrastHarmonicResultList.get(0).getNum())); + contrastHarmonicService.saveBatch(contrastHarmonicResultList, 100); + } + } + DynamicTableNameHandler.remove(); + return true; } - DynamicTableNameHandler.remove(); - return true; + return false; } @Override @@ -123,7 +174,7 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl noHarm = new ArrayList<>(); for (String id : ids) { DynamicTableNameHandler.setTableName("ad_non_harmonic_result_" + code); - noHarm.addAll(adNonHarmonicService.list(new LambdaQueryWrapper() + noHarm.addAll(simAndDigNonHarmonicService.list(new LambdaQueryWrapper() .like(SimAndDigNonHarmonicResult::getMonitorId, id) .notIn(CollUtil.isNotEmpty(disabledScriptDtlIndexs), SimAndDigNonHarmonicResult::getSort, disabledScriptDtlIndexs) .in(CollUtil.isNotEmpty(valueType), SimAndDigNonHarmonicResult::getAdType, valueType)