From 8c7333f578a4b51283a1f519cd58fa57019a5825 Mon Sep 17 00:00:00 2001
From: dongyukun <1208714201@qq.com>
Date: 星期二, 06 五月 2025 16:39:15 +0800
Subject: [PATCH] 峰谷平占比计算

---
 ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPeakValleyFlatTask.java |  156 ++++++++++++++++++++++++++++++++-------------------
 1 files changed, 97 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..91e7370 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,170 @@
     @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.SECOND, 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(totalValue);
+                dataPointApi.writePointRealValue(totalDto);
+
+                //计算前三十日峰/谷累积量
+                double valueMonth = getSumValueTotal(entry.getValue().get(0).getPointNoTotal(), monthStartTime, startTime)+totalValue;
+
+                //计算前三十日总电耗
+                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);
+                logger.info("name:"+entry.getValue().get(0).getName()+";value:"+value+";valueMonth:"+valueMonth+";totalValueMonth:"+totalValueMonth);
                 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.SECOND, 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