liulingling.177216
2024-08-26 349f1cfc5fa77fbc636d542df0d8050fddec48c2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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<EnergyAnalysisVO> listEnergyShareAnalysis(EnergyAnalysisDTO dto) {
 
        List<ModelNodeIndexInfor> nodeInforList = modelNodeService.getModelNodeIndexIdRelationInforByCode(dto.getModelCode());
        if (CollectionUtils.isEmpty(nodeInforList)) {
            return new ArrayList<>();
        }
 
        List<String> indexIds = nodeInforList.stream()
                .map(ModelNodeIndexInfor::getIndexId)
                .filter(StringUtils::isNotBlank)
                .collect(Collectors.toList());
        // 按照点位进行分组
        Map<String, List<ModelNodeIndexInfor>> 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<DataItem> 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<BigDecimal> sumValue = new AtomicReference<>(sum);
        if ("electric".equals(dto.getEnergyType())) {
            List<String> sumIndexIds = Lists.newArrayList("e632a819-7115-483c-9215-b562ccfa8437", "3df75c95-d179-4e58-985d-637b94554d70");
            List<DataItem> 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<String> sumIndexIds = Lists.newArrayList("07d6b073-f8d7-4e4b-b8fb-a899c64d245c");
            List<DataItem> 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<BigDecimal> totalRatio = new AtomicReference<>(BigDecimal.ZERO);
        AtomicReference<BigDecimal> totalValue = new AtomicReference<>(BigDecimal.ZERO);
 
        List<EnergyAnalysisVO> analysisVOList = new ArrayList<>();
        nodeIndexMap.forEach((key, value) -> {
            EnergyAnalysisVO analysisVO = new EnergyAnalysisVO();
 
            BigDecimal valueTotal = sumValue.get();
 
            analysisVO.setSumValue(valueTotal);
            analysisVO.setEnergyUnitName(key);
 
            List<String> 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());
    }
}