数据分析 添加 原始T+L预测值(未经过自动调整)
存储t+l_bak记录
自动调整功能
已添加12个文件
已修改10个文件
759 ■■■■■ 文件已修改
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/MmPredictAutoAdjustReqVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/db/mysql.sql 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataTypeEnum.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/enums/DataMeasurement.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/utils/MeasurementUtils.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultLastBakSimPOJO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/controller/admin/MmPredictAutoAdjustConfigController.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAutoAdjustConfigDao.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictAutoAdjustConfigEntity.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustTriggerRuleEnum.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustValueRuleEnum.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultLastPointService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultLastPointServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigPageReqVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigVO.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/pre/MmPredictAutoAdjustConfigDao.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
@@ -161,4 +161,8 @@
    @Operation(summary = "获取15分钟内最新预警建议信息")
    List<ScheduleSuggestRespDTO> getLastSuggest(@RequestParam Map<String, Object> params);
    @PostMapping(PREFIX + "/predict-item/autoAdjustByCode")
    @Operation(summary = "自动调整")
    Boolean autoAdjustByCode(@RequestBody MmPredictAutoAdjustReqVO reqVO);
}
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/MmPredictAutoAdjustReqVO.java
对比新文件
@@ -0,0 +1,15 @@
package com.iailab.module.model.api.mcs.dto;
import lombok.Data;
/**
 * @description:
 * @author: dzd
 * @date: 2025/4/9 16:15
 **/
@Data
public class MmPredictAutoAdjustReqVO {
    private String configCode;
    private Long adjustStartTime;
}
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java
@@ -111,6 +111,9 @@
    @Schema(description = "T+L预测值,L表示预测长度")
    private List<Object[]> preDataL;
    @Schema(description = "原始T+L预测值(未经过自动调整)")
    private List<Object[]> preDataLOriginal;
    @Schema(description = "当时预测值")
    private List<Object[]> curData;
iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -1011,3 +1011,20 @@
-- t_st_schedule_record 创建复合索引
CREATE INDEX idx_st_schedule_record_scheme_result_time ON t_st_schedule_record (scheme_id, result_code, schedule_time DESC, create_time DESC);
CREATE TABLE `t_mm_predict_auto_adjust_config` (
                                                   `id` varchar(36) NOT NULL,
                                                   `config_name` varchar(255) DEFAULT NULL COMMENT '配置名称',
                                                   `config_code` varchar(255) DEFAULT NULL COMMENT '配置编码',
                                                   `output_id` varchar(36) DEFAULT NULL COMMENT '预测输出id',
                                                   `point_id` varchar(36) DEFAULT NULL COMMENT '测点id',
                                                   `t` int DEFAULT NULL COMMENT '取值时间范围',
                                                   `trigger_rule` varchar(36) DEFAULT NULL COMMENT '触发规则',
                                                   `trigger_value` double DEFAULT NULL COMMENT '触发值',
                                                   `adjust_direction` tinyint DEFAULT '1' COMMENT '调整方向(1:正向,-1:反向)',
                                                   `adjust_length` int DEFAULT NULL COMMENT '调整长度',
                                                   `adjust_value_rule` varchar(36) DEFAULT NULL COMMENT '调整值计算规则',
                                                   `is_enable` tinyint DEFAULT NULL COMMENT '是否启用(0禁用 1启用)',
                                                   `create_time` datetime DEFAULT NULL,
                                                   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='预测结果自动调整配置表';
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -119,7 +119,7 @@
    private StScheduleModelSettingService stScheduleModelSettingService;
    @Autowired
    private StAdjustConfigService stAdjustConfigService;
    private MmPredictAutoAdjustConfigService autoAdjustService;
    private int HOUR_MINS = 60;
    @Override
@@ -219,6 +219,7 @@
            viewDto.setRealData(getHisData(output.getPointid(), startTime, endTime, reqVO.getPrec()));
            viewDto.setPreDataN(mmItemResultService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            viewDto.setPreDataL(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            viewDto.setPreDataLOriginal(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND,DataTypeEnum.FLOAT_LAST_BAK));
            viewDto.setCurData(mmItemResultJsonService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            // 模拟调整曲线
            viewDto.setAdjData(stAdjustResultService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
@@ -913,6 +914,11 @@
        return stScheduleSuggestService.getLastSuggest(params);
    }
    @Override
    public Boolean autoAdjustByCode(MmPredictAutoAdjustReqVO reqVO) {
        return autoAdjustService.autoAdjustByCode(reqVO.getConfigCode(),reqVO.getAdjustStartTime());
    }
    private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) {
        Date[] result = new Date[3];
        Date predictTime = predictItem.getLastTime();
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataTypeEnum.java
@@ -18,6 +18,8 @@
    FLOAT_LAST("float_last"),
    FLOAT_LAST_BAK("float_last_bak"),
    BOOLEAN("boolean");
    private String code;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/enums/DataMeasurement.java
@@ -10,6 +10,7 @@
public enum DataMeasurement {
    t_md_sim_value,
    t_md_last_sim_value,
    t_md_last_bak_sim_value,
    t_md_dig_value,
    t_md_bool_value,
    t_md_str_value,
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/utils/MeasurementUtils.java
@@ -19,6 +19,8 @@
            return DataMeasurement.t_md_bool_value.name();
        } else if (DataTypeEnum.FLOAT_LAST.getCode().equals(type)) {
            return DataMeasurement.t_md_last_sim_value.name();
        }  else if (DataTypeEnum.FLOAT_LAST_BAK.getCode().equals(type)) {
            return DataMeasurement.t_md_last_bak_sim_value.name();
        } else {
            return DataMeasurement.t_md_str_value.name();
        }
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultLastBakSimPOJO.java
对比新文件
@@ -0,0 +1,18 @@
package com.iailab.module.model.influxdb.pojo;
import com.influxdb.annotations.Column;
import com.influxdb.annotations.Measurement;
import lombok.Data;
/**
 * @description:
 * @author: dzd
 * @date: 2025/1/7 13:43
 **/
@Data
@Measurement(name = "t_md_last_bak_sim_value")
public class InfluxModelResultLastBakSimPOJO extends InfluxModelResultPOJO {
    @Column
    private Double value;
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/controller/admin/MmPredictAutoAdjustConfigController.java
对比新文件
@@ -0,0 +1,79 @@
package com.iailab.module.model.mcs.pre.controller.admin;
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.util.object.BeanUtils;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.MmPredictAutoAdjustReqVO;
import com.iailab.module.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
import com.iailab.module.model.mcs.pre.service.MmPredictAutoAdjustConfigService;
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import static com.iailab.framework.common.pojo.CommonResult.success;
/**
 * @description:
 * @author: dzd
 * @date: 2025/4/8 13:30
 **/
@RestController
@RequestMapping("/model/pre/auto-adjust-config")
public class MmPredictAutoAdjustConfigController {
    @Autowired
    private MmPredictAutoAdjustConfigService autoAdjustConfigService;
    @Autowired
    private McsApi mcsApi;
    @PostMapping("/create")
    @Operation(summary = "创建自动调整配置")
    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:create')")
    public CommonResult<Boolean> create(@RequestBody MmPredictAutoAdjustConfigEntity entity) {
        autoAdjustConfigService.create(entity);
        return success(true);
    }
    @PutMapping("/update")
    @Operation(summary = "更新自动调整配置")
    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:update')")
    public CommonResult<Boolean> update(@RequestBody MmPredictAutoAdjustConfigEntity entity) {
        autoAdjustConfigService.update(entity);
        return success(true);
    }
    @DeleteMapping("/delete")
    @Operation(summary = "删除自动调整配置")
    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:delete')")
    public CommonResult<Boolean> delete(@RequestParam("id") String id) {
        autoAdjustConfigService.delete(id);
        return success(true);
    }
    @GetMapping("/get/{id}")
    @Operation(summary = "获得自动调整配置")
    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:query')")
    public CommonResult<MmPredictAutoAdjustConfigVO> getInfo(@PathVariable("id") String id) {
        MmPredictAutoAdjustConfigEntity entity = autoAdjustConfigService.getInfo(id);
        return success(BeanUtils.toBean(entity, MmPredictAutoAdjustConfigVO.class));
    }
    @GetMapping("/page")
    @Operation(summary = "获得自动调整配置分页")
    @PreAuthorize("@ss.hasPermission('pre:auto-adjust-config:query')")
    public CommonResult<PageResult<MmPredictAutoAdjustConfigVO>> page(MmPredictAutoAdjustConfigPageReqVO params) {
        PageResult<MmPredictAutoAdjustConfigVO> pageResult = autoAdjustConfigService.page(params);
        return success(pageResult);
    }
    @PostMapping("/autoAdjustByCode")
    @Operation(summary = "通过configCode自动调整")
    public Boolean autoAdjustByCode(@RequestBody MmPredictAutoAdjustReqVO params) {
        return autoAdjustConfigService.autoAdjustByCode(params.getConfigCode(),params.getAdjustStartTime());
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAutoAdjustConfigDao.java
对比新文件
@@ -0,0 +1,27 @@
package com.iailab.module.model.mcs.pre.dao;
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.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
import com.iailab.module.model.mcs.pre.vo.MmPredictAlarmConfigRespVO;
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * @description:
 * @author: dzd
 * @date: 2025/4/8 14:16
 **/
@TenantDS
@Mapper
public interface MmPredictAutoAdjustConfigDao extends BaseMapperX<MmPredictAutoAdjustConfigEntity> {
    IPage<MmPredictAutoAdjustConfigVO> getPage(IPage<MmPredictAutoAdjustConfigEntity> page, @Param("params") MmPredictAutoAdjustConfigPageReqVO reqVO);
    default IPage<MmPredictAutoAdjustConfigVO> selectPage(MmPredictAutoAdjustConfigPageReqVO params) {
        return getPage(getPage(params), params);
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictAutoAdjustConfigEntity.java
对比新文件
@@ -0,0 +1,87 @@
package com.iailab.module.model.mcs.pre.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @description:
 * @author: dzd
 * @date: 2025/4/8 11:59
 **/
@Data
@TableName("t_mm_predict_auto_adjust_config")
public class MmPredictAutoAdjustConfigEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    @TableId(value = "id",type = IdType.INPUT)
    private String id;
    /**
     * 配置名称
     */
    private String configName;
    /**
     * 配置编码
     */
    private String configCode;
    /**
     * 预测输出id
     */
    private String outputId;
    /**
     * 测点id
     */
    private String pointId;
    /**
     * 取值时间范围
     */
    private Integer t;
    /**
     * 触发规则
     */
    private String triggerRule;
    /**
     * 触发值
     */
    private Double triggerValue;
    /**
     * 调整方向(1:正向,-1:反向)
     */
    private Integer adjustDirection;
    /**
     * 调整长度
     */
    private Integer adjustLength;
    /**
     * 调整值计算规则
     */
    private String adjustValueRule;
    /**
     * 是否启用(0禁用 1启用)
     */
    private Integer isEnable;
    /**
     * 创建时间
     */
    private Date createTime;
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustTriggerRuleEnum.java
对比新文件
@@ -0,0 +1,30 @@
package com.iailab.module.model.mcs.pre.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * 自动调整 触发规则
 */
@Getter
@AllArgsConstructor
public enum AutoAdjustTriggerRuleEnum {
    // 斜率
    SLOPE("slope"),
    // 平均差
    AVERAGE_GAP("average_gap"),
    UNKNOW("unknow");
    private final String code;
    public static AutoAdjustTriggerRuleEnum fromCode(String code) {
        for (AutoAdjustTriggerRuleEnum unit : values()) {
            if (unit.code.equals(code)) {
                return unit;
            }
        }
        return UNKNOW;
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/AutoAdjustValueRuleEnum.java
对比新文件
@@ -0,0 +1,54 @@
package com.iailab.module.model.mcs.pre.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.function.Function;
/**
 * 自动调整 调整值计算规则
 */
@Getter
@AllArgsConstructor
public enum AutoAdjustValueRuleEnum {
    // 均值差
    AVERAGE_GAP_VALUE("average_gap_value",(map) -> {
        if (!map.containsKey("startValue") || !map.containsKey("endValue")) {
            return 0.0;
        }
        Double startValue = Double.valueOf(map.get("startValue").toString());
        Double endValue = Double.valueOf(map.get("endValue").toString());
        return endValue - startValue;
    });
    private final String code;
    private final Function<HashMap<String,Object>, Double> calculator;
    public Double calculate(HashMap<String,Object> map) {
        return calculator.apply(map);
    }
    public static AutoAdjustValueRuleEnum fromCode(String code) {
        for (AutoAdjustValueRuleEnum unit : values()) {
            if (unit.code.equals(code)) {
                return unit;
            }
        }
        return null;
    }
    public static Double getAdjustValue(String code,HashMap<String,Object> map) {
        AutoAdjustValueRuleEnum rule = AutoAdjustValueRuleEnum.fromCode(code);
        if (rule == null) {
            return 0.0;
        }
        return rule.calculate(map);
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultLastPointService.java
@@ -1,5 +1,7 @@
package com.iailab.module.model.mcs.pre.service;
import com.iailab.module.model.common.enums.DataTypeEnum;
import java.util.Date;
import java.util.List;
@@ -11,4 +13,6 @@
public interface MmItemResultLastPointService {
    List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat);
    List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat, DataTypeEnum dataTypeEnum);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java
对比新文件
@@ -0,0 +1,32 @@
package com.iailab.module.model.mcs.pre.service;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.service.BaseService;
import com.iailab.module.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
import java.util.List;
import java.util.Map;
/**
 * @description:
 * @author: dzd
 * @date: 2025/4/8 13:44
 **/
public interface MmPredictAutoAdjustConfigService extends BaseService<MmPredictAutoAdjustConfigEntity> {
    PageResult<MmPredictAutoAdjustConfigVO> page(MmPredictAutoAdjustConfigPageReqVO params);
    MmPredictAutoAdjustConfigEntity getInfo(String id);
    MmPredictAutoAdjustConfigEntity getByCode(String code);
    void create(MmPredictAutoAdjustConfigEntity entity);
    void update(MmPredictAutoAdjustConfigEntity entity);
    void delete(String id);
    boolean autoAdjustByCode(String configCode,long adjustStartTime);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultLastPointServiceImpl.java
@@ -26,9 +26,16 @@
    @Override
    public List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat) {
        return getData(outputid,startTime,endTime,timeFormat,null);
    }
    public List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat,DataTypeEnum dataTypeEnum) {
        List<Object[]> result = new ArrayList<>();
        InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
        pojo.setType(DataTypeEnum.FLOAT_LAST.getCode());
        if (dataTypeEnum == null) {
            dataTypeEnum = DataTypeEnum.FLOAT_LAST;
        }
        pojo.setType(dataTypeEnum.getCode());
        pojo.setOutPutId(outputid);
        List<InfluxModelResultVO> influxModelResultVOS = influxDBService.queryModelResults(pojo, startTime, endTime);
        influxModelResultVOS.forEach(item -> {
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONArray;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.module.model.common.enums.DataTypeEnum;
import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastBakSimPOJO;
import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastSimPOJO;
import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO;
import com.iailab.module.model.influxdb.pojo.InfluxModelResultSimPOJO;
@@ -36,6 +37,7 @@
    public void savePredictValue(Map<String, List<DataValueVO>> predictValueMap, int t, String nIndex, Date predictTime) {
        List<InfluxModelResultPOJO> importList = new ArrayList<>();
        List<InfluxModelResultPOJO> lastList = new ArrayList<>();
        List<InfluxModelResultPOJO> lastBakList = new ArrayList<>();
        List<MmItemResultJsonEntity> resultJsonList = new ArrayList<>();
        for (Map.Entry<String, List<DataValueVO>> entry : predictValueMap.entrySet()) {
@@ -44,7 +46,6 @@
                pojo.setValue(dataVo.getDataValue());
                pojo.setTimestamp(dataVo.getDataTime().toInstant());
                pojo.setOutPutId(entry.getKey());
                pojo.setType(DataTypeEnum.FLOAT.getCode());
                importList.add(pojo);
            }
@@ -67,8 +68,13 @@
                pojo.setValue(dataVo.getDataValue());
                pojo.setTimestamp(dataVo.getDataTime().toInstant());
                pojo.setOutPutId(entry.getKey());
                pojo.setType(DataTypeEnum.FLOAT.getCode());
                lastList.add(pojo);
                InfluxModelResultLastBakSimPOJO bakSimPojo = new InfluxModelResultLastBakSimPOJO();
                bakSimPojo.setValue(dataVo.getDataValue());
                bakSimPojo.setTimestamp(dataVo.getDataTime().toInstant());
                bakSimPojo.setOutPutId(entry.getKey());
                lastBakList.add(bakSimPojo);
            }
            MmItemResultJsonEntity resultJson = new MmItemResultJsonEntity();
@@ -85,6 +91,8 @@
        // double结果存入influxdb
        influxDBService.asyncWriteModelResults(importList);
        influxDBService.asyncWriteModelResults(lastList);
        // t+l备份
        influxDBService.asyncWriteModelResults(lastBakList);
    }
    @Override
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
对比新文件
@@ -0,0 +1,216 @@
package com.iailab.module.model.mcs.pre.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.service.impl.BaseServiceImpl;
import com.iailab.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.model.common.enums.DataTypeEnum;
import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastSimPOJO;
import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO;
import com.iailab.module.model.influxdb.service.InfluxDBService;
import com.iailab.module.model.influxdb.vo.InfluxModelResultVO;
import com.iailab.module.model.mcs.pre.dao.MmPredictAutoAdjustConfigDao;
import com.iailab.module.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
import com.iailab.module.model.mcs.pre.enums.AutoAdjustTriggerRuleEnum;
import com.iailab.module.model.mcs.pre.enums.AutoAdjustValueRuleEnum;
import com.iailab.module.model.mcs.pre.service.MmPredictAutoAdjustConfigService;
import com.iailab.module.model.mcs.pre.service.MmPredictItemService;
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
import com.iailab.module.model.mdk.vo.ItemVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author PanZhibao
 * @Description
 * @createTime 2024年11月19日
 */
@Slf4j
@Service
public class MmPredictAutoAdjustConfigServiceImpl extends BaseServiceImpl<MmPredictAutoAdjustConfigDao, MmPredictAutoAdjustConfigEntity>
        implements MmPredictAutoAdjustConfigService {
    @Autowired
    private MmPredictItemService mmPredictItemService;
    @Autowired
    private InfluxDBService influxDBService;
    @Autowired
    private DataPointApi dataPointApi;
    @Override
    public PageResult<MmPredictAutoAdjustConfigVO> page(MmPredictAutoAdjustConfigPageReqVO params) {
        IPage<MmPredictAutoAdjustConfigVO> page = baseDao.selectPage(params);
        return new PageResult<>(page.getRecords(), page.getTotal());
    }
    @Override
    public MmPredictAutoAdjustConfigEntity getInfo(String id) {
        return baseDao.selectById(id);
    }
    @Override
    public MmPredictAutoAdjustConfigEntity getByCode(String code) {
        return baseDao.selectOne("config_code",code);
    }
    @Override
    public void create(MmPredictAutoAdjustConfigEntity entity) {
        entity.setId(UUID.randomUUID().toString());
        baseDao.insert(entity);
    }
    @Override
    public void update(MmPredictAutoAdjustConfigEntity entity) {
        baseDao.updateById(entity);
    }
    @Override
    public void delete(String id) {
        baseDao.deleteById(id);
    }
    @Override
    public boolean autoAdjustByCode(String configCode,long adjustStartTime) {
        // 查询调整配置
        MmPredictAutoAdjustConfigEntity configEntity = getByCode(configCode);
        if (configEntity == null) {
            log.info("自动调整失败原因:configEntity为null");
            return false;
        }
        Double adjustValue = 0.0;
        ApiPointValueQueryDTO queryDTO;
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(adjustStartTime);
        Date endTime;
        Date startTime;
        List<ApiPointValueDTO> apiPointValueDTOS;
        // 判断是否调整
        AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule());
        switch (triggerRuleEnum) {
            case SLOPE:
                queryDTO = new ApiPointValueQueryDTO();
                queryDTO.setPointNo(dataPointApi.getInfoById(configEntity.getPointId()).getPointNo());
                endTime = calendar.getTime();
                queryDTO.setEnd(endTime);
                calendar.add(Calendar.MINUTE,-1 * configEntity.getT());
                startTime = calendar.getTime();
                queryDTO.setStart(startTime);
                apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
                    log.info("自动调整失败原因:测点数据长度为0");
                    return false;
                }
                apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> e.getV() != -2).collect(Collectors.toList());
                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
                    log.info("自动调整失败原因:测点数据长度为0");
                    return false;
                }
                Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(startTime)).findFirst();
                if (!startOptional.isPresent()) {
                    log.info("自动调整失败原因:计算斜率startTime时间点测点值为null,startTime:" + startTime);
                    return false;
                }
                Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(endTime)).findFirst();
                if (!endOptional.isPresent()) {
                    log.info("自动调整失败原因:计算斜率endTime时间点测点值为null,endTime:" + endTime);
                    return false;
                }
                ApiPointValueDTO startPointValue = startOptional.get();
                ApiPointValueDTO endPointValue = endOptional.get();
                // 计算斜率,有正负之分,代表上升或下降
                double slope = BigDecimal.valueOf(endPointValue.getV() - startPointValue.getV()).divide(BigDecimal.valueOf(configEntity.getT())).doubleValue();
                //斜率绝对值大于等于触发值则进行调整
                if (Double.valueOf(Math.abs(slope)).compareTo(configEntity.getTriggerValue()) >= 0) {
                    //计算调整值
                    HashMap<String,Object> map = new HashMap<>();
                    map.put("startValue",startPointValue.getV());
                    map.put("endValue",endPointValue.getV());
                    adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), map);
                } else {
                    log.info("自动调整失败原因:斜率小于调整值,斜率:" + slope);
                    return false;
                }
                break;
            case AVERAGE_GAP:
                queryDTO = new ApiPointValueQueryDTO();
                queryDTO.setPointNo(dataPointApi.getInfoById(configEntity.getPointId()).getPointNo());
                endTime = calendar.getTime();
                queryDTO.setEnd(endTime);
                calendar.add(Calendar.MINUTE,-1 * configEntity.getT() * 2 + 1);
                startTime = calendar.getTime();
                queryDTO.setStart(startTime);
                apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
                    log.info("自动调整失败原因:测点数据长度为0");
                    return false;
                }
                apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> e.getV() != -2).collect(Collectors.toList());
                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
                    log.info("自动调整失败原因:测点数据长度为0");
                    return false;
                }
                calendar.add(Calendar.MINUTE,configEntity.getT());
                double startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().before(calendar.getTime())).collect(Collectors.summarizingDouble(ApiPointValueDTO::getV)).getAverage();
                double endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().compareTo(calendar.getTime()) >= 0).collect(Collectors.summarizingDouble(ApiPointValueDTO::getV)).getAverage();
                // 计算均值差,大于等于触发值则进行调整
                if (Double.valueOf(Math.abs(startAverage - endAverage)).compareTo(configEntity.getTriggerValue()) >= 0) {
                    //计算调整值
                    HashMap<String,Object> map = new HashMap<>();
                    map.put("startValue",startAverage);
                    map.put("endValue",endAverage);
                    adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), map);
                } else {
                    log.info("自动调整失败原因:均值差小于调整值,均值差:" + (startAverage - endAverage));
                    return false;
                }
                break;
            default:
                log.info("自动调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
                return false;
        }
        // 调整方向
        adjustValue = adjustValue * configEntity.getAdjustDirection();
        // 获取历史结果
        ItemVO item = mmPredictItemService.getItemByOutPutId(configEntity.getOutputId());
        if (item == null) {
            log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + configEntity.getOutputId());
            return false;
        }
        Calendar resultCalendar = Calendar.getInstance();
        resultCalendar.setTimeInMillis(adjustStartTime);
        Date resultStartTime = resultCalendar.getTime();
        resultCalendar.add(Calendar.SECOND,configEntity.getAdjustLength() * item.getGranularity());
        Date resultEndTime = resultCalendar.getTime();
        InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
        pojo.setType(DataTypeEnum.FLOAT_LAST_BAK.getCode());
        pojo.setOutPutId(configEntity.getOutputId());
        List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, resultStartTime, resultEndTime);
        List<InfluxModelResultPOJO> lastList = new ArrayList<>();
        for (InfluxModelResultVO resultVO : influxModelResult) {
            InfluxModelResultLastSimPOJO adjustPojo = new InfluxModelResultLastSimPOJO();
            // 设置新的调整值
            adjustPojo.setValue(Double.parseDouble(resultVO.getValue().toString()) + adjustValue);
            adjustPojo.setTimestamp(resultVO.getTimestamp());
            adjustPojo.setOutPutId(configEntity.getOutputId());
            lastList.add(adjustPojo);
        }
        // 相同时间直接覆盖旧值
        influxDBService.asyncWriteModelResults(lastList);
        log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + adjustValue + ",resultStartTime:" + resultStartTime + ",resultEndTime:" + resultEndTime + "调整长度:" + lastList.size());
        return true;
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigPageReqVO.java
对比新文件
@@ -0,0 +1,25 @@
package com.iailab.module.model.mcs.pre.vo;
import com.iailab.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
 * @description:
 * @author: dzd
 * @date: 2025/4/8 14:35
 **/
@Schema(description = "预测结果自动调整配置 - Page Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MmPredictAutoAdjustConfigPageReqVO extends PageParam {
    @Schema(description = "配置名称")
    private String configName;
    @Schema(description = "配置编码")
    private String configCode;
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictAutoAdjustConfigVO.java
对比新文件
@@ -0,0 +1,92 @@
package com.iailab.module.model.mcs.pre.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * @description:
 * @author: dzd
 * @date: 2025/4/8 11:59
 **/
@Data
public class MmPredictAutoAdjustConfigVO implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    private String id;
    /**
     * 配置名称
     */
    private String configName;
    /**
     * 配置编码
     */
    private String configCode;
    /**
     * 预测输出id
     */
    private String outputId;
    /**
     * 测点id
     */
    private String pointId;
    /**
     * 取值时间范围
     */
    private Integer t;
    /**
     * 触发规则
     */
    private String triggerRule;
    /**
     * 触发值
     */
    private Double triggerValue;
    /**
     * 调整方向(1:正向,-1:反向)
     */
    private Integer adjustDirection;
    /**
     * 调整长度
     */
    private Integer adjustLength;
    /**
     * 调整值计算规则
     */
    private String adjustValueRule;
    /**
     * 是否启用(0禁用 1启用)
     */
    private Integer isEnable;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 预测项名称
     */
    private String itemName;
    /**
     * 预测项输出名称
     */
    private String outputName;
}
iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/pre/MmPredictAutoAdjustConfigDao.xml
对比新文件
@@ -0,0 +1,22 @@
<?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.pre.dao.MmPredictAutoAdjustConfigDao">
    <select id="getPage" resultType="com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO">
        select
        t1.*,
        t2.result_name output_name,
        t3.itemname item_name
        from t_mm_predict_auto_adjust_config t1
        left join t_mm_item_output t2 on t1.output_id = t2.id
        left join t_mm_predict_item t3 on t2.itemid = t3.id
        <where>
            <if test="params.configName != null and params.configName != ''">
                and t1.config_name like CONCAT('%', #{params.configName},'%')
            </if>
            <if test="params.configCode != null and params.configCode != ''">
                and t1.config_code like CONCAT('%', #{params.configCode},'%')
            </if>
        </where>
        order by t1.create_time desc
    </select>
</mapper>