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

报警分析优化
已添加1个文件
已修改3个文件
1000 ■■■■ 文件已修改
zhitan-system/src/main/java/com/zhitan/alarm/services/impl/AlarmAnalyisisServiceImpl.java 184 ●●●●● 补丁 | 查看 | 原始文档 | 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 791 ●●●● 补丁 | 查看 | 原始文档 | 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,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和indexId åŽ»æŸ¥è¯¢è®¡é‡å™¨å…·
                    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");
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
@@ -1,317 +1,319 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhitan.model.mapper.EnergyIndexMapper">
  <resultMap type="com.zhitan.model.domain.EnergyIndex" id="EnergyIndexResult">
    <result property="indexId" column="index_id"/>
    <result property="name" column="name"/>
    <result property="code" column="code"/>
    <result property="indexType" column="index_type"/>
    <result property="indexCategory" column="index_category"/>
    <result property="remark" column="remark"/>
    <result property="unitId" column="unit_id"/>
    <result property="meterId" column="meter_id"/>
    <result property="orderNum" column="order_num"/>
    <result property="equipment" column="equipment"/>
    <result property="energyId" column="energy_id"/>
    <result property="meterName" column="meter_name"/>
  </resultMap>
    <resultMap type="com.zhitan.model.domain.EnergyIndex" id="EnergyIndexResult">
        <result property="indexId" column="index_id"/>
        <result property="name" column="name"/>
        <result property="code" column="code"/>
        <result property="indexType" column="index_type"/>
        <result property="indexCategory" column="index_category"/>
        <result property="remark" column="remark"/>
        <result property="unitId" column="unit_id"/>
        <result property="meterId" column="meter_id"/>
        <result property="orderNum" column="order_num"/>
        <result property="equipment" column="equipment"/>
        <result property="energyId" column="energy_id"/>
        <result property="meterName" column="meter_name"/>
    </resultMap>
  <sql id="selectEnergyIndexVo">
    select index_id,
           name,
           code,
           index_type,
           index_category,
           remark,
           unit_id,
           meter_id,
           order_num,
           equipment,
           energy_id
    from energy_index
  </sql>
    <sql id="selectEnergyIndexVo">
        select index_id,
               name,
               code,
               index_type,
               index_category,
               remark,
               unit_id,
               meter_id,
               order_num,
               equipment,
               energy_id
        from energy_index
    </sql>
  <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>
      <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
      <if test="code != null  and code != ''">and code like concat('%', #{code}, '%')</if>
      <if test="indexType != null">and index_type = #{indexType}</if>
      <if test="nodeId != null  and nodeId != ''">and node_id = #{nodeId}</if>
      <if test="indexCategory != null  and indexCategory != ''">and index_category =
        #{indexCategory}
      </if>
    </where>
    order by ei.order_num
  </select>
    <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>
            <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
            <if test="code != null  and code != ''">and code like concat('%', #{code}, '%')</if>
            <if test="indexType != null">and index_type = #{indexType}</if>
            <if test="nodeId != null  and nodeId != ''">and node_id = #{nodeId}</if>
            <if test="indexCategory != null  and indexCategory != ''">and index_category =
                #{indexCategory}
            </if>
        </where>
        order by ei.order_num
    </select>
  <select id="selectEnergyIndexById" parameterType="String" resultMap="EnergyIndexResult">
    <include refid="selectEnergyIndexVo"/>
    where index_id = #{indexId}
    order by order_num
  </select>
    <select id="selectEnergyIndexById" parameterType="String" resultMap="EnergyIndexResult">
        <include refid="selectEnergyIndexVo"/>
        where index_id = #{indexId}
        order by order_num
    </select>
  <select id="selectEnergyIndexByIds" resultType="com.zhitan.model.domain.EnergyIndex">
    <include refid="selectEnergyIndexVo"/>
    where
    <select id="selectEnergyIndexByIds" resultType="com.zhitan.model.domain.EnergyIndex">
        <include refid="selectEnergyIndexVo"/>
        where
        index_id IN
        <foreach collection="indexIds" item="indexId" open="(" separator="," close=")">
          #{indexId}
            #{indexId}
        </foreach>
  </select>
    </select>
  <select id="energyIndexHasExist" resultType="java.lang.Integer">
    select count(*)
    from energy_index
    where code = #{code};
  </select>
  <select id="energyIndexHasExistWhenUpdate" resultType="java.lang.Integer">
    select count(*)
    from energy_index
    where code = #{code}
      AND index_id != #{indexId};
  </select>
  <select id="getMeterIndex" resultMap="EnergyIndexResult">
    <include refid="selectEnergyIndexVo"/>
    where meter_id = #{meterId}
    order by order_num
  </select>
  <select id="modelHasConfig" resultType="java.lang.Integer">
    select count(*)
    from model_node
    where model_code = #{modelCode};
  </select>
  <select id="selectCollectIndex" resultMap="EnergyIndexResult">
    <include refid="selectEnergyIndexVo"/>
    where meter_id = #{deviceId}
    order by order_num
  </select>
  <select id="getEnergyIndexByIds" resultMap="EnergyIndexResult">
    <include refid="selectEnergyIndexVo"/>
    where index_id in
    <foreach item="indexId" collection="list" open="(" separator="," close=")">
      #{indexId}
    </foreach>
    order by order_num
  </select>
  <select id="getEnergyIndexByCodes" resultMap="EnergyIndexResult">
    <include refid="selectEnergyIndexVo"/>
    where code in
    <foreach item="indexCode" collection="list" open="(" separator="," close=")">
      #{indexCode}
    </foreach>
    order by order_num
  </select>
  <select id="getIndexByNodeAndChildrenNode" resultMap="EnergyIndexResult">
    select ei.*
    from energy_index ei
           left join node_index ni on ei.index_id = ni.index_id
    where ni.node_id in (select node_id
                         from model_node
                         where address like (select address
                                             from model_node
                                             where node_id = #{nodeId}) || '%')
    order by ei.order_num
  </select>
  <select id="searchIndexByNodeAndChildrenNode" resultMap="EnergyIndexResult">
    select ei.*
    from energy_index ei
           left join node_index ni on ei.index_id = ni.index_id
    where ni.node_id in (select node_id
                         from model_node
                         where address like (select address
                                             from model_node
                                             where node_id = #{nodeId}) || '%')
      and (ei.code like concat('%', #{filter}, '%') or ei.name like concat('%', #{filter}, '%'))
    order by ei.order_num
  </select>
  <select id="selectEnergyIndex" 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>
      <if test="codeOrName != null  and codeOrName != ''">and (name like concat('%', #{codeOrName},
        '%') or code like concat('%', #{codeOrName}, '%'))
      </if>
      <if test="nodeId != null  and nodeId != ''">and node_id = #{nodeId}</if>
      <if test="indexType != null">and index_type = #{indexType}</if>
      <if test="indexCategory != null  and indexCategory != ''">and index_category =
        #{indexCategory}
      </if>
    </where>
    order by ei.order_num
  </select>
    <select id="energyIndexHasExist" resultType="java.lang.Integer">
        select count(*)
        from energy_index
        where code = #{code};
    </select>
    <select id="energyIndexHasExistWhenUpdate" resultType="java.lang.Integer">
        select count(*)
        from energy_index
        where code = #{code}
          AND index_id != #{indexId};
    </select>
    <select id="getMeterIndex" resultMap="EnergyIndexResult">
        <include refid="selectEnergyIndexVo"/>
        where meter_id = #{meterId}
        order by order_num
    </select>
    <select id="modelHasConfig" resultType="java.lang.Integer">
        select count(*)
        from model_node
        where model_code = #{modelCode};
    </select>
    <select id="selectCollectIndex" resultMap="EnergyIndexResult">
        <include refid="selectEnergyIndexVo"/>
        where meter_id = #{deviceId}
        order by order_num
    </select>
    <select id="getEnergyIndexByIds" resultMap="EnergyIndexResult">
        <include refid="selectEnergyIndexVo"/>
        where index_id in
        <foreach item="indexId" collection="list" open="(" separator="," close=")">
            #{indexId}
        </foreach>
        order by order_num
    </select>
    <select id="getEnergyIndexByCodes" resultMap="EnergyIndexResult">
        <include refid="selectEnergyIndexVo"/>
        where code in
        <foreach item="indexCode" collection="list" open="(" separator="," close=")">
            #{indexCode}
        </foreach>
        order by order_num
    </select>
    <select id="getIndexByNodeAndChildrenNode" resultMap="EnergyIndexResult">
        select ei.*
        from energy_index ei
                 left join node_index ni on ei.index_id = ni.index_id
        where ni.node_id in (select node_id
                             from model_node
                             where address like (select address
                                                 from model_node
                                                 where node_id = #{nodeId}) || '%')
        order by ei.order_num
    </select>
    <select id="searchIndexByNodeAndChildrenNode" resultMap="EnergyIndexResult">
        select ei.*
        from energy_index ei
                 left join node_index ni on ei.index_id = ni.index_id
        where ni.node_id in (select node_id
                             from model_node
                             where address like (select address
                                                 from model_node
                                                 where node_id = #{nodeId}) || '%')
          and (ei.code like concat('%', #{filter}, '%') or ei.name like concat('%', #{filter}, '%'))
        order by ei.order_num
    </select>
    <select id="selectEnergyIndex" 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>
            <if test="codeOrName != null  and codeOrName != ''">and (name like concat('%', #{codeOrName},
                '%') or code like concat('%', #{codeOrName}, '%'))
            </if>
            <if test="nodeId != null  and nodeId != ''">and node_id = #{nodeId}</if>
            <if test="indexType != null">and index_type = #{indexType}</if>
            <if test="indexCategory != null  and indexCategory != ''">and index_category =
                #{indexCategory}
            </if>
        </where>
        order by ei.order_num
    </select>
  <insert id="insertEnergyIndex" parameterType="com.zhitan.model.domain.EnergyIndex">
    insert into energy_index
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="indexId != null  and indexId != ''">index_id,</if>
      <if test="name != null  and name != ''">name,</if>
      <if test="code != null  and code != ''">code,</if>
      <if test="indexType != null">index_type,</if>
      <if test="indexCategory != null  and indexCategory != ''">
        index_category,
      </if>
      <if test="remark != null  and remark != ''">remark,</if>
      <if test="unitId != null  and unitId != ''">unit_id,</if>
      <if test="orderNum != null">order_num,</if>
      <if test="equipment != null">equipment,</if>
      <if test="energyId != null">energy_id,</if>
    </trim>
    <trim prefix="values (" suffix=");" suffixOverrides=",">
      <if test="indexId != null  and indexId != ''">
        #{indexId},
      </if>
      <if test="name != null  and name != ''">#{name},</if>
      <if test="code != null  and code != ''">#{code},</if>
      <if test="indexType != null">
        #{indexType},
      </if>
      <if test="indexCategory != null  and indexCategory != ''">
        #{indexCategory},
      </if>
      <if test="remark != null  and remark != ''">#{remark},
      </if>
      <if test="unitId != null  and unitId != ''">#{unitId},
      </if>
      <if test="orderNum != null">#{orderNum},
      </if>
      <if test="equipment != null">#{equipment},
      </if>
      <if test="energyId != null">#{energyId},
      </if>
    </trim>
    <insert id="insertEnergyIndex" parameterType="com.zhitan.model.domain.EnergyIndex">
        insert into energy_index
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="indexId != null  and indexId != ''">index_id,</if>
            <if test="name != null  and name != ''">name,</if>
            <if test="code != null  and code != ''">code,</if>
            <if test="indexType != null">index_type,</if>
            <if test="indexCategory != null  and indexCategory != ''">
                index_category,
            </if>
            <if test="remark != null  and remark != ''">remark,</if>
            <if test="unitId != null  and unitId != ''">unit_id,</if>
            <if test="orderNum != null">order_num,</if>
            <if test="equipment != null">equipment,</if>
            <if test="energyId != null">energy_id,</if>
        </trim>
        <trim prefix="values (" suffix=");" suffixOverrides=",">
            <if test="indexId != null  and indexId != ''">
                #{indexId},
            </if>
            <if test="name != null  and name != ''">#{name},</if>
            <if test="code != null  and code != ''">#{code},</if>
            <if test="indexType != null">
                #{indexType},
            </if>
            <if test="indexCategory != null  and indexCategory != ''">
                #{indexCategory},
            </if>
            <if test="remark != null  and remark != ''">#{remark},
            </if>
            <if test="unitId != null  and unitId != ''">#{unitId},
            </if>
            <if test="orderNum != null">#{orderNum},
            </if>
            <if test="equipment != null">#{equipment},
            </if>
            <if test="energyId != null">#{energyId},
            </if>
        </trim>
  </insert>
  <insert id="insertNodeIndex">
    insert into node_index (node_id, index_id) values (#{nodeId}, #{indexId});
  </insert>
  <insert id="insertEnergyIndices">
    <foreach collection="energyIndices" item="energyIndex" separator=";">
      insert into energy_index
      <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">index_id,</if>
        <if test="energyIndex.name != null  and energyIndex.name != ''">name,</if>
        <if test="energyIndex.code != null  and energyIndex.code != ''">code,</if>
        <if test="energyIndex.indexType != null">index_type,</if>
        <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
          index_category,
        </if>
        <if test="energyIndex.remark != null  and energyIndex.remark != ''">remark,</if>
        <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">unit_id,</if>
        <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">meter_id,</if>
        <if test="energyIndex.orderNum != null">order_num,</if>
      </trim>
      <trim prefix="values (" suffix=")" suffixOverrides=",">
        <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">
          #{energyIndex.indexId},
        </if>
        <if test="energyIndex.name != null  and energyIndex.name != ''">#{energyIndex.name},</if>
        <if test="energyIndex.code != null  and energyIndex.code != ''">#{energyIndex.code},</if>
        <if test="energyIndex.indexType != null">
          #{energyIndex.indexType},
        </if>
        <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
          #{energyIndex.indexCategory},
        </if>
        <if test="energyIndex.remark != null  and energyIndex.remark != ''">#{energyIndex.remark},
        </if>
        <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">#{energyIndex.unitId},
        </if>
        <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">
          #{energyIndex.meterId},
        </if>
        <if test="energyIndex.orderNum != null">#{energyIndex.orderNum},</if>
      </trim>
    </foreach>
  </insert>
  <insert id="saveEnergyIndex">
    <foreach collection="list" item="energyIndex" separator=";">
      insert into energy_index
      <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">index_id,</if>
        <if test="energyIndex.name != null  and energyIndex.name != ''">name,</if>
        <if test="energyIndex.code != null  and energyIndex.code != ''">code,</if>
        <if test="energyIndex.indexType != null">index_type,</if>
        <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
          index_category,
        </if>
        <if test="energyIndex.remark != null  and energyIndex.remark != ''">remark,</if>
        <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">unit_id,</if>
        <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">meter_id,</if>
        <if test="energyIndex.orderNum != null">order_num,</if>
      </trim>
      <trim prefix="values (" suffix=")" suffixOverrides=",">
        <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">
          #{energyIndex.indexId},
        </if>
        <if test="energyIndex.name != null  and energyIndex.name != ''">#{energyIndex.name},</if>
        <if test="energyIndex.code != null  and energyIndex.code != ''">#{energyIndex.code},</if>
        <if test="energyIndex.indexType != null">
          #{energyIndex.indexType},
        </if>
        <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
          #{energyIndex.indexCategory},
        </if>
        <if test="energyIndex.remark != null  and energyIndex.remark != ''">#{energyIndex.remark},
        </if>
        <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">#{energyIndex.unitId},
        </if>
        <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">
          #{energyIndex.meterId},
        </if>
        <if test="energyIndex.orderNum != null">#{energyIndex.orderNum},</if>
      </trim>
      ;
      insert into node_index (node_id, index_id) values (#{energyIndex.nodeId},
      #{energyIndex.indexId});
    </foreach>
  </insert>
    </insert>
    <insert id="insertNodeIndex">
        insert into node_index (node_id, index_id)
        values (#{nodeId}, #{indexId});
    </insert>
    <insert id="insertEnergyIndices">
        <foreach collection="energyIndices" item="energyIndex" separator=";">
            insert into energy_index
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">index_id,</if>
                <if test="energyIndex.name != null  and energyIndex.name != ''">name,</if>
                <if test="energyIndex.code != null  and energyIndex.code != ''">code,</if>
                <if test="energyIndex.indexType != null">index_type,</if>
                <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
                    index_category,
                </if>
                <if test="energyIndex.remark != null  and energyIndex.remark != ''">remark,</if>
                <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">unit_id,</if>
                <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">meter_id,</if>
                <if test="energyIndex.orderNum != null">order_num,</if>
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides=",">
                <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">
                    #{energyIndex.indexId},
                </if>
                <if test="energyIndex.name != null  and energyIndex.name != ''">#{energyIndex.name},</if>
                <if test="energyIndex.code != null  and energyIndex.code != ''">#{energyIndex.code},</if>
                <if test="energyIndex.indexType != null">
                    #{energyIndex.indexType},
                </if>
                <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
                    #{energyIndex.indexCategory},
                </if>
                <if test="energyIndex.remark != null  and energyIndex.remark != ''">#{energyIndex.remark},
                </if>
                <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">#{energyIndex.unitId},
                </if>
                <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">
                    #{energyIndex.meterId},
                </if>
                <if test="energyIndex.orderNum != null">#{energyIndex.orderNum},</if>
            </trim>
        </foreach>
    </insert>
    <insert id="saveEnergyIndex">
        <foreach collection="list" item="energyIndex" separator=";">
            insert into energy_index
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">index_id,</if>
                <if test="energyIndex.name != null  and energyIndex.name != ''">name,</if>
                <if test="energyIndex.code != null  and energyIndex.code != ''">code,</if>
                <if test="energyIndex.indexType != null">index_type,</if>
                <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
                    index_category,
                </if>
                <if test="energyIndex.remark != null  and energyIndex.remark != ''">remark,</if>
                <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">unit_id,</if>
                <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">meter_id,</if>
                <if test="energyIndex.orderNum != null">order_num,</if>
            </trim>
            <trim prefix="values (" suffix=")" suffixOverrides=",">
                <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">
                    #{energyIndex.indexId},
                </if>
                <if test="energyIndex.name != null  and energyIndex.name != ''">#{energyIndex.name},</if>
                <if test="energyIndex.code != null  and energyIndex.code != ''">#{energyIndex.code},</if>
                <if test="energyIndex.indexType != null">
                    #{energyIndex.indexType},
                </if>
                <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
                    #{energyIndex.indexCategory},
                </if>
                <if test="energyIndex.remark != null  and energyIndex.remark != ''">#{energyIndex.remark},
                </if>
                <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">#{energyIndex.unitId},
                </if>
                <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">
                    #{energyIndex.meterId},
                </if>
                <if test="energyIndex.orderNum != null">#{energyIndex.orderNum},</if>
            </trim>
            ;
            insert into node_index (node_id, index_id) values (#{energyIndex.nodeId},
            #{energyIndex.indexId});
        </foreach>
    </insert>
  <update id="updateEnergyIndex" parameterType="com.zhitan.model.domain.EnergyIndex">
    update energy_index
    <trim prefix="SET" suffixOverrides=",">
      <if test="name != null  and name != ''">name = #{name},</if>
      <if test="code != null  and code != ''">code = #{code},</if>
      <if test="indexType != null">index_type = #{indexType},</if>
      <if test="indexCategory != null  and indexCategory != ''">index_category = #{indexCategory},
      </if>
      <if test="remark != null  and remark != ''">remark = #{remark},</if>
      <if test="unitId != null  and unitId != ''">unit_id = #{unitId},</if>
      <if test="orderNum != null">order_num = #{orderNum},</if>
      <if test="equipment != null">equipment = #{equipment},</if>
      <if test="energyId != null">energy_id=#{energyId},</if>
    </trim>
    where index_id = #{indexId}
  </update>
    <update id="updateEnergyIndex" parameterType="com.zhitan.model.domain.EnergyIndex">
        update energy_index
        <trim prefix="SET" suffixOverrides=",">
            <if test="name != null  and name != ''">name = #{name},</if>
            <if test="code != null  and code != ''">code = #{code},</if>
            <if test="indexType != null">index_type = #{indexType},</if>
            <if test="indexCategory != null  and indexCategory != ''">index_category = #{indexCategory},
            </if>
            <if test="remark != null  and remark != ''">remark = #{remark},</if>
            <if test="unitId != null  and unitId != ''">unit_id = #{unitId},</if>
            <if test="orderNum != null">order_num = #{orderNum},</if>
            <if test="equipment != null">equipment = #{equipment},</if>
            <if test="energyId != null">energy_id=#{energyId},</if>
        </trim>
        where index_id = #{indexId}
    </update>
  <delete id="deleteEnergyIndexByIds" parameterType="String">
    delete from energy_index where index_id in
    <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
      #{indexId}
    </foreach>;
    delete from node_index where node_id = #{nodeId} and index_id in
    <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
      #{indexId}
    </foreach>;
  </delete>
  <delete id="deleteIndexByMeterId">
    delete
    from energy_index
    where meter_id = #{meterId}
  </delete>
  <delete id="removeEnergyIndex">
    delete from energy_index where index_id in
    <foreach collection="indexIds" item="indexId" open="(" separator="," close=")">
      #{indexId}
    </foreach>
  </delete>
    <delete id="deleteEnergyIndexByIds" parameterType="String">
        delete from energy_index where index_id in
        <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
            #{indexId}
        </foreach>;
        delete from node_index where node_id = #{nodeId} and index_id in
        <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
            #{indexId}
        </foreach>;
    </delete>
    <delete id="deleteIndexByMeterId">
        delete
        from energy_index
        where meter_id = #{meterId}
    </delete>
    <delete id="removeEnergyIndex">
        delete from energy_index where index_id in
        <foreach collection="indexIds" item="indexId" open="(" separator="," close=")">
            #{indexId}
        </foreach>
    </delete>
  <select id="getEnergyIndexMeterByCodes" resultMap="EnergyIndexResult">
    select ei.index_id,
    <select id="getEnergyIndexMeterByCodes" resultMap="EnergyIndexResult">
        select ei.index_id,
        ei.name,
        ei.code,
        ei.index_type,
@@ -324,100 +326,101 @@
        ei.energy_id,
        meter_name
        from energy_index as ei,meter_implement as me
    where ei.code in
    <foreach item="indexCode" collection="list" open="(" separator="," close=")">
      #{indexCode}
    </foreach>
    and ei.meter_id = me.id
    order by ei.order_num
  </select>
  <select id="selectEnergyIndexPage" 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>
      <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>
      <if test="query.nodeId != null  and query.nodeId != ''">and ni.node_id = #{query.nodeId}</if>
      <if test="query.indexCategory != null  and query.indexCategory != ''">and index_category =
        #{query.indexCategory}
      </if>
    </where>
    order by ei.order_num
  </select>
    <select id="listIndexByMeterIds" resultType="com.zhitan.model.domain.EnergyIndex">
      select ei.index_id,
      name,
      code,
      index_type,
      index_category,
      remark,
      unit_id,
      meter_id,
      order_num,
      equipment,
      energy_id
      from energy_index ei
      left join node_index ni on ei.index_id = ni.index_id
      <where>
        <if test="nodeId != null  and nodeId != ''">and ni.node_id = #{nodeId}</if>
        <if test="meterIds != null">
          and ei.meter_id in
          <foreach collection="meterIds" item="meterId" open="(" separator="," close=")">
            #{meterId}
          </foreach>
        </if>
      </where>
        where ei.code in
        <foreach item="indexCode" collection="list" open="(" separator="," close=")">
            #{indexCode}
        </foreach>
        and ei.meter_id = me.id
        order by ei.order_num
    </select>
  <select id="getiEnergyIndexByCode" resultType="com.zhitan.model.domain.EnergyIndex">
    <include refid="selectEnergyIndexVo"/>
    where code = #{cdoe}
  </select>
  <select id="getIndexByCode" resultType="com.zhitan.model.domain.EnergyIndex">
    SELECT ei.code,mi.meter_name||'_'||ei.name as name from energy_index ei
    LEFT JOIN node_device nd on ei.meter_id =  nd.device_id
    LEFT JOIN meter_implement  mi on mi."id" = nd.device_id
    <where>
        <if test="nodeId != null  and nodeId != ''">and nd.node_id  = #{nodeId}</if>
        <if test="code != null  and code != ''">
          and (mi.meter_name like concat('%', #{code}, '%')
          or ei.code like concat('%', #{code}, '%')
          or ei.name like concat('%', #{code}, '%')
          )
        </if>
    </where>
  </select>
  <select id="getIndexByMeterIdIndexCode" resultType="com.zhitan.model.domain.EnergyIndex">
    SELECT ei.code,mi.meter_name||'_'||ei.name as name from energy_index ei
    LEFT JOIN node_device nd on ei.meter_id =  nd.device_id
    LEFT JOIN meter_implement  mi on mi."id" = nd.device_id
    <where>
        <if test="nodeId != null  and nodeId != ''">and nd.node_id  = #{nodeId}</if>
        <if test="indexCode != null  and indexCode != ''">
          and (mi.meter_name like concat('%', #{indexCode}, '%')
          or ei.code like concat('%', #{indexCode}, '%')
          or ei.name like concat('%', #{indexCode}, '%')
          )
        </if>
        <if test="meterId != null  and meterId != ''">
          and ei.meter_id = #{meterId}
        </if>
    </where>
  </select>
    <select id="selectEnergyIndexPage" 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>
            <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>
            <if test="query.nodeId != null  and query.nodeId != ''">and ni.node_id = #{query.nodeId}</if>
            <if test="query.indexCategory != null  and query.indexCategory != ''">and index_category =
                #{query.indexCategory}
            </if>
        </where>
        order by ei.order_num
    </select>
    <select id="listIndexByMeterIds" resultType="com.zhitan.model.domain.EnergyIndex">
        select ei.index_id,
        name,
        code,
        index_type,
        index_category,
        remark,
        unit_id,
        meter_id,
        order_num,
        equipment,
        energy_id
        from energy_index ei
        left join node_index ni on ei.index_id = ni.index_id
        <where>
            <if test="nodeId != null  and nodeId != ''">and ni.node_id = #{nodeId}</if>
            <if test="meterIds != null">
                and ei.meter_id in
                <foreach collection="meterIds" item="meterId" open="(" separator="," close=")">
                    #{meterId}
                </foreach>
            </if>
        </where>
    </select>
    <select id="getiEnergyIndexByCode" resultType="com.zhitan.model.domain.EnergyIndex">
        <include refid="selectEnergyIndexVo"/>
        where code = #{cdoe}
    </select>
    <select id="getIndexByCode" resultType="com.zhitan.model.domain.EnergyIndex">
        SELECT ei.code,mi.meter_name||'_'||ei.name as name from energy_index ei
        LEFT JOIN node_device nd on ei.meter_id = nd.device_id
        LEFT JOIN meter_implement mi on mi."id" = nd.device_id
        <where>
            <if test="nodeId != null  and nodeId != ''">and nd.node_id = #{nodeId}</if>
            <if test="code != null  and code != ''">
                and (mi.meter_name like concat('%', #{code}, '%')
                or ei.code like concat('%', #{code}, '%')
                or ei.name like concat('%', #{code}, '%')
                )
            </if>
        </where>
    </select>
    <select id="getIndexByMeterIdIndexCode" resultType="com.zhitan.model.domain.EnergyIndex">
        SELECT ei.code,mi.meter_name||'_'||ei.name as name from energy_index ei
        LEFT JOIN node_device nd on ei.meter_id = nd.device_id
        LEFT JOIN meter_implement mi on mi."id" = nd.device_id
        <where>
            <if test="nodeId != null  and nodeId != ''">and nd.node_id = #{nodeId}</if>
            <if test="indexCode != null  and indexCode != ''">
                and (mi.meter_name like concat('%', #{indexCode}, '%')
                or ei.code like concat('%', #{indexCode}, '%')
                or ei.name like concat('%', #{indexCode}, '%')
                )
            </if>
            <if test="meterId != null  and meterId != ''">
                and ei.meter_id = #{meterId}
            </if>
        </where>
    </select>
    <select id="getModelNodeIndexInfoListByIndexIds"
            resultType="com.zhitan.model.domain.vo.ModelNodeIndexInfo">
        SELECT     mi.model_name modelName,
          mi.model_code,
          mn."name" "name",
          ei.index_id,
          ei.code indexCode,
          ei."name" indexName,
          ei.energy_id,
          ei.energy_id
        SELECT mi.model_name modelName,
        mi.model_code,
        mn."name" "name",
        ei.index_id,
        ei.code indexCode,
        ei."name" indexName,
        ei.energy_id,
        ei.energy_id
        FROM node_index ni
        INNER JOIN energy_index ei ON ni.index_id = ei.index_id
        LEFT JOIN model_node mn ON ni.node_id = mn.node_id
@@ -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>