From b36d66e090487d54d6664199ca9a807c13fb074b Mon Sep 17 00:00:00 2001
From: DYL0109 <dn18191638832@163.com>
Date: 星期五, 18 四月 2025 19:12:05 +0800
Subject: [PATCH] 报警分析优化

---
 zhitan-system/src/main/java/com/zhitan/alarm/services/impl/AlarmAnalyisisServiceImpl.java |  184 +++++++++++++++++++++++++++-------------------
 1 files changed, 108 insertions(+), 76 deletions(-)

diff --git a/zhitan-system/src/main/java/com/zhitan/alarm/services/impl/AlarmAnalyisisServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/alarm/services/impl/AlarmAnalyisisServiceImpl.java
index b416f28..f18bbc5 100644
--- a/zhitan-system/src/main/java/com/zhitan/alarm/services/impl/AlarmAnalyisisServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/alarm/services/impl/AlarmAnalyisisServiceImpl.java
@@ -8,8 +8,8 @@
 import com.zhitan.alarm.domain.vo.AlarmAnalysisVO;
 import com.zhitan.alarm.mapper.HistoryAlarmMapper;
 import com.zhitan.alarm.services.IAlarmAnalysisService;
-import com.zhitan.basicdata.domain.MeterImplement;
 import com.zhitan.basicdata.domain.SysEnergy;
+import com.zhitan.basicdata.domain.vo.MeterImplementModel;
 import com.zhitan.basicdata.mapper.MeterImplementMapper;
 import com.zhitan.basicdata.mapper.SysEnergyMapper;
 import com.zhitan.common.enums.IndexType;
@@ -17,7 +17,6 @@
 import com.zhitan.common.utils.StringUtils;
 import com.zhitan.consumptionanalysis.domain.vo.ChartData;
 import com.zhitan.consumptionanalysis.domain.vo.EnergyProportion;
-import com.zhitan.model.domain.EnergyIndex;
 import com.zhitan.model.domain.ModelNode;
 import com.zhitan.model.domain.vo.ModelNodeIndexInfo;
 import com.zhitan.model.mapper.EnergyIndexMapper;
@@ -27,10 +26,7 @@
 import org.springframework.stereotype.Service;
 
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -62,19 +58,12 @@
     @Override
     public AlarmAnalysisVO getByNodeId(AlarmAnalysisDTO alarmAnalysisDTO) {
         AlarmAnalysisVO alarmAnalysisVO = new AlarmAnalysisVO();
-        List<EnergyProportion> alarmProportionList = new ArrayList<>();
-        for(IndexType indexType : IndexType.values()){
-            EnergyProportion proportion = new EnergyProportion();
-            proportion.setEnergyName(indexType.name());
-            proportion.setCount(0D);
-            proportion.setPercentage(0D);
-            alarmProportionList.add(proportion);
-        }
-                
-                
+        // 鍒濆鍖栨姤璀︽瘮渚嬪垪琛�
+        List<EnergyProportion> alarmProportionList = initializeProportionList(IndexType.values());
+        // 鍒濆鍖栬兘婧愭瘮渚嬪垪琛�
         List<EnergyProportion> energyProportionList = new ArrayList<>();
-        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(new SysEnergy());
-        sysEnergies.forEach(sysEnergy -> {
+
+        sysEnergyMapper.selectSysEnergyList(new SysEnergy()).forEach(sysEnergy -> {
             EnergyProportion proportion = new EnergyProportion();
             proportion.setEnergyName(sysEnergy.getEnersno());
             proportion.setCount(0D);
@@ -112,67 +101,21 @@
         query.setNodeId(nodeId);
         final List<JkHistoryAlarm> jkHistoryAlarms = historyAlarmMapper.selectJkHistoryAlarmList(query);
         if(CollectionUtils.isNotEmpty(jkHistoryAlarms)) {
-            jkHistoryAlarms.forEach(alarm -> {
-                final String indexType = alarm.getIndexType();
-                final String indexId = alarm.getIndexId();
-                final String alarmNodeId = alarm.getNodeId();
-                if ("COLLECT".equals(indexType) && StringUtils.isEmpty(alarm.getEnergyId())) {
-                    //鏍规嵁nodeId鍜宨ndexId 鍘绘煡璇㈣閲忓櫒鍏�
-                    EnergyIndex energyIndex = energyIndexMapper.selectEnergyIndexById(indexId);
-                    final MeterImplement meterImplement = meterImplementMapper.selectMeterImplementById(energyIndex.getMeterId());
-                    alarm.setEnergyId(meterImplement.getEnergyType());
-                }
-            });
-            final Map<String, List<JkHistoryAlarm>> alarmTypeMap = jkHistoryAlarms.stream().collect(Collectors.groupingBy(JkHistoryAlarm::getIndexType));
-            alarmTypeMap.forEach((key, value) -> {
-                alarmProportionList.forEach(alarm->{
-                    if(alarm.getEnergyName().equals(key)){
-                        alarm.setEnergyName(key);
-                        alarm.setCount(format2Double(value.size()));
-                        double percentage = value.size() / jkHistoryAlarms.size() * 100;
-                        alarm.setPercentage(format2Double(percentage));
-                    }
-                });
-            });
-            final Map<String, List<JkHistoryAlarm>> energyTypeMap = jkHistoryAlarms.stream().collect(Collectors.groupingBy(JkHistoryAlarm::getEnergyId));
-            energyTypeMap.forEach((key, value) -> {
-                energyProportionList.forEach(en->{
-                    if(en.getEnergyName().equals(key)){
-                        en.setEnergyName(key);
-                        en.setCount(format2Double(value.size()));
-                        double percentage = value.size() / jkHistoryAlarms.size() * 100;
-                        en.setPercentage(format2Double(percentage));
-                    }
-                });
-                
-            });
 
+            // 璁剧疆鑳芥簮绫诲瀷
+            processEnergyType(jkHistoryAlarms);
 
-            jkHistoryAlarms.forEach(jkHistoryAlarm -> {
-                final String alarmBeginTime = DateUtil.format(jkHistoryAlarm.getAlarmBeginTime(), timeFormat);
-                jkHistoryAlarm.setAlarmTime(alarmBeginTime);
-            });
-            final Map<String, List<JkHistoryAlarm>> timeMap = jkHistoryAlarms.stream().collect(Collectors.groupingBy(JkHistoryAlarm::getAlarmTime));
-            while (!beginTime.after(endTime)) {
-                final String currentTime = DateUtil.format(beginTime, timeFormat);
-                final List<JkHistoryAlarm> value = timeMap.get(currentTime);
-                ChartData chartData = new ChartData();
-                chartData.setXData(currentTime);
-                chartData.setYValue(null == value?0:(double)value.size());
-                chartDataList.add(chartData);
+            // 璁$畻鎶ヨ绫诲瀷姣斾緥
+            calculateProportions(jkHistoryAlarms, alarmProportionList, JkHistoryAlarm::getIndexType);
+            // 璁$畻鑳芥簮绫诲瀷姣斾緥
+            calculateProportions(jkHistoryAlarms, energyProportionList, JkHistoryAlarm::getEnergyId);
 
-                switch (TimeType.valueOf(queryTimeType)) {
-                    case DAY:
-                        beginTime = DateUtil.offsetHour(beginTime, 1);
-                        break;
-                    case MONTH:
-                        beginTime = DateUtil.offsetDay(beginTime, 1);
-                        break;
-                    default:
-                        beginTime = DateUtil.offsetMonth(beginTime, 1);
-                        break;
-                }
-            }
+            // 澶勭悊鎶ヨ鏃堕棿
+            processAlarmTimes(jkHistoryAlarms, timeFormat);
+
+            // 鐢熸垚鍥捐〃鏁版嵁
+            generateChartData(chartDataList, jkHistoryAlarms, beginTime, endTime, timeFormat, queryTimeType);
+
         }
         alarmAnalysisVO.setAlarmProportion(alarmProportionList);
         alarmAnalysisVO.setEnergyProportion(energyProportionList);
@@ -180,6 +123,95 @@
         return alarmAnalysisVO;
     }
 
+    /**
+     * 璁剧疆鑳芥簮绫诲瀷
+     */
+    private void processEnergyType(List<JkHistoryAlarm> jkHistoryAlarms) {
+        List<String> indexIds = jkHistoryAlarms.stream().map(JkHistoryAlarm::getIndexId).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(indexIds)) {
+            List<MeterImplementModel> modelList = energyIndexMapper.selectEnergyTypeByIndex(indexIds);
+            if (CollectionUtils.isNotEmpty(modelList)){
+                Map<String, String> energyMap = modelList.stream().collect(Collectors.toMap(MeterImplementModel::getIndexId, MeterImplementModel::getEnergyType));
+
+                jkHistoryAlarms.forEach(alarm -> {
+                    if (IndexType.COLLECT.getDescription().equals(alarm.getIndexType()) && StringUtils.isEmpty(alarm.getEnergyId())){
+                        alarm.setEnergyId(energyMap.get(alarm.getIndexId()));
+                    }
+                });
+            }
+        }
+    }
+
+    /**
+     * 璁$畻鍗犳瘮
+     */
+    private void calculateProportions(List<JkHistoryAlarm> jkHistoryAlarms, List<EnergyProportion> proportionList, java.util.function.Function<JkHistoryAlarm, String> keyExtractor) {
+        Map<String, List<JkHistoryAlarm>> typeMap = jkHistoryAlarms.stream()
+                .collect(Collectors.groupingBy(keyExtractor));
+        typeMap.forEach((key, value) -> {
+            proportionList.forEach(alarm -> {
+                if (alarm.getEnergyName().equals(key)) {
+                    alarm.setCount(format2Double(value.size()));
+                    double percentage = (double) value.size() / jkHistoryAlarms.size() * 100;
+                    alarm.setPercentage(format2Double(percentage));
+                }
+            });
+        });
+    }
+
+    /**
+     * 澶勭悊鎶ヨ鏃堕棿
+     */
+    private void processAlarmTimes(List<JkHistoryAlarm> jkHistoryAlarms, String timeFormat) {
+        jkHistoryAlarms.forEach(jkHistoryAlarm -> {
+            String alarmBeginTime = DateUtil.format(jkHistoryAlarm.getAlarmBeginTime(), timeFormat);
+            jkHistoryAlarm.setAlarmTime(alarmBeginTime);
+        });
+    }
+
+    /**
+     * 鐢熸垚鍥捐〃鏁版嵁
+     */
+    private void generateChartData(List<ChartData> chartDataList, List<JkHistoryAlarm> jkHistoryAlarms, Date beginTime, Date endTime, String timeFormat, String queryTimeType) {
+        Map<String, List<JkHistoryAlarm>> timeMap = jkHistoryAlarms.stream()
+                .collect(Collectors.groupingBy(JkHistoryAlarm::getAlarmTime));
+        while (!beginTime.after(endTime)) {
+            String currentTime = DateUtil.format(beginTime, timeFormat);
+            List<JkHistoryAlarm> value = timeMap.get(currentTime);
+            ChartData chartData = new ChartData();
+            chartData.setXData(currentTime);
+            chartData.setYValue(value == null ? 0 : (double) value.size());
+            chartDataList.add(chartData);
+
+            switch (TimeType.valueOf(queryTimeType)) {
+                case DAY:
+                    beginTime = DateUtil.offsetHour(beginTime, 1);
+                    break;
+                case MONTH:
+                    beginTime = DateUtil.offsetDay(beginTime, 1);
+                    break;
+                default:
+                    beginTime = DateUtil.offsetMonth(beginTime, 1);
+                    break;
+            }
+        }
+    }
+
+    /**
+     * 鍒濆鍖栧崰姣斿垪琛�
+     */
+    private List<EnergyProportion> initializeProportionList(Object[] items) {
+        List<EnergyProportion> proportionList = new ArrayList<>();
+        for (Object item : items) {
+            EnergyProportion proportion = new EnergyProportion();
+            proportion.setEnergyName(item.toString());
+            proportion.setCount(0D);
+            proportion.setPercentage(0D);
+            proportionList.add(proportion);
+        }
+        return proportionList;
+    }
+
     private double format2Double(double averageEnergy) {
         // 鍒涘缓DecimalFormat瀵硅薄锛岃缃繚鐣欎袱浣嶅皬鏁�
         DecimalFormat df = new DecimalFormat("#.00");

--
Gitblit v1.9.3