1.告警统计算法调整
2.告警统计详情接口代码逻辑调整
This commit is contained in:
@@ -143,9 +143,10 @@ implements RStatZwAlarmCountWService {
|
||||
List<DictData> voltageLevelList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE.getCode()).getData();
|
||||
//将电压信息转成map,key:id value:name
|
||||
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,获取变电站电压等级map(key: 变电站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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user