From b0530ed9211230227a8f94e394eda779d5ae5fc1 Mon Sep 17 00:00:00 2001 From: birt <2499248221@qq.com> Date: 星期日, 13 四月 2025 01:51:52 +0800 Subject: [PATCH] birtzhang --- zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java | 342 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 273 insertions(+), 69 deletions(-) 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 6ecc35e..94fcfe6 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; @@ -7,6 +8,7 @@ import com.zhitan.carbonemission.domain.CarbonEmission; import com.zhitan.common.constant.CommonConst; import com.zhitan.common.constant.TimeTypeConst; +import com.zhitan.common.utils.StringUtils; import com.zhitan.dataitem.mapper.DataItemMapper; import com.zhitan.model.domain.ModelNode; import com.zhitan.model.domain.NodeIndex; @@ -19,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; @@ -58,12 +61,13 @@ String modelCode) { //鑳芥簮绫诲瀷淇℃伅 SysEnergy sysEnergy = new SysEnergy(); - sysEnergy.setEnersno(energyType); + if (StringUtils.isNotEmpty(energyType)) { + sysEnergy.setEnersno(energyType); + } List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(sysEnergy); if (sysEnergies.isEmpty()) { throw new RuntimeException("鏈煡璇㈠埌鑳芥簮淇℃伅"); } - SysEnergy sysEnergyInfo = sysEnergies.stream().findFirst().get(); //鑺傜偣淇℃伅 List<ModelNode> modelNodes = modelNodeMapper.selectList(Wrappers.<ModelNode>lambdaQuery().eq(ModelNode::getModelCode, modelCode) .isNull(ModelNode::getParentId)); @@ -78,22 +82,24 @@ throw new RuntimeException("鏈煡璇㈠埌鐐逛綅淇℃伅"); } - // 閬嶅巻鐢ㄨ兘鍗曞厓鑾峰彇琛ㄦ牸涓殑鏁版嵁 - List<EnergyCostTrendItem> trendItemList = new ArrayList<>(); - EnergyCostTrendItem energyCostTrendItem = new EnergyCostTrendItem(); - energyCostTrendItem.setDateCode(timeCode); // 鎬昏垂鐢� BigDecimal totalCost = BigDecimal.ZERO; // 閬嶅巻鑳芥簮绫诲瀷 List<CostTrendEnergyTypeItem> itemList = new ArrayList<>(); - CostTrendEnergyTypeItem item = new CostTrendEnergyTypeItem(); - item.setEnergyType(sysEnergyInfo.getEnersno()); - item.setEnergyName(sysEnergyInfo.getEnername()); - // 澶勭悊鏃堕棿 - Date bsTime = DateTimeUtil.getTime(timeType, timeCode); - Date endTime = DateTimeUtil.getEndTimeByType(timeType, bsTime); - totalCost = getEnergyUnitCostTrendAnalysisValueInfo(timeType, bsTime, endTime, totalCost, nodeIndices, sysEnergyInfo.getEnersno(), item); - itemList.add(item); + for (SysEnergy sysEnergyInfo : sysEnergies) { + CostTrendEnergyTypeItem item = new CostTrendEnergyTypeItem(); + item.setEnergyType(sysEnergyInfo.getEnersno()); + item.setEnergyName(sysEnergyInfo.getEnername()); + // 澶勭悊鏃堕棿 + Date bsTime = DateTimeUtil.getTime(timeType, timeCode); + Date endTime = DateTimeUtil.getEndTimeByType(timeType, bsTime); + totalCost = getEnergyUnitCostTrendAnalysisValueInfo(timeType, bsTime, endTime, totalCost, nodeIndices, modelNodeInfo.getNodeId(), sysEnergyInfo, item); + itemList.add(item); + } + // 閬嶅巻鐢ㄨ兘鍗曞厓鑾峰彇琛ㄦ牸涓殑鏁版嵁 + List<EnergyCostTrendItem> trendItemList = new ArrayList<>(); + EnergyCostTrendItem energyCostTrendItem = new EnergyCostTrendItem(); + energyCostTrendItem.setDateCode(timeCode); energyCostTrendItem.setTotal(totalCost.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP)); energyCostTrendItem.setItemList(itemList); trendItemList.add(energyCostTrendItem); @@ -107,28 +113,31 @@ /** * 鑾峰彇鐢ㄨ兘鍗曞厓鎴愭湰瓒嬪娍鍒嗘瀽绱Н閲忋�佽垂鐢ㄤ俊鎭� * - * @param timeType 鏃堕棿绫诲瀷 - * @param bsTime 寮�濮嬫椂闂� - * @param endTime 缁撴潫鏃堕棿 - * @param totalCost 鎬昏垂鐢� - * @param nodeIndices 鑺傜偣id闆嗗悎 - * @param energyType 鑳芥簮绫诲瀷 - * @param item 杩斿洖瀵硅薄 + * @param timeType 鏃堕棿绫诲瀷 + * @param bsTime 寮�濮嬫椂闂� + * @param endTime 缁撴潫鏃堕棿 + * @param totalCost 鎬昏垂鐢� + * @param nodeIndices 鑺傜偣鐐逛綅闆嗗悎 + * @param nodeId 鑺傜偣id + * @param sysEnergyInfo 鑳芥簮绫诲瀷淇℃伅 + * @param item 杩斿洖瀵硅薄 * @return */ private BigDecimal getEnergyUnitCostTrendAnalysisValueInfo(String timeType, Date bsTime, Date endTime, BigDecimal totalCost, - List<NodeIndex> nodeIndices, String energyType, - CostTrendEnergyTypeItem item) { - BigDecimal costValue; + List<NodeIndex> nodeIndices, String nodeId, SysEnergy sysEnergyInfo, + CostTrendEnergyTypeItem item) { + BigDecimal costValue = BigDecimal.ZERO; BigDecimal accumulationValue = BigDecimal.ZERO; - switch (energyType) { + //鐢碉細鍙湁HOUR鏁版嵁鏈夋晥锛涘叾浠栬兘婧愮被鍨嬶細HOUR銆丏AY鏈夋暟鎹� + switch (sysEnergyInfo.getEnersno()) { case "electric": - List<ElectricityDataItem> electricityDataItems = peakValleyMapper.getDataStatistics(nodeIndices.stream().map(NodeIndex::getIndexId).collect(Collectors.toSet()), bsTime, endTime, timeType); + List<ElectricityDataItem> electricityDataItems = peakValleyMapper.getDataStatistics(nodeIndices.stream().map(NodeIndex::getIndexId).collect(Collectors.toSet()), bsTime, endTime, TimeTypeConst.TIME_TYPE_HOUR); costValue = electricityDataItems.stream().map(ElectricityDataItem::getCost).reduce(BigDecimal.ZERO, BigDecimal::add); accumulationValue = electricityDataItems.stream().map(ElectricityDataItem::getElectricity).reduce(BigDecimal.ZERO, BigDecimal::add); break; default: - costValue = dataItemMapper.getDataItemTimeRangeValueByIndexIds(bsTime, endTime, timeType, nodeIndices.stream().map(NodeIndex::getIndexId).collect(Collectors.toList())); + accumulationValue = dataItemMapper.getDataItemTimeRangeValueByNodeId(bsTime, endTime, TimeTypeConst.TIME_TYPE_DAY, nodeId, sysEnergyInfo.getEnersno()); + costValue = accumulationValue.multiply(sysEnergyInfo.getPrice()); break; } costValue = costValue.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); @@ -151,12 +160,13 @@ public List<EnergyConsumeTrendDetailItem> listEnergyCostTrendDetail(String timeCode, String timeType, String modelCode, String energyType) { //鑳芥簮绫诲瀷淇℃伅 SysEnergy sysEnergy = new SysEnergy(); - sysEnergy.setEnersno(energyType); + if (StringUtils.isNotEmpty(energyType)) { + sysEnergy.setEnersno(energyType); + } List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(sysEnergy); if (sysEnergies.isEmpty()) { throw new RuntimeException("鏈煡璇㈠埌鑳芥簮淇℃伅"); } - SysEnergy sysEnergyInfo = sysEnergies.stream().findFirst().get(); //鑺傜偣淇℃伅 List<ModelNode> modelNodes = modelNodeMapper.selectList(Wrappers.<ModelNode>lambdaQuery().eq(ModelNode::getModelCode, modelCode) @@ -167,46 +177,58 @@ String nodeId = modelNodes.stream().findFirst().get().getNodeId(); // 鑳借�椾俊鎭� - List<EnergyConsumeVO> energyConsumeVOList = new ArrayList<>(); + List<EnergyConsumeTrendDetailItem> itemList = new ArrayList<>(); Date startTime = DateTimeUtil.getTime(timeType, timeCode); Date endTime = DateTimeUtil.getEndTimeByType(timeType, startTime); - switch (sysEnergyInfo.getEnersno()) { - case "electric": - List<ElectricityDataItem> electricityDataItems = peakValleyMapper.getCostTrends(startTime, endTime, timeType, nodeId, energyType); - if (!electricityDataItems.isEmpty()) { - electricityDataItems.forEach(electricityDataItem -> { - EnergyConsumeVO temp = new EnergyConsumeVO(); - temp.setDataTime(electricityDataItem.getDataTime()); - temp.setCostValue(electricityDataItem.getCost()); - temp.setAccumulationValue(electricityDataItem.getElectricity()); - energyConsumeVOList.add(temp); - }); - } - break; - default: - List<CarbonEmission> dataItems = dataItemMapper.getMiddleCarbonEmission(startTime, endTime, timeType, nodeId, energyType); - if (!dataItems.isEmpty()) { - dataItems.forEach(electricityDataItem -> { - EnergyConsumeVO temp = new EnergyConsumeVO(); - temp.setDataTime(electricityDataItem.getDataTime()); - temp.setCostValue(new BigDecimal(electricityDataItem.getValue())); - temp.setAccumulationValue(new BigDecimal(electricityDataItem.getValue()).multiply(sysEnergyInfo.getPrice())); - energyConsumeVOList.add(temp); - }); - } - break; + //鐢碉細鍙湁HOUR鏁版嵁鏈夋晥锛涘叾浠栬兘婧愮被鍨嬶細HOUR銆丏AY鏈夋暟鎹� + String queryTimeType = TimeTypeConst.TIME_TYPE_HOUR; + for (SysEnergy sysEnergyInfo : sysEnergies) { + List<EnergyConsumeVO> energyConsumeVOList = new ArrayList<>(); + switch (sysEnergyInfo.getEnersno()) { + case "electric": + List<ElectricityDataItem> electricityDataItems = peakValleyMapper.getCostTrends(startTime, endTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno()); + if (!electricityDataItems.isEmpty()) { + electricityDataItems.forEach(electricityDataItem -> { + EnergyConsumeVO temp = new EnergyConsumeVO(); + temp.setDataTime(electricityDataItem.getDataTime()); + temp.setCostValue(electricityDataItem.getCost()); + 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()); + if (!dataItems.isEmpty()) { + dataItems.forEach(electricityDataItem -> { + EnergyConsumeVO temp = new EnergyConsumeVO(); + temp.setDataTime(electricityDataItem.getDataTime()); + temp.setCostValue(new BigDecimal(electricityDataItem.getValue())); + temp.setAccumulationValue(new BigDecimal(electricityDataItem.getValue()).multiply(sysEnergyInfo.getPrice())); + energyConsumeVOList.add(temp); + }); + } + break; + } + BigDecimal cost = energyConsumeVOList.stream().map(EnergyConsumeVO::getCostValue) + .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); + BigDecimal accumulation = energyConsumeVOList.stream().map(EnergyConsumeVO::getAccumulationValue) + .reduce(BigDecimal.ZERO, BigDecimal::add).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); + // 缁勮缁熻鍥句俊鎭� + EnergyConsumeTrendDetailItem item = new EnergyConsumeTrendDetailItem(); + item.setEnergyType(sysEnergyInfo.getEnersno()); + item.setEnergyUnit(sysEnergyInfo.getMuid()); + item.setCostLabel(sysEnergyInfo.getEnername() + "璐�"); + item.setAccumulationLabel(sysEnergyInfo.getEnername() + "鐢ㄩ噺"); + item.setCost(cost); + item.setAccumulation(accumulation); + // 缁勮鍥捐〃淇℃伅 + getTrendAnalysisCharInfoByEnergyType(startTime, timeType, energyConsumeVOList, item); + itemList.add(item); } - - // 缁勮缁熻鍥句俊鎭� - EnergyConsumeTrendDetailItem item = new EnergyConsumeTrendDetailItem(); - item.setEnergyType(energyType); - item.setCostLabel(sysEnergyInfo.getEnername() + "璐�"); - item.setAccumulationLabel(sysEnergyInfo.getEnername() + "鐢ㄩ噺"); - // 缁勮鍥捐〃淇℃伅 - getTrendAnalysisCharInfoByEnergyType(startTime, timeType, energyConsumeVOList, item); - - List<EnergyConsumeTrendDetailItem> itemList = new ArrayList<>(); - itemList.add(item); return itemList; } @@ -219,14 +241,14 @@ * @param item 杩斿洖瀵硅薄 */ private void getTrendAnalysisCharInfoByEnergyType(Date bsTime, String timeType, - List<EnergyConsumeVO> dataItems, EnergyConsumeTrendDetailItem item) { + List<EnergyConsumeVO> dataItems, EnergyConsumeTrendDetailItem item) { List<String> costKeyList = new ArrayList<>(); List<String> accumulationKeyList = new ArrayList<>(); List<BigDecimal> costValueList = new ArrayList<>(); List<BigDecimal> accumulationValueList = new ArrayList<>(); Map<String, List<EnergyConsumeVO>> energyConsumeVOMap; //鎸夋椂闂寸被鍨嬬粍缁囪繑鍥炴暟鎹� - switch (timeType){ + 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++) { @@ -249,7 +271,7 @@ } break; case TimeTypeConst.TIME_TYPE_YEAR: - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); + 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 newDate = DateUtil.offsetMonth(bsTime, i); @@ -271,6 +293,7 @@ /** * 璁$畻璐圭敤鍜岀敤閲� + * * @param energyConsumeVOMap * @param formatDate * @param costValueList @@ -291,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_2, RoundingMode.HALF_UP); + } } -- Gitblit v1.9.3