鞍钢鲅鱼圈能源管控系统后端代码
dongyukun
8 天以前 e877802fee6dc3ee5512f9b3b092d323786392d8
峰谷平占比计算
已修改1个文件
114 ■■■■■ 文件已修改
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPeakValleyFlatTask.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPeakValleyFlatTask.java
@@ -1,7 +1,5 @@
package com.iailab.module.ansteel.job.task;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.util.DateUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.iailab.module.ansteel.power.dao.PeakValleyFlatDao;
import com.iailab.module.ansteel.power.entity.PeakValleyFlatEntity;
@@ -9,18 +7,14 @@
import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
import com.iailab.module.data.api.point.dto.ApiPointValueWriteDTO;
import org.checkerframework.checker.units.qual.A;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;
import static com.alibaba.excel.util.DateUtils.DATE_FORMAT_16_FORWARD_SLASH;
/**
 * 峰谷平累计量计算
@@ -42,6 +36,8 @@
    @Override
    public void run(String params) {
        try {
            Calendar calendar = Calendar.getInstance();
            //查询峰谷平配置列表
            List<PeakValleyFlatEntity> list = peakValleyFlatDao.selectList(new QueryWrapper<>());
@@ -52,20 +48,42 @@
            groupedByPointNo.entrySet().stream().forEach(entry -> {
                //计算昨日的累积量
                double value = getSumValue(entry.getValue(),1);
                double value = getSumValue(entry.getValue(), 1, calendar);
                //计算昨日总电耗
                calendar.set(Calendar.MILLISECOND, 0);
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.HOUR_OF_DAY, 0);
                Date endTime = calendar.getTime();
                calendar.add(Calendar.DAY_OF_YEAR, -1);
                Date startTime = calendar.getTime();
                double totalValue = getSumValueTotal(entry.getValue().get(0).getPowerNo(), startTime,endTime);
                //下发昨日占比
                ApiPointValueWriteDTO dto = new ApiPointValueWriteDTO();
                dto.setPointNo(entry.getValue().get(0).getPointNo());
                dto.setValue(value);
                dto.setValue(value/totalValue*100);
                dataPointApi.writePointRealValue(dto);
                //计算前三十日累积量
                double value30 = 0 ;
                double value30 = 0;
                for (int i = 1; i < 31; i++) {
                    value30 = value30 + getSumValue(entry.getValue(),i);
                    //计算前三十日累积量
                    value30 = value30 + getSumValue(entry.getValue(), i, calendar);
                }
                //计算前三十日总电耗
                calendar.set(Calendar.MILLISECOND, 0);
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.HOUR_OF_DAY, 0);
                calendar.add(Calendar.DAY_OF_YEAR, -30);
                Date startTimeMonth = calendar.getTime();
                double totalValueMonth = getSumValueTotal(entry.getValue().get(0).getPowerNo(), startTimeMonth,endTime);
                //下发前三十日占比
                ApiPointValueWriteDTO monthDto = new ApiPointValueWriteDTO();
                monthDto.setPointNo(entry.getValue().get(0).getPointNoMonth());
                monthDto.setValue(value30);
                monthDto.setValue(value30/totalValueMonth*100);
                dataPointApi.writePointRealValue(monthDto);
            });
        } catch (Exception ex) {
@@ -74,13 +92,13 @@
        }
    }
    private Date getTime(String timeStr , int ago) {
    private Date getTime(String timeStr, int ago, Calendar calendar) {
        String[] timeSplit = timeStr.split(":");
        if (timeSplit.length != 2) {
            throw new IllegalArgumentException("时间配置格式不合法");
        }
        //根据配置获取startTime、endTime、
        Calendar calendar = Calendar.getInstance();
        //根据配置获取startTime、endTime
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeSplit[0]));
        calendar.set(Calendar.MINUTE, Integer.parseInt(timeSplit[1]));
        calendar.add(Calendar.DAY_OF_YEAR, -ago);
@@ -90,65 +108,62 @@
    private List<ApiPointValueDTO> fillMissingData(List<ApiPointValueDTO> valueList,
                                                   Date startTime,
                                                   Date endTime) {
        // 如果原始数据为空,返回空列表
        if (valueList == null || valueList.isEmpty()) {
            return new ArrayList<>();
        }
        // 过滤掉null元素
        valueList = valueList.stream().filter(Objects::nonNull).collect(Collectors.toList());
        if (valueList.isEmpty()) {
            return new ArrayList<>();
        }
        List<ApiPointValueDTO> filledList = new ArrayList<>();
        ApiPointValueDTO lastValidData = null;
        // 计算总分钟数
        long totalMinutes = (endTime.getTime() - startTime.getTime()) / (60 * 1000);
        // 遍历每分钟
        for (int i = 0; i <= totalMinutes; i++) {
            Date currentTime = new Date(startTime.getTime() + i * 60 * 1000);
            // 查找当前分钟是否有数据
            ApiPointValueDTO currentData = findDataForTime(valueList, currentTime);
            if (currentData != null) {
                // 如果有数据,使用原始数据
                filledList.add(currentData);
                lastValidData = currentData;
            } else if (lastValidData != null) {
                // 如果没有数据但有最近的有效数据,则补充
                ApiPointValueDTO filledData = new ApiPointValueDTO()
                filledList.add(new ApiPointValueDTO()
                        .setT(currentTime)
                        .setV(lastValidData.getV());
                filledList.add(filledData);
                        .setV(lastValidData.getV()));
            } else {
                // 如果既没有当前数据也没有最近数据,查找第一个有值的数据
                ApiPointValueDTO filledData = new ApiPointValueDTO()
                // 使用第一个非null数据的值
                filledList.add(new ApiPointValueDTO()
                        .setT(currentTime)
                        .setV(valueList.get(0).getV());
                filledList.add(filledData);
                lastValidData = filledData;
                        .setV(valueList.get(0).getV()));
            }
        }
        return filledList;
    }
    private  ApiPointValueDTO findDataForTime(List<ApiPointValueDTO> valueList, Date time) {
        for (ApiPointValueDTO data : valueList) {
            long time1 = data.getT().getTime() / (60 * 1000);
            long time2 = time.getTime() / (60 * 1000);
            if (time1 == time2) {
                return data;
            }
        }
        return null;
    private ApiPointValueDTO findDataForTime(List<ApiPointValueDTO> valueList, Date time) {
        long targetMinute = time.getTime() / (60 * 1000);
        return valueList.stream()
                .filter(Objects::nonNull)
                .filter(d -> d.getT() != null)
                .filter(d -> d.getT().getTime() / (60 * 1000) == targetMinute)
                .findFirst()
                .orElse(null);
    }
    private double getSumValue(  List<PeakValleyFlatEntity> list ,int ago){
    private double getSumValue(List<PeakValleyFlatEntity> list, int ago, Calendar calendar) {
        double value = 0;
        for (int i = 0; i < list.size(); i++) {
            PeakValleyFlatEntity entity = list.get(i);
            ApiPointValueQueryDTO dto = new ApiPointValueQueryDTO();
            Date startTime = getTime(entity.getStartTime(),ago);
            Date endTime = getTime(entity.getEndTime(),ago);
            Date startTime = getTime(entity.getStartTime(), ago, calendar);
            Date endTime = getTime(entity.getEndTime(), ago, calendar);
            dto.setPointNo(entity.getPowerNo());
            dto.setStart(startTime);
            dto.setEnd(endTime);
@@ -161,7 +176,20 @@
            double sum = valueList.stream().mapToDouble(ApiPointValueDTO::getV).sum();
            value = value + sum;
        }
        return value/60;
        return value / 60;
    }
    private double getSumValueTotal(String pointNo, Date startTime, Date endTime) {
        ApiPointValueQueryDTO dto = new ApiPointValueQueryDTO();
        dto.setPointNo(pointNo);
        dto.setStart(startTime);
        dto.setEnd(endTime);
        //查找数据
        List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(dto);
        //补全数据
        valueList = fillMissingData(valueList, startTime, endTime);
        //累加
        return valueList.stream().mapToDouble(ApiPointValueDTO::getV).sum()/ 60;
    }
}