DYL0109
2025-04-18 b36d66e090487d54d6664199ca9a807c13fb074b
报警分析优化

报警分析优化
已添加1个文件
已修改3个文件
182 ■■■■■ 文件已修改
zhitan-system/src/main/java/com/zhitan/alarm/services/impl/AlarmAnalyisisServiceImpl.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-system/src/main/java/com/zhitan/basicdata/domain/vo/MeterImplementModel.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-system/src/main/java/com/zhitan/model/mapper/EnergyIndexMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhitan-system/src/main/resources/mapper/model/EnergyIndexMapper.xml 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,53 +101,86 @@
        query.setNodeId(nodeId);
        final List<JkHistoryAlarm> jkHistoryAlarms = historyAlarmMapper.selectJkHistoryAlarmList(query);
        if(CollectionUtils.isNotEmpty(jkHistoryAlarms)) {
            // è®¾ç½®èƒ½æºç±»åž‹
            processEnergyType(jkHistoryAlarms);
            // è®¡ç®—报警类型比例
            calculateProportions(jkHistoryAlarms, alarmProportionList, JkHistoryAlarm::getIndexType);
            // è®¡ç®—能源类型比例
            calculateProportions(jkHistoryAlarms, energyProportionList, JkHistoryAlarm::getEnergyId);
            // å¤„理报警时间
            processAlarmTimes(jkHistoryAlarms, timeFormat);
            // ç”Ÿæˆå›¾è¡¨æ•°æ®
            generateChartData(chartDataList, jkHistoryAlarms, beginTime, endTime, timeFormat, queryTimeType);
        }
        alarmAnalysisVO.setAlarmProportion(alarmProportionList);
        alarmAnalysisVO.setEnergyProportion(energyProportionList);
        alarmAnalysisVO.setChartDataList(chartDataList);
        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 -> {
                final String indexType = alarm.getIndexType();
                final String indexId = alarm.getIndexId();
                final String alarmNodeId = alarm.getNodeId();
                if ("COLLECT".equals(indexType) && StringUtils.isEmpty(alarm.getEnergyId())) {
                    //根据nodeId和indexId åŽ»æŸ¥è¯¢è®¡é‡å™¨å…·
                    EnergyIndex energyIndex = energyIndexMapper.selectEnergyIndexById(indexId);
                    final MeterImplement meterImplement = meterImplementMapper.selectMeterImplementById(energyIndex.getMeterId());
                    alarm.setEnergyId(meterImplement.getEnergyType());
                    if (IndexType.COLLECT.getDescription().equals(alarm.getIndexType()) && StringUtils.isEmpty(alarm.getEnergyId())){
                        alarm.setEnergyId(energyMap.get(alarm.getIndexId()));
                }
            });
            final Map<String, List<JkHistoryAlarm>> alarmTypeMap = jkHistoryAlarms.stream().collect(Collectors.groupingBy(JkHistoryAlarm::getIndexType));
            alarmTypeMap.forEach((key, value) -> {
                alarmProportionList.forEach(alarm->{
            }
        }
    }
    /**
     * è®¡ç®—占比
     */
    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.setEnergyName(key);
                        alarm.setCount(format2Double(value.size()));
                        double percentage = value.size() / jkHistoryAlarms.size() * 100;
                    double percentage = (double) 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));
                    }
                });
                
            });
    /**
     * å¤„理报警时间
     */
    private void processAlarmTimes(List<JkHistoryAlarm> jkHistoryAlarms, String timeFormat) {
            jkHistoryAlarms.forEach(jkHistoryAlarm -> {
                final String alarmBeginTime = DateUtil.format(jkHistoryAlarm.getAlarmBeginTime(), timeFormat);
            String alarmBeginTime = DateUtil.format(jkHistoryAlarm.getAlarmBeginTime(), timeFormat);
                jkHistoryAlarm.setAlarmTime(alarmBeginTime);
            });
            final Map<String, List<JkHistoryAlarm>> timeMap = jkHistoryAlarms.stream().collect(Collectors.groupingBy(JkHistoryAlarm::getAlarmTime));
    }
    /**
     * ç”Ÿæˆå›¾è¡¨æ•°æ®
     */
    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)) {
                final String currentTime = DateUtil.format(beginTime, timeFormat);
                final List<JkHistoryAlarm> value = timeMap.get(currentTime);
            String currentTime = DateUtil.format(beginTime, timeFormat);
            List<JkHistoryAlarm> value = timeMap.get(currentTime);
                ChartData chartData = new ChartData();
                chartData.setXData(currentTime);
                chartData.setYValue(null == value?0:(double)value.size());
            chartData.setYValue(value == null ? 0 : (double) value.size());
                chartDataList.add(chartData);
                switch (TimeType.valueOf(queryTimeType)) {
@@ -174,10 +196,20 @@
                }
            }
        }
        alarmAnalysisVO.setAlarmProportion(alarmProportionList);
        alarmAnalysisVO.setEnergyProportion(energyProportionList);
        alarmAnalysisVO.setChartDataList(chartDataList);
        return alarmAnalysisVO;
    /**
     * åˆå§‹åŒ–占比列表
     */
    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) {
zhitan-system/src/main/java/com/zhitan/basicdata/domain/vo/MeterImplementModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.zhitan.basicdata.domain.vo;
import lombok.Data;
@Data
public class MeterImplementModel {
    /**
     * indexId
     */
    private String indexId;
    /**
     * meterId
     */
    private String meterId;
    /**
     * èƒ½æºç±»åž‹
     */
    private String energyType;
}
zhitan-system/src/main/java/com/zhitan/model/mapper/EnergyIndexMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zhitan.basicdata.domain.vo.MeterImplementModel;
import com.zhitan.model.domain.EnergyIndex;
import com.zhitan.model.domain.EnergyIndexQuery;
import com.zhitan.model.domain.vo.ModelNodeIndexInfo;
@@ -105,4 +106,6 @@
  List<EnergyIndex> getIndexByMeterIdIndexCode(@Param("meterId") String meterId, @Param("indexCode") String indexCode, @Param("nodeId") String nodeId);
  List<ModelNodeIndexInfo> getModelNodeIndexInfoListByIndexIds(@Param("indexIds") String[] indexIds);
  List<MeterImplementModel> selectEnergyTypeByIndex(@Param("indexIds") List<String> indexIds);
}
zhitan-system/src/main/resources/mapper/model/EnergyIndexMapper.xml
@@ -34,7 +34,8 @@
    from energy_index
  </sql>
  <select id="selectEnergyIndexList" parameterType="com.zhitan.model.domain.EnergyIndex" resultMap="EnergyIndexResult">
    <select id="selectEnergyIndexList" parameterType="com.zhitan.model.domain.EnergyIndex"
            resultMap="EnergyIndexResult">
    select ni.index_id, name, code, index_type, remark, unit_id, index_category
    from energy_index ei left join node_index ni on ei.index_id = ni.index_id
    <where>
@@ -187,7 +188,8 @@
  </insert>
  <insert id="insertNodeIndex">
    insert into node_index (node_id, index_id) values (#{nodeId}, #{indexId});
        insert into node_index (node_id, index_id)
        values (#{nodeId}, #{indexId});
  </insert>
  <insert id="insertEnergyIndices">
    <foreach collection="energyIndices" item="energyIndex" separator=";">
@@ -336,7 +338,8 @@
    select ni.index_id, name, code, index_type, remark, unit_id, index_category
    from energy_index ei left join node_index ni on ei.index_id = ni.index_id
    <where>
      <if test="query.codeOrName != null  and query.codeOrName != ''">and (name like concat('%', #{query.codeOrName},
            <if test="query.codeOrName != null  and query.codeOrName != ''">and (name like concat('%',
                #{query.codeOrName},
        '%') or code like concat('%', #{query.codeOrName}, '%'))
      </if>
      <if test="query.indexType != null">and index_type = #{query.indexType}</if>
@@ -427,4 +430,16 @@
            #{indexId}
        </foreach>
    </select>
    <select id="selectEnergyTypeByIndex" resultType="com.zhitan.basicdata.domain.vo.MeterImplementModel">
        select ex.index_id indexId,
               mi.id meterId,
               mi.energy_type energyType
        from energy_index ex
                 left join meter_implement mi on ex.meter_id = mi.id
        where ex.index_id in
        <foreach collection="indexIds" item="indexId" open="(" separator="," close=")">
            #{indexId}
        </foreach>
    </select>
</mapper>