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>