1.告警统计算法调整

2.告警统计详情接口代码逻辑调整
This commit is contained in:
wr
2024-02-29 20:10:28 +08:00
parent 945ae25c07
commit 8022b12b4c
3 changed files with 32 additions and 106 deletions

View File

@@ -143,9 +143,10 @@ implements RStatZwAlarmCountWService {
List<DictData> voltageLevelList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE.getCode()).getData();
//将电压信息转成mapkeyid valuename
Map<String, String> voltageLevelMap = voltageLevelList.stream().collect(Collectors.toMap(DictData::getId, DictData::getName));
List<String> data = deptFeignClient.getDepSonSelfCodetByCode(id).getData();
//查询当前单位下监测点idList
LambdaQueryWrapper<Monitor> monitorLambdaQueryWrapper = new LambdaQueryWrapper<>();
monitorLambdaQueryWrapper.eq(Monitor::getOrgId, id);
monitorLambdaQueryWrapper.in(Monitor::getOrgId, data);
List<String> orgMeasurementPointIdList = iMonitorService.list(monitorLambdaQueryWrapper).stream().map(Monitor::getId).collect(Collectors.toList());
//如果单位下没有监测点,直接返回空集合
if (CollUtil.isEmpty(orgMeasurementPointIdList)) {
@@ -153,117 +154,43 @@ implements RStatZwAlarmCountWService {
}
//以周为时间段,查询告警超过四次的监测点信息
LambdaQueryWrapper<RMpTargetWarnD> 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<RMpTargetWarnD> measurementPointIdList = rMpTargetWarnDService.list(targetWarnWrapper);
// LambdaQueryWrapper<RMpPwAlarmDetailD> 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<String> measurementPointIdList = rMpTargetWarnDService.listObjs(targetWarnWrapper, Object::toString);
//获取大于四次的监测点集合
List<String> 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<String, Double> 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<RMpTargetWarnD> targetWarnDList;
// 对 map 中的 value 进行从大到小的排序,并且排除 value 为 0 的元素
List<String> 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<Boolean, List<RMpTargetWarnD>> 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<RMpTargetWarnD> rMpTargetWarnDS4Warn = booleanListMap.get(true);
//提取没有告警情况的记录
// List<RMpTargetWarnD> rMpTargetWarnDS4Normal = booleanListMap.get(true);
//过滤出有告警信息的记录
List<RMpTargetWarnD> 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<String, Integer> 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<String, Double> 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<String> 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<String> 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<String> lastMeasurementPointList = measurementPointIdList.stream().distinct().collect(Collectors.toList());
//根据监测点ids查询监测点信息
monitorLambdaQueryWrapper.clear();
monitorLambdaQueryWrapper.in(Monitor::getId, lastMeasurementPointList);
monitorLambdaQueryWrapper.in(Monitor::getId, MonitorIdsQuartic);
List<Monitor> monitorList = iMonitorService.list(monitorLambdaQueryWrapper);
//提取出监测点相关的变电站id获取变电站电压等级mapkey: 变电站id value: 电压等级)
List<String> 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;

View File

@@ -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");

View File

@@ -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);