From 3d4783b231a4af203cb42c4bd6d87b1ca4d2239b Mon Sep 17 00:00:00 2001 From: dongyukun <1208714201@qq.com> Date: 星期二, 06 五月 2025 13:47:24 +0800 Subject: [PATCH] 峰谷平占比计算 --- ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPeakValleyFlatTask.java | 154 +++++++++++++++++++++++++++++++------------------- 1 files changed, 95 insertions(+), 59 deletions(-) diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPeakValleyFlatTask.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPeakValleyFlatTask.java index ce68ca6..4cb978d 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPeakValleyFlatTask.java +++ b/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,126 +36,168 @@ @Override public void run(String params) { try { + Calendar calendar = Calendar.getInstance(); + //查询峰谷平配置列表 List<PeakValleyFlatEntity> list = peakValleyFlatDao.selectList(new QueryWrapper<>()); //根据测点分组 Map<String, List<PeakValleyFlatEntity>> groupedByPointNo = list.stream() - .collect(Collectors.groupingBy(PeakValleyFlatEntity::getPowerNo)); + .collect(Collectors.groupingBy(PeakValleyFlatEntity::getPointNo)); groupedByPointNo.entrySet().stream().forEach(entry -> { - //计算昨日的累积量 - double value = getSumValue(entry.getValue(),1); - ApiPointValueWriteDTO dto = new ApiPointValueWriteDTO(); - dto.setPointNo(entry.getValue().get(0).getPointNo()); - dto.setValue(value); - dataPointApi.writePointRealValue(dto); + //计算昨日的峰/谷累积量 + double value = getSumValue(entry.getValue(), 1, calendar); - //计算前三十日累积量 - double value30 = 0 ; - for (int i = 1; i < 31; i++) { - value30 = value30 + getSumValue(entry.getValue(),i); - } + //计算昨日总电耗 + Calendar cal = (Calendar) calendar.clone(); + cal.set(Calendar.MILLISECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.HOUR_OF_DAY, 0); + Date endTime = calendar.getTime(); + cal.add(Calendar.DAY_OF_YEAR, -1); + Date startTime = cal.getTime(); + cal.add(Calendar.DAY_OF_YEAR, -29); + Date monthStartTime = cal.getTime(); + double totalValue = getSumValueTotal(entry.getValue().get(0).getPowerNo(), startTime, endTime); + + //下发昨日占比 + ApiPointValueWriteDTO percentDto = new ApiPointValueWriteDTO(); + percentDto.setPointNo(entry.getValue().get(0).getPointNo()); + double percent = totalValue == 0 ? 0 : value / totalValue * 100; + percentDto.setValue(percent); + dataPointApi.writePointRealValue(percentDto); + + //下发昨日峰/谷累积量 + ApiPointValueWriteDTO totalDto = new ApiPointValueWriteDTO(); + percentDto.setPointNo(entry.getValue().get(0).getPointNoTotal()); + percentDto.setValue(value); + dataPointApi.writePointRealValue(totalDto); + + //计算前三十日峰/谷累积量 + double valueMonth = getSumValueTotal(entry.getValue().get(0).getPointNoTotal(), monthStartTime, endTime); + + //计算前三十日总电耗 + double totalValueMonth = getSumValueTotal(entry.getValue().get(0).getPowerNo(), monthStartTime, endTime); + + //下发前三十日占比 ApiPointValueWriteDTO monthDto = new ApiPointValueWriteDTO(); monthDto.setPointNo(entry.getValue().get(0).getPointNoMonth()); - monthDto.setValue(value30); + double percentMonth = totalValueMonth == 0 ? 0 : valueMonth / totalValueMonth * 100; + monthDto.setValue(percentMonth); dataPointApi.writePointRealValue(monthDto); + }); } catch (Exception ex) { - logger.error("runPeakValleyFlatTask运行异常"); - ex.printStackTrace(); + logger.error("runPeakValleyFlatTask运行异常", ex); } } - private Date getTime(String timeStr , int ago) { + private Date getTime(String timeStr, int ago, Calendar calendar) { + Calendar cal = (Calendar) calendar.clone(); String[] timeSplit = timeStr.split(":"); if (timeSplit.length != 2) { throw new IllegalArgumentException("时间配置格式不合法"); } - //根据配置获取startTime、endTime、 - Calendar calendar = Calendar.getInstance(); - 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); - return calendar.getTime(); + //根据配置获取startTime、endTime + cal.set(Calendar.MILLISECOND, 0); + cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeSplit[0])); + cal.set(Calendar.MINUTE, Integer.parseInt(timeSplit[1])); + cal.add(Calendar.DAY_OF_YEAR, -ago); + return cal.getTime(); } 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); - + logger.info("开始查询,测点:" + entity.getPowerNo() + "startTime:" + startTime + "endTime:" + endTime); + List<ApiPointValueDTO> valueList; //查找数据 - List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(dto); + try { + valueList = dataPointApi.queryPointHistoryValue(dto); + } catch (Exception e) { + throw new RuntimeException("查询测点异常"); + } //补全数据 valueList = fillMissingData(valueList, startTime, endTime); //累加 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; + } } -- Gitblit v1.9.3