From 9881ce0814ad642646d9b76ad2caa70a0b966036 Mon Sep 17 00:00:00 2001
From: 潘志宝 <979469083@qq.com>
Date: 星期一, 26 五月 2025 16:15:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetPageReqVO.java                 |   21 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfDetServiceImpl.java     |   50 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfMainController.java |   71 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfMainDao.java                     |    9 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordResVO.java                     |    3 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java                                  |   14 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java     |   43 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StScheduleSuggestController.java         |   19 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java            |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordChartReqVO.java                 |   30 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java      |   39 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetRespVO.java                    |   49 ++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java                          |    5 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfDetController.java  |   68 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StScheduleSuggestPageReqVO.java                        |    3 
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/SuggestOperationRecordReqVO.java                       |    3 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotRecordController.java   |   40 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ExtremalHandle.java                          |   12 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java                         |    8 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java                             |    1 
 iailab-plat-sdk/src/main/java/com/iailab/sdk/util/http/IailabHttpUtils.java                                                                          |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfDetDao.java                      |    8 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java                                                |    5 
 iailab-module-model/iailab-module-model-biz/db/增量SQL/2025.sql                                                                                        |    7 
 iailab-cloud/iailab-gateway/src/main/resources/application.yaml                                                                                      |    7 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfMainService.java             |   16 
 iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml                                                                       |    3 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java               |   10 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordRespVO.java                     |   50 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainRespVO.java                   |   32 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordPageReqVO.java                 |    3 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestOperationRecordEntity.java                |    5 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/common/PointCumulateUnitEnum.java                               |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainSaveReqVO.java                |   32 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfDetService.java              |   16 
 iailab-module-model/iailab-module-model-biz/db/mysql.sql                                                                                             |    6 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java                           |  106 ++--
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainPageReqVO.java                |   30 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordSaveReqVO.java                  |   54 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotRecordDao.java                       |    7 
 iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml                                                             |    1 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetReqVO.java                     |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotRecordEntity.java                 |    5 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java                          |   12 
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/MenuServiceImpl.java                         |    5 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotConfDetEntity.java                |    5 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordReqVO.java                     |    6 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java     |  312 +++++++------
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetSaveReqVO.java                 |   49 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/ScheduleSuggestStatusEnum.java                        |    3 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java              |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfMainServiceImpl.java    |   46 ++
 52 files changed, 1,093 insertions(+), 248 deletions(-)

diff --git a/iailab-cloud/iailab-gateway/src/main/resources/application.yaml b/iailab-cloud/iailab-gateway/src/main/resources/application.yaml
index 02f0004..30d1831 100644
--- a/iailab-cloud/iailab-gateway/src/main/resources/application.yaml
+++ b/iailab-cloud/iailab-gateway/src/main/resources/application.yaml
@@ -115,6 +115,13 @@
             - Path=/admin-api/model/**
           filters:
             - RewritePath=/admin-api/model/v3/api-docs, /v3/api-docs
+        ## ai-server 服务
+        - id: ai-admin-api # 路由的编号
+          uri: grayLb://ai-server
+          predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+            - Path=/admin-api/ai/**
+          filters:
+            - RewritePath=/admin-api/ai/v3/api-docs, /v3/api-docs # 配置,保证转发到 /v3/api-docs
         ## fast 服务
         - id: fast-admin-api # 路由的编号
           uri: grayLb://fast-server
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
index c9520d8..7859366 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
@@ -76,7 +76,7 @@
 
     public static final String PV = "point_value:";
 
-    public static final long offset = 60 * 2L;
+    public static final long offset = 3L;
 
     /**
      * 采集
@@ -100,17 +100,17 @@
             List<DaPointDTO> pointMeasureList = daPointService.getMeasurePoint(minfreq);
             pointValues.addAll(measureHandle.handle(collectTime, pointMeasureList, dataMap, listGood, listBad));
 
-            log.info("读取计算点");
-            List<DaPointDTO> pointCalculateList = daPointService.getMathPoint(minfreq);
-            pointValues.addAll(calculateHandle.handle(collectTime, pointCalculateList, dataMap, listGood, listBad));
-
             log.info("读取累计点");
             List<DaPointDTO> pointCumulateList = daPointService.getCumulatePoint(minfreq);
-            pointValues.addAll(cumulateHandle.handle(collectTime, pointCumulateList, listGood, listBad));
+            pointValues.addAll(cumulateHandle.handle(collectTime, pointCumulateList, dataMap, listGood, listBad));
 
             log.info("读取极值点");
             List<DaPointDTO> pointExtremalList = daPointService.getExtremalPoint(minfreq);
-            pointValues.addAll(extremalHandle.handle(collectTime, pointExtremalList, listGood, listBad));
+            pointValues.addAll(extremalHandle.handle(collectTime, pointExtremalList, dataMap, listGood, listBad));
+
+            log.info("读取计算点");
+            List<DaPointDTO> pointCalculateList = daPointService.getMathPoint(minfreq);
+            pointValues.addAll(calculateHandle.handle(collectTime, pointCalculateList, dataMap, listGood, listBad));
 
             log.info("存入时序库");
             log.info("pointValueTimestamp=" + (pointValues.get(0) == null ? 0 : pointValues.get(0).getTimestamp().getNano()));
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
index 6073712..cdca696 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
@@ -47,6 +47,12 @@
     private ConstantHandle constantHandle;
 
     @Resource
+    private CumulateHandle cumulateHandle;
+
+    @Resource
+    private ExtremalHandle extremalHandle;
+
+    @Resource
     private JavaScriptHandler javaScriptHandler;
 
     @Autowired
@@ -171,6 +177,8 @@
             pointNos.add(s);
             dataMap.putAll(measureHandle.getCurrent(pointNos));
             dataMap.putAll(constantHandle.getCurrent(pointNos));
+            dataMap.putAll(cumulateHandle.getCurrent(pointNos));
+            dataMap.putAll(extremalHandle.getCurrent(pointNos));
             if (dataMap.get(s) == null) {
                 log.info("计算点数据异常");
                 log.info("pointNo=" + dto.getPointNo() + ";dataMap.key=" + s);
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java
index 28f2758..e15be10 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java
@@ -10,6 +10,7 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.util.*;
 
 /**
@@ -33,9 +34,13 @@
             return result;
         }
         dtos.forEach(dto -> {
-            InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto);
+            BigDecimal defaultValue = dto.getDefaultValue();
+            BigDecimal coefficient = dto.getUnittransfactor() == null ? BigDecimal.ONE : dto.getUnittransfactor();
+            defaultValue = defaultValue.multiply(coefficient);
+            InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto,defaultValue);
             pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid())));
-            dataMap.put(dto.getPointNo(), dto.getDefaultValue());
+
+            dataMap.put(dto.getPointNo(), defaultValue);
             result.add(pojo);
             listGood.add(dto.getPointNo());
         });
@@ -49,7 +54,8 @@
         List<DaPointDTO> pointConstantList = daPointService.getConstantPoint(pointNos);
         if (!CollectionUtils.isEmpty(pointConstantList)) {
             pointConstantList.forEach(item -> {
-                data.put(item.getPointNo(), item.getDefaultValue());
+                BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor();
+                data.put(item.getPointNo(), item.getDefaultValue().multiply(coefficient));
             });
         }
         return data;
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java
index 69421be..c0e8f0e 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java
@@ -45,7 +45,7 @@
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
-    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, List<String> listGood, List<String> listBad) {
+    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap, List<String> listGood, List<String> listBad) {
         List<InfluxPointValuePOJO> result = new ArrayList<>();
         try {
             log.info("累计点处理开始");
@@ -59,6 +59,7 @@
                     BigDecimal calValue = new BigDecimal(rawValue.toString()).multiply(coefficient);
                     InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, calValue);
                     pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid())));
+                    dataMap.put(dto.getPointNo(), calValue);
                     result.add(pojo);
                 } catch (Exception ex) {
                     ex.printStackTrace();
@@ -163,7 +164,7 @@
         long start = startTime.getTime();
         long end = endTime.getTime();
         long oneMin = 1000L * DataPointFreqEnum.getEumByCode(minfreqid).getValue();
-        long mins = (end - start) / oneMin;
+        long mins = ((end - start) / oneMin) + 1;
 
         //找出缺少项
         Map<Long, Double> sourceDataMap = new HashMap<>(dataList.size());
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ExtremalHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ExtremalHandle.java
index 5e9b273..2f07689 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ExtremalHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ExtremalHandle.java
@@ -20,6 +20,7 @@
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.*;
 
 /**
@@ -43,7 +44,7 @@
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
-    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, List<String> listGood, List<String> listBad) {
+    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap, List<String> listGood, List<String> listBad) {
         List<InfluxPointValuePOJO> result = new ArrayList<>();
         try {
             log.info("极值点处理开始");
@@ -52,9 +53,12 @@
             }
             dtos.forEach(dto -> {
                 try {
-                    Object value = singleCompute(dto, collectTime, listGood, listBad);
-                    InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, value);
+                    Object rawValue = singleCompute(dto, collectTime, listGood, listBad);
+                    BigDecimal coefficient = dto.getUnittransfactor() == null ? BigDecimal.ONE : dto.getUnittransfactor();
+                    BigDecimal calValue = new BigDecimal(rawValue.toString()).multiply(coefficient);
+                    InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, calValue);
                     pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid())));
+                    dataMap.put(dto.getPointNo(), calValue);
                     result.add(pojo);
                 } catch (Exception ex) {
                     ex.printStackTrace();
@@ -83,6 +87,8 @@
                 value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
             } else {
                 value = singleCompute(item, calendar.getTime(), new ArrayList<>(), new ArrayList<>());
+                BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor();
+                value = new BigDecimal(value.toString()).multiply(coefficient);
             }
             data.put(item.getPointNo(), value);
         });
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
index 8a9f766..2bed5dc 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
@@ -224,61 +224,61 @@
     public Map<String, Object> getCurrent(List<String> pointNos) {
         Map<String, Object> data = new HashMap<>();
         List<DaPointDTO> pointMeasureList = daPointService.getMeasurePoint(pointNos);
-        pointMeasureList.forEach(
-                item -> {
-                    try {
-                        Object value = CommonConstant.BAD_VALUE;
-                        boolean hasKey = redisTemplate.hasKey(PointCollector.PV + item.getPointNo());
-                        if (hasKey) {
-                            value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
-                        }
-                        if(hasKey && StrUtils.isNumeric(value.toString()) &&
-                                new BigDecimal(value.toString()).compareTo(CommonConstant.BAD_VALUE) != 0 ) {
-                            value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
-                        } else if (DataSourceType.OPCUA.getCode().equals(item.getSourceType())) {
-                            value = opcUaCollector.getTagValue(item.getSourceId(), item.getTagNo());
-                        } else if (DataSourceType.ModBus.getCode().equals(item.getSourceType())) {
-                            value = modBusCollector.getTagValue(item.getSourceId(), item.getTagNo());
-                        } else if (DataSourceType.KIO.getCode().equals(item.getSourceType())) {
-                            value = kingIOCollector.getTagValue(item.getSourceId(), item.getTagNo());
-                        } else if (DataSourceType.HTTP.getCode().equals(item.getSourceType())) {
-                            if (SourceApiEnum.iHyperDB.getCode().equals(item.getSourceName())) {
-                                value = httpCollectorForIhd.getTagValue(item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType());
-                            } else if (SourceApiEnum.ASDB.getCode().equals(item.getSourceName())) {
-                                value = httpCollectorForAsdb.getTagValue(item.getSourceId(), item.getTagNo());
-                            } else if (SourceApiEnum.ASDE.getCode().equals(item.getSourceName())) {
-                                value = httpCollectorForAsde.getTagValue(item.getSourceId(), item.getTagNo());
-                            } else if (SourceApiEnum.ASDC.getCode().equals(item.getSourceName())) {
-                                value = httpCollectorForAsdc.getTagValue(item.getSourceId(), item.getTagNo());
-                            } else if (SourceApiEnum.ASDY.getCode().equals(item.getSourceName())) {
-                                value = httpCollectorForAsdy.getTagValue(item.getSourceId(), item.getTagNo());
-                            }
-                        } else {
-                            log.info("没有匹配的TagNo=" + item.getTagNo());
-                        }
-                        log.info("TagNo=" + item.getTagNo() + ",value=" + value.toString());
-                        if (!PointDataTypeEnum.BOOLEAN.getCode().equals(item.getDataType())) {
-                            BigDecimal decValue =  new BigDecimal(value.toString());
-                            if (PointDataTypeEnum.FLOAT.getCode().equals(item.getDataType())) {
-                                decValue = decValue.setScale(2, BigDecimal.ROUND_HALF_UP);
-                            } else if (PointDataTypeEnum.INT.getCode().equals(item.getDataType())) {
-                                decValue = decValue.setScale(0, BigDecimal.ROUND_HALF_UP);
-                            }
-                            data.put(item.getPointNo(), decValue);
-                        } else {
-                            data.put(item.getPointNo(), value);
-                        }
-
-                        if (!hasKey) {
-                            // 存入缓存
-                            toRedis(value, item);
-                        }
-                    } catch (Exception ex) {
-                        ex.printStackTrace();
+        for (DaPointDTO item : pointMeasureList) {
+            try {
+                Object value = CommonConstant.BAD_VALUE;
+                boolean hasKey = redisTemplate.hasKey(PointCollector.PV + item.getPointNo());
+                if (hasKey && !StrUtils.isNumeric(value.toString())) {
+                    value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
+                    data.put(item.getPointNo(), value);
+                    continue;
+                } else if(hasKey && StrUtils.isNumeric(value.toString()) && new BigDecimal(value.toString()).compareTo(CommonConstant.BAD_VALUE) != 0 ) {
+                    value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
+                    data.put(item.getPointNo(), value);
+                    continue;
+                } else if (DataSourceType.OPCUA.getCode().equals(item.getSourceType())) {
+                    value = opcUaCollector.getTagValue(item.getSourceId(), item.getTagNo());
+                } else if (DataSourceType.ModBus.getCode().equals(item.getSourceType())) {
+                    value = modBusCollector.getTagValue(item.getSourceId(), item.getTagNo());
+                } else if (DataSourceType.KIO.getCode().equals(item.getSourceType())) {
+                    value = kingIOCollector.getTagValue(item.getSourceId(), item.getTagNo());
+                } else if (DataSourceType.HTTP.getCode().equals(item.getSourceType())) {
+                    if (SourceApiEnum.iHyperDB.getCode().equals(item.getSourceName())) {
+                        value = httpCollectorForIhd.getTagValue(item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType());
+                    } else if (SourceApiEnum.ASDB.getCode().equals(item.getSourceName())) {
+                        value = httpCollectorForAsdb.getTagValue(item.getSourceId(), item.getTagNo());
+                    } else if (SourceApiEnum.ASDE.getCode().equals(item.getSourceName())) {
+                        value = httpCollectorForAsde.getTagValue(item.getSourceId(), item.getTagNo());
+                    } else if (SourceApiEnum.ASDC.getCode().equals(item.getSourceName())) {
+                        value = httpCollectorForAsdc.getTagValue(item.getSourceId(), item.getTagNo());
+                    } else if (SourceApiEnum.ASDY.getCode().equals(item.getSourceName())) {
+                        value = httpCollectorForAsdy.getTagValue(item.getSourceId(), item.getTagNo());
                     }
-
+                } else {
+                    log.info("没有匹配的TagNo=" + item.getTagNo());
                 }
-        );
+                log.info("TagNo=" + item.getTagNo() + ",value=" + value.toString());
+                if (!PointDataTypeEnum.BOOLEAN.getCode().equals(item.getDataType())) {
+                    BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor();
+                    BigDecimal decValue =  new BigDecimal(value.toString()).multiply(coefficient);
+                    if (PointDataTypeEnum.FLOAT.getCode().equals(item.getDataType())) {
+                        decValue = decValue.setScale(2, BigDecimal.ROUND_HALF_UP);
+                    } else if (PointDataTypeEnum.INT.getCode().equals(item.getDataType())) {
+                        decValue = decValue.setScale(0, BigDecimal.ROUND_HALF_UP);
+                    }
+                    data.put(item.getPointNo(), decValue);
+                } else {
+                    data.put(item.getPointNo(), value);
+                }
+
+                if (!hasKey) {
+                    // 存入缓存
+                    toRedis(value, item);
+                }
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
         return data;
     }
 
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/common/PointCumulateUnitEnum.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/common/PointCumulateUnitEnum.java
index 2e85b7e..d8353c8 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/common/PointCumulateUnitEnum.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/common/PointCumulateUnitEnum.java
@@ -67,7 +67,7 @@
             }
         }
 
-        Calendar startCal = unit.calculate(endTime, length);
+        Calendar startCal = unit.calculate(endTime, length-1);
         return startCal.getTime();
     }
 }
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml b/iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml
index a77a0bd..bd170f0 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml
+++ b/iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml
@@ -161,6 +161,7 @@
         t1.point_type,
         t1.store_type,
         t1.data_type,
+        t1.unittransfactor,
         t1.minfreqid
         FROM t_da_point t1
         <where>
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/SuggestOperationRecordReqVO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/SuggestOperationRecordReqVO.java
index 6624e3d..8d63a38 100644
--- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/SuggestOperationRecordReqVO.java
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/SuggestOperationRecordReqVO.java
@@ -16,6 +16,9 @@
     @Schema(description = "操作(已采纳,取消采纳,已忽略等)")
     private String operate;
 
+    @Schema(description = "原因")
+    private String reason;
+
     @Schema(description = "处理人ID")
     private String handlerId;
 
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 78d6434..4a049ab 100644
--- a/iailab-module-model/iailab-module-model-biz/db/mysql.sql
+++ b/iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -1028,11 +1028,9 @@
                                                    `adjust_value_rule` varchar(36) DEFAULT NULL COMMENT '调整值计算规则',
                                                    `is_enable` tinyint DEFAULT NULL COMMENT '是否启用(0禁用 1启用)',
                                                    `create_time` datetime DEFAULT NULL,
-                                                   PRIMARY KEY (`id`),
-                                                   UNIQUE KEY `config_code` (`config_code`)
+                                                   `adjust_coefficient` decimal(10,6) DEFAULT '1.000000' COMMENT '调整系数',
+                                                   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='预测结果自动调整配置表';
-
-alter table t_mm_predict_auto_adjust_config add column `adjust_coefficient` decimal(10,6) DEFAULT 1 COMMENT '调整系数';
 
 -- 预测项影响因素
 
diff --git "a/iailab-module-model/iailab-module-model-biz/db/\345\242\236\351\207\217SQL/2025.sql" "b/iailab-module-model/iailab-module-model-biz/db/\345\242\236\351\207\217SQL/2025.sql"
index e10818d..1f61836 100644
--- "a/iailab-module-model/iailab-module-model-biz/db/\345\242\236\351\207\217SQL/2025.sql"
+++ "b/iailab-module-model/iailab-module-model-biz/db/\345\242\236\351\207\217SQL/2025.sql"
@@ -40,7 +40,7 @@
 CREATE TABLE `t_st_suggest_snapshot_conf_det`
 (
     `id`           varchar(36) NOT NULL,
-    `conf_id`      varchar(36) COMMENT '模型ID',
+    `conf_id`      varchar(36) COMMENT '快照配置ID',
     `data_type`    varchar(20) DEFAULT NULL COMMENT '数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)',
     `data_no`      varchar(36) COMMENT '数据编号',
     `data_name`    varchar(36) COMMENT '数据名称',
@@ -72,4 +72,7 @@
     `sort`          integer COMMENT '排序',
     PRIMARY KEY (`id`) USING BTREE,
     KEY             `idx_suggest_id` (`suggest_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='调度建议快照记录表';
\ No newline at end of file
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='调度建议快照记录表';
+
+ALTER TABLE `iailab_expert_tenant_shasteel`.`t_st_suggest_operation_record`
+    ADD COLUMN `reason` varchar(255) NULL COMMENT '原因' AFTER `operate`;
\ 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 88fb800..f541366 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
@@ -34,8 +34,8 @@
 import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity;
 import com.iailab.module.model.mcs.sche.service.*;
 import com.iailab.module.model.mcs.sche.vo.StScheduleRecordRespVO;
-import com.iailab.module.model.mcs.sche.vo.StSuggestOperationRecordReqVO;
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestSaveReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestOperationRecordReqVO;
 import com.iailab.module.model.mdk.vo.ItemVO;
 import com.iailab.module.model.mpk.service.ChartParamService;
 import com.iailab.module.model.mpk.service.ChartService;
@@ -1012,7 +1012,9 @@
     @Override
     public Boolean saveSuggestOperationRecord(SuggestOperationRecordReqVO reqVO) {
         StSuggestOperationRecordReqVO operationRecordVo = new StSuggestOperationRecordReqVO();
+        operationRecordVo.setSuggestId(reqVO.getId());
         operationRecordVo.setOperate(reqVO.getOperate());
+        operationRecordVo.setReason(reqVO.getReason());
         operationRecordVo.setHandler(reqVO.getHandler());
         operationRecordVo.setHandlerId(reqVO.getHandlerId());
         //获取建议信息
@@ -1034,7 +1036,6 @@
         stSuggestOperationRecordService.create(operationRecordVo);
         return true;
     }
-
     private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) {
         Date[] result = new Date[3];
         Date predictTime = predictItem.getLastTime();
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/ScheduleSuggestStatusEnum.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/ScheduleSuggestStatusEnum.java
index caadc08..65a871f 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/ScheduleSuggestStatusEnum.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/ScheduleSuggestStatusEnum.java
@@ -15,7 +15,8 @@
 public enum ScheduleSuggestStatusEnum {
 
     S0(0, "未处理"),
-    S1(1, "已采纳");
+    S1(1, "已采纳"),
+    S2(2, "已忽略");
 
     private Integer code;
     private String desc;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java
index b77d6e2..6f4347a 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java
@@ -20,7 +20,7 @@
 
     MmPredictAutoAdjustConfigEntity getInfo(String id);
 
-    MmPredictAutoAdjustConfigEntity getByCode(String code);
+    List<MmPredictAutoAdjustConfigEntity> getByCode(String code);
 
     void create(MmPredictAutoAdjustConfigEntity entity);
 
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
index 3c281d2..9cda6d2 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
@@ -60,8 +60,8 @@
     }
 
     @Override
-    public MmPredictAutoAdjustConfigEntity getByCode(String code) {
-        return baseDao.selectOne("config_code",code,"is_enable",1);
+    public List<MmPredictAutoAdjustConfigEntity> getByCode(String code) {
+        return baseDao.selectList(MmPredictAutoAdjustConfigEntity::getConfigCode,code,MmPredictAutoAdjustConfigEntity::getIsEnable,1);
     }
 
     @Override
@@ -85,164 +85,180 @@
     public boolean autoAdjustByCode(String configCode,long adjustStartTime) {
         log.info("开始自动调整:configCode:" + configCode + ",adjustStartTime:" + new Date(adjustStartTime));
         // 查询调整配置
-        MmPredictAutoAdjustConfigEntity configEntity = getByCode(configCode);
-        if (configEntity == null) {
-            log.info("自动调整失败原因:configEntity为null");
+        List<MmPredictAutoAdjustConfigEntity> configEntityList = getByCode(configCode);
+        if (CollectionUtils.isEmpty(configEntityList)) {
+            log.info("自动调整失败原因:configEntityList为空");
             return false;
         }
 
+        // 根据outputId分组
+        Map<String, List<MmPredictAutoAdjustConfigEntity>> outputIdMap = configEntityList.stream().collect(Collectors.groupingBy(MmPredictAutoAdjustConfigEntity::getOutputId));
+        for (Map.Entry<String, List<MmPredictAutoAdjustConfigEntity>> entry : outputIdMap.entrySet()) {
+            String outputId = entry.getKey();
+            // 查询调整用户adjustStartTime 至 adjustStartTime - 预测长度 * 预测粒度 范围的值
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis(adjustStartTime);
+            Date endTime = calendar.getTime();
+            ItemVO item = mmPredictItemService.getItemByOutPutId(outputId);
+            if (item == null) {
+                log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + outputId);
+                continue;
+            }
+            calendar.add(Calendar.SECOND,item.getPredictLength() * item.getGranularity() * -1);
+            Date startTime = calendar.getTime();
 
-        // 查询调整用户adjustStartTime 至 adjustStartTime - 预测长度 * 预测粒度 范围的值
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTimeInMillis(adjustStartTime);
-        Date endTime = calendar.getTime();
-        ItemVO item = mmPredictItemService.getItemByOutPutId(configEntity.getOutputId());
-        if (item == null) {
-            log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + configEntity.getOutputId());
-            return false;
-        }
-        calendar.add(Calendar.SECOND,item.getPredictLength() * item.getGranularity() * -1);
-        Date startTime = calendar.getTime();
-        ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO();
-        ApiPointDTO pointInfo = dataPointApi.getInfoById(configEntity.getPointId());
-        queryDTO.setPointNo(pointInfo.getPointNo());
-        queryDTO.setEnd(endTime);
-        queryDTO.setStart(startTime);
-        List<ApiPointValueDTO> apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
-        if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
-            log.info("自动调整失败原因:测点数据长度为0。queryDTO:" + queryDTO);
-            return false;
-        }
-        // 过滤掉-2
-        apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> !Double.valueOf(e.getV()).equals(-2.0)).collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
-            log.info("自动调整失败原因:过滤掉-2之后测点数据长度为0。queryDTO:" + queryDTO);
-            return false;
-        }
+            // 获取预测历史结果
+            InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
+            pojo.setType(DataTypeEnum.FLOAT_LAST_BAK.getCode());
+            pojo.setOutPutId(outputId);
+            List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, new Date(adjustStartTime), new Date(adjustStartTime));
+            if (CollectionUtils.isEmpty(influxModelResult)) {
+                log.info("自动调整失败原因:预测历史结果为空。itemNo:" + item.getItemNo() + ",itemName:" + item.getItemName() + ",outputId:" + outputId + ",time:" + adjustStartTime);
+                continue;
+            }
 
-        // 获取预测历史结果
-        InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
-        pojo.setType(DataTypeEnum.FLOAT_LAST.getCode());
-        pojo.setOutPutId(configEntity.getOutputId());
-        List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, new Date(adjustStartTime), new Date(adjustStartTime));
-        if (CollectionUtils.isEmpty(influxModelResult)) {
-            log.info("自动调整失败原因:预测历史结果为空。itemNo:" + item.getItemNo() + ",itemName" + item.getItemName() + ",outputId" + configEntity.getOutputId() + ",time" + adjustStartTime);
-            return false;
-        }
-
-        // 触发规则
-        AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule());
-        Double adjustValue = null;
-        // 判断是否符合触发条件 并计算调整值
-        switch (triggerRuleEnum) {
-            case SLOPE:
-                // 计算每个△t的斜率,任意一个大于触发值则认为该区间有调整
-                Calendar slopeCalendar = Calendar.getInstance();
-                slopeCalendar.setTime(startTime);
-                Date slopeStartTime = slopeCalendar.getTime();
-                slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
-                Date slopeEndTime = slopeCalendar.getTime();
-                if (slopeEndTime.after(endTime)) {
-                    log.info("自动调整失败原因:△t设置过大,大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
-                    return false;
+            // 计算所有影响用户的最终调整值
+            Double finalAdjustValue = 0.0;
+            for (MmPredictAutoAdjustConfigEntity configEntity : entry.getValue()) {
+                Double adjustValue = null;
+                // 查询影响用户历史值
+                ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO();
+                ApiPointDTO pointInfo = dataPointApi.getInfoById(configEntity.getPointId());
+                queryDTO.setPointNo(pointInfo.getPointNo());
+                queryDTO.setEnd(endTime);
+                queryDTO.setStart(startTime);
+                List<ApiPointValueDTO> apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
+                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
+                    log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:测点数据长度为0。queryDTO:" + queryDTO);
+                    continue;
                 }
-                while (!slopeEndTime.after(endTime)) {
-                    //计算斜率
-                    //△t开始时间测点值
-                    Date finalSlopeStartTime = slopeStartTime;
-                    Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(apiPointValueDTO -> apiPointValueDTO.getT().equals(finalSlopeStartTime)).findFirst();
-                    //△t结束时间测点值
-                    Date finalSlopeEndTime = slopeEndTime;
-                    Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(finalSlopeEndTime)).findFirst();
-                    if (startOptional.isPresent() && endOptional.isPresent()) {
-                        ApiPointValueDTO startPointValue = startOptional.get();
-                        ApiPointValueDTO endPointValue = endOptional.get();
-                        // 计算斜率
-                        double slope = BigDecimal.valueOf(endPointValue.getV() - startPointValue.getV()).divide(BigDecimal.valueOf(configEntity.getT())).doubleValue();
-                        // 斜率大于等于触发值则进行调整
-                        if (Double.valueOf(Math.abs(slope)).compareTo(configEntity.getTriggerValue()) >= 0) {
-                            // 计算调整值 并跳出循环
-                            adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS);
-                            log.info("计算调整值:" + adjustValue + ",斜率:" + slope + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",slopeStartTime:" + slopeStartTime + ",slopeEndTime:" + slopeEndTime);
-                            break;
+                // 过滤掉-2
+                apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> !Double.valueOf(e.getV()).equals(-2.0)).collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
+                    log.info("影响用户调整失败原因:过滤掉-2之后测点数据长度为0。queryDTO:" + queryDTO);
+                    continue;
+                }
+
+                // 触发规则
+                AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule());
+                // 判断是否符合触发条件 并计算调整值
+                switch (triggerRuleEnum) {
+                    case SLOPE:
+                        // 计算每个△t的斜率,任意一个大于触发值则认为该区间有调整
+                        Calendar slopeCalendar = Calendar.getInstance();
+                        slopeCalendar.setTime(startTime);
+                        Date slopeStartTime = slopeCalendar.getTime();
+                        slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
+                        Date slopeEndTime = slopeCalendar.getTime();
+                        if (slopeEndTime.after(endTime)) {
+                            log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:△t设置过大,大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
+                            continue;
                         }
-                        log.info("斜率不满足条件,斜率:" + slope);
-                    }
-                    // 下一个△t
-                    slopeStartTime = slopeCalendar.getTime();
-                    slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
-                    slopeEndTime = slopeCalendar.getTime();
-                }
-                break;
-            case AVERAGE_GAP:
-                // 计算每两个△t的平均差,任意一个大于触发值则认为该区间有调整
-                Calendar averageCalendar = Calendar.getInstance();
-                averageCalendar.setTime(startTime);
-                Date averageStartTime = averageCalendar.getTime();
-                averageCalendar.add(Calendar.MINUTE,configEntity.getT());
-                Date averageMiddleTime = averageCalendar.getTime();
-                averageCalendar.add(Calendar.MINUTE,configEntity.getT());
-                Date averageEndTime = averageCalendar.getTime();
-
-                if (averageEndTime.after(endTime)) {
-                    log.info("自动调整失败原因:△t设置过大,△t*2大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
-                    return false;
-                }
-                while (!averageEndTime.after(endTime)) {
-                    //计算均值差
-                    //前△t测点平均值
-                    Date finalAverageStartTime = averageStartTime;
-                    Date finalAverageMiddleTime = averageMiddleTime;
-                    OptionalDouble startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageStartTime) && !e.getT().after(finalAverageMiddleTime)).mapToDouble(ApiPointValueDTO::getV).average();
-                    //后△t测点平均值
-                    Date finalAverageEndTime = averageEndTime;
-                    OptionalDouble endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageMiddleTime) && !e.getT().after(finalAverageEndTime)).mapToDouble(ApiPointValueDTO::getV).average();
-                    if (startAverage.isPresent() && endAverage.isPresent()) {
-                        double averageGapValue = startAverage.getAsDouble() - endAverage.getAsDouble();
-                        // 均值差,大于等于触发值则进行调整
-                        if (Double.valueOf(Math.abs(averageGapValue)).compareTo(configEntity.getTriggerValue()) >= 0) {
-                            // 计算调整值 并跳出循环
-                            adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS);
-                            log.info("计算调整值:" + adjustValue + ",均值差:" + averageGapValue + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",averageStartTime:" + averageStartTime + ",averageMiddleTime:" + averageMiddleTime + ",averageEndTime:" + averageEndTime);
-                            break;
+                        while (!slopeEndTime.after(endTime)) {
+                            //计算斜率
+                            //△t开始时间测点值
+                            Date finalSlopeStartTime = slopeStartTime;
+                            Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(apiPointValueDTO -> apiPointValueDTO.getT().equals(finalSlopeStartTime)).findFirst();
+                            //△t结束时间测点值
+                            Date finalSlopeEndTime = slopeEndTime;
+                            Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(finalSlopeEndTime)).findFirst();
+                            if (startOptional.isPresent() && endOptional.isPresent()) {
+                                ApiPointValueDTO startPointValue = startOptional.get();
+                                ApiPointValueDTO endPointValue = endOptional.get();
+                                // 计算斜率
+                                double slope = BigDecimal.valueOf(endPointValue.getV() - startPointValue.getV()).divide(BigDecimal.valueOf(configEntity.getT())).doubleValue();
+                                // 斜率大于等于触发值则进行调整
+                                if (Double.valueOf(Math.abs(slope)).compareTo(configEntity.getTriggerValue()) >= 0) {
+                                    // 计算调整值 并跳出循环
+                                    adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS);
+                                    log.info("计算调整值:" + adjustValue + ",斜率:" + slope + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",slopeStartTime:" + slopeStartTime + ",slopeEndTime:" + slopeEndTime);
+                                    break;
+                                }
+                                log.info("斜率不满足条件,斜率:" + slope);
+                            }
+                            // 下一个△t
+                            slopeStartTime = slopeCalendar.getTime();
+                            slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
+                            slopeEndTime = slopeCalendar.getTime();
                         }
-                        log.info("均值差不满足条件,均值差:" + averageGapValue);
-                    }
+                        break;
+                    case AVERAGE_GAP:
+                        // 计算每两个△t的平均差,任意一个大于触发值则认为该区间有调整
+                        Calendar averageCalendar = Calendar.getInstance();
+                        averageCalendar.setTime(startTime);
+                        Date averageStartTime = averageCalendar.getTime();
+                        averageCalendar.add(Calendar.MINUTE,configEntity.getT());
+                        Date averageMiddleTime = averageCalendar.getTime();
+                        averageCalendar.add(Calendar.MINUTE,configEntity.getT());
+                        Date averageEndTime = averageCalendar.getTime();
 
-                    // 下一个△t
-                    averageStartTime = averageMiddleTime;
-                    averageMiddleTime = averageEndTime;
-                    averageCalendar.add(Calendar.MINUTE,configEntity.getT());
-                    averageEndTime = averageCalendar.getTime();
+                        if (averageEndTime.after(endTime)) {
+                            log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:△t设置过大,△t*2大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
+                            continue;
+                        }
+                        while (!averageEndTime.after(endTime)) {
+                            //计算均值差
+                            //前△t测点平均值
+                            Date finalAverageStartTime = averageStartTime;
+                            Date finalAverageMiddleTime = averageMiddleTime;
+                            OptionalDouble startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageStartTime) && !e.getT().after(finalAverageMiddleTime)).mapToDouble(ApiPointValueDTO::getV).average();
+                            //后△t测点平均值
+                            Date finalAverageEndTime = averageEndTime;
+                            OptionalDouble endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageMiddleTime) && !e.getT().after(finalAverageEndTime)).mapToDouble(ApiPointValueDTO::getV).average();
+                            if (startAverage.isPresent() && endAverage.isPresent()) {
+                                double averageGapValue = startAverage.getAsDouble() - endAverage.getAsDouble();
+                                // 均值差,大于等于触发值则进行调整
+                                if (Double.valueOf(Math.abs(averageGapValue)).compareTo(configEntity.getTriggerValue()) >= 0) {
+                                    // 计算调整值 并跳出循环
+                                    adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS);
+                                    log.info("计算调整值:" + adjustValue + ",均值差:" + averageGapValue + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",averageStartTime:" + averageStartTime + ",averageMiddleTime:" + averageMiddleTime + ",averageEndTime:" + averageEndTime);
+                                    break;
+                                }
+                                log.info("均值差不满足条件,均值差:" + averageGapValue);
+                            }
+
+                            // 下一个△t
+                            averageStartTime = averageMiddleTime;
+                            averageMiddleTime = averageEndTime;
+                            averageCalendar.add(Calendar.MINUTE,configEntity.getT());
+                            averageEndTime = averageCalendar.getTime();
+                        }
+                        break;
+                    default:
+                        log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
+                        continue;
                 }
-                break;
-            default:
-                log.info("自动调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
-                return false;
-        }
-        if (adjustValue == null) {
-            log.info("自动调整失败原因:未达到触发条件");
-            return false;
+                if (adjustValue == null) {
+                    log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:未达到触发条件");
+                    continue;
+                }
+
+                // 调整系数
+                adjustValue = adjustValue * configEntity.getAdjustCoefficient();
+                // 调整方向
+                adjustValue = adjustValue * configEntity.getAdjustDirection();
+                // 累加到最终调整值
+                finalAdjustValue += adjustValue;
+            }
+            // 执行调整
+            if (finalAdjustValue.equals(0.0)) {
+                log.info("自动调整失败原因:finalAdjustValue为0,outputId:" + outputId + ",configCode:" + configCode);
+                continue;
+            }
+            List<InfluxModelResultPOJO> lastList = new ArrayList<>();
+            for (InfluxModelResultVO resultVO : influxModelResult) {
+                InfluxModelResultLastSimPOJO adjustPojo = new InfluxModelResultLastSimPOJO();
+                // 设置新的调整值
+                adjustPojo.setValue(Double.parseDouble(resultVO.getValue().toString()) + finalAdjustValue);
+                adjustPojo.setTimestamp(resultVO.getTimestamp());
+                adjustPojo.setOutPutId(outputId);
+                lastList.add(adjustPojo);
+            }
+            // 相同时间直接覆盖旧值
+            influxDBService.asyncWriteModelResults(lastList);
+            log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + finalAdjustValue + ",itemNo:" + item.getItemNo() + ",itemName:" + item.getItemName() + ",outputId:" + outputId + ",adjustTime:" + adjustStartTime);
         }
 
-        // 调整系数
-        adjustValue = adjustValue * configEntity.getAdjustCoefficient();
-        // 调整方向
-        adjustValue = adjustValue * configEntity.getAdjustDirection();
-
-
-        List<InfluxModelResultPOJO> lastList = new ArrayList<>();
-        for (InfluxModelResultVO resultVO : influxModelResult) {
-            InfluxModelResultLastSimPOJO adjustPojo = new InfluxModelResultLastSimPOJO();
-            // 设置新的调整值
-            adjustPojo.setValue(Double.parseDouble(resultVO.getValue().toString()) + adjustValue);
-            adjustPojo.setTimestamp(resultVO.getTimestamp());
-            adjustPojo.setOutPutId(configEntity.getOutputId());
-            lastList.add(adjustPojo);
-        }
-        // 相同时间直接覆盖旧值
-        influxDBService.asyncWriteModelResults(lastList);
-        log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + adjustValue + ",itemNo:" + item.getItemNo() + ",itemName" + item.getItemName() + ",outputId" + configEntity.getOutputId() + ",adjustTime:" + adjustStartTime);
         return true;
     }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StScheduleSuggestController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StScheduleSuggestController.java
index b28432f..efa03f5 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StScheduleSuggestController.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StScheduleSuggestController.java
@@ -1,22 +1,25 @@
 package com.iailab.module.model.mcs.sche.controller.admin;
 
 import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.util.object.BeanUtils;
 import com.iailab.module.model.mcs.pre.service.DmModuleItemService;
 import com.iailab.module.model.mcs.pre.service.DmModuleService;
 import com.iailab.module.model.mcs.pre.service.MmItemOutputService;
+import com.iailab.module.model.mcs.sche.entity.StScheduleSchemeEntity;
 import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity;
 import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService;
+import com.iailab.module.model.mcs.sche.vo.StScheduleSchemePageReqVO;
+import com.iailab.module.model.mcs.sche.vo.StScheduleSchemeRespVO;
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestPageReqVO;
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestRespVO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.util.List;
 
 import static com.iailab.framework.common.pojo.CommonResult.success;
@@ -52,4 +55,12 @@
         List<StScheduleSuggestEntity> list = stScheduleSuggestService.getList(moduleList, pageVO.getPredictTime());
         return success(BeanUtils.toBean(list, StScheduleSuggestRespVO.class));
     }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得调度建议分页")
+    @PreAuthorize("@ss.hasPermission('sche:suggest:query')")
+    public CommonResult<PageResult<StScheduleSuggestRespVO>> getPage(@Valid StScheduleSuggestPageReqVO pageVO) {
+        PageResult<StScheduleSuggestEntity> pageResult = stScheduleSuggestService.page(pageVO);
+        return success(BeanUtils.toBean(pageResult, StScheduleSuggestRespVO.class));
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfDetController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfDetController.java
new file mode 100644
index 0000000..369ffd7
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfDetController.java
@@ -0,0 +1,68 @@
+package com.iailab.module.model.mcs.sche.controller.admin;
+
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.common.util.object.BeanUtils;
+import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity;
+import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfDetService;
+import com.iailab.module.model.mcs.sche.vo.*;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+/**
+ * @author DongYukun
+ * @Description
+ * @createTime 2025年05月23日
+ */
+@Tag(name = "调度建议快照配置详情")
+@RestController
+@RequestMapping("/model/suggest/snapshot/conf-det")
+public class StSuggestSnapshotConfDetController {
+
+    @Autowired
+    private StSuggestSnapshotConfDetService stSuggestSnapshotConfDetService;
+    
+    @GetMapping("/page")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:query')")
+    public CommonResult<PageResult<StSuggestSnapshotConfDetRespVO>> getPage(@Valid StSuggestSnapshotConfDetPageReqVO pageVO) {
+        PageResult<StSuggestSnapshotConfDetEntity> pageResult = stSuggestSnapshotConfDetService.page(pageVO);
+        return success(BeanUtils.toBean(pageResult, StSuggestSnapshotConfDetRespVO.class));
+    }
+
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:create')")
+    public CommonResult<Boolean> create(@Valid @RequestBody StSuggestSnapshotConfDetSaveReqVO createReqVO) {
+        stSuggestSnapshotConfDetService.create(createReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/update")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:update')")
+    public CommonResult<Boolean> update(@Valid @RequestBody StSuggestSnapshotConfDetSaveReqVO updateReqVO) {
+        stSuggestSnapshotConfDetService.update(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:delete')")
+    public CommonResult<Boolean> deleteTenant(@RequestParam("id") String id) {
+        stSuggestSnapshotConfDetService.delete(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:info')")
+    public CommonResult<StSuggestSnapshotConfDetRespVO> get(@RequestParam("id") String id) {
+        StSuggestSnapshotConfDetRespVO result = stSuggestSnapshotConfDetService.get(id);
+        return success(result);
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfMainController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfMainController.java
new file mode 100644
index 0000000..8e8117c
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfMainController.java
@@ -0,0 +1,71 @@
+package com.iailab.module.model.mcs.sche.controller.admin;
+
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.common.util.object.BeanUtils;
+import com.iailab.module.model.api.mcs.dto.StScheduleModelOutDTO;
+import com.iailab.module.model.mcs.sche.entity.*;
+import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService;
+import com.iailab.module.model.mcs.sche.vo.*;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+import java.util.List;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+/**
+ * @author DongYukun
+ * @Description
+ * @createTime 2025年05月23日
+ */
+@Tag(name = "调度建议快照配置主表")
+@RestController
+@RequestMapping("/model/suggest/snapshot/conf-main")
+public class StSuggestSnapshotConfMainController {
+
+    @Autowired
+    private StSuggestSnapshotConfMainService stSuggestSnapshotConfMainService;
+    
+    @GetMapping("/page")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:query')")
+    public CommonResult<PageResult<StSuggestSnapshotConfMainRespVO>> getPage(@Valid StSuggestSnapshotConfMainPageReqVO pageVO) {
+        PageResult<StSuggestSnapshotConfMainEntity> pageResult = stSuggestSnapshotConfMainService.page(pageVO);
+        return success(BeanUtils.toBean(pageResult, StSuggestSnapshotConfMainRespVO.class));
+    }
+
+    @GetMapping("/get")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:info')")
+    public CommonResult<StSuggestSnapshotConfMainRespVO> get(@RequestParam("id") String id) {
+        StSuggestSnapshotConfMainRespVO result = stSuggestSnapshotConfMainService.get(id);
+        return success(result);
+    }
+
+    @PostMapping("/create")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:create')")
+    public CommonResult<Boolean> create(@Valid @RequestBody StSuggestSnapshotConfMainSaveReqVO createReqVO) {
+        stSuggestSnapshotConfMainService.create(createReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/update")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:update')")
+    public CommonResult<Boolean> update(@Valid @RequestBody StSuggestSnapshotConfMainSaveReqVO updateReqVO) {
+        stSuggestSnapshotConfMainService.update(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @PreAuthorize("@ss.hasPermission('suggest:snapshot:delete')")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    public CommonResult<Boolean> deleteTenant(@RequestParam("id") String id) {
+        stSuggestSnapshotConfMainService.delete(id);
+        return success(true);
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotRecordController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotRecordController.java
new file mode 100644
index 0000000..b65e5d3
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotRecordController.java
@@ -0,0 +1,40 @@
+package com.iailab.module.model.mcs.sche.controller.admin;
+
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO;
+import io.swagger.v3.oas.annotations.Parameter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+public class StSuggestSnapshotRecordController {
+
+    @Autowired
+    private StSuggestSnapshotRecordService stSuggestSnapshotRecordService;
+
+    @PostMapping("/create")
+    public CommonResult<Boolean> create(@Valid @RequestBody StSuggestSnapshotRecordSaveReqVO createReqVO) {
+        stSuggestSnapshotRecordService.create(createReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/update")
+    public CommonResult<Boolean> update(@Valid @RequestBody StSuggestSnapshotRecordSaveReqVO updateReqVO) {
+        stSuggestSnapshotRecordService.update(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    public CommonResult<Boolean> deleteTenant(@RequestParam("id") String id) {
+        stSuggestSnapshotRecordService.delete(id);
+        return success(true);
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java
index e1902c9..9bf2542 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java
@@ -25,6 +25,7 @@
     default PageResult<StScheduleSuggestEntity> selectPage(StScheduleSuggestPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<StScheduleSuggestEntity>()
                 .likeIfPresent(StScheduleSuggestEntity::getTitle, reqVO.getTitle())
+                .eqIfPresent(StScheduleSuggestEntity::getModelId, reqVO.getModelId())
                 .likeIfPresent(StScheduleSuggestEntity::getScheduleObj, reqVO.getScheduleObj())
                 .orderByDesc(StScheduleSuggestEntity::getCreateTime));
     }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfDetDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfDetDao.java
index c0cd3f5..496fbdb 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfDetDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfDetDao.java
@@ -1,8 +1,11 @@
 package com.iailab.module.model.mcs.sche.dao;
 
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
+import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
@@ -11,5 +14,8 @@
 @TenantDS
 @Mapper
 public interface StSuggestSnapshotConfDetDao extends BaseMapperX<StSuggestSnapshotConfDetEntity> {
-
+    default PageResult<StSuggestSnapshotConfDetEntity> selectPage(StSuggestSnapshotConfDetPageReqVO reqVO) {
+        return selectPage(reqVO,new LambdaQueryWrapperX<StSuggestSnapshotConfDetEntity>()
+                .likeIfPresent(StSuggestSnapshotConfDetEntity::getConfId,reqVO.getConfId()));
+    }
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfMainDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfMainDao.java
index b4281c1..d31dfc6 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfMainDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfMainDao.java
@@ -1,8 +1,12 @@
 package com.iailab.module.model.mcs.sche.dao;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
+import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
@@ -11,5 +15,8 @@
 @TenantDS
 @Mapper
 public interface StSuggestSnapshotConfMainDao extends BaseMapperX<StSuggestSnapshotConfMainEntity> {
-
+    default PageResult<StSuggestSnapshotConfMainEntity> selectPage(StSuggestSnapshotConfMainPageReqVO reqVO) {
+        return selectPage(reqVO,new LambdaQueryWrapperX<StSuggestSnapshotConfMainEntity>()
+                .likeIfPresent(StSuggestSnapshotConfMainEntity::getModelId,reqVO.getModelId()));
+    }
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotRecordDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotRecordDao.java
index b963f64..c2d9859 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotRecordDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotRecordDao.java
@@ -1,8 +1,11 @@
 package com.iailab.module.model.mcs.sche.dao;
 
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
+import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
@@ -11,5 +14,7 @@
 @TenantDS
 @Mapper
 public interface StSuggestSnapshotRecordDao extends BaseMapperX<StSuggestSnapshotRecordEntity> {
-
+    default PageResult<StSuggestSnapshotRecordEntity> selectPage(StSuggestSnapshotRecordChartReqVO reqVO) {
+        return selectPage(reqVO);
+    }
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestOperationRecordEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestOperationRecordEntity.java
index e770e52..3dc1215 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestOperationRecordEntity.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestOperationRecordEntity.java
@@ -69,6 +69,11 @@
     private String operate;
 
     /**
+     * 原因
+     */
+    private String reason;
+
+    /**
      * 处理人ID
      */
     private String handlerId;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotConfDetEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotConfDetEntity.java
index f2dab4a..150c27d 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotConfDetEntity.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotConfDetEntity.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.iailab.framework.mybatis.core.dataobject.BaseDO;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -23,7 +24,7 @@
     private String id;
 
     /**
-     * 模型ID
+     * 快照配置ID
      */
     private String confId;
 
@@ -43,7 +44,7 @@
     private Integer leftLength;
 
     /**
-     * 右侧侧长度(min)
+     * 右侧长度(min)
      */
     private Integer rightLength;
 
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotRecordEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotRecordEntity.java
index 155c726..f3deb66 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotRecordEntity.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotRecordEntity.java
@@ -51,6 +51,11 @@
     /**
      * 开始时间
      */
+    private Date scheduleTime;
+
+    /**
+     * 开始时间
+     */
     private Date startTime;
 
     /**
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfDetService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfDetService.java
index 1773898..5bf2ca7 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfDetService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfDetService.java
@@ -1,12 +1,28 @@
 package com.iailab.module.model.mcs.sche.service;
 
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.service.BaseService;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetSaveReqVO;
+
+import java.util.List;
 
 
 /**
  * @author Jay
  */
 public interface StSuggestSnapshotConfDetService extends BaseService<StSuggestSnapshotConfDetEntity> {
+    PageResult<StSuggestSnapshotConfDetEntity> page(StSuggestSnapshotConfDetPageReqVO reqVO);
 
+    void create(StSuggestSnapshotConfDetSaveReqVO createReqVO);
+
+    void update(StSuggestSnapshotConfDetSaveReqVO createReqVO);
+
+    void delete(String id);
+
+    List<StSuggestSnapshotConfDetRespVO> getByConfId(String confId);
+
+    StSuggestSnapshotConfDetRespVO get(String id);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfMainService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfMainService.java
index 9b7c726..2d2f1b8 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfMainService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfMainService.java
@@ -1,12 +1,26 @@
 package com.iailab.module.model.mcs.sche.service;
 
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
-
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainSaveReqVO;
 
 /**
  * @author Jay
  */
 public interface StSuggestSnapshotConfMainService extends BaseService<StSuggestSnapshotConfMainEntity> {
+    PageResult<StSuggestSnapshotConfMainEntity> page(StSuggestSnapshotConfMainPageReqVO reqVO);
 
+    void create(StSuggestSnapshotConfMainSaveReqVO createReqVO);
+
+    void update(StSuggestSnapshotConfMainSaveReqVO createReqVO);
+
+    void delete(String id);
+
+    StSuggestSnapshotConfMainRespVO getByModelIdAndScheduleObj(String modelId,  String scheduleObj);
+
+    StSuggestSnapshotConfMainRespVO get(String id);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java
index f4dbfdd..9ac2882 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java
@@ -1,12 +1,20 @@
 package com.iailab.module.model.mcs.sche.service;
 
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.service.BaseService;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity;
-
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO;
 
 /**
  * @author Jay
  */
 public interface StSuggestSnapshotRecordService extends BaseService<StSuggestSnapshotRecordEntity> {
 
+    void create(StSuggestSnapshotRecordSaveReqVO createReqVO);
+
+    void update(StSuggestSnapshotRecordSaveReqVO createReqVO);
+
+    void delete(String id);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java
index 6cf4835..f4507f5 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java
@@ -8,10 +8,8 @@
 import com.iailab.module.model.api.mcs.dto.ScheduleSuggestReqDTO;
 import com.iailab.module.model.api.mcs.dto.ScheduleSuggestRespDTO;
 import com.iailab.module.model.api.mcs.dto.StAlarmAndSuggestReqVO;
-import com.iailab.module.model.api.mcs.dto.StAlarmAndSuggestRespVO;
 import com.iailab.module.model.common.enums.ScheduleSuggestStatusEnum;
 import com.iailab.module.model.mcs.sche.dao.StScheduleSuggestDao;
-import com.iailab.module.model.mcs.sche.entity.StScheduleSchemeEntity;
 import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity;
 import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService;
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestPageReqVO;
@@ -109,7 +107,7 @@
     public Boolean ignoreSuggest(StAlarmAndSuggestReqVO reqVO) {
         StScheduleSuggestEntity entity = new StScheduleSuggestEntity();
         entity.setId(reqVO.getId());
-        entity.setStatus(ScheduleSuggestStatusEnum.S0.getCode());
+        entity.setStatus(ScheduleSuggestStatusEnum.S2.getCode());
         entity.setHandleTime(new Date());
         baseDao.updateById(entity);
         return true;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java
index 8908bd5..9963fca 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java
@@ -6,10 +6,17 @@
 import com.iailab.module.model.mcs.sche.dao.StSuggestOperationRecordDao;
 import com.iailab.module.model.mcs.sche.entity.StSuggestOperationRecordEntity;
 import com.iailab.module.model.mcs.sche.service.StSuggestOperationRecordService;
-import com.iailab.module.model.mcs.sche.vo.StSuggestOperationRecordPageReqVO;
-import com.iailab.module.model.mcs.sche.vo.StSuggestOperationRecordReqVO;
+import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfDetService;
+import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService;
+import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService;
+import com.iailab.module.model.mcs.sche.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.List;
 import java.util.UUID;
 
 
@@ -20,6 +27,15 @@
 public class StSuggestOperationRecordServiceImpl extends BaseServiceImpl<StSuggestOperationRecordDao, StSuggestOperationRecordEntity>
         implements StSuggestOperationRecordService {
 
+    @Autowired
+    private StSuggestSnapshotConfMainService stSuggestSnapshotConfMainService;
+
+    @Autowired
+    private StSuggestSnapshotConfDetService stSuggestSnapshotConfDetService;
+
+    @Autowired
+    private StSuggestSnapshotRecordService stSuggestSnapshotRecordService;
+
     @Override
     public PageResult<StSuggestOperationRecordEntity> page(StSuggestOperationRecordPageReqVO reqVO) {
         return baseDao.selectPage(reqVO);
@@ -29,7 +45,30 @@
     public void create(StSuggestOperationRecordReqVO reqVo) {
         StSuggestOperationRecordEntity entity = BeanUtils.toBean(reqVo, StSuggestOperationRecordEntity.class);
         entity.setId(UUID.randomUUID().toString());
+        entity.setHandleTime(new Date());
         baseDao.insert(entity);
+
+        //获取调度建议快照配置表信息
+        StSuggestSnapshotConfMainRespVO confMain = stSuggestSnapshotConfMainService.getByModelIdAndScheduleObj(reqVo.getModelId(), reqVo.getSuggestId());
+        if (confMain != null){
+            StSuggestSnapshotRecordSaveReqVO snapshotRecordSaveReqVO = new StSuggestSnapshotRecordSaveReqVO();
+            snapshotRecordSaveReqVO.setModelId(entity.getModelId());
+            List<StSuggestSnapshotConfDetRespVO> confDetList = stSuggestSnapshotConfDetService.getByConfId(confMain.getId());
+            confDetList.forEach(confDet -> {
+                snapshotRecordSaveReqVO.setDataNo(confDet.getDataNo());
+                snapshotRecordSaveReqVO.setDataType(confDet.getDataType());
+                snapshotRecordSaveReqVO.setScheduleTime(entity.getScheduleTime());
+                //计算开始时间,开始时间为当前调度时间减去快照配置表配置的左侧时间长度
+                LocalDateTime localStartDateTime =  entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().minusMinutes(confDet.getLeftLength());
+                Date startTime = Date.from(localStartDateTime.atZone(ZoneId.systemDefault()).toInstant());
+                snapshotRecordSaveReqVO.setStartTime(startTime);
+                //计算结束时间,结束时间为当前调度时间加上快照配置表配置的右侧时间长度
+                LocalDateTime localEndDateTime =  entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusMinutes(confDet.getRightLength());
+                Date endTime = Date.from(localEndDateTime.atZone(ZoneId.systemDefault()).toInstant());
+                snapshotRecordSaveReqVO.setEndTime(endTime);
+                stSuggestSnapshotRecordService.create(snapshotRecordSaveReqVO);
+            });
+        }
     }
 
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfDetServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfDetServiceImpl.java
index a53a48c..8c202a9 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfDetServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfDetServiceImpl.java
@@ -1,10 +1,22 @@
 package com.iailab.module.model.mcs.sche.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.BeanUtils;
+import com.iailab.framework.common.util.object.ConvertUtils;
 import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotConfDetDao;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity;
 import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfDetService;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetSaveReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.UUID;
 
 
 /**
@@ -15,4 +27,42 @@
         implements StSuggestSnapshotConfDetService {
 
 
+    @Autowired
+    private StSuggestSnapshotConfDetService stSuggestSnapshotConfDetService;
+
+    @Override
+    public PageResult<StSuggestSnapshotConfDetEntity> page(StSuggestSnapshotConfDetPageReqVO reqVO) {
+        return baseDao.selectPage(reqVO);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void create(StSuggestSnapshotConfDetSaveReqVO createReqVO) {
+        StSuggestSnapshotConfDetEntity entity = BeanUtils.toBean(createReqVO, StSuggestSnapshotConfDetEntity.class);
+        entity.setId(UUID.randomUUID().toString());
+        baseDao.insert(entity);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void update(StSuggestSnapshotConfDetSaveReqVO updateReqVO) {
+        StSuggestSnapshotConfDetEntity entity = BeanUtils.toBean(updateReqVO, StSuggestSnapshotConfDetEntity.class);
+        baseDao.updateById(entity);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void delete(String id) {
+        baseDao.deleteById(id);
+    }
+
+    @Override
+    public List<StSuggestSnapshotConfDetRespVO> getByConfId(String confId) {
+        return ConvertUtils.sourceToTarget(baseDao.selectList("conf_id", confId), StSuggestSnapshotConfDetRespVO.class);
+    }
+
+    @Override
+    public StSuggestSnapshotConfDetRespVO get(String id) {
+        return ConvertUtils.sourceToTarget( baseDao.selectById(id), StSuggestSnapshotConfDetRespVO.class);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfMainServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfMainServiceImpl.java
index 5e76e0b..937f795 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfMainServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfMainServiceImpl.java
@@ -1,10 +1,20 @@
 package com.iailab.module.model.mcs.sche.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.BeanUtils;
+import com.iailab.framework.common.util.object.ConvertUtils;
 import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotConfMainDao;
+import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
 import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainSaveReqVO;
 import org.springframework.stereotype.Service;
+
+import java.util.UUID;
 
 
 /**
@@ -13,4 +23,40 @@
 @Service
 public class StSuggestSnapshotConfMainServiceImpl extends BaseServiceImpl<StSuggestSnapshotConfMainDao, StSuggestSnapshotConfMainEntity>
         implements StSuggestSnapshotConfMainService {
+
+    @Override
+    public PageResult<StSuggestSnapshotConfMainEntity> page(StSuggestSnapshotConfMainPageReqVO reqVO) {
+        return baseDao.selectPage(reqVO);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void create(StSuggestSnapshotConfMainSaveReqVO createReqVO) {
+        StSuggestSnapshotConfMainEntity entity = BeanUtils.toBean(createReqVO, StSuggestSnapshotConfMainEntity.class);
+        entity.setId(UUID.randomUUID().toString());
+        baseDao.insert(entity);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void update(StSuggestSnapshotConfMainSaveReqVO updateReqVO) {
+        StSuggestSnapshotConfMainEntity entity = BeanUtils.toBean(updateReqVO, StSuggestSnapshotConfMainEntity.class);
+        baseDao.updateById(entity);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void delete(String id) {
+        baseDao.deleteById(id);
+    }
+
+    @Override
+    public StSuggestSnapshotConfMainRespVO getByModelIdAndScheduleObj(String modelId,  String scheduleObj) {
+        return ConvertUtils.sourceToTarget( baseDao.selectOne("model_id", modelId,  "schedule_obj", scheduleObj), StSuggestSnapshotConfMainRespVO.class);
+    }
+
+    @Override
+    public StSuggestSnapshotConfMainRespVO get(String id) {
+        return ConvertUtils.sourceToTarget( baseDao.selectById(id), StSuggestSnapshotConfMainRespVO.class);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java
index 0292557..115e612 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java
@@ -1,10 +1,24 @@
 package com.iailab.module.model.mcs.sche.service.impl;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.BeanUtils;
 import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotRecordDao;
+import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity;
 import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity;
 import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService;
+import com.iailab.module.model.mcs.sche.vo.StScheduleModelRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO;
+import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.UUID;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
 
 
 /**
@@ -13,4 +27,29 @@
 @Service
 public class StSuggestSnapshotRecordServiceImpl extends BaseServiceImpl<StSuggestSnapshotRecordDao, StSuggestSnapshotRecordEntity>
         implements StSuggestSnapshotRecordService {
+
+
+    @Autowired
+    private StSuggestSnapshotRecordService StSuggestSnapshotRecordService;
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void create(StSuggestSnapshotRecordSaveReqVO createReqVO) {
+        StSuggestSnapshotRecordEntity entity = BeanUtils.toBean(createReqVO, StSuggestSnapshotRecordEntity.class);
+        entity.setId(UUID.randomUUID().toString());
+        baseDao.insert(entity);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void update(StSuggestSnapshotRecordSaveReqVO updateReqVO) {
+        StSuggestSnapshotRecordEntity entity = BeanUtils.toBean(updateReqVO, StSuggestSnapshotRecordEntity.class);
+        baseDao.updateById(entity);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void delete(String id) {
+        baseDao.deleteById(id);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StScheduleSuggestPageReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StScheduleSuggestPageReqVO.java
index a1b2ede..e2301ed 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StScheduleSuggestPageReqVO.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StScheduleSuggestPageReqVO.java
@@ -24,6 +24,9 @@
     @Schema(description = "标题,模糊匹配", example = "")
     private String title;
 
+    @Schema(description = "模型id", example = "")
+    private String modelId;
+
     @Schema(description = "调整对象,模糊匹配", example = "")
     private String scheduleObj;
 
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordPageReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordPageReqVO.java
index 56e589d..264fe49 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordPageReqVO.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordPageReqVO.java
@@ -29,8 +29,7 @@
     private String modelName;
 
     @Schema(description = "调度时间")
-    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = "GMT+8")
-    private LocalDateTime scheduleTime;
+    private String scheduleTime;
 
     @Schema(description = "开始时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordReqVO.java
index 68cade9..f3a12b2 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordReqVO.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordReqVO.java
@@ -45,6 +45,9 @@
     @Schema(description = "操作(已采纳,取消采纳,已忽略等)")
     private String operate;
 
+    @Schema(description = "原因")
+    private String reason;
+
     @Schema(description = "处理人ID")
     private String handlerId;
 
@@ -57,4 +60,7 @@
     @Schema(description = "创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
+
+    @Schema(description = "建议ID")
+    private String suggestId;
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordResVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordResVO.java
index 67560ac..0104b4d 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordResVO.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordResVO.java
@@ -47,6 +47,9 @@
     @Schema(description = "操作(已采纳,取消采纳,已忽略等)")
     private String operate;
 
+    @Schema(description = "原因")
+    private String reason;
+
     @Schema(description = "处理人ID")
     private String handlerId;
 
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetPageReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetPageReqVO.java
new file mode 100644
index 0000000..50012a9
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetPageReqVO.java
@@ -0,0 +1,21 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import com.iailab.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议快照配置分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class StSuggestSnapshotConfDetPageReqVO extends PageParam {
+
+    @Schema(description = "模型ID")
+    private String confId;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetReqVO.java
index 2bb615e..8d1c729 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetReqVO.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetReqVO.java
@@ -14,7 +14,7 @@
     @Schema(description = "ID")
     private String id;
 
-    @Schema(description = "模型ID")
+    @Schema(description = "快照配置ID")
     private String confId;
 
     @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)")
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetRespVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetRespVO.java
new file mode 100644
index 0000000..cf2dd94
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetRespVO.java
@@ -0,0 +1,49 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议创建/修改 Request VO")
+@Data
+public class StSuggestSnapshotConfDetRespVO {
+
+    @Schema(description = "ID")
+    private String id;
+
+    @Schema(description = "模型ID")
+    private String confId;
+
+    @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)")
+    private String dataType;
+
+    @Schema(description = "数据编号")
+    private String dataNo;
+
+    @Schema(description = "左侧长度(min)")
+    private Integer leftLength;
+
+    @Schema(description = "右侧侧长度(min)")
+    private Integer rightLength;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "拓展字段1")
+    private String ext1;
+
+    @Schema(description = "拓展字段2")
+    private String ext2;
+
+    @Schema(description = "拓展字段3")
+    private String ext3;
+
+    @Schema(description = "拓展字段4")
+    private String ext4;
+
+    @Schema(description = "拓展字段5")
+    private String ext5;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetSaveReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetSaveReqVO.java
new file mode 100644
index 0000000..be48686
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetSaveReqVO.java
@@ -0,0 +1,49 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议创建/修改 Request VO")
+@Data
+public class StSuggestSnapshotConfDetSaveReqVO {
+
+    @Schema(description = "ID")
+    private String id;
+
+    @Schema(description = "模型ID")
+    private String confId;
+
+    @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)")
+    private String dataType;
+
+    @Schema(description = "数据编号")
+    private String dataNo;
+
+    @Schema(description = "左侧长度(min)")
+    private Integer leftLength;
+
+    @Schema(description = "右侧侧长度(min)")
+    private Integer rightLength;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "拓展字段1")
+    private String ext1;
+
+    @Schema(description = "拓展字段2")
+    private String ext2;
+
+    @Schema(description = "拓展字段3")
+    private String ext3;
+
+    @Schema(description = "拓展字段4")
+    private String ext4;
+
+    @Schema(description = "拓展字段5")
+    private String ext5;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainPageReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainPageReqVO.java
new file mode 100644
index 0000000..d6115af
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainPageReqVO.java
@@ -0,0 +1,30 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.iailab.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.Date;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议快照配置详情分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class StSuggestSnapshotConfMainPageReqVO extends PageParam {
+
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "模型ID")
+    private String modelId;
+
+    @Schema(description = "调整对象")
+    private String scheduleObj;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainRespVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainRespVO.java
new file mode 100644
index 0000000..31eeba5
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainRespVO.java
@@ -0,0 +1,32 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议创建/修改 Request VO")
+@Data
+public class StSuggestSnapshotConfMainRespVO {
+
+    @Schema(description = "ID")
+    private String id;
+
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "模型ID")
+    private String modelId;
+
+    @Schema(description = "调整对象")
+    private String scheduleObj;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainSaveReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainSaveReqVO.java
new file mode 100644
index 0000000..06e342c
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainSaveReqVO.java
@@ -0,0 +1,32 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议创建/修改 Request VO")
+@Data
+public class StSuggestSnapshotConfMainSaveReqVO {
+
+    @Schema(description = "ID")
+    private String id;
+
+    @Schema(description = "标题")
+    private String title;
+
+    @Schema(description = "模型ID")
+    private String modelId;
+
+    @Schema(description = "调整对象")
+    private String scheduleObj;
+
+    @Schema(description = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordChartReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordChartReqVO.java
new file mode 100644
index 0000000..b584ee0
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordChartReqVO.java
@@ -0,0 +1,30 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议快照图表查询 Request VO")
+@Data
+public class StSuggestSnapshotRecordChartReqVO {
+
+    @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)")
+    private String dataType;
+
+    @Schema(description = "数据编号")
+    private String dataNo;
+
+    @Schema(description = "开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    @Schema(description = "结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordRespVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordRespVO.java
new file mode 100644
index 0000000..2b14a94
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordRespVO.java
@@ -0,0 +1,50 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议创建/修改 Request VO")
+@Data
+public class StSuggestSnapshotRecordRespVO {
+
+    @Schema(description = "ID")
+    private String id;
+
+    @Schema(description = "建议ID(只记录采纳)")
+    private String suggestId;
+
+    @Schema(description = "操作记录ID(只记录采纳)")
+    private String operationId;
+
+    @Schema(description = "模型ID")
+    private String modelId;
+
+    @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)")
+    private String dataType;
+
+    @Schema(description = "数据编号")
+    private String dataNo;
+
+    @Schema(description = "开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    @Schema(description = "结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    @Schema(description = "序列化的数据")
+    private String jsonValue;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordSaveReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordSaveReqVO.java
new file mode 100644
index 0000000..adf43ea
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordSaveReqVO.java
@@ -0,0 +1,54 @@
+package com.iailab.module.model.mcs.sche.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * @author Jay
+ */
+@Schema(description = "模型服务 - 调度建议创建/修改 Request VO")
+@Data
+public class StSuggestSnapshotRecordSaveReqVO {
+
+    @Schema(description = "ID")
+    private String id;
+
+    @Schema(description = "建议ID(只记录采纳)")
+    private String suggestId;
+
+    @Schema(description = "操作记录ID(只记录采纳)")
+    private String operationId;
+
+    @Schema(description = "模型ID")
+    private String modelId;
+
+    @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)")
+    private String dataType;
+
+    @Schema(description = "数据编号")
+    private String dataNo;
+
+    @Schema(description = "调度时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date scheduleTime;
+
+    @Schema(description = "开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    @Schema(description = "结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
+    @Schema(description = "序列化的数据")
+    private String jsonValue;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml b/iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml
index fbf8a11..893c65a 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml
@@ -232,6 +232,9 @@
       - t_mm_predict_influence_factor
       - t_mm_predict_influence_factor_result
       - t_st_suggest_operation_record
+      - t_st_suggest_snapshot_conf_det
+      - t_st_suggest_snapshot_conf_main
+      - t_st_suggest_snapshot_record
   app:
     app-key: model
     app-secret: 85b0df7edc3df3611913df34ed695011
diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/MenuServiceImpl.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/MenuServiceImpl.java
index 5f32ec2..3d9be14 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/MenuServiceImpl.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/service/permission/MenuServiceImpl.java
@@ -331,7 +331,10 @@
         if (CollUtil.isEmpty(ids)) {
             return Lists.newArrayList();
         }
-        return menuMapper.selectBatchIds(ids);
+        return menuMapper.selectList(
+                new LambdaQueryWrapper<MenuDO>()
+                        .in(MenuDO::getId, ids)
+                        .eq(MenuDO::getStatus, CommonStatusEnum.ENABLE));
     }
 
     @Override
diff --git a/iailab-plat-sdk/src/main/java/com/iailab/sdk/util/http/IailabHttpUtils.java b/iailab-plat-sdk/src/main/java/com/iailab/sdk/util/http/IailabHttpUtils.java
index 2a66286..343c0f6 100644
--- a/iailab-plat-sdk/src/main/java/com/iailab/sdk/util/http/IailabHttpUtils.java
+++ b/iailab-plat-sdk/src/main/java/com/iailab/sdk/util/http/IailabHttpUtils.java
@@ -90,7 +90,7 @@
             httpPost.addHeader("Content-Type", "application/json;charset=UTF-8");
             httpPost.addHeader("Authorization", "Bearer " + IailabClient.accessToken);
             httpPost.addHeader("Tenant-Id", SdkAutoConfiguration.TENANT_ID.toString());
-            StringEntity stringEntity = new StringEntity(json);
+            StringEntity stringEntity = new StringEntity(json,"UTF-8");
             stringEntity.setContentEncoding("UTF-8");
             stringEntity.setContentType("application/json");
             httpPost.setEntity(stringEntity);

--
Gitblit v1.9.3