From 4af6b1e2c41365936df308eea6fa50e269eca3b6 Mon Sep 17 00:00:00 2001
From: dengzedong <dengzedong@email>
Date: 星期四, 13 二月 2025 10:45:22 +0800
Subject: [PATCH] 预测累计

---
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataSampleViewRespDTO.java          |    6 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonDict.java                       |    2 +
 iailab-module-model/iailab-module-model-biz/db/mysql.sql                                                                             |    8 ++--
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dto/MmPredictItemDTO.java                  |   14 +++++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmItemOutputEntity.java             |   15 +++++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictItemEntity.java            |   15 -------
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java |   21 +++++++++-
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java              |   19 +++++++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java                                |    9 ++++
 9 files changed, 88 insertions(+), 21 deletions(-)

diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataSampleViewRespDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataSampleViewRespDTO.java
index f720ae8..b6d4d93 100644
--- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataSampleViewRespDTO.java
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataSampleViewRespDTO.java
@@ -21,4 +21,10 @@
 
     @Schema(description = "T+N预测值,N表示预测频率")
     private List<Object[]> preDataN;
+
+    @Schema(description = "累计真实值")
+    private List<Object[]> cumulantRealData;
+
+    @Schema(description = "累计预测值")
+    private List<Object[]> cumulantPreData;
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/db/mysql.sql b/iailab-module-model/iailab-module-model-biz/db/mysql.sql
index 5a746f6..417acc3 100644
--- a/iailab-module-model/iailab-module-model-biz/db/mysql.sql
+++ b/iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -144,7 +144,7 @@
 create table t_mm_item_result_json
 (
     id          varchar(36) not null,
-    outputid    varchar(36),
+    outputid    varchar(50),
     predicttime datetime,
     jsonvalue   text,
     cumulant    varchar(36),
@@ -898,6 +898,6 @@
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电价时段配置数据';
 
 
-alter table t_mm_predict_item add column `iscumulant` tinyint default false COMMENT '是否累计';
-alter table t_mm_predict_item add column `cumuldivisor`  int default 60 COMMENT '累计除数';
-alter table t_mm_predict_item add column `cumulpoint` varchar(36) DEFAULT NULL, COMMENT '累计测点';
\ No newline at end of file
+alter table t_mm_item_output add column `iscumulant` tinyint default false COMMENT '是否累计';
+alter table t_mm_item_output add column `cumuldivisor` int DEFAULT NULL COMMENT '累计除数';
+alter table t_mm_item_output add column `cumulpoint` varchar(36) DEFAULT NULL, COMMENT '累计测点';
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
index 2750fc1..1687d46 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -13,6 +13,7 @@
 import com.iailab.module.model.api.mcs.McsApi;
 import com.iailab.module.model.api.mcs.dto.*;
 import com.iailab.module.model.api.mdk.dto.StScheduleRecordVO;
+import com.iailab.module.model.common.enums.CommonDict;
 import com.iailab.module.model.common.enums.DataTypeEnum;
 import com.iailab.module.model.common.enums.PreLineTypeEnum;
 import com.iailab.module.model.enums.CommonConstant;
@@ -315,6 +316,14 @@
                 viewDto.setRealData(getHisData(out.getPointid(), startTime, endTime));
             }
             viewDto.setPreDataN(mmItemResultService.getData(out.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
+            //处理累计点
+            if (out.getIscumulant() == 1) {
+                if (StringUtils.isNotBlank(out.getCumulpoint())) {
+                    viewDto.setCumulantRealData(getHisData(out.getPointid() + CommonDict.CUMULANT_SUFFIX, startTime, endTime));
+                }
+                viewDto.setCumulantPreData(mmItemResultService.getData(out.getId() + CommonDict.CUMULANT_SUFFIX, startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
+            }
+
             viewMap.put(out.getResultName(), viewDto);
         }
         result.setStartTime(startTime);
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonDict.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonDict.java
index a97c749..cf021a5 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonDict.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonDict.java
@@ -10,4 +10,6 @@
     public static final Integer ONE = 1;
 
     public static final Integer TOW = 2;
+
+    public static final String CUMULANT_SUFFIX = "_cumulant";
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dto/MmPredictItemDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dto/MmPredictItemDTO.java
index 6c5a6d0..cb68fe5 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dto/MmPredictItemDTO.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dto/MmPredictItemDTO.java
@@ -35,4 +35,18 @@
      * 计算预测项真实数据点
      */
     private String pointId;
+    /**
+     * 计算预测项是否累计
+     */
+    private Integer iscumulant;
+
+    /**
+     * 计算预测项累计除数
+     */
+    private Integer cumuldivisor;
+
+    /**
+     * 计算预测项累计测点
+     */
+    private String cumulpoint;
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmItemOutputEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmItemOutputEntity.java
index 6360278..0562fcd 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmItemOutputEntity.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmItemOutputEntity.java
@@ -72,4 +72,19 @@
      * 结果名称
      */
     private String resultName;
+
+    /**
+     * 是否累计
+     */
+    private Integer iscumulant;
+
+    /**
+     * 累计除数
+     */
+    private Integer cumuldivisor;
+
+    /**
+     * 累计测点
+     */
+    private String cumulpoint;
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictItemEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictItemEntity.java
index 66e0622..6f54674 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictItemEntity.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictItemEntity.java
@@ -96,19 +96,4 @@
      * 保留的预测点位 (T+2 则n=2, T+30则n=30, T+n则表示从最后点位开始,n=预测长度;n由系统配置得出)
      */
     private String saveindex;
-
-    /**
-     * 是否累计
-     */
-    private Integer iscumulant;
-
-    /**
-     * 累计除数
-     */
-    private Integer cumuldivisor;
-
-    /**
-     * 累计测点
-     */
-    private String cumulpoint;
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java
index 3d1bc60..5dd3eb6 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java
@@ -152,6 +152,10 @@
             entity.setPointid(mmPredictItemDto.getPointId());
             entity.setResultName(mmPredictItemDto.getMmPredictItem().getItemname());
             entity.setResultstr("result");
+            //累计配置
+            entity.setIscumulant(mmPredictItemDto.getIscumulant());
+            entity.setCumuldivisor(mmPredictItemDto.getCumuldivisor());
+            entity.setCumulpoint(mmPredictItemDto.getCumulpoint());
             mergeItemOutput.add(entity);
             mmPredictItemDto.setMmItemOutputList(mergeItemOutput);
         }
@@ -175,7 +179,6 @@
     @Override
     public void update(MmPredictItemDTO mmPredictItemDto) {
         MmPredictItemEntity predictItem = mmPredictItemDto.getMmPredictItem();
-        predictItem.setCumulpoint(predictItem.getCumulpoint() == null? "" : predictItem.getCumulpoint());
         predictItem.setUpdateTime(new Date());
         mmPredictItemDao.updateById(predictItem);
         MmItemTypeEntity itemType = mmItemTypeImpl.getById(predictItem.getItemtypeid());
@@ -205,10 +208,20 @@
                 entity.setPointid(mmPredictItemDto.getPointId());
                 entity.setResultName(mmPredictItemDto.getMmPredictItem().getItemname());
                 entity.setResultstr("result");
+                //累计配置
+                entity.setIscumulant(mmPredictItemDto.getIscumulant());
+                entity.setCumuldivisor(mmPredictItemDto.getCumuldivisor());
+                entity.setCumulpoint(mmPredictItemDto.getCumulpoint());
                 mmItemOutputList.add(entity);
                 mmPredictItemDto.setMmItemOutputList(mmItemOutputList);
             } else {
-                mmPredictItemDto.getMmItemOutputList().forEach(e -> e.setPointid(mmPredictItemDto.getPointId()));
+                mmPredictItemDto.getMmItemOutputList().forEach(entity -> {
+                    entity.setPointid(mmPredictItemDto.getPointId());
+                    //累计配置
+                    entity.setIscumulant(mmPredictItemDto.getIscumulant());
+                    entity.setCumuldivisor(mmPredictItemDto.getCumuldivisor());
+                    entity.setCumulpoint(mmPredictItemDto.getCumulpoint());
+                });
             }
         }
         DmModuleItemEntity dmModuleItem = mmPredictItemDto.getDmModuleItem();
@@ -267,6 +280,10 @@
             mmPredictItemDto.setMmPredictMergeItem(mmPredictMergeItemService.getByItemid(id));
             if (!CollectionUtils.isEmpty(mmPredictItemDto.getMmItemOutputList())) {
                 mmPredictItemDto.setPointId(mmPredictItemDto.getMmItemOutputList().get(0).getPointid());
+                //累计配置
+                mmPredictItemDto.setIscumulant(mmPredictItemDto.getMmItemOutputList().get(0).getIscumulant());
+                mmPredictItemDto.setCumuldivisor(mmPredictItemDto.getMmItemOutputList().get(0).getCumuldivisor());
+                mmPredictItemDto.setCumulpoint(mmPredictItemDto.getMmItemOutputList().get(0).getCumulpoint());
             }
         }
         return mmPredictItemDto;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java
index 67ce702..89c3866 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java
@@ -1,6 +1,7 @@
 package com.iailab.module.model.mdk.predict;
 
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.iailab.module.model.common.enums.CommonDict;
 import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
 import com.iailab.module.model.mcs.pre.service.MmItemResultService;
 import com.iailab.module.model.mdk.factory.ItemEntityFactory;
@@ -11,6 +12,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.util.*;
 
 @Service
@@ -52,6 +54,23 @@
             }
             resultMap.put(entry.getKey().getId(), predictDataList);
             predictLists.put(entry.getKey().getResultstr(), predictDataList);
+
+            //处理累计计算
+            if (entry.getKey().getIscumulant() == 1) {
+                resultMap.put(entry.getKey().getId() + CommonDict.CUMULANT_SUFFIX, new ArrayList<DataValueVO>(){{
+                    DataValueVO predictData = new DataValueVO();
+                    // 时间 预测时间+预测长度*粒度
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(predictResult.getPredictTime());
+                    calendar.add(Calendar.SECOND, predictResult.getGranularity() * (rows - 1));
+                    predictData.setDataTime(calendar.getTime());
+                    //值 所有值相加/除数
+                    BigDecimal sum = BigDecimal.valueOf(Arrays.stream(entry.getValue()).sum());
+                    BigDecimal divisor = BigDecimal.valueOf(entry.getKey().getCumuldivisor());
+                    predictData.setDataValue(sum.divide(divisor, 2, BigDecimal.ROUND_HALF_UP).doubleValue());
+                    add(predictData);
+                }});
+            }
         }
         predictResult.setPredictLists(predictLists);
         return resultMap;

--
Gitblit v1.9.3