¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.zhitan.statisticalAnalysis.service.impl; |
| | | |
| | | import cn.hutool.core.date.DateUtil; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.zhitan.basicdata.domain.SysEnergy; |
| | | import com.zhitan.basicdata.mapper.SysEnergyMapper; |
| | | 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; |
| | | import com.zhitan.model.mapper.ModelNodeMapper; |
| | | import com.zhitan.model.mapper.NodeIndexMapper; |
| | | import com.zhitan.peakvalley.domain.ElectricityDataItem; |
| | | import com.zhitan.peakvalley.mapper.PeakValleyMapper; |
| | | import com.zhitan.statisticalAnalysis.common.DateTimeUtil; |
| | | import lombok.AllArgsConstructor; |
| | | import org.apache.commons.lang3.ObjectUtils; |
| | | import com.zhitan.statisticalAnalysis.domain.vo.*; |
| | | import com.zhitan.statisticalAnalysis.service.IEnergyConsumeDataService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @Description: TODO |
| | | * @author: yxw |
| | | * @date: 2022å¹´04æ12æ¥ 14:15 |
| | | */ |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class EnergyConsumeDataServiceImpl implements IEnergyConsumeDataService { |
| | | |
| | | private DataItemMapper dataItemMapper; |
| | | private ModelNodeMapper modelNodeMapper; |
| | | private NodeIndexMapper nodeIndexMapper; |
| | | private PeakValleyMapper peakValleyMapper; |
| | | private SysEnergyMapper sysEnergyMapper; |
| | | |
| | | /** |
| | | * ææ¬è¶å¿åæï¼è½æºæ¶èææ¬ï¼- è·åè¡¨æ ¼åè¡¨æ°æ® |
| | | * |
| | | * @param pageNo é¡µç æ° |
| | | * @param pageSize æ¯é¡µæ°æ®å¤å° |
| | | * @param timeCode æ¶é´å¼ 䏿¶é´ç±»å对åºï¼2022-03-21/2022-03/2022 |
| | | * @param timeType æ¶é´ç±»å DAY/MONTH/YEAR |
| | | * @param energyType è½æºç±»å |
| | | * @param modelCode 模åCode |
| | | * @return |
| | | */ |
| | | @Override |
| | | public EnergyCostTrendPage listEnergyCostTrend(int pageNo, int pageSize, String timeCode, String timeType, String energyType, |
| | | String modelCode) { |
| | | //è½æºç±»åä¿¡æ¯ |
| | | SysEnergy sysEnergy = new SysEnergy(); |
| | | if (StringUtils.isNotEmpty(energyType)) { |
| | | sysEnergy.setEnersno(energyType); |
| | | } |
| | | List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(sysEnergy); |
| | | if (sysEnergies.isEmpty()) { |
| | | throw new RuntimeException("æªæ¥è¯¢å°è½æºä¿¡æ¯"); |
| | | } |
| | | //èç¹ä¿¡æ¯ |
| | | List<ModelNode> modelNodes = modelNodeMapper.selectList(Wrappers.<ModelNode>lambdaQuery().eq(ModelNode::getModelCode, modelCode) |
| | | .isNull(ModelNode::getParentId)); |
| | | if (ObjectUtils.isEmpty(modelNodes)) { |
| | | throw new RuntimeException("æªæ¥è¯¢å°èç¹ä¿¡æ¯"); |
| | | } |
| | | ModelNode modelNodeInfo = modelNodes.stream().findFirst().get(); |
| | | //ç¹ä½ä¿¡æ¯ |
| | | List<NodeIndex> nodeIndices = nodeIndexMapper.selectList(Wrappers.<NodeIndex>lambdaQuery() |
| | | .eq(NodeIndex::getNodeId, modelNodeInfo.getNodeId())); |
| | | if (nodeIndices.isEmpty()) { |
| | | throw new RuntimeException("æªæ¥è¯¢å°ç¹ä½ä¿¡æ¯"); |
| | | } |
| | | |
| | | // æ»è´¹ç¨ |
| | | BigDecimal totalCost = BigDecimal.ZERO; |
| | | // éåè½æºç±»å |
| | | List<CostTrendEnergyTypeItem> itemList = new ArrayList<>(); |
| | | 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); |
| | | |
| | | EnergyCostTrendPage energyCostTrendPage = new EnergyCostTrendPage(); |
| | | energyCostTrendPage.setTotal(1); |
| | | energyCostTrendPage.setItemList(trendItemList); |
| | | return energyCostTrendPage; |
| | | } |
| | | |
| | | /** |
| | | * è·åç¨è½åå
ææ¬è¶å¿åæç´¯ç§¯éãè´¹ç¨ä¿¡æ¯ |
| | | * |
| | | * @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 nodeId, SysEnergy sysEnergyInfo, |
| | | CostTrendEnergyTypeItem item) { |
| | | BigDecimal costValue = BigDecimal.ZERO; |
| | | BigDecimal accumulationValue = BigDecimal.ZERO; |
| | | //çµï¼åªæHOURæ°æ®ææï¼å
¶ä»è½æºç±»åï¼HOURãDAYææ°æ® |
| | | switch (sysEnergyInfo.getEnersno()) { |
| | | case "electric": |
| | | 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: |
| | | 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); |
| | | totalCost = totalCost.add(costValue); |
| | | item.setCost(costValue); |
| | | item.setAccumulation(accumulationValue.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP)); |
| | | return totalCost; |
| | | } |
| | | |
| | | /** |
| | | * ææ¬è¶å¿åæï¼è½æºæ¶èææ¬ï¼ |
| | | * |
| | | * @param timeCode æ¶é´å¼ 䏿¶é´ç±»å对åºï¼2022-03-21/2022-03/2022 |
| | | * @param timeType æ¶é´ç±»å DAY/MONTH/YEAR |
| | | * @param modelCode 模åCode |
| | | * @param energyType è½æºç±»å |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<EnergyConsumeTrendDetailItem> listEnergyCostTrendDetail(String timeCode, String timeType, String modelCode, String energyType) { |
| | | //è½æºç±»åä¿¡æ¯ |
| | | SysEnergy sysEnergy = new SysEnergy(); |
| | | if (StringUtils.isNotEmpty(energyType)) { |
| | | sysEnergy.setEnersno(energyType); |
| | | } |
| | | List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(sysEnergy); |
| | | if (sysEnergies.isEmpty()) { |
| | | throw new RuntimeException("æªæ¥è¯¢å°è½æºä¿¡æ¯"); |
| | | } |
| | | |
| | | //èç¹ä¿¡æ¯ |
| | | List<ModelNode> modelNodes = modelNodeMapper.selectList(Wrappers.<ModelNode>lambdaQuery().eq(ModelNode::getModelCode, modelCode) |
| | | .isNull(ModelNode::getParentId)); |
| | | if (modelNodes.isEmpty()) { |
| | | throw new RuntimeException("æªæ¥è¯¢å°èç¹ä¿¡æ¯"); |
| | | } |
| | | String nodeId = modelNodes.stream().findFirst().get().getNodeId(); |
| | | |
| | | // è½èä¿¡æ¯ |
| | | List<EnergyConsumeTrendDetailItem> itemList = new ArrayList<>(); |
| | | Date startTime = DateTimeUtil.getTime(timeType, timeCode); |
| | | Date endTime = DateTimeUtil.getEndTimeByType(timeType, startTime); |
| | | //çµï¼åªæHOURæ°æ®ææï¼å
¶ä»è½æºç±»åï¼HOURãDAYææ°æ® |
| | | 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); |
| | | } |
| | | return itemList; |
| | | } |
| | | |
| | | /** |
| | | * ç»è£
ææ¬è¶å¿åæ-ç»è®¡å¾ä¿¡æ¯ |
| | | * |
| | | * @param bsTime æ¶é´ |
| | | * @param timeType æ¶é´ç±»å |
| | | * @param dataItems è½è |
| | | * @param item è¿å对象 |
| | | */ |
| | | private void getTrendAnalysisCharInfoByEnergyType(Date bsTime, String timeType, |
| | | 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) { |
| | | 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++) { |
| | | String formatDate = i + CommonConst.TIME_UNIT_SHOW_HOUR; |
| | | costKeyList.add(formatDate); |
| | | accumulationKeyList.add(formatDate); |
| | | String key = DateUtil.formatDateTime(DateUtil.offsetHour(bsTime, i)); |
| | | calculateCostAndAccumulation(energyConsumeVOMap, key, costValueList, accumulationValueList); |
| | | } |
| | | 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)) { |
| | | String formatDate = DateUtil.formatDate(bsTime); |
| | | costKeyList.add(formatDate); |
| | | accumulationKeyList.add(formatDate); |
| | | calculateCostAndAccumulation(energyConsumeVOMap, formatDate, costValueList, accumulationValueList); |
| | | 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 newDate = DateUtil.offsetMonth(bsTime, i); |
| | | String formatDate = DateUtil.format(newDate, DateTimeUtil.COMMON_PATTERN_TO_MONTH_ZH); |
| | | costKeyList.add(formatDate); |
| | | accumulationKeyList.add(formatDate); |
| | | calculateCostAndAccumulation(energyConsumeVOMap, formatDate, costValueList, accumulationValueList); |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | item.setCostKeyList(costKeyList); |
| | | item.setCostValueList(costValueList); |
| | | item.setAccumulationKeyList(accumulationKeyList); |
| | | item.setAccumulationValueList(accumulationValueList); |
| | | } |
| | | |
| | | /** |
| | | * 计ç®è´¹ç¨åç¨é |
| | | * |
| | | * @param energyConsumeVOMap |
| | | * @param formatDate |
| | | * @param costValueList |
| | | * @param accumulationValueList |
| | | */ |
| | | private static void calculateCostAndAccumulation(Map<String, List<EnergyConsumeVO>> energyConsumeVOMap, String formatDate, List<BigDecimal> costValueList, List<BigDecimal> accumulationValueList) { |
| | | List<EnergyConsumeVO> energyConsumeList = Optional.ofNullable(energyConsumeVOMap.get(formatDate)) |
| | | .orElse(Collections.emptyList()); |
| | | BigDecimal totalCost = energyConsumeList.stream() |
| | | .map(EnergyConsumeVO::getCostValue) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add) |
| | | .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); |
| | | |
| | | BigDecimal totalAccumulation = energyConsumeList.stream() |
| | | .map(EnergyConsumeVO::getAccumulationValue) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add) |
| | | .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); |
| | | costValueList.add(totalCost); |
| | | accumulationValueList.add(totalAccumulation); |
| | | } |
| | | } |