From d68c8bea2f121d6f37383f51d4015d2238d932e5 Mon Sep 17 00:00:00 2001 From: chendaofei <857448963@qq.com> Date: Wed, 14 May 2025 16:24:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A8=B3=E6=80=81=E5=91=8A=E8=AD=A6=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DataVerifyServiceImpl.java | 290 ++++++++++++------ 1 file changed, 191 insertions(+), 99 deletions(-) diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DataVerifyServiceImpl.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DataVerifyServiceImpl.java index 92e69e07b..db25d397c 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DataVerifyServiceImpl.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DataVerifyServiceImpl.java @@ -47,6 +47,7 @@ import com.njcn.supervision.pojo.vo.user.UserLedgerVO; import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.api.DictTreeFeignClient; import com.njcn.system.enums.DicDataEnum; +import com.njcn.system.enums.DicDataTypeEnum; import com.njcn.system.pojo.po.DictData; import com.njcn.system.pojo.po.SysDicTreePO; import lombok.RequiredArgsConstructor; @@ -100,12 +101,13 @@ public class DataVerifyServiceImpl extends ServiceImpl monitorIds = commTerminalService.getRunMonitorByDept(monitorBaseParam); - if(CollUtil.isEmpty(monitorIds)){ + if (CollUtil.isEmpty(monitorIds)) { throw new BusinessException(DeviceResponseEnum.QUERY_LINE_DATA_EMPTY); } List dataVerifyList = commQuery(monitorIds, monitorBaseParam); @@ -135,9 +137,9 @@ public class DataVerifyServiceImpl extends ServiceImpl dataVerifyList = this.list(lambdaQueryWrapper); Map> dataMap = dataVerifyList.stream().collect(Collectors.groupingBy(it -> it.getTime().format(DATE_FORMAT))); @@ -160,30 +162,30 @@ public class DataVerifyServiceImpl extends ServiceImpl monitorAbnormalTableDetail(MonitorBaseParam monitorBaseParam) { - Map dtoMap = getStandRange(); + Map dtoMap = getStandRange(); List result = new ArrayList<>(); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.between(DataVerify::getTime, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime())), DateUtil.endOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime()))) .in(DataVerify::getLineId, monitorBaseParam.getMonitorIds()).orderByAsc(DataVerify::getTime); - if(StrUtil.isNotBlank(monitorBaseParam.getTargetKey())){ + if (StrUtil.isNotBlank(monitorBaseParam.getTargetKey())) { String[] queryTarget = monitorBaseParam.getTargetKey().split(SEPARATOR); - lambdaQueryWrapper.eq(DataVerify::getIndexCode,queryTarget[0]).eq(DataVerify::getIndexTable,queryTarget[1]); + lambdaQueryWrapper.eq(DataVerify::getIndexCode, queryTarget[0]).eq(DataVerify::getIndexTable, queryTarget[1]); } List dataVerifyList = this.list(lambdaQueryWrapper); - Map> listMap = dataVerifyList.stream().collect(Collectors.groupingBy(DataVerify::getTime,TreeMap::new, + Map> listMap = dataVerifyList.stream().collect(Collectors.groupingBy(DataVerify::getTime, TreeMap::new, Collectors.toList())); listMap.forEach((time, timeList) -> { Map> indexMap = timeList.stream().collect(Collectors.groupingBy(it -> it.getIndexCode() + SEPARATOR + it.getIndexTable() + SEPARATOR + it.getIndexName())); indexMap.forEach((target, list) -> { String[] temKey = target.split(SEPARATOR); - PqReasonableRangeDto pqReasonableRangeDto = dtoMap.get(temKey[0] +SEPARATOR+ temKey[1]); + PqReasonableRangeDto pqReasonableRangeDto = dtoMap.get(temKey[0] + SEPARATOR + temKey[1]); String unit; - if(StrUtil.isNotBlank(pqReasonableRangeDto.getUnit())){ + if (StrUtil.isNotBlank(pqReasonableRangeDto.getUnit())) { unit = pqReasonableRangeDto.getUnit(); - }else { + } else { unit = ""; } @@ -194,7 +196,7 @@ public class DataVerifyServiceImpl extends ServiceImpl { switch (it.getValueType()) { case "AVG": @@ -310,6 +312,47 @@ public class DataVerifyServiceImpl extends ServiceImpl monitorLimitTableDetail(MonitorBaseParam monitorBaseParam) { List result = new ArrayList<>(); - LineCountEvaluateParam lineCountEvaluateParam = new LineCountEvaluateParam(); - lineCountEvaluateParam.setLineId(Stream.of(monitorBaseParam.getMonitorIds().get(0)).collect(Collectors.toList())); + lineCountEvaluateParam.setLineId(Collections.singletonList(monitorBaseParam.getMonitorIds().get(0))); lineCountEvaluateParam.setStartTime(monitorBaseParam.getSearchBeginTime()); lineCountEvaluateParam.setEndTime(monitorBaseParam.getSearchBeginTime()); List dtoList = dataLimitRateDetailFeignClient.getRawData(lineCountEvaluateParam).getData(); + if (CollUtil.isEmpty(dtoList)) { + return result; + } - if (CollUtil.isNotEmpty(dtoList)) { - DataLimitRateDetailDto dto = dtoList.get(0); - JSONArray jsonArray = new JSONArray(); - List specialTargetList = new ArrayList<>(); - - if (monitorBaseParam.getTargetKey().equals(DicDataEnum.VOLTAGE_DEV.getCode())) { - //电压偏差 - jsonArray = new JSONArray(dto.getVoltageDevOvertime()); - } else if (monitorBaseParam.getTargetKey().equals(DicDataEnum.FLICKER.getCode())) { - jsonArray = new JSONArray(dto.getFlickerOvertime()); - }else if (monitorBaseParam.getTargetKey().equals(DicDataEnum.phase_Voltage.getCode())) { - jsonArray = new JSONArray(dto.getUbalanceOvertime()); - } else if (monitorBaseParam.getTargetKey().equals(DicDataEnum.FREQUENCY_DEV.getCode())) { - jsonArray = new JSONArray(dto.getFreqDevOvertime()); - } else if (monitorBaseParam.getTargetKey().equals(DicDataEnum.NEG_CURRENT.getCode())) { - jsonArray = new JSONArray(dto.getINegOvertime()); - } else if (monitorBaseParam.getTargetKey().equals(DicDataEnum.THD_V.getCode())) { - jsonArray = new JSONArray(dto.getUaberranceOvertime()); - } else if (monitorBaseParam.getTargetKey().equals(DicDataEnum.HARMONIC_VOLTAGE.getCode())) { - for (int i = 2; i <= 25; i++) { - String uHarmKey = "uharm" + i + "Overtime"; - String json = getFieldValueForDetail(dto, uHarmKey); - if (StrUtil.isNotBlank(json)) { - specialTargetList.add(json+SEPARATOR+i); - } - } - - } else if (monitorBaseParam.getTargetKey().equals(DicDataEnum.HARMONIC_CURRENT.getCode())) { - for (int i = 2; i <= 25; i++) { - String uHarmKey = "iharm" + i + "Overtime"; - String json = getFieldValueForDetail(dto, uHarmKey); - if (StrUtil.isNotBlank(json)) { - specialTargetList.add(json+SEPARATOR+i); - } - } - - } else if (monitorBaseParam.getTargetKey().equals(DicDataEnum.INTERHARMONIC_VOLTAGE.getCode())) { - for (int i = 1; i <= 16; i++) { - String uHarmKey = "inuharm" + i + "Overtime"; - String json = getFieldValueForDetail(dto, uHarmKey); - if (StrUtil.isNotBlank(json)) { - specialTargetList.add(json+SEPARATOR+i); - } - } - } - - if(CollUtil.isNotEmpty(specialTargetList)){ - for(String strJson : specialTargetList){ - String[] temStr = strJson.split(SEPARATOR); - JSONArray jsonTem = new JSONArray(temStr[0]); - dealJsonArr(jsonTem,result,monitorBaseParam,temStr[1]); - } - }else { - dealJsonArr(jsonArray,result,monitorBaseParam,null); - } + DataLimitRateDetailDto dto = dtoList.get(0); + Map targetMap = getTargetMap(); + if (StrUtil.isNotBlank(monitorBaseParam.getTargetKey())) { + processSingleTarget(dto, monitorBaseParam.getTargetKey(), targetMap, result); + } else { + processAllTargets(dto, targetMap, result); } return result; } + private Map getTargetMap() { + List dictDataList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.STEADY_STATIS.getCode()).getData(); + return dictDataList.stream().collect(Collectors.toMap(DictData::getCode, Function.identity())); + } + + private void processSingleTarget(DataLimitRateDetailDto dto, String targetKey, Map targetMap, List result) { + if (!targetMap.containsKey(targetKey)) { + throw new BusinessException("异常指标参数"); + } + + String targetName = targetMap.get(targetKey).getName(); + List specialTargetList = new ArrayList<>(); + JSONArray jsonArray = new JSONArray(); + + DicDataEnum targetEnum = DicDataEnum.getDicDataEnumValue(targetKey); + switch (Objects.requireNonNull(targetEnum)) { + case VOLTAGE_DEV: + jsonArray = new JSONArray(dto.getVoltageDevOvertime()); + break; + case FLICKER: + jsonArray = new JSONArray(dto.getFlickerOvertime()); + break; + case phase_Voltage: + jsonArray = new JSONArray(dto.getUbalanceOvertime()); + break; + case FREQUENCY_DEV: + jsonArray = new JSONArray(dto.getFreqDevOvertime()); + break; + case NEG_CURRENT: + jsonArray = new JSONArray(dto.getINegOvertime()); + break; + case THD_V: + jsonArray = new JSONArray(dto.getUaberranceOvertime()); + break; + case HARMONIC_VOLTAGE: + collectHarmonicData(dto, "uharm", 2, 25, specialTargetList); + break; + case HARMONIC_CURRENT: + collectHarmonicData(dto, "iharm", 2, 25, specialTargetList); + break; + case INTERHARMONIC_VOLTAGE: + collectHarmonicData(dto, "inuharm", 1, 16, specialTargetList); + break; + default: + throw new BusinessException("未支持的指标类型: " + targetKey); + } + if (CollUtil.isNotEmpty(specialTargetList)) { + processSpecialTargets(specialTargetList, result, targetName); + } else { + dealJsonArr(jsonArray, result, targetName, null); + } + } + + private void processAllTargets(DataLimitRateDetailDto dto, Map targetMap, + List result) { + // 处理标准指标 + processStandardTarget(dto, targetMap, DicDataEnum.VOLTAGE_DEV.getCode(), dto.getVoltageDevOvertime(), result); + processStandardTarget(dto, targetMap, DicDataEnum.FLICKER.getCode(), dto.getFlickerOvertime(), result); + processStandardTarget(dto, targetMap, DicDataEnum.phase_Voltage.getCode(), dto.getUbalanceOvertime(), result); + processStandardTarget(dto, targetMap, DicDataEnum.FREQUENCY_DEV.getCode(), dto.getFreqDevOvertime(), result); + processStandardTarget(dto, targetMap, DicDataEnum.NEG_CURRENT.getCode(), dto.getINegOvertime(), result); + processStandardTarget(dto, targetMap, DicDataEnum.THD_V.getCode(), dto.getUaberranceOvertime(), result); + + // 处理谐波类指标 + processHarmonicTarget(dto, targetMap, DicDataEnum.HARMONIC_VOLTAGE.getCode(), "uharm", 2, 25, result); + processHarmonicTarget(dto, targetMap, DicDataEnum.HARMONIC_CURRENT.getCode(), "iharm", 2, 25, result); + processHarmonicTarget(dto, targetMap, DicDataEnum.INTERHARMONIC_VOLTAGE.getCode(), "inuharm", 1, 16, result); + } + private void processStandardTarget(DataLimitRateDetailDto dto, Map targetMap, + String targetCode, String data, + List result) { + if (StrUtil.isNotBlank(data)) { + JSONArray jsonArray = new JSONArray(data); + String targetName = targetMap.get(targetCode).getName(); + dealJsonArr(jsonArray, result, targetName, null); + } + } + + private void processHarmonicTarget(DataLimitRateDetailDto dto, Map targetMap, + String targetCode, String prefix, int start, int end, + List result) { + List tempList = new ArrayList<>(); + String targetName = targetMap.get(targetCode).getName(); + collectHarmonicData(dto, prefix, start, end, tempList); + processSpecialTargets(tempList, result, targetName); + } + + private void processSpecialTargets(List specialTargetList, List result, String targetName) { + for (String strJson : specialTargetList) { + String[] temStr = strJson.split(SEPARATOR); + JSONArray jsonTem = new JSONArray(temStr[0]); + dealJsonArr(jsonTem, result, targetName, temStr[1]); + } + } /** * 处理json数组 */ - private void dealJsonArr(JSONArray jsonArray,List result,MonitorBaseParam monitorBaseParam,String count){ + private void dealJsonArr(JSONArray jsonArray, List result, String targetName, String count) { List jsonBaseVOList = jsonArray.toList(JsonBaseVO.class); Map> jsonMap = jsonBaseVOList.stream().collect(Collectors.groupingBy(JsonBaseVO::getPhasic)); jsonMap.forEach((phasic, list) -> { @@ -422,13 +512,13 @@ public class DataVerifyServiceImpl extends ServiceImpl { String[] timeArr = it.getTime().split(StrUtil.COMMA); String[] valArr = it.getValue().split(StrUtil.COMMA); - for(int i = 0;i commQuery(List monitorIds, MonitorBaseParam monitorBaseParam) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.between(DataVerify::getTime, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime())), DateUtil.endOfDay(DateUtil.parse(monitorBaseParam.getSearchEndTime()))) @@ -515,13 +603,24 @@ public class DataVerifyServiceImpl extends ServiceImpl result) { + for (int i = start; i <= end; i++) { + String fieldName = prefix + i + "Overtime"; + String json = getFieldValueForDetail(dto, fieldName); + if (StrUtil.isNotBlank(json)) { + result.add(json + SEPARATOR + i); + } + } + } + + private Integer getFieldValue(DataLimitTargetDto dto, String fieldName) { try { Field field = DataLimitTargetDto.class.getDeclaredField(fieldName); field.setAccessible(true); return (Integer) field.get(dto); } catch (NoSuchFieldException | IllegalAccessException e) { - logger.error("反射方法异常:{}", e.getMessage()); + logger.error("DataLimitTarget反射方法异常:{}", e.getMessage()); return null; } } @@ -532,7 +631,7 @@ public class DataVerifyServiceImpl extends ServiceImpl rangeMap = new HashMap<>(); - String time = DateUtil.format(dateTime,DATE_FORMAT); + String time = DateUtil.format(dateTime, DATE_FORMAT); rangeMap.put("time", time); rangeMap.put("val", map.getOrDefault(time, 0)); result.add(rangeMap); @@ -584,7 +683,7 @@ public class DataVerifyServiceImpl extends ServiceImpl rangeMap = new HashMap<>(); - String time = DateUtil.format(dateTime,DATE_FORMAT); + String time = DateUtil.format(dateTime, DATE_FORMAT); rangeMap.put("time", time); rangeMap.put("val", map.getOrDefault(time, 0)); result.add(rangeMap); @@ -619,8 +718,8 @@ public class DataVerifyServiceImpl extends ServiceImpl getAbnormalTarget(List dataVerifyList) { Map> dataMap = dataVerifyList.stream().collect(Collectors.groupingBy(it -> - it.getIndexCode() +SEPARATOR+ it.getIndexTable(), Collectors.mapping(DataVerify::getLineId, Collectors.toSet()))); - Map rangeMap = getStandRange(); + it.getIndexCode() + SEPARATOR + it.getIndexTable(), Collectors.mapping(DataVerify::getLineId, Collectors.toSet()))); + Map rangeMap = getStandRange(); //正序、负序和零序电压 List result = new ArrayList<>(); dataMap.forEach((key, num) -> { @@ -637,27 +736,27 @@ public class DataVerifyServiceImpl extends ServiceImpl entry = iterator.next(); if (!vMap.containsKey(entry.getKey())) { PqReasonableRangeDto dto = entry.getValue(); - assembleEntity(new HashSet<>(),dto,result); + assembleEntity(new HashSet<>(), dto, result); } } return result.stream().sorted(Comparator.comparing(VerifyTargetVO::getSort)).collect(Collectors.toList()); } /** - *组装实体 + * 组装实体 */ private void assembleEntity(Set ids, PqReasonableRangeDto dto, List result) { VerifyTargetVO verifyTargetVO = new VerifyTargetVO(); - verifyTargetVO.setKey(dto.getIndexCode() +SEPARATOR+ dto.getInfluxdbTableName()); + verifyTargetVO.setKey(dto.getIndexCode() + SEPARATOR + dto.getInfluxdbTableName()); verifyTargetVO.setTargetName(dto.getIndexName()); verifyTargetVO.setIds(ids); verifyTargetVO.setRemark(dto.getRemark()); verifyTargetVO.setSort(dto.getSort()); - String unit = ""; - if(StrUtil.isNotBlank(dto.getUnit())){ + String unit = ""; + if (StrUtil.isNotBlank(dto.getUnit())) { unit = dto.getUnit(); } - verifyTargetVO.setRangeDesc(dto.getMinValue()+unit + " ~ " + dto.getMaxValue()+unit); + verifyTargetVO.setRangeDesc(dto.getMinValue() + unit + " ~ " + dto.getMaxValue() + unit); result.add(verifyTargetVO); } @@ -665,11 +764,11 @@ public class DataVerifyServiceImpl extends ServiceImpl getStandRange(){ + private Map getStandRange() { DataCleanParam dataCleanParam = new DataCleanParam(); dataCleanParam.setSystemType(DataCleanEnum.Pqs.getCode()); List pqReasonableRangeDtoList = pqReasonableRangeFeignClient.getData(dataCleanParam).getData(); - return pqReasonableRangeDtoList.stream().collect(Collectors.toMap(it -> it.getIndexCode() +SEPARATOR+ it.getInfluxdbTableName(), Function.identity())); + return pqReasonableRangeDtoList.stream().collect(Collectors.toMap(it -> it.getIndexCode() + SEPARATOR + it.getInfluxdbTableName(), Function.identity())); } @@ -678,35 +777,29 @@ public class DataVerifyServiceImpl extends ServiceImpl> dataMap = dataVerifyList.stream().collect(Collectors.groupingBy(DataVerify::getLineId)); dataMap.forEach((key, list) -> { List dateList = list.stream().map(it -> it.getTime().toLocalDate()).distinct().sorted(Comparator.comparing(Function.identity())).collect(Collectors.toList()); - processTable(monitorBaseParam,dateList,result,key); + processTable(monitorBaseParam, dateList, result, key); }); dealTableResult(result); return result; } - - - - - public List getLimitTable(List dataVerifyList, MonitorBaseParam monitorBaseParam) { List result = new ArrayList<>(); Map> dataMap = dataVerifyList.stream().collect(Collectors.groupingBy(DataLimitTargetDto::getLineId)); dataMap.forEach((key, list) -> { List dateList = list.stream().map(DataLimitTargetDto::getTime).distinct().sorted(Comparator.comparing(Function.identity())).collect(Collectors.toList()); - processTable(monitorBaseParam,dateList,result,key); + processTable(monitorBaseParam, dateList, result, key); }); dealTableResult(result); return result; } - /** * 判断测点是否存在连续异常数据 */ - private void processTable(MonitorBaseParam monitorBaseParam,List dateList,List result,String lineId) { + private void processTable(MonitorBaseParam monitorBaseParam, List dateList, List result, String lineId) { Integer warnDay = monitorBaseParam.getWarnDayLimit(); Integer alarmDay = monitorBaseParam.getAlarmDayLimit(); //检查是否有连续指定天数的告警 @@ -725,7 +818,7 @@ public class DataVerifyServiceImpl extends ServiceImpl result){ + private void dealTableResult(List result) { if (CollUtil.isNotEmpty(result)) { List dicTreePOList = dictTreeFeignClient.queryAllByType(Integer.valueOf(DicDataEnum.Obj_Type.getCode())).getData(); Map sysDicTreePOMap = dicTreePOList.stream().collect(Collectors.toMap(SysDicTreePO::getId, Function.identity())); @@ -758,6 +851,7 @@ public class DataVerifyServiceImpl extends ServiceImpl