diff --git a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/impl/RStatZwAlarmCountWServiceImpl.java b/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/impl/RStatZwAlarmCountWServiceImpl.java index 06e091d8a..bd2328a84 100644 --- a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/impl/RStatZwAlarmCountWServiceImpl.java +++ b/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/service/majornetwork/impl/RStatZwAlarmCountWServiceImpl.java @@ -143,9 +143,10 @@ implements RStatZwAlarmCountWService { List voltageLevelList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE.getCode()).getData(); //将电压信息转成map,key:id value:name Map voltageLevelMap = voltageLevelList.stream().collect(Collectors.toMap(DictData::getId, DictData::getName)); + List data = deptFeignClient.getDepSonSelfCodetByCode(id).getData(); //查询当前单位下监测点idList LambdaQueryWrapper monitorLambdaQueryWrapper = new LambdaQueryWrapper<>(); - monitorLambdaQueryWrapper.eq(Monitor::getOrgId, id); + monitorLambdaQueryWrapper.in(Monitor::getOrgId, data); List orgMeasurementPointIdList = iMonitorService.list(monitorLambdaQueryWrapper).stream().map(Monitor::getId).collect(Collectors.toList()); //如果单位下没有监测点,直接返回空集合 if (CollUtil.isEmpty(orgMeasurementPointIdList)) { @@ -153,117 +154,43 @@ implements RStatZwAlarmCountWService { } //以周为时间段,查询告警超过四次的监测点信息 LambdaQueryWrapper targetWarnWrapper = new LambdaQueryWrapper<>(); - targetWarnWrapper.select(RMpTargetWarnD::getMeasurementPointId) + targetWarnWrapper .in(RMpTargetWarnD::getMeasurementPointId, orgMeasurementPointIdList) .ge(StringUtils.isNotBlank(startTime), RMpTargetWarnD::getDataDate, startTime) .le(StringUtils.isNotBlank(endTime), RMpTargetWarnD::getDataDate, endTime) - .groupBy(RMpTargetWarnD::getMeasurementPointId) - //拼接条件 - .and(qw -> - qw.eq(RMpTargetWarnD::getIsEffective, 0)//是否是有效接入监测点(0:否 1:是) - .or() //开始拼接or条件 - .eq(RMpTargetWarnD::getIsHarmonic, 1)//是否是稳态超标监测点(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsEvent, 1) //是否是发生暂态的监测点(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsWarn, 1) //是否是告警监测点数(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsVDevWarn, 1) //电压偏差是否告警(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsFreqWarn, 1) //频率偏差是否告警(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsUnbalanceWarn, 1) //三相电压不平衡度是否告警(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsVWarn, 1) //谐波电压是否告警(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsFlickerWarn, 1) //闪变是否告警(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsSagWarn, 1) //电压暂降是否告警(0:否 1:是) - .or() - .eq(RMpTargetWarnD::getIsInterruptWarn, 1) //短时中断是否告警(0:否 1:是) - ) - .having("count(measurement_point_id) >= {0}", 4); + .eq(RMpTargetWarnD::getIsEffective,1); + List measurementPointIdList = rMpTargetWarnDService.list(targetWarnWrapper); -// LambdaQueryWrapper alarmDetailWrapper = new LambdaQueryWrapper<>(); - /* - 组装查询条件:select count(1) from r_mp_pw_alarm_detail_d where data_date <= '2022-10-23' - and data_date >= '2022-10-17' and measurement_point_id in (orgMeasurementPointIdList) - group by measurement_point_id having count(measurement_point_id) >= 4 - */ -// alarmDetailWrapper.select(RMpPwAlarmDetailD::getMeasurementPointId) -// .in(RMpPwAlarmDetailD::getMeasurementPointId, orgMeasurementPointIdList) -// .ge(StringUtils.isNotBlank(startTime), RMpPwAlarmDetailD::getDataDate, startTime) -// .le(StringUtils.isNotBlank(endTime), RMpPwAlarmDetailD::getDataDate, endTime) -// .groupBy(RMpPwAlarmDetailD::getMeasurementPointId) -// .having("count(measurement_point_id) >= {0}", 4); - //告警超过四次的监测点idList - List measurementPointIdList = rMpTargetWarnDService.listObjs(targetWarnWrapper, Object::toString); + //获取大于四次的监测点集合 + List MonitorIdsQuartic = measurementPointIdList.stream() + .filter(obj -> obj.getIsWarn() == 1) + .collect(Collectors.groupingBy(RMpTargetWarnD::getMeasurementPointId, Collectors.counting())) + .entrySet().stream() + .filter(e -> e.getValue() >= 4).map(x->x.getKey()).collect(Collectors.toList()); // 计算问题严重的监测点 - // 获取查询条件:月份开始时间、结束时间 - Date date = DateUtil.parse(startTime); - String startTimeOfMonth = DateUtil.format(DateUtil.beginOfMonth(date), "yyyy-MM-dd"); - String endTimeOfMonth = DateUtil.format(DateUtil.endOfMonth(date), "yyyy-MM-dd"); - //获取查询月份的自然月天数 - int monthDay = Month.of(DateUtil.month(date)).getLastDay(DateUtil.isLeapYear(DateUtil.year(date))); + Map avgStatusOneCountByAlarmId = measurementPointIdList.stream() + .filter(alarm -> alarm.getIsWarn() == 1) + .collect(Collectors.groupingBy(RMpTargetWarnD::getMeasurementPointId, Collectors.counting())) + .entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() / 7.0)); - //根据单位下监测点idList、月份条件查询监测点告警信息 - List targetWarnDList; + // 对 map 中的 value 进行从大到小的排序,并且排除 value 为 0 的元素 + List sortedAvgStatusOneCountByAlarmId = avgStatusOneCountByAlarmId.entrySet().stream() + .filter(e -> e.getValue() != 0) + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + if(CollUtil.isNotEmpty(sortedAvgStatusOneCountByAlarmId)){ + // 获取前 30% 的告警 id 数量 + double v = sortedAvgStatusOneCountByAlarmId.size() * 0.3; + int top30PercentCount = (int) (v<1?Math.ceil(v):v); + MonitorIdsQuartic.addAll(sortedAvgStatusOneCountByAlarmId.subList(0,top30PercentCount)); + } - targetWarnWrapper.clear(); - //组装查询条件: - targetWarnWrapper.in(RMpTargetWarnD::getMeasurementPointId, orgMeasurementPointIdList) - .ge(StringUtils.isNotBlank(startTime), RMpTargetWarnD::getDataDate, startTimeOfMonth) - .le(StringUtils.isNotBlank(endTime), RMpTargetWarnD::getDataDate, endTimeOfMonth); - targetWarnDList = rMpTargetWarnDService.list(targetWarnWrapper); - - //使用stream的分组方法(Collectors.partitioningBy())对告警记录和没有告警的记录进行分组 true:有告警的记录 false:没有告警的记录 -// Map> booleanListMap = targetWarnDList.stream().collect(Collectors.groupingBy( -// item -> item.getIsEffective() == 1 || item.getIsHarmonic() == 1 || item.getIsEvent() == 1 || item.getIsWarn() == 1 -// || item.getIsVDevWarn() == 1 || item.getIsFreqWarn() == 1 || item.getIsUnbalanceWarn() == 1 || item.getIsVWarn() == 1 -// || item.getIsFlickerWarn() == 1 || item.getIsSagWarn() == 1 || item.getIsInterruptWarn() == 1)); - //提取有告警情况的记录 -// List rMpTargetWarnDS4Warn = booleanListMap.get(true); - //提取没有告警情况的记录 -// List rMpTargetWarnDS4Normal = booleanListMap.get(true); - //过滤出有告警信息的记录 - List rMpTargetWarnDS4Warn = targetWarnDList.stream().filter( - item -> item.getIsEffective() == 1 || item.getIsHarmonic() == 1 || item.getIsEvent() == 1 || item.getIsWarn() == 1 - || item.getIsVDevWarn() == 1 || item.getIsFreqWarn() == 1 || item.getIsUnbalanceWarn() == 1 || item.getIsVWarn() == 1 - || item.getIsFlickerWarn() == 1 || item.getIsSagWarn() == 1 || item.getIsInterruptWarn() == 1).collect(Collectors.toList()); - //创建map集合,用于统计某个监测点的记录条数 - HashMap monitorCountMap = new HashMap<>(); - for (RMpTargetWarnD item : rMpTargetWarnDS4Warn) { - if (monitorCountMap.containsKey(item.getMeasurementPointId())) { - monitorCountMap.put(item.getMeasurementPointId(), monitorCountMap.get(item.getMeasurementPointId()) + 1); - } else { - monitorCountMap.put(item.getMeasurementPointId(), 1); - } - } - //创建map集合,key:监测点id value:严重程度 - HashMap severityMap = new HashMap<>(); - for (String measurementPointId : monitorCountMap.keySet()) { - Integer integer = monitorCountMap.get(measurementPointId); //当前遍历的监测点告警天数 - double severity = integer / (monthDay * 1.0); //严重程度 - severityMap.put(measurementPointId, severity); - } - //给严重程度从大到小排序,并将严重程度前【30%】的监测点id放到List集合中 -// List severity = new ArrayList<>(); -// severityMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).collect(Collectors.toList()) -// .subList(0, (int)(severityMap.size() * 0.3)).forEach(item -> severity.add(item.getKey())); - List severity = severityMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) - .limit((int)Math.ceil(severityMap.size() * 0.3)).map(Map.Entry::getKey).collect(Collectors.toList()); - //合并告警超过四次的监测点ids和严重程度前30%监测点dis - measurementPointIdList.addAll(severity); - //如果问题严重监测点id集合是空的,那直接返回空集合 - if (CollUtil.isEmpty(measurementPointIdList)) { - return new ArrayList<>(); - } //去除集合中重复的监测点id,得到最终的有严重问题的监测点id集合 - List lastMeasurementPointList = measurementPointIdList.stream().distinct().collect(Collectors.toList()); - //根据监测点ids查询监测点信息 monitorLambdaQueryWrapper.clear(); - monitorLambdaQueryWrapper.in(Monitor::getId, lastMeasurementPointList); + monitorLambdaQueryWrapper.in(Monitor::getId, MonitorIdsQuartic); List monitorList = iMonitorService.list(monitorLambdaQueryWrapper); //提取出监测点相关的变电站id,获取变电站电压等级map(key: 变电站id value: 电压等级) List powerIdList = monitorList.stream().map(Monitor::getPowerrId).collect(Collectors.toList()); @@ -281,7 +208,6 @@ implements RStatZwAlarmCountWService { problemMonitorDetailVO.setPowerName(item.getPowerrName()); //变电站名称 problemMonitorDetailVO.setVoltageLevel(stationVoltageLevelMap.get(item.getPowerrId())); //变电站电压等级id problemMonitorDetailVO.setVoltageLevelName(voltageLevelMap.get(stationVoltageLevelMap.get(item.getPowerrId()))); //变电站电压等级 - return problemMonitorDetailVO; }).collect(Collectors.toList()); return resultList; diff --git a/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/Impl/area/RStatHarmonicOrgServiceImpl.java b/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/Impl/area/RStatHarmonicOrgServiceImpl.java index 5e8deb59f..3c5341eab 100644 --- a/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/Impl/area/RStatHarmonicOrgServiceImpl.java +++ b/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/Impl/area/RStatHarmonicOrgServiceImpl.java @@ -74,7 +74,7 @@ public class RStatHarmonicOrgServiceImpl implements RStatHarmonicOrgService { private final RStatHarmonicOrgQPOService rStatHarmonicQPOService; private final RStatHarmonicOrgYPOService rStatHarmonicYPOService; - DecimalFormat df = new DecimalFormat("0.00"); + DecimalFormat df = new DecimalFormat("0.00000"); diff --git a/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/newalgorithm/impl/RAlarmCountServiceImpl.java b/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/newalgorithm/impl/RAlarmCountServiceImpl.java index 7fa040024..51410c7cd 100644 --- a/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/newalgorithm/impl/RAlarmCountServiceImpl.java +++ b/pqs-prepare/prepare-boot/src/main/java/com/njcn/prepare/harmonic/service/mysql/newalgorithm/impl/RAlarmCountServiceImpl.java @@ -109,8 +109,8 @@ public class RAlarmCountServiceImpl implements RAlarmCountService { .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new)); // 获取前 30% 的告警 id 数量 - int top30PercentCount = (int) (sortedAvgStatusOneCountByAlarmId.size() * 0.3) + 1; - + double v = sortedAvgStatusOneCountByAlarmId.size() * 0.3; + int top30PercentCount = (int) (v<1?Math.ceil(v):v); RStatZwAlarmCountWPO rStatZwAlarmCountWPO = new RStatZwAlarmCountWPO(); rStatZwAlarmCountWPO.setOrgNo(deptGetChildrenMoreDTO.getUnitId()); rStatZwAlarmCountWPO.setDataDate(localDate);