baoshiwei
2025-05-06 8dd7af51db4cf768fbf92002b5b62f7fb9d1c929
zhitan-system/src/main/java/com/zhitan/peakvalley/service/impl/PeakValleyServiceImpl.java
@@ -1,13 +1,11 @@
package com.zhitan.peakvalley.service.impl;
import cn.hutool.core.date.DateUtil;
import com.zhitan.common.enums.ElectricityTypeEnum;
import com.zhitan.common.enums.TimeType;
import com.zhitan.common.utils.DateUtils;
import com.zhitan.costmanagement.domain.vo.CostPriceRelevancyVo;
import com.zhitan.costmanagement.mapper.CostPriceRelevancyMapper;
import com.zhitan.model.domain.vo.ModelNodeIndexInfor;
import com.zhitan.model.domain.vo.ModelNodeIndexInfo;
import com.zhitan.model.mapper.ModelNodeMapper;
import com.zhitan.peakvalley.domain.ElectricityDataItem;
import com.zhitan.peakvalley.domain.dto.ElectricityDataItemListDTO;
@@ -41,10 +39,16 @@
    CostPriceRelevancyMapper costPriceRelevancyMapper;
    /**
     * 查询统计数据
     *
     * @param dto 请求参数
     * @return 结果
     * 查询尖峰平谷统计数据
     * @param dto 请求参数,包含模型代码、节点ID、查询时间、时间类型等
     * @return 按时间段分隔的统计结果列表
     *
     * 业务步骤:
     * 1. 根据查询时间确定起止时间范围
     * 2. 查询模型节点关联的指标信息
     * 3. 根据指标ID集合查询原始数据
     * 4. 按时间分组处理数据
     * 5. 循环遍历时间区间,统计各时段的费用和用电量
     */
    @Override
    public List<PeakValleyHourDataVO> getDataStatistics(ElectricityDataItemListDTO dto) {
@@ -56,9 +60,9 @@
        Map<String, List<ElectricityDataItem>> electricityDataMap = new HashMap<>();
        // 查询点位信息
        List<ModelNodeIndexInfor> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        List<ModelNodeIndexInfo> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) {
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toSet());
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toSet());
            List<ElectricityDataItem> dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType);
            electricityDataMap = dataItemList.stream()
@@ -120,6 +124,19 @@
    }
    /**
     * 按天维度进行尖峰平谷分时段分析
     * @param dto 请求参数,包含模型代码、节点ID、查询时间等
     * @return 包含日统计总览和图表数据的VO对象
     *
     * 业务步骤:
     * 1. 初始化统计容器和时间范围
     * 2. 查询关联指标并获取原始数据
     * 3. 按天聚合数据并计算各时段费用和用电量
     * 4. 生成费用/用电量折线图数据
     * 5. 计算总消耗量及各时段占比
     * 6. 汇总生成最终结果对象
     */
    @Override
    public PeakValleyDayVO segmentAnalysisDay(PeakValleyDTO dto) {
        PeakValleyDayVO peakValleyVO = new PeakValleyDayVO();
@@ -131,17 +148,26 @@
        Map<String, List<ElectricityDataItem>> electricityDataMap = new HashMap<>();
        // 查询点位信息
        List<ModelNodeIndexInfor> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        List<ModelNodeIndexInfo> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) {
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toSet());
            List<ElectricityDataItem> dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType);
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toSet());
            // 根据小时数据计算天的数据
            List<ElectricityDataItem> dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, TimeType.HOUR.name());
            electricityDataMap = dataItemList.stream()
                    .collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime())));
        }
        while (!startTime.after(endTime)) {
            String mapKey = DateUtil.formatDateTime(startTime);
            List<ElectricityDataItem> dataItemList = electricityDataMap.get(mapKey);
            Date nextTime = DateUtil.offsetDay(startTime, 1);
            List<ElectricityDataItem> dataItemList = new ArrayList<>();
            for (Map.Entry<String, List<ElectricityDataItem>> entry : electricityDataMap.entrySet()) {
                String key = entry.getKey();
                if ((DateUtils.parseDate(key).after(startTime) || DateUtils.parseDate(key).equals(startTime)) && DateUtils.parseDate(key).before(nextTime)) {
                    List<ElectricityDataItem> list = entry.getValue();
                    dataItemList.addAll(list);
                }
            }
            BigDecimal sharpFee = BigDecimal.ZERO;
            BigDecimal sharpPower = BigDecimal.ZERO;
@@ -157,45 +183,19 @@
                    String electricityType = electricityDataItem.getElectricityType();
                    if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) {
//                        sharpFee = sharpFee.add(electricityDataItem.getCost());
                        sharpFee = sharpFee.add(electricityDataItem.getCost());
                        sharpPower = sharpPower.add(electricityDataItem.getElectricity());
                    } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) {
//                        peakFee = peakFee.add(electricityDataItem.getCost());
                        peakFee = peakFee.add(electricityDataItem.getCost());
                        peakPower = peakPower.add(electricityDataItem.getElectricity());
                    } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) {
//                        flatFee = flatFee.add(electricityDataItem.getCost());
                        flatFee = flatFee.add(electricityDataItem.getCost());
                        flatPower = flatPower.add(electricityDataItem.getElectricity());
                    } else {
//                        valleyFee = valleyFee.add(electricityDataItem.getCost());
                        valleyFee = valleyFee.add(electricityDataItem.getCost());
                        valleyPower = valleyPower.add(electricityDataItem.getElectricity());
                    }
                }
                //2024-11-12新增
                CostPriceRelevancyVo voS =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.SHARP.name());
                if(voS!=null){
                    sharpFee = voS.getPrice().multiply(sharpPower);
                }
                CostPriceRelevancyVo voP =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.PEAK.name());
                if(voP!=null){
                    peakFee = voP.getPrice().multiply(peakPower);
                }
                CostPriceRelevancyVo voF =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.FLAT.name());
                if(voF!=null){
                    flatFee = voF.getPrice().multiply(flatPower);
                }
                CostPriceRelevancyVo voV =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.VALLEY.name());
                if(voV!=null){
                    valleyFee = voV.getPrice().multiply(valleyPower);
                }
//                CostPriceRelevancyVo voD =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.DEEP.name());
//                if(voV!=null){
//                    DeepFee = voV.getPrice().multiply(valleyPower);
//                }
            }
            PeakValleyDayDataVO peakAndValleyReportVO = new PeakValleyDayDataVO(startTime, sharpFee, sharpPower,
                    peakFee, peakPower, flatFee, flatPower, valleyFee, valleyPower);
@@ -318,6 +318,19 @@
        return peakValleyVO;
    }
    /**
     * 按小时维度进行尖峰平谷分时段分析
     * @param dto 请求参数,包含模型代码、节点ID、查询时间等
     * @return 包含小时级数据和可视化图表的VO对象
     *
     * 业务步骤:
     * 1. 初始化统计容器和时间范围
     * 2. 查询关联指标并获取原始数据
     * 3. 按小时统计各时段费用和用电量
     * 4. 生成用电量折线图数据
     * 5. 计算总用电量及各时段占比饼图数据
     * 6. 汇总生成最终结果对象
     */
    @Override
    public PeakValleyHourVO segmentAnalysisHour(PeakValleyDTO dto) {
        PeakValleyHourVO peakValleyVO = new PeakValleyHourVO();
@@ -329,9 +342,9 @@
        Map<String, List<ElectricityDataItem>> electricityDataMap = new HashMap<>();
        // 查询点位信息
        List<ModelNodeIndexInfor> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        List<ModelNodeIndexInfo> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) {
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toSet());
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toSet());
            List<ElectricityDataItem> dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType);
            electricityDataMap = dataItemList.stream()
@@ -355,39 +368,19 @@
                    String electricityType = electricityDataItem.getElectricityType();
                    if (ElectricityTypeEnum.SHARP.name().equals(electricityType)) {
//                        sharpFee = sharpFee.add(electricityDataItem.getCost());
                        sharpFee = sharpFee.add(electricityDataItem.getCost());
                        sharpPower = sharpPower.add(electricityDataItem.getElectricity());
                    } else if (ElectricityTypeEnum.PEAK.name().equals(electricityType)) {
//                        peakFee = peakFee.add(electricityDataItem.getCost());
                        peakFee = peakFee.add(electricityDataItem.getCost());
                        peakPower = peakPower.add(electricityDataItem.getElectricity());
                    } else if (ElectricityTypeEnum.FLAT.name().equals(electricityType)) {
//                        flatFee = flatFee.add(electricityDataItem.getCost());
                        flatFee = flatFee.add(electricityDataItem.getCost());
                        flatPower = flatPower.add(electricityDataItem.getElectricity());
                    } else {
//                        valleyFee = valleyFee.add(electricityDataItem.getCost());
                        valleyFee = valleyFee.add(electricityDataItem.getCost());
                        valleyPower = valleyPower.add(electricityDataItem.getElectricity());
                    }
                }
                //2024-11-12新增
                CostPriceRelevancyVo voS =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.SHARP.name());
                if(voS!=null){
                    sharpFee = voS.getPrice().multiply(sharpPower);
                }
                CostPriceRelevancyVo voP =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.PEAK.name());
                if(voP!=null){
                    peakFee = voP.getPrice().multiply(peakPower);
                }
                CostPriceRelevancyVo voF =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(),ElectricityTypeEnum.FLAT.name());
                if(voF!=null){
                    flatFee = voF.getPrice().multiply(flatPower);
                }
                CostPriceRelevancyVo voV =  costPriceRelevancyMapper.selectCostPriceRelevancyByNodeId(dto.getNodeId(), ElectricityTypeEnum.VALLEY.name());
                if(voV!=null){
                    valleyFee = voV.getPrice().multiply(valleyPower);
                }
            }
            PeakValleyHourDataVO peakAndValleyReportVO = new PeakValleyHourDataVO(startTime, sharpFee, sharpPower,
                    peakFee, peakPower, flatFee, flatPower, valleyFee, valleyPower);
@@ -451,6 +444,17 @@
        return peakValleyVO;
    }
    /**
     * 导出小时级尖峰平谷分析数据
     * @param dto 请求参数,包含模型代码、节点ID、查询时间等
     * @return 小时级详细统计数据列表
     *
     * 业务步骤:
     * 1. 初始化时间范围
     * 2. 查询关联指标并获取原始数据
     * 3. 按小时统计各时段数据
     * 4. 生成可导出的详细数据列表
     */
    @Override
    public List<PeakValleyHourDataVO> segmentAnalysisHourExport(PeakValleyDTO dto) {
        List<PeakValleyHourDataVO> reportVOList = new ArrayList<>();
@@ -461,9 +465,9 @@
        Map<String, List<ElectricityDataItem>> electricityDataMap = new HashMap<>();
        // 查询点位信息
        List<ModelNodeIndexInfor> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        List<ModelNodeIndexInfo> nodeIndexInfoList = modelNodeMapper.selectIndexByModelCodeAndNodeId(dto.getModelCode(), dto.getNodeId());
        if (CollectionUtils.isNotEmpty(nodeIndexInfoList)) {
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toSet());
            Set<String> indexSet = nodeIndexInfoList.stream().map(ModelNodeIndexInfo::getIndexId).collect(Collectors.toSet());
            List<ElectricityDataItem> dataItemList = electricityDataItemMapper.getDataStatistics(indexSet, startTime, endTime, timeType);
            electricityDataMap = dataItemList.stream()
@@ -524,6 +528,13 @@
       return reportVOList;
    }
    /**
     * 自定义时段的尖峰平谷分析(预留接口)
     * @param dto 请求参数,包含自定义时间范围等
     * @return 分析结果对象
     *
     * 当前实现:暂未开发,返回空值
     */
    @Override
    public PeakValleyDayVO segmentAnalysisDayCustomize(PeakValleyDTO dto) {
        return null;