package com.dingzhuo.energy.project.energyShareAnalysis.service.impl; import cn.hutool.core.date.DateUtil; import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor; import com.dingzhuo.energy.data.model.service.IEnergyIndexService; import com.dingzhuo.energy.data.model.service.IModelNodeService; import com.dingzhuo.energy.dataservice.domain.DataItem; import com.dingzhuo.energy.project.common.CommonConst; import com.dingzhuo.energy.project.common.TimeTypeConst; import com.dingzhuo.energy.project.dataEntry.service.IDataItemService; import com.dingzhuo.energy.project.energyShareAnalysis.domain.dto.EnergyAnalysisDTO; import com.dingzhuo.energy.project.energyShareAnalysis.domain.vo.EnergyAnalysisVO; import com.dingzhuo.energy.project.energyShareAnalysis.service.IEnergyShareAnalysisService; import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** * 能耗占比分析 接口层实现层 */ @Service @AllArgsConstructor public class EnergyShareAnalysisServiceImpl implements IEnergyShareAnalysisService { private final IDataItemService dataItemService; private final IModelNodeService modelNodeService; private final IEnergyIndexService energyIndexService; /** * 获取电占比统计信息 * * @param dto 查询参数 * @return 结果 */ @Override public List listEnergyShareAnalysis(EnergyAnalysisDTO dto) { List nodeInforList = modelNodeService.getModelNodeIndexIdRelationInforByCode(dto.getModelCode()); if (CollectionUtils.isEmpty(nodeInforList)) { return new ArrayList<>(); } List indexIds = nodeInforList.stream() .map(ModelNodeIndexInfor::getIndexId) .filter(StringUtils::isNotBlank) .collect(Collectors.toList()); // 按照点位进行分组 Map> nodeIndexMap = nodeInforList.stream().collect( Collectors.groupingBy(ModelNodeIndexInfor::getName)); // 获取查询时间 Date beginTime = dto.getBeginTime(); Date endTime = dto.getEndTime(); if (!TimeTypeConst.TIME_TYPE_HOUR.equals(dto.getTimeType())) { endTime = DateUtil.endOfDay(endTime); } // 查询对应indexIds,找到对应dataItem信息 List dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeTypeConst.TIME_TYPE_HOUR, indexIds); // 求总和 BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); AtomicReference sumValue = new AtomicReference<>(sum); if ("electric".equals(dto.getEnergyType())) { List sumIndexIds = Lists.newArrayList("e632a819-7115-483c-9215-b562ccfa8437", "3df75c95-d179-4e58-985d-637b94554d70"); List sumDataItem = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeTypeConst.TIME_TYPE_HOUR, sumIndexIds); sumValue.set(BigDecimal.valueOf(sumDataItem.stream().mapToDouble(DataItem::getValue).sum())); } // 如果是水的7001的话 需要有个其他的占比 if ("WaterShareAnalysis_1".equals(dto.getModelCode())) { List sumIndexIds = Lists.newArrayList("07d6b073-f8d7-4e4b-b8fb-a899c64d245c"); List sumDataItem = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeTypeConst.TIME_TYPE_HOUR, sumIndexIds); sumValue.set(BigDecimal.valueOf(sumDataItem.stream().mapToDouble(DataItem::getValue).sum())); } // 倍率 BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100); AtomicReference totalRatio = new AtomicReference<>(BigDecimal.ZERO); AtomicReference totalValue = new AtomicReference<>(BigDecimal.ZERO); List analysisVOList = new ArrayList<>(); nodeIndexMap.forEach((key, value) -> { EnergyAnalysisVO analysisVO = new EnergyAnalysisVO(); BigDecimal valueTotal = sumValue.get(); analysisVO.setSumValue(valueTotal); analysisVO.setEnergyUnitName(key); List nodeIndexIds = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); BigDecimal currentValue = BigDecimal.valueOf(dataItemList.stream() .filter(li -> nodeIndexIds.contains(li.getIndexId())) .mapToDouble(DataItem::getValue).sum()) .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP); analysisVO.setValue(currentValue); // 同比值 BigDecimal ratio = BigDecimal.ZERO; if (valueTotal.compareTo(BigDecimal.ZERO) != 0) { ratio = currentValue.divide(valueTotal, CommonConst.DIGIT_2, RoundingMode.HALF_UP); } // 超过1则用1剪掉 if (totalRatio.get().add(ratio).compareTo(BigDecimal.ONE) > 0) { ratio = BigDecimal.ONE.subtract(totalRatio.get()); } analysisVO.setRatio(ratio.multiply(multiple)); analysisVOList.add(analysisVO); totalValue.set(totalValue.get().add(currentValue)); totalRatio.set(totalRatio.get().add(ratio)); }); if ("WaterShareAnalysis_1".equals(dto.getModelCode())) { BigDecimal valueTotal = sumValue.get(); EnergyAnalysisVO analysisVO = new EnergyAnalysisVO(); analysisVO.setEnergyUnitName("其他"); analysisVO.setValue(valueTotal.subtract(totalValue.get())); analysisVO.setRatio(BigDecimal.ONE.subtract(totalRatio.get()).multiply(multiple)); analysisVO.setSumValue(valueTotal); analysisVOList.add(analysisVO); } // 占比排序 return analysisVOList.stream().sorted(Comparator.comparing(EnergyAnalysisVO::getRatio).reversed()).collect(Collectors.toList()); } }