|
@@ -0,0 +1,260 @@
|
|
|
+package com.gyee.wisdom.alarm.schedule.biz;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.gyee.wisdom.alarm.schedule.cache.StationCache;
|
|
|
+import com.gyee.wisdom.alarm.schedule.cache.WindturbineCache;
|
|
|
+import com.gyee.wisdom.alarm.schedule.entity.*;
|
|
|
+import com.gyee.wisdom.alarm.schedule.model.EarlyReportParam;
|
|
|
+import com.gyee.wisdom.alarm.schedule.model.TaskResult;
|
|
|
+import com.gyee.wisdom.alarm.schedule.util.SnowflakeGenerator;
|
|
|
+import com.gyee.wisdom.alarm.schedule.util.SpringContextUtils;
|
|
|
+import com.gyee.wisdom.common.utils.DateUtil;
|
|
|
+import lombok.Data;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.Callable;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @description:
|
|
|
+ * @auther: Wanghs
|
|
|
+ * @date: 2022-08-24
|
|
|
+ */
|
|
|
+@Data
|
|
|
+public class EarlyReportTask implements Callable<TaskResult> {
|
|
|
+
|
|
|
+ private EarlyReportParam reportParam;
|
|
|
+
|
|
|
+ private EarlyReportBiz earlyReportBiz;
|
|
|
+
|
|
|
+ private WindturbineCache windturbineCache;
|
|
|
+
|
|
|
+ public EarlyReportTask(EarlyReportParam param) {
|
|
|
+ this.reportParam = param;
|
|
|
+ earlyReportBiz = SpringContextUtils.getBean(EarlyReportBiz.class);
|
|
|
+ windturbineCache = SpringContextUtils.getBean(WindturbineCache.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public TaskResult call() {
|
|
|
+ TaskResult result = new TaskResult();
|
|
|
+
|
|
|
+ long runStartTime = new Date().getTime();
|
|
|
+ //报告时间
|
|
|
+ Date reportDate = DateUtil.today();
|
|
|
+ //获取计算开始时间
|
|
|
+ Date statStartTime = DateUtil.addDays(DateUtil.today(), -reportParam.getInterval());
|
|
|
+ //获取计算结束时间
|
|
|
+ Date statEndTime = DateUtil.today();
|
|
|
+ //风机型号
|
|
|
+ String model = reportParam.getModel();
|
|
|
+ //风场id
|
|
|
+ String stationId = reportParam.getStationId();
|
|
|
+ //风机数量限制
|
|
|
+ int limit = reportParam.getResultLimit();
|
|
|
+
|
|
|
+ EarlyReport report = new EarlyReport()
|
|
|
+ .setId(String.valueOf(SnowflakeGenerator.generateId()))
|
|
|
+ .setReportDate(new Date())
|
|
|
+ .setStationId(stationId)
|
|
|
+ .setStationName(StationCache.getStationName(stationId))
|
|
|
+ .setReportName("")
|
|
|
+ .setStatStartDate(statStartTime)
|
|
|
+ .setStatEndDate(statEndTime)
|
|
|
+ .setReportWindturbineInfoList(new ArrayList<>());
|
|
|
+
|
|
|
+ try {
|
|
|
+ //获取本次报告最差的风机信息集合
|
|
|
+ List<EarlyReportWindturbine> nowWindturbineInfoList = getNowWindturbineInfo(model, report.getId(), statStartTime, statEndTime, limit);
|
|
|
+
|
|
|
+ report.getReportWindturbineInfoList().addAll(nowWindturbineInfoList);
|
|
|
+ // 获取上次报告
|
|
|
+ List<EarlyReport> earlyReport = earlyReportBiz.getEarlyReport(stationId, DateUtil.addDays(statEndTime, -60), statEndTime);
|
|
|
+ List<EarlyReport> collect = earlyReport.stream().sorted(Comparator.comparing(EarlyReport::getId,Comparator.reverseOrder())).collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (collect.size() > 0) {
|
|
|
+ //已经进行了排序,因此获取第一个,即为最近一次报告
|
|
|
+ List<EarlyReportWindturbine> reportWindturbineInfoList = collect.get(0).getReportWindturbineInfoList().stream().filter(s->s.isCompared()==true).collect(Collectors.toList());
|
|
|
+ List<EarlyReportWindturbine> compareWindturbineInfoList = getCompareWindturbineInfo(reportWindturbineInfoList, model, report.getId(), statStartTime, statEndTime);
|
|
|
+ report.getReportWindturbineInfoList().addAll(compareWindturbineInfoList);
|
|
|
+ }
|
|
|
+
|
|
|
+ //执行写入操作
|
|
|
+ boolean b = earlyReportBiz.saveReport(report);
|
|
|
+ result.setSuccess(b);
|
|
|
+ result.setMsg(b ? "生成报告成功" : "报告保存失败");
|
|
|
+ } catch (RuntimeException ex) {
|
|
|
+ result.setSuccess(false).setMsg(ex.getStackTrace());
|
|
|
+ } finally {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param model 风机型号
|
|
|
+ * @param reportId 报告id
|
|
|
+ * @param statStartTime 统计起始时间
|
|
|
+ * @param statEndTime 统计结束时间
|
|
|
+ * @param limit 结果限制数量
|
|
|
+ * @return com.gyee.wisdom.alarm.schedule.entity.EarlyReportWindturbine
|
|
|
+ * @author Wanghs
|
|
|
+ * @description 获取本次报告风机信息
|
|
|
+ * @date 2022/8/29
|
|
|
+ **/
|
|
|
+ private List<EarlyReportWindturbine> getNowWindturbineInfo(String model, String reportId, Date statStartTime, Date statEndTime, int limit) {
|
|
|
+
|
|
|
+ List<EarlyReportWindturbine> resultList = new ArrayList<>();
|
|
|
+
|
|
|
+ List<AlertRule2> alertRule2List = earlyReportBiz.getAlertRule2(reportParam.getCustomRuleId());
|
|
|
+
|
|
|
+ List<AlarmSnap> customAlarmSnapList = earlyReportBiz.getAlarmSnap(alertRule2List.stream().map(s -> String.valueOf(s.getEdnaValue())).collect(Collectors.toList()), "custom");
|
|
|
+
|
|
|
+ List<AlarmCount> customAlarmCountList = earlyReportBiz.getAlarmCount(customAlarmSnapList.stream().map(s -> s.getId()).collect(Collectors.toList()), statStartTime, statEndTime);
|
|
|
+
|
|
|
+ Map<String, List<AlarmCount>> alarmCountMapByAlertValue = customAlarmCountList.stream().collect(Collectors.groupingBy(AlarmCount::getAlertValue));
|
|
|
+
|
|
|
+ EarlyReportWindturbine avgWindturbineReport = new EarlyReportWindturbine()
|
|
|
+ .setId(String.valueOf(SnowflakeGenerator.generateId()))
|
|
|
+ .setWindturbineId("全场平均")
|
|
|
+ .setWindturbineCode("")
|
|
|
+ .setModel("")
|
|
|
+ .setCompared(false)
|
|
|
+ .setAlarmInfoList(new ArrayList<>())
|
|
|
+ .setReportId(reportId);
|
|
|
+
|
|
|
+ for (Map.Entry<String, List<AlarmCount>> entry :
|
|
|
+ alarmCountMapByAlertValue.entrySet()) {
|
|
|
+ AlarmCount avgAlarmCount = earlyReportBiz.getAvgAlarmCount(entry.getValue());
|
|
|
+ Optional<AlertRule2> first = alertRule2List.stream().filter(s -> String.valueOf(s.getEdnaValue()).equals(entry.getKey())).findFirst();
|
|
|
+ if (first.isPresent()) {
|
|
|
+ EarlyReportAlarm alarmInfo = new EarlyReportAlarm()
|
|
|
+ .setId(String.valueOf(SnowflakeGenerator.generateId()))
|
|
|
+ .setRuleId(first.get().getId())
|
|
|
+ .setAlarmType("custom")
|
|
|
+ .setRuleName(first.get().getName())
|
|
|
+ .setRuleDescription(first.get().getDescription())
|
|
|
+ .setRank(first.get().getRank())
|
|
|
+ .setCount(avgAlarmCount.getCount())
|
|
|
+ .setKeepTime((long) avgAlarmCount.getTime().doubleValue())
|
|
|
+ .setReportWindturbineId(avgWindturbineReport.getId());
|
|
|
+
|
|
|
+ avgWindturbineReport.getAlarmInfoList().add(alarmInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ resultList.add(avgWindturbineReport);
|
|
|
+
|
|
|
+ Map<String, AlarmCount> sumAlarmCountByWindturbine = earlyReportBiz.getSumAlarmCountByWindturbine(customAlarmCountList, limit);
|
|
|
+
|
|
|
+ List<String> windturbineIdList = new ArrayList<String>(sumAlarmCountByWindturbine.keySet());
|
|
|
+
|
|
|
+ Map<String, List<AlarmCount>> windturbineLimitAlarmCountMap = customAlarmCountList.stream().filter(s -> windturbineIdList.contains(s.getWindturbineId())).collect(Collectors.groupingBy(AlarmCount::getWindturbineId));
|
|
|
+
|
|
|
+ for (Map.Entry<String, List<AlarmCount>> entry :
|
|
|
+ windturbineLimitAlarmCountMap.entrySet()) {
|
|
|
+ Map<String, Integer> sumCountByAlertValue = entry.getValue().stream().collect(Collectors.groupingBy(AlarmCount::getAlertValue, Collectors.summingInt(AlarmCount::getCount)));
|
|
|
+ Map<String, Double> sumKeepTimeByAlertValue = entry.getValue().stream().collect(Collectors.groupingBy(AlarmCount::getAlertValue, Collectors.summingDouble(AlarmCount::getTime)));
|
|
|
+
|
|
|
+ EarlyReportWindturbine reportWindturbine = new EarlyReportWindturbine()
|
|
|
+ .setId(String.valueOf(SnowflakeGenerator.generateId()))
|
|
|
+ .setWindturbineId(entry.getKey())
|
|
|
+ .setWindturbineCode(windturbineCache.getWindturbine(entry.getKey()).getCode())
|
|
|
+ .setModel(model)
|
|
|
+ .setCompared(false)
|
|
|
+ .setAlarmInfoList(new ArrayList<>())
|
|
|
+ .setReportId(reportId);
|
|
|
+
|
|
|
+ for (Map.Entry<String, Integer> sumCountEntry :
|
|
|
+ sumCountByAlertValue.entrySet()) {
|
|
|
+ Optional<AlertRule2> first = alertRule2List.stream().filter(s -> String.valueOf(s.getEdnaValue()).equals(sumCountEntry.getKey())).findFirst();
|
|
|
+ if (first.isPresent()) {
|
|
|
+ EarlyReportAlarm alarmInfo = new EarlyReportAlarm()
|
|
|
+ .setId(String.valueOf(SnowflakeGenerator.generateId()))
|
|
|
+ .setRuleId(first.get().getId())
|
|
|
+ .setAlarmType("custom")
|
|
|
+ .setRuleName(first.get().getName())
|
|
|
+ .setRuleDescription(first.get().getDescription())
|
|
|
+ .setRank(first.get().getRank())
|
|
|
+ .setCount(sumCountEntry.getValue())
|
|
|
+ .setReportWindturbineId(reportWindturbine.getId());
|
|
|
+ if (sumKeepTimeByAlertValue.containsKey(sumCountEntry.getKey())) {
|
|
|
+ alarmInfo.setKeepTime((long) sumKeepTimeByAlertValue.get(sumCountEntry.getKey()).doubleValue());
|
|
|
+ }
|
|
|
+ reportWindturbine.getAlarmInfoList().add(alarmInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ resultList.add(reportWindturbine);
|
|
|
+ }
|
|
|
+ return resultList;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param
|
|
|
+ * @param windturbineInfoList 需要对比的风机报告信息(上次报告)
|
|
|
+ * @param model 风机型号
|
|
|
+ * @param reportId 本次报告的id
|
|
|
+ * @param startTime 分析起始时间(本次分析)
|
|
|
+ * @param endTime 分析结束时间(本次分析)
|
|
|
+ * @return com.gyee.wisdom.alarm.schedule.entity.EarlyReportWindturbine
|
|
|
+ * @author Wanghs
|
|
|
+ * @description 获取上次报告中的风机与本周报告对比信息
|
|
|
+ * @date 2022/8/29
|
|
|
+ **/
|
|
|
+
|
|
|
+ private List<EarlyReportWindturbine> getCompareWindturbineInfo(List<EarlyReportWindturbine> windturbineInfoList, String model, String reportId, Date startTime, Date endTime) {
|
|
|
+
|
|
|
+ List<EarlyReportWindturbine> resultList = new ArrayList<>();
|
|
|
+ List<String> windturbineIdList = windturbineInfoList.stream().map(s -> s.getWindturbineId()).collect(Collectors.toList());
|
|
|
+ List<EarlyReportAlarm> reportAlarmList = new ArrayList<>();
|
|
|
+ windturbineInfoList.forEach(s -> {
|
|
|
+ reportAlarmList.addAll(s.getAlarmInfoList());
|
|
|
+ });
|
|
|
+ List<AlertRule2> alertRule2List = earlyReportBiz.getAlertRule2(reportAlarmList.stream().map(s -> s.getRuleId()).collect(Collectors.toList()));
|
|
|
+ List<AlarmSnap> customAlarmSnapList = earlyReportBiz.getAlarmSnap(alertRule2List.stream().map(s -> String.valueOf(s.getEdnaValue())).collect(Collectors.toList()), "custom");
|
|
|
+ List<AlarmCount> customAlarmCountList = earlyReportBiz.getAlarmCount(customAlarmSnapList.stream().map(s -> s.getId()).collect(Collectors.toList()), startTime, endTime);
|
|
|
+ Map<String, List<AlarmCount>> windturbineAlarmCountMap = customAlarmCountList.stream().filter(s -> windturbineIdList.contains(s.getWindturbineId())).collect(Collectors.groupingBy(AlarmCount::getWindturbineId));
|
|
|
+
|
|
|
+ for (Map.Entry<String, List<AlarmCount>> entry :
|
|
|
+ windturbineAlarmCountMap.entrySet()) {
|
|
|
+ EarlyReportWindturbine reportWindturbine = new EarlyReportWindturbine()
|
|
|
+ .setId(String.valueOf(SnowflakeGenerator.generateId()))
|
|
|
+ .setWindturbineId(entry.getKey())
|
|
|
+ .setWindturbineCode(windturbineCache.getWindturbine(entry.getKey()).getCode())
|
|
|
+ .setModel(model)
|
|
|
+ .setCompared(true)
|
|
|
+ .setAlarmInfoList(new ArrayList<>())
|
|
|
+ .setReportId(reportId);
|
|
|
+
|
|
|
+ Optional<EarlyReportWindturbine> oldReportWindturbine = windturbineInfoList.stream().filter(s -> s.getWindturbineId().equals(entry.getKey())).findFirst();
|
|
|
+ if (oldReportWindturbine.isPresent())
|
|
|
+ reportWindturbine.setCompareId(oldReportWindturbine.get().getId());
|
|
|
+
|
|
|
+ Map<String, Integer> sumCountByAlertValue = entry.getValue().stream().collect(Collectors.groupingBy(AlarmCount::getAlertValue, Collectors.summingInt(AlarmCount::getCount)));
|
|
|
+ Map<String, Double> sumKeepTimeByAlertValue = entry.getValue().stream().collect(Collectors.groupingBy(AlarmCount::getAlertValue, Collectors.summingDouble(AlarmCount::getTime)));
|
|
|
+
|
|
|
+ for (Map.Entry<String, Integer> sumCountEntry :
|
|
|
+ sumCountByAlertValue.entrySet()) {
|
|
|
+ Optional<AlertRule2> first = alertRule2List.stream().filter(s -> String.valueOf(s.getEdnaValue()).equals(sumCountEntry.getKey())).findFirst();
|
|
|
+ if (first.isPresent()) {
|
|
|
+ EarlyReportAlarm alarmInfo = new EarlyReportAlarm()
|
|
|
+ .setId(String.valueOf(SnowflakeGenerator.generateId()))
|
|
|
+ .setRuleId(first.get().getId())
|
|
|
+ .setAlarmType("custom")
|
|
|
+ .setRuleName(first.get().getName())
|
|
|
+ .setRuleDescription(first.get().getDescription())
|
|
|
+ .setRank(first.get().getRank())
|
|
|
+ .setCount(sumCountEntry.getValue())
|
|
|
+ .setReportWindturbineId(reportWindturbine.getReportId());
|
|
|
+ if (sumKeepTimeByAlertValue.containsKey(sumCountEntry.getKey())) {
|
|
|
+ alarmInfo.setKeepTime((long) sumKeepTimeByAlertValue.get(sumCountEntry.getKey()).doubleValue());
|
|
|
+ }
|
|
|
+ reportWindturbine.getAlarmInfoList().add(alarmInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ resultList.add(reportWindturbine);
|
|
|
+ }
|
|
|
+ return resultList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|