From 032af21e28a83856c74b63db1f4638e4cdbec462 Mon Sep 17 00:00:00 2001
From: dongyukun <1208714201@qq.com>
Date: 星期三, 07 五月 2025 18:02:15 +0800
Subject: [PATCH] 归档过滤-2

---
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java |  103 ++++++++++++++++++++++++---------------------------
 1 files changed, 48 insertions(+), 55 deletions(-)

diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java
index 1ff3198..6ddba25 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/arc/service/impl/ArcDataServiceImpl.java
@@ -21,6 +21,7 @@
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -37,31 +38,30 @@
 
     //根据归档类型进行归档
     @Override
-    public void archiving(String type) {
+    public void archiving(String type, Calendar calendar) {
         Map<String, Object> params = new HashMap<String, Object>();
         params.put("type", type);
         switch (ArcTypeEnum.getEumByCode(type)) {
             case HOUR:
                 //查询对应类型的归档设置列表
                 List<ArcSettingEntity> arcHourList = arcPointSettingService.list(params);
+                Date endTime1 = calendar.getTime();
+                calendar.add(Calendar.HOUR_OF_DAY, -1);
+                Date startTime1 = calendar.getTime();
                 //遍历列表
                 arcHourList.forEach(item -> {
                     log.debug("开始归档,point:"+item.getPoint());
-                    //获取开始时间
-                    Calendar calendar = Calendar.getInstance();
-                    calendar.add(Calendar.HOUR_OF_DAY, -1);
-                    Date startTime = calendar.getTime();
                     //通过point编号查询数据
                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
                     queryDto.setPointNo(item.getPoint());
-                    queryDto.setStart(startTime);
-                    queryDto.setEnd(new Date());
+                    queryDto.setStart(startTime1);
+                    queryDto.setEnd(endTime1);
                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
                     //判断根据计算类型计算
                     BigDecimal value = calculate(item.getCalculate(), valueList);
                     //归档
                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
-                    String arcTime = dateFormat.format(startTime);
+                    String arcTime = dateFormat.format(startTime1);
                     ArcDataEntity arcDataEntity = new ArcDataEntity();
                     arcDataEntity.setId(String.valueOf(new Date().getTime()));
                     arcDataEntity.setArcTime(arcTime);
@@ -69,7 +69,7 @@
                     arcDataEntity.setArcValue(value);
                     arcDataDao.delete(new LambdaQueryWrapperX<ArcDataEntity>()
                             .eq(ArcDataEntity::getArcId, arcDataEntity.getArcId())
-                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcId())
+                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcTime())
                     );
                     insert(arcDataEntity);
                     log.debug("归档完成,point:"+item.getPoint());
@@ -78,24 +78,23 @@
             case SHIFT:
                 //查询对应类型的归档设置列表
                 List<ArcSettingEntity> arcShiftList = arcPointSettingService.list(params);
+                Date endTime2 = calendar.getTime();
+                calendar.add(Calendar.HOUR_OF_DAY, -1);
+                Date startTime2 = calendar.getTime();
                 //遍历列表
                 arcShiftList.forEach(item -> {
                     log.debug("开始归档,point:"+item.getPoint());
-                    //获取开始时间
-                    Calendar calendar = Calendar.getInstance();
-                    calendar.add(Calendar.HOUR_OF_DAY, -12);
-                    Date startTime = calendar.getTime();
                     //通过point编号查询数据
                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
                     queryDto.setPointNo(item.getPoint());
-                    queryDto.setStart(startTime);
-                    queryDto.setEnd(new Date());
+                    queryDto.setStart(startTime2);
+                    queryDto.setEnd(endTime2);
                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
                     //判断根据计算类型计算
                     BigDecimal value = calculate(item.getCalculate(), valueList);
                     //归档
                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
-                    String arcTime = dateFormat.format(startTime);
+                    String arcTime = dateFormat.format(startTime2);
                     ArcDataEntity arcDataEntity = new ArcDataEntity();
                     arcDataEntity.setId(String.valueOf(new Date().getTime()));
                     arcDataEntity.setArcTime(arcTime);
@@ -103,7 +102,7 @@
                     arcDataEntity.setArcValue(value);
                     arcDataDao.delete(new LambdaQueryWrapperX<ArcDataEntity>()
                             .eq(ArcDataEntity::getArcId, arcDataEntity.getArcId())
-                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcId())
+                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcTime())
                     );
                     insert(arcDataEntity);
                     log.debug("归档完成,point:"+item.getPoint());
@@ -112,24 +111,23 @@
             case DAY:
                 //查询对应类型的归档设置列表
                 List<ArcSettingEntity> arcDayList = arcPointSettingService.list(params);
+                Date endTime3 = calendar.getTime();
+                calendar.add(Calendar.DAY_OF_YEAR, -1);
+                Date startTime3 = calendar.getTime();
                 //遍历列表
                 arcDayList.forEach(item -> {
                     log.debug("开始归档,point:"+item.getPoint());
-                    //获取开始时间
-                    Calendar calendar = Calendar.getInstance();
-                    calendar.add(Calendar.DAY_OF_MONTH, -1);
-                    Date startTime = calendar.getTime();
                     //通过point编号查询数据
                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
                     queryDto.setPointNo(item.getPoint());
-                    queryDto.setStart(startTime);
-                    queryDto.setEnd(new Date());
+                    queryDto.setStart(startTime3);
+                    queryDto.setEnd(endTime3);
                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
                     //判断根据计算类型计算
                     BigDecimal value = calculate(item.getCalculate(), valueList);
                     //归档
                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-                    String arcTime = dateFormat.format(startTime);
+                    String arcTime = dateFormat.format(startTime3);
                     ArcDataEntity arcDataEntity = new ArcDataEntity();
                     arcDataEntity.setId(String.valueOf(new Date().getTime()));
                     arcDataEntity.setArcTime(arcTime);
@@ -139,7 +137,7 @@
                     arcDataEntity.setCreateTime(new Date());
                     arcDataDao.delete(new LambdaQueryWrapperX<ArcDataEntity>()
                             .eq(ArcDataEntity::getArcId, arcDataEntity.getArcId())
-                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcId())
+                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcTime())
                     );
                     insert(arcDataEntity);
                     log.debug("归档完成,point:"+item.getPoint());
@@ -148,24 +146,23 @@
             case MONTH:
                 //查询对应类型的归档设置列表
                 List<ArcSettingEntity> arcMonthList = arcPointSettingService.list(params);
+                Date endTime4 = calendar.getTime();
+                calendar.add(Calendar.MONTH, -1);
+                Date startTime4 = calendar.getTime();
                 //遍历列表
                 arcMonthList.forEach(item -> {
                     log.debug("开始归档,point:"+item.getPoint());
-                    //获取开始时间
-                    Calendar calendar = Calendar.getInstance();
-                    calendar.add(Calendar.MONTH, -1);
-                    Date startTime = calendar.getTime();
                     //通过point编号查询数据
                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
                     queryDto.setPointNo(item.getPoint());
-                    queryDto.setStart(startTime);
-                    queryDto.setEnd(new Date());
+                    queryDto.setStart(startTime4);
+                    queryDto.setEnd(endTime4);
                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
                     //判断根据计算类型计算
                     BigDecimal value = calculate(item.getCalculate(), valueList);
                     //归档
                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
-                    String arcTime = dateFormat.format(startTime);
+                    String arcTime = dateFormat.format(startTime4);
                     ArcDataEntity arcDataEntity = new ArcDataEntity();
                     arcDataEntity.setId(String.valueOf(new Date().getTime()));
                     arcDataEntity.setArcTime(arcTime);
@@ -175,7 +172,7 @@
                     arcDataEntity.setCreateTime(new Date());
                     arcDataDao.delete(new LambdaQueryWrapperX<ArcDataEntity>()
                             .eq(ArcDataEntity::getArcId, arcDataEntity.getArcId())
-                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcId())
+                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcTime())
                     );
                     insert(arcDataEntity);
                     log.debug("归档完成,point:"+item.getPoint());
@@ -184,24 +181,23 @@
             case YEAR:
                 //查询对应类型的归档设置列表
                 List<ArcSettingEntity> arcYearList = arcPointSettingService.list(params);
+                Date endTime5 = calendar.getTime();
+                calendar.add(Calendar.YEAR, -1);
+                Date startTime5 = calendar.getTime();
                 //遍历列表
                 arcYearList.forEach(item -> {
                     log.debug("开始归档,point:"+item.getPoint());
-                    //获取开始时间
-                    Calendar calendar = Calendar.getInstance();
-                    calendar.add(Calendar.YEAR, -1);
-                    Date startTime = calendar.getTime();
                     //通过point编号查询数据
                     ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
                     queryDto.setPointNo(item.getPoint());
-                    queryDto.setStart(startTime);
-                    queryDto.setEnd(new Date());
+                    queryDto.setStart(startTime5);
+                    queryDto.setEnd(endTime5);
                     List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDto);
                     //判断根据计算类型计算
                     BigDecimal value = calculate(item.getCalculate(), valueList);
                     //归档
                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
-                    String arcTime = dateFormat.format(startTime);
+                    String arcTime = dateFormat.format(startTime5);
                     ArcDataEntity arcDataEntity = new ArcDataEntity();
                     arcDataEntity.setId(String.valueOf(new Date().getTime()));
                     arcDataEntity.setArcTime(arcTime);
@@ -211,7 +207,7 @@
                     arcDataEntity.setCreateTime(new Date());
                     arcDataDao.delete(new LambdaQueryWrapperX<ArcDataEntity>()
                             .eq(ArcDataEntity::getArcId, arcDataEntity.getArcId())
-                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcId())
+                            .eq(ArcDataEntity::getArcTime, arcDataEntity.getArcTime())
                     );
                     insert(arcDataEntity);
                     log.debug("归档完成,point:"+item.getPoint());
@@ -222,8 +218,9 @@
     }
 
     private BigDecimal calculate(String calculate, List<ApiPointValueDTO> valueList) {
+        List<ApiPointValueDTO> valueFilterList = valueList.stream().filter(e -> !Double.valueOf(e.getV()).equals(-2.0) ).collect(Collectors.toList());
         log.debug("开始计算");
-        if (valueList == null || valueList.isEmpty()) {
+        if ( valueList.isEmpty() || valueFilterList.isEmpty()) {
             throw new IllegalArgumentException("valueList 为空");
         }
 
@@ -235,28 +232,24 @@
                 value = BigDecimal.valueOf(valueList.get(valueList.size() - 1).getV());
                 break;
             case SUM:
-                for (ApiPointValueDTO dto : valueList) {
-                    value = value.add(BigDecimal.valueOf(dto.getV()));
-                }
+                value = BigDecimal.valueOf(valueFilterList.stream().mapToDouble(ApiPointValueDTO::getV).sum());
                 break;
             case DIFF:
-                if (valueList.size() < 2) {
-                    throw new IllegalArgumentException("valueList size小于2");
+                if (valueFilterList.size() < 2) {
+                    throw new IllegalArgumentException("valueFilterList size小于2");
                 }
-                BigDecimal prev = BigDecimal.valueOf(valueList.get(0).getV());
-                for (int i = 1; i < valueList.size(); i++) {
-                    BigDecimal curr = BigDecimal.valueOf(valueList.get(i).getV());
-                    if(curr.compareTo(prev) > 0) {
+                BigDecimal prev = BigDecimal.valueOf(valueFilterList.get(0).getV());
+                for (int i = 1; i < valueFilterList.size(); i++) {
+                    BigDecimal curr = BigDecimal.valueOf(valueFilterList.get(i).getV());
+                    if(curr.compareTo(prev) > 0 ) {
                         value = value.add(curr.subtract(prev));
                     }
                     prev = curr;
                 }
                 break;
             case AVG:
-                for (ApiPointValueDTO dto : valueList) {
-                    value = value.add(BigDecimal.valueOf(dto.getV()));
-                }
-                value = value.divide(BigDecimal.valueOf(valueList.size()), 2, BigDecimal.ROUND_HALF_UP);
+                value = BigDecimal.valueOf(valueFilterList.stream().mapToDouble(ApiPointValueDTO::getV).sum());
+                value = value.divide(BigDecimal.valueOf(valueFilterList.size()), 2, BigDecimal.ROUND_HALF_UP);
                 break;
             default:
                 throw new IllegalArgumentException("没有对应计算方法");

--
Gitblit v1.9.3