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