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 37b83823..a749be61 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 @@ -7,10 +7,16 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.google.common.collect.HashBiMap; import com.njcn.common.pojo.exception.BusinessException; -import com.njcn.gather.detection.pojo.enums.*; +import com.njcn.gather.detection.pojo.dto.WaveCommandDTO; +import com.njcn.gather.detection.pojo.dto.WaveResultDTO; +import com.njcn.gather.detection.pojo.enums.DetectionCodeEnum; +import com.njcn.gather.detection.pojo.enums.DetectionResponseEnum; +import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; +import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum; import com.njcn.gather.detection.pojo.param.ContrastDetectionParam; import com.njcn.gather.detection.pojo.param.DevPhaseSequenceParam; import com.njcn.gather.detection.pojo.param.PreDetectionParam; @@ -29,12 +35,12 @@ 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.plan.service.IAdPlanTestConfigService; 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.storage.service.DetectionDataDealService; import com.njcn.gather.system.cfg.pojo.po.SysTestConfig; import com.njcn.gather.system.cfg.service.ISysTestConfigService; @@ -43,13 +49,18 @@ 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 com.njcn.gather.tools.comtrade.comparewave.core.model.CompareWaveDTO; +import com.njcn.gather.tools.comtrade.comparewave.core.model.PqsDataStruct; +import com.njcn.gather.tools.comtrade.comparewave.service.ICompareWaveService; import com.njcn.web.utils.ExcelUtil; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.DecimalFormat; @@ -78,12 +89,12 @@ public class SocketContrastResponseService { private final IPqStandardDevService pqStandardDevService; private final IDictTreeService dictTreeService; private final DetectionDataDealService detectionDataDealService; - private final ISysRegResService sysRegResService; + private final IPqMonitorService pqMonitorService; private final DetectionServiceImpl detectionService; - private final ContrastNonHarmonicService contrastNonHarmonicService; - private final ContrastHarmonicService contrastHarmonicService; private final ISysTestConfigService sysTestConfigService; private final IAdPariService adPairService; + private final ICompareWaveService compareWaveService; + private final IAdPlanTestConfigService adPlanTestConfigService; /** * 定时器 @@ -100,11 +111,6 @@ public class SocketContrastResponseService { */ private boolean checkResult = false; - /** - * 是否接收数据 - */ - private boolean isReceiveData = true; - /** * 成功的配对 key:被检设备ip_通道号,value:配对设备ip_通道号 */ @@ -123,7 +129,7 @@ public class SocketContrastResponseService { /** * 存放比对式注册信息(包含了实时数据有效组数、统计数据有效组数、录播数据有效组数、闪变数据有效组数) */ - private SysRegRes contrastRegRes = null; +// private SysRegRes contrastRegRes = null; @Value("${log.homeDir}") @@ -202,6 +208,9 @@ public class SocketContrastResponseService { */ public void init(ContrastDetectionParam param) { FormalTestManager.currentTestPlan = adPlanService.getById(param.getPlanId()); + FormalTestManager.curretntTestPlanConfig = adPlanTestConfigService.getByPlanId(param.getPlanId()); + FormalTestManager.waveNum = 0; + FormalTestManager.preNumTestResultList.clear(); checkResult = false; SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); @@ -209,11 +218,12 @@ public class SocketContrastResponseService { successComm.clear(); failComm.clear(); successPair.clear(); - FormalTestManager.isRemoveSocket = true; + FormalTestManager.isRemoveSocket = false; HashBiMap hashBiMap = HashBiMap.create(param.getPairs()); FormalTestManager.pairsIdMap.clear(); FormalTestManager.pairsIdMap.putAll(hashBiMap); + FormalTestManager.waveResultDTOMap.clear(); List pqDevList = pqDevService.getDevInfo(param.getDevIds()); // key为被检设备id_通道号,value为监测点DTO @@ -348,7 +358,8 @@ public class SocketContrastResponseService { this.formalDeal(param, socketDataMsg); break; // 启动录波 - case RECORD_WAVE: + case RECORD_WAVE_STEP1: + case RECORD_WAVE_STEP2: this.recordWave(param, socketDataMsg); break; //退出关闭 @@ -421,10 +432,10 @@ public class SocketContrastResponseService { break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; case NO_INIT_DEV: - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -475,7 +486,7 @@ public class SocketContrastResponseService { WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 0)); System.out.println("模型一致性校验失败!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》"); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); return; } else { this.clearData(); @@ -511,18 +522,18 @@ public class SocketContrastResponseService { break; case DEV_ERROR: WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 0)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; case DEV_TARGET: WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 1)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; case NO_INIT_DEV: - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -557,7 +568,7 @@ public class SocketContrastResponseService { if (!checkResult) { System.out.println("1minute内实时数据对齐校验失败!"); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); Collection disjunction = CollectionUtil.disjunction(FormalTestManager.pairsIpMap.keySet(), successPair.keySet()); // 向前端推送实时数据对齐失败的配对项 @@ -679,18 +690,18 @@ public class SocketContrastResponseService { break; case DEV_ERROR: WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 0)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; case DEV_TARGET: WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(socketDataMsg, FormalTestManager.devNameMapComm, 1)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; case NO_INIT_DEV: - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -763,8 +774,7 @@ public class SocketContrastResponseService { DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam(); phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()]))); phaseSequenceParam.setDataType(this.getAllDataType()); - contrastRegRes = sysRegResService.getContrastRegRes(); - phaseSequenceParam.setReadCount(this.getMaxReadCount(contrastRegRes.getRealTime())); + phaseSequenceParam.setReadCount(this.getMaxReadCount(FormalTestManager.curretntTestPlanConfig.getRealTime())); phaseSequenceParam.setIgnoreCount(0); socketMsg.setData(JSON.toJSONString(phaseSequenceParam)); @@ -775,7 +785,7 @@ public class SocketContrastResponseService { checkResult = false; } else { // 断开与设备的连接,但是不要将Socket移除 - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); } } } else if (successComm.size() == FormalTestManager.monitorMap.size()) { @@ -788,7 +798,7 @@ public class SocketContrastResponseService { webSend.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode()); //最终错误推送 WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); return; } } @@ -805,7 +815,7 @@ public class SocketContrastResponseService { break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -835,7 +845,7 @@ public class SocketContrastResponseService { String monitorId1 = devData.getId(); // 实时数据有效组数 - Integer realTime = contrastRegRes.getRealTime(); + Integer realTime = FormalTestManager.curretntTestPlanConfig.getRealTime(); //成功收到数据后重置超时统计时间 SocketManager.contrastClockMap.put(DataSourceEnum.REAL_DATA, 0L); if (Objects.isNull(scheduler)) { @@ -845,7 +855,7 @@ public class SocketContrastResponseService { System.out.println("正式检测-" + (long) Math.ceil(realTime / 5) + "分钟内收集数据不完整!"); // 断开与设备的连接,但是不要将Socket移除 - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); this.clearData(); @@ -902,12 +912,12 @@ public class SocketContrastResponseService { FormalTestManager.standardDevDataMap.get(standardDevMonitorId).addAll(singleMonitorAlignData.get(1)); if (successPair.keySet().containsAll(FormalTestManager.pairsIpMap.keySet())) { - isReceiveData = false; // 断开与设备的连接,但是不要将Socket移除 - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); checkResult = true; scheduledFuture.cancel(true); scheduler.shutdown(); + scheduler = null; String errorSysId = FormalTestManager.currentTestPlan.getErrorSysId(); String code = String.valueOf(FormalTestManager.currentTestPlan.getCode()); @@ -925,60 +935,86 @@ public class SocketContrastResponseService { adPairService.saveBatch(adPairList); // 原始数据入库 - baseDataInsert(false, FormalTestManager.devDataMap.values().stream().flatMap(List::stream).collect(Collectors.toList()), FormalTestManager.numMap, code); - baseDataInsert(true, FormalTestManager.standardDevDataMap.values().stream().flatMap(List::stream).collect(Collectors.toList()), FormalTestManager.numMap, code); + List devDataList = FormalTestManager.devDataMap.values().stream().flatMap(List::stream).collect(Collectors.toList()); + List standardDevDataList = FormalTestManager.standardDevDataMap.values().stream().flatMap(List::stream).collect(Collectors.toList()); + baseDataInsert(false, null, devDataList, FormalTestManager.numMap, code); + baseDataInsert(true, null, standardDevDataList, FormalTestManager.numMap, code); // 进行误差计算 List allResultList = detectionService.processing( - FormalTestManager.devDataMap.values().stream().flatMap(List::stream).collect(Collectors.toList()), - FormalTestManager.standardDevDataMap.values().stream().flatMap(List::stream).collect(Collectors.toList()), + devDataList, + standardDevDataList, FormalTestManager.pairsIpMap, FormalTestManager.devIdMapComm, FormalTestManager.testItemMap.keySet().stream().collect(Collectors.toList()), - errorSysId, FormalTestManager.dataRule, FormalTestManager.numMap, code); + errorSysId, FormalTestManager.dataRule, FormalTestManager.numMap, code, null); this.clearData(); - List adTypes = FormalTestManager.testItemMap.keySet().stream().collect(Collectors.toList()); -// Map result = detectionDataDealService.devResult(true, FormalTestManager.pairsIdMap.keySet().stream().collect(Collectors.toList()), adTypes, code); -// // 若有不符合的 + webSend.setData(JSON.toJSONString(allResultList)); + + List adTypes = FormalTestManager.testItemMap.values().stream().collect(Collectors.toList()); + Map result = detectionDataDealService.devResult(true, FormalTestManager.pairsIdMap.keySet().stream().collect(Collectors.toList()), adTypes, code); + // 若有不符合的 // if (result.values().stream().anyMatch(r -> r.equals(ResultEnum.NOT_QUALIFIED.getValue()))) { -// // 判断是否启用录波 -// String datasourceId = FormalTestManager.currentTestPlan.getDatasourceId(); -// if (datasourceId.contains(DataSourceEnum.WAVE_DATA.getValue())) { -// FormalTestManager.currentStep = SourceOperateCodeEnum.RECORD_WAVE; -// SocketMsg socketMsg = new SocketMsg<>(); -// socketMsg.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); -// socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_03.getValue()); -// Map> map = new HashMap<>(1); -// + if (true) { + // 最终将检测结果推送到前端 + webSend.setCode(SourceResponseCodeEnum.REAL_DATA_CHECK_FAIL.getCode());// 实时数据检测失败,最终错误推送 + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + + System.out.println("实时数据校验失败!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始录波》》》》》》》》》》》》》》》》"); + // 判断是否启用录波 + String datasourceId = FormalTestManager.currentTestPlan.getDatasourceId(); + if (datasourceId.contains(DataSourceEnum.WAVE_DATA.getValue())) { + SocketMsg socketMsg = new SocketMsg<>(); + socketMsg.setRequestId(SourceOperateCodeEnum.YJC_XYJY.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_03.getValue()); + Map> map = new HashMap<>(1); + +// Set delSet = new HashSet<>(); // for (int i = 0; i < FormalTestManager.devList.size(); i++) { // PreDetection preDetection = FormalTestManager.devList.get(i); -// -// } -// -// FormalTestManager.devList.stream().flatMap(obj -> obj.getMonitorList().stream()).forEach(monitor -> { -// String lineId = monitor.getLineId(); -// String[] split = lineId.split(CnSocketUtil.SPLIT_TAG); -// Integer i = result.get(FormalTestManager.devIdMapComm.get(split[1])); -// if (i.equals(ResultEnum.NOT_QUALIFIED.getValue())) { -// +// List monitorList = preDetection.getMonitorList(); +// for (int j = monitorList.size() - 1; j >= 0; j--) { +// String lineId = monitorList.get(j).getLineId(); +// String[] split = lineId.split(CnSocketUtil.SPLIT_TAG); +// Integer res = result.get(FormalTestManager.devIdMapComm.get(split[1])); +// if (res.equals(ResultEnum.NOT_QUALIFIED.getValue())) { +// monitorList.remove(j); +// delSet.add(lineId); +// FormalTestManager.monitorMap.remove(lineId); +// } // } -// }); -// -// map.put("deviceList", FormalTestManager.devList); -// String jsonString = JSON.toJSONString(map); -// socketMsg.setData(jsonString); -// SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); -// } -// } else { +// } +// for (int i = 0; i < FormalTestManager.standardDevList.size(); i++) { +// PreDetection preDetection = FormalTestManager.standardDevList.get(i); +// List monitorList = preDetection.getMonitorList(); +// for (int j = monitorList.size() - 1; j >= 0; j--) { +// String lineId = monitorList.get(j).getLineId(); +// String s1 = FormalTestManager.pairsIpMap.inverse().get(lineId); +// if (delSet.contains(s1)) { +// monitorList.remove(j); +// FormalTestManager.monitorMap.remove(lineId); +// } +// } +// } + + List preDetectionList = new ArrayList<>(); + preDetectionList.addAll(FormalTestManager.devList); + preDetectionList.addAll(FormalTestManager.standardDevList); + map.put("deviceList", preDetectionList); + String jsonString = JSON.toJSONString(map); + socketMsg.setData(jsonString); + SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); + FormalTestManager.currentStep = SourceOperateCodeEnum.RECORD_WAVE_STEP1; + } + } else { // 最终将检测结果推送到前端 webSend.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode());//最终成功推送 - webSend.setData(JSON.toJSONString(allResultList)); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); // 修改设备状态 pqDevService.updateResult(true, param.getDevIds(), adTypes, code, param.getUserId(), param.getTemperature(), param.getHumidity()); -// } + } } } } @@ -995,7 +1031,7 @@ public class SocketContrastResponseService { break; case RE_OPERATE: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); break; default: WebServiceManager.sendUnknownErrorMessage(param.getUserPageId()); @@ -1011,21 +1047,201 @@ public class SocketContrastResponseService { * @param socketDataMsg */ private void recordWave(PreDetectionParam param, SocketDataMsg socketDataMsg) { - String data = socketDataMsg.getData(); - DevData devData = JSON.parseObject(data, DevData.class); + String s = param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG; SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode()); - switch (Objects.requireNonNull(dictDataEnumByCode)) { case SUCCESS: - case NORMAL_RESPONSE: + if (FormalTestManager.currentStep == SourceOperateCodeEnum.RECORD_WAVE_STEP1 && socketDataMsg.getRequestId().equals(SourceOperateCodeEnum.YJC_XYJY.getValue())) { + String monitorId = socketDataMsg.getData(); + successComm.add(monitorId); + System.out.println("暂态协议申请成功测点个数:" + successComm.size() + "=====" + FormalTestManager.monitorMap.size()); + if (successComm.size() == FormalTestManager.monitorMap.size()) { + FormalTestManager.currentStep = SourceOperateCodeEnum.RECORD_WAVE_STEP2; + // 发送录波指令 + this.sendRecordWave(s); + + successComm.clear(); + failComm.clear(); + } + } else if (FormalTestManager.currentStep == SourceOperateCodeEnum.RECORD_WAVE_STEP2) { + WaveResultDTO waveResultDTO = JSON.parseObject(socketDataMsg.getData(), WaveResultDTO.class); + FormalTestManager.waveResultDTOMap.put(waveResultDTO.getId(), waveResultDTO); + successComm.add(waveResultDTO.getId()); + + + if (successComm.size() == FormalTestManager.monitorMap.size()) { + FormalTestManager.waveNum += 1; + scheduledFuture.cancel(true); + scheduler.shutdown(); + scheduler = null; + + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.RECORD_WAVE_STEP2.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_03.getValue()); + webSend.setCode(SourceResponseCodeEnum.SUCCESS.getCode()); + webSend.setData("第" + FormalTestManager.waveNum + "录波成功!"); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + + String errorSysId = FormalTestManager.currentTestPlan.getErrorSysId(); + String code = String.valueOf(FormalTestManager.currentTestPlan.getCode()); + + AtomicBoolean flag = new AtomicBoolean(false); + FormalTestManager.pairsIpMap.forEach((devMonitorId, stdDevMonitorId) -> { + if (FormalTestManager.waveResultDTOMap.containsKey(devMonitorId)) { + WaveResultDTO waveResultDTO1 = FormalTestManager.waveResultDTOMap.get(devMonitorId); + WaveResultDTO waveResultDTO2 = FormalTestManager.waveResultDTOMap.get(stdDevMonitorId); + PreDetection.MonitorListDTO monitorListDTO = FormalTestManager.monitorMap.get(devMonitorId); + List> lists = this.analyzeWaveFile(waveResultDTO1, waveResultDTO2, monitorListDTO, devMonitorId, stdDevMonitorId, FormalTestManager.testItemMap.keySet().stream().collect(Collectors.toList())); + + if (CollUtil.isNotEmpty(lists)) { + FormalTestManager.devDataMap.put(devMonitorId, lists.get(0)); + FormalTestManager.standardDevDataMap.put(stdDevMonitorId, lists.get(1)); + } else { + flag.set(true); + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(MsgUtil.getPairStr(devMonitorId, stdDevMonitorId, FormalTestManager.devNameMapComm) + " 录波对齐失败!"); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + } + } + }); + + if (!flag.get()) { + List devDataList = FormalTestManager.devDataMap.values().stream().flatMap(List::stream).collect(Collectors.toList()); + List standardDevDataList = FormalTestManager.standardDevDataMap.values().stream().flatMap(List::stream).collect(Collectors.toList()); + + // 原始数据入库 + baseDataInsert(false, FormalTestManager.waveNum, devDataList, FormalTestManager.numMap, code); + baseDataInsert(true, FormalTestManager.waveNum, standardDevDataList, FormalTestManager.numMap, code); + + // 进行误差计算 + List allResultList = detectionService.processing( + devDataList, + standardDevDataList, + FormalTestManager.pairsIpMap, + FormalTestManager.devIdMapComm, + FormalTestManager.testItemMap.keySet().stream().collect(Collectors.toList()), + errorSysId, DictDataEnum.Own_value, FormalTestManager.numMap, code, FormalTestManager.waveNum); + + Map> deviceIdMap = allResultList.stream().collect(Collectors.groupingBy(DevLineTestResult::getDeviceId, Collectors.toList())); + deviceIdMap.forEach((deviceId, devLineTestResultList) -> { + Map> chnMap = new HashMap<>(); + devLineTestResultList.forEach(devLineTestResult -> { + Integer[] chnResult = devLineTestResult.getChnResult(); // key为通道号,value为结果 + for (int i = 0; i < chnResult.length; i++) { + chnMap.putIfAbsent(i + 1, new HashSet<>()); + chnMap.get(i + 1).add(chnResult[i]); + } + }); + + DevLineTestResult devLineTestResult = new DevLineTestResult(); + devLineTestResult.setDeviceId(deviceId); + devLineTestResult.setDeviceName(FormalTestManager.devNameMapComm.get(deviceId)); + devLineTestResult.setScriptName(DataSourceEnum.WAVE_DATA.getValue()); + Integer[] chnResult = new Integer[chnMap.size()]; + chnMap.forEach((chn, resultSet) -> { + Integer result = detectionService.getInteger(resultSet.stream().collect(Collectors.toList())); + chnResult[chn - 1] = result; + }); + + DevLineTestResult devLineTestResult1 = FormalTestManager.preNumTestResultList.stream().filter(preNumTestResult -> preNumTestResult.getDeviceId().equals(deviceId)).findFirst().orElse(null); + if (ObjectUtil.isNotNull(devLineTestResult1)) { + Integer[] chnResult1 = devLineTestResult1.getChnResult(); + for (int i = 0; i < chnResult1.length; i++) { + Integer result = detectionService.getInteger(Arrays.asList(chnResult1[i], chnResult[i])); + chnResult1[i] = result; + } + } else { + devLineTestResult.setChnResult(chnResult); + FormalTestManager.preNumTestResultList.add(devLineTestResult); + } + }); + } else { + webSend.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode()); + webSend.setData("录波对齐失败!"); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + + // 断开与设备的连接,但是不要将Socket移除 + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, false); + } + + if (FormalTestManager.waveNum < FormalTestManager.curretntTestPlanConfig.getWaveRecord()) { + // 继续录波 + successComm.clear(); + failComm.clear(); + FormalTestManager.waveResultDTOMap.clear(); + + if (Objects.isNull(scheduler)) { + scheduler = Executors.newScheduledThreadPool(1); + scheduledFuture = scheduler.schedule(() -> { + + if (!FormalTestManager.isRemoveSocket) { + System.out.println("第" + (FormalTestManager.waveNum + 1) + "次录波开始"); + this.sendRecordWave(s); + } + + scheduler.shutdown(); + scheduler = null; + }, 40, TimeUnit.SECONDS); + } + } else { + // 断开与设备的连接,但是不要将Socket移除 + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, false); + + List adTypes = FormalTestManager.testItemMap.values().stream().collect(Collectors.toList()); + // 修改设备状态 + pqDevService.updateResult(true, param.getDevIds(), adTypes, code, param.getUserId(), param.getTemperature(), param.getHumidity()); + + // 最终将检测结果推送到前端 + webSend.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode()); + webSend.setData(JSON.toJSONString(FormalTestManager.preNumTestResultList)); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + } + successComm.clear(); + failComm.clear(); + } + } + case UNPROCESSED_BUSINESS: + if (FormalTestManager.currentStep == SourceOperateCodeEnum.RECORD_WAVE_STEP2) { + String data = socketDataMsg.getData(); + if (StrUtil.isNotBlank(data) && data.equals("waiting")) { + if (Objects.isNull(scheduler)) { + scheduler = Executors.newScheduledThreadPool(1); + scheduledFuture = scheduler.schedule(() -> { + SocketDataMsg webSend = new SocketDataMsg(); + webSend.setRequestId(SourceOperateCodeEnum.RECORD_WAVE_STEP2.getValue()); + webSend.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_03.getValue()); + System.out.println("无效的录波指令!"); + + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, true); + + Collection disjunction = CollectionUtil.disjunction(FormalTestManager.monitorMap.keySet(), successComm); + // 向前端推送 + for (String key : disjunction) { + webSend.setCode(SourceResponseCodeEnum.FAIL.getCode()); + webSend.setData(MsgUtil.getPairStr(key, FormalTestManager.pairsIpMap.inverse().get(key), FormalTestManager.devNameMapComm) + " 无效的录波指令!"); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + } + // 推送最终失败结果 + webSend.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode());//最终错误推送 + webSend.setData("无效的录波指令!"); + WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend)); + + scheduler.shutdown(); + scheduler = null; + }, 15, TimeUnit.SECONDS); + } + } + } + break; case RECORD_WAVE_FAILED: WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg)); - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, false); break; } } + /** * 退出检测返回 */ @@ -1038,6 +1254,7 @@ public class SocketContrastResponseService { case SUCCESS: switch (Objects.requireNonNull(operateCodeEnum)) { case QUIT_INIT_02: + case QUIT_INIT_03: if (FormalTestManager.isRemoveSocket) { SocketManager.removeUser(s); } @@ -1050,6 +1267,7 @@ public class SocketContrastResponseService { case NO_INIT_DEV: switch (operateCodeEnum) { case QUIT_INIT_02: + case QUIT_INIT_03: if (FormalTestManager.isRemoveSocket) { SocketManager.removeUser(s); } @@ -1068,7 +1286,7 @@ public class SocketContrastResponseService { if (successComm.size() + failComm.size() == FormalTestManager.monitorMap.size()) { //全部装置返回 if (!failComm.isEmpty()) { - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); WebSocketVO webSocketVO = new WebSocketVO<>(); webSocketVO.setRequestId(SourceOperateCodeEnum.ERROR_FLOW_END.getValue()); WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSocketVO)); @@ -1758,11 +1976,12 @@ public class SocketContrastResponseService { * 比对式原始数据入库 * * @param isStdDev 是否为标准设备 + * @param waveNum 第几次录波 * @param devDataList 原始数据 * @param numMap 第几次监测 key为被检设备监测点id,value为第几次监测 * @param code 表后缀code */ - private void baseDataInsert(boolean isStdDev, List devDataList, Map numMap, String code) { + private void baseDataInsert(boolean isStdDev, Integer waveNum, List devDataList, Map numMap, String code) { System.out.println("原始数据插入数据库开始执行========================================="); List contrastNonHarmonicResults = new ArrayList<>(); List contrastHarmonicResults = new ArrayList<>(); @@ -1786,14 +2005,18 @@ public class SocketContrastResponseService { } else { devInfo = pqDevService.getDevInfo(Collections.singletonList(devId)); } + Integer usePhaseIndex = devInfo.get(0).getUsePhaseIndex(); + + List allDesc = data.getSqlData().stream().map(x -> x.getDesc()).collect(Collectors.toList()); + allDesc.addAll(data.getSqlDataHarm().stream().map(x -> x.getDesc()).collect(Collectors.toList())); for (DevData.SqlDataDTO sqlDataDTO : data.getSqlData()) { - if (devInfo.get(0).getUsePhaseIndex().equals(1)) { - if (DetectionCodeEnum.PVRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PV2_50.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PSV_1_49.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PU1.getCode().equals(sqlDataDTO.getDesc())) { + if (usePhaseIndex.equals(1)) { + if (DetectionCodeEnum.PVRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PU1.getCode().equals(sqlDataDTO.getDesc())) { continue; } } else { - if (DetectionCodeEnum.VRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.V2_50.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.SV_1_49.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.U1.getCode().equals(sqlDataDTO.getDesc())) { + if (DetectionCodeEnum.VRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.U1.getCode().equals(sqlDataDTO.getDesc())) { continue; } } @@ -1814,6 +2037,7 @@ public class SocketContrastResponseService { adNonHarmonicResult.setStdDevMonitorId(FormalTestManager.pairsIdMap.get(temId)); adNonHarmonicResult.setFlag(0); } + adNonHarmonicResult.setWaveNum(waveNum); Double a = listDTO.getA(); Double b = listDTO.getB(); @@ -1836,6 +2060,16 @@ public class SocketContrastResponseService { } for (int j = 0; j < data.getSqlDataHarm().size(); j++) { DevData.SqlDataHarmDTO sqlDataDTO = data.getSqlDataHarm().get(j); + if (usePhaseIndex.equals(1)) { + if (DetectionCodeEnum.PV2_50.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PSV_1_49.getCode().equals(sqlDataDTO.getDesc())) { + continue; + } + } else { + if (DetectionCodeEnum.V2_50.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.SV_1_49.getCode().equals(sqlDataDTO.getDesc())) { + continue; + } + } + String dui = harmonicRelationMap.get(sqlDataDTO.getDesc()); ContrastHarmonicResult adHarmonicResult = new ContrastHarmonicResult(); adHarmonicResult.setTimeId(localDateTime); @@ -1851,6 +2085,7 @@ public class SocketContrastResponseService { adHarmonicResult.setStdDevMonitorId(FormalTestManager.pairsIdMap.get(temId)); adHarmonicResult.setFlag(0); } + adHarmonicResult.setWaveNum(waveNum); if (ObjectUtil.isNotNull(dui)) { DevData.SqlDataDTO.ListDTO vvv = data.getSqlData().stream().filter(it -> it.getDesc().equals(dui)).collect(Collectors.toList()).get(0).getList(); @@ -1920,34 +2155,378 @@ public class SocketContrastResponseService { } } -// if (CollUtil.isNotEmpty(contrastNonHarmonicResults)) { -// Map> map = contrastNonHarmonicResults.stream().collect(Collectors.groupingBy(x -> x.getDevMonitorId() + x.getTimeId() + x.getNum() + x.getAdType())); -// List info = new ArrayList<>(); -// map.forEach((key, value) -> { -// if (value.size() > 1) { -// System.err.println("重复时间戳->" + key + value); -// } else { -// info.addAll(value); -// } -// }); -// -// detectionDataDealService.acceptNonHarmonic(info, code); -// } -// if (CollUtil.isNotEmpty(contrastHarmonicResults)) { -// Map> map = contrastHarmonicResults.stream().collect(Collectors.groupingBy(x -> x.getDevMonitorId() + x.getTimeId() + x.getNum() + x.getAdType())); -// List info = new ArrayList<>(); -// map.forEach((key, value) -> { -// if (value.size() > 1) { -// System.err.println("重复时间戳->" + key + value); -// } else { -// info.addAll(value); -// } -// }); -// detectionDataDealService.acceptHarmonic(info, code); -// } detectionDataDealService.acceptNonHarmonic(contrastNonHarmonicResults, code); detectionDataDealService.acceptHarmonic(contrastHarmonicResults, code); System.out.println("原始数据插入数据库执行成功========================================="); } + /** + * 发送录波指令 + * + * @param s + */ + private void sendRecordWave(String s) { + SocketMsg socketMsg = new SocketMsg<>(); + socketMsg.setRequestId(SourceOperateCodeEnum.RECORD_WAVE_STEP2.getValue()); + socketMsg.setOperateCode(SourceOperateCodeEnum.RDRE$01.getValue()); + Map> map = new HashMap<>(1); + + List waveCommandDTOList = new ArrayList<>(); + FormalTestManager.devList.forEach(preDetection -> { + preDetection.getMonitorList().forEach(monitorListDTO -> { + WaveCommandDTO waveCommandDTO = new WaveCommandDTO(); + waveCommandDTO.setIp(preDetection.getDevIP()); + waveCommandDTO.setPort(preDetection.getPort()); + waveCommandDTO.setOper("RDRE1$CO$RcdTrg$Oper"); + waveCommandDTO.setLine(monitorListDTO.getLine()); + waveCommandDTOList.add(waveCommandDTO); + }); + }); + FormalTestManager.standardDevList.forEach(preDetection -> { + preDetection.getMonitorList().forEach(monitorListDTO -> { + WaveCommandDTO waveCommandDTO = new WaveCommandDTO(); + waveCommandDTO.setIp(preDetection.getDevIP()); + waveCommandDTO.setPort(preDetection.getPort()); + waveCommandDTO.setOper("RDRE1$CO$RcdTrg$Oper"); + waveCommandDTO.setLine(monitorListDTO.getLine()); + waveCommandDTOList.add(waveCommandDTO); + }); + }); + + map.put("opercommands", waveCommandDTOList); + socketMsg.setData(JSON.toJSONString(map)); + SocketManager.sendMsg(s, JSON.toJSONString(socketMsg)); + } + + private List> analyzeWaveFile(WaveResultDTO devWaveResultDTO, WaveResultDTO stdDevWaveResultDTO, PreDetection.MonitorListDTO monitorListDTO, String devMonitorId, String stdDevMonitorId, List adTypeCodeList) { +// String stdDevCfgPath = stdDevWaveResultDTO.getPath().replaceAll("\\\\", "/").replace(".CFG",".cfg"); +// String devCfgPath = devWaveResultDTO.getPath().replaceAll("\\\\", "/").replace(".CFG",".cfg"); + + String stdDevCfgPath = "D:\\数据比对\\统计数据1\\B码\\216\\PQMonitor_PQM1_000001_20200430_113404_845.cfg"; + String stdDevDatPath = stdDevCfgPath.replaceAll(".cfg", ".dat"); + String devCfgPath = "D:\\数据比对\\统计数据1\\B码\\217\\PQMonitor_PQM1_000001_20200430_113407_075.cfg"; + String devDatPath = devCfgPath.replaceAll(".cfg", ".dat"); + + // 验证文件是否存在 + DetectionUtil.checkFileExists(stdDevCfgPath, "源CFG文件"); + DetectionUtil.checkFileExists(stdDevDatPath, "源DAT文件"); + DetectionUtil.checkFileExists(devCfgPath, "目标CFG文件"); + DetectionUtil.checkFileExists(devDatPath, "目标DAT文件"); + + boolean isStar = DetectionCodeEnum.STAR.getCode().equals(monitorListDTO.getConnection()); + boolean isDelta = DetectionCodeEnum.DELTA.getCode().equals(monitorListDTO.getConnection()); + + // 读取本地文件并创建输入流 + try (InputStream sourceCfgStream = new FileInputStream(stdDevCfgPath); + InputStream sourceDatStream = new FileInputStream(stdDevDatPath); + InputStream targetCfgStream = new FileInputStream(devCfgPath); + InputStream targetDatStream = new FileInputStream(devDatPath)) { + + CompareWaveDTO compareWaveDTO = compareWaveService.analyzeAndCompareWithStreams( + sourceCfgStream, + sourceDatStream, + targetCfgStream, + targetDatStream, + isStar ? 0 : isDelta ? 1 : 2); + if (ObjectUtil.isNotNull(compareWaveDTO) && ObjectUtil.isNotNull(compareWaveDTO.getSourceResults()) && ObjectUtil.isNotNull(compareWaveDTO.getTargetResults())) { + return this.getDevData(compareWaveDTO.getSourceResults(), compareWaveDTO.getTargetResults(), devMonitorId, stdDevMonitorId, adTypeCodeList); + } else { + return null; + } + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 根据解析波形文件后的数据转换成可以进行入库、误差计算的DevData对象 + * + * @param sourceDataList 被检设备数据 + * @param targetDataList 标准设备数据 + * @return 下标为0的是被检设备数据,下标为1的是标准设备数据 + */ + private List> getDevData(List sourceDataList, List targetDataList, String devMonitorId, String stdDevMonitorId, List adTypeCodeList) { + List> result = new ArrayList<>(); + List devDataList = new ArrayList<>(); + List stdDevDataList = new ArrayList<>(); + int dataPoints = Math.min(sourceDataList.size(), targetDataList.size()); + for (int i = 0; i < dataPoints; i++) { + devDataList.add(getSinglePointDevData(sourceDataList.get(i), devMonitorId, adTypeCodeList)); + stdDevDataList.add(getSinglePointDevData(targetDataList.get(i), stdDevMonitorId, adTypeCodeList)); + } + result.add(devDataList); + result.add(stdDevDataList); + return result; + } + + /** + * 获取单个窗口的原始数据 + * + * @param pointDevData + * @param monitorId + * @param adTypeCodeList + * @return + */ + private DevData getSinglePointDevData(PqsDataStruct pointDevData, String monitorId, List adTypeCodeList) { + DevData devData = new DevData(); + devData.setId(monitorId); + devData.setTime(pointDevData.getClocktime().format()); + List sqlDataDTOS = new ArrayList<>(); + List sqlDataHarmDTOS = new ArrayList<>(); + + DevData.SqlDataDTO sqlDataDTO = null; + DevData.SqlDataDTO.ListDTO listDTO = null; + + DevData.SqlDataHarmDTO sqlDataHarmDTOV = null; + DevData.SqlDataHarmDTO.ListDTO listDTOHarmV = null; + + Double u1A = null; + Double u1B = null; + Double u1C = null; + + List aListV = null; + List bListV = null; + List cListV = null; + List aListI = null; + List bListI = null; + List cListI = null; + + for (String adTypeCode : adTypeCodeList) { + String code = adTypeCode.replace(DetectionCodeEnum.REAL_PREFIX.getCode(), ""); + DetectionCodeEnum detectionCodeEnum = DetectionCodeEnum.getDetectionCodeByCode(code); + switch (detectionCodeEnum) { + case FREQ: + // 频率 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.FREQ.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + listDTO.setT((double) pointDevData.getFreq()[0]); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + break; + case VRMS: + // 相电压有效值 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.VRMS.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + listDTO.setA((double) pointDevData.getRms()[0]); + listDTO.setB((double) pointDevData.getRms()[1]); + listDTO.setC((double) pointDevData.getRms()[2]); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + break; + case PVRMS: + // 线电压有效值 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.PVRMS.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + listDTO.setA((double) pointDevData.getRms()[6]); + listDTO.setB((double) pointDevData.getRms()[7]); + listDTO.setC((double) pointDevData.getRms()[8]); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + break; + case IRMS: + // 相电流有效值 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.IRMS.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + listDTO.setA((double) pointDevData.getRms()[3]); + listDTO.setB((double) pointDevData.getRms()[4]); + listDTO.setC((double) pointDevData.getRms()[5]); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + break; + case V_UNBAN: + // 三项电压不平衡度 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.V_UNBAN.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + listDTO.setB((double) pointDevData.getUiSeq()[0][4]); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + break; + case I_UNBAN: + // 三项电流不平衡度 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.I_UNBAN.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + listDTO.setB((double) pointDevData.getUiSeq()[1][4]); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + break; + case V2_50: + // 谐波电压含有率 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.U1.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + u1A = (double) pointDevData.getFuHarm()[0][0]; + u1B = (double) pointDevData.getFuHarm()[1][0]; + u1C = (double) pointDevData.getFuHarm()[2][0]; + listDTO.setA(u1A); + listDTO.setB(u1B); + listDTO.setC(u1C); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + + sqlDataHarmDTOV = new DevData.SqlDataHarmDTO(); + sqlDataHarmDTOV.setDesc(DetectionCodeEnum.V2_50.getCode()); + sqlDataHarmDTOV.setType("real"); + listDTOHarmV = new DevData.SqlDataHarmDTO.ListDTO(); + + aListV = new ArrayList<>(); + bListV = new ArrayList<>(); + cListV = new ArrayList<>(); + // 前50次谐波 + for (int harm = 1; harm < 50; harm++) { + // 谐波电压 + aListV.add(String.format("%.7f", pointDevData.getFuHarmCON()[0][harm])); + bListV.add(String.format("%.7f", pointDevData.getFuHarmCON()[1][harm])); + cListV.add(String.format("%.7f", pointDevData.getFuHarmCON()[2][harm])); + } + listDTOHarmV.setA(aListV); + listDTOHarmV.setB(bListV); + listDTOHarmV.setC(cListV); + + sqlDataHarmDTOV.setList(listDTOHarmV); + sqlDataHarmDTOS.add(sqlDataHarmDTOV); + case PV2_50: + break; + case I2_50: + // 谐波电流幅值 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.I1.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + listDTO.setA((double) pointDevData.getFuHarm()[3][0]); + listDTO.setB((double) pointDevData.getFuHarm()[4][0]); + listDTO.setC((double) pointDevData.getFuHarm()[5][0]); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + + DevData.SqlDataHarmDTO sqlDataHarmDTOI = new DevData.SqlDataHarmDTO(); + sqlDataHarmDTOI.setDesc(DetectionCodeEnum.I2_50.getCode()); + sqlDataHarmDTOI.setType("real"); + DevData.SqlDataHarmDTO.ListDTO listDTOHarmI = new DevData.SqlDataHarmDTO.ListDTO(); + + aListI = new ArrayList<>(); + bListI = new ArrayList<>(); + cListI = new ArrayList<>(); + + // 前50次谐波 + for (int harm = 1; harm < 50; harm++) { + // 谐波电流 + aListI.add(String.format("%.7f", pointDevData.getFuHarm()[3][harm])); + bListI.add(String.format("%.7f", pointDevData.getFuHarm()[4][harm])); + cListI.add(String.format("%.7f", pointDevData.getFuHarm()[5][harm])); + } + listDTOHarmI.setA(aListI); + listDTOHarmI.setB(bListI); + listDTOHarmI.setC(cListI); + + sqlDataHarmDTOI.setList(listDTOHarmI); + sqlDataHarmDTOS.add(sqlDataHarmDTOI); + break; + case P2_50: + // 谐波有功功率 +// DevData.SqlDataHarmDTO sqlDataHarmDTOP2_50 = new DevData.SqlDataHarmDTO(); +// sqlDataHarmDTOP2_50.setDesc(DetectionCodeEnum.P2_50.getCode()); +// sqlDataHarmDTOP2_50.setType("real"); +// listDTOHarmV = new DevData.SqlDataHarmDTO.ListDTO(); +// +// List aListP2_50 = new ArrayList<>(); +// List bListP2_50 = new ArrayList<>(); +// List cListP2_50 = new ArrayList<>(); +// for (int harm = 0; harm < 50; harm++) { +// aListP2_50.add(String.format("%.7f", pointDevData.getHarmP()[0][harm])); +// bListP2_50.add(String.format("%.7f", pointDevData.getHarmP()[1][harm])); +// cListP2_50.add(String.format("%.7f", pointDevData.getHarmP()[2][harm])); +// } +// listDTOHarmV.setA(aListP2_50); +// listDTOHarmV.setB(bListP2_50); +// listDTOHarmV.setC(cListP2_50); +// sqlDataHarmDTOP2_50.setList(listDTOHarmV); +// sqlDataHarmDTOS.add(sqlDataHarmDTOP2_50); + break; + case SV_1_49: + // 间谐波电压含有率 + sqlDataDTO = new DevData.SqlDataDTO(); + sqlDataDTO.setDesc(DetectionCodeEnum.U1.getCode()); + sqlDataDTO.setType("real"); + listDTO = new DevData.SqlDataDTO.ListDTO(); + u1A = (double) pointDevData.getFuHarm()[0][0]; + u1B = (double) pointDevData.getFuHarm()[1][0]; + u1C = (double) pointDevData.getFuHarm()[2][0]; + listDTO.setA(u1A); + listDTO.setB(u1B); + listDTO.setC(u1C); + sqlDataDTO.setList(listDTO); + sqlDataDTOS.add(sqlDataDTO); + + sqlDataHarmDTOV = new DevData.SqlDataHarmDTO(); + sqlDataHarmDTOV.setDesc(DetectionCodeEnum.SV_1_49.getCode()); + sqlDataHarmDTOV.setType("real"); + listDTOHarmV = new DevData.SqlDataHarmDTO.ListDTO(); + + aListV = new ArrayList<>(); + bListV = new ArrayList<>(); + cListV = new ArrayList<>(); + // 前50次间谐波 + for (int harm = 0; harm < 50; harm++) { + // 间谐波电压 + aListV.add(String.format("%.7f", pointDevData.getInHarmCON()[0][harm])); + bListV.add(String.format("%.7f", pointDevData.getInHarmCON()[1][harm])); + cListV.add(String.format("%.7f", pointDevData.getInHarmCON()[2][harm])); + } + listDTOHarmV.setA(aListV); + listDTOHarmV.setB(bListV); + listDTOHarmV.setC(cListV); + + sqlDataHarmDTOV.setList(listDTOHarmV); + sqlDataHarmDTOS.add(sqlDataHarmDTOV); + case PSV_1_49: + break; + case SI_1_49: + // 间谐波电流幅值 + sqlDataHarmDTOI = new DevData.SqlDataHarmDTO(); + sqlDataHarmDTOI.setDesc(DetectionCodeEnum.SI_1_49.getCode()); + sqlDataHarmDTOI.setType("real"); + listDTOHarmI = new DevData.SqlDataHarmDTO.ListDTO(); + + aListI = new ArrayList<>(); + bListI = new ArrayList<>(); + cListI = new ArrayList<>(); + + // 前50次间谐波 + for (int harm = 0; harm < 50; harm++) { + // 间谐波电流 + aListI.add(String.format("%.7f", pointDevData.getInHarm()[3][harm])); + bListI.add(String.format("%.7f", pointDevData.getInHarm()[4][harm])); + cListI.add(String.format("%.7f", pointDevData.getInHarm()[5][harm])); + } + listDTOHarmI.setA(aListI); + listDTOHarmI.setB(bListI); + listDTOHarmI.setC(cListI); + + sqlDataHarmDTOI.setList(listDTOHarmI); + sqlDataHarmDTOS.add(sqlDataHarmDTOI); + break; + case UNKNOWN_ERROR: + break; + } + } + + devData.setSqlData(sqlDataDTOS); + devData.setSqlDataHarm(sqlDataHarmDTOS); + return devData; + } } diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/dto/WaveCommandDTO.java b/detection/src/main/java/com/njcn/gather/detection/pojo/dto/WaveCommandDTO.java new file mode 100644 index 00000000..3845818b --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/dto/WaveCommandDTO.java @@ -0,0 +1,18 @@ +package com.njcn.gather.detection.pojo.dto; + +import lombok.Data; + +/** + * @author caozehui + * @data 2025-09-01 + */ +@Data +public class WaveCommandDTO { + private String ip; + + private Integer port; + + private String oper; + + private Integer line; +} diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/dto/WaveResultDTO.java b/detection/src/main/java/com/njcn/gather/detection/pojo/dto/WaveResultDTO.java new file mode 100644 index 00000000..2dcef9a2 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/dto/WaveResultDTO.java @@ -0,0 +1,14 @@ +package com.njcn.gather.detection.pojo.dto; + +import lombok.Data; + +/** + * @author caozehui + * @data 2025-09-01 + */ +@Data +public class WaveResultDTO { + private String id; + + private String path; +} diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceOperateCodeEnum.java b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceOperateCodeEnum.java index 2ee94aa8..bc0c6013 100644 --- a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceOperateCodeEnum.java +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceOperateCodeEnum.java @@ -51,7 +51,8 @@ public enum SourceOperateCodeEnum { YJC_ALIGN("yjc_align","实时数据对齐校验"), YJC_MXYZXJY("yjc_mxyzxjy", "模型一致性校验"), FORMAL_REAL("formal_real","正式检测"), - RECORD_WAVE("record_wave","启动录波"), + RECORD_WAVE_STEP1("record_wave_step1","启动录波_step1"), + RECORD_WAVE_STEP2("record_wave_step2","启动录波_step2"), // SIMULATE_REAL("simulate_real","模拟检测"), Coefficient_Check("Coefficient_Check","系数校验"), QUITE("quit","关闭设备通讯初始化"), @@ -101,7 +102,8 @@ public enum SourceOperateCodeEnum { /** * ftp文件传送指令 */ - FTP_SEND_01("FTP_SEND$01", "发送文件"),; + FTP_SEND_01("FTP_SEND$01", "发送文件"), + RDRE$01("RDRE$01", "启动录波"); private final String value; private final String msg; diff --git a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceResponseCodeEnum.java b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceResponseCodeEnum.java index 718cd9b5..8d24dcd2 100644 --- a/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceResponseCodeEnum.java +++ b/detection/src/main/java/com/njcn/gather/detection/pojo/enums/SourceResponseCodeEnum.java @@ -41,7 +41,8 @@ public enum SourceResponseCodeEnum { ALL_SUCCESS(25001,"校验成功"), FAIL(25002,"失败"), ALL_FAIL(25003,"校验失败"), - RECEIVE_DATA_TIME_OUT(25004,"接收数据超时") + RECEIVE_DATA_TIME_OUT(25004,"接收数据超时"), + REAL_DATA_CHECK_FAIL(25005,"实时数据校验失败") 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 651e00d5..a3f06158 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 @@ -838,7 +838,7 @@ public class DetectionServiceImpl { return getInteger(isData); } - private static Integer getInteger(List isData) { + public Integer getInteger(List isData) { if (CollUtil.isNotEmpty(isData)) { List isQualified = isData.stream().filter(x -> ResultEnum.QUALIFIED.getValue() == x || ResultEnum.NOT_QUALIFIED.getValue() == x).collect(Collectors.toList()); if (CollUtil.isNotEmpty(isQualified)) { @@ -1524,9 +1524,10 @@ public class DetectionServiceImpl { * @param dataRule 数据处理原则 * @param numMap 第几次检测 key为设备id_通道号,value为第几次检测 * @param code 结果表code + * @param waveNum 第几次录波 * @return key为被检设备ip_通道号、value为是否合格(1合格 2不合格 4无法处理) */ - public List processing(List devDataList, List standardDevDataList, Map parsIp, Map devIdMapComm, List testItemCodeList, String errorSysId, DictDataEnum dataRule, Map numMap, String code) { + public List processing(List devDataList, List standardDevDataList, Map parsIp, Map devIdMapComm, List testItemCodeList, String errorSysId, DictDataEnum dataRule, Map numMap, String code, Integer waveNum) { Map> devDataMap = devDataList.stream().collect(Collectors.groupingBy(obj -> obj.getId().split("_")[0])); Map> standardDevDataMap = standardDevDataList.stream().collect(Collectors.groupingBy(DevData::getId)); @@ -1541,7 +1542,7 @@ public class DetectionServiceImpl { Map> chnResultMap = new HashMap<>(); devMonitorMap.forEach((devMoniterId, devData) -> { String[] split = devMoniterId.split(CnSocketUtil.SPLIT_TAG); - Map map = singleMonitorProcessing(devData, standardDevDataMap.get(parsIp.get(devMoniterId)), devIdMapComm, testItemCodeList, errorSysId, dataRule, numMap.get(devId + CnSocketUtil.SPLIT_TAG + split[1]), code); + Map map = singleMonitorProcessing(devData, standardDevDataMap.get(parsIp.get(devMoniterId)), devIdMapComm, testItemCodeList, errorSysId, dataRule, numMap.get(devId + CnSocketUtil.SPLIT_TAG + split[1]), code, waveNum); map.forEach((key, value) -> { DevLineTestResult devLineTestResult = new DevLineTestResult(); devLineTestResult.setDeviceId(devId); @@ -1575,9 +1576,10 @@ public class DetectionServiceImpl { * @param dataRule 数据处理原则 * @param num 第几次检测 * @param code 结果表code + * @param waveNum 第几次录波 * @return */ - private Map singleMonitorProcessing(List devDataList, List standardDevDataList, Map devIdMapComm, List testItemCodeList, String errorSysId, DictDataEnum dataRule, Integer num, String code) { + private Map singleMonitorProcessing(List devDataList, List standardDevDataList, Map devIdMapComm, List testItemCodeList, String errorSysId, DictDataEnum dataRule, Integer num, String code, Integer waveNum) { Map resultMap = new HashMap<>(); if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(testItemCodeList)) { SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); @@ -1618,41 +1620,38 @@ public class DetectionServiceImpl { switch (anEnum) { case FREQ: - resultMap.put(PowerIndexEnum.FREQ.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, 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(), waveNum)); break; case VRMS: case PVRMS: // 如果是角型接法且存在角型接法的一些指标,则不进行使用角型接线的指标。反之,则使用相别的指标。 - resultMap.put(PowerIndexEnum.V.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn, (isDelta && isExitDelta ? DetectionCodeEnum.PVRMS.getCode() : DetectionCodeEnum.VRMS.getCode()), dataRule, num, code, oneConfig.getScale())); + resultMap.put(PowerIndexEnum.V.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn, (isDelta && isExitDelta ? DetectionCodeEnum.PVRMS.getCode() : DetectionCodeEnum.VRMS.getCode()), dataRule, num, code, oneConfig.getScale(), waveNum)); break; case IRMS: - resultMap.put(PowerIndexEnum.I.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, 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(), waveNum)); 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, false, fUn, DetectionCodeEnum.V_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale())); + resultMap.put(PowerIndexEnum.IMBV.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, false, fUn, DetectionCodeEnum.V_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum)); break; case I_UNBAN: - resultMap.put(PowerIndexEnum.IMBA.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, false, fIn, DetectionCodeEnum.I_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale())); + resultMap.put(PowerIndexEnum.IMBA.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, false, fIn, DetectionCodeEnum.I_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum)); break; case V2_50: case PV2_50: - resultMap.put(PowerIndexEnum.HV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale())); + resultMap.put(PowerIndexEnum.HV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum)); break; case I2_50: - resultMap.put(PowerIndexEnum.HI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale())); + resultMap.put(PowerIndexEnum.HI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum)); break; case P2_50: - resultMap.put(PowerIndexEnum.HP.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, HP, fUn * fIn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale())); + resultMap.put(PowerIndexEnum.HP.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, HP, fUn * fIn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum)); break; case SV_1_49: case PSV_1_49: - resultMap.put(PowerIndexEnum.HSV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale())); + resultMap.put(PowerIndexEnum.HSV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum)); break; case SI_1_49: - resultMap.put(PowerIndexEnum.HSI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale())); + resultMap.put(PowerIndexEnum.HSI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum)); break; case UNKNOWN_ERROR: break; @@ -1669,7 +1668,7 @@ public class DetectionServiceImpl { * @param devDataList 监测点数据 * @return */ - private boolean isExitDeltaIndex(String devId, List devDataList) { + public boolean isExitDeltaIndex(String devId, List devDataList) { if (CollUtil.isNotEmpty(devDataList)) { List deltaIndex = Arrays.asList(DetectionCodeEnum.PVRMS.getCode(), DetectionCodeEnum.PV2_50.getCode(), @@ -1710,6 +1709,7 @@ public class DetectionServiceImpl { * @param num 第几次检测 * @param code 结果表code * @param scale 小数点位数 + * @param waveNum 第几次录波 * @return */ private Integer isQualified(List devDataList, @@ -1722,12 +1722,14 @@ public class DetectionServiceImpl { DictDataEnum dataRule, Integer num, String code, - Integer scale) { + Integer scale, + Integer waveNum) { 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(); + result.setWaveNum(waveNum); String[] split1 = devDataList.get(0).getId().split(CnSocketUtil.SPLIT_TAG); String[] split2 = standardDevDataList.get(0).getId().split(CnSocketUtil.SPLIT_TAG); @@ -1738,7 +1740,7 @@ public class DetectionServiceImpl { result.setDataType(DataSourceEnum.REAL_DATA.getValue()); if (map.containsKey(TYPE_T)) { - List tList = rangeComparisonList(map.get(TYPE_T).get(0), map.get(TYPE_T).get(1), errSysDtls, fData, scale); + List tList = rangeComparisonList(map.get(TYPE_T).get(0), map.get(TYPE_T).get(1), errSysDtls, fData, scale, dataRule); result.setTValue(JSON.toJSONString(tList)); result.setResultFlag(setResultFlag(tList)); } else { @@ -1755,7 +1757,7 @@ public class DetectionServiceImpl { phases.add(TYPE_B); for (String phase : phases) { - List phaseList = rangeComparisonList(map.get(phase).get(0), map.get(phase).get(1), errSysDtls, fData, scale); + List phaseList = rangeComparisonList(map.get(phase).get(0), map.get(phase).get(1), errSysDtls, fData, scale, dataRule); resultFlag.addAll(phaseList); BiConsumer> setter = setters.get(phase); setter.accept(result, phaseList); @@ -1786,6 +1788,7 @@ public class DetectionServiceImpl { * @param num 第几次检测 * @param code 结果表code * @param scale 小数点位数 + * @param waveNum 第几次录波 * @return */ public Integer isHarmQualified(List devDataList, @@ -1799,7 +1802,8 @@ public class DetectionServiceImpl { DictDataEnum dataRule, Integer num, String code, - Integer scale) { + Integer scale, + Integer waveNum) { List info = new ArrayList<>(); if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(errSysDtls)) { String fundCode = ""; @@ -1836,6 +1840,7 @@ public class DetectionServiceImpl { Map>>> devMap = devHarmListMap(devDataList, standardDevDataList, fundCode, harmCode, harmonicFlag, dataRule); ContrastHarmonicResult result = new ContrastHarmonicResult(); + result.setWaveNum(waveNum); String[] split1 = devDataList.get(0).getId().split("_"); String[] split2 = standardDevDataList.get(0).getId().split("_"); @@ -1845,9 +1850,9 @@ public class DetectionServiceImpl { result.setAdType(errSysDtls.get(0).getScriptType()); result.setDataType(DataSourceEnum.REAL_DATA.getValue()); - 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); + List integerBooleanA = harmRangeComparison(devMap.get(TYPE_A).get(0), devMap.get(TYPE_A).get(1), errSysDtls, type, fData, scale, dataRule); + List integerBooleanB = harmRangeComparison(devMap.get(TYPE_B).get(0), devMap.get(TYPE_A).get(1), errSysDtls, type, fData, scale, dataRule); + List integerBooleanC = harmRangeComparison(devMap.get(TYPE_C).get(0), devMap.get(TYPE_A).get(1), errSysDtls, type, fData, scale, dataRule); reflectHarmonic(true, "a", integerBooleanA, result, harmonicFlag); reflectHarmonic(true, "b", integerBooleanB, result, harmonicFlag); reflectHarmonic(true, "c", integerBooleanC, result, harmonicFlag); @@ -1963,21 +1968,29 @@ public class DetectionServiceImpl { } break; case CP95_VALUE: - int cp95Idx = DetectionUtil.getCP95Idx(aDev); - aDev = Collections.singletonList(aDev.get(cp95Idx)); - aStandardDev = Collections.singletonList(aStandardDev.get(cp95Idx)); + if (CollUtil.isNotEmpty(aDev)) { + int cp95Idx = DetectionUtil.getCP95Idx(aDev); + aDev = Collections.singletonList(aDev.get(cp95Idx)); + aStandardDev = Collections.singletonList(aStandardDev.get(cp95Idx)); + } + if (CollUtil.isNotEmpty(bDev)) { + int 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)); + if (CollUtil.isNotEmpty(cDev)) { + int 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)); + if (CollUtil.isNotEmpty(tDev)) { + int cp95Idx = DetectionUtil.getCP95Idx(tDev); + tDev = Collections.singletonList(tDev.get(cp95Idx)); + tStandardDev = Collections.singletonList(tStandardDev.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); @@ -2129,12 +2142,15 @@ public class DetectionServiceImpl { } break; case CP95_VALUE: - int cp95Idx = DetectionUtil.getCP95Idx(value); - value.clear(); - value.addAll(Collections.singletonList(value.get(cp95Idx))); - Double standardCP95Data = standardDevMap.get(typeKey).get(key).get(cp95Idx); - standardDevMap.get(typeKey).get(key).clear(); - standardDevMap.get(typeKey).get(key).add(standardCP95Data); + if (CollUtil.isNotEmpty(value)) { + int cp95Idx = DetectionUtil.getCP95Idx(value); + List newValue = Collections.singletonList(value.get(cp95Idx)); + value.clear(); + value.addAll(newValue); + Double standardCP95Data = standardDevMap.get(typeKey).get(key).get(cp95Idx); + standardDevMap.get(typeKey).get(key).clear(); + standardDevMap.get(typeKey).get(key).add(standardCP95Data); + } break; case AVG_VALUE: List avgDoubles = DetectionUtil.getAvgDoubles(value); @@ -2163,14 +2179,16 @@ public class DetectionServiceImpl { * @param pqErrSysDtls 误差体系 * @param fData 额定值 * @param scale 小数点精度 + * @param dataRule 数据处理原则 * @return */ public List rangeComparisonList(List devDataList, List standardDevDataList, List pqErrSysDtls, Double fData, - Integer scale) { - return this.getDetectionDataList(devDataList, standardDevDataList, null, pqErrSysDtls, fData, null, scale); + Integer scale, + DictDataEnum dataRule) { + return this.getDetectionDataList(devDataList, standardDevDataList, null, pqErrSysDtls, fData, null, scale, dataRule); } /** @@ -2182,6 +2200,7 @@ public class DetectionServiceImpl { * @param type U或者I或者HP * @param fData 额定值 * @param scale 小数点精度 + * @param dataRule 数据处理原则 * @return */ public List harmRangeComparison(Map> devMap, @@ -2189,7 +2208,8 @@ public class DetectionServiceImpl { List pqErrSysDtls, String type, Double fData, - Integer scale) { + Integer scale, + DictDataEnum dataRule) { List detectionDataList = new ArrayList<>(); List U1List = new ArrayList<>(); if (U.equals(type)) { @@ -2197,7 +2217,7 @@ public class DetectionServiceImpl { } standardDevMap.forEach((harmonicNum, stdDataList) -> { if (harmonicNum != 0.0) { - detectionDataList.addAll(this.getDetectionDataList(devMap.get(harmonicNum), stdDataList, U1List, pqErrSysDtls, fData, harmonicNum, scale)); + detectionDataList.addAll(this.getDetectionDataList(devMap.get(harmonicNum), stdDataList, U1List, pqErrSysDtls, fData, harmonicNum, scale, dataRule)); } }); return detectionDataList; @@ -2213,10 +2233,12 @@ public class DetectionServiceImpl { * @param fData 额定值 * @param harmonicNum (间)谐波次数 * @param scale 小数点精度 + * @param dataRule 数据处理原则 * @return */ - private List getDetectionDataList(List devDataList, List standardDevDataList, List U1List, List pqErrSysDtls, Double fData, Double harmonicNum, Integer scale) { + private List getDetectionDataList(List devDataList, List standardDevDataList, List U1List, List pqErrSysDtls, Double fData, Double harmonicNum, Integer scale, DictDataEnum dataRule) { List detectionDataList = new ArrayList<>(); + boolean flag = false; 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(); @@ -2249,12 +2271,22 @@ public class DetectionServiceImpl { if (in) { detectionData.setIsData(ResultEnum.QUALIFIED.getValue()); + if (dataRule == DictDataEnum.AT_WILL_VALUE) { + flag = true; + } } else { detectionData.setIsData(ResultEnum.NOT_QUALIFIED.getValue()); } } + if (dataRule == DictDataEnum.AT_WILL_VALUE) { + detectionDataList.clear(); + } detectionDataList.add(detectionData); + if (flag) { + break; + } } + return detectionDataList; } } 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 cfbec985..f927f9d2 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import com.njcn.gather.detection.pojo.po.DevData; import lombok.extern.slf4j.Slf4j; +import java.io.File; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; @@ -407,4 +408,18 @@ public class DetectionUtil { } return null; } + + /** + * 检查文件是否存在 + */ + public static void checkFileExists(String filePath, String description) { + File file = new File(filePath); + if (!file.exists()) { + System.err.println("警告: " + description + " 不存在: " + filePath); + System.err.println("请确保文件路径正确,或修改测试中的文件路径"); + } else { + System.out.println(description + " 存在: " + filePath); + System.out.println(" 文件大小: " + file.length() + " bytes"); + } + } } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/CnSocketUtil.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/CnSocketUtil.java index 52830f3a..90566321 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/CnSocketUtil.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/CnSocketUtil.java @@ -57,11 +57,11 @@ public class CnSocketUtil { /** * 比对式-退出检测 */ - public static void contrastSendquit(String loginName,boolean isRemoveSocket) { + public static void contrastSendquit(String loginName, SourceOperateCodeEnum operateCode, boolean isRemoveSocket) { System.out.println("比对式-发送关闭备通讯模块指令。。。。。。。。"); SocketMsg socketMsg = new SocketMsg<>(); socketMsg.setRequestId(SourceOperateCodeEnum.QUITE.getValue()); - socketMsg.setOperateCode(SourceOperateCodeEnum.QUIT_INIT_02.getValue()); + socketMsg.setOperateCode(operateCode.getValue()); SocketManager.sendMsg(loginName + CONTRAST_DEV_TAG, JSON.toJSONString(socketMsg)); // WebServiceManager.removePreDetectionParam(); FormalTestManager.isRemoveSocket = isRemoveSocket; 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 866663f1..00b843ac 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/FormalTestManager.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/FormalTestManager.java @@ -1,11 +1,14 @@ package com.njcn.gather.detection.util.socket; import com.google.common.collect.HashBiMap; +import com.njcn.gather.detection.pojo.dto.WaveResultDTO; import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; import com.njcn.gather.detection.pojo.po.DevData; +import com.njcn.gather.detection.pojo.vo.DevLineTestResult; import com.njcn.gather.device.pojo.enums.PatternEnum; import com.njcn.gather.device.pojo.vo.PreDetection; import com.njcn.gather.plan.pojo.po.AdPlan; +import com.njcn.gather.plan.pojo.po.AdPlanTestConfig; import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum; import java.util.ArrayList; @@ -45,7 +48,7 @@ public class FormalTestManager { public static List monitorIdListComm = new ArrayList<>(); /** - * 所有参与检测的监测点。key:监测点id(ip_通道号),value:检测点实体 + * 所有参与检测的监测点。key:监测点(ip_通道号),value:检测点实体 */ public static Map monitorMap = new HashMap<>(); @@ -84,6 +87,8 @@ public class FormalTestManager { */ public static AdPlan currentTestPlan; + public static AdPlanTestConfig curretntTestPlanConfig; + /** * 当前正在检测的模式 */ @@ -128,4 +133,19 @@ public class FormalTestManager { * 第几次监测 key为设备监测点id,value为第几次监测 */ public static Map numMap = new HashMap<>(); + + /** + * 存放录波相关数据。key:设备ip_通道号,value:WaveResultDTO数据 + */ + public static Map waveResultDTOMap = new HashMap<>(); + + /** + * 录波组数 + */ + public static Integer waveNum; + + /** + * 每次录波检测结果 + */ + public static List preNumTestResultList = new ArrayList<>(); } diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/HeartbeatHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/HeartbeatHandler.java index e1ad9d51..210c040f 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 @@ -6,6 +6,7 @@ import com.njcn.gather.detection.pojo.param.PreDetectionParam; import com.njcn.gather.detection.pojo.vo.SocketDataMsg; import com.njcn.gather.detection.pojo.vo.SocketMsg; import com.njcn.gather.detection.util.socket.CnSocketUtil; +import com.njcn.gather.detection.util.socket.FormalTestManager; import com.njcn.gather.detection.util.socket.MsgUtil; import com.njcn.gather.detection.util.socket.SocketManager; import io.netty.channel.ChannelHandlerContext; @@ -192,7 +193,11 @@ public class HeartbeatHandler extends SimpleChannelInboundHandler { } else if (CnSocketUtil.SOURCE_TAG.equals(handlerType)) { CnSocketUtil.quitSendSource(param); } else { - CnSocketUtil.contrastSendquit(param.getUserPageId(), true); + if(FormalTestManager.currentStep==SourceOperateCodeEnum.RECORD_WAVE_STEP1 || FormalTestManager.currentStep==SourceOperateCodeEnum.RECORD_WAVE_STEP2){ + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, true); + }else{ + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, true); + } } log.debug("退出指令已发送,等待3秒后清理连接 - 设备类型: {}", handlerType); } catch (Exception 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 03746c9c..a33ad10c 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 @@ -264,8 +264,8 @@ public class NettyClient { private static void setupPipeline(ChannelPipeline pipeline, PreDetectionParam param, SimpleChannelInboundHandler handler) { // 基础编解码器:处理数据格式转换和粘包拆包 - // 按行分割,最大10KB - pipeline.addLast(new LineBasedFrameDecoder(10240)) + // 按行分割,最大20KB + pipeline.addLast(new LineBasedFrameDecoder(10240*2)) // 字节转字符串 .addLast(new StringDecoder(CharsetUtil.UTF_8)) // 字符串转字节 diff --git a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyContrastClientHandler.java b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyContrastClientHandler.java index 9f4788c2..407d91af 100644 --- a/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyContrastClientHandler.java +++ b/detection/src/main/java/com/njcn/gather/detection/util/socket/cilent/NettyContrastClientHandler.java @@ -5,9 +5,7 @@ import com.njcn.gather.detection.handler.SocketContrastResponseService; import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum; import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum; import com.njcn.gather.detection.pojo.param.PreDetectionParam; -import com.njcn.gather.detection.pojo.vo.DevLineTestResult; import com.njcn.gather.detection.pojo.vo.SocketDataMsg; -import com.njcn.gather.detection.pojo.vo.WebSocketVO; import com.njcn.gather.detection.util.socket.CnSocketUtil; import com.njcn.gather.detection.util.socket.FormalTestManager; import com.njcn.gather.detection.util.socket.MsgUtil; @@ -27,9 +25,7 @@ import java.io.IOException; import java.net.ConnectException; import java.net.ProtocolException; import java.time.LocalDateTime; -import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; /** * @author caozehui @@ -64,7 +60,11 @@ public class NettyContrastClientHandler extends SimpleChannelInboundHandler= 60) { - CnSocketUtil.contrastSendquit(param.getUserPageId(), false); + CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false); System.out.println("超时处理-----》" + "实时数据已超时----------------关闭"); timeoutSend(); } @@ -126,7 +126,7 @@ public class NettyContrastClientHandler extends SimpleChannelInboundHandler { * @param humidity * @return */ - boolean updateResult(boolean isContrast,List ids, List adType, String code,String userId, Float temperature, Float humidity); + boolean updateResult(boolean isContrast, List ids, List adType, String code, String userId, Float temperature, Float humidity); void updatePqDevReportState(String devId, int i); 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 aa011011..c0e0327b 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 @@ -21,7 +21,6 @@ import com.njcn.common.pojo.enums.common.DataStateEnum; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.pojo.poi.PullDown; import com.njcn.common.utils.EncryptionUtil; -import com.njcn.common.utils.JwtUtil; import com.njcn.db.mybatisplus.constant.DbConstant; import com.njcn.gather.device.mapper.PqDevMapper; import com.njcn.gather.device.pojo.enums.*; @@ -49,7 +48,6 @@ import com.njcn.gather.user.user.service.ISysUserService; import com.njcn.web.factory.PageFactory; import com.njcn.web.utils.ExcelUtil; import com.njcn.web.utils.PoiUtil; -import com.njcn.web.utils.RequestUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; @@ -436,7 +434,7 @@ public class PqDevServiceImpl extends ServiceImpl implements @Override - public boolean updateResult(boolean isContrast, List ids, List adType, String code,String userId, Float temperature, Float humidity) { + public boolean updateResult(boolean isContrast, List ids, List adType, String code, String userId, Float temperature, Float humidity) { if (CollUtil.isNotEmpty(ids)) { SysTestConfig config = sysTestConfigService.getOneConfig(); diff --git a/detection/src/main/java/com/njcn/gather/err/mapper/mapping/PqErrSysMapper.xml b/detection/src/main/java/com/njcn/gather/err/mapper/mapping/PqErrSysMapper.xml index feb388b9..e2fcedd7 100644 --- a/detection/src/main/java/com/njcn/gather/err/mapper/mapping/PqErrSysMapper.xml +++ b/detection/src/main/java/com/njcn/gather/err/mapper/mapping/PqErrSysMapper.xml @@ -13,6 +13,7 @@ + and State = 1 diff --git a/detection/src/main/java/com/njcn/gather/plan/pojo/enums/DataSourceEnum.java b/detection/src/main/java/com/njcn/gather/plan/pojo/enums/DataSourceEnum.java index fd3de769..f9e5075d 100644 --- a/detection/src/main/java/com/njcn/gather/plan/pojo/enums/DataSourceEnum.java +++ b/detection/src/main/java/com/njcn/gather/plan/pojo/enums/DataSourceEnum.java @@ -14,7 +14,7 @@ public enum DataSourceEnum { MINUTE_STATISTICS_MIN("min", "分钟统计数据-最小"), MINUTE_STATISTICS_AVG("avg", "分钟统计数据-平均"), MINUTE_STATISTICS_CP95("cp95", "分钟统计数据-CP95"), - WAVE_DATA("wave_data", "录播数据"); + WAVE_DATA("wave_data", "录波"); private String value; private String msg; diff --git a/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanTestConfigService.java b/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanTestConfigService.java index 3663ec5e..270c15e0 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanTestConfigService.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanTestConfigService.java @@ -8,5 +8,12 @@ import com.njcn.gather.plan.pojo.po.AdPlanTestConfig; * @date 2025-08-25 */ public interface IAdPlanTestConfigService extends IService { + /** + * 根据计划id获取测试配置 + * + * @param planId 计划id + * @return + */ + AdPlanTestConfig getByPlanId(String planId); } 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 158b4f89..33be2020 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 @@ -574,6 +574,14 @@ public class AdPlanServiceImpl extends ServiceImpl impleme map.put("scriptName", dictTree.getName()); result.add(map); } + if (adPlan.getDatasourceId().contains(DataSourceEnum.WAVE_DATA.getValue())) { + Map map = new HashMap<>(); + map.put("id", "wave_data"); + map.put("code", DataSourceEnum.WAVE_DATA.getValue()); + map.put("scriptName", DataSourceEnum.WAVE_DATA.getMsg()); + result.add(map); + } + } else { String scriptId = adPlan.getScriptId(); List scriptDtlsList = pqScriptDtlsService.listPqScriptDtlByScriptId(scriptId); diff --git a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanTestConfigServiceImpl.java b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanTestConfigServiceImpl.java index a4f3c561..a0265991 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanTestConfigServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanTestConfigServiceImpl.java @@ -12,8 +12,12 @@ import org.springframework.stereotype.Service; */ @Service public class AdPlanTestConfigServiceImpl extends ServiceImpl - implements IAdPlanTestConfigService { + implements IAdPlanTestConfigService { + @Override + public AdPlanTestConfig getByPlanId(String planId) { + return this.lambdaQuery().eq(AdPlanTestConfig::getPlanId, planId).last("LIMIT 1").one(); + } } 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 0d8a522d..0ec8b4d9 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 @@ -2046,7 +2046,7 @@ public class ResultServiceImpl implements IResultService { List devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap); List standardDevData = contrastToList(stdDevNonHarmonicRawDataList, stdDevHarmonicRawDataList, testItemMap); - detectionServiceImpl.processing(devData, standardDevData, parsIp, devIdMapComm, testItemMap.keySet().stream().collect(Collectors.toList()), errorSysId, dataRule, numMap, code); + detectionServiceImpl.processing(devData, standardDevData, parsIp, devIdMapComm, testItemMap.keySet().stream().collect(Collectors.toList()), errorSysId, dataRule, numMap, code, null); }); } 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 f2b48fcc..88123493 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 @@ -22,6 +22,7 @@ A_Value_0 float NULL COMMENT 'A相基波有效值', B_Value_0 float NULL COMMENT 'B相基波有效值', C_Value_0 float NULL COMMENT 'B相基波有效值', + Wave_Num tinyint(1) unsigned DEFAULT null COMMENT '录波数据第几组', PRIMARY KEY (Id) @@ -59,6 +60,7 @@ A_Value_0 json NULL COMMENT 'A相基波有效值', B_Value_0 json NULL COMMENT 'B相基波有效值', C_Value_0 json NULL COMMENT 'B相基波有效值', + Wave_Num tinyint(1) unsigned DEFAULT null COMMENT '录波数据第几组', PRIMARY KEY (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 0930ac39..f17cacd7 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 @@ -1,5 +1,6 @@ package com.njcn.gather.storage.pojo.po; +import io.swagger.models.auth.In; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,7 +24,12 @@ public class ContrastBaseResult extends BaseResult { private String stdDevMonitorId; /** - * 0表示被检设备数据,1表示标准设备数据 + * 0表示被检设备数据,1表示标准设备数据 */ private Integer flag; + + /** + * 录波数据第几组 + */ + private Integer waveNum; } 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 d5f5d3bd..743824ab 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 @@ -12,10 +12,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -157,7 +154,13 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl nonHarmonicResultList = contrastNonHarmonicService.list(wrapper1); + Map> chnMap1 = nonHarmonicResultList.stream().collect(Collectors.groupingBy(x -> x.getDevMonitorId().split("_")[1], Collectors.toList())); + chnMap1.forEach((chn, vList) -> { + ContrastNonHarmonicResult contrastNonHarmonicResult = vList.stream().max(Comparator.comparing(ContrastNonHarmonicResult::getNum)).get(); + List maxList = vList.stream().filter(x -> x.getNum() == contrastNonHarmonicResult.getNum()).collect(Collectors.toList()); + noHarm.addAll(maxList); + }); DynamicTableNameHandler.remove(); DynamicTableNameHandler.setTableName("ad_harmonic_result_" + code); @@ -166,7 +169,13 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl harmonicResultList = contrastHarmonicService.list(wrapper2); + Map> chnMap2 = harmonicResultList.stream().collect(Collectors.groupingBy(x -> x.getDevMonitorId().split("_")[1], Collectors.toList())); + chnMap2.forEach((chn, vList) -> { + ContrastHarmonicResult contrastHarmonicResult = vList.stream().max(Comparator.comparing(ContrastHarmonicResult::getNum)).get(); + List maxList = vList.stream().filter(x -> x.getNum() == contrastHarmonicResult.getNum()).collect(Collectors.toList()); + harm.addAll(maxList); + }); DynamicTableNameHandler.remove(); } else { List disabledScriptDtlIndexs = detectionDataDealMapper.listDisabledScriptDtlIndexs(ids.get(0)); 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 04c04df0..140c1185 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 @@ -49,6 +49,7 @@ public class TableGenServiceImpl implements TableGenService { "A_Value_0 float NULL COMMENT 'A相基波有效值',\n" + "C_Value_0 float NULL COMMENT 'B相基波有效值',\n" + "B_Value_0 float NULL COMMENT 'B相基波有效值',\n" + + "Wave_Num tinyint(1) unsigned DEFAULT null COMMENT '录波数据第几组',\n" + "PRIMARY KEY (Id)\n" : " Script_Id CHAR(32) NOT NULL COMMENT '检测脚本表Id',\n" + @@ -75,6 +76,7 @@ public class TableGenServiceImpl implements TableGenService { "A_Value_0 json NULL COMMENT 'A相基波有效值',\n" + "B_Value_0 json NULL COMMENT 'B相基波有效值',\n" + "C_Value_0 json NULL COMMENT 'B相基波有效值',\n" + + "Wave_Num tinyint(1) unsigned DEFAULT null COMMENT '录波数据第几组',\n" + "PRIMARY KEY (Id)\n" : " Script_Id CHAR(32) NOT NULL COMMENT '检测脚本表Id',\n" + diff --git a/tools/wave-comtrade/src/main/java/com/njcn/gather/tools/comtrade/comparewave/core/model/ClockStruct.java b/tools/wave-comtrade/src/main/java/com/njcn/gather/tools/comtrade/comparewave/core/model/ClockStruct.java index 7bead7d8..4bfa56d3 100644 --- a/tools/wave-comtrade/src/main/java/com/njcn/gather/tools/comtrade/comparewave/core/model/ClockStruct.java +++ b/tools/wave-comtrade/src/main/java/com/njcn/gather/tools/comtrade/comparewave/core/model/ClockStruct.java @@ -26,8 +26,8 @@ public class ClockStruct { * 格式化时间字符串 */ public String format() { - return String.format("%04d-%02d-%02d %02d:%02d:%02d.%06d", - year, month, day, hour, minute, second, microSecond); + return String.format("%04d-%02d-%02dT%02d:%02d:%02d.%03d", + year, month, day, hour, minute, second, microSecond/1000); } /** diff --git a/tools/wave-comtrade/src/main/java/com/njcn/gather/tools/comtrade/comparewave/service/impl/CompareWaveServiceImpl.java b/tools/wave-comtrade/src/main/java/com/njcn/gather/tools/comtrade/comparewave/service/impl/CompareWaveServiceImpl.java index d8250412..c5307a3d 100644 --- a/tools/wave-comtrade/src/main/java/com/njcn/gather/tools/comtrade/comparewave/service/impl/CompareWaveServiceImpl.java +++ b/tools/wave-comtrade/src/main/java/com/njcn/gather/tools/comtrade/comparewave/service/impl/CompareWaveServiceImpl.java @@ -1,5 +1,6 @@ package com.njcn.gather.tools.comtrade.comparewave.service.impl; +import com.alibaba.fastjson.JSON; import com.njcn.gather.tools.comtrade.comparewave.config.PowerQualityConfig; import com.njcn.gather.tools.comtrade.comparewave.core.algorithm.PowerQualityCalculator; import com.njcn.gather.tools.comtrade.comparewave.core.algorithm.WaveformAligner;