From 60fa13f76afe72a6f48416de2904d58164859382 Mon Sep 17 00:00:00 2001
From: houzhongjian <houzhongyi@126.com>
Date: 星期五, 17 一月 2025 13:51:55 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/DataPointApi.java                               |    5 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/value/dto/QuerySourceValueDTO.java                    |    2 
 iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointPageReqVO.java                      |   19 ++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/AtomItemHandler.java               |   10 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java      |    9 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java                      |    1 
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java                                    |   17 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java |    5 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/point/DataPointApiImpl.java                           |   35 +++
 iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointDTO.java                            |    4 
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java                    |    9 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/JavaScriptHandler.java                       |    5 
 iailab-module-model/iailab-module-model-biz/db/mysql.sql                                                                                 |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java           |    2 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/utils/IndSqlUtils.java                     |   38 +++-
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointService.java                         |    2 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java               |    4 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/DaPointDao.java                                 |    3 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/DerItemHandler.java                |    3 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaMathPointServiceImpl.java            |    3 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java             |    5 
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictLastValueReqVO.java                 |   18 ++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java               |   25 ++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/IndTimeLimitEnum.java                        |    1 
 iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml                                                 |   15 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/CalItemHandler.java                |   12 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaMathPointService.java                     |    7 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java                |    8 
 iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml                                                            |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java               |    1 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemOutputServiceImpl.java      |   15 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java          |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java             |   27 +++
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java                      |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java                                    |  159 ++++++++++++++++
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml                                        |   10 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java                  |    1 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java                  |   21 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java                  |    2 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/vo/DaPointPageReqVO.java                            |    4 
 40 files changed, 465 insertions(+), 50 deletions(-)

diff --git a/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/DataPointApi.java b/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/DataPointApi.java
index 98ab9d3..f0b97d8 100644
--- a/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/DataPointApi.java
+++ b/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/DataPointApi.java
@@ -1,5 +1,6 @@
 package com.iailab.module.data.api.point;
 
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.module.data.api.point.dto.*;
 import com.iailab.module.data.enums.ApiConstants;
 import io.swagger.v3.oas.annotations.Operation;
@@ -50,5 +51,7 @@
     @Operation(summary = "写入单个测点值")
     Boolean writePointRealValue(@RequestBody ApiPointValueWriteDTO queryDto);
 
-
+    @PostMapping(PREFIX + "/query-math-point/current-value")
+    @Operation(summary = "根据计算点编号查询测点集合")
+    PageResult<ApiPointDTO> queryMathPointCurrentValue(@RequestBody ApiPointPageReqVO reqVO);
 }
diff --git a/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointDTO.java b/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointDTO.java
index e98d182..40f9fa2 100644
--- a/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointDTO.java
+++ b/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointDTO.java
@@ -1,5 +1,6 @@
 package com.iailab.module.data.api.point.dto;
 
+import com.iailab.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -26,4 +27,7 @@
 
     @Schema(description = "采集频率", required = true)
     private String minfreqid;
+
+    @Schema(description = "当前值", required = false)
+    private Object currentValue;
 }
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointPageReqVO.java b/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointPageReqVO.java
new file mode 100644
index 0000000..38728e9
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointPageReqVO.java
@@ -0,0 +1,19 @@
+package com.iailab.module.data.api.point.dto;
+
+import com.iailab.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author lirm
+ * @Description
+ * @createTime 2025年01月14日
+ */
+@Schema(description = "")
+@Data
+public class ApiPointPageReqVO extends PageParam {
+
+    @Schema(description = "测点编码", required = true)
+    private String pointNo;
+
+}
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java
index 339c042..7c3537c 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java
@@ -1,7 +1,9 @@
 package com.iailab.module.data.api.controller.admin;
 
 import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.util.date.DateUtils;
+import com.iailab.framework.common.util.object.BeanUtils;
 import com.iailab.framework.common.util.object.ConvertUtils;
 import com.iailab.framework.excel.core.util.ExcelUtils;
 import com.iailab.module.data.api.dto.DeviceValueDTO;
@@ -13,9 +15,7 @@
 import com.iailab.module.data.api.plan.PlanItemApi;
 import com.iailab.module.data.api.plan.dto.ApiPlanDataDTO;
 import com.iailab.module.data.api.point.DataPointApi;
-import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
-import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
-import com.iailab.module.data.api.point.dto.ApiPointsValueQueryDTO;
+import com.iailab.module.data.api.point.dto.*;
 import com.iailab.module.data.common.ApiDataQueryDTO;
 import com.iailab.module.data.common.ApiDataValueDTO;
 import com.iailab.module.data.common.utils.ApiSecurityUtils;
@@ -310,10 +310,12 @@
         List<IndItemValueVO> list = indItemCollector.queryValue(itemNo);
         List<ApiIndItemValueDTO> dtoList = new ArrayList<>();
         list.forEach(item -> {
-            ApiIndItemValueDTO dto = new ApiIndItemValueDTO();
-            dto.setDataTime(item.getDataTime());
-            dto.setDataValue(item.getDataValue().doubleValue());
-            dtoList.add(dto);
+            if (item != null) {
+                ApiIndItemValueDTO dto = new ApiIndItemValueDTO();
+                dto.setDataTime(item.getDataTime());
+                dto.setDataValue(item.getDataValue().doubleValue());
+                dtoList.add(dto);
+            }
         });
         return success(dtoList);
     }
@@ -325,4 +327,13 @@
         List<IndItemValueVO> list = indItemCollector.queryValue(dto.getItemNo(), dto.getStart(), dto.getEnd());
         return success(ConvertUtils.sourceToTarget(list, ApiIndItemValueDTO.class));
     }
+
+    @PermitAll
+    @PostMapping("/query-math-point/current-value")
+    @Operation(summary = "根据计算点编号查询测点集合")
+    public CommonResult<PageResult<ApiPointDTO>> queryMathPointCurrentValue(@RequestBody ApiPointPageReqVO reqVO) {
+        PageResult<ApiPointDTO> data = dataPointApi.queryMathPointCurrentValue(reqVO);
+        return success(data);
+    }
+
 }
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/point/DataPointApiImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/point/DataPointApiImpl.java
index a8d9f0c..9141100 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/point/DataPointApiImpl.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/point/DataPointApiImpl.java
@@ -1,5 +1,6 @@
 package com.iailab.module.data.api.point;
 
+import com.iailab.framework.common.pojo.PageResult;
 import com.iailab.framework.common.util.date.DateUtils;
 import com.iailab.framework.common.util.object.ConvertUtils;
 import com.iailab.module.data.api.point.dto.*;
@@ -7,9 +8,13 @@
 import com.iailab.module.data.influxdb.service.InfluxDBService;
 import com.iailab.module.data.influxdb.service.impl.InfluxDBServiceImpl;
 import com.iailab.module.data.point.collection.PointCollector;
+import com.iailab.module.data.point.collection.handler.CalculateHandle;
+import com.iailab.module.data.point.dto.DaMathPointDTO;
 import com.iailab.module.data.point.dto.DaPointDTO;
 import com.iailab.module.data.point.dto.DaPointWriteValueDTO;
+import com.iailab.module.data.point.service.DaMathPointService;
 import com.iailab.module.data.point.service.DaPointService;
+import com.iailab.module.data.point.vo.DaPointPageReqVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
@@ -17,6 +22,7 @@
 
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * @author PanZhibao
@@ -35,6 +41,9 @@
 
     @Autowired
     private InfluxDBService influxDBService;
+
+    @Autowired
+    private DaMathPointService daMathPointService;
 
     @Override
     public ApiPointDTO getInfoById(String pointId) {
@@ -130,4 +139,30 @@
             return false;
         }
     }
+
+    @Override
+    public PageResult<ApiPointDTO> queryMathPointCurrentValue(ApiPointPageReqVO reqVO) {
+        DaPointDTO daPointDTO = daPointService.getSimpleInfoByNo(reqVO.getPointNo());
+        DaMathPointDTO daMathPointDTO = daMathPointService.getByPoint(daPointDTO.getId());
+        String[] pointNos = daMathPointDTO.getExpression().split(CalculateHandle.regex);
+        DaPointPageReqVO pageReqVO = new DaPointPageReqVO();
+        pageReqVO.setPageNo(reqVO.getPageNo());
+        pageReqVO.setPageSize(reqVO.getPageSize());
+        pageReqVO.setPointNos(Arrays.asList(pointNos));
+        PageResult<DaPointDTO> pageResult = daPointService.queryPage(pageReqVO);
+        List<String> pointNosL = pageResult.getList().stream().map(item -> {
+            return item.getPointNo();
+        }).collect(Collectors.toList());
+        Map<String, Object> currentValueMap = pointCollector.getCurrentValue(pointNosL);
+
+        List<ApiPointDTO> dataList = new ArrayList<>();
+        pageResult.getList().forEach(item -> {
+            ApiPointDTO dto = new ApiPointDTO();
+            dto.setPointNo(item.getPointNo());
+            dto.setPointName(item.getPointName());
+            dto.setCurrentValue(currentValueMap.get(item.getPointNo()).toString());
+            dataList.add(dto);
+        });
+        return new PageResult<>(dataList, pageResult.getTotal());
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java
index bb76199..ca01dca 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java
@@ -87,6 +87,11 @@
      */
     private static final String T = "t";
 
+    /**
+     * 数据质量G:good,B:bad
+     */
+    private static final String Q = "q";
+
     private HttpApiEntity getHttpApi(String id) {
         if (apiMap.containsKey(id)) {
             return apiMap.get(id);
@@ -288,7 +293,9 @@
                 if (!CollectionUtils.isEmpty(tagValueList)) {
                     for (int i = 0; i < tagValueList.size(); i++) {
                         JSONObject item = tagValueList.getJSONObject(i);
-                        result.put(TagUtils.genTagId(DataSourceType.HTTP.getCode(), sourceName, item.get(N).toString()), item.get(V));
+                        if (item.get(Q).toString().equals("G")) {
+                            result.put(TagUtils.genTagId(DataSourceType.HTTP.getCode(), sourceName, item.get(N).toString()), item.get(V));
+                        }
                     }
                 }
             }
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/IndTimeLimitEnum.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/IndTimeLimitEnum.java
index 001bb29..57ad871 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/IndTimeLimitEnum.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/IndTimeLimitEnum.java
@@ -17,6 +17,7 @@
     LAST_DAY_7("LAST_DAY_7", "最近7天"),
     LAST_DAY_30("LAST_DAY_30", "最近30天"),
     THIS_MONTH("THIS_MONTH", "当前月"),
+    LAST_MONTH("LAST_MONTH", "上月"),
     LAST_MONTH_12("LAST_MONTH_12", "最近12个月"),
     THIS_YEAR_MONTH("THIS_YEAR_MONTH", "当年月份"),
     LAST_YEAR("LAST_YEAR", "去年"),
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/JavaScriptHandler.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/JavaScriptHandler.java
index c47391b..6c47762 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/JavaScriptHandler.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/JavaScriptHandler.java
@@ -1,6 +1,9 @@
 package com.iailab.module.data.common.utils;
 
 import javax.annotation.Resource;
+
+import cn.hutool.script.JavaScriptEngine;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import javax.script.ScriptEngine;
@@ -10,6 +13,7 @@
  * @author PanZhibao
  * @date 2021年06月04日 16:01
  */
+@Slf4j
 @Component
 public class JavaScriptHandler {
 
@@ -20,6 +24,7 @@
         try {
             return scriptEngine.eval(script).toString();
         } catch (ScriptException e) {
+            log.error("计算异常,计算公式:" + script);
             e.printStackTrace();
             return null;
         }
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java
index 0b9271a..51b27f8 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java
@@ -51,7 +51,7 @@
                 result = derItemHandler.queryValue(indItem.getId());
                 break;
             case CAL:
-                result = calItemHandler.queryValue(itemNo);
+                result = calItemHandler.queryValue(indItem.getId());
                 break;
             default:
                 break;
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/AtomItemHandler.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/AtomItemHandler.java
index 76b80d4..5c2f392 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/AtomItemHandler.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/AtomItemHandler.java
@@ -7,6 +7,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -27,10 +28,15 @@
     private IndItemValueService indItemValueService;
 
     public List<IndItemValueVO> queryValue(String itemId) {
-        List<IndItemValueVO> result = new ArrayList<IndItemValueVO>();
+        List<IndItemValueVO> result = new ArrayList<>();
         try {
             QuerySourceValueDTO queryDto = indSqlUtils.getAtomSql(itemId);
-            return indItemValueService.getSourceValue(queryDto);
+            result = indItemValueService.getSourceValue(queryDto);
+            if (!CollectionUtils.isEmpty(result)) {
+                result.forEach(item -> {
+                    item.setItemNo(queryDto.getItemNo());
+                });
+            }
         } catch (Exception ex) {
             ex.printStackTrace();
         }
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/CalItemHandler.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/CalItemHandler.java
index e2b3297..48a3c7b 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/CalItemHandler.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/CalItemHandler.java
@@ -14,6 +14,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -63,16 +64,23 @@
                 }
                 IndItemEntity subItem = indItemService.getInfoByNo(s);
                 ItemTypeEnum itemType = ItemTypeEnum.getEumByCode(subItem.getItemType());
+                List<IndItemValueVO> vl = new ArrayList<>();
                 switch (itemType) {
                     case ATOM:
-                        valueMix.add(atomItemHandler.queryValue(subItem.getId()));
+                        vl = atomItemHandler.queryValue(subItem.getId());
                         break;
                     case DER:
-                        valueMix.add(derItemHandler.queryValue(subItem.getId()));
+                        vl = derItemHandler.queryValue(subItem.getId());
                         break;
                     default:
                         break;
                 }
+                if (!CollectionUtils.isEmpty(vl)) {
+                    vl.forEach(vi -> {
+                        vi.setItemNo(s);
+                    });
+                }
+                valueMix.add(vl);
             }
             dataLength = valueMix.get(0).size();
 
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/DerItemHandler.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/DerItemHandler.java
index 404f4c5..f76c567 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/DerItemHandler.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/DerItemHandler.java
@@ -7,6 +7,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -31,7 +32,7 @@
         List<IndItemValueVO> result = new ArrayList<IndItemValueVO>();
         try {
             QuerySourceValueDTO queryDto = indSqlUtils.getDerSql(itemId);
-            return indItemValueService.getSourceValue(queryDto);
+            result = indItemValueService.getSourceValue(queryDto);
         } catch (Exception ex) {
             ex.printStackTrace();
         }
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/utils/IndSqlUtils.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/utils/IndSqlUtils.java
index 4636904..87fee61 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/utils/IndSqlUtils.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/utils/IndSqlUtils.java
@@ -4,10 +4,11 @@
 import com.iailab.module.data.common.enums.IndStatFuncEnum;
 import com.iailab.module.data.common.enums.IndTimeLimitEnum;
 import com.iailab.module.data.ind.data.dto.IndDataSetDTO;
-import com.iailab.module.data.ind.data.service.IndDataSetFieldService;
 import com.iailab.module.data.ind.data.service.IndDataSetService;
+import com.iailab.module.data.ind.item.entity.IndItemEntity;
 import com.iailab.module.data.ind.item.service.IndItemAtomService;
 import com.iailab.module.data.ind.item.service.IndItemDerService;
+import com.iailab.module.data.ind.item.service.IndItemService;
 import com.iailab.module.data.ind.item.vo.IndItemAtomVO;
 import com.iailab.module.data.ind.item.vo.IndItemDerVO;
 import com.iailab.module.data.ind.value.dto.QuerySourceValueDTO;
@@ -33,7 +34,7 @@
     private IndDataSetService indDataSetService;
 
     @Autowired
-    private IndDataSetFieldService indDataSetFieldService;
+    private IndItemService indItemService;
 
     @Autowired
     private IndItemDerService indItemDerService;
@@ -50,6 +51,8 @@
         if (indItem == null) {
             return result;
         }
+        IndItemEntity itemEntity = indItemService.get(itemId);
+        result.setItemNo(itemEntity.getItemNo());
         result.setIndItemAtom(indItem);
         IndDataSetDTO dataSet = indDataSetService.getDet(indItem.getDataSet());
         if (dataSet == null) {
@@ -57,7 +60,7 @@
         }
         result.setDataSource(indItem.getDataSource());
         StringBuilder selectSql = new StringBuilder();
-        IndStatFuncEnum statFun = IndStatFuncEnum.getEumByCode(StringUtils.isBlank(indItem.getStatFunc())? IndStatFuncEnum.DEFAULT.getCode() : indItem.getStatFunc());
+        IndStatFuncEnum statFun = IndStatFuncEnum.getEumByCode(StringUtils.isBlank(indItem.getStatFunc()) ? IndStatFuncEnum.DEFAULT.getCode() : indItem.getStatFunc());
         switch (statFun) {
             case AVG:
                 selectSql.append("AVG(");
@@ -91,19 +94,19 @@
         if (indItem == null) {
             return result;
         }
+        IndItemEntity itemEntity = indItemService.get(itemId);
+        result.setItemNo(itemEntity.getItemNo());
         result = getAtomSql(indItem.getAtomItemId());
 
         // 拼接SELECT
         StringBuilder selectSql = new StringBuilder();
-        if (StringUtils.isNotBlank(indItem.getDimension()) && StringUtils.isNotBlank(result.getIndItemAtom().getStatFunc())){
+        if (StringUtils.isNotBlank(indItem.getDimension()) && StringUtils.isNotBlank(result.getIndItemAtom().getStatFunc())) {
             selectSql.append(indItem.getDimension());
             selectSql.append(", ");
             selectSql.append(result.getSelectSql());
-        }
-        else if(StringUtils.isBlank(indItem.getDimension()) && StringUtils.isNotBlank(result.getIndItemAtom().getStatFunc())){
+        } else if (StringUtils.isBlank(indItem.getDimension()) && StringUtils.isNotBlank(result.getIndItemAtom().getStatFunc())) {
             selectSql.append(result.getSelectSql());
-        }
-        else{
+        } else {
             selectSql.append(result.getSelectSql());
             selectSql.append(", ");
             selectSql.append(indItem.getTimeLabel());
@@ -156,6 +159,18 @@
                 whereSql.append(DateUtils.format(calendar.getTime(), PATTERN_MON));
                 whereSql.append("'");
                 break;
+            case LAST_MONTH:
+                calendar.add(Calendar.MONTH, -1); // 将当前日期减去一个月,得到上个月的日期
+                whereSql.append(indItem.getTimeLabel());
+                whereSql.append(" >= '");
+                whereSql.append(DateUtils.format(calendar.getTime(), PATTERN_MON)); // 上个月的第一天
+                calendar.add(Calendar.MONTH, 1); // 再加一个月,回到当前月
+                whereSql.append("' AND '");
+                whereSql.append(indItem.getTimeLabel());
+                whereSql.append("' < '");
+                whereSql.append(DateUtils.format(calendar.getTime(), PATTERN_MON)); // 当前月
+                whereSql.append("'");
+                break;
             case LAST_MONTH_12:
                 whereSql.append(indItem.getTimeLabel());
                 whereSql.append(" <= '");
@@ -206,14 +221,14 @@
 
         // 拼接GROUP
         StringBuilder groupSql = new StringBuilder();
-        if (StringUtils.isNotBlank(indItem.getDimension())){
+        if (StringUtils.isNotBlank(indItem.getDimension())) {
             groupSql.append(indItem.getDimension());
         }
         result.setGroupSql(groupSql.toString());
 
         // 拼接ORDER
         StringBuilder orderBySql = new StringBuilder();
-        if (StringUtils.isNotBlank(indItem.getDimension()) && indItem.getDimension().equals(indItem.getTimeLabel())){
+        if (StringUtils.isNotBlank(indItem.getDimension()) && indItem.getDimension().equals(indItem.getTimeLabel())) {
             orderBySql.append(indItem.getTimeLabel());
             result.setOrderBySql(orderBySql.toString());
         }
@@ -228,6 +243,9 @@
         }
         result = getAtomSql(indItem.getAtomItemId());
 
+        IndItemEntity itemEntity = indItemService.get(itemId);
+        result.setItemNo(itemEntity.getItemNo());
+
         // 拼接SELECT
         StringBuilder selectSql = new StringBuilder();
         selectSql.append(indItem.getDimension());
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/value/dto/QuerySourceValueDTO.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/value/dto/QuerySourceValueDTO.java
index 1b3ec27..93ec419 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/value/dto/QuerySourceValueDTO.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/value/dto/QuerySourceValueDTO.java
@@ -11,6 +11,8 @@
 @Data
 public class QuerySourceValueDTO {
 
+    private String itemNo;
+
     private String dataSource;
 
     private String selectSql;
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 53f9b2f..a9b3215 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
@@ -145,6 +145,7 @@
             data.putAll(cumulateHandle.getCurrent(pointNos));
             return data;
         } catch (Exception ex) {
+            ex.printStackTrace();
             return R.error(ex.getMessage());
         }
 
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 d97b8f7..66dc01f 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
@@ -152,6 +152,11 @@
             pointNos.add(s);
             dataMap.putAll(measureHandle.getCurrent(pointNos));
             dataMap.putAll(constantHandle.getCurrent(pointNos));
+            if (dataMap.get(s) == null) {
+                log.info("计算点数据异常");
+                log.info("pointNo=" + dto.getPointNo() +";dataMap.key=" + s);
+                return CommonConstant.BAD_VALUE;
+            }
             String valueStr =  dataMap.get(s).toString();
             if (StrUtils.isNumeric(valueStr) && new BigDecimal(valueStr).compareTo(CommonConstant.BAD_VALUE) == 0) {
                 log.info("BAD_VALUE:" + s);
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 27cfad0..fd55e6d 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
@@ -120,9 +120,7 @@
     private void toCommonResult(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> tagValues,
                           Map<String, Object> dataMap, List<InfluxPointValuePOJO> result,List<String> listGood,List<String> listBad) {
         if (!CollectionUtils.isEmpty(tagValues)) {
-            tagValues.forEach((k, v) -> {
-                dataMap.put(k, v);
-            });
+//            dataMap.putAll(tagValues);
             dtos.forEach(dto -> {
                 String tagId = TagUtils.genTagId(dto.getSourceType(), dto.getSourceName(), dto.getTagNo());
                 if (tagValues.containsKey(tagId)) {
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/DaPointDao.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/DaPointDao.java
index c97c35c..e5589c2 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/DaPointDao.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/DaPointDao.java
@@ -3,12 +3,15 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
 import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.data.api.point.dto.ApiPointDTO;
 import com.iailab.module.data.point.dto.DaPointDTO;
 import com.iailab.module.data.point.entity.DaPointEntity;
 import com.iailab.module.data.point.vo.DaPointPageReqVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaMathPointService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaMathPointService.java
index 864af89..ce5feb2 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaMathPointService.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaMathPointService.java
@@ -1,8 +1,14 @@
 package com.iailab.module.data.point.service;
 
 import com.iailab.framework.common.service.BaseService;
+import com.iailab.framework.common.validation.group.AddGroup;
+import com.iailab.framework.common.validation.group.UpdateGroup;
 import com.iailab.module.data.point.entity.DaMathPointEntity;
 import com.iailab.module.data.point.dto.DaMathPointDTO;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.util.List;
 
 /**
  * @author PanZhibao
@@ -22,4 +28,5 @@
     void deleteBatch(String[] ids);
 
     void deleteByPoint(String[] ids);
+
 }
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointService.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointService.java
index 0249769..f2d0dec 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointService.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointService.java
@@ -5,6 +5,8 @@
 import com.iailab.module.data.point.dto.DaPointDTO;
 import com.iailab.module.data.point.vo.*;
 
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaMathPointServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaMathPointServiceImpl.java
index 5014dd2..ec6bd8c 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaMathPointServiceImpl.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaMathPointServiceImpl.java
@@ -10,6 +10,8 @@
 import org.springframework.stereotype.Service;
 
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.util.UUID;
 
 /**
@@ -61,4 +63,5 @@
         wrapper.in("point_id", Arrays.asList(ids));
         baseDao.delete(wrapper);
     }
+
 }
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java
index b365cb9..beada3c 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java
@@ -6,7 +6,9 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.iailab.framework.common.constant.Constant;
 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.data.api.point.dto.ApiPointDTO;
@@ -45,7 +47,7 @@
  * @createTime 2024年09月2日
  */
 @Service
-public class DaPointServiceImpl extends ServiceImpl<DaPointDao, DaPointEntity> implements DaPointService {
+public class DaPointServiceImpl extends BaseServiceImpl<DaPointDao, DaPointEntity> implements DaPointService {
 
     @Autowired
     private DaMeasurePointService daMeasurePointService;
@@ -395,7 +397,7 @@
         importPoints.forEach(importPoint -> {
 
             // 判断如果不存在,再进行插入
-            DaPointEntity existPoint = baseMapper.selectByPointName(importPoint.getPointName());
+            DaPointEntity existPoint = baseDao.selectByPointName(importPoint.getPointName());
             if (existPoint == null) {
                 DaPointEntity daPointEntity = ConvertUtils.sourceToTarget(importPoint, DaPointEntity.class);
                 daPointEntity.setId(UUID.randomUUID().toString());
@@ -444,7 +446,7 @@
 
             DaPointEntity updatePoint = BeanUtils.toBean(importPoint, DaPointEntity.class);
             updatePoint.setId(existPoint.getId());
-            baseMapper.updateById(updatePoint);
+            baseDao.updateById(updatePoint);
             DaMeasurePointEntity measurePoint = new DaMeasurePointEntity();
             measurePoint.setSourceType(importPoint.getSourceType());
             measurePoint.setSourceId(sourcesIdMap.get(importPoint.getSourceType()).get(importPoint.getSourceName()));
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/vo/DaPointPageReqVO.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/vo/DaPointPageReqVO.java
index 7c7d21d..cf2fb6e 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/vo/DaPointPageReqVO.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/vo/DaPointPageReqVO.java
@@ -6,6 +6,8 @@
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
+import java.util.List;
+
 /**
  * @author lirm
  * @Description
@@ -32,4 +34,6 @@
     private Integer isEnable;
 
     private String collectQuality;
+
+    private List<String> pointNos;
 }
\ No newline at end of file
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml b/iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml
index 4cf6525..7c52b23 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml
+++ b/iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml
@@ -170,7 +170,7 @@
       - t_http_tag
       - t_http_token
       - t_ind_data_set
-      - t_ind_data_set_field8982
+      - t_ind_data_set_field
       - t_ind_item_category
       - t_ind_item
       - t_ind_item_atom
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 4b08398..a994c6e 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
@@ -71,6 +71,12 @@
             <if test="params.collectQuality != null and params.collectQuality != ''">
                 and t6.collect_quality = #{params.collectQuality}
             </if>
+            <if test="params.pointNos != null">
+                AND t1.point_no in
+                <foreach collection="params.pointNos" item="item" index="item" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
         </where>
         order by t1.create_time desc, t1.point_no desc
     </select>
@@ -286,5 +292,14 @@
             </if>
         </where>
     </select>
+    <select id="getPointPage" parameterType="map" resultType="com.iailab.module.data.api.point.dto.ApiPointDTO">
+        select point_no pointNo,point_name pointName from t_da_point
+        <where>
+            point_no in
+            <foreach item="value" collection="paramsMap.values" separator="," open="(" close=")">
+                '${value}'
+            </foreach>
+        </where>
+    </select>
 
 </mapper>
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
index 7a70e0a..1deb278 100644
--- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
@@ -11,6 +11,7 @@
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -101,7 +102,19 @@
     @Operation(summary = "获取多个预测项Double类型数据")
     Map<String, Map<String, Double>> getPreDoubleData(PreDoubleDataReqVO reqVO);
 
-    /*@PostMapping(PREFIX + "/predict-data/last-value")
+    @PostMapping(PREFIX + "/predict-data/last-value")
     @Operation(summary = "获取最后预测值")
-    Double getPredictLastValue();*/
+    Map<String, BigDecimal> getPredictLastValue(@RequestBody PredictLastValueReqVO reqVO);
+
+    @GetMapping("/predict-data/electric")
+    @Operation(summary = "电力功率因数预测结果查询")
+    Map<String,List<Object[]>> getElectricPredictData(String itemCode);
+
+    @GetMapping("/schedule-data/last")
+    @Operation(summary = "调度模型最新结果查询")
+    String getLastScheduleData(String scheduleCode);
+
+    @GetMapping("/machineRealTimeStatus")
+    @Operation(summary = "发电机组实时状态查询")
+    List<Map<String, Object>> getRealTimeStatus(@RequestBody List<Map<String, Object>> machines);
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java
index ded569b..7713ffd 100644
--- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java
@@ -57,6 +57,9 @@
     @Schema(description = "运行下限")
     private BigDecimal limitL;
 
+    @Schema(description = "当前")
+    private BigDecimal currValue;
+
     @Schema(description = "最大值")
     private BigDecimal maxValue;
 
@@ -110,4 +113,10 @@
 
     @Schema(description = "预警信息")
     private List<AlarmMessageRespDTO> alarmList;
+
+    @Schema(description = "预警信息")
+    private String alarmMessage;
+
+    @Schema(description = "展示线类型")
+    private String lineType;
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictLastValueReqVO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictLastValueReqVO.java
new file mode 100644
index 0000000..fccd0d9
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictLastValueReqVO.java
@@ -0,0 +1,18 @@
+package com.iailab.module.model.api.mcs.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年01月14日
+ */
+@Schema(description = "RPC 模型 - 预警和建议 DTO")
+@Data
+public class PredictLastValueReqVO {
+
+    private List<String[]> itemNos;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/db/mysql.sql b/iailab-module-model/iailab-module-model-biz/db/mysql.sql
index 8781409..6f9c092 100644
--- a/iailab-module-model/iailab-module-model-biz/db/mysql.sql
+++ b/iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -146,7 +146,7 @@
     id          varchar(36) not null,
     outputid    varchar(36),
     predicttime datetime,
-    jsonvalue   varchar(6400),
+    jsonvalue   text,
     cumulant    varchar(36),
     primary key (id),
     INDEX       idx_outputid (outputid),
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 3dade90..cdc43e1 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
@@ -26,6 +26,7 @@
 import com.iailab.module.model.mcs.pre.vo.MmPredictAlarmMessageSaveReqVO;
 import com.iailab.module.model.mcs.pre.vo.MmPredictItemRespVO;
 import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity;
+import com.iailab.module.model.mcs.sche.service.StScheduleRecordService;
 import com.iailab.module.model.mcs.sche.service.StScheduleSchemeService;
 import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService;
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestSaveReqVO;
@@ -40,6 +41,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -93,6 +95,9 @@
 
     @Autowired
     private StScheduleSchemeService stScheduleSchemeService;
+
+    @Autowired
+    private StScheduleRecordService stScheduleRecordService;
 
     @Autowired
     private ChartParamService chartParamService;
@@ -150,7 +155,13 @@
         }
         Date predictTime = reqVO.getPredictTime();
         if (predictTime == null) {
-            MmItemOutputEntity output = mmItemOutputService.getOutPutById(reqVO.getOutIds().get(0));
+            MmItemOutputEntity output = null;
+            for (String outId : outIds) {
+                output = mmItemOutputService.getOutPutById(outId);
+                if (output != null) {
+                    break;
+                }
+            }
             ItemVO predictItem = mmPredictItemService.getItemByIdFromCache(output.getItemid());
             if (predictItem.getLastTime() != null) {
                 predictTime = predictItem.getLastTime();
@@ -329,10 +340,10 @@
         }
         String timeFormat = StringUtils.isBlank(reqVO.getTimeFormat()) ? DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND : reqVO.getTimeFormat();
         PreLineTypeEnum lineType = chartParams.get(CommonConstant.LINE_TYPE) == null ? PreLineTypeEnum.TN : PreLineTypeEnum.getEumByCode(chartParams.get(CommonConstant.LINE_TYPE));
-        BigDecimal rangeH = chartParams.get(CommonConstant.RANGE_H) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.RANGE_H));
-        BigDecimal rangeL = chartParams.get(CommonConstant.RANGE_L) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.RANGE_L));
-        BigDecimal limitH = chartParams.get(CommonConstant.LIMIT_H) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.LIMIT_H));
-        BigDecimal limitL = chartParams.get(CommonConstant.LIMIT_L) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.LIMIT_L));
+        BigDecimal rangeH = chartParams.get(CommonConstant.RANGE_H) == null ? null : new BigDecimal(chartParams.get(CommonConstant.RANGE_H));
+        BigDecimal rangeL = chartParams.get(CommonConstant.RANGE_L) == null ? null : new BigDecimal(chartParams.get(CommonConstant.RANGE_L));
+        BigDecimal limitH = chartParams.get(CommonConstant.LIMIT_H) == null ? null : new BigDecimal(chartParams.get(CommonConstant.LIMIT_H));
+        BigDecimal limitL = chartParams.get(CommonConstant.LIMIT_L) == null ? null : new BigDecimal(chartParams.get(CommonConstant.LIMIT_L));
         int lengthLeft = chartParams.get(CommonConstant.LENGTH_LEFT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_LEFT)).intValue();
         int lengthRight = chartParams.get(CommonConstant.LENGTH_RIGHT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_RIGHT)).intValue();
 
@@ -358,6 +369,7 @@
             dataView.setRealData(new ArrayList<>());
         }
         dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat));
+        dataView.setLineType(lineType.getCode());
         switch (lineType) {
             case TN:
                 dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), startTime, endTime, timeFormat));
@@ -369,6 +381,10 @@
             default:
                 break;
         }
+        if (!CollectionUtils.isEmpty(dataView.getRealData())) {
+            Object[] rdo = dataView.getRealData().get(dataView.getRealData().size() - 1);
+            dataView.setCurrValue(new BigDecimal(rdo[1].toString()));
+        }
 
         if (!CollectionUtils.isEmpty(dataView.getCurData())) {
             List<Double> curList = dataView.getCurData().stream().map(t -> {
@@ -376,12 +392,20 @@
             }).collect(Collectors.toList());
             dataView.setPreMax(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
             dataView.setPreMin(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
+            dataView.setPreLast(new BigDecimal(curList.get(curList.size() - 1)));
+            dataView.setPreCumulant(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).sum())
+                    .divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP));
         }
 
         String alarmObj = chartParams.get(CommonConstant.ALARM_OBJ);
         if (StringUtils.isNotBlank(alarmObj)) {
             List<AlarmMessageRespDTO> alarmList = ConvertUtils.sourceToTarget(mmPredictAlarmMessageService.getList(alarmObj, predictTime), AlarmMessageRespDTO.class);
             dataView.setAlarmList(alarmList);
+            if (CollectionUtils.isEmpty(alarmList)) {
+                dataView.setAlarmMessage("暂无预警信息");
+            } else {
+                dataView.setAlarmMessage(alarmList.get(0).getContent());
+            }
         }
 
         result.setPredictTime(predictTime);
@@ -620,27 +644,146 @@
         return result;
     }
 
+    public Map<String, BigDecimal> getPredictLastValue(PredictLastValueReqVO reqVO) {
+        Map<String, BigDecimal> result = new HashMap<>(reqVO.getItemNos().size());
+        if (CollectionUtils.isEmpty(reqVO.getItemNos())) {
+            return result;
+        }
+        List<String[]> itemNos = reqVO.getItemNos();
+        for (String[] itemNo : itemNos) {
+            String key = itemNo[0] + "_" + itemNo[1] + "_" + itemNo[2];
+            ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemNo[0]);
+            if (predictItem == null || predictItem.getLastTime() == null) {
+                result.put(key, BigDecimal.ZERO);
+            }
+            MmItemOutputEntity outPut = mmItemOutputService.getByItemid(predictItem.getId(), itemNo[1], itemNo[2]);
+
+            Date predictTime = predictItem.getLastTime();
+            List<Object[]> curData = mmItemResultJsonService.getData(outPut.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
+            if(CollectionUtils.isEmpty(curData)) {
+                result.put(key, BigDecimal.ZERO);
+            } else {
+                result.put(key, new BigDecimal(curData.get(curData.size() - 1)[1].toString()));
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public Map<String,List<Object[]>> getElectricPredictData(String itemCode) {
+        ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemCode);
+        if (null == predictItem) {
+            return new HashMap<>();
+        }
+        List<Integer> resultIndexs = new ArrayList<>();
+        resultIndexs.add(0);
+        resultIndexs.add(1);
+        resultIndexs.add(2);
+        List<MmItemOutputEntity> outPuts = mmItemOutputService.getByItemid(predictItem.getId(),"predictValues",resultIndexs);
+        if (CollectionUtils.isEmpty(outPuts)) {
+            return new HashMap<>();
+        }
+        InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO();
+        pojo.setOutPutIds(outPuts.stream().map(MmItemOutputEntity::getId).collect(Collectors.toList()));
+        pojo.setType(DataTypeEnum.FLOAT.getCode());
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(predictItem.getLastTime());
+        calendar.add(Calendar.DAY_OF_YEAR, 7);
+        Map<String, List<InfluxModelResultVO>> outPutDatas = influxDBService.queryModelResultsByOutPutIds(pojo, predictItem.getLastTime(), calendar.getTime());
+        Map<String,List<Object[]>> result = new HashMap<>(outPuts.size());
+        for (MmItemOutputEntity outPut : outPuts) {
+            String outPutId = outPut.getId();
+            if (outPutDatas.containsKey(outPutId)) {
+                List<InfluxModelResultVO> influxModelResultVOS = outPutDatas.get(outPutId);
+                result.put(null == outPut.getResultIndex() ? outPut.getResultstr() : outPut.getResultstr()+"_"+outPut.getResultIndex(),influxModelResultVOS.stream().map(e -> {
+                    Object[] values = new Object[2];
+                    values[0] = DateUtils.format(Date.from(e.getTimestamp()), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
+                    values[1] = Double.valueOf(e.getValue().toString());
+                    return values;
+                }).collect(Collectors.toList()));
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public String getLastScheduleData(String scheduleCode) {
+        if (StringUtils.isBlank(scheduleCode)) {
+            return null;
+        }
+        return stScheduleRecordService.getLastScheduleResult(scheduleCode);
+    }
+
+    @Override
+    public List<Map<String, Object>> getRealTimeStatus(List<Map<String, Object>> machines) {
+        List<String> pointNos = new ArrayList<>(16);
+        for (Map<String, Object> machine : machines) {
+            List<String> list = (List<String>) machine.get("pointNos");
+            pointNos.addAll(list);
+        }
+        Map<String, Object> pointValues = dataPointApi.queryPointsRealValue(pointNos);
+        List<Map<String, Object>> results = new ArrayList<>();
+        for (Map<String, Object> machine : machines) {
+            List<String> pointNoList = (List<String>) machine.get("pointNos");
+            if (!pointValues.containsKey(pointNoList.get(0)) || !pointValues.containsKey(pointNoList.get(1))) {
+                machine.put("status",false);
+                machine.put("num",0);
+                results.add(machine);
+                continue;
+            }
+            Double PValue = Double.valueOf(pointValues.get(pointNoList.get(0)).toString());
+            Double QValue = Double.valueOf(pointValues.get(pointNoList.get(1)).toString());
+            Double cos = calculateCos(PValue, QValue);
+            if (cos.equals(0.0)) {
+                machine.put("status",false);
+                machine.put("num",0);
+            }else {
+                machine.put("status",true);
+                machine.put("num",cos);
+            }
+            results.add(machine);
+        }
+        return results;
+    }
+
+    /**
+     * 计算功率因数 p²/(根号:p²+Q²)
+     **/
+    public Double calculateCos(Double PValue,Double QValue) {
+        // 绝对值
+        PValue = Math.abs(PValue);
+        QValue = Math.abs(QValue);
+        //PValue [0,0.001] 直接判断为关闭返回0
+        if (PValue >= 0 && PValue <= 0.001) {
+            return 0.0;
+        }else {
+            BigDecimal result = new BigDecimal(PValue).divide(BigDecimal.valueOf(Math.sqrt(Math.pow(PValue, 2) + Math.pow(QValue, 2))), 2, BigDecimal.ROUND_HALF_UP);
+            return result.doubleValue();
+        }
+    }
+
     private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) {
         Date[] result = new Date[3];
         Date predictTime = predictItem.getLastTime();
+        Integer granularity = predictItem.getGranularity();
         Date startTime = startTimeReq;
         if (startTime == null) {
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(predictItem.getLastTime());
-            calendar.add(Calendar.MINUTE, -1 * lengthLeft);
+            calendar.add(Calendar.SECOND, -1 * lengthLeft * granularity);
             startTime = calendar.getTime();
         }
         Date endTime = endTimeReq;
         if (endTime == null) {
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(predictItem.getLastTime());
-            calendar.add(Calendar.MINUTE, lengthRight);
+            calendar.add(Calendar.SECOND, lengthRight * granularity);
             endTime = calendar.getTime();
         }
         if (endTime.getTime() <= startTime.getTime()) {
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(startTime);
-            calendar.add(Calendar.MINUTE, lengthRight);
+            calendar.add(Calendar.SECOND, lengthRight * granularity);
             endTime = calendar.getTime();
         }
         result[0] = predictTime;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
index d10dec7..f5fb719 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
@@ -7,6 +7,7 @@
 import com.iailab.module.model.api.mcs.dto.*;
 import com.iailab.module.model.common.utils.ApiSecurityUtils;
 import com.iailab.module.model.common.utils.ExcelUtil;
+import com.iailab.module.model.influxdb.vo.InfluxModelResultVO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
@@ -17,6 +18,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
@@ -170,4 +172,29 @@
         Map<String, Map<String,Double>> map = mcsApi.getPreDoubleData(reqVO);
         return CommonResult.success(map);
     }
+
+    @PostMapping("/predict-data/last-value")
+    @Operation(summary = "获取最后预测值")
+    public CommonResult<Map<String, BigDecimal>> getPredictLastValue(@RequestBody PredictLastValueReqVO reqVO) {
+        Map<String, BigDecimal> data = mcsApi.getPredictLastValue(reqVO);
+        return CommonResult.success(data);
+    }
+
+    @GetMapping("/predict-data/electric")
+    @Operation(summary = "电力功率因数预测结果查询")
+    public CommonResult<Map<String,List<Object[]>>> getElectricPredictData(@RequestParam String itemCode) {
+        Map<String,List<Object[]>> data = mcsApi.getElectricPredictData(itemCode);
+        return CommonResult.success(data);
+    }
+    @GetMapping("/schedule-data/last")
+    @Operation(summary = "调度模型最新结果查询")
+    public CommonResult<String> getLastScheduleData(@RequestParam String scheduleCode) {
+        return CommonResult.success(mcsApi.getLastScheduleData(scheduleCode));
+    }
+
+    @PostMapping("/machineRealTimeStatus")
+    @Operation(summary = "发电机组实时状态查询")
+    CommonResult<List<Map<String, Object>>> getRealTimeStatus(@RequestBody List<Map<String, Object>> machines) {
+        return CommonResult.success(mcsApi.getRealTimeStatus(machines));
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java
index e2dbb92..926b76a 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java
@@ -36,7 +36,7 @@
 
     private Set<String> isExistBucket = new HashSet<>();
 
-    private final static String BUCKET_NAME = "bucket_model_";
+    private final static String BUCKET_NAME = "bucket_";
 
     private Logger logger = LoggerFactory.getLogger(getClass());
 
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java
index 532b170..2676343 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java
@@ -16,5 +16,6 @@
     void asyncWriteModelResults(List<InfluxModelResultPOJO> pointValues);
 
     List<InfluxModelResultVO> queryModelResults(InfluxModelResultPOJO pojo, Date startTime, Date endTime);
+
     Map<String,List<InfluxModelResultVO>> queryModelResultsByOutPutIds(InfluxModelResultByOutPutIdsPOJO pojo, Date startTime, Date endTime);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java
index c006793..c1be4eb 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java
@@ -23,6 +23,7 @@
     List<MmItemOutputEntity> getByItemid(String itemId);
 
     MmItemOutputEntity getByItemid(String itemid, String resultstr, String resultIndex);
+    List<MmItemOutputEntity> getByItemid(String itemid, String resultstr, List<Integer> resultIndexs);
 
     void deleteByItemId(String itemId);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemOutputServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemOutputServiceImpl.java
index 0e3bdc7..ff058ab 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemOutputServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemOutputServiceImpl.java
@@ -84,6 +84,15 @@
     }
 
     @Override
+    public List<MmItemOutputEntity> getByItemid(String itemid, String resultstr, List<Integer> resultIndexs) {
+        QueryWrapper<MmItemOutputEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("itemid", itemid)
+                .eq("resultstr", resultstr)
+                .in(!CollectionUtils.isEmpty(resultIndexs), "result_index", resultIndexs);
+        return mmItemOutputDao.selectList(queryWrapper);
+    }
+
+    @Override
     public void deleteByItemId(String itemId) {
         QueryWrapper<MmItemOutputEntity> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("itemid", itemId);
@@ -101,7 +110,9 @@
             return outputMap.get(outputid);
         }
         MmItemOutputEntity entity = mmItemOutputDao.selectById(outputid);
-        outputMap.put(outputid, entity);
-        return entity;
+        if (entity != null) {
+            outputMap.put(outputid, entity);
+        }
+        return outputMap.get(outputid);
     }
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java
index 2c0cd2f..949727b 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java
@@ -25,4 +25,6 @@
                 .leIfPresent(StScheduleRecordEntity::getScheduleTime, reqVO.getEndTime())
                 .orderByDesc(StScheduleRecordEntity::getCreateTime));
     }
+
+    String getLastScheduleResult(String scheduleCode);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java
index 5fe5e6b..9af3014 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java
@@ -19,4 +19,6 @@
     StScheduleRecordRespVO getInfo(String id);
 
     void create(ScheduleResultVO resultVO);
+
+    String getLastScheduleResult(String scheduleCode);
 }
\ 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/StScheduleRecordServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java
index dd844be..8002344 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java
@@ -61,4 +61,9 @@
         baseDao.insert(entity);
         stScheduleRecordDetailService.create(entity.getId(), resultVO);
     }
+
+    @Override
+    public String getLastScheduleResult(String scheduleCode) {
+        return baseDao.getLastScheduleResult(scheduleCode);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java
index 5f5befc..5c7cda8 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java
@@ -63,8 +63,15 @@
             case MERGEITEM:
                 // 预测值
                 oneMin = granularity * 1000L;
-                start = start - (start % oneMin);
-                end = end - (end % oneMin);
+                // 设置时间偏移量
+                if (granularity >= 24*60*60) {
+                    // 如果时间粒度大于等于一天,因为时区问题,特殊处理,否则时间为8:00,而非0:00
+                    start = start - ((start+8*60*60*1000) % oneMin);
+                    end = end - ((end+8*60*60*1000) % oneMin);
+                } else {
+                    start = start - (start % oneMin);
+                    end = end - (end % oneMin);
+                }
                 mins = ((end - start) / oneMin);
                 break;
             case DATAPOINT:
@@ -72,8 +79,14 @@
                 // 测点值
                 oneMin = 1000L * granularity;
                 // 设置时间偏移量
-                start = start - (start % oneMin) + oneMin;
-                end = end - (end % oneMin) + oneMin;
+                if (granularity >= 24*60*60) {
+                    // 如果时间粒度大于等于一天,因为时区问题,特殊处理,否则时间为8:00,而非0:00
+                    start = start - ((start+8*60*60*1000) % oneMin);
+                    end = end - ((end+8*60*60*1000) % oneMin);
+                } else {
+                    start = start - (start % oneMin);
+                    end = end - (end % oneMin);
+                }
                 mins = ((end - start) / oneMin);
                 break;
             case IND:
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml
new file mode 100644
index 0000000..ebfceed
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.iailab.module.model.mcs.sche.dao.StScheduleRecordDao">
+    <select id="getLastScheduleResult" resultType="java.lang.String">
+        SELECT t2.result_data FROM t_st_schedule_scheme t1 LEFT JOIN t_st_schedule_record t2 on t1.id = t2.scheme_id
+        WHERE t1.`code` = #{scheduleCode} AND result_code = "100"
+        ORDER BY t2.schedule_time desc
+        LIMIT 1
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3