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