net
2025-02-14 06d3d15a5a08637041cc601101c063b11b07a346
zhitan-system/src/main/java/com/zhitan/consumptionanalysis/service/impl/ConsumptionAnalysisServiceImpl.java
@@ -44,20 +44,20 @@
    private final ModelNodeMapper modelNodeMapper;
    private final EnergyIndicatorsMapper energyIndicatorsMapper;
    private final ProductOutputMapper productOutputMapper;
    private final SysEnergyMapper sysEnergyMapper;
    private final IDataItemService dataItemService;
    private final IModelNodeService modelNodeService;
    @Override
    public ConsumptionAnalysisVO getByArea(ConsumptionAnalysisDTO dto) {
        List<ConsumptionAnalysisData> dataList = new ArrayList<>();
        List<ChartData> chartDataList = new ArrayList<>();
        ConsumptionAnalysisVO consumptionAnalysisVO = new ConsumptionAnalysisVO();
        final String analysisType = dto.getAnalysisType();
        final String nodeId = dto.getNodeId();
@@ -67,7 +67,7 @@
        /**
         * 查询点位与用能单元信息
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,energyType);
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId, energyType);
//        if (CollectionUtils.isEmpty(nodeIndexInforList)) {
//            return consumptionAnalysisVO;
@@ -88,7 +88,7 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 昨天
                lastTime = DateUtil.offsetDay(beginTime, -1);
                lastEndTime = DateUtil.offsetDay(endTime, -1);
@@ -103,7 +103,7 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 昨天
                lastTime = DateUtil.offsetMonth(beginTime, -1);
                lastEndTime = DateUtil.offsetMonth(endTime, -1);
@@ -118,18 +118,18 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 昨天
                lastTime = DateUtil.offsetMonth(beginTime,  -1);
                lastEndTime = DateUtil.offsetMonth(endTime,  -1);
                lastTime = DateUtil.offsetMonth(beginTime, -1);
                lastEndTime = DateUtil.offsetMonth(endTime, -1);
            }
            timeFormat = "yyyy-MM";
        }
        // 根据indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        List<DataItem> lastDataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
            lastDataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(lastTime, lastEndTime, shixuTimeType, indexIds);
        }
@@ -144,11 +144,11 @@
            final String compareTime;
            DateTime dateTime;
            if (TimeType.DAY.name().equals(queryTimeType)) {
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 昨天
                    dateTime = DateUtil.offsetDay(beginTime, -1);
                }
@@ -158,7 +158,7 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 昨天
                    dateTime = DateUtil.offsetMonth(beginTime, -1);
                }
@@ -168,25 +168,25 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 昨天
                    dateTime = DateUtil.offsetMonth(beginTime,  -1);
                    dateTime = DateUtil.offsetMonth(beginTime, -1);
                }
                compareTime = DateUtil.format(dateTime, timeFormat);
            }
            final List<DataItem> dataItems = dataItemMap.get(currentTime);
            final List<DataItem> lastDataItems = lastDataItemMap.get(compareTime);
            BigDecimal sum = new BigDecimal(0);
            BigDecimal lastSum = new BigDecimal(0);
            if (CollectionUtils.isNotEmpty(dataItems)) {
                 // 求和
                 sum = BigDecimal.valueOf(dataItems.stream()
                // 求和
                sum = BigDecimal.valueOf(dataItems.stream()
                        .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
            }
            if(CollectionUtils.isNotEmpty(lastDataItems)) {
            if (CollectionUtils.isNotEmpty(lastDataItems)) {
                lastSum = BigDecimal.valueOf(lastDataItems.stream()
                        .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
            }
@@ -194,7 +194,7 @@
            data.setCompareValue(lastSum.doubleValue());
            data.setCurrentTime(currentTime);
            data.setCompareTime(compareTime);
            if ("YOY".equals(analysisType)) {
                //同比分析
@@ -238,7 +238,7 @@
            chartDataList.add(chartData);
        });
        consumptionAnalysisVO.setDataList(dataList);
        consumptionAnalysisVO.setChartDataList(chartDataList);
        return consumptionAnalysisVO;
@@ -252,32 +252,32 @@
        String queryTimeType = dto.getTimeType();
        // 创建一个Map来存储总和
        Map<String, BigDecimal> result = new HashMap<>();
        //根据模型名称查询modelCode
        final String parentId = dto.getNodeId();
        //根据总结点查询
        final List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeByParentId(parentId);
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        final Map<String, String> energyNameMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getEnername));
        final Map<String, String> nodeNameMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String nodeId = n.getNodeId();
            final String name = n.getName();
            if(!nodeNameMap.containsKey(nodeId)){
                nodeNameMap.put(nodeId,name);
            if (!nodeNameMap.containsKey(nodeId)) {
                nodeNameMap.put(nodeId, name);
            }
        });
        // 按照点位进行分组
        Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeIndexInforList.stream().collect(
                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
        // 根据nodeId获取能源类型
        // 所有点位信息
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).distinct().collect(Collectors.toList());
@@ -300,27 +300,26 @@
            endTime = DateUtil.endOfYear(queryTime);
            shixuTimeType = TimeType.MONTH.name();
        }
        // 根据indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
        }
        final Map<String, List<DataItem>> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId));
        // 根据点位分组,求和
        Map<String,BigDecimal> dataItemTotalMap = new HashMap<>();
        dataItemMap.forEach((key,value)->{
        Map<String, BigDecimal> dataItemTotalMap = new HashMap<>();
        dataItemMap.forEach((key, value) -> {
            BigDecimal sum = BigDecimal.valueOf(value.stream()
                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
            dataItemTotalMap.put(key,sum);
            dataItemTotalMap.put(key, sum);
        });
        nodeIndexMap.forEach((nodeId,indexList)->{
            indexList.forEach(index->{
        nodeIndexMap.forEach((nodeId, indexList) -> {
            indexList.forEach(index -> {
                final String energyId = index.getEnergyId();
                final String indexId = index.getIndexId();
                final BigDecimal total = dataItemTotalMap.getOrDefault(indexId, BigDecimal.ZERO);
@@ -337,15 +336,15 @@
            String energyId = keys[1];
            BigDecimal totalEnergy = entry.getValue();
            chartData.setEnergyTypeNo(energyId);
            chartData.setEnergyTypeName(energyNameMap.getOrDefault(energyId,""));
            chartData.setNodeName(nodeNameMap.getOrDefault(nodeId,""));
            chartData.setEnergyTypeName(energyNameMap.getOrDefault(energyId, ""));
            chartData.setNodeName(nodeNameMap.getOrDefault(nodeId, ""));
            chartData.setEnergyConsumption(totalEnergy.doubleValue());
            chartData.setNodeId(nodeId);
            rankingEnergyData.add(chartData);
        }
        final Map<String, List<RankingEnergyData>> collect = rankingEnergyData.stream().collect(Collectors.groupingBy(RankingEnergyData::getNodeId));
        nodeNameMap.forEach((key,value)->{
        nodeNameMap.forEach((key, value) -> {
            final List<RankingEnergyData> rankingEnergyData1 = collect.get(key);
            RankingDataVO rankingDataVO = new RankingDataVO();
            rankingDataVO.setNodeId(key);
@@ -353,7 +352,7 @@
            rankingDataVO.setData(rankingEnergyData1);
            rankingDataVOArrayList.add(rankingDataVO);
        });
        return rankingDataVOArrayList;
    }
@@ -382,7 +381,7 @@
        List<EnergyProportion> energyProportionList = new ArrayList<>();
        ConsumptionAnalysisVO consumptionAnalysisVO = new ConsumptionAnalysisVO();
        //todo hmj 综合能耗先默认取同比
        final String analysisType = "YOY";
        final String nodeId = dto.getNodeId();
@@ -392,24 +391,25 @@
        /**
         * 查询点位与用能单元信息
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,energyType);
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId, energyType);
//        if (CollectionUtils.isEmpty(nodeIndexInforList)) {
//            return consumptionAnalysisVO;
//        }
        //修改过滤统计点位
        nodeIndexInforList = nodeIndexInforList.stream().filter(x -> "STATISTIC".equals(x.getIndexType())).collect(Collectors.toList());
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        final Map<String, BigDecimal> energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient));
        final Map<String, String> energyNameMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno,SysEnergy::getEnername));
        final Map<String, String> energyNameMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getEnername));
        final Map<String, String> indexIdEnergyIdMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String indexId = n.getIndexId();
            final String energyId = n.getEnergyId();
            if(!indexIdEnergyIdMap.containsKey(indexId)){
                indexIdEnergyIdMap.put(indexId,energyId);
            if (!indexIdEnergyIdMap.containsKey(indexId)) {
                indexIdEnergyIdMap.put(indexId, energyId);
            }
        });
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
@@ -428,7 +428,7 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 昨天
                lastTime = DateUtil.offsetDay(beginTime, -1);
                lastEndTime = DateUtil.offsetDay(endTime, -1);
@@ -443,7 +443,7 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 昨天
                lastTime = DateUtil.offsetMonth(beginTime, -1);
                lastEndTime = DateUtil.offsetMonth(endTime, -1);
@@ -458,10 +458,10 @@
                //同比分析,时间取去年的
                lastTime = DateUtil.offsetMonth(beginTime, -12);
                lastEndTime = DateUtil.offsetMonth(endTime, -12);
            }else {
            } else {
                //环比分析,时间取 昨天
                lastTime = DateUtil.offsetMonth(beginTime,  -1);
                lastEndTime = DateUtil.offsetMonth(endTime,  -1);
                lastTime = DateUtil.offsetMonth(beginTime, -1);
                lastEndTime = DateUtil.offsetMonth(endTime, -1);
            }
            timeFormat = "yyyy-MM";
@@ -469,7 +469,7 @@
        // 根据indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        List<DataItem> lastDataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
            lastDataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(lastTime, lastEndTime, shixuTimeType, indexIds);
        }
@@ -478,7 +478,7 @@
        //  倍率
        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
        Map<String,Double> energyProportionMap = new HashMap<>();
        Map<String, Double> energyProportionMap = new HashMap<>();
        while (!beginTime.after(endTime)) {
            ConsumptionAnalysisData data = new ConsumptionAnalysisData();
            final String currentTime = DateUtil.format(beginTime, timeFormat);
@@ -489,7 +489,7 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 昨天
                    dateTime = DateUtil.offsetDay(beginTime, -1);
                }
@@ -499,7 +499,7 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 昨天
                    dateTime = DateUtil.offsetMonth(beginTime, -1);
                }
@@ -509,9 +509,9 @@
                if ("YOY".equals(analysisType)) {
                    //同比分析,时间取去年的
                    dateTime = DateUtil.offsetMonth(beginTime, -12);
                }else {
                } else {
                    //环比分析,时间取 昨天
                    dateTime = DateUtil.offsetMonth(beginTime,  -1);
                    dateTime = DateUtil.offsetMonth(beginTime, -1);
                }
                compareTime = DateUtil.format(dateTime, timeFormat);
            }
@@ -523,38 +523,40 @@
            BigDecimal lastSum = new BigDecimal(0);
            if (CollectionUtils.isNotEmpty(dataItems)) {
                // 求和
                for (int i=0;i<dataItems.size(); i++){
                for (int i = 0; i < dataItems.size(); i++) {
                    final DataItem dataItem = dataItems.get(i);
                    final String indexId = dataItem.getIndexId();
                    final String energyId = indexIdEnergyIdMap.get(indexId);
                    final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                    if(coefficient == null){
                    if (coefficient == null) {
                        throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
                    }
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);;
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);
                    ;
//                    if(energyProportionMap.containsKey(energyId)) {
//                        energyProportionMap.put(energyId,energyProportionMap.get(energyId) + sum.doubleValue());
//                    }else {
//                        energyProportionMap.put(energyId, sum.doubleValue());
//                    }
                }
            }
            if(CollectionUtils.isNotEmpty(lastDataItems)) {
                for (int i=0;i<lastDataItems.size(); i++){
            if (CollectionUtils.isNotEmpty(lastDataItems)) {
                for (int i = 0; i < lastDataItems.size(); i++) {
                    final DataItem dataItem = lastDataItems.get(i);
                    final String indexId = dataItem.getIndexId();
                    final String energyId = indexIdEnergyIdMap.get(indexId);
                    final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                    if(coefficient == null){
                    if (coefficient == null) {
                        throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
                    }
                    lastSum = lastSum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);;
                    lastSum = lastSum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);
                    ;
                }
            }
            data.setCurrentValue(sum.doubleValue());
@@ -605,34 +607,34 @@
            chartDataList.add(chartData);
        });
        Double eneryTotal =  energyProportionMap.values().stream().mapToDouble(Double::doubleValue).sum();
        Double eneryTotal = energyProportionMap.values().stream().mapToDouble(Double::doubleValue).sum();
        Map<String, List<DataItem>> indexDataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId));
        indexDataItemMap.forEach((indexId,value)->{
        indexDataItemMap.forEach((indexId, value) -> {
            final String energyId = indexIdEnergyIdMap.get(indexId);
            final BigDecimal coefficient = energyCoefficientMap.get(energyId);
            if(coefficient == null){
            if (coefficient == null) {
                throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
            }
            final double sum = value.stream().map(DataItem::getValue).mapToDouble(Double::doubleValue).sum();
            if(energyProportionMap.containsKey(energyId)) {
                energyProportionMap.put(energyId,energyProportionMap.get(energyId) + sum * coefficient.doubleValue());
            }else {
            if (energyProportionMap.containsKey(energyId)) {
                energyProportionMap.put(energyId, energyProportionMap.get(energyId) + sum * coefficient.doubleValue());
            } else {
                energyProportionMap.put(energyId, sum * coefficient.doubleValue());
            }
        });
        energyProportionMap.forEach((key,value)->{
        energyProportionMap.forEach((key, value) -> {
            EnergyProportion energyProportion = new EnergyProportion();
            energyProportion.setEnergyNo(key);
            energyProportion.setEnergyName(energyNameMap.getOrDefault(key,""));
            energyProportion.setEnergyName(energyNameMap.getOrDefault(key, ""));
            energyProportion.setCount(value);
            energyProportion.setPercentage(value/eneryTotal * 100);
            energyProportion.setPercentage(value / eneryTotal * 100);
            energyProportionList.add(energyProportion);
        });
@@ -660,50 +662,50 @@
        } else {
            timeFormat = "yyyy";
        }
        final Double currTotalEnergy = getTotalEnergy(dto);
        DateTime tongbiTime = DateUtil.offsetMonth(queryTime, -12);
        dto.setDataTime(tongbiTime);
        final Double tongbiTotalEnergy = getTotalEnergy(dto);
        DateTime huanbiTime = DateUtil.offsetMonth(queryTime, -1);
        dto.setDataTime(huanbiTime);
        final Double huanbiTotalEnergy = getTotalEnergy(dto);
        tongbi.setCurrentTime(DateUtil.format(queryTime,timeFormat));
        tongbi.setCompareTime(DateUtil.format(tongbiTime,timeFormat));
        tongbi.setCurrentTime(DateUtil.format(queryTime, timeFormat));
        tongbi.setCompareTime(DateUtil.format(tongbiTime, timeFormat));
        tongbi.setCurrentValue(currTotalEnergy);
        tongbi.setCompareValue(tongbiTotalEnergy);
        if(tongbiTotalEnergy != 0) {
        if (tongbiTotalEnergy != 0) {
            final double tongbiRatio = (currTotalEnergy - tongbiTotalEnergy) / tongbiTotalEnergy * 100;
            BigDecimal bd = new BigDecimal(tongbiRatio);
            bd = bd.setScale(2, RoundingMode.HALF_UP);
            tongbi.setRatio(bd.doubleValue());
        }else {
        } else {
            tongbi.setRatio(0);
        }
        huanbi.setCurrentTime(DateUtil.format(queryTime,timeFormat));
        huanbi.setCompareTime(DateUtil.format(huanbiTime,timeFormat));
        huanbi.setCurrentTime(DateUtil.format(queryTime, timeFormat));
        huanbi.setCompareTime(DateUtil.format(huanbiTime, timeFormat));
        huanbi.setCompareValue(huanbiTotalEnergy);
        huanbi.setCurrentValue(currTotalEnergy);
        if(huanbiTotalEnergy != 0) {
        if (huanbiTotalEnergy != 0) {
            final double huanbiRatio = (currTotalEnergy - huanbiTotalEnergy) / huanbiTotalEnergy * 100;
            BigDecimal bd = new BigDecimal(huanbiRatio);
            bd = bd.setScale(2, RoundingMode.HALF_UP);
            huanbi.setRatio(bd.doubleValue());
        }else {
        } else {
            huanbi.setRatio(0);
        }
        consumptionAnalysisVO.setTongbi(tongbi);
        consumptionAnalysisVO.setHuanbi(huanbi);
        return consumptionAnalysisVO;
    }
    public Double getTotalEnergy(ConsumptionAnalysisDTO dto){
    public Double getTotalEnergy(ConsumptionAnalysisDTO dto) {
        //todo hmj 综合能耗先默认取同比
        final String nodeId = dto.getNodeId();
        final String energyType = dto.getEnergyType();
@@ -712,23 +714,23 @@
        /**
         * 查询点位与用能单元信息
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,energyType);
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId, energyType);
//        if (CollectionUtils.isEmpty(nodeIndexInforList)) {
//            return consumptionAnalysisVO;
//        }
        nodeIndexInforList = nodeIndexInforList.stream().filter(x -> "STATISTIC".equals(x.getIndexType())).collect(Collectors.toList());
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        final Map<String, BigDecimal> energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient));
        final Map<String, String> indexIdEnergyIdMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String indexId = n.getIndexId();
            final String energyId = n.getEnergyId();
            if(!indexIdEnergyIdMap.containsKey(indexId)){
                indexIdEnergyIdMap.put(indexId,energyId);
            if (!indexIdEnergyIdMap.containsKey(indexId)) {
                indexIdEnergyIdMap.put(indexId, energyId);
            }
        });
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
@@ -757,12 +759,12 @@
        }
        // 根据indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
        }
        Map<String, List<DataItem>> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(li -> DateUtil.format(li.getDataTime(), timeFormat)));
        Map<String,Double> energyProportionMap = new HashMap<>();
        Map<String, Double> energyProportionMap = new HashMap<>();
        while (!beginTime.after(endTime)) {
            final String currentTime = DateUtil.format(beginTime, timeFormat);
@@ -770,17 +772,18 @@
            BigDecimal sum = new BigDecimal(0);
            if (CollectionUtils.isNotEmpty(dataItems)) {
                // 求和
                for (int i=0;i<dataItems.size(); i++){
                for (int i = 0; i < dataItems.size(); i++) {
                    final DataItem dataItem = dataItems.get(i);
                    final String indexId = dataItem.getIndexId();
                    final String energyId = indexIdEnergyIdMap.get(indexId);
                    final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                    if(coefficient == null){
                    if (coefficient == null) {
                        throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
                    }
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);;
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);
                    ;
//                    if(energyProportionMap.containsKey(energyId)) {
//                        energyProportionMap.put(energyId,energyProportionMap.get(energyId) + sum.doubleValue());
//                    }else {
@@ -804,26 +807,24 @@
        }
        Map<String, List<DataItem>> indexDataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId));
        indexDataItemMap.forEach((indexId,value)->{
        indexDataItemMap.forEach((indexId, value) -> {
            final String energyId = indexIdEnergyIdMap.get(indexId);
            final BigDecimal coefficient = energyCoefficientMap.get(energyId);
            if(coefficient == null){
            if (coefficient == null) {
                throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
            }
            final double sum = value.stream().map(DataItem::getValue).mapToDouble(Double::doubleValue).sum();
            if(energyProportionMap.containsKey(energyId)) {
                energyProportionMap.put(energyId,energyProportionMap.get(energyId) + sum * coefficient.doubleValue());
            }else {
            if (energyProportionMap.containsKey(energyId)) {
                energyProportionMap.put(energyId, energyProportionMap.get(energyId) + sum * coefficient.doubleValue());
            } else {
                energyProportionMap.put(energyId, sum * coefficient.doubleValue());
            }
        });
        Double eneryTotal =  energyProportionMap.values().stream().mapToDouble(Double::doubleValue).sum();
        Double eneryTotal = energyProportionMap.values().stream().mapToDouble(Double::doubleValue).sum();
        return eneryTotal.doubleValue();
    }
@@ -839,11 +840,11 @@
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeByParentId(nodeId);
        final Map<String, String> nodeNameMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String id = n.getNodeId();
            final String name = n.getName();
            if(!nodeNameMap.containsKey(id)){
                nodeNameMap.put(id,name);
            if (!nodeNameMap.containsKey(id)) {
                nodeNameMap.put(id, name);
            }
        });
        // 按照点位进行分组
@@ -851,17 +852,17 @@
                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        //能源编号和能源折标系数
        final Map<String, BigDecimal> energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient));
        //index和能源
        final Map<String, String> indexIdEnergyIdMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String indexId = n.getIndexId();
            final String energyId = n.getEnergyId();
            if(!indexIdEnergyIdMap.containsKey(indexId)){
                indexIdEnergyIdMap.put(indexId,energyId);
            if (!indexIdEnergyIdMap.containsKey(indexId)) {
                indexIdEnergyIdMap.put(indexId, energyId);
            }
        });
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
@@ -886,22 +887,22 @@
        }
        // 根据indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
        }
        Map<String, List<DataItem>> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(DataItem::getIndexId));
        Map<String,BigDecimal> resultMap = new HashMap<>();
        Map<String, BigDecimal> resultMap = new HashMap<>();
        nodeIndexMap.forEach((key, value) -> {
            // 找出indexIds
            List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
            indexIdList.forEach(indexId->{
            indexIdList.forEach(indexId -> {
                final List<DataItem> dataItems = dataItemMap.get(indexId);
                final String energyId = indexIdEnergyIdMap.get(indexId);
                final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                if(CollectionUtils.isNotEmpty(dataItems) ){
                if (CollectionUtils.isNotEmpty(dataItems)) {
                    BigDecimal sum = BigDecimal.valueOf(dataItems.stream()
                            .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(coefficient);
@@ -914,7 +915,7 @@
            });
        });
        resultMap.forEach((key,value)->{
        resultMap.forEach((key, value) -> {
            RankingEnergyData rankingEnergyData = new RankingEnergyData();
            rankingEnergyData.setNodeId(key);
            rankingEnergyData.setNodeName(nodeNameMap.get(key));
@@ -950,30 +951,30 @@
        }
        LambdaQueryWrapper<EnergyIndicators> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(EnergyIndicators::getTimeType,queryTimeType);
        queryWrapper.eq(EnergyIndicators::getDataTime,DateUtil.format(dto.getDataTime(),timeFormat));
        queryWrapper.eq(EnergyIndicators::getNodeId,dto.getNodeId());
        queryWrapper.eq(EnergyIndicators::getEnergyType,dto.getEnergyType());
        queryWrapper.eq(EnergyIndicators::getTimeType, queryTimeType);
        queryWrapper.eq(EnergyIndicators::getDataTime, DateUtil.format(dto.getDataTime(), timeFormat));
        queryWrapper.eq(EnergyIndicators::getNodeId, dto.getNodeId());
        queryWrapper.eq(EnergyIndicators::getEnergyType, dto.getEnergyType());
        // 0 是计划量
        queryWrapper.eq(EnergyIndicators::getIndicatorsType,"0");
        queryWrapper.eq(EnergyIndicators::getIndicatorsType, "0");
        final EnergyIndicators plan = energyIndicatorsMapper.selectOne(queryWrapper);
        if(null != plan && null!= plan.getNumber()) {
        if (null != plan && null != plan.getNumber()) {
            consumptionAnalysisVO.setPlanCount(plan.getNumber().divide(new BigDecimal(between), CommonConst.DIGIT_2, RoundingMode.HALF_UP).doubleValue());
        }else {
        } else {
            consumptionAnalysisVO.setPlanCount(0D);
        }
        queryWrapper.clear();
        queryWrapper.eq(EnergyIndicators::getTimeType,queryTimeType);
        queryWrapper.eq(EnergyIndicators::getDataTime,DateUtil.format(dto.getDataTime(),timeFormat));
        queryWrapper.eq(EnergyIndicators::getNodeId,dto.getNodeId());
        queryWrapper.eq(EnergyIndicators::getEnergyType,dto.getEnergyType());
        queryWrapper.eq(EnergyIndicators::getIndicatorsType,"1");
        queryWrapper.eq(EnergyIndicators::getTimeType, queryTimeType);
        queryWrapper.eq(EnergyIndicators::getDataTime, DateUtil.format(dto.getDataTime(), timeFormat));
        queryWrapper.eq(EnergyIndicators::getNodeId, dto.getNodeId());
        queryWrapper.eq(EnergyIndicators::getEnergyType, dto.getEnergyType());
        queryWrapper.eq(EnergyIndicators::getIndicatorsType, "1");
        final EnergyIndicators prod = energyIndicatorsMapper.selectOne(queryWrapper);
        if(null != prod && null!= prod.getNumber()) {
        if (null != prod && null != prod.getNumber()) {
            consumptionAnalysisVO.setPlanCount(prod.getNumber().divide(new BigDecimal(between), CommonConst.DIGIT_2, RoundingMode.HALF_UP).doubleValue());
        }else {
        } else {
            consumptionAnalysisVO.setProdCount(0D);
        }
        return consumptionAnalysisVO;
@@ -993,19 +994,19 @@
        /**
         * 查询点位与用能单元信息
         */
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId,energyType);
        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeMapper.getModelNodeIndexIdByNodeId(nodeId, energyType);
        final List<String> eneryIdList = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getEnergyId).distinct().collect(Collectors.toList());
        final LambdaQueryWrapper<SysEnergy> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList),SysEnergy::getEnersno,eneryIdList);
        queryWrapper.in(CollectionUtils.isNotEmpty(eneryIdList), SysEnergy::getEnersno, eneryIdList);
        final List<SysEnergy> sysEnergies = sysEnergyMapper.selectList(queryWrapper);
        final Map<String, BigDecimal> energyCoefficientMap = sysEnergies.stream().collect(Collectors.toMap(SysEnergy::getEnersno, SysEnergy::getCoefficient));
        final Map<String, String> indexIdEnergyIdMap = new HashMap<>();
        nodeIndexInforList.forEach(n->{
        nodeIndexInforList.forEach(n -> {
            final String indexId = n.getIndexId();
            final String energyId = n.getEnergyId();
            if(!indexIdEnergyIdMap.containsKey(indexId)){
                indexIdEnergyIdMap.put(indexId,energyId);
            if (!indexIdEnergyIdMap.containsKey(indexId)) {
                indexIdEnergyIdMap.put(indexId, energyId);
            }
        });
        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
@@ -1032,12 +1033,11 @@
            shixuTimeType = TimeType.MONTH.name();
            timeFormat = "yyyy-MM";
        }
        // 根据indexId查询dataItem
        List<DataItem> dataItemList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(indexIds)) {
        if (CollectionUtils.isNotEmpty(indexIds)) {
            dataItemList = dataItemService.getDataItemTimeRangeInforByIndexIds(beginTime, endTime, shixuTimeType, indexIds);
        }
        Map<String, List<DataItem>> dataItemMap = dataItemList.stream().collect(Collectors.groupingBy(li -> DateUtil.format(li.getDataTime(), timeFormat)));
@@ -1045,12 +1045,12 @@
        while (!beginTime.after(endTime)) {
            //查询开始时间和结束时间之间的产量
            LambdaQueryWrapper<ProductOutput> indicatorsWrapper = new LambdaQueryWrapper<>();
            indicatorsWrapper.eq(ProductOutput::getTimeType,shixuTimeType);
            indicatorsWrapper.eq(ProductOutput::getNodeId,dto.getNodeId());
            indicatorsWrapper.eq(ProductOutput::getDataTime,DateUtil.format(beginTime,timeFormat));
            indicatorsWrapper.eq(ProductOutput::getTimeType, shixuTimeType);
            indicatorsWrapper.eq(ProductOutput::getNodeId, dto.getNodeId());
            indicatorsWrapper.eq(ProductOutput::getDataTime, DateUtil.format(beginTime, timeFormat));
            List<ProductOutput> energyIndicators = productOutputMapper.selectList(indicatorsWrapper);
            prodCountMap.put(DateUtil.format(beginTime,timeFormat),energyIndicators);
            prodCountMap.put(DateUtil.format(beginTime, timeFormat), energyIndicators);
            ConsumptionAnalysisData data = new ConsumptionAnalysisData();
            final String currentTime = DateUtil.format(beginTime, timeFormat);
@@ -1058,17 +1058,18 @@
            BigDecimal sum = new BigDecimal(0);
            if (CollectionUtils.isNotEmpty(dataItems)) {
                // 求和
                for (int i=0;i<dataItems.size(); i++){
                for (int i = 0; i < dataItems.size(); i++) {
                    final DataItem dataItem = dataItems.get(i);
                    final String indexId = dataItem.getIndexId();
                    final String energyId = indexIdEnergyIdMap.get(indexId);
                    final BigDecimal coefficient = energyCoefficientMap.get(energyId);
                    if(coefficient == null){
                    if (coefficient == null) {
                        throw new RuntimeException("能源类型" + energyId + "没有配置折标系数,无法计算");
                    }
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);;
                    sum = sum.add(new BigDecimal(dataItem.getValue()).multiply(coefficient)).setScale(2, RoundingMode.HALF_UP);
                    ;
                }
            }
@@ -1090,18 +1091,18 @@
                    break;
            }
        }
        dataList.forEach(d->{
        dataList.forEach(d -> {
            ProductEnergyAnalysisData productEnergyAnalysisData = new ProductEnergyAnalysisData();
            final String currentTime = d.getCurrentTime();
            productEnergyAnalysisData.setDateTime(currentTime);
            final List<ProductOutput> productOutputs = prodCountMap.get(currentTime);
            if(StringUtils.isEmpty(dto.getProdType())){
            if (StringUtils.isEmpty(dto.getProdType())) {
                productEnergyAnalysisData.setEnergyCount(format2Double(d.getCurrentValue()));
                final double sum = productOutputs.stream().map(ProductOutput::getNumber).mapToDouble(BigDecimal::doubleValue).sum();
                productEnergyAnalysisData.setProductCount(format2Double(sum));
                if(sum != 0) {
                if (sum != 0) {
                    final double averageEnergy = productEnergyAnalysisData.getEnergyCount() / productEnergyAnalysisData.getProductCount();
                    // 创建DecimalFormat对象,设置保留两位小数
                    DecimalFormat df = new DecimalFormat("#.00");
@@ -1109,15 +1110,15 @@
                    // 格式化结果
                    String formattedResult = df.format(averageEnergy);
                    productEnergyAnalysisData.setAverage(Double.valueOf(formattedResult));
                }else {
                } else {
                    productEnergyAnalysisData.setAverage(0);
                }
            }else {
                if(CollectionUtils.isNotEmpty(productOutputs)) {
            } else {
                if (CollectionUtils.isNotEmpty(productOutputs)) {
                    final Map<String, List<ProductOutput>> productTypeMap = productOutputs.stream().collect(Collectors.groupingBy(ProductOutput::getProductType));
                    final double sum = productOutputs.stream().map(ProductOutput::getNumber).mapToDouble(BigDecimal::doubleValue).sum();
                    final List<ProductOutput> outputList = productTypeMap.get(dto.getProdType());
                    if(CollectionUtils.isNotEmpty(outputList)) {
                    if (CollectionUtils.isNotEmpty(outputList)) {
                        final double enengyProd = outputList.stream().map(ProductOutput::getNumber).mapToDouble(BigDecimal::doubleValue).sum();
                        productEnergyAnalysisData.setProductCount(format2Double(enengyProd));
                        productEnergyAnalysisData.setEnergyCount(format2Double(d.getCurrentValue() * enengyProd / sum));
@@ -1128,19 +1129,19 @@
                        } else {
                            productEnergyAnalysisData.setAverage(0);
                        }
                    }else {
                    } else {
                        productEnergyAnalysisData.setProductCount(0);
                        productEnergyAnalysisData.setEnergyCount(d.getCurrentValue());
                        productEnergyAnalysisData.setAverage(0);
                    }
                }else {
                } else {
                    productEnergyAnalysisData.setProductCount(0);
                    productEnergyAnalysisData.setEnergyCount(d.getCurrentValue());
                    productEnergyAnalysisData.setAverage(0);
                }
            }
            chart.add(productEnergyAnalysisData);
        });
@@ -1149,9 +1150,9 @@
        final double totalProd = chart.stream().map(ProductEnergyAnalysisData::getProductCount).mapToDouble(Double::doubleValue).sum();
        productEnergyAnalysisVO.setTotalEnergy(format2Double(totalEnergy));
        productEnergyAnalysisVO.setTotalProduct(format2Double(totalProd));
        if(totalProd != 0) {
        if (totalProd != 0) {
            productEnergyAnalysisVO.setAverageEnergy(format2Double(totalEnergy / totalProd));
        }else {
        } else {
            productEnergyAnalysisVO.setAverageEnergy(0D);
        }
        return productEnergyAnalysisVO;