From 0901c6537976be924baaa3203e18419817ce760e Mon Sep 17 00:00:00 2001
From: 潘晓明 <hahagongzi2006@163.com>
Date: 星期五, 14 二月 2025 13:52:29 +0800
Subject: [PATCH] 能耗统计分析:同比环比。

---
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyTypeValueContrastedVO.java     |   62 ++++++++++
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/QueryCompareRequest.java             |   49 ++++++++
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java |  183 ++++++++++++++++++++++++++++++
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java         |    9 +
 zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java    |   30 +++++
 5 files changed, 333 insertions(+), 0 deletions(-)

diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
index af79e0b..b3028e2 100644
--- a/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
@@ -1,9 +1,12 @@
 package com.zhitan.web.controller.statisticalAnalysis;
 
 import com.zhitan.common.annotation.Log;
+import com.zhitan.common.constant.CommonConst;
 import com.zhitan.common.core.domain.AjaxResult;
 import com.zhitan.dataitem.service.IDataItemService;
 import com.zhitan.statisticalAnalysis.domain.dto.FlowChartsDTO;
+import com.zhitan.statisticalAnalysis.domain.vo.QueryCompareRequest;
+import com.zhitan.statisticalAnalysis.service.IEnergyConsumeDataService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +27,9 @@
     @Autowired
     private IDataItemService dataItemService;
 
+    @Autowired
+    private IEnergyConsumeDataService energyConsumeDataService;
+
     /**
      * 鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽
      *
@@ -36,4 +42,28 @@
     public AjaxResult getFlowCharts(@Validated FlowChartsDTO dto) {
         return AjaxResult.success(dataItemService.getFlowCharts(dto));
     }
+
+    @Log(title = "鑳借�楃粺璁″垎鏋�-鑾峰彇鍚屾瘮鍒嗘瀽鍒楄〃鏁版嵁")
+    @ApiOperation(value = "鑳借�楃粺璁″垎鏋�-鑾峰彇鍚屾瘮鍒嗘瀽鍒楄〃鏁版嵁", notes = "鑳借�楃粺璁″垎鏋�-鑾峰彇鍚屾瘮鍒嗘瀽鍒楄〃鏁版嵁")
+    @GetMapping(value = "/querySameCompareList")
+    public AjaxResult querySameCompareList(@Validated QueryCompareRequest queryCompareRequest) {
+        return AjaxResult.success(energyConsumeDataService.listEnergyTypeYoyInfo(queryCompareRequest, CommonConst.ENERGY_COMPARISON_YOY));
+    }
+
+    /**
+     * 鑾峰彇鐜瘮鍒嗘瀽鏁版嵁
+     * <p>
+     * 閫氳繃鑷繁鐨勬湇鍔¤闂湴鍧�锛歨ttp://localhost:7005/fengniao/energyDataItem/queryLoopCompare?timeType=1
+     * 閫氳繃缃戝叧璁块棶鍦板潃锛歨ttp://localhost:9999/jeecg-fengniao/fengniao/energyDataItem/queryLoopCompare?timeType=1
+     *
+     * @param queryCompareRequest
+     * @return
+     */
+    @Log(title = "鑳借�楃粺璁″垎鏋�-鑾峰彇鐜瘮鍒嗘瀽鍒楄〃鏁版嵁")
+    @ApiOperation(value = "鑳借�楃粺璁″垎鏋�-鑾峰彇鐜瘮鍒嗘瀽鍒楄〃鏁版嵁", notes = "鑳借�楃粺璁″垎鏋�-鑾峰彇鐜瘮鍒嗘瀽鍒楄〃鏁版嵁")
+    @GetMapping(value = "/queryLoopCompareList")
+    public AjaxResult queryLoopCompareList(@Validated QueryCompareRequest queryCompareRequest) {
+
+        return AjaxResult.success(energyConsumeDataService.listEnergyTypeYoyInfo(queryCompareRequest, CommonConst.ENERGY_COMPARISON_MOM));
+    }
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyTypeValueContrastedVO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyTypeValueContrastedVO.java
new file mode 100644
index 0000000..e598661
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyTypeValueContrastedVO.java
@@ -0,0 +1,62 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鍚勮兘婧愮被鍨嬪�煎悓姣斻�佺幆姣擵O
+ *
+ * @Author: Zhujw
+ * @Date: 2023/2/8
+ */
+@Data
+public class EnergyTypeValueContrastedVO {
+
+    /**
+     * 鐢ㄨ兘鍗曞厓鍚嶇О
+     */
+    @ApiModelProperty(value = "鐢ㄨ兘鍗曞厓鍚嶇О")
+    private String energyUnitName;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+    private String energyType;
+
+    /**
+     * 鏈湡鏃堕棿
+     */
+    @ApiModelProperty(value = "鏈湡鏃堕棿")
+    private String currentTime;
+
+    /**
+     * 鏈湡鍊�
+     */
+    @ApiModelProperty(value = "鏈湡鍊�")
+    private BigDecimal currentValue;
+
+    /**
+     * 瀵规瘮鏃堕棿
+     */
+    @ApiModelProperty(value = "瀵规瘮鏃堕棿")
+    private String compareTime;
+
+    /**
+     * 瀵规瘮鍊�
+     */
+    @ApiModelProperty(value = "瀵规瘮鍊�")
+    private BigDecimal contrastValues;
+
+    /**
+     * 鍚屾瘮鍊�
+     * 鍚屾瘮澧為暱鐜�=锛堟湰鏈熷��-鍘诲勾鍚屾湡鍊硷級/鍘诲勾鍚屾湡鍊济�100%
+     * 鐜瘮鍊�
+     * 鐜瘮澧為暱鐜�=锛堟湰鏈熷��-涓婃湡鍊硷級/涓婃湡鍊济�100%
+     */
+    @ApiModelProperty(value = "鍚屾瘮澧為暱鐜�/鐜瘮澧為暱鐜�")
+    private BigDecimal ratio;
+
+}
\ No newline at end of file
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/QueryCompareRequest.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/QueryCompareRequest.java
new file mode 100644
index 0000000..71998cb
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/QueryCompareRequest.java
@@ -0,0 +1,49 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Description: 鏁版嵁鏌ヨ鏉′欢瀹炰綋
+ * @author: yxw
+ * @date: 2022骞�01鏈�28鏃� 14:49
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="QueryCompareRequest", description="鑾峰彇鏁版嵁鐨勫弬鏁板疄浣�")
+public class QueryCompareRequest {
+
+    /**
+     * 鏌ヨ鏃堕棿绫诲瀷,瀵瑰簲甯搁噺绫伙細TimeTypeConst
+     */
+    @NotBlank(message = "鏃堕棿绫诲瀷涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鏌ヨ鏃堕棿绫诲瀷,瀵瑰簲甯搁噺锛欴AY/MONTH/SEASON/YEAR锛岄粯璁ONTH")
+    private String timeType;
+
+    /**
+     * 鏃ユ湡鍊硷紝鏈堜唤(202201-202212)銆佸勾浠�(2022-~)
+     */
+    @NotBlank(message = "鏃堕棿缂栫爜涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鏃ユ湡鍊硷紝鏈堜唤(202201-202212)銆佸勾浠�(2022-~)")
+    private String timeCode;
+
+    /**
+     * 鑺傜偣Id
+     */
+    @NotBlank(message = "鑺傜偣Id")
+    @ApiModelProperty(value = "鑺傜偣Id")
+    private String nodeId;
+
+    /**
+     * 鑳芥簮绫诲瀷锛岄�氳繃/闅斿紑,water/gas
+     */
+    @ApiModelProperty(value = "鑳芥簮绫诲瀷锛岄�氳繃/闅斿紑,water/gas")
+    private String energyType;
+
+}
\ No newline at end of file
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java
index e7c0174..382d099 100644
--- a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java
@@ -32,4 +32,13 @@
      * @return
      */
     List<EnergyConsumeTrendDetailItem> listEnergyCostTrendDetail(String timeCode, String timeType, String modelCode, String energyType);
+
+    /**
+     * 鍚屾瘮鐜瘮鍒嗘瀽
+     *
+     * @param req            璇锋眰鍙傛暟
+     * @param comparisonType 瀵规瘮绫诲瀷
+     * @return
+     */
+    public List<EnergyTypeValueContrastedVO> listEnergyTypeYoyInfo(QueryCompareRequest req, String comparisonType);
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java
index bb3a01f..02f6119 100644
--- a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java
@@ -1,5 +1,6 @@
 package com.zhitan.statisticalAnalysis.service.impl;
 
+import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.zhitan.basicdata.domain.SysEnergy;
@@ -20,6 +21,7 @@
 import org.apache.commons.lang3.ObjectUtils;
 import com.zhitan.statisticalAnalysis.domain.vo.*;
 import com.zhitan.statisticalAnalysis.service.IEnergyConsumeDataService;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -312,4 +314,185 @@
         costValueList.add(totalCost);
         accumulationValueList.add(totalAccumulation);
     }
+
+    /**
+     * 鍚屾鐜瘮鍒嗘瀽
+     *
+     * @param req            璇锋眰鍙傛暟
+     * @param comparisonType 瀵规瘮绫诲瀷
+     * @return
+     */
+    @Override
+    public List<EnergyTypeValueContrastedVO> listEnergyTypeYoyInfo(QueryCompareRequest req, String comparisonType) {
+        String energyType = req.getEnergyType();
+        String timeType = req.getTimeType();
+        String timeCode = req.getTimeCode();
+        String nodeId = req.getNodeId();
+        //鑳芥簮绫诲瀷淇℃伅
+        SysEnergy sysEnergy = new SysEnergy();
+        sysEnergy.setEnersno(energyType);
+        List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(sysEnergy);
+        if (sysEnergies.isEmpty()) {
+            throw new RuntimeException("鏈煡璇㈠埌鑳芥簮淇℃伅");
+        }
+        SysEnergy sysEnergyInfo = sysEnergies.get(0);
+
+        // 鑳借�椾俊鎭�
+        Date startTime = DateTimeUtil.getTime(timeType, timeCode);
+        Date endTime = DateTimeUtil.getEndTimeByType(timeType, startTime);
+        //鏄惁鍚屾瘮
+        boolean isYoy = comparisonType.equals(CommonConst.ENERGY_COMPARISON_YOY);
+        // 璁$畻涓婁竴骞寸殑鍚屾湡鏃堕棿
+        Date lastBeginTime = DateUtil.offset(startTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        Date lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        if (!isYoy) {
+            switch (timeType) {
+                case TimeTypeConst.TIME_TYPE_DAY:
+                    lastBeginTime = DateUtil.offsetDay(startTime, CommonConst.DIGIT_MINUS_1);
+                    lastEndTime = DateUtil.offsetDay(endTime, CommonConst.DIGIT_MINUS_1);
+                    break;
+                case TimeTypeConst.TIME_TYPE_MONTH:
+                    lastBeginTime = DateUtil.offsetMonth(startTime, CommonConst.DIGIT_MINUS_1);
+                    lastEndTime = DateUtil.offsetMonth(endTime, CommonConst.DIGIT_MINUS_1);
+                    break;
+            }
+        }
+
+        //鐢碉細鍙湁HOUR鏁版嵁鏈夋晥锛涘叾浠栬兘婧愮被鍨嬶細HOUR銆丏AY鏈夋暟鎹�
+        String queryTimeType = TimeTypeConst.TIME_TYPE_HOUR;
+        List<EnergyConsumeVO> energyConsumeVOList = new ArrayList<>();
+        switch (sysEnergyInfo.getEnersno()) {
+            case "electric":
+                List<ElectricityDataItem> electricityDataItems = peakValleyMapper.getCostTrends(startTime, endTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno());
+                List<ElectricityDataItem> lastDataItemList = peakValleyMapper.getCostTrends(lastBeginTime, lastEndTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno());
+                if (!lastDataItemList.isEmpty()) {
+                    electricityDataItems.addAll(lastDataItemList);
+                }
+                if (!electricityDataItems.isEmpty()) {
+                    electricityDataItems.forEach(electricityDataItem -> {
+                        EnergyConsumeVO temp = new EnergyConsumeVO();
+                        temp.setDataTime(electricityDataItem.getDataTime());
+                        temp.setAccumulationValue(electricityDataItem.getElectricity());
+                        energyConsumeVOList.add(temp);
+                    });
+                }
+                break;
+            default:
+                if (timeType.equals(TimeTypeConst.TIME_TYPE_MONTH) || timeType.equals(TimeTypeConst.TIME_TYPE_YEAR)) {
+                    queryTimeType = TimeTypeConst.TIME_TYPE_DAY;
+                }
+                List<CarbonEmission> dataItems = dataItemMapper.getMiddleCarbonEmission(startTime, endTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno());
+                List<CarbonEmission> lastDataItems = dataItemMapper.getMiddleCarbonEmission(lastBeginTime, lastEndTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno());
+                if (!lastDataItems.isEmpty()) {
+                    dataItems.addAll(lastDataItems);
+                }
+                dataItems.addAll(lastDataItems);
+                if (!dataItems.isEmpty()) {
+                    dataItems.forEach(dataItem -> {
+                        EnergyConsumeVO temp = new EnergyConsumeVO();
+                        temp.setDataTime(dataItem.getDataTime());
+                        temp.setAccumulationValue(new BigDecimal(dataItem.getValue()));
+                        energyConsumeVOList.add(temp);
+                    });
+                }
+                break;
+        }
+        // 缁勮缁熻鍥句俊鎭�
+        return getEnergyTypeValueContrastedVOList(startTime, timeType, energyConsumeVOList, sysEnergyInfo.getEnersno(), isYoy);
+    }
+
+    /**
+     * 缁勮鎴愭湰瓒嬪娍鍒嗘瀽-缁熻鍥句俊鎭�
+     *
+     * @param bsTime     鏃堕棿
+     * @param timeType   鏃堕棿绫诲瀷
+     * @param dataItems  鑳借��
+     * @param energyType 鑳芥簮绫诲瀷
+     * @param isYoy      鏄惁鍚屾瘮
+     */
+    private List<EnergyTypeValueContrastedVO> getEnergyTypeValueContrastedVOList(Date bsTime, String timeType,
+                                                                                 List<EnergyConsumeVO> dataItems, String energyType, boolean isYoy) {
+        Map<String, List<EnergyConsumeVO>> energyConsumeVOMap;
+        Map<String, List<EnergyConsumeVO>> lastEnergyConsumeVOMap;
+        List<EnergyTypeValueContrastedVO> itemList = new ArrayList<>();
+        //鎸夋椂闂寸被鍨嬬粍缁囪繑鍥炴暟鎹�
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime())));
+                for (int i = 0; i < CommonConst.DIGIT_24; i++) {
+                    Date currentTime = DateUtil.offsetHour(bsTime, i);
+                    Date compareTime = isYoy ? DateUtil.offset(currentTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1) : DateUtil.offsetDay(currentTime, CommonConst.DIGIT_MINUS_1);
+                    String keyCurrentTime = DateUtil.formatDateTime(currentTime);
+                    String keyCompareTime = DateUtil.formatDateTime(compareTime);
+                    EnergyTypeValueContrastedVO item = getEnergyTypeValueContrastedVO(energyType, energyConsumeVOMap, keyCurrentTime, keyCompareTime, currentTime, compareTime);
+                    itemList.add(item);
+                }
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> DateUtil.formatDate(li.getDataTime())));
+                Date endTime = DateTimeUtil.getEndTimeByType(timeType, bsTime);
+                while (bsTime.before(endTime)) {
+                    Date currentTime = bsTime;
+                    Date compareTime = isYoy ? DateUtil.offset(currentTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1) : DateUtil.offsetMonth(currentTime, CommonConst.DIGIT_MINUS_1);
+                    String keyCurrentTime = DateUtil.formatDate(currentTime);
+                    String keyCompareTime = DateUtil.formatDate(compareTime);
+                    EnergyTypeValueContrastedVO item = getEnergyTypeValueContrastedVO(energyType, energyConsumeVOMap, keyCurrentTime, keyCompareTime, currentTime, compareTime);
+                    itemList.add(item);
+                    bsTime = DateUtil.offsetDay(bsTime, CommonConst.DIGIT_1);
+                }
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                SimpleDateFormat formatter = new SimpleDateFormat(DateTimeUtil.COMMON_PATTERN_TO_MONTH_ZH);
+                energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> formatter.format(li.getDataTime())));
+                for (int i = 0; i < CommonConst.DIGIT_12; i++) {
+                    Date currentTime = DateUtil.offsetMonth(bsTime, i);
+                    Date compareTime = DateUtil.offset(currentTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+                    String keyCurrentTime = formatter.format(currentTime);
+                    String keyCompareTime = formatter.format(compareTime);
+                    EnergyTypeValueContrastedVO item = getEnergyTypeValueContrastedVO(energyType, energyConsumeVOMap, keyCurrentTime, keyCompareTime, currentTime, compareTime);
+                    itemList.add(item);
+                }
+                break;
+            default:
+                break;
+        }
+        return itemList;
+    }
+
+    private @NotNull EnergyTypeValueContrastedVO getEnergyTypeValueContrastedVO(String energyType, Map<String, List<EnergyConsumeVO>> energyConsumeVOMap,
+                                                                                String keyCurrentTime, String keyCompareTime, Date currentTime, Date compareTime) {
+        List<EnergyConsumeVO> energyConsumeList = Optional.ofNullable(energyConsumeVOMap.get(keyCurrentTime))
+                .orElse(Collections.emptyList());
+        BigDecimal currentValue = calculateSum(energyConsumeList);
+        List<EnergyConsumeVO> lastEnergyConsumeList = Optional.ofNullable(energyConsumeVOMap.get(keyCompareTime))
+                .orElse(Collections.emptyList());
+        BigDecimal contrastValues = calculateSum(lastEnergyConsumeList);
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
+        BigDecimal ratio = calculateRatio(currentValue, contrastValues, multiple);
+        EnergyTypeValueContrastedVO item = new EnergyTypeValueContrastedVO();
+        item.setEnergyType(energyType);
+        item.setCurrentTime(DateUtil.formatDateTime(currentTime));
+        item.setCompareTime(DateUtil.formatDateTime(compareTime));
+        item.setCurrentValue(currentValue);
+        item.setContrastValues(contrastValues);
+        item.setRatio(ratio);
+        return item;
+    }
+
+    private BigDecimal calculateSum(List<EnergyConsumeVO> dataItemList) {
+        return dataItemList.stream()
+                .map(EnergyConsumeVO::getAccumulationValue)
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+    }
+
+    private BigDecimal calculateRatio(BigDecimal currentSum, BigDecimal lastSum, BigDecimal multiple) {
+        if (lastSum.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
+        }
+        return currentSum.subtract(lastSum)
+                .divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP)
+                .multiply(multiple)
+                .setScale(CommonConst.DIGIT_0, RoundingMode.HALF_UP);
+    }
 }

--
Gitblit v1.9.3