From 12ea7330bac0a43818b8ec3a8601119dd609dfb9 Mon Sep 17 00:00:00 2001
From: ustcyc <yincun@163.com>
Date: 星期五, 18 四月 2025 22:43:12 +0800
Subject: [PATCH] Merge branch 'master' of https://github.com/zhitan-cloud/zhitan-ems

---
 zhitan-system/src/main/java/com/zhitan/alarm/services/impl/AlarmAnalyisisServiceImpl.java |  255 ++++++++++++++++++++++++++++++--------------------
 1 files changed, 154 insertions(+), 101 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 3545c7d..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
@@ -2,13 +2,14 @@
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhitan.alarm.domain.JkHistoryAlarm;
 import com.zhitan.alarm.domain.dto.AlarmAnalysisDTO;
 import com.zhitan.alarm.domain.vo.AlarmAnalysisVO;
 import com.zhitan.alarm.mapper.HistoryAlarmMapper;
-import com.zhitan.alarm.services.IAlarmAnalyisisService;
-import com.zhitan.basicdata.domain.MeterImplement;
+import com.zhitan.alarm.services.IAlarmAnalysisService;
 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;
@@ -16,7 +17,7 @@
 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;
 import com.zhitan.model.mapper.ModelNodeMapper;
@@ -25,21 +26,18 @@
 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;
 
 /**
- * description todu
+ * 鎶ヨ鍒嗘瀽瀹炵幇
  *
- * @author hmj
- * @date 2024-10-26 17:34
+ * @author
+ * @date
  */
 @Service
 @AllArgsConstructor
-public class AlarmAnalyisisServiceImpl implements IAlarmAnalyisisService {
+public class AlarmAnalyisisServiceImpl implements IAlarmAnalysisService {
 
     private final ModelNodeMapper modelNodeMapper;
     
@@ -50,22 +48,22 @@
     private final EnergyIndexMapper energyIndexMapper;
     
     private final SysEnergyMapper sysEnergyMapper;
+
+    /**
+     * 鏍规嵁鑺傜偣id鑾峰彇鎶ヨ鍒嗘瀽淇℃伅
+     *
+     * @param alarmAnalysisDTO
+     * @return
+     */
     @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);
@@ -103,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);
@@ -171,29 +123,93 @@
         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));
 
-    @Override
-    public AlarmAnalysisVO getCountInfo(AlarmAnalysisDTO alarmAnalysisDTO) {
-        AlarmAnalysisVO alarmAnalysisVO = new AlarmAnalysisVO();
-        final String nodeId = alarmAnalysisDTO.getNodeId();
-        final DateTime beginOfMonth = DateUtil.beginOfMonth(new Date());
-        final DateTime endOfMonth = DateUtil.endOfMonth(new Date());
-        final DateTime beginOfYear = DateUtil.beginOfYear(new Date());
-        final DateTime endOfYear = DateUtil.endOfYear(new Date());
+                jkHistoryAlarms.forEach(alarm -> {
+                    if (IndexType.COLLECT.getDescription().equals(alarm.getIndexType()) && StringUtils.isEmpty(alarm.getEnergyId())){
+                        alarm.setEnergyId(energyMap.get(alarm.getIndexId()));
+                    }
+                });
+            }
+        }
+    }
 
-        /**
-         * 鏌ヨ鐐逛綅涓庣敤鑳藉崟鍏冧俊鎭�
-         */
-        List<ModelNodeIndexInfo> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,null);
-        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toList());
+    /**
+     * 璁$畻鍗犳瘮
+     */
+    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));
+                }
+            });
+        });
+    }
 
-        Integer monthCount = historyAlarmMapper.selectCountByTime(beginOfMonth,endOfMonth);
-        Integer yearCount = historyAlarmMapper.selectCountByTime(beginOfYear,endOfYear);
-        
-        alarmAnalysisVO.setIndexCount(indexIds.size());
-        alarmAnalysisVO.setMonthCount(monthCount);
-        alarmAnalysisVO.setYearCount(yearCount);
-        return alarmAnalysisVO;
+    /**
+     * 澶勭悊鎶ヨ鏃堕棿
+     */
+    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) {
@@ -204,4 +220,41 @@
         String formattedResult = df.format(averageEnergy);
         return Double.valueOf(formattedResult);
     }
+
+    /**
+     * 鑾峰彇鎶ヨ鍒嗘瀽缁熻淇℃伅
+     * @param alarmAnalysisDTO
+     * @return
+     */
+    @Override
+    public AlarmAnalysisVO getCountInfo(AlarmAnalysisDTO alarmAnalysisDTO) {
+
+        AlarmAnalysisVO alarmAnalysisVO = new AlarmAnalysisVO();
+
+        ModelNode parentNode = modelNodeMapper.selectModelNodeById(alarmAnalysisDTO.getNodeId());
+        if(ObjectUtils.isEmpty(parentNode)){
+            return alarmAnalysisVO;
+        }
+
+        // 鏌ヨ妯″瀷涓嬬殑鐐逛綅鏁版嵁
+        List<ModelNodeIndexInfo> nodeIndexInfoList = modelNodeMapper.getAllModelNodeIndexByAddress(parentNode.getModelCode(), parentNode.getAddress());
+        alarmAnalysisVO.setIndexCount(nodeIndexInfoList.size());
+        if (CollectionUtils.isEmpty(nodeIndexInfoList)) {
+            return alarmAnalysisVO;
+        }
+
+        // 鑾峰彇鏈堟姤璀︽暟銆佸勾鎶ヨ鏁�
+        List<String> indexIdList = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toList());
+
+        DateTime beginOfMonth = DateUtil.beginOfMonth(new Date());
+        DateTime endOfMonth = DateUtil.endOfMonth(new Date());
+        DateTime beginOfYear = DateUtil.beginOfYear(new Date());
+        DateTime endOfYear = DateUtil.endOfYear(new Date());
+        Integer monthCount = historyAlarmMapper.selectCountByTime(beginOfMonth,endOfMonth, indexIdList);
+        Integer yearCount = historyAlarmMapper.selectCountByTime(beginOfYear,endOfYear, indexIdList);
+
+        alarmAnalysisVO.setMonthCount(monthCount);
+        alarmAnalysisVO.setYearCount(yearCount);
+        return alarmAnalysisVO;
+    }
 }

--
Gitblit v1.9.3