From 06d3d15a5a08637041cc601101c063b11b07a346 Mon Sep 17 00:00:00 2001 From: net <net@netdeMBP.lan> Date: 星期五, 14 二月 2025 17:25:21 +0800 Subject: [PATCH] 合并理去杀杀人 --- zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java | 278 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 278 insertions(+), 0 deletions(-) diff --git a/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java new file mode 100644 index 0000000..2e47b66 --- /dev/null +++ b/zhitan-system/src/main/java/com/zhitan/energyMonitor/service/impl/ElectricLoadServiceImpl.java @@ -0,0 +1,278 @@ +package com.zhitan.energyMonitor.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.zhitan.basicdata.domain.MeterImplement; +import com.zhitan.basicdata.mapper.MeterImplementMapper; +import com.zhitan.common.constant.CommonConst; +import com.zhitan.common.constant.TimeTypeConst; +import com.zhitan.common.enums.CollectionModes; +import com.zhitan.common.enums.GroupTimeType; +import com.zhitan.common.utils.ChartUtils; +import com.zhitan.common.utils.DateTimeUtil; +import com.zhitan.common.utils.DoubleUtil; +import com.zhitan.common.utils.StringUtil; +import com.zhitan.energyMonitor.domain.vo.ListElectricLoadDetail; +import com.zhitan.energyMonitor.domain.vo.ListElectricLoadItem; +import com.zhitan.energyMonitor.domain.vo.ListElectricLoadVO; +import com.zhitan.energyMonitor.domain.vo.ListElectricityMeterVO; +import com.zhitan.energyMonitor.service.IElectricLoadService; +import com.zhitan.knowledgeBase.domain.enums.EnergyTypeEnum; +import com.zhitan.model.domain.EnergyIndex; +import com.zhitan.realtimedata.domain.TagValue; +import com.zhitan.realtimedata.service.RealtimeDatabaseService; +import org.apache.commons.lang3.ObjectUtils; +import org.joda.time.DateTime; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description: sensor_alarm_item + * @Author: jeecg-boot + * @Date: 2022-04-19 + * @Version: V1.0 + */ +@Service +public class ElectricLoadServiceImpl implements IElectricLoadService { + @Autowired + private RealtimeDatabaseService realtimeDatabaseService; + @Resource + private MeterImplementMapper meterImplementMapper; + + @Override + public ListElectricLoadVO list(String timeType, String timeCode, EnergyIndex energyIndex, String meterId) { + ListElectricLoadVO vo = new ListElectricLoadVO(); + List<ListElectricLoadItem> itemList = new ArrayList<>(); + vo.setItemList(itemList); + ListElectricLoadDetail detail = new ListElectricLoadDetail(); + detail.setMaxTime(CommonConst.DOUBLE_MINUS_SIGN); + detail.setMax(CommonConst.DOUBLE_MINUS_SIGN); + detail.setMin(CommonConst.DOUBLE_MINUS_SIGN); + detail.setMinTime(CommonConst.DOUBLE_MINUS_SIGN); + detail.setAvg(CommonConst.DOUBLE_MINUS_SIGN); + detail.setRate(CommonConst.DOUBLE_MINUS_SIGN); + vo.setDetail(detail); + + MeterImplement meterImplement = meterImplementMapper.selectById(meterId); + + if (ObjectUtil.isEmpty(meterImplement)) { + return vo; + } + List<Date> dateList = new ArrayList<>(); + ChartUtils.generateDateList(timeType, timeCode, dateList); + // 鍥犱负influxdb娌℃湁鎸夌収鏈堝垎缁勫彇鏁版嵁锛屽彧鑳芥寜鐓ф棩鏈熷惊鐜彇鏁版嵁 + if (TimeTypeConst.TIME_TYPE_YEAR.equals(timeType)) { + getYearData(timeType, dateList, energyIndex, meterImplement.getMeterName(), itemList); + } else { + getDayAndMonthData(timeType, timeCode, energyIndex, meterImplement.getMeterName(), itemList); + } + if (!StringUtil.isEmptyOrNull(energyIndex.getCode())) { + Date start = ChartUtils.getDateTime(timeType, timeCode); + Date end = ChartUtils.getEndTime(timeType, start); + + String code = energyIndex.getCode(); + TagValue maxTagValueModel = realtimeDatabaseService.statistics(code, start, end, CollectionModes.max); + TagValue minTagValueModel = realtimeDatabaseService.statistics(code, start, end, CollectionModes.min); + TagValue avgTagValueModel = realtimeDatabaseService.statistics(code, start, end, CollectionModes.mean); + + double avg = CommonConst.DIGIT_DOUBLE_0; + if (!ObjectUtil.isEmpty(avgTagValueModel) && !ObjectUtil.isEmpty(avgTagValueModel.getValue())) { + detail.setAvg(DoubleUtil.formatDoubleToStr(avgTagValueModel.getValue()) + CommonConst.ELECTRIC_LOAD_UNIT); + avg = avgTagValueModel.getValue(); + } + + if (!ObjectUtil.isEmpty(maxTagValueModel) && !ObjectUtil.isEmpty(maxTagValueModel.getValue())) { + detail.setMax(DoubleUtil.formatDoubleToStr(maxTagValueModel.getValue())); + detail.setMaxTime(DateTimeUtil.getDateTime(maxTagValueModel.getDataTime(), DateTimeUtil.COMMON_PATTERN)); + + if (maxTagValueModel.getValue() != CommonConst.DIGIT_DOUBLE_0) { + double rate = avg * CommonConst.DIGIT_DOUBLE_100 / maxTagValueModel.getValue(); + detail.setRate(DoubleUtil.formatDoubleToStr(rate) + CommonConst.SYMBOL_PERCENT); + } + } + + if (!ObjectUtil.isEmpty(minTagValueModel) && !ObjectUtil.isEmpty(minTagValueModel.getValue())) { + detail.setMin(DoubleUtil.formatDoubleToStr(minTagValueModel.getValue())); + detail.setMinTime(DateTimeUtil.getDateTime(minTagValueModel.getDataTime(), DateTimeUtil.COMMON_PATTERN)); + } + + if (!CommonConst.DOUBLE_MINUS_SIGN.equals(detail.getMax())) { + String m = detail.getMax(); + detail.setMax(m + CommonConst.ELECTRIC_LOAD_UNIT); + } + if (!CommonConst.DOUBLE_MINUS_SIGN.equals(detail.getMin())) { + String min = detail.getMin(); + detail.setMin(min + CommonConst.ELECTRIC_LOAD_UNIT); + } + if (CommonConst.DOUBLE_MINUS_SIGN.equals(detail.getMax())) { + detail.setAvg(CommonConst.DOUBLE_MINUS_SIGN); + } + } + + return vo; + } + + /** + * 鑾峰彇鏈堝拰澶╂暟鎹�,鍥犱负influxdb鍙互鎸夌収鍒嗐�傛椂銆傚ぉ鍒嗙粍鍙栨暟锛屼笉鍙互鎸夌収鏈堝垎缁勫彇鏁帮紝鎵�浠ュ垎鎴愪袱涓柟娉曟潵鍐� + */ + private void getDayAndMonthData(String timeType, String timeCode, EnergyIndex energyIndex, String meterName, List<ListElectricLoadItem> itemList) { + String tagCodes = energyIndex.getCode(); + List<TagValue> maxList = new ArrayList<>(); + List<TagValue> minList = new ArrayList<>(); + List<TagValue> avgList = new ArrayList<>(); + if (TimeTypeConst.TIME_TYPE_DAY.equals(timeType)) { + + } else { + String tempTimeCode = StringUtil.ifEmptyOrNullReturnValue(timeCode).replace(CommonConst.SINGLE_MINUS_SIGN, CommonConst.EMPTY); + Date start = DateTimeUtil.toDateTime(tempTimeCode, DateTimeUtil.COMMON_PATTERN_MONTH); + Date end = DateTimeUtil.addMonths(start, CommonConst.DIGIT_1); + if (!StringUtil.isEmptyOrNull(tagCodes)) { + maxList = realtimeDatabaseService.statistics(tagCodes, start, end, CollectionModes.max, GroupTimeType.d); + minList = realtimeDatabaseService.statistics(tagCodes, start, end, CollectionModes.min, GroupTimeType.d); + avgList = realtimeDatabaseService.statistics(tagCodes, start, end, CollectionModes.mean, GroupTimeType.d); + } + } + if (CollectionUtils.isEmpty(maxList)) { + maxList = new ArrayList<>(); + } + if (CollectionUtils.isEmpty(minList)) { + minList = new ArrayList<>(); + } + if (CollectionUtils.isEmpty(avgList)) { + avgList = new ArrayList<>(); + } + List<Date> dateList = new ArrayList<>(); + ChartUtils.generateDateList(timeType, timeCode, dateList); + Date now = new Date(); + Date temNow = now; + switch (timeType) { + case TimeTypeConst.TIME_TYPE_DAY: + //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣 + temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_HOUR, now); + break; + case TimeTypeConst.TIME_TYPE_MONTH: + //褰撳墠鏃堕棿杞垚鏁存椂鏁寸偣 + temNow = DateTimeUtil.getHourTime(TimeTypeConst.TIME_TYPE_DAY, now); + break; + default: + break; + } + for (Date date : dateList) { + ListElectricLoadItem temp = new ListElectricLoadItem(); + temp.setTimeCode(ChartUtils.getTimeCode(timeType, date)); + temp.setName(ObjectUtils.isNotEmpty(meterName) ? meterName : ""); + temp.setMax(CommonConst.DOUBLE_MINUS_SIGN); + temp.setMin(CommonConst.DOUBLE_MINUS_SIGN); + temp.setAvg(CommonConst.DOUBLE_MINUS_SIGN); + temp.setTimeCodeChart(ChartUtils.getTimeCodeChart(timeType, date)); + temp.setRate(CommonConst.DOUBLE_MINUS_SIGN); + temp.setValue(CommonConst.DOUBLE_MINUS_SIGN); + itemList.add(temp); + // 濡傛灉澶т簬褰撳墠鏃堕棿榛樿-- + if (DateTimeUtil.compareDateDiff(date, temNow) > CommonConst.DIGIT_0) { + continue; + } + //澶╃殑鍒ゆ柇 + if (TimeTypeConst.TIME_TYPE_DAY.equals(timeType)) { + // 鐢变簬瀹炴椂搴撹繑鍥炵殑鏃堕棿瀵瑰簲鍊间唬琛ㄧ殑鏄墠涓�涓懆鏈熺殑鍊� + Date nextHour = DateTimeUtil.addHours(date, CommonConst.DIGIT_1); + if (!StringUtil.isEmptyOrNull(energyIndex.getCode())) { + TagValue tagValue = realtimeDatabaseService.retrieve(energyIndex.getCode(), nextHour); + if (!ObjectUtil.isEmpty(tagValue)) { + if (ObjectUtils.isEmpty(tagValue) || ObjectUtils.isEmpty(tagValue.getValue())) { + temp.setValue(CommonConst.DOUBLE_MINUS_SIGN); + } else { + temp.setValue(String.valueOf(DoubleUtil.formatDouble(tagValue.getValue()))); + } + } + } + } else { + //鏈堢殑鍒ゆ柇锛岀敱浜庡疄鏃跺簱杩斿洖鐨勬椂闂村搴斿�间唬琛ㄧ殑鏄墠涓�涓懆鏈熺殑鍊� + Date nextDay = DateTimeUtil.addDays(date, CommonConst.DIGIT_1); + TagValue tagValueMonth = maxList.stream().filter(x -> (new DateTime(x.getDataTime())).withTimeAtStartOfDay().toDate().equals(nextDay)).findAny().orElse(null); + if (!ObjectUtil.isEmpty(tagValueMonth)) { + //鏈堢殑鎵惧ぉ + TagValue minModel = minList.stream().filter(x -> x.getDataTime().equals(tagValueMonth.getDataTime())).findAny().orElse(null); + if (!ObjectUtil.isEmpty(minModel)) { + temp.setMin(String.valueOf(DoubleUtil.formatDouble(minModel.getValue()))); + } + TagValue avgModel = avgList.stream().filter(x -> x.getDataTime().equals(tagValueMonth.getDataTime())).findAny().orElse(null); + if (!ObjectUtil.isEmpty(avgModel)) { + temp.setAvg(String.valueOf(DoubleUtil.formatDouble(avgModel.getValue()))); + } + temp.setMax(String.valueOf(DoubleUtil.formatDouble(tagValueMonth.getValue()))); + + temp.setRate(CommonConst.DOUBLE_MINUS_SIGN); + if (Double.parseDouble(temp.getMax()) != CommonConst.DIGIT_DOUBLE_0) { + double rate = Double.parseDouble(temp.getAvg()) * 100 / Double.parseDouble(temp.getMax()); + temp.setRate(DoubleUtil.formatDoubleToStr(rate) + CommonConst.SYMBOL_PERCENT); + } + } + } + } + } + + /** + * 鑾峰彇骞存暟鎹� + */ + private void getYearData(String timeType, List<Date> dateList, EnergyIndex energyIndex, String meterName, List<ListElectricLoadItem> itemList) { + String tagCode = StringUtil.ifEmptyOrNullReturnValue(energyIndex.getCode()); + for (Date date : dateList) { + ListElectricLoadItem temp = new ListElectricLoadItem(); + Date endTime = DateTimeUtil.addMonths(date, CommonConst.DIGIT_1); + temp.setAvg(CommonConst.DOUBLE_MINUS_SIGN); + temp.setMax(CommonConst.DOUBLE_MINUS_SIGN); + temp.setMin(CommonConst.DOUBLE_MINUS_SIGN); + if (!StringUtil.isEmptyOrNull(tagCode)) { + String code = energyIndex.getCode(); + TagValue rt3 = realtimeDatabaseService.statistics(code, date, endTime, CollectionModes.max); + TagValue rt4 = realtimeDatabaseService.statistics(code, date, endTime, CollectionModes.min); + TagValue rt2 = realtimeDatabaseService.statistics(code, date, endTime, CollectionModes.mean); + if (ObjectUtils.isNotEmpty(rt2)) { + temp.setAvg(String.valueOf(DoubleUtil.formatDouble(rt2.getValue()))); + } + if (ObjectUtils.isNotEmpty(rt3)) { + temp.setMax(String.valueOf(DoubleUtil.formatDouble(rt3.getValue()))); + } + if (ObjectUtils.isNotEmpty(rt4)) { + temp.setMin(String.valueOf(DoubleUtil.formatDouble(rt4.getValue()))); + } + } + + temp.setTimeCode(ChartUtils.getTimeCode(timeType, date)); + temp.setTimeCodeChart(ChartUtils.getTimeCodeChart(timeType, date)); + temp.setName(StringUtil.ifEmptyOrNullReturnValue(meterName)); + temp.setRate(CommonConst.DOUBLE_MINUS_SIGN); + temp.setValue(CommonConst.DOUBLE_MINUS_SIGN); + if (!temp.getMax().equals(CommonConst.DOUBLE_MINUS_SIGN) && Double.parseDouble(temp.getMax()) != CommonConst.DIGIT_DOUBLE_0) { + double rate = Double.parseDouble(temp.getAvg()) * 100 / Double.parseDouble(temp.getMax()); + temp.setRate(DoubleUtil.formatDoubleToStr(rate) + CommonConst.SYMBOL_PERCENT); + } + itemList.add(temp); + } + } + + + /** + * 鑾峰彇鐢佃〃鍒楄〃 + */ + @Override + public List<ListElectricityMeterVO> listElectricMeter(String nodeId) { + List<MeterImplement> meterImplements = meterImplementMapper.selectByNodeId(nodeId); + meterImplements = meterImplements.stream().filter(x -> "electric".equals(x.getEnergyType())).collect(Collectors.toList()); + List<ListElectricityMeterVO> list = new ArrayList<>(); + for (MeterImplement meterImplement : meterImplements) { + ListElectricityMeterVO vo = new ListElectricityMeterVO(); + vo.setCode(meterImplement.getId()); + vo.setLabel(meterImplement.getMeterName()); + list.add(vo); + } + return list; + } +} -- Gitblit v1.9.3