From b3674cefbeb8ffaf49f96d0c8fe7a6694ed86eec Mon Sep 17 00:00:00 2001
From: 潘志宝 <979469083@qq.com>
Date: 星期二, 25 二月 2025 15:05:32 +0800
Subject: [PATCH] 模拟调整 远程调用

---
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java                                   |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java  |   47 ++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java |   20 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java           |    9 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java         |   22 +-
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java          |   33 +--
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/PredictItemTypeEnum.java                        |   33 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java                        |   16 +
 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictSimAdjustReqDTO.java            |   32 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java          |    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/mdk/predict/impl/PredictItemNormalHandlerImpl.java    |   31 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java                                   |   48 ++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java     |  140 +++++++------
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java                  |    7 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java              |    1 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java                   |   16 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java                     |    7 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/StAdjustDeviationDTO.java                      |   20 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java                 |   44 +++-
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java                 |   30 +-
 21 files changed, 425 insertions(+), 138 deletions(-)

diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java
index 5b391f0..541d1dc 100644
--- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java
@@ -29,6 +29,10 @@
     @Operation(summary = "执行单独预测")
     MdkPredictItemRespDTO predictItem(@Valid @RequestBody MdkPredictReqDTO reqDTO);
 
+    @PostMapping(PREFIX + "/predict-sim-adjust")
+    @Operation(summary = "模拟调整")
+    Boolean predictSimAdjust(@Valid @RequestBody MdkPredictSimAdjustReqDTO reqDTO);
+
     @PostMapping(PREFIX + "/predict-adjust")
     @Operation(summary = "预测自动调整")
     Boolean predictAutoAdjust(@Valid @RequestBody MdkPredictReqDTO reqDTO);
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictSimAdjustReqDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictSimAdjustReqDTO.java
new file mode 100644
index 0000000..e4092fc
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictSimAdjustReqDTO.java
@@ -0,0 +1,32 @@
+package com.iailab.module.model.api.mdk.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年02月24日
+ */
+@Schema(description = "RPC 模型 - 模拟调整 DTO")
+@Data
+public class MdkPredictSimAdjustReqDTO {
+
+    @Schema(description = "预测时间")
+    @NotNull(message="预测时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date predictTime;
+
+    @Schema(description = "调度方案编号")
+    @NotNull(message="调度方案编号不能为空")
+    private String scheduleCode;
+
+    @Schema(description = "调度模型结果")
+    @NotNull(message="调度模型结果不能为空")
+    private Map<String, Object> modelResult;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/PredictItemTypeEnum.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/PredictItemTypeEnum.java
new file mode 100644
index 0000000..ed96f89
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/enums/PredictItemTypeEnum.java
@@ -0,0 +1,33 @@
+package com.iailab.module.model.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年02月24日
+ */
+@Getter
+@AllArgsConstructor
+public enum PredictItemTypeEnum {
+
+    NormalItem("48dffaa8-ac91-42f4-9369-79c9c2080ef5", "com.iailab.predictHandler.impl.PredictItemImpl"),
+    MergeItem("773ed6fb-3929-47c0-8749-0d6d11111111", "com.iailab.predictHandler.impl.PredictMergeItemImpl");
+
+    private String id;
+    private String type;
+
+    public static PredictItemTypeEnum getEumById(String id) {
+        if (id == null) {
+            return null;
+        }
+
+        for (PredictItemTypeEnum statusEnum : PredictItemTypeEnum.values()) {
+            if (statusEnum.getId().equals(id)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java
index bc62e43..399c022 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java
@@ -1,7 +1,6 @@
 package com.iailab.module.model.api;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.iailab.module.data.api.point.DataPointApi;
 import com.iailab.module.data.api.point.dto.ApiPointValueWriteDTO;
 import com.iailab.module.model.api.mcs.dto.StScheduleModelOutDTO;
@@ -9,21 +8,21 @@
 import com.iailab.module.model.api.mdk.dto.*;
 import com.iailab.module.model.common.enums.IsWriteEnum;
 import com.iailab.module.model.common.enums.ModelOutResultType;
-import com.iailab.module.model.common.enums.OutResultType;
 import com.iailab.module.model.enums.CommonConstant;
+import com.iailab.module.model.enums.PredictItemTypeEnum;
 import com.iailab.module.model.mcs.pre.entity.DmModuleEntity;
 import com.iailab.module.model.mcs.pre.service.DmModuleService;
 import com.iailab.module.model.mcs.pre.service.MmPredictItemService;
+import com.iailab.module.model.mcs.sche.entity.StAdjustConfigDetEntity;
+import com.iailab.module.model.mcs.sche.entity.StScheduleSchemeEntity;
+import com.iailab.module.model.mcs.sche.service.StAdjustConfigService;
 import com.iailab.module.model.mcs.sche.service.StScheduleModelOutService;
 import com.iailab.module.model.mcs.sche.service.StScheduleRecordService;
 import com.iailab.module.model.mcs.sche.service.StScheduleSchemeService;
 import com.iailab.module.model.mdk.predict.PredictModuleHandler;
 import com.iailab.module.model.mdk.predict.PredictResultHandler;
 import com.iailab.module.model.mdk.schedule.ScheduleModelHandler;
-import com.iailab.module.model.mdk.vo.DataValueVO;
-import com.iailab.module.model.mdk.vo.ItemVO;
-import com.iailab.module.model.mdk.vo.PredictResultVO;
-import com.iailab.module.model.mdk.vo.ScheduleResultVO;
+import com.iailab.module.model.mdk.vo.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,11 +31,10 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
-
-import static com.iailab.module.model.common.enums.ModelOutResultType.D;
 
 /**
  * @author PanZhibao
@@ -74,6 +72,9 @@
 
     @Autowired
     private DataPointApi dataPointApi;
+
+    @Autowired
+    private StAdjustConfigService stAdjustConfigService;
 
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
@@ -193,6 +194,37 @@
         return resp;
     }
 
+    @Override
+    public Boolean predictSimAdjust(MdkPredictSimAdjustReqDTO reqDTO) {
+        StScheduleSchemeEntity scheduleScheme = stScheduleSchemeService.getByCode(reqDTO.getScheduleCode());
+        List<StAdjustConfigDetEntity> detList = stAdjustConfigService.getDetByModelId(scheduleScheme.getModelId());
+        if (CollectionUtils.isEmpty(detList)) {
+            return Boolean.FALSE;
+        }
+        for (StAdjustConfigDetEntity det : detList) {
+            ItemVO predictItem = mmPredictItemService.getItemById(det.getPredictItemId());
+            List<StAdjustDeviationDTO> deviationList = new ArrayList<>();
+            switch (PredictItemTypeEnum.getEumById(det.getItemTypeId())) {
+                case NormalItem:
+                    double adjustValue = new BigDecimal(reqDTO.getModelResult().get(det.getOutKey()).toString()).doubleValue();
+                    StAdjustDeviationDTO deviationItem = new StAdjustDeviationDTO();
+                    deviationItem.setPortIdx(det.getModelParamPortOrder());
+                    deviationItem.setParamIdx(det.getModelParamPortOrder());
+                    deviationItem.setValue(adjustValue);
+                    deviationList.add(deviationItem);
+                    break;
+                case MergeItem:
+                    break;
+                default:
+                    break;
+            }
+            // 开始预测
+            predictModuleHandler.predictAdjust(predictItem, reqDTO.getPredictTime(), deviationList, scheduleScheme.getModelId());
+        }
+        return Boolean.TRUE;
+    }
+
+
     /**
      * 预测调整
      *
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 c1be4eb..195dcf0 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/MmItemResultJsonService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java
index a93f01b..cd2e250 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java
@@ -18,6 +18,8 @@
 
     List<Object[]> getData(String outputId, Date predictTime, String timeFormat, int scale);
 
+    double[] getSimpleData(String outputId, Date predictTime, int predictLength);
+
     void insert(List<MmItemResultJsonEntity> resultJsonList);
 
     void cleanResultJson(Map<String, Date> tMap);
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java
index 210c467..bc61c47 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java
@@ -1,6 +1,5 @@
 package com.iailab.module.model.mcs.pre.service;
 
-import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
 import com.iailab.module.model.mdk.vo.DataValueVO;
 
 import java.util.Date;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java
index ecb19ba..fe4005a 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java
@@ -72,6 +72,26 @@
     }
 
     @Override
+    public double[] getSimpleData(String outputId, Date predictTime, int predictLength) {
+        double[] result = new double[predictLength];
+        QueryWrapper<MmItemResultJsonEntity> wrapper = new QueryWrapper<>();
+        wrapper.eq("outputid", outputId)
+                .eq("predicttime", DateUtils.format(predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
+        MmItemResultJsonEntity data = baseDao.selectOne(wrapper);
+        if (data == null || StringUtils.isBlank(data.getJsonvalue())) {
+            return null;
+        }
+        List<Double> valueList = JSONArray.parseArray(data.getJsonvalue(), Double.class);
+        if (CollectionUtils.isEmpty(valueList)) {
+            return result;
+        }
+        for (int i = 0; i < predictLength; i++) {
+            result[i] = valueList.get(i);
+        }
+        return result;
+    }
+
+    @Override
     public void insert(List<MmItemResultJsonEntity> resultJsonList) {
         baseDao.insertBatch(resultJsonList);
     }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java
index d6f9673..8611414 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StAdjustResultService.java
@@ -2,6 +2,11 @@
 
 import com.iailab.framework.common.service.BaseService;
 import com.iailab.module.model.mcs.sche.entity.StAdjustResultEntity;
+import com.iailab.module.model.mdk.vo.DataValueVO;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @author PanZhibao
@@ -9,4 +14,8 @@
  * @createTime 2025年02月23日
  */
 public interface StAdjustResultService extends BaseService<StAdjustResultEntity> {
+
+    void saveResult(Map<String, List<DataValueVO>> resultMap, Date predictTime, String adjustValue, String scheduleModelId);
+
+    double[] getSimpleData(String outputId, Date predictTime, int predictLength);
 }
\ 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/StAdjustResultServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java
index 1f93c8a..68c8485 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StAdjustResultServiceImpl.java
@@ -1,11 +1,23 @@
 package com.iailab.module.model.mcs.sche.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.date.DateUtils;
 import com.iailab.module.model.mcs.sche.dao.StAdjustResultDao;
 import com.iailab.module.model.mcs.sche.entity.StAdjustResultEntity;
 import com.iailab.module.model.mcs.sche.service.StAdjustResultService;
+import com.iailab.module.model.mdk.vo.DataValueVO;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
 /**
  * @author PanZhibao
@@ -15,4 +27,39 @@
 @Slf4j
 @Service
 public class StAdjustResultServiceImpl extends BaseServiceImpl<StAdjustResultDao, StAdjustResultEntity> implements StAdjustResultService {
+
+    @Override
+    public void saveResult(Map<String, List<DataValueVO>> resultMap, Date predictTime, String adjustValue, String scheduleModelId) {
+        for (Map.Entry<String, List<DataValueVO>> entry : resultMap.entrySet()) {
+            StAdjustResultEntity entity = new StAdjustResultEntity();
+            entity.setId(UUID.randomUUID().toString());
+            entity.setScheduleModelId(scheduleModelId);
+            entity.setAdjustTime(predictTime);
+            entity.setAdjustValue(adjustValue);
+            entity.setOutputId(entry.getKey());
+            List<Double> jsonValueList = entry.getValue().stream().map(valueVO -> valueVO.getDataValue()).collect(Collectors.toList());
+            entity.setAdjustValue(JSONArray.toJSONString(jsonValueList));
+            baseDao.insert(entity);
+        }
+    }
+
+    @Override
+    public double[] getSimpleData(String outputId, Date predictTime, int predictLength) {
+        double[] result = new double[predictLength];
+        QueryWrapper<StAdjustResultEntity> wrapper = new QueryWrapper<>();
+        wrapper.eq("output_id", outputId)
+                .eq("adjust_time", DateUtils.format(predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
+        StAdjustResultEntity data = baseDao.selectOne(wrapper);
+        if (data == null || StringUtils.isBlank(data.getAdjustValue())) {
+            return null;
+        }
+        List<Double> valueList = JSONArray.parseArray(data.getAdjustValue(), Double.class);
+        if (CollectionUtils.isEmpty(valueList)) {
+            return result;
+        }
+        for (int i = 0; i < predictLength; i++) {
+            result[i] = valueList.get(i);
+        }
+        return result;
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java
index 2c4cf78..bcc5f54 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java
@@ -1,11 +1,14 @@
 package com.iailab.module.model.mdk.predict;
 
+import com.iailab.module.model.common.exception.ModelResultErrorException;
 import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum;
 import com.iailab.module.model.mdk.common.exceptions.ItemInvokeException;
 import com.iailab.module.model.mdk.vo.ItemVO;
 import com.iailab.module.model.mdk.vo.PredictResultVO;
+import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
 
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -20,8 +23,21 @@
      *
      * @param predictTime
      * @param predictItemDto
+     * @param predictValueMap
      * @return
      * @throws ItemInvokeException
      */
     PredictResultVO predict(Date predictTime, ItemVO predictItemDto, Map<String, double[]> predictValueMap) throws ItemInvokeException;
+
+    /**
+     * 单个预测项预测(模拟调整)
+     *
+     * @param predictTime
+     * @param predictItemDto
+     * @param deviationList
+     * @return
+     * @throws ItemInvokeException
+     * @throws ModelResultErrorException
+     */
+    PredictResultVO predictAdjust(Date predictTime, ItemVO predictItemDto, List<StAdjustDeviationDTO> deviationList) throws ItemInvokeException, ModelResultErrorException;
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java
index f173849..ef774fb 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java
@@ -1,11 +1,12 @@
 package com.iailab.module.model.mdk.predict;
 
+import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
 import com.iailab.module.model.mcs.pre.entity.MmPredictModelEntity;
-import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum;
 import com.iailab.module.model.mdk.common.exceptions.ModelInvokeException;
 import com.iailab.module.model.mdk.vo.PredictResultVO;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author PanZhibao
@@ -31,8 +32,8 @@
      * @param predictModel
      * @param itemName
      * @param itemNo
-     * @param deviation
+     * @param adjustValList
      * @return
      */
-    PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel,String itemName,String itemNo, double[][] deviation) throws ModelInvokeException;
+    PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel,String itemName,String itemNo, List<StAdjustDeviationDTO> adjustValList) throws ModelInvokeException;
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java
index 76d88ec..d0cfb77 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java
@@ -1,5 +1,6 @@
 package com.iailab.module.model.mdk.predict;
 
+import com.alibaba.fastjson.JSONArray;
 import com.iailab.module.model.common.exception.ModelResultErrorException;
 import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
 import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum;
@@ -9,6 +10,7 @@
 import com.iailab.module.model.mdk.factory.PredictItemFactory;
 import com.iailab.module.model.mdk.vo.ItemVO;
 import com.iailab.module.model.mdk.vo.PredictResultVO;
+import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -45,14 +47,14 @@
      * @param intervalTime
      * @return
      */
-    public void predict(List<ItemVO> predictItemList, Date predictTime, int intervalTime,Map<String, PredictResultVO> predictResultMap) {
+    public void predict(List<ItemVO> predictItemList, Date predictTime, int intervalTime, Map<String, PredictResultVO> predictResultMap) {
         Map<String, double[]> predictValueMap = null;
         if (!CollectionUtils.isEmpty(predictResultMap)) {
             // 将predictResultMap处理成Map<outPutId, double[]>
             predictValueMap = new HashMap<>();
             for (Map.Entry<String, PredictResultVO> entry : predictResultMap.entrySet()) {
                 for (Map.Entry<MmItemOutputEntity, double[]> mmItemOutputEntityEntry : entry.getValue().getPredictMatrixs().entrySet()) {
-                    predictValueMap.put(mmItemOutputEntityEntry.getKey().getId(),mmItemOutputEntityEntry.getValue());
+                    predictValueMap.put(mmItemOutputEntityEntry.getKey().getId(), mmItemOutputEntityEntry.getValue());
                 }
             }
         }
@@ -63,10 +65,10 @@
             calendar.set(Calendar.MILLISECOND, 0);
             calendar.set(Calendar.SECOND, 0);
             if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) {
-                calendar.set(Calendar.MINUTE,0);
-            }else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) {
-                calendar.set(Calendar.MINUTE,0);
-                calendar.set(Calendar.HOUR_OF_DAY,0);
+                calendar.set(Calendar.MINUTE, 0);
+            } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) {
+                calendar.set(Calendar.MINUTE, 0);
+                calendar.set(Calendar.HOUR_OF_DAY, 0);
             }
             PredictResultVO predictResult;
             if (!predictItem.getStatus().equals(ItemStatus.STATUS1.getCode())) {
@@ -106,11 +108,6 @@
                     throw new RuntimeException("模型结果保存异常,result:" + predictResult);
                 }
                 itemRunStatusEnum = ItemRunStatusEnum.SUCCESS;
-//                long endSave = System.currentTimeMillis();
-//                Long drtSave = endSave - end;
-//                log.info(MessageFormat.format("预测项:{0},保存时间:{1}ms", predictItem.getItemName(),
-//                        drtSave));
-//                totalDur = totalDur + drtSave;
             } catch (Exception e) {
                 e.printStackTrace();
                 log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}",
@@ -120,4 +117,29 @@
             }
         }
     }
+
+    public void predictAdjust(ItemVO predictItem, Date predictTime, List<StAdjustDeviationDTO> deviationList, String scheduleModelId) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(predictTime);
+        calendar.set(Calendar.MILLISECOND, 0);
+        calendar.set(Calendar.SECOND, 0);
+        if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) {
+            calendar.set(Calendar.MINUTE, 0);
+        } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) {
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
+        }
+
+        try {
+            PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId());
+            PredictResultVO predictResult = predictItemHandler.predictAdjust(calendar.getTime(), predictItem, deviationList);
+
+            // 保存预测结果
+            predictResultHandler.savePredictAdjustResult(predictResult, JSONArray.toJSONString(deviationList), scheduleModelId);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}",
+                    predictItem.getId(), predictItem.getItemName(), e.getMessage(), predictTime));
+        }
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java
index 89c3866..ebaee0f 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java
@@ -4,11 +4,11 @@
 import com.iailab.module.model.common.enums.CommonDict;
 import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
 import com.iailab.module.model.mcs.pre.service.MmItemResultService;
+import com.iailab.module.model.mcs.sche.service.StAdjustResultService;
 import com.iailab.module.model.mdk.factory.ItemEntityFactory;
 import com.iailab.module.model.mdk.vo.DataValueVO;
 import com.iailab.module.model.mdk.vo.PredictResultVO;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -23,6 +23,9 @@
     @Autowired
     private ItemEntityFactory itemEntityFactory;
 
+    @Autowired
+    private StAdjustResultService stAdjustResultService;
+
     /**
      * convertToPredictData
      *
@@ -31,15 +34,9 @@
      */
     public Map<String, List<DataValueVO>> convertToPredictData(PredictResultVO predictResult) {
         Map<String, List<DataValueVO>> resultMap = new HashMap<>();
-//        List<MmItemOutputEntity> itemOutPutList = itemEntityFactory.getOutPutByItemId(predictResult.getPredictId());
-//
-//        if (!CollectionUtils.isEmpty(predictResult.getPredictList())) {
-//            resultMap.put(itemOutPutList.get(0).getId(), predictResult.getPredictList());
-//            return resultMap;
-//        }
-        Map<com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity, double[]> predictMatrixs = predictResult.getPredictMatrixs();
-        HashMap<String,List<DataValueVO>> predictLists = new HashMap<>();
-        for (Map.Entry<com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity, double[]> entry : predictMatrixs.entrySet()) {
+        Map<MmItemOutputEntity, double[]> predictMatrixs = predictResult.getPredictMatrixs();
+        HashMap<String, List<DataValueVO>> predictLists = new HashMap<>();
+        for (Map.Entry<MmItemOutputEntity, double[]> entry : predictMatrixs.entrySet()) {
             Integer rows = entry.getValue().length;
             List<DataValueVO> predictDataList = new ArrayList<>();
             Calendar calendar = Calendar.getInstance();
@@ -57,7 +54,7 @@
 
             //处理累计计算
             if (entry.getKey().getIscumulant() == 1) {
-                resultMap.put(entry.getKey().getId() + CommonDict.CUMULANT_SUFFIX, new ArrayList<DataValueVO>(){{
+                resultMap.put(entry.getKey().getId() + CommonDict.CUMULANT_SUFFIX, new ArrayList<DataValueVO>() {{
                     DataValueVO predictData = new DataValueVO();
                     // 时间 预测时间+预测长度*粒度
                     Calendar calendar = Calendar.getInstance();
@@ -111,6 +108,17 @@
         mmItemResultService.savePredictValue(resultMap, predictResult.getLt(), "n", predictResult.getPredictTime());
     }
 
+    /**
+     * savePredictAdjustResult
+     *
+     * @param predictResult
+     */
+    @DSTransactional
+    public void savePredictAdjustResult(PredictResultVO predictResult, String adjustValue, String scheduleModelId) {
+        Map<String, List<DataValueVO>> resultMap = convertToPredictData(predictResult);
+        stAdjustResultService.saveResult(resultMap, predictResult.getPredictTime(), adjustValue, scheduleModelId);
+    }
+
     public List<DataValueVO> getPredictValueByItemNo(String itemNo, Date start, Date end) {
         String itemId = itemEntityFactory.getItemByItemNo(itemNo).getId();
         List<MmItemOutputEntity> outputList = itemEntityFactory.getOutPutByItemId(itemId);
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java
index 31d481e..cbcaf87 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java
@@ -1,17 +1,16 @@
 package com.iailab.module.model.mdk.predict.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.iailab.module.data.api.point.DataPointApi;
 import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
 import com.iailab.module.model.mcs.pre.service.MmItemOutputService;
-import com.iailab.module.model.mcs.pre.service.MmItemResultService;
+import com.iailab.module.model.mcs.pre.service.MmItemResultJsonService;
+import com.iailab.module.model.mcs.sche.service.StAdjustResultService;
 import com.iailab.module.model.mdk.common.exceptions.ItemInvokeException;
 import com.iailab.module.model.mdk.factory.ItemEntityFactory;
-import com.iailab.module.model.mdk.factory.PredictItemFactory;
 import com.iailab.module.model.mdk.predict.PredictItemHandler;
-import com.iailab.module.model.mdk.predict.PredictResultHandler;
 import com.iailab.module.model.mdk.vo.ItemVO;
 import com.iailab.module.model.mdk.vo.PredictResultVO;
+import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -32,19 +31,13 @@
     private ItemEntityFactory itemEntityFactory;
 
     @Autowired
-    private DataPointApi dataPointApi;
-
-    @Autowired
-    private PredictItemFactory predictItemFactory;
-
-    @Autowired
-    private PredictResultHandler predictResultHandler;
-
-    @Autowired
-    private MmItemResultService mmItemResultService;
+    private MmItemResultJsonService mmItemResultJsonService;
 
     @Autowired
     private MmItemOutputService mmItemOutputService;
+
+    @Autowired
+    private StAdjustResultService stAdjustResultService;
 
     /**
      * MergeItem预测
@@ -66,74 +59,89 @@
             String[] mathOutPutId = expression.split("[\\+ \\-]");
             ArrayList<Character> operator = new ArrayList<>();
             for (int i = 0; i < expression.length(); i++) {
-                if (expression.charAt(i)=='+' || expression.charAt(i)=='-'){
+                if (expression.charAt(i) == '+' || expression.charAt(i) == '-') {
                     operator.add(expression.charAt(i));
                 }
             }
-//            String[] compositionItem = expression.split(String.valueOf("&".toCharArray()));
             //是否为计算预测项
             if (mathOutPutId.length > 1) {
-//                Map<String, List<DataValueVO>> predictValueMap = new HashMap<>();
-//                for (String outPutId : mathOutPutId) {
-//                    if (outPutId.length() > 4) {
-//                        Date endTime = predictTime;
-////                        ItemVO itemEntity = itemEntityFactory.getItemByItemNo(itemNo);
-////                        List<MmItemOutputEntity> outPutList = itemEntityFactory.getOutPutByItemId(itemEntity.getId());
-//                        MmItemOutputEntity outPut = mmItemOutputService.getOutPutById(outPutId);
-//                        ApiPointDTO pointEntity = dataPointApi.getInfoById(outPut.getPointid());
-//
-//                        Calendar calendar = Calendar.getInstance();
-//                        calendar.setTime(endTime);
-//                        calendar.add(Calendar.SECOND, (predictLength - 1) * DataPointFreqEnum.getEumByCode(pointEntity.getMinfreqid()).getValue());
-//                        endTime = new Timestamp(calendar.getTime().getTime());
-////                        List<DataValueVO> predictValueList = predictResultHandler.getPredictValueByItemNo(itemNo, predictTime, endTime);
-//                        List<DataValueVO> predictValueList = mmItemResultService.getPredictValue(outPutId, predictTime, endTime);
-//                        if (predictValueList.size() != predictLength) {
-//                            log.debug("merge项融合失败:缺少子项预测数据,对应子项outPutId=" + outPutId);
-//                            return null;
-//                        }
-//                        predictValueMap.put(outPutId, predictValueList);
-//                    }
-//                }
-
                 for (Integer i = 0; i < predictLength; i++) {
-                    double sum =0.0;
+                    double sum = 0.0;
                     sum = predictValueMap.get(mathOutPutId[0])[i];
                     for (int j = 1; j < mathOutPutId.length; j++) {
-                        if (operator.get(j-1)=='+')
-                        {sum += predictValueMap.get(mathOutPutId[j])[i];}
-                        if (operator.get(j-1)=='-')
-                        {sum -= predictValueMap.get(mathOutPutId[j])[i];}
+                        if (operator.get(j - 1) == '+') {
+                            sum += predictValueMap.get(mathOutPutId[j])[i];
+                        }
+                        if (operator.get(j - 1) == '-') {
+                            sum -= predictValueMap.get(mathOutPutId[j])[i];
+                        }
                     }
                     predictResultMat[i] = sum;
                 }
             }
-            //是否为组合预测项
-//            if (compositionItem.length > 1) {
-//                Map<String, PredictResultVO> predictResultMap = new HashMap<>();
-//                Integer columnTotalNumber = 0;
-//                Integer rowNumber = 0;
-//                for (String itemNo : compositionItem) {
-//                    PredictItemHandler predictItem = (PredictItemHandler) predictItemFactory.create(itemEntityFactory.
-//                            getItemByItemNo(itemNo).getId());
-//                    predictResult = predictItem.predict(predictTime, predictItemDto);
-//                    columnTotalNumber += Integer.valueOf(predictResult.getPredictMatrix().length);
-//                    predictResultMap.put(itemNo, predictItem.predict(predictTime, predictItemDto));
-//                }
-//                double[][] matrix = new double[columnTotalNumber][1];
-//                for (String itemNo : compositionItem) {
-//                    for (Integer i = 0; i < predictResultMap.get(itemNo).getPredictMatrix().length; i++) {
-//                        matrix[rowNumber][0] = predictResultMap.get(itemNo).getPredictMatrix()[i][0];
-//                        rowNumber++;
-//                    }
-//                }
-//                predictResult.setPredictMatrix(matrix);
-//            }
             predictResult.setPredictId(itemId);
             List<MmItemOutputEntity> outputServiceByItemid = mmItemOutputService.getByItemid(itemId);
             if (!CollectionUtils.isEmpty(outputServiceByItemid)) {
                 Map<MmItemOutputEntity, double[]> predictMatrixs = new HashMap<>();
-                predictMatrixs.put(outputServiceByItemid.get(0),predictResultMat);
+                predictMatrixs.put(outputServiceByItemid.get(0), predictResultMat);
+                predictResult.setPredictMatrixs(predictMatrixs);
+            }
+            predictResult.setPredictTime(predictTime);
+        } catch (Exception e) {
+            log.error("merge项预测失败,itemId:" + itemId);
+            e.printStackTrace();
+            throw e;
+        }
+        log.info("merge项预测完成,itemId:" + itemId + ",结果:" + JSON.toJSONString(predictResult));
+        return predictResult;
+    }
+
+    @Override
+    public PredictResultVO predictAdjust(Date predictTime, ItemVO predictItemDto, List<StAdjustDeviationDTO> deviationList)
+            throws ItemInvokeException {
+        PredictResultVO predictResult = new PredictResultVO();
+        String itemId = predictItemDto.getId();
+        try {
+            String expression = itemEntityFactory.getMergeItem(itemId).getExpression();
+            int predictLength = itemEntityFactory.getItemById(itemId).getPredictLength();
+            double[] predictResultMat = new double[predictLength];
+            String[] mathOutPutId = expression.split("[\\+ \\-]");
+            ArrayList<Character> operator = new ArrayList<>();
+            for (int i = 0; i < expression.length(); i++) {
+                if (expression.charAt(i) == '+' || expression.charAt(i) == '-') {
+                    operator.add(expression.charAt(i));
+                }
+            }
+            Map<String, double[]> predictValueMap = new HashMap<>();
+            for (int k = 0; k < mathOutPutId.length; k++) {
+                String outPutId = mathOutPutId[k];
+                double[] outPutValue = stAdjustResultService.getSimpleData(outPutId, predictTime, predictLength);
+                if (outPutValue == null) {
+                    outPutValue = mmItemResultJsonService.getSimpleData(outPutId, predictTime, predictLength);
+                }
+                predictValueMap.put(outPutId, outPutValue);
+            }
+
+            //是否为计算预测项
+            if (mathOutPutId.length > 1) {
+                for (int i = 0; i < predictLength; i++) {
+                    double sum = predictValueMap.get(mathOutPutId[0])[i];
+                    for (int j = 1; j < mathOutPutId.length; j++) {
+                        if (operator.get(j - 1) == '+') {
+                            sum += predictValueMap.get(mathOutPutId[j])[i];
+                        }
+                        if (operator.get(j - 1) == '-') {
+                            sum -= predictValueMap.get(mathOutPutId[j])[i];
+                        }
+                    }
+                    predictResultMat[i] = sum;
+                }
+            }
+            predictResult.setPredictId(itemId);
+            List<MmItemOutputEntity> outputServiceByItemid = mmItemOutputService.getByItemid(itemId);
+            if (!CollectionUtils.isEmpty(outputServiceByItemid)) {
+                Map<MmItemOutputEntity, double[]> predictMatrixs = new HashMap<>();
+                predictMatrixs.put(outputServiceByItemid.get(0), predictResultMat);
                 predictResult.setPredictMatrixs(predictMatrixs);
             }
             predictResult.setPredictTime(predictTime);
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java
index 6d5a0bb..6fdf115 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java
@@ -10,11 +10,13 @@
 import com.iailab.module.model.mdk.predict.PredictModelHandler;
 import com.iailab.module.model.mdk.vo.ItemVO;
 import com.iailab.module.model.mdk.vo.PredictResultVO;
+import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.text.MessageFormat;
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -59,4 +61,33 @@
         }
         return predictResult;
     }
+
+    /**
+     * NormalItem预测
+     *
+     * @param predictTime
+     * @param predictItemDto
+     * @return
+     * @throws ItemInvokeException
+     */
+    @Override
+    public PredictResultVO predictAdjust(Date predictTime, ItemVO predictItemDto, List<StAdjustDeviationDTO> deviationList) throws ItemInvokeException,ModelResultErrorException {
+        PredictResultVO predictResult = new PredictResultVO();
+        String itemId = predictItemDto.getId();
+        try {
+            MmPredictModelEntity predictModel = mmPredictModelService.getActiveModelByItemId(itemId);
+            if (predictModel == null) {
+                throw new ModelInvokeException(MessageFormat.format("{0},itemId={1}",
+                        ModelInvokeException.errorGetModelEntity, itemId));
+            }
+            predictResult = predictModelHandler.predictByModel(predictTime, predictModel,predictItemDto.getItemName(),predictItemDto.getItemNo(), deviationList);
+            predictResult.setPredictId(itemId);
+        } catch (ModelResultErrorException ex) {
+            throw ex;
+        } catch (Exception ex) {
+            throw new ItemInvokeException(MessageFormat.format("{0},itemId={1}",
+                    ItemInvokeException.errorItemFailed, itemId));
+        }
+        return predictResult;
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java
index 466ee10..7e0ac4b 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.iail.model.IAILModel;
+import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
 import com.iailab.module.model.enums.CommonConstant;
 import com.iailab.module.model.common.enums.OutResultType;
 import com.iailab.module.model.common.exception.ModelResultErrorException;
@@ -55,7 +56,7 @@
      * @throws ModelInvokeException
      */
     @Override
-    public synchronized PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel,String itemName,String itemNo) throws ModelInvokeException {
+    public PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel, String itemName, String itemNo) throws ModelInvokeException {
         PredictResultVO result = new PredictResultVO();
         if (predictModel == null) {
             throw new ModelInvokeException("modelEntity is null");
@@ -72,7 +73,7 @@
             HashMap<String, Object> settings = getPredictSettingsByModelId(modelId);
             // 校验setting必须有pyFile,否则可能导致程序崩溃
             if (!settings.containsKey(MdkConstant.PY_FILE_KEY)) {
-                throw new RuntimeException("模型设置参数缺少必要信息【" + MdkConstant.PY_FILE_KEY +  "】,请重新上传模型!");
+                throw new RuntimeException("模型设置参数缺少必要信息【" + MdkConstant.PY_FILE_KEY + "】,请重新上传模型!");
             }
 
             if (settings == null) {
@@ -87,12 +88,7 @@
             param2Values[portLength] = newModelBean.getDataMap().get("models");
             param2Values[portLength + 1] = settings;
 
-            log.info("####################### 预测模型 "+ "【itemId:" + predictModel.getItemid() + ",itemName:" + itemName + ",itemNo:" + itemNo + "】 ##########################");
-//            JSONObject jsonObjNewModelBean = new JSONObject();
-//            jsonObjNewModelBean.put("newModelBean", newModelBean);
-//            log.info(String.valueOf(jsonObjNewModelBean));
-//            JSONObject jsonObjParam2Values = new JSONObject();
-//            jsonObjParam2Values.put("param2Values", param2Values);
+            log.info("####################### 预测模型 " + "【itemId:" + predictModel.getItemid() + ",itemName:" + itemName + ",itemNo:" + itemNo + "】 ##########################");
             log.info("参数: " + JSON.toJSONString(param2Values));
 
             //IAILMDK.run
@@ -157,18 +153,19 @@
      * @param predictModel
      * @param itemName
      * @param itemNo
+     * @param deviationList
      * @return
      * @throws ModelInvokeException
      */
     @Override
-    public synchronized PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel,String itemName,String itemNo, double[][] deviation) throws ModelInvokeException {
+    public PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel, String itemName, String itemNo, List<StAdjustDeviationDTO> deviationList) throws ModelInvokeException {
         PredictResultVO result = new PredictResultVO();
         if (predictModel == null) {
             throw new ModelInvokeException("modelEntity is null");
         }
         String modelId = predictModel.getId();
         try {
-            List<SampleData> sampleDataList = sampleConstructor.constructSample(TypeA.Predict.name(), modelId, predictTime, itemName, new HashMap<>());
+            List<SampleData> sampleDataList = sampleConstructor.constructSample(TypeA.Predict.name(), modelId, predictTime, itemName, new HashMap<>(), deviationList);
             String modelPath = predictModel.getModelpath();
             if (modelPath == null) {
                 log.info("模型路径不存在,modelId=" + modelId);
@@ -178,7 +175,7 @@
             HashMap<String, Object> settings = getPredictSettingsByModelId(modelId);
             // 校验setting必须有pyFile,否则可能导致程序崩溃
             if (!settings.containsKey(MdkConstant.PY_FILE_KEY)) {
-                throw new RuntimeException("模型设置参数缺少必要信息【" + MdkConstant.PY_FILE_KEY +  "】,请重新上传模型!");
+                throw new RuntimeException("模型设置参数缺少必要信息【" + MdkConstant.PY_FILE_KEY + "】,请重新上传模型!");
             }
 
             if (settings == null) {
@@ -193,7 +190,7 @@
             param2Values[portLength] = newModelBean.getDataMap().get("models");
             param2Values[portLength + 1] = settings;
 
-            log.info("####################### 模拟调整 "+ "【itemId:" + predictModel.getItemid() + ",itemName:" + itemName + ",itemNo:" + itemNo + "】 ##########################");
+            log.info("####################### 模拟调整 " + "【itemId:" + predictModel.getItemid() + ",itemName:" + itemName + ",itemNo:" + itemNo + "】 ##########################");
             log.info("参数: " + JSON.toJSONString(param2Values));
 
             //IAILMDK.run
@@ -247,6 +244,7 @@
         }
         return result;
     }
+
     /**
      * 构造IAILMDK.run()方法的newModelBean参数
      *
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java
index cfe224f..9968c29 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java
@@ -89,8 +89,7 @@
             }
         }
 
-        int deviationIndex = 0;
-
+        int portIdx = 0;
         //对每个爪分别进行计算
         for (ColumnItemPort entry : sampleInfo.getColumnInfo()) {
             double[][] matrix = new double[0][0];
@@ -107,7 +106,7 @@
                 if (!CollectionUtils.isEmpty(indItemValueList)) {
                     matrix = new double[entry.getDataLength()][0];
                     if (indItemValueList.size() > entry.getDataLength()) {
-                        indItemValueList = indItemValueList.subList(0,entry.getDataLength());
+                        indItemValueList = indItemValueList.subList(0, entry.getDataLength());
                     }
                     for (int i = 0; i < indItemValueList.size(); i++) {
                         String stringValue = indItemValueList.get(i).getDataValue().toString();
@@ -115,7 +114,7 @@
                         matrix[i] = asciiArray;
                     }
                 }
-            }else {
+            } else {
                 //先依据爪内数据项的modelParamOrder进行排序——重写comparator匿名函数
                 Collections.sort(entry.getColumnItemList(), new Comparator<ColumnItem>() {
                     @Override
@@ -132,33 +131,23 @@
                     }
                 }
 
-                //找出对应的调整值
-                double[] deviationItem = null;
-                if (sampleInfo.getDeviation() != null && sampleInfo.getDeviation().length > 0) {
-                    deviationItem = sampleInfo.getDeviation()[deviationIndex];
-                }
-                deviationIndex ++;
-
                 //对每一项依次进行数据查询,然后将查询出的值赋给matrix对应的位置
                 for (int i = 0; i < entry.getColumnItemList().size(); i++) {
                     try {
-                        List<DataValueVO> dataEntityList = getData(entry.getColumnItemList().get(i), pointMap, planMap,indMap);
+                        List<DataValueVO> dataEntityList = getData(entry.getColumnItemList().get(i), pointMap, planMap, indMap);
 
-                        //设置调整值
-                        if (deviationItem != null && deviationItem.length > 0) {
-                            logger.info("设置调整值, i = " + i);
-                            if (deviationItem[i] <= 0) {
-                                continue;
-                            }
-                            for(int dataKey = 1; dataKey < dataEntityList.size(); dataKey ++) {
+                        double adjustVal = SampleInfo.getAdjustValueFromDeviation(portIdx, i, sampleInfo.getDeviation());
+                        if (adjustVal != 0) {
+                            logger.info("设置调整值adjustVal:" + adjustVal);
+                            for (int dataKey = 1; dataKey < dataEntityList.size(); dataKey++) {
                                 DataValueVO item = dataEntityList.get(dataKey);
-                                item.setDataValue(item.getDataValue() + deviationItem[i]);
+                                item.setDataValue(item.getDataValue() + adjustVal);
                             }
                         }
 
                         //补全数据
                         ColumnItem columnItem = entry.getColumnItemList().get(i);
-                        dataEntityList = super.completionData(matrix.length, dataEntityList, columnItem.startTime, columnItem.endTime, columnItem.getParamType(),columnItem.getGranularity());
+                        dataEntityList = super.completionData(matrix.length, dataEntityList, columnItem.startTime, columnItem.endTime, columnItem.getParamType(), columnItem.getGranularity());
 
                         /** 如果数据取不满,把缺失的数据点放在后面 */
                         if (dataEntityList != null && dataEntityList.size() != 0) {
@@ -175,6 +164,8 @@
                         throw e;
                     }
                 }
+
+                portIdx++;
             }
             SampleData sampleData = new SampleData();
             sampleData.setMatrix(matrix);
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java
index c50083b..d2c8240 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleConstructor.java
@@ -1,13 +1,12 @@
 package com.iailab.module.model.mdk.sample;
 
+import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
 import com.iailab.module.model.mdk.common.exceptions.ModelInvokeException;
-import com.iailab.module.model.mdk.sample.dto.ColumnItemPort;
 import com.iailab.module.model.mdk.sample.dto.SampleData;
 import com.iailab.module.model.mdk.sample.dto.SampleInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
 
 import java.text.MessageFormat;
 import java.util.Date;
@@ -46,11 +45,11 @@
     }
 
     public List<SampleData> constructSample(String typeA, String modelId, Date runTime,String itemName,
-                                            Map<Integer, Integer> dynamicDataLength, double[][] deviation) throws ModelInvokeException {
+                                            Map<Integer, Integer> dynamicDataLength, List<StAdjustDeviationDTO> deviationList) throws ModelInvokeException {
         try {
             SampleInfoConstructor sampleInfoConstructor = sampleFactory.createSampleInfo(typeA, modelId);
             SampleInfo sampleInfo = sampleInfoConstructor.prepareSampleInfo(modelId, runTime, dynamicDataLength);
-            sampleInfo.setDeviation(deviation);
+            sampleInfo.setDeviation(deviationList);
             SampleDataConstructor sampleDataConstructor = sampleFactory.createSampleData(typeA);
             return sampleDataConstructor.prepareSampleData(sampleInfo);
         } catch (Exception e) {
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java
index fe54b94..7d4b804 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/dto/SampleInfo.java
@@ -3,10 +3,12 @@
 import com.iailab.module.data.api.ind.dto.ApiIndItemDTO;
 import com.iailab.module.data.api.plan.dto.ApiPlanItemDTO;
 import com.iailab.module.data.api.point.dto.ApiPointDTO;
+import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.sql.Timestamp;
@@ -34,11 +36,23 @@
     private Integer sampleCycle;
 
     // 调整值
-    private double[][] deviation;
+    private List<StAdjustDeviationDTO> deviation;
     // 所有测点信息,避免重复查询
     private Map<String, ApiPointDTO> pointMap;
     // 所有计划数据信息,避免重复查询
     private Map<String, ApiPlanItemDTO> planMap;
     // 所有计划数据信息,避免重复查询
     private Map<String, ApiIndItemDTO> indMap;
+
+    public static double getAdjustValueFromDeviation(int portIdx, int paramIdx, List<StAdjustDeviationDTO> deviation) {
+        if (CollectionUtils.isEmpty(deviation)) {
+            return 0;
+        }
+        for (StAdjustDeviationDTO deviationItem : deviation) {
+            if (deviationItem.getPortIdx() == portIdx && deviationItem.getParamIdx() == paramIdx) {
+                return deviationItem.getValue();
+            }
+        }
+        return 0;
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/StAdjustDeviationDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/StAdjustDeviationDTO.java
new file mode 100644
index 0000000..4d0e127
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/StAdjustDeviationDTO.java
@@ -0,0 +1,20 @@
+package com.iailab.module.model.mdk.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年02月24日
+ */
+@Schema(description = "模型服务 - 模拟调整值 DTO")
+@Data
+public class StAdjustDeviationDTO {
+
+    private int portIdx;
+
+    private int paramIdx;
+
+    private double value;
+}
\ No newline at end of file

--
Gitblit v1.9.3