1.告警统计算法调整
2.告警统计详情接口代码逻辑调整
This commit is contained in:
@@ -143,9 +143,10 @@ implements RStatZwAlarmCountWService {
|
|||||||
List<DictData> voltageLevelList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE.getCode()).getData();
|
List<DictData> voltageLevelList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE.getCode()).getData();
|
||||||
//将电压信息转成map,key:id value:name
|
//将电压信息转成map,key:id value:name
|
||||||
Map<String, String> voltageLevelMap = voltageLevelList.stream().collect(Collectors.toMap(DictData::getId, DictData::getName));
|
Map<String, String> voltageLevelMap = voltageLevelList.stream().collect(Collectors.toMap(DictData::getId, DictData::getName));
|
||||||
|
List<String> data = deptFeignClient.getDepSonSelfCodetByCode(id).getData();
|
||||||
//查询当前单位下监测点idList
|
//查询当前单位下监测点idList
|
||||||
LambdaQueryWrapper<Monitor> monitorLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
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());
|
List<String> orgMeasurementPointIdList = iMonitorService.list(monitorLambdaQueryWrapper).stream().map(Monitor::getId).collect(Collectors.toList());
|
||||||
//如果单位下没有监测点,直接返回空集合
|
//如果单位下没有监测点,直接返回空集合
|
||||||
if (CollUtil.isEmpty(orgMeasurementPointIdList)) {
|
if (CollUtil.isEmpty(orgMeasurementPointIdList)) {
|
||||||
@@ -153,117 +154,43 @@ implements RStatZwAlarmCountWService {
|
|||||||
}
|
}
|
||||||
//以周为时间段,查询告警超过四次的监测点信息
|
//以周为时间段,查询告警超过四次的监测点信息
|
||||||
LambdaQueryWrapper<RMpTargetWarnD> targetWarnWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<RMpTargetWarnD> targetWarnWrapper = new LambdaQueryWrapper<>();
|
||||||
targetWarnWrapper.select(RMpTargetWarnD::getMeasurementPointId)
|
targetWarnWrapper
|
||||||
.in(RMpTargetWarnD::getMeasurementPointId, orgMeasurementPointIdList)
|
.in(RMpTargetWarnD::getMeasurementPointId, orgMeasurementPointIdList)
|
||||||
.ge(StringUtils.isNotBlank(startTime), RMpTargetWarnD::getDataDate, startTime)
|
.ge(StringUtils.isNotBlank(startTime), RMpTargetWarnD::getDataDate, startTime)
|
||||||
.le(StringUtils.isNotBlank(endTime), RMpTargetWarnD::getDataDate, endTime)
|
.le(StringUtils.isNotBlank(endTime), RMpTargetWarnD::getDataDate, endTime)
|
||||||
.groupBy(RMpTargetWarnD::getMeasurementPointId)
|
.eq(RMpTargetWarnD::getIsEffective,1);
|
||||||
//拼接条件
|
List<RMpTargetWarnD> measurementPointIdList = rMpTargetWarnDService.list(targetWarnWrapper);
|
||||||
.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);
|
|
||||||
|
|
||||||
// LambdaQueryWrapper<RMpPwAlarmDetailD> alarmDetailWrapper = new LambdaQueryWrapper<>();
|
//获取大于四次的监测点集合
|
||||||
/*
|
List<String> MonitorIdsQuartic = measurementPointIdList.stream()
|
||||||
组装查询条件:select count(1) from r_mp_pw_alarm_detail_d where data_date <= '2022-10-23'
|
.filter(obj -> obj.getIsWarn() == 1)
|
||||||
and data_date >= '2022-10-17' and measurement_point_id in (orgMeasurementPointIdList)
|
.collect(Collectors.groupingBy(RMpTargetWarnD::getMeasurementPointId, Collectors.counting()))
|
||||||
group by measurement_point_id having count(measurement_point_id) >= 4
|
.entrySet().stream()
|
||||||
*/
|
.filter(e -> e.getValue() >= 4).map(x->x.getKey()).collect(Collectors.toList());
|
||||||
// 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);
|
|
||||||
|
|
||||||
// 计算问题严重的监测点
|
// 计算问题严重的监测点
|
||||||
// 获取查询条件:月份开始时间、结束时间
|
Map<String, Double> avgStatusOneCountByAlarmId = measurementPointIdList.stream()
|
||||||
Date date = DateUtil.parse(startTime);
|
.filter(alarm -> alarm.getIsWarn() == 1)
|
||||||
String startTimeOfMonth = DateUtil.format(DateUtil.beginOfMonth(date), "yyyy-MM-dd");
|
.collect(Collectors.groupingBy(RMpTargetWarnD::getMeasurementPointId, Collectors.counting()))
|
||||||
String endTimeOfMonth = DateUtil.format(DateUtil.endOfMonth(date), "yyyy-MM-dd");
|
.entrySet().stream()
|
||||||
//获取查询月份的自然月天数
|
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() / 7.0));
|
||||||
int monthDay = Month.of(DateUtil.month(date)).getLastDay(DateUtil.isLeapYear(DateUtil.year(date)));
|
|
||||||
|
|
||||||
//根据单位下监测点idList、月份条件查询监测点告警信息
|
// 对 map 中的 value 进行从大到小的排序,并且排除 value 为 0 的元素
|
||||||
List<RMpTargetWarnD> targetWarnDList;
|
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集合
|
//去除集合中重复的监测点id,得到最终的有严重问题的监测点id集合
|
||||||
List<String> lastMeasurementPointList = measurementPointIdList.stream().distinct().collect(Collectors.toList());
|
|
||||||
//根据监测点ids查询监测点信息
|
|
||||||
monitorLambdaQueryWrapper.clear();
|
monitorLambdaQueryWrapper.clear();
|
||||||
monitorLambdaQueryWrapper.in(Monitor::getId, lastMeasurementPointList);
|
monitorLambdaQueryWrapper.in(Monitor::getId, MonitorIdsQuartic);
|
||||||
List<Monitor> monitorList = iMonitorService.list(monitorLambdaQueryWrapper);
|
List<Monitor> monitorList = iMonitorService.list(monitorLambdaQueryWrapper);
|
||||||
//提取出监测点相关的变电站id,获取变电站电压等级map(key: 变电站id value: 电压等级)
|
//提取出监测点相关的变电站id,获取变电站电压等级map(key: 变电站id value: 电压等级)
|
||||||
List<String> powerIdList = monitorList.stream().map(Monitor::getPowerrId).collect(Collectors.toList());
|
List<String> powerIdList = monitorList.stream().map(Monitor::getPowerrId).collect(Collectors.toList());
|
||||||
@@ -281,7 +208,6 @@ implements RStatZwAlarmCountWService {
|
|||||||
problemMonitorDetailVO.setPowerName(item.getPowerrName()); //变电站名称
|
problemMonitorDetailVO.setPowerName(item.getPowerrName()); //变电站名称
|
||||||
problemMonitorDetailVO.setVoltageLevel(stationVoltageLevelMap.get(item.getPowerrId())); //变电站电压等级id
|
problemMonitorDetailVO.setVoltageLevel(stationVoltageLevelMap.get(item.getPowerrId())); //变电站电压等级id
|
||||||
problemMonitorDetailVO.setVoltageLevelName(voltageLevelMap.get(stationVoltageLevelMap.get(item.getPowerrId()))); //变电站电压等级
|
problemMonitorDetailVO.setVoltageLevelName(voltageLevelMap.get(stationVoltageLevelMap.get(item.getPowerrId()))); //变电站电压等级
|
||||||
|
|
||||||
return problemMonitorDetailVO;
|
return problemMonitorDetailVO;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
return resultList;
|
return resultList;
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ public class RStatHarmonicOrgServiceImpl implements RStatHarmonicOrgService {
|
|||||||
private final RStatHarmonicOrgQPOService rStatHarmonicQPOService;
|
private final RStatHarmonicOrgQPOService rStatHarmonicQPOService;
|
||||||
private final RStatHarmonicOrgYPOService rStatHarmonicYPOService;
|
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));
|
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));
|
||||||
|
|
||||||
// 获取前 30% 的告警 id 数量
|
// 获取前 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 rStatZwAlarmCountWPO = new RStatZwAlarmCountWPO();
|
||||||
rStatZwAlarmCountWPO.setOrgNo(deptGetChildrenMoreDTO.getUnitId());
|
rStatZwAlarmCountWPO.setOrgNo(deptGetChildrenMoreDTO.getUnitId());
|
||||||
rStatZwAlarmCountWPO.setDataDate(localDate);
|
rStatZwAlarmCountWPO.setDataDate(localDate);
|
||||||
|
|||||||
Reference in New Issue
Block a user