From c9bf604a337d99fbb5c7f5c836c5f8a47bdbf2f5 Mon Sep 17 00:00:00 2001 From: caozehui <2427765068@qq.com> Date: Mon, 18 Aug 2025 16:15:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E6=A3=80=E6=B5=8B-=E6=94=B6?= =?UTF-8?q?=E5=8F=96=E6=95=B0=E6=8D=AE=E3=80=81=E5=8E=9F=E5=A7=8B=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=84=E8=A3=85=E5=92=8C=E5=85=A5=E5=BA=93=E3=80=81?= =?UTF-8?q?=E9=85=8D=E5=AF=B9=E5=85=B3=E7=B3=BB=E5=85=A5=E5=BA=93=E3=80=81?= =?UTF-8?q?=E8=AF=AF=E5=B7=AE=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PreDetectionController.java | 19 +- .../SocketContrastResponseService.java | 775 ++++++++------- .../handler/SocketDevResponseService.java | 8 +- .../gather/detection/mapper/AdPairMapper.java | 11 + .../detection/pojo/dto/ConditionDataDTO.java | 29 + .../pojo/dto/HarmonicConditionDataDTO.java | 16 + .../pojo/enums/DetectionCodeEnum.java | 5 +- .../detection/pojo/enums/ResultEnum.java | 24 + .../pojo/param/ContrastDetectionParam.java | 5 + .../pojo/param/PreDetectionParam.java | 5 + .../njcn/gather/detection/pojo/po/AdPair.java | 24 + .../gather/detection/pojo/vo/AlignDataVO.java | 10 +- .../detection/pojo/vo/DetectionData.java | 5 + .../detection/pojo/vo/DevLineTestResult.java | 8 +- .../detection/service/IAdPariService.java | 11 + .../service/PreDetectionService.java | 10 + .../service/impl/AdPairServiceImpl.java | 17 + .../service/impl/DetectionServiceImpl.java | 891 ++++++++++-------- .../service/impl/PreDetectionServiceImpl.java | 50 +- .../gather/detection/util/DetectionUtil.java | 24 +- .../util/socket/FormalTestManager.java | 9 +- .../util/socket/cilent/HeartbeatHandler.java | 91 +- .../util/socket/cilent/NettyClient.java | 1 + .../socket/cilent/NettyDevClientHandler.java | 16 +- .../device/controller/PqDevController.java | 7 +- .../gather/device/service/IPqDevService.java | 1 + .../device/service/impl/PqDevServiceImpl.java | 6 +- .../service/impl/PqErrSysDtlsServiceImpl.java | 2 +- .../controller/PqMonitorController.java | 3 +- .../monitor/mapper/PqMonitorMapper.java | 12 + .../mapper/mapping/PqMonitorMapper.xml | 34 + .../monitor/pojo/param/PqMonitorParam.java | 15 +- .../monitor/service/IPqMonitorService.java | 12 +- .../service/impl/PqMonitorServiceImpl.java | 22 +- .../plan/controller/AdPlanController.java | 2 +- .../gather/plan/pojo/param/AdPlanParam.java | 1 + .../gather/plan/service/IAdPlanService.java | 15 +- .../plan/service/impl/AdPlanServiceImpl.java | 72 +- .../report/pojo/enums/PowerIndexEnum.java | 1 + .../service/impl/ResultServiceImpl.java | 57 +- .../storage/mapper/mapping/TableGenMapper.xml | 8 +- .../storage/pojo/po/ContrastBaseResult.java | 5 - .../impl/DetectionDataServiceImpl.java | 8 +- .../service/impl/TableGenServiceImpl.java | 18 +- .../dictionary/service/IDictTreeService.java | 2 + .../service/impl/DictTreeServiceImpl.java | 13 +- .../system/reg/service/ISysRegResService.java | 8 +- .../service/impl/SysRegResServiceImpl.java | 5 + 48 files changed, 1429 insertions(+), 964 deletions(-) create mode 100644 detection/src/main/java/com/njcn/gather/detection/mapper/AdPairMapper.java create mode 100644 detection/src/main/java/com/njcn/gather/detection/pojo/dto/ConditionDataDTO.java create mode 100644 detection/src/main/java/com/njcn/gather/detection/pojo/dto/HarmonicConditionDataDTO.java create mode 100644 detection/src/main/java/com/njcn/gather/detection/pojo/enums/ResultEnum.java create mode 100644 detection/src/main/java/com/njcn/gather/detection/pojo/po/AdPair.java create mode 100644 detection/src/main/java/com/njcn/gather/detection/service/IAdPariService.java create mode 100644 detection/src/main/java/com/njcn/gather/detection/service/impl/AdPairServiceImpl.java diff --git a/detection/src/main/java/com/njcn/gather/detection/controller/PreDetectionController.java b/detection/src/main/java/com/njcn/gather/detection/controller/PreDetectionController.java index d2c23afa..d9c14ccc 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,7 +9,6 @@ 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; @@ -18,6 +17,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Map; + /** * @author chendaofei @@ -143,4 +144,20 @@ public class PreDetectionController extends BaseController { preDetectionService.startContrastTest(param); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); } + + /** + * 获取比对检测的监测次数信息 + * + * @param planId + * @return + */ + @GetMapping("/getContrastTestNumInfo") + @OperateInfo + @ApiOperation("获取比对检测的检测次数信息") + @ApiImplicitParam(name = "planId", value = "计划ID", required = true) + public HttpResult> getContrastTestNumInfo(@RequestParam("planId") String planId) { + String methodDescribe = getMethodDescribe("getContrastTestNumInfo"); + Map result = preDetectionService.getContrastTestNumInfo(planId); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } } diff --git a/detection/src/main/java/com/njcn/gather/detection/handler/SocketContrastResponseService.java b/detection/src/main/java/com/njcn/gather/detection/handler/SocketContrastResponseService.java index e12c8aff..0a12be4f 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 @@ -13,12 +13,11 @@ 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.AdPair; 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.pojo.vo.*; +import com.njcn.gather.detection.service.IAdPariService; +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; @@ -29,7 +28,6 @@ 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.monitor.service.IPqMonitorService; import com.njcn.gather.plan.pojo.enums.DataSourceEnum; import com.njcn.gather.plan.service.IAdPlanService; import com.njcn.gather.storage.pojo.po.ContrastHarmonicResult; @@ -40,11 +38,14 @@ 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 com.njcn.gather.system.reg.pojo.po.SysRegRes; +import com.njcn.gather.system.reg.service.ISysRegResService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.lang.reflect.Field; import java.math.BigDecimal; +import java.text.DecimalFormat; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.Executors; @@ -53,7 +54,7 @@ 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 @@ -66,22 +67,13 @@ public class SocketContrastResponseService { private final IAdPlanService adPlanService; private final IDictDataService dictDataService; private final IPqDevService pqDevService; - private final IPqMonitorService pqMonitorService; 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()); + private final ISysRegResService sysRegResService; + private final DetectionServiceImpl detectionService; + private final IAdPariService adPairService; + /** * 定时器 @@ -96,7 +88,7 @@ public class SocketContrastResponseService { /** * 实时数据对齐校验结果 */ - private boolean alignCheckResult = false; + private boolean checkResult = false; /** * 成功的配对 key:被检设备ip_通道号,value:配对设备ip_通道号 @@ -106,37 +98,35 @@ public class SocketContrastResponseService { /** * 接收数据成功的测点(设备ip_通道号) */ - Set successComm = new HashSet<>(); + private Set successComm = new HashSet<>(); /** * 接收数据失败的测点(设备ip_通道号) */ - Set failComm = new HashSet<>(); + private Set failComm = new HashSet<>(); + + /** + * 存放比对式注册信息(包含了实时数据有效组数、统计数据有效组数、录播数据有效组数、闪变数据有效组数) + */ + private SysRegRes contrastRegRes = null; private static final Map> testItemCodeMap = new HashMap() {{ - put("FREQ", Arrays.asList("real$FREQ")); + put("FREQ", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.FREQ.getCode())); // put("V", Arrays.asList("real$VRMS", "real$VA", "real$DELTA_V")); - put("V", Arrays.asList("real$VRMS")); - put("HV", Arrays.asList("real$V2-50", "real$U1")); - put("HI", Arrays.asList("real$I2-50", "real$I1")); - put("HP", Arrays.asList("real$P2-50")); - put("HSV", Arrays.asList("real$SV_1-49")); - put("HSI", Arrays.asList("real$SI_1-49")); + put("V", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.VRMS.getCode())); + put("HV", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.V2_50.getCode(), DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.U1.getCode())); + put("HI", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.I2_50.getCode(), DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.I1.getCode())); + put("HP", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.P2_50.getCode())); + put("HSV", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.SV_1_49.getCode())); + put("HSI", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.SI_1_49.getCode())); // put("I", Arrays.asList("real$IRMS", "real$IA")); - put("I", Arrays.asList("real$IRMS")); - put("IMBV", Arrays.asList("real$V_UNBAN")); - put("IMBA", Arrays.asList("real$I_UNBAN")); - put("P", Arrays.asList("real$P_FUND")); + put("I", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.IRMS.getCode())); + put("IMBV", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.V_UNBAN.getCode())); + put("IMBA", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.I_UNBAN.getCode())); + put("P", Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.P_FUND.getCode())); }}; - private List icdTypeList; - - /** - * 存放从装置收到的icd校验数据。key为icdType,value为IcdCheckData - */ - private Map icdCheckDataMap = new HashMap<>(); - /** * 初始化操作 @@ -144,6 +134,7 @@ public class SocketContrastResponseService { * @param param */ public void init(ContrastDetectionParam param) { + checkResult = false; SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); SocketManager.contrastClockMap.clear(); successComm.clear(); @@ -220,11 +211,16 @@ public class SocketContrastResponseService { 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(); + FormalTestManager.testItemMap.clear(); List testItemIds = Arrays.asList(FormalTestManager.currentTestPlan.getTestItem().split(",")); List dictTreeList = dictTreeService.getDictTreeById(testItemIds); - List topLevelCodes = dictTreeList.stream().map(DictTree::getCode).collect(Collectors.toList()); - topLevelCodes.stream().forEach(topLevelCode -> FormalTestManager.testItemCodeList.addAll(testItemCodeMap.get(topLevelCode))); + + List fatherIdList = dictTreeList.stream().map(DictTree::getId).collect(Collectors.toList()); + List childDictTreeList = dictTreeService.listByFatherIds(fatherIdList); + if (CollUtil.isNotEmpty(childDictTreeList)) { + List collect1 = testItemCodeMap.values().stream().flatMap(Collection::stream).map(x -> x.split("\\$")[1]).collect(Collectors.toList()); + FormalTestManager.testItemMap.putAll(childDictTreeList.stream().filter(x -> collect1.contains(x.getCode())).collect(Collectors.toMap(obj -> DetectionCodeEnum.REAL_PREFIX.getCode() + obj.getCode(), obj -> obj.getId()))); + } DictData dictData = dictDataService.getDictDataById(FormalTestManager.currentTestPlan.getDataRule()); if (ObjectUtil.isNotNull(dictData)) { @@ -233,9 +229,6 @@ 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))); @@ -314,7 +307,7 @@ public class SocketContrastResponseService { 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.setDataType(this.getAllDataType()); phaseSequenceParam.setReadCount(1); phaseSequenceParam.setIgnoreCount(1); // 刚一开始实时数据申请后,第一组数据为空数据,忽略掉 socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); @@ -353,6 +346,7 @@ public class SocketContrastResponseService { } } + /** * 模型一致性校验 */ @@ -382,10 +376,10 @@ public class SocketContrastResponseService { if (successComm.size() == FormalTestManager.monitorMap.size()) { - boolean modelCheckResult = this.modelCheck(param, FormalTestManager.devDataMap); - modelCheckResult = this.modelCheck(param, FormalTestManager.standardDevDataMap) && modelCheckResult; + boolean modelCheckResult = this.modelCheck(param, FormalTestManager.devDataMap, FormalTestManager.monitorMap.get(monitorId1)); + modelCheckResult = this.modelCheck(param, FormalTestManager.standardDevDataMap, FormalTestManager.monitorMap.get(monitorId1)) && modelCheckResult; if (!modelCheckResult) { - this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + this.clearData(); SocketDataMsg webSend = new SocketDataMsg(); webSend.setRequestId(SourceOperateCodeEnum.YJC_MXYZXJY.getValue()); @@ -397,20 +391,20 @@ public class SocketContrastResponseService { CnSocketUtil.contrastSendquit(param.getUserPageId(), false); return; } else { - this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + this.clearData(); 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)); + 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(Arrays.asList("real$VRMS")); + phaseSequenceParam.setDataType(Arrays.asList(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.VRMS.getCode())); phaseSequenceParam.setReadCount(this.getMaxReadCount(5)); phaseSequenceParam.setIgnoreCount(0); socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); @@ -473,12 +467,12 @@ public class SocketContrastResponseService { if (Objects.isNull(scheduler)) { scheduler = Executors.newScheduledThreadPool(1); scheduledFuture = scheduler.schedule(() -> { - if (!alignCheckResult) { + if (!checkResult) { System.out.println("1minute内实时数据对齐校验失败!"); CnSocketUtil.contrastSendquit(param.getUserPageId(), false); - this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + this.clearData(); Collection disjunction = CollectionUtil.disjunction(FormalTestManager.pairsMap.keySet(), successPair.keySet()); // 向前端推送实时数据对齐失败的配对项 @@ -495,7 +489,7 @@ public class SocketContrastResponseService { 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)); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); // 将数据推送给前端 this.sendAlignDataToWeb(param.getUserPageId()); @@ -535,20 +529,20 @@ public class SocketContrastResponseService { // 若成功的配对项等于总的配对项,则判定为成功 if (successPair.keySet().containsAll(FormalTestManager.pairsMap.keySet())) { - alignCheckResult = true; + checkResult = true; scheduledFuture.cancel(true); scheduler.shutdown(); // 将数据推送给前端 this.sendAlignDataToWeb(param.getUserPageId()); - this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + this.clearData(); 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)); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend1)); System.out.println("实时数据对齐校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始相序校验》》》》》》》》》》》》》》》》"); @@ -556,7 +550,13 @@ public class SocketContrastResponseService { 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.setDataType(Arrays.asList( + DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.VRMS.getCode(), + DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.VA.getCode(), + DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.IRMS.getCode(), + DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.IA.getCode(), + DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.V_UNBAN.getCode(), + DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.I_UNBAN.getCode())); phaseSequenceParam.setReadCount(this.getMaxReadCount(1)); phaseSequenceParam.setIgnoreCount(0); socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); @@ -594,7 +594,6 @@ public class SocketContrastResponseService { } } - /** * 相序校验 */ @@ -618,34 +617,38 @@ public class SocketContrastResponseService { 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 (!successPair.containsKey(devMonitorId)) { + 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 (!successPair.containsKey(devMonitorId)) { + FormalTestManager.standardDevDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.standardDevDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + } } - // 进行单个监测点的相序校验 if (!successPair.containsKey(devMonitorId)) { - if (FormalTestManager.devDataMap.get(devMonitorId).size() > 1 && FormalTestManager.standardDevDataMap.get(standardDevMonitorId).size() > 1) { + if (FormalTestManager.devDataMap.get(devMonitorId).size() >= 1 && FormalTestManager.standardDevDataMap.get(standardDevMonitorId).size() >= 1) { 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())) { + PreDetection.MonitorListDTO monitorListDTO = FormalTestManager.monitorMap.get(devMonitorId); + if (this.singleMonitorXuCheck(devMonitorId, standardDevMonitorId, monitorListDTO, singleMonitorAlignData.get(0), singleMonitorAlignData.get(1), FormalTestManager.devNameMapComm, param.getUserPageId())) { successPair.put(devMonitorId, standardDevMonitorId); // 若成功的配对项等于总的配对项,则判定为成功 if (successPair.keySet().containsAll(FormalTestManager.pairsMap.keySet())) { - this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + this.clearData(); 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)); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); // 后续做正式检测 if (param.getTestItemList().get(2)) { @@ -654,22 +657,24 @@ public class SocketContrastResponseService { 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.setDataType(this.getAllDataType()); + contrastRegRes = sysRegResService.getContrastRegRes(); + phaseSequenceParam.setReadCount(this.getMaxReadCount(contrastRegRes.getRealTime())); phaseSequenceParam.setIgnoreCount(0); socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); FormalTestManager.currentStep = SourceOperateCodeEnum.FORMAL_REAL; - //SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); + SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); // 实时数据开始计时 - //SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); + SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); + checkResult = false; } else { // 断开与设备的连接,但是不要将Socket移除 CnSocketUtil.contrastSendquit(param.getUserPageId(), false); } } } else if (successComm.size() == FormalTestManager.monitorMap.size()) { - this.clearData(FormalTestManager.devDataMap, FormalTestManager.standardDevDataMap); + this.clearData(); // 相序校验失败,最终向前端发送失败消息 WebSocketVO webSend = new WebSocketVO<>(); @@ -694,6 +699,7 @@ public class SocketContrastResponseService { WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 1)); break; case RE_OPERATE: + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); CnSocketUtil.contrastSendquit(param.getUserPageId(), false); break; default: @@ -711,147 +717,140 @@ public class SocketContrastResponseService { */ private void formalDeal(PreDetectionParam param, SocketDataMsg socketDataMsg) { String data = socketDataMsg.getData(); - DevData devData = JSON.parseObject(data, DevData.class); //DevData的id值为 设备id_通道号 这种形式 + DevData devData = JSON.parseObject(data, DevData.class); SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); - String monitorId1 = devData.getId(); switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: + case NORMAL_RESPONSE: + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_02.getValue()); + + String monitorId1 = devData.getId(); + // 实时数据有效组数 + Integer realTime = contrastRegRes.getRealTime(); //成功收到数据后重置超时统计时间 SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); + if (Objects.isNull(scheduler)) { + scheduler = Executors.newScheduledThreadPool(1); + scheduledFuture = scheduler.schedule(() -> { + if (!checkResult) { + System.out.println("正式检测-" + (long) Math.ceil(realTime / 5) + "分钟内收集数据不完整!"); + + // 断开与设备的连接,但是不要将Socket移除 + CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + + this.clearData(); + + Collection disjunction = CollectionUtil.disjunction(FormalTestManager.pairsMap.keySet(), successPair.keySet()); + // 向前端推送收集数据不完整的配对项 + for (String key : disjunction) { + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(MsgUtil.getPairStr(key, FormalTestManager.pairsMap.inverse().get(key), FormalTestManager.devNameMapComm) + " 数据收集不完整!"); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + } + // 推送最终失败结果 + webSend.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode());//最终错误推送 + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + + return; + } + scheduler.shutdown(); + scheduler = null; + }, (long) Math.ceil(realTime / 5), TimeUnit.MINUTES); + } String devMonitorId = monitorId1; String standardDevMonitorId = monitorId1; - 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()))); + standardDevMonitorId = FormalTestManager.pairsMap.get(monitorId1); + if (!successPair.containsKey(devMonitorId)) { + 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); + if (!successPair.containsKey(devMonitorId)) { + FormalTestManager.standardDevDataMap.get(monitorId1).add(devData); + Collections.sort(FormalTestManager.standardDevDataMap.get(monitorId1), Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + } } - if (!successPair.containsKey(devMonitorId)) { + if (FormalTestManager.devDataMap.get(devMonitorId).size() >= realTime && FormalTestManager.standardDevDataMap.get(standardDevMonitorId).size() >= realTime) { + List> singleMonitorAlignData = getSingleMonitorAlignData(FormalTestManager.devDataMap.get(devMonitorId), FormalTestManager.standardDevDataMap.get(standardDevMonitorId)); + if (singleMonitorAlignData.get(0).size() >= realTime && singleMonitorAlignData.get(1).size() >= realTime) { + successPair.put(devMonitorId, standardDevMonitorId); + // 推送收集数据成功的配对项 + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(MsgUtil.getPairStr(devMonitorId, standardDevMonitorId, FormalTestManager.devNameMapComm) + " 数据收集成功!"); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + if (successPair.keySet().containsAll(FormalTestManager.pairsMap.keySet())) { + checkResult = true; + scheduledFuture.cancel(true); + scheduler.shutdown(); + // 断开与设备的连接,但是不要将Socket移除 + CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + + String errorSysId = FormalTestManager.currentTestPlan.getErrorSysId(); + String code = String.valueOf(FormalTestManager.currentTestPlan.getCode()); + // 原始数据入库 + baseDataInsert(singleMonitorAlignData.get(0), param.getNum(), code, FormalTestManager.testItemMap); + baseDataInsert(singleMonitorAlignData.get(1), param.getNum(), code, FormalTestManager.testItemMap); + + // 配对关系入库 + List adPairList = new ArrayList<>(); + for (String key : FormalTestManager.pairsMap.keySet()) { + String standardDevId = FormalTestManager.pairsMap.get(key); + AdPair adPair = new AdPair(); + adPair.setPlanId(FormalTestManager.currentTestPlan.getId()); + String[] split = key.split(CnSocketUtil.SPLIT_TAG); + adPair.setDevMonitorId(FormalTestManager.devIdMapComm.get(split[0]) + CnSocketUtil.SPLIT_TAG + split[1]); + split = standardDevId.split(CnSocketUtil.SPLIT_TAG); + adPair.setStdDevMonitorId(FormalTestManager.devIdMapComm.get(split[0]) + CnSocketUtil.SPLIT_TAG + split[1]); + adPair.setNum(param.getNum()); + adPairList.add(adPair); + } + adPairService.saveBatch(adPairList); + + // 进行误差计算 + List allResultList = detectionService.processing( + FormalTestManager.devDataMap.values().stream().flatMap(Collection::stream).collect(Collectors.toList()), + FormalTestManager.standardDevDataMap.values().stream().flatMap(Collection::stream).collect(Collectors.toList()), + FormalTestManager.pairsMap, + FormalTestManager.devIdMapComm, + FormalTestManager.monitorMap, + FormalTestManager.testItemMap.keySet().stream().collect(Collectors.toList()), + errorSysId, FormalTestManager.dataRule, param.getNum(), code); + + this.clearData(); + + // 最终将检测结果推送到前端 + webSend.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode());//最终成功推送 + webSend.setData(JSON.toJSONString(allResultList)); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + } + } + } } -// //当成功的通道数量和检测通道数量相同时进入 -// if (successComm.size() == FormalTestManager.monitorMap.size()) { -// System.out.println(sourceIssue.getType() + CnSocketUtil.SPLIT_TAG + sourceIssue.getIndex() + "当前测试小项读取数据已经全部结束。。。。。。。。。"); -// //修改装置为监测中 -//// adPlanService.updateTestState(param.getPlanId(), param.getDevIds()); -// //开启线程进行入库原始数据操作 -// baseDataInsert(FormalTestManager.realDataXiList, sourceIssue, param, SocketManager.valueTypeMap); -// -// //调用判断方法 -// Map textResult = detectionServiceImpl.processing(FormalTestManager.realDataXiList, param, FormalTestManager.devIdMapComm, sourceIssue, dataRule); -// -// System.out.println(textResult); -// //对检测结果组装实体推送给前台 -// assWebJson(param, textResult, socketDataMsg, sourceIssue); -// -// //当小项结束后需要删除集合中的小项 -// SocketManager.delSource(sourceIssue.getIndex()); -// System.out.println("当前小项结束进行删除============" + sourceIssue.getType() + CnSocketUtil.SPLIT_TAG + sourceIssue.getIndex()); -// -// //小项检测完后小项数减一,并更新map -// long residueCount = SocketManager.getSourceTarget(sourceIssue.getType()) - 1; -// SocketManager.addTargetMap(sourceIssue.getType(), residueCount); -// System.out.println("该大项还有" + residueCount + "个小项没有进行检测!!!!!!!!"); -// -// //当该大项中小项数量变为0,则任务该大项检测结束 -// if (residueCount == 0) { -// System.out.println(sourceIssue.getType() + sourceIssue.getIndex() + "当前测试大项已经全部结束》》》》》》》》"); -// //当residueCount为0则认为大项中的小项已经全部跑完,开始组装信息推送给前端 -// List resultList = new ArrayList<>(); -// // 获取当前检测大项的所有设备的检测结果 -// List allDevTestList = targetTestMap.get(sourceIssue.getType()); -// Map> map = allDevTestList.stream().collect(Collectors.groupingBy(DevLineTestResult::getDeviceId)); -// map.forEach((dev, list) -> { -// DevLineTestResult devTem = new DevLineTestResult(); -// devTem.setDeviceId(dev); -// devTem.setDeviceName(list.get(0).getDeviceName()); -// Integer[] arr = list.get(0).getChnResult(); -// for (int i = 0; i < arr.length; i++) { -// List arrList = list.stream().map(DevLineTestResult::getChnResult).collect(Collectors.toList()); -// Integer[] resultArr = getMaxIntArray(arrList); -// devTem.setChnResult(resultArr); -// } -// resultList.add(devTem); -// }); -// allDevTestList.clear(); -// CnSocketUtil.sendToWebSocket(param.getUserPageId(), socketDataMsg.getRequestId().split(CnSocketUtil.STEP_TAG)[1] + CnSocketUtil.END_TAG, null, resultList, null); -// } -// //在这一步判断是否已经触发暂停按钮 -// if (FormalTestManager.stopFlag && CollUtil.isNotEmpty(SocketManager.getSourceList())) { -// FormalTestManager.stopTime = 0; -// FormalTestManager.hasStopFlag = true; -// successComm.clear(); -// FormalTestManager.realDataXiList.clear(); -// sendWebSocket(param.getUserPageId(), "preStopTest", "stop", null); -// return; -// } -// -// //开始进行下一项检测 -// List sourceIssueList = SocketManager.getSourceList(); -// if (CollUtil.isNotEmpty(sourceIssueList)) { -// SourceIssue sourceIssues = SocketManager.getSourceList().get(0); -// // 如果上一个大项检测完成,则检测下一个大项,并向前端推送消息 -// if (residueCount == 0) { -// CnSocketUtil.sendToWebSocket(param.getUserPageId(), sourceIssues.getType() + CnSocketUtil.START_TAG, null, new ArrayList<>(), null); -// } -// -// //控源下发下一个小项脚本 -// SocketMsg xuMsg = new SocketMsg<>(); -// xuMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); -// xuMsg.setData(JSON.toJSONString(sourceIssues)); -// xuMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + sourceIssues.getType()); -// SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(xuMsg)); -// } else { -// //TODO 是否最终检测完成需要推送给用户 -// PqScriptCheckDataParam checkDataParam = new PqScriptCheckDataParam(); -// checkDataParam.setScriptId(param.getScriptId()); -// checkDataParam.setIsValueTypeName(false); -// List valueType = iPqScriptCheckDataService.getValueType(checkDataParam); -// -// iPqDevService.updateResult(param.getDevIds(), valueType, param.getCode(), param.getUserId(), param.getTemperature(), param.getHumidity()); -// CnSocketUtil.contrastSendquit(param.getUserPageId(),false); -// } -// successComm.clear(); -// FormalTestManager.realDataXiList.clear(); -// break; case UNPROCESSED_BUSINESS: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); break; - case NORMAL_RESPONSE: -// if (devData.getResult()) { -// if (SocketManager.clockMap.containsKey(sourceIssue.getIndex())) { -// SocketManager.clockMap.put(sourceIssue.getIndex(), 0L); -// } -// FormalTestManager.realDataXiList.add(devData); -// } else { -// 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(), JSON.toJSONString(socketDataMsg)); + WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 0)); break; case DEV_TARGET: - failComm.addAll(FormalTestManager.devMapMonitorNum.get(socketDataMsg.getData())); - WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); + WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 1)); break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - break; - case MESSAGE_PARSING_ERROR: - WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); + CnSocketUtil.contrastSendquit(param.getUserPageId(), false); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -911,25 +910,38 @@ public class SocketContrastResponseService { } } - /** * 清空数据 - * - * @param devDataMap - * @param standardDevDataMap */ - private void clearData(Map> devDataMap, Map> standardDevDataMap) { + private void clearData() { successPair.clear(); successComm.clear(); failComm.clear(); - standardDevDataMap.forEach((k, v) -> { + FormalTestManager.devDataMap.forEach((k, v) -> { v.clear(); }); - devDataMap.forEach((k, v) -> { + FormalTestManager.standardDevDataMap.forEach((k, v) -> { v.clear(); }); } + + /** + * 获取正式检测所需要的检测项code + * + * @return + */ + private List getAllDataType() { + List testCodes = FormalTestManager.testItemMap.keySet().stream().collect(Collectors.toList()); + if (testCodes.contains(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.V2_50.getCode())) { + testCodes.add(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.U1.getCode()); + } + if (testCodes.contains(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.I2_50.getCode())) { + testCodes.add(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.I1.getCode()); + } + return testCodes; + } + /** * 获取最大读取数据的组数 * @@ -966,54 +978,55 @@ public class SocketContrastResponseService { 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])); + // key为标准设备的ip, value为该ip下所有通道的设备数据 + Map> ipDevDataMap = FormalTestManager.standardDevDataMap.values().stream().flatMap(List::stream).collect(Collectors.groupingBy(obj -> obj.getId().split(CnSocketUtil.SPLIT_TAG)[0])); - ipDevDataMap.forEach((ip, devDataList) -> { + ipDevDataMap.forEach((ip, stdDevDataList) -> { AlignDataVO alignDataVO = new AlignDataVO(); - alignDataVO.setDevName(FormalTestManager.devNameMapComm.get(ip)); + alignDataVO.setStdDevName(FormalTestManager.devNameMapComm.get(ip)); // 按照通道号分组。key为通道号,value为该通道号下所有设备数据 - Map> channelDataMap = devDataList.stream().collect(Collectors.groupingBy(obj -> obj.getId().split(CnSocketUtil.SPLIT_TAG)[1])); + Map> channelDataMap = stdDevDataList.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 + CnSocketUtil.SPLIT_TAG + channel); - List standarDevDataList = BeanUtil.copyToList(FormalTestManager.standardDevDataMap.get(standardDevMonitorId), DevData.class); + String standardDevMonitorId = ip + CnSocketUtil.SPLIT_TAG + channel; + String devMonitorId = FormalTestManager.pairsMap.inverse().get(standardDevMonitorId); + List devDataList = BeanUtil.copyToList(FormalTestManager.devDataMap.get(devMonitorId), 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]); + channelData.setStdDevNum(channel); + String[] split = devMonitorId.split(CnSocketUtil.SPLIT_TAG); + channelData.setDevInfo(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()); + + DevData devData = devDataList.stream().filter(obj1 -> DetectionUtil.isAlignData(obj1, obj)).findFirst().orElse(null); + if (ObjectUtil.isNotNull(devData)) { + DevData.SqlDataDTO.ListDTO list1 = devData.getSqlData().get(0).getList(); + rawData.setUaDev(list1.getA()); + rawData.setUbDev(list1.getB()); + rawData.setUcDev(list1.getC()); + rawData.setTimeDev(devData.getTime()); + devDataList.remove(devData); + } + return rawData; + }).collect(Collectors.toList()); + devDataList.sort(Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + dataList.addAll(devDataList.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()); return rawData; }).collect(Collectors.toList())); channelData.setDataList(dataList); @@ -1033,18 +1046,30 @@ public class SocketContrastResponseService { * @param param * @param dataMap */ - private boolean modelCheck(PreDetectionParam param, Map> dataMap) { + private boolean modelCheck(PreDetectionParam param, Map> dataMap, PreDetection.MonitorListDTO monitorListDTO) { 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())); + List descList = devData1.getSqlData().stream().map(obj -> DetectionCodeEnum.REAL_PREFIX.getCode() + obj.getDesc()).collect(Collectors.toList()); + descList.addAll(devData1.getSqlDataHarm().stream().map(obj -> DetectionCodeEnum.REAL_PREFIX.getCode() + obj.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); - List collect = FormalTestManager.testItemCodeList.stream().map(obj -> obj.split("\\$")[1]).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(descList) && descList.containsAll(collect)) { + List allTestItem = this.getAllDataType(); + if (DetectionCodeEnum.STAR.getCode().equals(monitorListDTO.getConnection())) { + // 移除相关线电压测试项 +// allTestItem.remove() + } + if (DetectionCodeEnum.DELTA.getCode().equals(monitorListDTO.getConnection())) { + // 移除相关相电压测试项 + allTestItem.remove(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.VRMS.getCode()); + allTestItem.remove(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.U1.getCode()); + allTestItem.remove(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.V2_50.getCode()); + allTestItem.remove(DetectionCodeEnum.REAL_PREFIX.getCode() + DetectionCodeEnum.SV_1_49.getCode()); + } + + if (CollUtil.isNotEmpty(descList) && descList.containsAll(allTestItem)) { // 成功信息 webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); } else { @@ -1068,18 +1093,19 @@ public class SocketContrastResponseService { */ private List> getSingleMonitorAlignData(List devDataList, List standardDevDataList) { List> result = new ArrayList<>(); - result.add(devDataList); List alignDevData = new ArrayList<>(); + List alignStdDevData = new ArrayList<>(); int jStart = 0; - for (int i = 0; i < devDataList.size(); i++) { + for (int i = 0; i < standardDevDataList.size(); i++) { int j = jStart; - if (j >= standardDevDataList.size()) { + if (j >= devDataList.size()) { break; } - for (; j < standardDevDataList.size(); j++) { - if (DetectionUtil.isAlignData(devDataList.get(i), standardDevDataList.get(j))) { - alignDevData.add(standardDevDataList.get(j)); + for (; j < devDataList.size(); j++) { + if (DetectionUtil.isAlignData(devDataList.get(j), standardDevDataList.get(i))) { + alignDevData.add(devDataList.get(j)); + alignStdDevData.add(standardDevDataList.get(i)); jStart = j + 1; break; } @@ -1087,6 +1113,7 @@ public class SocketContrastResponseService { } result.add(alignDevData); + result.add(alignStdDevData); return result; } @@ -1102,13 +1129,13 @@ public class SocketContrastResponseService { int count = 0; int jStart = 0; - for (int i = 0; i < devDataList.size(); i++) { + for (int i = 0; i < standardDevDataList.size(); i++) { int j = jStart; - if (j >= standardDevDataList.size()) { + if (j >= devDataList.size()) { break; } - for (; j < standardDevDataList.size(); j++) { - if (DetectionUtil.isAlignData(devDataList.get(i), standardDevDataList.get(j))) { + for (; j < devDataList.size(); j++) { + if (DetectionUtil.isAlignData(devDataList.get(j), standardDevDataList.get(i))) { count++; jStart = j + 1; break; @@ -1134,106 +1161,170 @@ public class SocketContrastResponseService { * @param userId 用户id(用于找到channel) * @return */ - private boolean singleMonitorXuCheck(String devMonitorId, String standardDevMonitorId, List devData, List stdData, Map devNameMapComm, String userId) { + private boolean singleMonitorXuCheck(String devMonitorId, String standardDevMonitorId, PreDetection.MonitorListDTO monitorListDTO, List devData, List stdData, Map devNameMapComm, String userId) { Boolean flag = true; if (devData.size() < 1 || stdData.size() < 1) { return false; } else { - // 电压&电流校验 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()); - 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(); + String detail = "数据为空!"; - 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; + boolean isStar = DetectionCodeEnum.STAR.getCode().equals(monitorListDTO.getConnection()); + boolean isDelta = DetectionCodeEnum.DELTA.getCode().equals(monitorListDTO.getConnection()); + + // 电压校验 + List uDev = null; + List uStd = null; + if (isStar) { + uDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.VRMS.getCode()); + uStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.VRMS.getCode()); + } + if (isDelta) { + // 角型接线方式,则获取线电压 + uDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.LINE_VRMS.getCode()); + uStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.LINE_VRMS.getCode()); + } + + if (CollUtil.isNotEmpty(uDev) && CollUtil.isNotEmpty(uStd)) { + DevData.SqlDataDTO.ListDTO uDevList = uDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO uStdList = uStd.get(0).getList(); + detail = "被检设备:" + (isDelta ? "Uab" : "Ua") + "=" + uDevList.getA() + + ", " + (isDelta ? "Ubc" : "Ub") + "=" + uDevList.getB() + + ", " + (isDelta ? "Uca" : "Uc") + "=" + uDevList.getC() + + ";标准设备:" + (isDelta ? "Uab" : "Ua") + "=" + uStdList.getA() + + ", " + (isDelta ? "Ubc" : "Ub") + "=" + uStdList.getB() + + ", " + (isDelta ? "Uca" : "Uc") + "=" + uStdList.getC(); + if (!voltageOrCurrentCheck(uDevList.getA(), uDevList.getB(), uDevList.getC(), uStdList.getA(), uStdList.getB(), uStdList.getC(), true)) { + flag = false; + // 单个检测点电压校验失败,推送失败消息 + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":电压校验失败!" + detail); + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":电压校验成功!" + detail); + } } 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()); + flag = false; + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":电压校验失败!" + (isDelta ? "线" : "相") + "电压" + detail); } WebServiceManager.sendMsg(userId, JSON.toJSONString(webSend)); - 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; + + // 电流校验 + detail = "数据为空!"; + List iDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.IRMS.getCode()); + List iStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.IRMS.getCode()); + + if (CollUtil.isNotEmpty(iDev) && CollUtil.isNotEmpty(iStd)) { + DevData.SqlDataDTO.ListDTO iDevList = iDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO iStdList = iStd.get(0).getList(); + detail = "被检设备:Ia=" + iDevList.getA() + ",Ib=" + iDevList.getB() + ",Ic=" + iDevList.getC() + ";标准设备:Ia=" + iStdList.getA() + ",Ib=" + iStdList.getB() + ",Ic=" + iStdList.getC(); + if (!voltageOrCurrentCheck(iDevList.getA(), iDevList.getB(), iDevList.getC(), iStdList.getA(), iStdList.getB(), iStdList.getC(), false)) { + // 单个检测点电流校验失败,推送失败消息 + flag = false; + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":电流校验失败!" + detail); + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":电流校验成功!" + detail); + } } 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()); + flag = false; + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":电流校验失败!" + detail); } WebServiceManager.sendMsg(userId, JSON.toJSONString(webSend)); // 根据接线方式(星型、角型)来决定是否进行三项不平衡校验 - if (DetectionCodeEnum.STAR.getCode().equals(FormalTestManager.monitorMap.get(devMonitorId).getConnection())) { + detail = "数据为空!"; + if (isStar) { //进行三项不平衡校验 List uUnblanceDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.V_UNBAN.getCode()); List uUnblanceStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.V_UNBAN.getCode()); + + DecimalFormat df = new DecimalFormat("0.000000"); + + if (CollUtil.isNotEmpty(uUnblanceDev) && CollUtil.isNotEmpty(uUnblanceStd)) { + DevData.SqlDataDTO.ListDTO uUnblanceDevList = uUnblanceDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO uUnblanceStdList = uUnblanceStd.get(0).getList(); + detail = "被检设备:IMBV=" + df.format(uUnblanceDevList.getB()) + ";标准设备:IMBV=" + df.format(uUnblanceStdList.getB()); + if (!unbalanceCheck(uUnblanceDevList.getB(), uUnblanceStdList.getB(), true)) { + // 单个检测点三项电压不平衡校验失败,推送失败消息 + flag = false; + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":三项电压不平衡校验失败!" + detail); + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":三项电压不平衡校验成功!" + detail); + } + } else { + flag = false; + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":三项电压不平衡校验失败!" + detail); + } + WebServiceManager.sendMsg(userId, JSON.toJSONString(webSend)); + List iUnblanceDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.I_UNBAN.getCode()); List iUnblanceStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.I_UNBAN.getCode()); - - 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.getB(), uUnblanceStdList.getB(), true)) { - // 单个检测点三项电压不平衡校验失败,推送失败消息 - webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); - webSend.setData(pairStr + ":三项电压不平衡校验失败!被检设备:IMBV=" + uUnblanceDevList.getB() + ",标准设备:IMBV=" + uUnblanceStdList.getB()); - flag = false; + if (CollUtil.isNotEmpty(iUnblanceDev) && CollUtil.isNotEmpty(iUnblanceStd)) { + DevData.SqlDataDTO.ListDTO iUnblanceDevList = iUnblanceDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO iUnblanceStdList = iUnblanceStd.get(0).getList(); + detail = "被检设备:IMBA=" + df.format(iUnblanceDevList.getB()) + ";标准设备:IMBA=" + df.format(iUnblanceStdList.getB()); + if (!unbalanceCheck(iUnblanceDevList.getB(), iUnblanceStdList.getB(), false)) { + flag = false; + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":三项电流不平衡校验失败!" + detail); + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":三项电流不平衡校验成功!" + detail); + } } else { - webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); - webSend.setData(pairStr + ":三项电压不平衡校验成功!被检设备:IMBV=" + uUnblanceDevList.getB() + ",标准设备:IMBV=" + uUnblanceStdList.getB()); - } - if (!unbalanceCheck(iUnblanceDevList.getB(), iUnblanceStdList.getB(), false)) { - webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); - webSend.setData(pairStr + ":三项电流不平衡校验失败!被检设备:IMBA=" + iUnblanceDevList.getB() + ",标准设备:IMBA=" + iUnblanceStdList.getB()); flag = false; - } else { - webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); - webSend.setData(pairStr + ":三项电流不平衡校验成功!被检设备:IMBA=" + iUnblanceDevList.getB() + ",标准设备:IMBA=" + iUnblanceStdList.getB()); + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":三项电流不平衡校验失败!" + detail); } WebServiceManager.sendMsg(userId, JSON.toJSONString(webSend)); } // 获取被检设备的额定电流 - Double ratedCurrent = pqMonitorService.getRatedCurrent(devMonitorId); + Double ratedCurrent = Double.valueOf(monitorListDTO.getCtStr().split("\\:")[1]); // 是否存在电流 boolean notHasCurrent = iDev.stream().allMatch( - p -> p.getList().getA() != null && DetectionUtil.isZero(p.getList().getA(),ratedCurrent) - && p.getList().getB() != null && DetectionUtil.isZero(p.getList().getB(),ratedCurrent) - && p.getList().getC() != null && DetectionUtil.isZero(p.getList().getC(),ratedCurrent)); + p -> p.getList().getA() != null && DetectionUtil.isZero(p.getList().getA(), ratedCurrent) + && p.getList().getB() != null && DetectionUtil.isZero(p.getList().getB(), ratedCurrent) + && p.getList().getC() != null && DetectionUtil.isZero(p.getList().getC(), ratedCurrent)); if (!notHasCurrent) { - // 相角校验 - List vaUnblanceDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.VA.getCode()); - List vaUnblanceStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.VA.getCode()); - List iaUnblanceDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.IA.getCode()); - List iaUnblanceStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.IA.getCode()); - 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(); + detail = "数据为空!"; + // 相角差校验 + List vaDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.VA.getCode()); + List vaStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.VA.getCode()); + List iaDev = getSingleMonitorSqlData(devData, DetectionCodeEnum.IA.getCode()); + List iaStd = getSingleMonitorSqlData(stdData, DetectionCodeEnum.IA.getCode()); + if (CollUtil.isNotEmpty(vaDev) && CollUtil.isNotEmpty(vaStd) && CollUtil.isNotEmpty(iaDev) && CollUtil.isNotEmpty(iaStd)) { + DevData.SqlDataDTO.ListDTO vaDevList = vaDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO vaStdList = vaDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO iaDevList = vaDev.get(0).getList(); + DevData.SqlDataDTO.ListDTO iaStdList = vaDev.get(0).getList(); - 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; + detail = "被检设备:a=" + (vaDevList.getA() - iaDevList.getA()) + "°,b=" + (vaDevList.getB() - iaDevList.getB()) + "°,c=" + (vaDevList.getC() - iaDevList.getC()) + ";标准设备:a=" + (vaStdList.getA() - iaStdList.getA()) + "°,b=" + (vaStdList.getB() - iaStdList.getB()) + "°,c=" + (vaStdList.getC() - iaStdList.getC()); + + if (!phaseCheck(vaDevList, iaDevList, vaStdList, iaStdList)) { + // 单个检测点相角校验失败,推送失败消息 + flag = false; + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":相角差校验失败!" + detail); + } else { + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData(pairStr + ":相角差校验成功!" + detail); + } } 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()); + flag = false; + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(pairStr + ":相角差校验失败!相角差" + detail); } WebServiceManager.sendMsg(userId, JSON.toJSONString(webSend)); } @@ -1266,6 +1357,7 @@ public class SocketContrastResponseService { */ private boolean voltageOrCurrentCheck(Double a, Double b, Double c, Double aStd, Double bStd, Double cStd, boolean isVoltage) { if (isVoltage) { + return NumberUtil.isIn(BigDecimal.valueOf(a), BigDecimal.valueOf(aStd * 0.99), BigDecimal.valueOf(aStd * 1.01)) && NumberUtil.isIn(BigDecimal.valueOf(b), BigDecimal.valueOf(bStd * 0.99), BigDecimal.valueOf(bStd * 1.01)) && NumberUtil.isIn(BigDecimal.valueOf(c), BigDecimal.valueOf(cStd * 0.99), BigDecimal.valueOf(cStd * 1.01)); @@ -1302,7 +1394,8 @@ public class SocketContrastResponseService { * @param iStandardDevPhaseData 标准设备电流相角数据 * @return */ - private boolean phaseCheck(DevData.SqlDataDTO.ListDTO uDevPhaseData, DevData.SqlDataDTO.ListDTO iDevPhaseData, DevData.SqlDataDTO.ListDTO uStandardDevPhaseData, DevData.SqlDataDTO.ListDTO iStandardDevPhaseData) { + 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()); @@ -1323,17 +1416,20 @@ public class SocketContrastResponseService { } /** - * 原始数据入库 + * 比对式原始数据入库 * - * @author cdf - * @date 2024/12/29 + * @param devDataList 原始数据 + * @param num 第几次检测 + * @param code 表后缀code + * @param checkItemMap 检测项Map key为检测项code,value为检测项的id */ - private void baseDataInsert(List devDataList, String errorSysId, Integer num, PreDetectionParam param, Map checkDataMap) { - // Runnable runnable = () -> { - + private void baseDataInsert(List devDataList, Integer num, String code, Map checkItemMap) { System.out.println("原始数据插入数据库开始执行========================================="); List contrastNonHarmonicResults = new ArrayList<>(); List contrastHarmonicResults = new ArrayList<>(); + Map harmonicRelationMap = new HashMap<>(); + harmonicRelationMap.put(DetectionCodeEnum.V2_50.getCode(), DetectionCodeEnum.U1.getCode()); + harmonicRelationMap.put(DetectionCodeEnum.I2_50.getCode(), DetectionCodeEnum.I1.getCode()); for (DevData data : devDataList) { LocalDateTime localDateTime = DetectionUtil.timeFormat(data.getTime(), DetectionUtil.FORMATTER); if (Objects.nonNull(localDateTime)) { @@ -1341,18 +1437,15 @@ public class SocketContrastResponseService { 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()) { + for (DevData.SqlDataDTO sqlDataDTO : data.getSqlData()) { + if (!DetectionCodeEnum.U1.getCode().equals(sqlDataDTO.getDesc()) && !DetectionCodeEnum.I1.getCode().equals(sqlDataDTO.getDesc())) { 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.setAdType(checkItemMap.get(DetectionCodeEnum.REAL_PREFIX.getCode() + sqlDataDTO.getDesc())); adNonHarmonicResult.setDataType(DataSourceEnum.REAL_DATA.getValue()); Double a = listDTO.getA(); @@ -1376,29 +1469,30 @@ public class SocketContrastResponseService { } for (int j = 0; j < data.getSqlDataHarm().size(); j++) { DevData.SqlDataHarmDTO sqlDataDTO = data.getSqlDataHarm().get(j); - String dui = FormalTestManager.harmonicRelationMap.get(sqlDataDTO.getDesc()); + String dui = 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.setAdType(checkItemMap.get(DetectionCodeEnum.REAL_PREFIX.getCode() + sqlDataDTO.getDesc())); adHarmonicResult.setDataType(DataSourceEnum.REAL_DATA.getValue()); - if (CollUtil.isNotEmpty(data.getSqlData())) { + if (ObjectUtil.isNotNull(dui)) { 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)); + if (ObjectUtil.isNotNull(vvv)) { + 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)); + } } } @@ -1450,7 +1544,7 @@ public class SocketContrastResponseService { } if (CollUtil.isNotEmpty(contrastNonHarmonicResults)) { - Map> map = contrastNonHarmonicResults.stream().collect(Collectors.groupingBy(x -> x.getMonitorId() + x.getTimeId() + x.getErrorId() + x.getNum() + x.getAdType() + x.getDataType())); + Map> map = contrastNonHarmonicResults.stream().collect(Collectors.groupingBy(x -> x.getMonitorId() + x.getTimeId() + x.getNum() + x.getAdType())); List info = new ArrayList<>(); map.forEach((key, value) -> { if (value.size() > 1) { @@ -1460,10 +1554,10 @@ public class SocketContrastResponseService { } }); - detectionDataDealService.acceptAdNon(info, param.getCode()); + detectionDataDealService.acceptAdNon(info, code); } if (CollUtil.isNotEmpty(contrastHarmonicResults)) { - Map> map = contrastHarmonicResults.stream().collect(Collectors.groupingBy(x -> x.getMonitorId() + x.getTimeId() + x.getErrorId() + x.getNum() + x.getAdType() + x.getDataType())); + Map> map = contrastHarmonicResults.stream().collect(Collectors.groupingBy(x -> x.getMonitorId() + x.getTimeId() + x.getNum() + x.getAdType())); List info = new ArrayList<>(); map.forEach((key, value) -> { if (value.size() > 1) { @@ -1472,10 +1566,9 @@ public class SocketContrastResponseService { info.addAll(value); } }); - detectionDataDealService.acceptAd(info, param.getCode()); + detectionDataDealService.acceptAd(info, code); } 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 3605f2c5..88915366 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 @@ -57,8 +57,6 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.njcn.gather.detection.util.socket.FormalTestManager.harmonicRelationMap; - @Service @RequiredArgsConstructor @@ -1715,9 +1713,6 @@ public class SocketDevResponseService { if (param.getTestItemList().get(1)) { initXiManager(param); } - - harmonicRelationMap.put(DetectionCodeEnum.V2_50.getCode(), DetectionCodeEnum.U1.getCode()); - harmonicRelationMap.put(DetectionCodeEnum.I2_50.getCode(), DetectionCodeEnum.I1.getCode()); } //初始化系数校验参数 @@ -1782,6 +1777,9 @@ public class SocketDevResponseService { System.out.println("原始数据插入数据库开始执行========================================="); List simAndDigNonHarmonicResultList = new ArrayList<>(); List adHarmonicResultList = new ArrayList<>(); + Map harmonicRelationMap = new HashMap<>(); + harmonicRelationMap.put(DetectionCodeEnum.V2_50.getCode(), DetectionCodeEnum.U1.getCode()); + harmonicRelationMap.put(DetectionCodeEnum.I2_50.getCode(), DetectionCodeEnum.I1.getCode()); for (DevData data : devDataList) { LocalDateTime localDateTime = DetectionUtil.timeFormat(data.getTime(), DetectionUtil.FORMATTER); if (Objects.nonNull(localDateTime)) { diff --git a/detection/src/main/java/com/njcn/gather/detection/mapper/AdPairMapper.java b/detection/src/main/java/com/njcn/gather/detection/mapper/AdPairMapper.java new file mode 100644 index 00000000..8e8e8bdd --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/mapper/AdPairMapper.java @@ -0,0 +1,11 @@ +package com.njcn.gather.detection.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.njcn.gather.detection.pojo.po.AdPair; + +/** + * @author caozehui + * @data 2025-08-18 + */ +public interface AdPairMapper extends MPJBaseMapper { +} diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/dto/ConditionDataDTO.java b/detection/src/main/java/com/njcn/gather/detection/pojo/dto/ConditionDataDTO.java new file mode 100644 index 00000000..c75e3bc4 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/dto/ConditionDataDTO.java @@ -0,0 +1,29 @@ +package com.njcn.gather.detection.pojo.dto; + +import com.njcn.gather.err.pojo.po.PqErrSysDtls; +import lombok.Data; + +/** + * @author caozehui + * @data 2025-08-12 + */ +@Data +public class ConditionDataDTO { + + /** + * 某一相别且某一个误差条件范围内的被检色设备数据 + */ + private Double devData; + + /** + * 某一相别且某一个误差条件范围内的标准设备数据 + */ + private Double stdDevData; + + + /** + * 与上面数据所对应的误差体系详情 + */ + private PqErrSysDtls pqErrSysDtls; + +} diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/dto/HarmonicConditionDataDTO.java b/detection/src/main/java/com/njcn/gather/detection/pojo/dto/HarmonicConditionDataDTO.java new file mode 100644 index 00000000..1eade958 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/dto/HarmonicConditionDataDTO.java @@ -0,0 +1,16 @@ +package com.njcn.gather.detection.pojo.dto; + +import lombok.Data; + +/** + * @author caozehui + * @data 2025-08-12 + */ +@Data +public class HarmonicConditionDataDTO extends ConditionDataDTO { + + /** + * (间谐波)谐波次数 + */ + private Double harmonicNum; +} diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/DetectionCodeEnum.java b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/DetectionCodeEnum.java index 2397266c..30a2867f 100644 --- a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/DetectionCodeEnum.java +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/DetectionCodeEnum.java @@ -13,6 +13,7 @@ public enum DetectionCodeEnum { FREQ("FREQ", "频率"), VRMS("VRMS", "相电压有效值"), + LINE_VRMS("LINE_VRMS", "线电压有效值"), DELTA_V("DELTA_V", "电压偏差"), VA("VA", "电压相角"), U1("U1", "基波电压"), @@ -34,7 +35,9 @@ public enum DetectionCodeEnum { STAR("Star","星型接线"), - DELTA("Delta","角型接线"); + DELTA("Delta","角型接线"), + + REAL_PREFIX("real$", "实时数据前缀"); private final String code; private final String message; diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/ResultEnum.java b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/ResultEnum.java new file mode 100644 index 00000000..838952f7 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/ResultEnum.java @@ -0,0 +1,24 @@ +package com.njcn.gather.detection.pojo.enums; + +import lombok.Getter; + +/** + * @author caozehui + * @data 2025-08-13 + */ +@Getter +public enum ResultEnum { + QUALIFIED(1, "符合"), + NOT_QUALIFIED(2, "不符合"), + NETWORK_TIMEOUT(3, "网络超时"), + NO_ERROR_SYS(4, "不在误差条件范围内"), + NO_COMPARE_ERROR_SYS(5, "不参与误差比较"); + + private int value; + private String msg; + + ResultEnum(int value, String msg) { + this.value = value; + this.msg = msg; + } +} 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 4f895af8..27448822 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 @@ -41,4 +41,9 @@ public class ContrastDetectionParam { * 检测项列表。第一个元素为预检测、第二个元素为系数校准、第三个元素为正式检测 */ private List testItemList; + + /** + * 当前检测次数 + */ + private Integer num; } 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 3eaa2041..8180276d 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 @@ -73,4 +73,9 @@ public class PreDetectionParam { * 检测项列表。第一个元素为预检测、第二个元素为系数校准、第三个元素为正式检测 */ private List testItemList; + + /** + * 第几次监测 + */ + private Integer num; } diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/po/AdPair.java b/detection/src/main/java/com/njcn/gather/detection/pojo/po/AdPair.java new file mode 100644 index 00000000..00c30261 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/po/AdPair.java @@ -0,0 +1,24 @@ +package com.njcn.gather.detection.pojo.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author caozehui + * @data 2025-08-18 + */ +@Data +@TableName("ad_pair") +public class AdPair implements Serializable { + private String id; + + private String planId; + + private Integer num; + + private String devMonitorId; + + private String stdDevMonitorId; +} 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 index b3877fc7..86e246d4 100644 --- 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 @@ -13,7 +13,7 @@ import java.util.List; @Data public class AlignDataVO { - private String devName; + private String stdDevName; private List channelDataList; @@ -24,11 +24,11 @@ public class AlignDataVO { @NoArgsConstructor public static class ChannelData { - // 被检设备通道号 - private String devNum; + // 标准设备通道号 + private String stdDevNum; - // 与之对应的标准设备名称_通道号 - private String standardDevInfo; + // 与之对应的被检设备名称_通道号 + private String devInfo; // 数据 private List dataList; diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/vo/DetectionData.java b/detection/src/main/java/com/njcn/gather/detection/pojo/vo/DetectionData.java index e65b73be..392d09e9 100644 --- a/detection/src/main/java/com/njcn/gather/detection/pojo/vo/DetectionData.java +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/vo/DetectionData.java @@ -48,4 +48,9 @@ public class DetectionData { * 单位 */ private String unit; + + /** + * 误差体系详情ID(比对式使用) + */ + private String errorDtlId; } diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/vo/DevLineTestResult.java b/detection/src/main/java/com/njcn/gather/detection/pojo/vo/DevLineTestResult.java index 519d6e36..21566735 100644 --- a/detection/src/main/java/com/njcn/gather/detection/pojo/vo/DevLineTestResult.java +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/vo/DevLineTestResult.java @@ -1,10 +1,7 @@ package com.njcn.gather.detection.pojo.vo; -import io.swagger.models.auth.In; import lombok.Data; -import java.util.List; - /** * @Author: cdf * @CreateTime: 2024-12-26 @@ -13,6 +10,11 @@ import java.util.List; @Data public class DevLineTestResult { + /** + * 检测项code + */ + private String scriptName; + private String deviceId; private String deviceName; diff --git a/detection/src/main/java/com/njcn/gather/detection/service/IAdPariService.java b/detection/src/main/java/com/njcn/gather/detection/service/IAdPariService.java new file mode 100644 index 00000000..5f42f6a8 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/service/IAdPariService.java @@ -0,0 +1,11 @@ +package com.njcn.gather.detection.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.gather.detection.pojo.po.AdPair; + +/** + * @author caozehui + * @data 2025-08-18 + */ +public interface IAdPariService extends IService { +} diff --git a/detection/src/main/java/com/njcn/gather/detection/service/PreDetectionService.java b/detection/src/main/java/com/njcn/gather/detection/service/PreDetectionService.java index cec2d88c..4f7278f6 100644 --- a/detection/src/main/java/com/njcn/gather/detection/service/PreDetectionService.java +++ b/detection/src/main/java/com/njcn/gather/detection/service/PreDetectionService.java @@ -4,6 +4,8 @@ import com.njcn.gather.detection.pojo.param.ContrastDetectionParam; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.param.SimulateDetectionParam; +import java.util.Map; + /** * @author wr @@ -56,4 +58,12 @@ public interface PreDetectionService { * @param param */ void startContrastTest(ContrastDetectionParam param); + + /** + * 获取比对式检测次数信息 + * + * @param planId + * @return + */ + Map getContrastTestNumInfo(String planId); } diff --git a/detection/src/main/java/com/njcn/gather/detection/service/impl/AdPairServiceImpl.java b/detection/src/main/java/com/njcn/gather/detection/service/impl/AdPairServiceImpl.java new file mode 100644 index 00000000..2864fb43 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/service/impl/AdPairServiceImpl.java @@ -0,0 +1,17 @@ +package com.njcn.gather.detection.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.njcn.gather.detection.mapper.AdPairMapper; +import com.njcn.gather.detection.pojo.po.AdPair; +import com.njcn.gather.detection.service.IAdPariService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * @author caozehui + * @data 2025-08-18 + */ +@Service +@RequiredArgsConstructor +public class AdPairServiceImpl extends ServiceImpl implements IAdPariService { +} 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 7cec2dfd..d131374e 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 @@ -9,16 +9,21 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.njcn.gather.detection.pojo.enums.DetectionCodeEnum; +import com.njcn.gather.detection.pojo.enums.ResultEnum; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.po.DevData; import com.njcn.gather.detection.pojo.vo.DetectionData; +import com.njcn.gather.detection.pojo.vo.DevLineTestResult; import com.njcn.gather.detection.util.DetectionUtil; import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.err.pojo.param.PqErrSysParam; import com.njcn.gather.err.pojo.po.PqErrSysDtls; import com.njcn.gather.err.pojo.vo.ErrDtlsCheckDataVO; import com.njcn.gather.err.service.IPqErrSysDtlsService; +import com.njcn.gather.monitor.pojo.po.PqMonitor; +import com.njcn.gather.monitor.service.IPqMonitorService; import com.njcn.gather.plan.pojo.enums.DataSourceEnum; +import com.njcn.gather.report.pojo.enums.PowerIndexEnum; import com.njcn.gather.result.pojo.enums.ResultUnitEnum; import com.njcn.gather.script.pojo.po.PqScriptCheckData; import com.njcn.gather.script.pojo.po.SourceIssue; @@ -56,6 +61,7 @@ public class DetectionServiceImpl { private final IPqScriptCheckDataService pqScriptCheckDataService; private final DetectionDataDealService detectionDataDealService; private final ISysTestConfigService sysTestConfigService; + private final IPqMonitorService pqMonitorService; public static final String TYPE_A = "A"; public static final String TYPE_B = "B"; @@ -327,9 +333,9 @@ public class DetectionServiceImpl { List integerBooleanB = harmRangeComparison(isQualified, new ArrayList<>(), type, TYPE_B, sourceIssue, dataRule, devHarmMap.get(TYPE_B), fData, num, scale); List integerBooleanC = harmRangeComparison(isQualified, new ArrayList<>(), type, TYPE_C, sourceIssue, dataRule, devHarmMap.get(TYPE_C), fData, num, scale); harmonicResult.setDataType(sourceIssue.getDataType()); - reflectHarmonic("a", integerBooleanA, harmonicResult, num); - reflectHarmonic("b", integerBooleanB, harmonicResult, num); - reflectHarmonic("c", integerBooleanC, harmonicResult, num); + reflectHarmonic(false, "a", integerBooleanA, harmonicResult, num); + reflectHarmonic(false, "b", integerBooleanB, harmonicResult, num); + reflectHarmonic(false, "c", integerBooleanC, harmonicResult, num); List list = new ArrayList<>(); list.addAll(integerBooleanA.stream().distinct().collect(Collectors.toList())); list.addAll(integerBooleanB.stream().distinct().collect(Collectors.toList())); @@ -521,9 +527,9 @@ public class DetectionServiceImpl { List integerBooleanB = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_B, sourceIssue, dataRule, devMap.get(TYPE_B), fData, num, scale); List integerBooleanC = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_C, sourceIssue, dataRule, devMap.get(TYPE_C), fData, num, scale); harmonicResult.setDataType(sourceIssue.getDataType()); - reflectHarmonic("a", integerBooleanA, harmonicResult, num); - reflectHarmonic("b", integerBooleanB, harmonicResult, num); - reflectHarmonic("c", integerBooleanC, harmonicResult, num); + reflectHarmonic(false, "a", integerBooleanA, harmonicResult, num); + reflectHarmonic(false, "b", integerBooleanB, harmonicResult, num); + reflectHarmonic(false, "c", integerBooleanC, harmonicResult, num); 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())); @@ -825,24 +831,24 @@ public class DetectionServiceImpl { private static Integer getInteger(List isData) { if (CollUtil.isNotEmpty(isData)) { - List isQualified = isData.stream().filter(x -> 1 == x || 2 == x).collect(Collectors.toList()); + List isQualified = isData.stream().filter(x -> ResultEnum.QUALIFIED.getValue() == x || ResultEnum.NOT_QUALIFIED.getValue() == x).collect(Collectors.toList()); if (CollUtil.isNotEmpty(isQualified)) { if (isQualified.size() > 1) { - if (isQualified.contains(2)) { - return 2; + if (isQualified.contains(ResultEnum.NOT_QUALIFIED.getValue())) { + return ResultEnum.NOT_QUALIFIED.getValue(); } } return isQualified.get(0); } else { - if (isData.contains(4)) { - return 4; + if (isData.contains(ResultEnum.NO_ERROR_SYS.getValue())) { + return ResultEnum.NO_ERROR_SYS.getValue(); } - if (isData.contains(5)) { - return 5; + if (isData.contains(ResultEnum.NO_COMPARE_ERROR_SYS.getValue())) { + return ResultEnum.NO_COMPARE_ERROR_SYS.getValue(); } } } - return 4; + return ResultEnum.NO_ERROR_SYS.getValue(); } /** @@ -907,28 +913,40 @@ public class DetectionServiceImpl { return map; } - 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())); + private void reflectHarmonic(boolean isContrast, String phase, List integerBooleanA, T harmonicResult, Integer num) { + if (!isContrast) { + 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())); + idField.setAccessible(true); + if (ObjectUtil.isNull(value.getIsData())) { + idField.set(harmonicResult, value.getData()); + } else { + idField.set(harmonicResult, JSON.toJSONString(value)); + } + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); } - idField.setAccessible(true); - if (ObjectUtil.isNull(value.getIsData())) { - idField.set(harmonicResult, value.getData()); - } else { - idField.set(harmonicResult, JSON.toJSONString(value)); + }); + } else { + Map> dataMap = integerBooleanA.stream().collect(Collectors.groupingBy(DetectionData::getNum)); + dataMap.forEach((key, valueList) -> { + try { + // 设置 id 字段; + Field idField = ContrastHarmonicResult.class.getDeclaredField(phase + "Value" + (num == 1 ? (int) (key + 0.5) : key.intValue())); + idField.setAccessible(true); + idField.set(harmonicResult, JSON.toJSONString(valueList)); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); } - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } - - }); + }); + } } /** @@ -1112,35 +1130,20 @@ public class DetectionServiceImpl { typeValue.forEach((key, value) -> { value.sort(Comparator.comparing(Double::doubleValue).reversed()); if (CollUtil.isNotEmpty(value)) { + List newValue = new ArrayList<>(); switch (dataRule) { case SECTION_VALUE: -// if (value.size() > 2) { -// Double max = Collections.max(value); -// Double min = Collections.min(value); -// value.remove(max); -// value.remove(min); -// } - value = DetectionUtil.getSectionValueDoubles(value); + newValue.addAll(DetectionUtil.getSectionValueDoubles(value)); break; case CP95_VALUE: -// if (value.size() < 21) { -// if (value.size() > 1) { -// value.subList(1, 2); -// } -// } else { -// int v = (int) (value.size() * 0.5); -// value.subList(v, v + 1); -// } -// value.subList(1, value.size()).clear(); // 保留第一个元素 - value = DetectionUtil.getCP95Doubles(value); + newValue.addAll(DetectionUtil.getCP95Doubles(value)); break; case AVG_VALUE: -// double average = value.stream().mapToDouble(Double::doubleValue).average().orElse(0.0); -// value.clear(); // 清空列表 -// value.add(average); // 添加平均值 - value = DetectionUtil.getAvgDoubles(value); + newValue.addAll(DetectionUtil.getAvgDoubles(value)); break; } + value.clear(); + value.addAll(newValue); } }); }); @@ -1280,7 +1283,8 @@ public class DetectionServiceImpl { */ public BigDecimal devSubtractChannelData(Double devData, Double channelData, Double ratedValue, PqErrSysDtls error, Integer scale) { //计算装置值返回值 - 源下发值的数据 = 差值 - BigDecimal subtract = BigDecimal.valueOf(devData).setScale(scale, RoundingMode.HALF_UP).subtract(BigDecimal.valueOf(channelData)); +// BigDecimal subtract = BigDecimal.valueOf(devData).setScale(scale, RoundingMode.HALF_UP).subtract(BigDecimal.valueOf(channelData)); + BigDecimal subtract = BigDecimal.valueOf(devData).subtract(BigDecimal.valueOf(channelData)); //只有相对值需要%比较,绝对值直接相减就行 if (2 == error.getValueType()) { switch (error.getErrorValueType()) { @@ -1437,6 +1441,54 @@ public class DetectionServiceImpl { } } + /** + * @param dataRule 数据处理原则 + * @param harmDataList 原始数据集合 + * @param errSysDtl 误差体系 + * @param data 初始化原始数据 + * @param channelData 源下发的数据 + * @param ratedValue 额定值 + * @Description: + * @Author: wr + * @Date: 2024/12/29 18:10 + */ + private void setDetection(DictDataEnum dataRule, List harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue, Integer scale) { + if (CollUtil.isNotEmpty(harmDataList)) { + // 存放合格的数据 + List qualifiedList = harmDataList.stream() + .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, scale), + BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()), + BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(qualifiedList)) { + switch (dataRule) { + case AT_WILL_VALUE: + case CP95_VALUE: + case AVG_VALUE: + 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, scale)); + } else { + List subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList()); + BigDecimal bd = BigDecimal.valueOf(subtract.get(0)); + bd = bd.setScale(scale, RoundingMode.HALF_UP); + data.setData(bd.doubleValue()); + data.setErrorData(devSubtractChannelData(subtract.get(0), channelData, ratedValue, errSysDtl, scale)); + } + break; + } + } else { + data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl, scale)); + } + isData(dataRule, harmDataList, data, qualifiedList, scale); + } + } /** * 比对式正式检测-处理数据 @@ -1453,63 +1505,120 @@ public class DetectionServiceImpl { * @param code 结果表code * @return key为被检设备ip_通道号、value为是否合格(1合格 2不合格 4无法处理) */ - public Map processing(List devDataList, List standardDevDataList, Map pars, Map devIdMapComm, Map monitorMap, List testItemCodeList, String errorSysId, DictDataEnum dataRule, Integer num, String code) { - Map> devDataMap = devDataList.stream().collect(Collectors.groupingBy(DevData::getId)); + public List processing(List devDataList, List standardDevDataList, Map pars, Map devIdMapComm, Map monitorMap, List testItemCodeList, String errorSysId, DictDataEnum dataRule, Integer num, String code) { + Map> devDataMap = devDataList.stream().collect(Collectors.groupingBy(obj -> obj.getId().split("_")[0])); Map> standardDevDataMap = standardDevDataList.stream().collect(Collectors.groupingBy(DevData::getId)); - Map resultMap = new LinkedHashMap<>(); - pars.forEach((devMoniterId, standardDevMoniterId) -> { - resultMap.put(devMoniterId, dataProcessing(devDataMap.get(devMoniterId), standardDevDataMap.get(standardDevMoniterId), devIdMapComm, testItemCodeList, monitorMap.get(devMoniterId), errorSysId, dataRule, num, code)); + // 所有监测点的结果 + List allResultList = new ArrayList<>(); + devDataMap.forEach((devIp, devValueList) -> { + //单一监测点的结果 + List resultList = new ArrayList<>(); + Map> devMonitorMap = devValueList.stream().collect(Collectors.groupingBy(DevData::getId, TreeMap::new, Collectors.toList())); + + Map> chnResultMap = new HashMap<>(); + devMonitorMap.forEach((devMoniterId, devData) -> { + Map map = singleMonitorProcessing(devData, standardDevDataMap.get(pars.get(devMoniterId)), devIdMapComm, testItemCodeList, errorSysId, dataRule, num, code); + map.forEach((key, value) -> { + DevLineTestResult devLineTestResult = new DevLineTestResult(); + devLineTestResult.setDeviceId(devIdMapComm.get(devIp)); + devLineTestResult.setScriptName(key); + List chnResult = chnResultMap.getOrDefault(key, new ArrayList<>()); + chnResult.add(value); + chnResultMap.put(key, chnResult); + resultList.add(devLineTestResult); + }); + }); + + resultList.forEach(devLineTestResult -> { + List chnResult = chnResultMap.get(devLineTestResult.getScriptName()); + devLineTestResult.setChnResult(chnResult.toArray(new Integer[chnResult.size()])); + }); + + allResultList.addAll(resultList); }); - return resultMap; + return allResultList; } - private Integer dataProcessing(List devDataList, List standardDevDataList, Map devIdMapComm, List testItemCodeList, PreDetection.MonitorListDTO monitorDto, String errorSysId, DictDataEnum dataRule, Integer num, String code) { - if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList)) { + /** + * 处理单个监测点的数据 + * + * @param devDataList 被检设备数据 + * @param standardDevDataList 与之对齐的标准设备数据 + * @param devIdMapComm 设备id映射关系 key为被检设备ip,value为被检设备id + * @param testItemCodeList 检测项code列表 + * @param errorSysId 误差体系id + * @param dataRule 数据处理原则 + * @param num 第几次检测 + * @param code 结果表code + * @return + */ + private Map singleMonitorProcessing(List devDataList, List standardDevDataList, Map devIdMapComm, List testItemCodeList, String errorSysId, DictDataEnum dataRule, Integer num, String code) { + Map resultMap = new HashMap<>(); + if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(testItemCodeList)) { + String[] split1 = devDataList.get(0).getId().split("_"); + String devMonitorId = devIdMapComm.get(split1[0]) + "_" + split1[1]; for (String testItemCode : testItemCodeList) { - if ("real$U1".equals(testItemCode) || "real$I1".equals(testItemCode)) { - continue; - } +// if ("real$U1".equals(testItemCode) || "real$I1".equals(testItemCode)) { +// continue; +// } + String[] split = testItemCode.split("\\$"); SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); List pqErrSysDtls = pqErrSysDtlsService.listPqErrSysDtlsByPqErrSysIdAndScriptType(errorSysId, split[1]); DetectionCodeEnum anEnum = DetectionCodeEnum.getDetectionCodeByCode(split[1]); - Double fUn = Double.valueOf(monitorDto.getPtStr().split(":")[1]); - Double fIn = Double.valueOf(monitorDto.getCtStr().split(":")[1]); + PqMonitor pqMonitor = pqMonitorService.getByDevMonitorId(devMonitorId); + boolean isStar = DetectionCodeEnum.STAR.getCode().equals(pqMonitor.getConnection()); + boolean isDelta = DetectionCodeEnum.DELTA.getCode().equals(pqMonitor.getConnection()); + Double fUn = pqMonitorService.getRatedVoltage(devMonitorId); + if (isStar) { + fUn = BigDecimal.valueOf(fUn).divide(BigDecimal.valueOf(Math.sqrt(3)), oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue(); + } + Double fIn = pqMonitorService.getRatedCurrent(devMonitorId); Double fHz = 50.0; switch (anEnum) { case FREQ: - return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fHz, DetectionCodeEnum.FREQ.getCode(), dataRule, num, code, oneConfig.getScale()); + resultMap.put(PowerIndexEnum.FREQ.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fHz, DetectionCodeEnum.FREQ.getCode(), dataRule, num, code, oneConfig.getScale())); + break; case VRMS: - return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, DetectionCodeEnum.VRMS.getCode(), dataRule, num, code, oneConfig.getScale()); + case LINE_VRMS: + resultMap.put(PowerIndexEnum.V.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn, (isStar ? DetectionCodeEnum.VRMS.getCode() : DetectionCodeEnum.LINE_VRMS.getCode()), dataRule, num, code, oneConfig.getScale())); + break; case IRMS: - return isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fIn, DetectionCodeEnum.IRMS.getCode(), dataRule, num, code, oneConfig.getScale()); + resultMap.put(PowerIndexEnum.I.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fIn, DetectionCodeEnum.IRMS.getCode(), dataRule, num, code, oneConfig.getScale())); + break; + case P_FUND: + resultMap.put(PowerIndexEnum.P.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn * fIn, DetectionCodeEnum.P_FUND.getCode(), dataRule, num, code, oneConfig.getScale())); + break; case V_UNBAN: + resultMap.put(PowerIndexEnum.IMBV.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn, DetectionCodeEnum.V_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale())); break; case I_UNBAN: + resultMap.put(PowerIndexEnum.IMBA.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fIn, DetectionCodeEnum.I_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale())); break; case V2_50: - ContrastHarmonicResult harmV = isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, fIn, U, dataRule, num, HARMONIC_FLAG, oneConfig.getScale()); - return resultFlag(harmV, null, code); + resultMap.put(PowerIndexEnum.HV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, HARMONIC_FLAG, dataRule, num, code, oneConfig.getScale())); + break; case I2_50: - ContrastHarmonicResult harmI = isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, fIn, I, dataRule, num, HARMONIC_FLAG, oneConfig.getScale()); - return resultFlag(null, harmI, code); + resultMap.put(PowerIndexEnum.HI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, HARMONIC_FLAG, dataRule, num, code, oneConfig.getScale())); + break; + case P2_50: + resultMap.put(PowerIndexEnum.HP.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn * fIn, HARMONIC_FLAG, dataRule, num, code, oneConfig.getScale())); + break; case SV_1_49: - ContrastHarmonicResult harmSV = isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, fIn, U, dataRule, num, INHARMONIC_FLAG, oneConfig.getScale()); - return resultFlag(harmSV, null, code); + resultMap.put(PowerIndexEnum.HSV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, INHARMONIC_FLAG, dataRule, num, code, oneConfig.getScale())); + break; case SI_1_49: - ContrastHarmonicResult harmSI = isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, fUn, fIn, I, dataRule, num, INHARMONIC_FLAG, oneConfig.getScale()); - return resultFlag(null, harmSI, code); + resultMap.put(PowerIndexEnum.HSI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, INHARMONIC_FLAG, dataRule, num, code, oneConfig.getScale())); + break; case UNKNOWN_ERROR: break; } } - return 1; - } else { - return 4; } + return resultMap; } /** @@ -1519,148 +1628,151 @@ public class DetectionServiceImpl { * @param standardDevDataList 与之对齐的标准设备数据 * @param devIdMapComm 设备id映射表 key为被检设备ip,value为被检设备id * @param errSysDtls 误差体系 + * @param isNotUnblance 不是三项不平衡 + * @param fData 额定值 * @param desc 检测项类型 * @param dataRule 数据处理原则 * @param num 第几次检测 * @param code 结果表code + * @param scale 小数点位数 * @return */ private Integer isQualified(List devDataList, List standardDevDataList, Map devIdMapComm, List errSysDtls, + boolean isNotUnblance, Double fData, String desc, DictDataEnum dataRule, Integer num, - String code, Integer scale) { + String code, + Integer scale) { List info = new ArrayList<>(); if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(errSysDtls)) { Map>> map = devListMap(devDataList, standardDevDataList, desc, dataRule); - ContrastNonHarmonicResult result = new ContrastNonHarmonicResult(); + String[] split1 = devDataList.get(0).getId().split("_"); - result.setMonitorId(devIdMapComm.get(split1[0]) + "_" + split1[1]); - result.setErrorId(errSysDtls.get(0).getErrorSysId()); - result.setAdType(errSysDtls.get(0).getScriptType()); result.setNum(num); + result.setMonitorId(devIdMapComm.get(split1[0]) + "_" + split1[1]); + result.setAdType(errSysDtls.get(0).getScriptType()); result.setDataType(DataSourceEnum.REAL_DATA.getValue()); - Integer isQualified = 4; if (map.containsKey(TYPE_T)) { - DetectionData t = rangeComparisonList(map.get(TYPE_T).get(0), isQualified, errSysDtls, fData, map.get(TYPE_T).get(1).get(0), dataRule, scale); - result.setTValue(JSON.toJSONString(t)); - result.setResultFlag(t.getIsData()); + List tList = rangeComparisonList(map.get(TYPE_T).get(0), map.get(TYPE_T).get(1), errSysDtls, fData, scale); + result.setTValue(JSON.toJSONString(tList)); + result.setResultFlag(setResultFlag(tList)); } else { List resultFlag = new ArrayList<>(); - Map> setters = new HashMap<>(); - setters.put(TYPE_A, (r, d) -> r.setAValue(JSON.toJSONString(d))); + Map>> setters = new HashMap<>(); + List phases = new ArrayList<>(); + if (isNotUnblance) { + setters.put(TYPE_A, (r, d) -> r.setAValue(JSON.toJSONString(d))); + setters.put(TYPE_C, (r, d) -> r.setCValue(JSON.toJSONString(d))); + phases.add(TYPE_A); + phases.add(TYPE_C); + } setters.put(TYPE_B, (r, d) -> r.setBValue(JSON.toJSONString(d))); - setters.put(TYPE_C, (r, d) -> r.setCValue(JSON.toJSONString(d))); + phases.add(TYPE_B); - List phases = Arrays.asList(TYPE_A, TYPE_B, TYPE_C); for (String phase : phases) { - List phaseValue = map.get(phase).get(0); - DetectionData detectionData = rangeComparisonList(phaseValue, isQualified, errSysDtls, fData, map.get(phase).get(1).get(0), dataRule, scale); - resultFlag.add(detectionData); - BiConsumer setter = setters.get(phase); - setter.accept(result, detectionData); + List phaseList = rangeComparisonList(map.get(phase).get(0), map.get(phase).get(1), errSysDtls, fData, scale); + resultFlag.addAll(phaseList); + BiConsumer> setter = setters.get(phase); + setter.accept(result, phaseList); } result.setResultFlag(setResultFlag(resultFlag)); } info.add(result); } - if (CollUtil.isNotEmpty(info)) { - detectionDataDealService.acceptNonHarmonicResult(info, code); - List resultFlag = info.stream().map(ContrastNonHarmonicResult::getResultFlag).distinct().collect(Collectors.toList()); - return getInteger(resultFlag); - } else { - return 4; - } + detectionDataDealService.acceptNonHarmonicResult(info, code); + List resultFlag = info.stream().map(ContrastNonHarmonicResult::getResultFlag).distinct().collect(Collectors.toList()); + return getInteger(resultFlag); } + /** * 处理谐波数据 * * @param devDataList 被检设备数据 * @param standardDevDataList 与之对齐的标准设备数据 * @param devIdMapComm 设备id映射表 key为被检设备ip,value为被检设备id - * @param devDataList 被检设备数据 - * @param standardDevDataList 与之对齐的标准设备数据 - * @param devIdMapComm 设备id映射表 key为被检设备ip,value为被检设备id * @param errSysDtls 误差体系 + * @param fData 额定值 * @param type U或I、用来区分电压或电流 + * @param harmonicFlag 1:间谐波,2:谐波 * @param dataRule 数据处理原则 * @param num 第几次检测 - * @param harmonicFlag 1:间谐波,2:谐波 + * @param code 结果表code + * @param scale 小数点位数 * @return */ - public ContrastHarmonicResult isHarmQualified(List devDataList, - List standardDevDataList, - Map devIdMapComm, - List errSysDtls, - Double fUn, - Double fIn, - String type, - DictDataEnum dataRule, - Integer num, - Integer harmonicFlag, Integer scale) { - Double fData = 1.0; - String fundCode = ""; - String harmCode = ""; - if (U.equals(type)) { - fData = fUn; - fundCode = DetectionCodeEnum.U1.getCode(); - if (harmonicFlag == 1) { - harmCode = DetectionCodeEnum.SV_1_49.getCode(); - } else { - harmCode = DetectionCodeEnum.V2_50.getCode(); - } - } - if (I.equals(type)) { - fData = fIn; - fundCode = DetectionCodeEnum.I1.getCode(); - if (harmonicFlag == 1) { - harmCode = DetectionCodeEnum.SI_1_49.getCode(); - } else { - harmCode = DetectionCodeEnum.I2_50.getCode(); - } - } - if (HP.equals(type)) { - fData = (fIn * fUn) * 0.01; - harmCode = DetectionCodeEnum.P2_50.getCode(); - } + public Integer isHarmQualified(List devDataList, + List standardDevDataList, + Map devIdMapComm, + List errSysDtls, + String type, + Double fData, + Integer harmonicFlag, + DictDataEnum dataRule, + Integer num, + String code, + Integer scale) { + + List info = new ArrayList<>(); + if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(errSysDtls)) { + String fundCode = ""; + String harmCode = ""; + if (U.equals(type)) { + fundCode = DetectionCodeEnum.U1.getCode(); + if (harmonicFlag == 1) { + harmCode = DetectionCodeEnum.SV_1_49.getCode(); + } else { + harmCode = DetectionCodeEnum.V2_50.getCode(); + } + } + if (I.equals(type)) { + fundCode = DetectionCodeEnum.I1.getCode(); + if (harmonicFlag == 1) { + harmCode = DetectionCodeEnum.SI_1_49.getCode(); + } else { + harmCode = DetectionCodeEnum.I2_50.getCode(); + } + } + if (HP.equals(type)) { +// fData = fData * 0.01; + harmCode = DetectionCodeEnum.P2_50.getCode(); + } + + Map>>> devMap = devHarmListMap(devDataList, standardDevDataList, fundCode, harmCode, harmonicFlag, dataRule); + ContrastHarmonicResult result = new ContrastHarmonicResult(); - Map>>> devMap = devHarmListMap(devDataList, standardDevDataList, fundCode, harmCode, harmonicFlag, dataRule); - if (CollUtil.isNotEmpty(devMap)) { - ContrastHarmonicResult harmonicResult = new ContrastHarmonicResult(); String[] split = devDataList.get(0).getId().split("_"); - String devID = devIdMapComm.get(split[0]); - harmonicResult.setMonitorId(devID + "_" + split[1]); - harmonicResult.setErrorId(errSysDtls.get(0).getErrorSysId()); - harmonicResult.setAdType(errSysDtls.get(0).getScriptType()); - harmonicResult.setNum(num); - harmonicResult.setDataType(DataSourceEnum.REAL_DATA.getValue()); -// List pqErrSysDtls = new ArrayList<>(); - Integer isQualified = 4; + result.setNum(num); + result.setMonitorId(devIdMapComm.get(split[0]) + "_" + split[1]); + result.setAdType(errSysDtls.get(0).getScriptType()); + result.setDataType(DataSourceEnum.REAL_DATA.getValue()); - List integerBooleanA = harmRangeComparison(isQualified, errSysDtls, dataRule, devMap.get(TYPE_A).get(0), devMap.get(TYPE_A).get(1), fData, scale); - List integerBooleanB = harmRangeComparison(isQualified, errSysDtls, dataRule, devMap.get(TYPE_B).get(0), devMap.get(TYPE_A).get(1), fData, scale); - List integerBooleanC = harmRangeComparison(isQualified, errSysDtls, dataRule, devMap.get(TYPE_C).get(0), devMap.get(TYPE_A).get(1), fData, scale); - harmonicResult.setDataType(DataSourceEnum.REAL_DATA.getValue()); - reflectHarmonic("a", integerBooleanA, harmonicResult, harmonicFlag); - reflectHarmonic("b", integerBooleanB, harmonicResult, harmonicFlag); - reflectHarmonic("c", integerBooleanC, harmonicResult, harmonicFlag); + List integerBooleanA = harmRangeComparison(devMap.get(TYPE_A).get(0), devMap.get(TYPE_A).get(1), errSysDtls, type, fData, scale); + List integerBooleanB = harmRangeComparison(devMap.get(TYPE_B).get(0), devMap.get(TYPE_A).get(1), errSysDtls, type, fData, scale); + List integerBooleanC = harmRangeComparison(devMap.get(TYPE_C).get(0), devMap.get(TYPE_A).get(1), errSysDtls, type, fData, scale); + reflectHarmonic(true, "a", integerBooleanA, result, harmonicFlag); + reflectHarmonic(true, "b", integerBooleanB, result, harmonicFlag); + reflectHarmonic(true, "c", integerBooleanC, result, 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())); list.addAll(integerBooleanC.stream().filter(x -> 1 != x.getNum()).distinct().collect(Collectors.toList())); - harmonicResult.setResultFlag(setResultFlag(list)); - return harmonicResult; + result.setResultFlag(setResultFlag(list)); + info.add(result); } - return null; + + detectionDataDealService.acceptHarmonicResult(info, code); + List resultFlag = info.stream().map(ContrastHarmonicResult::getResultFlag).distinct().collect(Collectors.toList()); + return getInteger(resultFlag); } @@ -1675,6 +1787,14 @@ public class DetectionServiceImpl { public Map>> devListMap(List dev, List standardDev, String desc, DictDataEnum dataRule) { Map>> resultMap = new HashMap<>(3); + List aDev = new ArrayList<>(); + List aStandardDev = new ArrayList<>(); + List bDev = new ArrayList<>(); + List bStandardDev = new ArrayList<>(); + List cDev = new ArrayList<>(); + List cStandardDev = new ArrayList<>(); + List tDev = new ArrayList<>(); + List tStandardDev = new ArrayList<>(); for (int i = 0; i < dev.size(); i++) { List devSqlData = dev.get(i).getSqlData(); List standardDevSqlData = standardDev.get(i).getSqlData(); @@ -1684,104 +1804,108 @@ public class DetectionServiceImpl { List standardDevList = standardDevSqlData.stream().filter(j -> desc.equals(j.getDesc())) .map(DevData.SqlDataDTO::getList).collect(Collectors.toList()); - List aDev = devList.stream().filter(x -> ObjectUtil.isNotNull(x.getA())) + aDev.addAll(devList.stream().filter(x -> ObjectUtil.isNotNull(x.getA())) .map(x -> x.getA().doubleValue()) - .collect(Collectors.toList()); - List aIdxs = DetectionUtil.sort(aDev, false); - List aStandardDev = standardDevList.stream().filter(x -> ObjectUtil.isNotNull(x.getA())) + .collect(Collectors.toList())); + aStandardDev.addAll(standardDevList.stream().filter(x -> ObjectUtil.isNotNull(x.getA())) .map(x -> x.getA().doubleValue()) - .collect(Collectors.toList()); + .collect(Collectors.toList())); - List bDev = devList.stream().filter(x -> ObjectUtil.isNotNull(x.getB())) + bDev.addAll(devList.stream().filter(x -> ObjectUtil.isNotNull(x.getB())) .map(x -> x.getB().doubleValue()) - .collect(Collectors.toList()); - List bIdxs = DetectionUtil.sort(bDev, false); - List bStandardDev = standardDevList.stream().filter(x -> ObjectUtil.isNotNull(x.getB())) + .collect(Collectors.toList())); + + bStandardDev.addAll(standardDevList.stream().filter(x -> ObjectUtil.isNotNull(x.getB())) .map(x -> x.getB().doubleValue()) - .collect(Collectors.toList()); + .collect(Collectors.toList())); - List cDev = devList.stream().filter(x -> ObjectUtil.isNotNull(x.getC())) + cDev.addAll(devList.stream().filter(x -> ObjectUtil.isNotNull(x.getC())) .map(x -> x.getC().doubleValue()) - .collect(Collectors.toList()); - List cIdxs = DetectionUtil.sort(cDev, false); - List cStandardDev = standardDevList.stream().filter(x -> ObjectUtil.isNotNull(x.getC())) + .collect(Collectors.toList())); + + cStandardDev.addAll(standardDevList.stream().filter(x -> ObjectUtil.isNotNull(x.getC())) .map(x -> x.getC().doubleValue()) - .collect(Collectors.toList()); + .collect(Collectors.toList())); - List tDev = devList.stream().filter(x -> ObjectUtil.isNotNull(x.getT())) + tDev.addAll(devList.stream().filter(x -> ObjectUtil.isNotNull(x.getT())) .map(x -> x.getT().doubleValue()) - .collect(Collectors.toList()); - List tIdxs = DetectionUtil.sort(tDev, false); - List tStandardDev = standardDevList.stream().filter(x -> ObjectUtil.isNotNull(x.getT())) + .collect(Collectors.toList())); + tStandardDev.addAll(standardDevList.stream().filter(x -> ObjectUtil.isNotNull(x.getT())) .map(x -> x.getT().doubleValue()) - .collect(Collectors.toList()); + .collect(Collectors.toList())); + } + List aIdxs = DetectionUtil.sort(aDev, false); + List bIdxs = DetectionUtil.sort(bDev, false); + List cIdxs = DetectionUtil.sort(cDev, false); + List tIdxs = DetectionUtil.sort(tDev, false); + switch (dataRule) { + case SECTION_VALUE: + if (aDev.size() > 2) { + aDev.remove(aIdxs.get(0)); + aDev.remove(aIdxs.get(aIdxs.size() - 1)); + List newArray = DetectionUtil.getNewArray(aStandardDev, aIdxs.subList(1, aIdxs.size() - 1)); + aStandardDev.clear(); + aStandardDev.addAll(newArray); + } - switch (dataRule) { - case SECTION_VALUE: - if (aDev.size() > 2) { - aDev.remove(aIdxs.get(0)); - aDev.remove(aIdxs.get(aIdxs.size() - 1)); - aStandardDev.remove(aIdxs.get(0)); - aStandardDev.remove(aIdxs.get(aIdxs.size() - 1)); - } + if (bDev.size() > 2) { + bDev.remove(bIdxs.get(0)); + bDev.remove(bIdxs.get(bIdxs.size() - 1)); + List newArray = DetectionUtil.getNewArray(bStandardDev, bIdxs.subList(1, bIdxs.size() - 1)); + bStandardDev.clear(); + bStandardDev.addAll(newArray); + } - if (bDev.size() > 2) { - bDev.remove(bIdxs.get(0)); - bDev.remove(bIdxs.get(bIdxs.size() - 1)); - bStandardDev.remove(bIdxs.get(0)); - bStandardDev.remove(bIdxs.get(bIdxs.size() - 1)); - } + if (cDev.size() > 2) { + cDev.remove(cIdxs.get(0)); + cDev.remove(cIdxs.get(cIdxs.size() - 1)); + List newArray = DetectionUtil.getNewArray(cStandardDev, cIdxs.subList(1, cIdxs.size() - 1)); + cStandardDev.clear(); + cStandardDev.addAll(newArray); + } - if (cDev.size() > 2) { - cDev.remove(cIdxs.get(0)); - cDev.remove(cIdxs.get(cIdxs.size() - 1)); - cStandardDev.remove(cIdxs.get(0)); - cStandardDev.remove(cIdxs.get(cIdxs.size() - 1)); - } + if (tDev.size() > 2) { + tDev.remove(tIdxs.get(0)); + tDev.remove(tIdxs.get(tIdxs.size() - 1)); + List newArray = DetectionUtil.getNewArray(tStandardDev, tIdxs.subList(1, tIdxs.size() - 1)); + tStandardDev.clear(); + tStandardDev.addAll(newArray); + } + break; + case CP95_VALUE: + int cp95Idx = DetectionUtil.getCP95Idx(aDev); + aDev = Collections.singletonList(aDev.get(cp95Idx)); + aStandardDev = Collections.singletonList(aStandardDev.get(cp95Idx)); - if (tDev.size() > 2) { - tDev.remove(tIdxs.get(0)); - tDev.remove(tIdxs.get(tIdxs.size() - 1)); - tStandardDev.remove(tIdxs.get(0)); - tStandardDev.remove(tIdxs.get(tIdxs.size() - 1)); - } - break; - case CP95_VALUE: - int cp95Idx = DetectionUtil.getCP95Idx(aDev); - aDev = Collections.singletonList(aDev.get(cp95Idx)); - aStandardDev = Collections.singletonList(aStandardDev.get(cp95Idx)); + cp95Idx = DetectionUtil.getCP95Idx(bDev); + bDev = Collections.singletonList(bDev.get(cp95Idx)); + bStandardDev = Collections.singletonList(bStandardDev.get(cp95Idx)); - cp95Idx = DetectionUtil.getCP95Idx(bDev); - bDev = Collections.singletonList(bDev.get(cp95Idx)); - bStandardDev = Collections.singletonList(bStandardDev.get(cp95Idx)); + cp95Idx = DetectionUtil.getCP95Idx(cDev); + cDev = Collections.singletonList(cDev.get(cp95Idx)); + cStandardDev = Collections.singletonList(cStandardDev.get(cp95Idx)); - cp95Idx = DetectionUtil.getCP95Idx(cDev); - cDev = Collections.singletonList(cDev.get(cp95Idx)); - cStandardDev = Collections.singletonList(cStandardDev.get(cp95Idx)); - - cp95Idx = DetectionUtil.getCP95Idx(tDev); - tDev = Collections.singletonList(tDev.get(cp95Idx)); - tStandardDev = Collections.singletonList(tStandardDev.get(cp95Idx)); - break; - case AVG_VALUE: - aDev = DetectionUtil.getAvgDoubles(aDev); - bDev = DetectionUtil.getAvgDoubles(bDev); - cDev = DetectionUtil.getAvgDoubles(cDev); - tDev = DetectionUtil.getAvgDoubles(tDev); - - aStandardDev = DetectionUtil.getAvgDoubles(aStandardDev); - bStandardDev = DetectionUtil.getAvgDoubles(bStandardDev); - cStandardDev = DetectionUtil.getAvgDoubles(cStandardDev); - tStandardDev = DetectionUtil.getAvgDoubles(tStandardDev); - break; - } - resultMap.put(TYPE_A, Arrays.asList(aDev, aStandardDev)); - resultMap.put(TYPE_B, Arrays.asList(bDev, bStandardDev)); - resultMap.put(TYPE_C, Arrays.asList(cDev, cStandardDev)); - if (CollUtil.isNotEmpty(tDev)) { - resultMap.put(TYPE_T, Arrays.asList(tDev, tStandardDev)); - } + cp95Idx = DetectionUtil.getCP95Idx(tDev); + tDev = Collections.singletonList(tDev.get(cp95Idx)); + tStandardDev = Collections.singletonList(tStandardDev.get(cp95Idx)); + break; + case AVG_VALUE: + aDev = DetectionUtil.getAvgDoubles(aDev); + bDev = DetectionUtil.getAvgDoubles(bDev); + cDev = DetectionUtil.getAvgDoubles(cDev); + tDev = DetectionUtil.getAvgDoubles(tDev); + aStandardDev = DetectionUtil.getAvgDoubles(aStandardDev); + bStandardDev = DetectionUtil.getAvgDoubles(bStandardDev); + cStandardDev = DetectionUtil.getAvgDoubles(cStandardDev); + tStandardDev = DetectionUtil.getAvgDoubles(tStandardDev); + break; + } + resultMap.put(TYPE_A, Arrays.asList(aDev, aStandardDev)); + resultMap.put(TYPE_B, Arrays.asList(bDev, bStandardDev)); + resultMap.put(TYPE_C, Arrays.asList(cDev, cStandardDev)); + if (CollUtil.isNotEmpty(tDev)) { + resultMap.put(TYPE_T, Arrays.asList(tDev, tStandardDev)); } return resultMap; } @@ -1834,23 +1958,25 @@ public class DetectionServiceImpl { if (first2.isPresent()) { fund2 = first2.get(); } - List harmList = dev.get(i).getSqlDataHarm().stream().filter(x -> x.getDesc().equals(harmCode)).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(harmList)) { - DevData.SqlDataHarmDTO harm = harmList.get(0); - if (ObjectUtil.isNotNull(fund1)) { - harmPut(TYPE_A, devMap, harmNum, harm, String.valueOf(fund1.getList().getA()), harmonicFlag); - harmPut(TYPE_A, standardDevMap, harmNum, harm, String.valueOf(fund2.getList().getB()), harmonicFlag); - harmPut(TYPE_B, devMap, harmNum, harm, String.valueOf(fund1.getList().getB()), harmonicFlag); - harmPut(TYPE_B, standardDevMap, harmNum, harm, String.valueOf(fund2.getList().getC()), harmonicFlag); - harmPut(TYPE_C, devMap, harmNum, harm, String.valueOf(fund1.getList().getC()), harmonicFlag); - harmPut(TYPE_C, standardDevMap, harmNum, harm, String.valueOf(fund2.getList().getT()), harmonicFlag); + List devHarmList = dev.get(i).getSqlDataHarm().stream().filter(x -> x.getDesc().equals(harmCode)).collect(Collectors.toList()); + List stdDevHarmList = dev.get(i).getSqlDataHarm().stream().filter(x -> x.getDesc().equals(harmCode)).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(devHarmList) && CollUtil.isNotEmpty(stdDevHarmList)) { + DevData.SqlDataHarmDTO devHarm = devHarmList.get(0); + DevData.SqlDataHarmDTO stdDevHarm = stdDevHarmList.get(0); + if (ObjectUtil.isNotNull(fund1) && ObjectUtil.isNotNull(fund2)) { + harmPut(TYPE_A, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getA()), harmonicFlag); + harmPut(TYPE_A, standardDevMap, harmNum, stdDevHarm, String.valueOf(fund2.getList().getB()), harmonicFlag); + harmPut(TYPE_B, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getB()), harmonicFlag); + harmPut(TYPE_B, standardDevMap, harmNum, stdDevHarm, String.valueOf(fund2.getList().getC()), harmonicFlag); + harmPut(TYPE_C, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getC()), harmonicFlag); + harmPut(TYPE_C, standardDevMap, harmNum, stdDevHarm, String.valueOf(fund2.getList().getC()), harmonicFlag); } else { - harmPut(TYPE_A, devMap, harmNum, harm, "1.0", harmonicFlag); - harmPut(TYPE_A, standardDevMap, harmNum, harm, "1.0", harmonicFlag); - harmPut(TYPE_B, devMap, harmNum, harm, "1.0", harmonicFlag); - harmPut(TYPE_B, standardDevMap, harmNum, harm, "1.0", harmonicFlag); - harmPut(TYPE_C, devMap, harmNum, harm, "1.0", harmonicFlag); - harmPut(TYPE_C, standardDevMap, harmNum, harm, "1.0", harmonicFlag); + harmPut(TYPE_A, devMap, harmNum, devHarm, "1.0", harmonicFlag); + harmPut(TYPE_A, standardDevMap, harmNum, stdDevHarm, "1.0", harmonicFlag); + harmPut(TYPE_B, devMap, harmNum, devHarm, "1.0", harmonicFlag); + harmPut(TYPE_B, standardDevMap, harmNum, stdDevHarm, "1.0", harmonicFlag); + harmPut(TYPE_C, devMap, harmNum, devHarm, "1.0", harmonicFlag); + harmPut(TYPE_C, standardDevMap, harmNum, stdDevHarm, "1.0", harmonicFlag); } } } @@ -1863,8 +1989,9 @@ public class DetectionServiceImpl { if (value.size() > 2) { value.remove(idx.get(0)); value.remove(idx.get(idx.size() - 1)); - standardDevMap.get(typeKey).get(key).remove(idx.get(0)); - standardDevMap.get(typeKey).get(key).remove(idx.get(idx.size() - 1)); + List newArray = DetectionUtil.getNewArray(standardDevMap.get(typeKey).get(key), idx.subList(1, idx.size() - 1)); + standardDevMap.get(typeKey).get(key).clear(); + standardDevMap.get(typeKey).get(key).addAll(newArray); } break; case CP95_VALUE: @@ -1876,8 +2003,9 @@ public class DetectionServiceImpl { standardDevMap.get(typeKey).get(key).add(standardCP95Data); break; case AVG_VALUE: + List avgDoubles = DetectionUtil.getAvgDoubles(value); value.clear(); - value.addAll(DetectionUtil.getAvgDoubles(value)); + value.addAll(avgDoubles); List standardAvgData = DetectionUtil.getAvgDoubles(standardDevMap.get(typeKey).get(key)); standardDevMap.get(typeKey).get(key).clear(); standardDevMap.get(typeKey).get(key).addAll(standardAvgData); @@ -1894,177 +2022,104 @@ public class DetectionServiceImpl { } /** - * @param isQualified 检测结果 - * @param pqErrSysDtls 误差体系 - * @param dataRule 数据处理原则 + * 处理非谐波类取值 + * + * @param devDataList 被检设备数据 + * @param standardDevDataList 与之对齐的标准设备数据 + * @param pqErrSysDtls 误差体系 + * @param fData 额定值 + * @param scale 小数点精度 + * @return + */ + public List rangeComparisonList(List devDataList, + List standardDevDataList, + List pqErrSysDtls, + Double fData, + Integer scale) { + return this.getDetectionDataList(devDataList, standardDevDataList, null, pqErrSysDtls, fData, null, scale); + } + + /** + * 处理谐波类取值 + * * @param devMap 被检设备(间)谐波数据 * @param standardDevMap 与之对齐的标准设备(间)谐波数据 + * @param pqErrSysDtls 误差体系 + * @param type U或者I或者HP * @param fData 额定值 + * @param scale 小数点精度 * @return */ - public List harmRangeComparison(Integer isQualified, - List pqErrSysDtls, - DictDataEnum dataRule, - Map> devMap, + public List harmRangeComparison(Map> devMap, Map> standardDevMap, - Double fData, Integer scale) { - List info = new ArrayList<>(); - //key为(间)谐波次数,value为标准设备数据 - Map issueHarmMap = standardDevMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, x -> x.getValue().get(0))); - - Map errSysDtlMap = new LinkedHashMap<>(); - issueHarmMap.forEach((key, value) -> { - //获得误差体系 - List errSysDtls = pqErrSysDtls.stream().filter(x -> rangeComparison(startRadiusEnd(x.getStartValue(), fData, value, x.getConditionType(), scale), - x.getStartFlag(), - startRadiusEnd(x.getEndValue(), fData, value, x.getConditionType(), scale), - x.getEndFlag(), - value)).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(errSysDtls)) { - errSysDtlMap.put(key, errSysDtls.get(0)); - } else { - errSysDtlMap.put(key, null); + List pqErrSysDtls, + String type, + Double fData, + Integer scale) { + List detectionDataList = new ArrayList<>(); + List U1List = new ArrayList<>(); + standardDevMap.forEach((harmonicNum, stdDataList) -> { + if (U.equals(type)) { + // todo 间谐波电压使用U1??? + U1List.addAll(standardDevMap.get(1.0)); } + detectionDataList.addAll(this.getDetectionDataList(devMap.get(harmonicNum), stdDataList, U1List, pqErrSysDtls, fData, harmonicNum, scale)); }); - if (CollUtil.isNotEmpty(devMap)) { - devMap.forEach((harm, harmDataList) -> { - PqErrSysDtls errSysDtl = errSysDtlMap.get(harm); - DetectionData data = new DetectionData(); - data.setIsData(isQualified); - data.setNum(harm); - if (CollUtil.isNotEmpty(harmDataList)) { - BigDecimal bd = BigDecimal.valueOf(harmDataList.get(0)); - bd = bd.setScale(scale, RoundingMode.HALF_UP); - data.setData(bd.doubleValue()); - } - Double channelData = issueHarmMap.get(harm); - data.setResultData(channelData); - if (ObjectUtil.isNotNull(errSysDtl)) { - PqErrSysDtls errSys = BeanUtil.copyProperties(errSysDtl, PqErrSysDtls.class); - errSys.setMaxErrorValue(maxErrorMultiply(errSys, fData, issueHarmMap.get(harm), scale)); - data.setUnit(errSysDtl.getErrorUnit()); - data.setRadius(-errSys.getMaxErrorValue() + "~" + errSys.getMaxErrorValue()); - setDetection(dataRule, harmDataList, errSys, data, channelData, fData, scale); - } - info.add(data); - }); - } - return info; + return detectionDataList; } - /** - * 处理数据是否合格 + * 获取某一相的检测结果数据 * - * @param devData - * @param standardDevData - * @param isQualified - * @param pqErrSysDtls - * @param fData - * @param dataRule + * @param devDataList 被检设备数据 + * @param standardDevDataList 与之对齐的标准设备数据 + * @param U1List 基波电压有效值 + * @param pqErrSysDtls 误差体系 + * @param fData 额定值 + * @param harmonicNum (间)谐波次数 + * @param scale 小数点精度 * @return */ - public DetectionData rangeComparisonList(List devData, List standardDevData, Integer isQualified, List pqErrSysDtls, Double fData, DictDataEnum dataRule, Integer scale) { - DetectionData detectionData = new DetectionData(); - detectionData.setIsData(isQualified); + private List getDetectionDataList(List devDataList, List standardDevDataList, List U1List, List pqErrSysDtls, Double fData, Double harmonicNum, Integer scale) { + List detectionDataList = new ArrayList<>(); + for (int i = 0; i < standardDevDataList.size(); i++) { + Double U1 = CollUtil.isNotEmpty(U1List) ? U1List.get(i) : null; + Double stdDevData = BigDecimal.valueOf(standardDevDataList.get(i)).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + Double devData = BigDecimal.valueOf(devDataList.get(i)).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + DetectionData detectionData = new DetectionData(); + detectionData.setIsData(ResultEnum.NO_ERROR_SYS.getValue()); - if (CollUtil.isNotEmpty(devData)) { - BigDecimal bd = BigDecimal.valueOf(devData.get(0)); - bd = bd.setScale(scale, RoundingMode.HALF_UP); - detectionData.setData(bd.doubleValue()); - detectionData.setResultData(standardDevData.get(0)); + //获得误差体系 + List errSysDtls = pqErrSysDtls.stream().filter(x -> rangeComparison(startRadiusEnd(x.getStartValue(), fData, stdDevData, x.getConditionType(), scale), + x.getStartFlag(), + startRadiusEnd(x.getEndValue(), fData, stdDevData, x.getConditionType(), scale), + x.getEndFlag(), + ObjectUtil.isNotNull(U1) ? stdDevData * U1 * 0.01 : stdDevData)).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(errSysDtls)) { + detectionData.setNum(harmonicNum); + detectionData.setData(devData); + detectionData.setResultData(stdDevData); + PqErrSysDtls errSysDtl = BeanUtil.copyProperties(errSysDtls.get(0), PqErrSysDtls.class); + detectionData.setErrorDtlId(errSysDtl.getId()); + detectionData.setUnit(errSysDtl.getErrorUnit()); + errSysDtl.setMaxErrorValue(maxErrorMultiply(errSysDtl, fData, ObjectUtil.isNotNull(U1) ? stdDevData * U1 * 0.01 : stdDevData, scale)); + detectionData.setRadius(-errSysDtl.getMaxErrorValue() + "~" + errSysDtl.getMaxErrorValue()); - //先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断 -// //获得误差体系 + BigDecimal errorData = devSubtractChannelData(devData, stdDevData, fData, errSysDtl, scale); + detectionData.setErrorData(errorData); - for (int i = 0; i < devData.size(); i++) { - int finalI = i; - List errSysDtls = pqErrSysDtls.stream().filter(x -> rangeComparison(startRadiusEnd(x.getStartValue(), fData, standardDevData.get(finalI), x.getConditionType(), scale), - x.getStartFlag(), - startRadiusEnd(x.getEndValue(), fData, standardDevData.get(finalI), x.getConditionType(), scale), - x.getEndFlag(), - devData.get(finalI))).collect(Collectors.toList()); + boolean in = NumberUtil.isIn(errorData, + BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()), + BigDecimal.valueOf(errSysDtl.getMaxErrorValue())); - if (CollUtil.isNotEmpty(errSysDtls)) { - PqErrSysDtls errSysDtl = BeanUtil.copyProperties(errSysDtls.get(0), PqErrSysDtls.class); - detectionData.setUnit(errSysDtl.getErrorUnit()); -// errSysDtl.setMaxErrorValue(maxErrorMultiply(errSysDtl, fData, channelData)); -// detectionData.setRadius(-errSysDtl.getMaxErrorValue() + "~" + errSysDtl.getMaxErrorValue()); -// setDetection(dataRule, list, errSysDtl, detectionData, channelData, data); + if (in) { + detectionData.setIsData(ResultEnum.QUALIFIED.getValue()); + } else { + detectionData.setIsData(ResultEnum.NOT_QUALIFIED.getValue()); } + detectionDataList.add(detectionData); } } -// if (CollUtil.isNotEmpty(list)) { -// SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); -// BigDecimal bd = BigDecimal.valueOf(list.get(0)); -// bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP); -// detectionData.setData(bd.doubleValue()); -// detectionData.setResultData(channelData); -// //先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断 -// //获得误差体系 -// List errSysDtls = pqErrSysDtls.stream().filter(x -> rangeComparison(startRadiusEnd(x.getStartValue(), data, channelData, x.getConditionType()), -// x.getStartFlag(), -// startRadiusEnd(x.getEndValue(), data, channelData, x.getConditionType()), -// x.getEndFlag(), -// channelData)).collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(errSysDtls)) { -// PqErrSysDtls errSysDtl = BeanUtil.copyProperties(errSysDtls.get(0), PqErrSysDtls.class); -// detectionData.setUnit(errSysDtl.getErrorUnit()); -// errSysDtl.setMaxErrorValue(maxErrorMultiply(errSysDtl, data, channelData)); -// detectionData.setRadius(-errSysDtl.getMaxErrorValue() + "~" + errSysDtl.getMaxErrorValue()); -// setDetection(dataRule, list, errSysDtl, detectionData, channelData, data); -// } -// } - - return detectionData; - } - - /** - * @param dataRule 数据处理原则 - * @param harmDataList 原始数据集合 - * @param errSysDtl 误差体系 - * @param data 初始化原始数据 - * @param channelData 源下发的数据 - * @param ratedValue 额定值 - * @Description: - * @Author: wr - * @Date: 2024/12/29 18:10 - */ - private void setDetection(DictDataEnum dataRule, List harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue, Integer scale) { - if (CollUtil.isNotEmpty(harmDataList)) { - // 存放合格的数据 - List qualifiedList = harmDataList.stream() - .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, scale), - BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()), - BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(qualifiedList)) { - switch (dataRule) { - case AT_WILL_VALUE: - case CP95_VALUE: - case AVG_VALUE: - 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, scale)); - } else { - List subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList()); - BigDecimal bd = BigDecimal.valueOf(subtract.get(0)); - bd = bd.setScale(scale, RoundingMode.HALF_UP); - data.setData(bd.doubleValue()); - data.setErrorData(devSubtractChannelData(subtract.get(0), channelData, ratedValue, errSysDtl, scale)); - } - break; - } - } else { - data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl, scale)); - } - isData(dataRule, harmDataList, data, qualifiedList,scale); - } + return detectionDataList; } } 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 919cf63a..90cf445b 100644 --- a/detection/src/main/java/com/njcn/gather/detection/service/impl/PreDetectionServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/detection/service/impl/PreDetectionServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.db.mybatisplus.handler.DynamicTableNameHandler; import com.njcn.gather.detection.handler.SocketContrastResponseService; import com.njcn.gather.detection.handler.SocketDevResponseService; import com.njcn.gather.detection.handler.SocketSourceResponseService; @@ -22,7 +23,6 @@ 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.web.utils.RequestUtil; import com.njcn.gather.device.pojo.po.PqDev; import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.device.service.IPqDevService; @@ -37,8 +37,15 @@ import com.njcn.gather.script.service.IPqScriptCheckDataService; import com.njcn.gather.script.service.IPqScriptDtlsService; import com.njcn.gather.source.pojo.po.SourceInitialize; import com.njcn.gather.source.service.IPqSourceService; +import com.njcn.gather.storage.pojo.po.ContrastHarmonicResult; +import com.njcn.gather.storage.pojo.po.ContrastNonHarmonicResult; +import com.njcn.gather.storage.service.ContrastHarmonicService; +import com.njcn.gather.storage.service.ContrastNonHarmonicService; +import com.njcn.gather.system.cfg.pojo.po.SysTestConfig; +import com.njcn.gather.system.cfg.service.ISysTestConfigService; 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; @@ -55,7 +62,6 @@ import java.util.stream.Collectors; public class PreDetectionServiceImpl implements PreDetectionService { private final String stepTag = "&&"; - private final String handlerSourceStr = "_Source"; private final IPqDevService iPqDevService; private final IDictDataService dictDataService; @@ -63,11 +69,14 @@ public class PreDetectionServiceImpl implements PreDetectionService { private final IAdPlanSourceService adPlanSourceService; private final IPqSourceService pqSourceService; private final IPqScriptDtlsService pqScriptDtlsService; + private final ISysTestConfigService testConfigService; private final SocketDevResponseService socketDevResponseService; private final SocketSourceResponseService socketSourceResponseService; private final SocketContrastResponseService socketContrastResponseService; private final IPqScriptCheckDataService iPqScriptCheckDataService; + private final ContrastNonHarmonicService contrastNonHarmonicService; + private final ContrastHarmonicService contrastHarmonicService; private final SocketManager socketManager; @@ -293,7 +302,7 @@ public class PreDetectionServiceImpl implements PreDetectionService { socketMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue()); socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + stepTag + sourceIssue.getType()); socketMsg.setData(JSON.toJSONString(sourceIssues.get(0))); - SocketManager.sendMsg(param.getUserPageId() + handlerSourceStr, JSON.toJSONString(socketMsg)); + SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg)); } @Override @@ -315,13 +324,44 @@ public class PreDetectionServiceImpl implements PreDetectionService { // 参数校验,目前仅检查IP是否重复,后续可在里面扩展 checkDevIp(param.getDevIds()); socketContrastResponseService.init(param); - //用于处理异常导致的socket通道未关闭,socket交互异常 - //DetectionCommunicateUtil.checkContrastCommunicateChannel(param.getLoginName()); // 和通信模块进行连接 this.sendContrastSocket(param); } + @Override + public Map getContrastTestNumInfo(String planId) { + AdPlan plan = iAdPlanService.getById(planId); + SysTestConfig oneConfig = testConfigService.getOneConfig(); + + Integer maxNum = 1; + String code = String.valueOf(plan.getCode()); + String adNonTable = "ad_non_harmonic_"; + String adTable = "ad_harmonic_"; + + DynamicTableNameHandler.setTableName(adNonTable + code); + ContrastNonHarmonicResult result1 = contrastNonHarmonicService.lambdaQuery().select(ContrastNonHarmonicResult::getNum).orderByDesc().last("LIMIT 1").one(); + if (ObjectUtil.isNotNull(result1)) { + if (result1.getNum().compareTo(maxNum) > 0) { + maxNum = result1.getNum() + 1; + } + } + DynamicTableNameHandler.remove(); + + DynamicTableNameHandler.setTableName(adTable + code); + ContrastHarmonicResult result2 = contrastHarmonicService.lambdaQuery().select(ContrastHarmonicResult::getNum).orderByDesc().last("LIMIT 1").one(); + if (ObjectUtil.isNotNull(result2)) { + if (result2.getNum().compareTo(maxNum) > 0) { + maxNum = result2.getNum() + 1; + } + } + DynamicTableNameHandler.remove(); + + Map map = new HashMap<>(); + map.put(oneConfig.getMaxTime(), maxNum); + return map; + } + /** * 比对式-与通信模块进行连接 * 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 37ac9607..cfbec985 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 @@ -12,7 +12,9 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -385,4 +387,24 @@ public class DetectionUtil { return indexList; } + /** + * 根据idxList索引列表从oldList中获取新数组 + * + * @param oldList + * @param idxList + * @return + */ + public static List getNewArray(List oldList, List idxList) { + if (CollUtil.isNotEmpty(oldList) && CollUtil.isNotEmpty(idxList)) { + if (CollUtil.max(idxList) > oldList.size() - 1 || CollUtil.min(idxList) < 0) { + return null; + } + List newList = new ArrayList<>(); + for (int i = 0; i < idxList.size(); i++) { + newList.add(oldList.get(idxList.get(i))); + } + return newList; + } + return null; + } } 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 7bc525ad..67e779ae 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 @@ -79,11 +79,6 @@ public class FormalTestManager { */ public static Integer stopTime = 0; - /** - * 强行赋值关系 - */ - public static Map harmonicRelationMap = new HashMap<>(); - /** * 当前正在检测的计划 */ @@ -95,9 +90,9 @@ public class FormalTestManager { public static PatternEnum patternEnum; /** - * 比对式检测-检测项。 + * 比对式检测-检测项。key为检测项id,value为检测项code */ - public static List testItemCodeList = new ArrayList<>(); + public static Map testItemMap = new HashMap<>(); /** * 数据处理原则 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 8e41e5b4..e1ad9d51 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 @@ -10,15 +10,10 @@ import com.njcn.gather.detection.util.socket.MsgUtil; import com.njcn.gather.detection.util.socket.SocketManager; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; - import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; /** * Netty心跳处理器 @@ -26,7 +21,7 @@ import java.util.concurrent.TimeUnit; * 负责维护Socket长连接的心跳检测机制,通过定期发送心跳包来检测连接状态, * 当连续多次未收到心跳响应时自动断开连接并清理相关资源。 *

- * + * *

核心功能:

*
    *
  • 定时发送心跳包 (默认10秒间隔,3秒后开始)
  • @@ -35,7 +30,7 @@ import java.util.concurrent.TimeUnit; *
  • 异步处理断开操作,避免阻塞心跳线程
  • *
  • 优雅关闭资源,防止内存泄漏
  • *
- * + * *

心跳机制流程:

*
  * 连接建立 → 启动心跳定时任务(3秒后开始,每10秒执行)
@@ -46,60 +41,72 @@ import java.util.concurrent.TimeUnit;
  *           ↓
  * 连接断开 → 优雅关闭定时任务和线程池
  * 
- * + * *

线程安全设计:

*

* 使用单线程的ScheduledExecutorService处理心跳发送,避免并发问题。 * 超时处理使用CompletableFuture异步执行,不阻塞心跳发送线程。 * Future引用使用volatile修饰,确保多线程环境下的可见性。 *

- * + * *

设备类型支持:

*
    *
  • 程控源设备 (CnSocketUtil.SOURCE_TAG): "_Source"
  • *
  • 被检设备 (CnSocketUtil.DEV_TAG): "_Dev"
  • *
- * + * *

使用示例:

*
{@code
  * // 创建心跳处理器
  * HeartbeatHandler handler = new HeartbeatHandler(param, CnSocketUtil.SOURCE_TAG);
- * 
+ *
  * // 添加到Netty管道中
  * pipeline.addLast(handler);
  * }
- * + * * @author cdf - * @since 2025-02-11 * @version 1.2 + * @since 2025-02-11 */ @Slf4j public class HeartbeatHandler extends SimpleChannelInboundHandler { - - /** 心跳定时任务执行器,使用单线程池避免并发问题 */ + + /** + * 心跳定时任务执行器,使用单线程池避免并发问题 + */ private final ScheduledExecutorService heartbeatExecutor = Executors.newScheduledThreadPool(1); - - /** 检测参数,包含用户页面ID等信息 */ + + /** + * 检测参数,包含用户页面ID等信息 + */ private final PreDetectionParam param; - - /** 处理器类型标识("_Source" 或 "_Dev") */ + + /** + * 处理器类型标识("_Source" 或 "_Dev") + */ private final String handlerType; - - /** 保存定时任务的Future引用,便于取消和管理 */ + + /** + * 保存定时任务的Future引用,便于取消和管理 + */ private ScheduledFuture heartbeatFuture; - /** 允许连续未收到心跳响应的最大次数 */ + /** + * 允许连续未收到心跳响应的最大次数 + */ private static final int MAX_HEARTBEAT_MISSES = 3; - - /** 连续未收到心跳响应的次数 */ + + /** + * 连续未收到心跳响应的次数 + */ private int consecutiveHeartbeatMisses = 0; /** * 构造函数 - * + * * @param param 检测参数,包含用户页面ID等信息 - * @param type 处理器类型(CnSocketUtil.SOURCE_TAG 或 CnSocketUtil.DEV_TAG) + * @param type 处理器类型(CnSocketUtil.SOURCE_TAG 或 CnSocketUtil.DEV_TAG) */ public HeartbeatHandler(PreDetectionParam param, String type) { this.param = param; @@ -110,7 +117,7 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { /** * 通道激活时的回调方法 * 在Socket连接建立成功后被调用,启动心跳机制 - * + * * @param ctx Netty的通道上下文对象 */ @Override @@ -125,7 +132,7 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { /** * 通道断开时的回调方法 * 在Socket连接断开时被调用,负责清理相关资源 - * + * * @param ctx Netty的通道上下文对象 * @throws Exception 异常情况 */ @@ -139,7 +146,7 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { /** * 启动心跳定时任务 * 每10秒发送一次心跳包,3秒后开始执行 - * + * * @param ctx Netty的通道上下文对象 */ private void scheduleHeartbeat(ChannelHandlerContext ctx) { @@ -156,8 +163,8 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { consecutiveHeartbeatMisses++; if (consecutiveHeartbeatMisses >= MAX_HEARTBEAT_MISSES) { // 连续三次未收到心跳响应,异步处理断开逻辑,避免阻塞心跳线程 - log.warn("心跳响应超时 - 设备类型: {}, 连续失败次数: {}/{}, 执行断开连接", - handlerType, consecutiveHeartbeatMisses, MAX_HEARTBEAT_MISSES); + log.warn("心跳响应超时 - 设备类型: {}, 连续失败次数: {}/{}, 执行断开连接", + handlerType, consecutiveHeartbeatMisses, MAX_HEARTBEAT_MISSES); handleHeartbeatTimeoutAsync(); consecutiveHeartbeatMisses = 0; // 重置连续心跳丢失次数 } @@ -182,8 +189,10 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { // 根据设备类型发送对应的退出指令 if (CnSocketUtil.DEV_TAG.equals(handlerType)) { CnSocketUtil.quitSend(param); - } else { + } else if (CnSocketUtil.SOURCE_TAG.equals(handlerType)) { CnSocketUtil.quitSendSource(param); + } else { + CnSocketUtil.contrastSendquit(param.getUserPageId(), true); } log.debug("退出指令已发送,等待3秒后清理连接 - 设备类型: {}", handlerType); } catch (Exception e) { @@ -194,9 +203,9 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { // 延迟3秒后清理连接,给退出指令留出处理时间 Thread.sleep(3000); // 构建连接Key并从SocketManager中移除 - String key = CnSocketUtil.DEV_TAG.equals(handlerType) ? - param.getUserPageId() + CnSocketUtil.DEV_TAG : - param.getUserPageId() + CnSocketUtil.SOURCE_TAG; + String key = CnSocketUtil.DEV_TAG.equals(handlerType) ? + param.getUserPageId() + CnSocketUtil.DEV_TAG : + param.getUserPageId() + CnSocketUtil.SOURCE_TAG; SocketManager.removeUser(key); log.info("心跳超时断开处理完成 - 设备类型: {}, 连接已清理", handlerType); } catch (InterruptedException e) { @@ -254,7 +263,7 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { * 1. 过滤心跳响应包,重置失败计数器 * 2. 业务消息传递给后续处理器 *

- * + * * @param ctx Netty的通道上下文对象 * @param msg 接收到的消息内容 * @throws Exception 异常情况 @@ -278,7 +287,7 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { * 通过解析消息的operateCode字段来判断是否为心跳响应。 * 心跳包的操作码为SourceOperateCodeEnum.HEARTBEAT。 *

- * + * * @param msg 需要判断的消息内容 * @return true:心跳包, false:业务消息 */ @@ -287,9 +296,9 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { // 解析消息为SocketDataMsg对象 SocketDataMsg socketDataMsg = MsgUtil.socketDataMsg(msg); // 检查操作码是否为心跳类型 - return socketDataMsg != null && - socketDataMsg.getOperateCode() != null && - socketDataMsg.getOperateCode().equals(SourceOperateCodeEnum.HEARTBEAT.getValue()); + return socketDataMsg != null && + socketDataMsg.getOperateCode() != null && + socketDataMsg.getOperateCode().equals(SourceOperateCodeEnum.HEARTBEAT.getValue()); } catch (Exception e) { // 消息解析失败,可能不是标准格式的心跳包 log.debug("消息解析失败,可能不是心跳包: {}", msg, e); 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 b648b76e..fcb56985 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 @@ -127,6 +127,7 @@ public class NettyClient { PreDetectionParam preDetectionParam = new PreDetectionParam(); preDetectionParam.setUserPageId(param.getLoginName()); preDetectionParam.setTestItemList(param.getTestItemList()); + preDetectionParam.setNum(param.getNum()); NettyContrastClientHandler handler = new NettyContrastClientHandler(preDetectionParam, socketContrastResponseService); executeSocketConnection(ip, port, preDetectionParam, msg, handler); } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyDevClientHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyDevClientHandler.java index d61dc2b0..e0879c4d 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyDevClientHandler.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyDevClientHandler.java @@ -3,6 +3,7 @@ package com.njcn.gather.detection.util.socket.cilent; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; import com.njcn.gather.detection.handler.SocketDevResponseService; +import com.njcn.gather.detection.pojo.enums.ResultEnum; import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.vo.DevLineTestResult; @@ -71,11 +72,6 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { */ private static final long STOP_TIMEOUT = 600L; - /** - * 超时时默认结果标志:3表示超时失败 - */ - private static final int DEFAULT_RESULT_FLAG = 3; - private final PreDetectionParam param; private final SocketDevResponseService socketResponseService; @@ -247,7 +243,7 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { log.warn("当前进入暂停操作超时函数,停止时间: {}", FormalTestManager.stopTime); if (FormalTestManager.stopTime > STOP_TIMEOUT) { CnSocketUtil.quitSend(param); - WebServiceManager.sendDetectionErrorMessage(param.getUserPageId(),SourceOperateCodeEnum.FORMAL_REAL.getValue(), SourceOperateCodeEnum.STOP_TIMEOUT); + WebServiceManager.sendDetectionErrorMessage(param.getUserPageId(), SourceOperateCodeEnum.FORMAL_REAL.getValue(), SourceOperateCodeEnum.STOP_TIMEOUT); } } @@ -285,13 +281,13 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { // 根据不同检测类型使用不同的超时阈值 if (DicDataEnum.F.getCode().equals(type)) { // 闪变检测:需要更长时间,20分钟超时 - return currentTime > FLICKER_TIMEOUT; + return currentTime >= FLICKER_TIMEOUT; } else if (DicDataEnum.VOLTAGE.getCode().equals(type) || DicDataEnum.HP.getCode().equals(type)) { // 统计数据类型(电压、谐波):中等时间,3分钟超时 - return currentTime > STATISTICS_TIMEOUT; + return currentTime >= STATISTICS_TIMEOUT; } else { // 实时数据类型:短时间,1分钟超时 - return currentTime > REALTIME_TIMEOUT; + return currentTime >= REALTIME_TIMEOUT; } } @@ -340,7 +336,7 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler { devLineTestResult.setDeviceName(dev.getDevName()); Integer[] resultFlags = dev.getMonitorList().stream() - .map(monitor -> DEFAULT_RESULT_FLAG) + .map(monitor -> ResultEnum.NETWORK_TIMEOUT) .toArray(Integer[]::new); devLineTestResult.setChnResult(resultFlags); diff --git a/detection/src/main/java/com/njcn/gather/device/controller/PqDevController.java b/detection/src/main/java/com/njcn/gather/device/controller/PqDevController.java index fef648db..c9586248 100644 --- a/detection/src/main/java/com/njcn/gather/device/controller/PqDevController.java +++ b/detection/src/main/java/com/njcn/gather/device/controller/PqDevController.java @@ -1,6 +1,5 @@ package com.njcn.gather.device.controller; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.njcn.common.pojo.annotation.OperateInfo; @@ -10,12 +9,10 @@ import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.LogUtil; -import com.njcn.gather.device.pojo.enums.CommonEnum; import com.njcn.gather.device.pojo.param.PqDevParam; import com.njcn.gather.device.pojo.vo.PqDevVO; import com.njcn.gather.device.service.IPqDevService; -import com.njcn.gather.plan.pojo.po.AdPlan; -import com.njcn.gather.type.pojo.po.DevType; +import com.njcn.gather.monitor.pojo.po.PqMonitor; import com.njcn.gather.type.service.IDevTypeService; import com.njcn.web.controller.BaseController; import com.njcn.web.utils.FileUtil; @@ -147,7 +144,7 @@ public class PqDevController extends BaseController { if (!fileType) { throw new BusinessException(CommonResponseEnum.FILE_XLSX_ERROR); } - if("null".equals(planId)){ + if ("null".equals(planId)) { planId = null; } Boolean result = pqDevService.importDev(file, patternId, planId, response); diff --git a/detection/src/main/java/com/njcn/gather/device/service/IPqDevService.java b/detection/src/main/java/com/njcn/gather/device/service/IPqDevService.java index 11a6677c..98ba7451 100644 --- a/detection/src/main/java/com/njcn/gather/device/service/IPqDevService.java +++ b/detection/src/main/java/com/njcn/gather/device/service/IPqDevService.java @@ -7,6 +7,7 @@ import com.njcn.gather.device.pojo.enums.TimeCheckResultEnum; import com.njcn.gather.device.pojo.param.PqDevParam; import com.njcn.gather.device.pojo.po.PqDev; import com.njcn.gather.device.pojo.vo.*; +import com.njcn.gather.monitor.pojo.po.PqMonitor; import org.apache.ibatis.annotations.Param; import org.springframework.web.multipart.MultipartFile; 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 d5217cf0..acc12a11 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 @@ -209,7 +209,7 @@ public class PqDevServiceImpl extends ServiceImpl implements public boolean deletePqDev(PqDevParam.DeleteParam param) { if (PatternEnum.CONTRAST.getValue().equals(dictDataService.getDictDataById(param.getPattern()).getCode())) { for (String id : param.getIds()) { - if (ObjectUtils.isNotEmpty(pqMonitorService.listPqMonitorByDevId(id))) { + if (ObjectUtils.isNotEmpty(pqMonitorService.listPqMonitorByDevIds(Collections.singletonList(id)))) { throw new BusinessException(DetectionResponseEnum.PQ_DEV_HAS_MONITOR); } } @@ -363,7 +363,7 @@ public class PqDevServiceImpl extends ServiceImpl implements pqDevVO.setDevVolt(devType.getDevVolt()); } - List monitorList = pqMonitorService.listPqMonitorByDevId(id); + List monitorList = pqMonitorService.listPqMonitorByDevIds(Collections.singletonList(id)); if (ObjectUtil.isNotEmpty(monitorList)) { pqDevVO.setMonitorList(monitorList); } @@ -1384,7 +1384,7 @@ public class PqDevServiceImpl extends ServiceImpl implements this.visualizeProvinceDev(pqDevVOList); contrastDevExcels.addAll(BeanUtil.copyToList(pqDevVOList, ContrastDevExcel.class)); contrastDevExcels.forEach(contrastDevExcel -> { - List monitorList = pqMonitorService.listPqMonitorByDevId(contrastDevExcel.getId()); + List monitorList = pqMonitorService.listPqMonitorByDevIds(Collections.singletonList(contrastDevExcel.getId())); pqMonitorService.visualizeMonitor(monitorList); List pqMonitorExcelList = BeanUtil.copyToList(monitorList, PqMonitorExcel.class); contrastDevExcel.setPqMonitorExcelList(pqMonitorExcelList); diff --git a/detection/src/main/java/com/njcn/gather/err/service/impl/PqErrSysDtlsServiceImpl.java b/detection/src/main/java/com/njcn/gather/err/service/impl/PqErrSysDtlsServiceImpl.java index b8cf7867..ccee2409 100644 --- a/detection/src/main/java/com/njcn/gather/err/service/impl/PqErrSysDtlsServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/err/service/impl/PqErrSysDtlsServiceImpl.java @@ -162,7 +162,7 @@ public class PqErrSysDtlsServiceImpl extends ServiceImpl> list(@RequestBody PqMonitorParam.QueryParam queryParam) { String methodDescribe = getMethodDescribe("list"); LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, queryParam); - List result = pqMonitorService.listPqMonitorByDevId(queryParam.getDevId()); + List result = pqMonitorService.listPqMonitorByDevIds(queryParam.getDevIds()); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); } } diff --git a/detection/src/main/java/com/njcn/gather/monitor/mapper/PqMonitorMapper.java b/detection/src/main/java/com/njcn/gather/monitor/mapper/PqMonitorMapper.java index 5597e611..17d59a0c 100644 --- a/detection/src/main/java/com/njcn/gather/monitor/mapper/PqMonitorMapper.java +++ b/detection/src/main/java/com/njcn/gather/monitor/mapper/PqMonitorMapper.java @@ -15,11 +15,23 @@ public interface PqMonitorMapper extends MPJBaseMapper { /** * 根据终端id获取监测点集合 + * * @param devId * @return: java.util.List * @Author: wr * @Date: 2024/12/12 13:15 */ List selectMonitorInfo(@Param("devId") String devId); + + /** + * 根据被检设备id和线路号获取监测点信息 + * + * @param devId 被检设备id + * @param num 线路号 + * @return + */ + PqMonitor getByDevIdAndNum(@Param("devId") String devId, @Param("num") Integer num); + + List listByDevIds(@Param("devIds") List devIds); } 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 aeb122ad..e6a3c852 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 @@ -16,5 +16,39 @@ WHERE Dev_Id = #{devId} + + diff --git a/detection/src/main/java/com/njcn/gather/monitor/pojo/param/PqMonitorParam.java b/detection/src/main/java/com/njcn/gather/monitor/pojo/param/PqMonitorParam.java index a6510fdc..13c84e88 100644 --- a/detection/src/main/java/com/njcn/gather/monitor/pojo/param/PqMonitorParam.java +++ b/detection/src/main/java/com/njcn/gather/monitor/pojo/param/PqMonitorParam.java @@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; +import java.util.List; /** * @author caozehui @@ -62,18 +63,6 @@ public class PqMonitorParam { public static class QueryParam { @ApiModelProperty(value = "所属设备id") @NotBlank(message = DetectionValidMessage.DEVICE_ID_NOT_BLANK) - private String devId; + private List devIds; } - - /** - * 修改实体 - */ -// @Data -// @EqualsAndHashCode(callSuper = true) -// public static class UpdateParam extends PqMonitorParam { -// @ApiModelProperty(value = "监测点id", required = true) -// @NotBlank(message = DetectionValidMessage.ID_NOT_BLANK) -// @Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.ID_FORMAT_ERROR) -// private String id; -// } } diff --git a/detection/src/main/java/com/njcn/gather/monitor/service/IPqMonitorService.java b/detection/src/main/java/com/njcn/gather/monitor/service/IPqMonitorService.java index d10248dc..f997dfb2 100644 --- a/detection/src/main/java/com/njcn/gather/monitor/service/IPqMonitorService.java +++ b/detection/src/main/java/com/njcn/gather/monitor/service/IPqMonitorService.java @@ -17,10 +17,10 @@ public interface IPqMonitorService extends IService { /** * 根据设备id获取所有监测点信息 * - * @param devId 被检设备id + * @param devIds 被检设备id列表 * @return 监测点信息列表 */ - List listPqMonitorByDevId(String devId); + List listPqMonitorByDevIds(List devId); /** * 根据设备id批量新增监测点信息 @@ -62,6 +62,14 @@ public interface IPqMonitorService extends IService { */ void reverseVisualizeMonitor(List monitorList); + /** + * 根据被检设备监测点id获取监测点信息 + * + * @param devMonitorId 被检设备监测点id + * @return + */ + PqMonitor getByDevMonitorId(String devMonitorId); + /** * 根据被检设备id获取额定电流 * @param devMonitorId 被检设备监测点id diff --git a/detection/src/main/java/com/njcn/gather/monitor/service/impl/PqMonitorServiceImpl.java b/detection/src/main/java/com/njcn/gather/monitor/service/impl/PqMonitorServiceImpl.java index a31b2090..062877e4 100644 --- a/detection/src/main/java/com/njcn/gather/monitor/service/impl/PqMonitorServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/monitor/service/impl/PqMonitorServiceImpl.java @@ -1,6 +1,7 @@ package com.njcn.gather.monitor.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -32,8 +33,11 @@ public class PqMonitorServiceImpl extends ServiceImpl listPqMonitorByDevId(String devId) { - return this.lambdaQuery().eq(PqMonitor::getDevId, devId).list(); + public List listPqMonitorByDevIds(List devIds) { + if (CollUtil.isNotEmpty(devIds)) { + return this.baseMapper.listByDevIds(devIds); + } + return CollUtil.empty(PqMonitor.class); } @Override @@ -86,12 +90,18 @@ public class PqMonitorServiceImpl extends ServiceImpl>> getBigTestItem(@RequestBody AdPlanParam.CheckParam checkParam) { String methodDescribe = getMethodDescribe("getBigTestItem"); LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, checkParam); - List> result = adPlanService.getBigTestItem(checkParam.getReCheckType(), checkParam.getPlanId(), checkParam.getDevIds()); + List> result = adPlanService.getBigTestItem(checkParam.getReCheckType(), checkParam.getPlanId(), checkParam.getDevIds(), checkParam.getPatternId()); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); } diff --git a/detection/src/main/java/com/njcn/gather/plan/pojo/param/AdPlanParam.java b/detection/src/main/java/com/njcn/gather/plan/pojo/param/AdPlanParam.java index de9797a3..13d58b5f 100644 --- a/detection/src/main/java/com/njcn/gather/plan/pojo/param/AdPlanParam.java +++ b/detection/src/main/java/com/njcn/gather/plan/pojo/param/AdPlanParam.java @@ -118,5 +118,6 @@ public class AdPlanParam { private Integer reCheckType; private String planId; private List devIds; + private String patternId; } } diff --git a/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java b/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java index 6ac078a4..07bd6bfd 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java @@ -45,12 +45,11 @@ public interface IAdPlanService extends IService { /** * 删除检测计划 * - * @param ids 检测计划id列表 + * @param ids 检测计划id列表 * @param pattern 模式Id - * * @return 删除成功则返回true,否则返回false */ - boolean deleteAdPlan(List ids,String pattern); + boolean deleteAdPlan(List ids, String pattern); /** * 根据模式查询检测计划 @@ -70,12 +69,13 @@ public interface IAdPlanService extends IService { /** * 获取检测大项 * - * @param reCheckType 0:不合格项复检 1:全部复检 - * @param planId 检测计划Id - * @param devIds 设备Id列表 + * @param reCheckType 0:不合格项复检 1:全部复检 + * @param planId 检测计划Id + * @param devIds 设备Id列表 + * @param patternId 模式Id * @return */ - List> getBigTestItem(Integer reCheckType, String planId, List devIds); + List> getBigTestItem(Integer reCheckType, String planId, List devIds, String patternId); /** * 修改计划状态 @@ -150,7 +150,6 @@ public interface IAdPlanService extends IService { * * @param planId * @param name - * * @return */ boolean updateSubPlanName(String planId, String name); diff --git a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java index 11f442cd..ebf511e3 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java @@ -510,18 +510,30 @@ public class AdPlanServiceImpl extends ServiceImpl impleme } @Override - public List> getBigTestItem(Integer reCheckType, String planId, List devIds) { + public List> getBigTestItem(Integer reCheckType, String planId, List devIds, String patternId) { List> result = new ArrayList<>(); AdPlan adPlan = this.getById(planId); if (ObjectUtil.isNull(adPlan)) { throw new BusinessException(DetectionResponseEnum.PLAN_NOT_EXIST); } - String scriptId = adPlan.getScriptId(); + DictData dictData = dictDataService.getById(patternId); + if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) { + String[] split = adPlan.getTestItem().split(StrUtil.COMMA); + List dictTreeList = dictTreeService.list(new QueryWrapper().in("id", split).eq("state", DataStateEnum.DELETED.getCode())); - List scriptDtlsList = pqScriptDtlsService.listPqScriptDtlByScriptId(scriptId); + for (DictTree dictTree : dictTreeList) { + Map map = new HashMap<>(); + map.put("id", dictTree.getId()); + map.put("code", dictTree.getCode()); + map.put("scriptName", dictTree.getName()); + result.add(map); + } + } else { + String scriptId = adPlan.getScriptId(); + List scriptDtlsList = pqScriptDtlsService.listPqScriptDtlByScriptId(scriptId); - // 不合格项复检 - if (reCheckType == 0) { + // 不合格项复检 + if (reCheckType == 0) { // List allResultList = new ArrayList<>(); // allResultList.addAll(adHarmonicService.get(scriptId, null, devId, "-1", adPlan.getCode())); // allResultList.addAll(adNonHarmonicService.get(scriptId, null, devId, "-1", adPlan.getCode())); @@ -532,33 +544,35 @@ public class AdPlanServiceImpl extends ServiceImpl impleme // // scriptDtlsList = scriptDtlsList.stream().filter(obj -> !sortSet.contains(obj.getScriptIndex())).collect(Collectors.toList()); // } - Set indexes = new HashSet<>(); - StorageParam storageParam = new StorageParam(); - storageParam.setCode(adPlan.getCode() + ""); - storageParam.setScriptId(adPlan.getScriptId()); - devIds.forEach(devId -> { - storageParam.setDevId(devId); - indexes.addAll(adHarmonicService.getIndex(storageParam)); + Set indexes = new HashSet<>(); + StorageParam storageParam = new StorageParam(); + storageParam.setCode(adPlan.getCode() + ""); + storageParam.setScriptId(adPlan.getScriptId()); + devIds.forEach(devId -> { + storageParam.setDevId(devId); + indexes.addAll(adHarmonicService.getIndex(storageParam)); + }); + scriptDtlsList = scriptDtlsList.stream().filter(obj -> indexes.contains(obj.getScriptIndex())).collect(Collectors.toList()); + } + + Map> collect = scriptDtlsList.stream() + .sorted(Comparator.comparing(PqScriptDtls::getScriptIndex)) + .collect(Collectors.groupingBy(PqScriptDtls::getScriptType, LinkedHashMap::new, Collectors.toList())); + + collect.forEach((key, value) -> { + Map map = new HashMap<>(); + map.put("id", key); + DictTree dictTree = dictTreeService.getById(key); + if (ObjectUtil.isNotNull(dictTree)) { + map.put("code", dictTree.getCode()); + map.put("scriptName", dictTree.getName()); + } else { + throw new BusinessException(DetectionResponseEnum.SCRIPT_RELATE_DICT_NOT_EXIST); + } + result.add(map); }); - scriptDtlsList = scriptDtlsList.stream().filter(obj -> indexes.contains(obj.getScriptIndex())).collect(Collectors.toList()); } - Map> collect = scriptDtlsList.stream() - .sorted(Comparator.comparing(PqScriptDtls::getScriptIndex)) - .collect(Collectors.groupingBy(PqScriptDtls::getScriptType, LinkedHashMap::new, Collectors.toList())); - - collect.forEach((key, value) -> { - Map map = new HashMap<>(); - map.put("id", key); - DictTree dictTree = dictTreeService.getById(key); - if (ObjectUtil.isNotNull(dictTree)) { - map.put("code", dictTree.getCode()); - map.put("scriptName", dictTree.getName()); - } else { - throw new BusinessException(DetectionResponseEnum.SCRIPT_RELATE_DICT_NOT_EXIST); - } - result.add(map); - }); return result; } diff --git a/detection/src/main/java/com/njcn/gather/report/pojo/enums/PowerIndexEnum.java b/detection/src/main/java/com/njcn/gather/report/pojo/enums/PowerIndexEnum.java index 26c04d9a..53596e66 100644 --- a/detection/src/main/java/com/njcn/gather/report/pojo/enums/PowerIndexEnum.java +++ b/detection/src/main/java/com/njcn/gather/report/pojo/enums/PowerIndexEnum.java @@ -16,6 +16,7 @@ public enum PowerIndexEnum { FREQ("FREQ", "频率"), V("V", "电压"), I("I", "电流"), + P("P", "功率"), IMBV("IMBV", "负序电压不平衡度"), IMBA("IMBA", "负序电流不平衡度"), F("F", "短时电压闪变"), 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 cd843535..f3dd5a5e 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 @@ -1500,57 +1500,58 @@ public class ResultServiceImpl implements IResultService { 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])); + Map> ipDevDataMap = FormalTestManager.standardDevDataMap.values().stream().flatMap(List::stream).collect(Collectors.groupingBy(obj -> obj.getId().split(CnSocketUtil.SPLIT_TAG)[0])); - ipDevDataMap.forEach((ip, devDataList) -> { + ipDevDataMap.forEach((ip, stdDevDataList) -> { // 按照通道号分组。key为通道号,value为该通道号下所有设备数据 - Map> channelDataMap = devDataList.stream().collect(Collectors.groupingBy(obj -> obj.getId().split(CnSocketUtil.SPLIT_TAG)[1])); + Map> channelDataMap = stdDevDataList.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); + String standardDevMonitorId = ip + CnSocketUtil.SPLIT_TAG + channel; + String devMonitorId = FormalTestManager.pairsMap.inverse().get(standardDevMonitorId); + List devDataList = BeanUtil.copyToList(FormalTestManager.devDataMap.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]); + String standardDevName = FormalTestManager.devNameMapComm.get(ip); + String[] split = devMonitorId.split(CnSocketUtil.SPLIT_TAG); + String devName = 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]); + alignDataExcel.getDevDataConfig().setName(devName + "通道" + split[1]); + alignDataExcel.getStandardDevDataConfig().setName(standardDevName + "通道" + channel); 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()); + alignDataExcel.setTimeStdDev(obj.getTime()); + alignDataExcel.setUaStdDev(list1.getA()); + alignDataExcel.setUbStdDev(list1.getB()); + alignDataExcel.setUcStdDev(list1.getC()); - DevData devData = standarDevDataList.stream().filter(obj1 -> DetectionUtil.isAlignData(obj1, obj)).findFirst().get(); + DevData devData = devDataList.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); + alignDataExcel.setTimeDev(devData.getTime()); + alignDataExcel.setUaDev(list2.getA()); + alignDataExcel.setUbDev(list2.getB()); + alignDataExcel.setUcDev(list2.getC()); + devDataList.remove(devData); } dataList.add(alignDataExcel); }); - standarDevDataList.sort(Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); - standarDevDataList.stream().forEach(obj -> { + devDataList.sort(Comparator.comparing(obj -> DetectionUtil.getMillis(obj.getTime()))); + devDataList.stream().forEach(obj -> { AlignDataExcel alignDataExcel = new AlignDataExcel(); - alignDataExcel.getDevDataConfig().setName(devName + "通道" + channel); - alignDataExcel.getStandardDevDataConfig().setName(standardDevName + "通道" + split[1]); + alignDataExcel.getDevDataConfig().setName(devName + "通道" + split[1]); + alignDataExcel.getStandardDevDataConfig().setName(standardDevName + "通道" + channel); 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()); + alignDataExcel.setTimeDev(obj.getTime()); + alignDataExcel.setUaDev(list2.getA()); + alignDataExcel.setUbDev(list2.getB()); + alignDataExcel.setUcDev(list2.getC()); dataList.add(alignDataExcel); }); diff --git a/storage/src/main/java/com/njcn/gather/storage/mapper/mapping/TableGenMapper.xml b/storage/src/main/java/com/njcn/gather/storage/mapper/mapping/TableGenMapper.xml index 5ffd548b..a5cafee7 100644 --- a/storage/src/main/java/com/njcn/gather/storage/mapper/mapping/TableGenMapper.xml +++ b/storage/src/main/java/com/njcn/gather/storage/mapper/mapping/TableGenMapper.xml @@ -12,12 +12,11 @@ B_Value float DEFAULT NULL COMMENT 'B相值', C_Value float DEFAULT NULL COMMENT 'C相值', T_Value float DEFAULT NULL COMMENT 'T相值(没有相别的则存这里)', - Result_Flag int(1) NULL COMMENT '1合格 2不合格 4无法处理', + Result_Flag int(1) NULL COMMENT '1合格 2不合格 4无法处理', - Error_Id CHAR(32) NOT NULL COMMENT '误差体系表ID', Num tinyint(1) unsigned DEFAULT 0 COMMENT '第几次检测', - PRIMARY KEY (Monitor_Id, Time_Id, Error_Id, AD_Type) + PRIMARY KEY (Monitor_Id, Time_Id, AD_Type, Num) Script_Id CHAR(32) NOT NULL COMMENT '检测脚本表Id', @@ -47,9 +46,8 @@ Result_Flag int(1) NOT NULL COMMENT '1合格 2不合格 4无法处理', - Error_Id CHAR(32) NOT NULL COMMENT '误差体系表ID', Num tinyint(1) unsigned DEFAULT 0 COMMENT '第几次检测', - PRIMARY KEY (Monitor_Id, Error_Id, Num, AD_Type) + PRIMARY KEY (Monitor_Id, AD_Type, Num) Script_Id CHAR(32) NOT NULL COMMENT '检测脚本表Id', diff --git a/storage/src/main/java/com/njcn/gather/storage/pojo/po/ContrastBaseResult.java b/storage/src/main/java/com/njcn/gather/storage/pojo/po/ContrastBaseResult.java index a3316cbc..e85f6666 100644 --- a/storage/src/main/java/com/njcn/gather/storage/pojo/po/ContrastBaseResult.java +++ b/storage/src/main/java/com/njcn/gather/storage/pojo/po/ContrastBaseResult.java @@ -10,11 +10,6 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) public class ContrastBaseResult extends BaseResult { - /** - * 误差体系Id - */ - private String errorId; - /** * 第几次检测 */ 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 62fa9af6..40b78463 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 @@ -57,7 +57,6 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl 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); } @@ -72,7 +71,7 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl harmonicResultList, String code) { - if (CollUtil.isEmpty(harmonicResultList)) { + if (CollUtil.isNotEmpty(harmonicResultList)) { String adTable = "ad_harmonic_"; DynamicTableNameHandler.setTableName(adTable + code); @@ -92,7 +91,6 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl 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); } @@ -125,7 +123,7 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl monitorIds = contrastNonHarmonicResultList.stream().map(ContrastNonHarmonicResult::getMonitorId).distinct().collect(Collectors.toList()); if (CollUtil.isNotEmpty(monitorIds)) { contrastNonHarmonicService.remove(new LambdaQueryWrapper().in(ContrastNonHarmonicResult::getMonitorId, monitorIds) - .eq(ContrastNonHarmonicResult::getErrorId, contrastNonHarmonicResultList.get(0).getErrorId()) + .eq(ContrastNonHarmonicResult::getAdType, contrastNonHarmonicResultList.get(0).getAdType()) .eq(ContrastNonHarmonicResult::getNum, contrastNonHarmonicResultList.get(0).getNum())); contrastNonHarmonicService.saveBatch(contrastNonHarmonicResultList, 100); } @@ -157,7 +155,7 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl 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::getAdType, contrastHarmonicResultList.get(0).getAdType()) .eq(ContrastHarmonicResult::getNum, contrastHarmonicResultList.get(0).getNum())); contrastHarmonicService.saveBatch(contrastHarmonicResultList, 100); } diff --git a/storage/src/main/java/com/njcn/gather/storage/service/impl/TableGenServiceImpl.java b/storage/src/main/java/com/njcn/gather/storage/service/impl/TableGenServiceImpl.java index b6c8fcc8..715fa409 100644 --- a/storage/src/main/java/com/njcn/gather/storage/service/impl/TableGenServiceImpl.java +++ b/storage/src/main/java/com/njcn/gather/storage/service/impl/TableGenServiceImpl.java @@ -39,16 +39,15 @@ public class TableGenServiceImpl implements TableGenService { " Time_Id DATETIME(3) NOT NULL COMMENT '时间',\n" + " AD_Type CHAR(32) NOT NULL COMMENT '检测指标,字典表',\n" + " Data_Type CHAR(32) NOT NULL COMMENT '数据指标,只有数据源为分钟统计时候才会使用(最大、最小、平均、CP95,默认平均值),字典表',\n" + - A + B + C + " Result_Flag int(1) NULL COMMENT '0不合格 1合格 4无法处理',\n" + + A + B + C + (isContrast ? - " Error_Id CHAR(32) NOT NULL COMMENT '误差体系表Id',\n" + " Num tinyint(1) unsigned DEFAULT 0 COMMENT '第几次检测',\n" + - " PRIMARY KEY (Monitor_Id,Time_Id,Error_Id, AD_Type)\n" + " PRIMARY KEY (Monitor_Id,Time_Id, AD_Type, Num)\n" : " Script_Id CHAR(32) NOT NULL COMMENT '检测脚本表Id',\n" + - " Sort int(4) NOT NULL COMMENT '总检测脚本中的测试项序号',\n"+ - " PRIMARY KEY (Monitor_Id, Time_Id, Script_Id, Sort, AD_Type)\n" + " Sort int(4) NOT NULL COMMENT '总检测脚本中的测试项序号',\n" + + " PRIMARY KEY (Monitor_Id, Time_Id, Script_Id, Sort, AD_Type)\n" ) + ") COMMENT='谐波类原始数据表';"; tableGenMapper.genAdHarmonicTable(sql); @@ -60,15 +59,14 @@ public class TableGenServiceImpl implements TableGenService { " Time_Id DATETIME(3) NULL COMMENT '时间',\n" + " AD_Type CHAR(32) NOT NULL COMMENT '检测指标,字典表',\n" + " Data_Type CHAR(32) NOT NULL COMMENT '数据指标,只有数据源为分钟统计时候才会使用(最大、最小、平均、CP95,默认平均值),字典表',\n" + - a + b + c + " Result_Flag int(1) NOT NULL COMMENT '1合格 2不合格 4无法处理',\n" + + a + b + c + (isContrast ? - " Error_Id CHAR(32) NOT NULL COMMENT '误差体系表Id',\n" + - " Num tinyint(1) unsigned DEFAULT 0 COMMENT '第几次检测',\n" + - " PRIMARY KEY (Monitor_Id, Error_Id, Num, AD_Type)\n" + " Num tinyint(1) unsigned DEFAULT 0 COMMENT '第几次检测',\n" + + " PRIMARY KEY (Monitor_Id, AD_Type, Num)\n" : " Script_Id CHAR(32) NOT NULL COMMENT '检测脚本表Id',\n" + - " Sort int(4) NOT NULL COMMENT '总检测脚本中的测试项序号',\n"+ + " Sort int(4) NOT NULL COMMENT '总检测脚本中的测试项序号',\n" + " PRIMARY KEY (Monitor_Id,Script_Id, Sort, AD_Type)\n" ) + ") COMMENT='谐波类检测结果表';"; tableGenMapper.genAdHarmonicTable(sql2); diff --git a/system/src/main/java/com/njcn/gather/system/dictionary/service/IDictTreeService.java b/system/src/main/java/com/njcn/gather/system/dictionary/service/IDictTreeService.java index 156b7cf6..190496f3 100644 --- a/system/src/main/java/com/njcn/gather/system/dictionary/service/IDictTreeService.java +++ b/system/src/main/java/com/njcn/gather/system/dictionary/service/IDictTreeService.java @@ -60,4 +60,6 @@ public interface IDictTreeService extends IService { List getDictTreeById(List ids); DictTree getDictTreeByCode(String code); + + List listByFatherIds(List fatherIdList); } diff --git a/system/src/main/java/com/njcn/gather/system/dictionary/service/impl/DictTreeServiceImpl.java b/system/src/main/java/com/njcn/gather/system/dictionary/service/impl/DictTreeServiceImpl.java index ab22971c..5aae695d 100644 --- a/system/src/main/java/com/njcn/gather/system/dictionary/service/impl/DictTreeServiceImpl.java +++ b/system/src/main/java/com/njcn/gather/system/dictionary/service/impl/DictTreeServiceImpl.java @@ -7,7 +7,6 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.njcn.common.pojo.enums.common.DataStateEnum; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.gather.system.dictionary.mapper.DictTreeMapper; import com.njcn.gather.system.dictionary.pojo.param.DictTreeParam; @@ -82,7 +81,7 @@ public class DictTreeServiceImpl extends ServiceImpl i public boolean updateDictTree(DictTreeParam.UpdateParam param) { param.setName(param.getName().trim()); DictTree dictTree = this.getById(param.getId()); - if("975f63baeb6f653c54fca226a9ae36ca".equals(param.getId()) || dictTree.getPids().contains("975f63baeb6f653c54fca226a9ae36ca")){ + if ("975f63baeb6f653c54fca226a9ae36ca".equals(param.getId()) || dictTree.getPids().contains("975f63baeb6f653c54fca226a9ae36ca")) { throw new BusinessException(SystemResponseEnum.CAN_NOT_UPDATE_USED_DICT); } checkRepeat(param, true); @@ -96,7 +95,7 @@ public class DictTreeServiceImpl extends ServiceImpl i public boolean deleteDictTree(String id) { boolean result = false; DictTree dictTree = this.getById(id); - if("975f63baeb6f653c54fca226a9ae36ca".equals(id) || dictTree.getPids().contains("975f63baeb6f653c54fca226a9ae36ca")){ + if ("975f63baeb6f653c54fca226a9ae36ca".equals(id) || dictTree.getPids().contains("975f63baeb6f653c54fca226a9ae36ca")) { throw new BusinessException(SystemResponseEnum.CAN_NOT_DELETE_USED_DICT); } @@ -139,6 +138,14 @@ public class DictTreeServiceImpl extends ServiceImpl i ); } + @Override + public List listByFatherIds(List fatherIdList) { + if (CollUtil.isNotEmpty(fatherIdList)) { + return this.lambdaQuery().in(DictTree::getPid, fatherIdList).eq(DictTree::getState, DictConst.ENABLE).list(); + } + return null; + } + private void checkRepeat(DictTreeParam dictTreeParam, boolean isExcludeSelf) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(DictTree::getPid, dictTreeParam.getPid()) // 同一父节点下不能有相同的code diff --git a/system/src/main/java/com/njcn/gather/system/reg/service/ISysRegResService.java b/system/src/main/java/com/njcn/gather/system/reg/service/ISysRegResService.java index 590c4bd9..71367c5a 100644 --- a/system/src/main/java/com/njcn/gather/system/reg/service/ISysRegResService.java +++ b/system/src/main/java/com/njcn/gather/system/reg/service/ISysRegResService.java @@ -14,7 +14,7 @@ import java.util.Map; */ public interface ISysRegResService extends IService { /** - * 查询版本注册表 + * 查询版本注册信息 * @return */ SysRegRes getRegResByType(String type); @@ -38,4 +38,10 @@ public interface ISysRegResService extends IService { * @return 版本注册信息 */ SysRegResVO listRegRes(); + + /** + * 获取比对式的注册信息 + * @return + */ + SysRegRes getContrastRegRes(); } diff --git a/system/src/main/java/com/njcn/gather/system/reg/service/impl/SysRegResServiceImpl.java b/system/src/main/java/com/njcn/gather/system/reg/service/impl/SysRegResServiceImpl.java index 113f6cec..66f16083 100644 --- a/system/src/main/java/com/njcn/gather/system/reg/service/impl/SysRegResServiceImpl.java +++ b/system/src/main/java/com/njcn/gather/system/reg/service/impl/SysRegResServiceImpl.java @@ -212,6 +212,11 @@ public class SysRegResServiceImpl extends ServiceImpl