package com.zhitan.alarm.services.impl; 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.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; import com.zhitan.common.enums.TimeType; 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.ModelNode; import com.zhitan.model.domain.vo.ModelNodeIndexInfo; import com.zhitan.model.mapper.EnergyIndexMapper; import com.zhitan.model.mapper.ModelNodeMapper; import lombok.AllArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import java.text.DecimalFormat; import java.util.*; import java.util.stream.Collectors; /** * 报警分析实现 * * @author * @date */ @Service @AllArgsConstructor public class AlarmAnalyisisServiceImpl implements IAlarmAnalysisService { private final ModelNodeMapper modelNodeMapper; private final HistoryAlarmMapper historyAlarmMapper; private final MeterImplementMapper meterImplementMapper; private final EnergyIndexMapper energyIndexMapper; private final SysEnergyMapper sysEnergyMapper; /** * 根据节点id获取报警分析信息 * * @param alarmAnalysisDTO * @return */ @Override public AlarmAnalysisVO getByNodeId(AlarmAnalysisDTO alarmAnalysisDTO) { AlarmAnalysisVO alarmAnalysisVO = new AlarmAnalysisVO(); // 初始化报警比例列表 List alarmProportionList = initializeProportionList(IndexType.values()); // 初始化能源比例列表 List energyProportionList = new ArrayList<>(); sysEnergyMapper.selectSysEnergyList(new SysEnergy()).forEach(sysEnergy -> { EnergyProportion proportion = new EnergyProportion(); proportion.setEnergyName(sysEnergy.getEnersno()); proportion.setCount(0D); proportion.setPercentage(0D); energyProportionList.add(proportion); }); List chartDataList = new ArrayList<>(); final String nodeId = alarmAnalysisDTO.getNodeId(); final Date queryTime = alarmAnalysisDTO.getDataTime(); Date beginTime; Date endTime; String timeFormat; String queryTimeType = alarmAnalysisDTO.getTimeType(); if (TimeType.DAY.name().equals(queryTimeType)) { beginTime = DateUtil.beginOfDay(queryTime); endTime = DateUtil.endOfDay(queryTime); timeFormat = "yyyy-MM-dd HH"; // 月 } else if (TimeType.MONTH.name().equals(queryTimeType)) { beginTime = DateUtil.beginOfMonth(queryTime); endTime = DateUtil.endOfMonth(queryTime); timeFormat = "yyyy-MM-dd"; // 年 } else { beginTime = DateUtil.beginOfYear(queryTime); endTime = DateUtil.endOfYear(queryTime); timeFormat = "yyyy-MM"; } JkHistoryAlarm query = new JkHistoryAlarm(); query.setEierarchyFlag("ALL"); query.setBeginTime(DateUtil.format(beginTime,"yyyy-MM-dd HH:mm:ss")); query.setEndTime(DateUtil.format(endTime,"yyyy-MM-dd HH:mm:ss")); query.setNodeId(nodeId); final List 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 jkHistoryAlarms) { List indexIds = jkHistoryAlarms.stream().map(JkHistoryAlarm::getIndexId).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(indexIds)) { List modelList = energyIndexMapper.selectEnergyTypeByIndex(indexIds); if (CollectionUtils.isNotEmpty(modelList)){ Map 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 jkHistoryAlarms, List proportionList, java.util.function.Function keyExtractor) { Map> 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 jkHistoryAlarms, String timeFormat) { jkHistoryAlarms.forEach(jkHistoryAlarm -> { String alarmBeginTime = DateUtil.format(jkHistoryAlarm.getAlarmBeginTime(), timeFormat); jkHistoryAlarm.setAlarmTime(alarmBeginTime); }); } /** * 生成图表数据 */ private void generateChartData(List chartDataList, List jkHistoryAlarms, Date beginTime, Date endTime, String timeFormat, String queryTimeType) { Map> timeMap = jkHistoryAlarms.stream() .collect(Collectors.groupingBy(JkHistoryAlarm::getAlarmTime)); while (!beginTime.after(endTime)) { String currentTime = DateUtil.format(beginTime, timeFormat); List 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 initializeProportionList(Object[] items) { List 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"); // 格式化结果 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 nodeIndexInfoList = modelNodeMapper.getAllModelNodeIndexByAddress(parentNode.getModelCode(), parentNode.getAddress()); alarmAnalysisVO.setIndexCount(nodeIndexInfoList.size()); if (CollectionUtils.isEmpty(nodeIndexInfoList)) { return alarmAnalysisVO; } // 获取月报警数、年报警数 List 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; } }