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