iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/MmPredictInfluenceFactorHandleReqVO.java
对比新文件 @@ -0,0 +1,13 @@ package com.iailab.module.model.api.mcs.dto; import lombok.Data; /** * @description: * @author: dzd * @date: 2025/4/9 16:15 **/ @Data public class MmPredictInfluenceFactorHandleReqVO { private Long influenceTime; } iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java
@@ -1,6 +1,7 @@ package com.iailab.module.model.api.mdk; import com.iailab.module.model.api.mcs.dto.MmPredictAutoAdjustReqVO; import com.iailab.module.model.api.mcs.dto.MmPredictInfluenceFactorHandleReqVO; import com.iailab.module.model.api.mdk.dto.*; import com.iailab.module.model.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; @@ -53,4 +54,8 @@ @PostMapping(PREFIX + "/predict-item/autoAdjustByCode") @Operation(summary = "预测自动调整") Boolean autoAdjustByCode(@RequestBody MmPredictAutoAdjustReqVO reqVO); @PostMapping(PREFIX + "/predict-item/influenceFactorHandle") @Operation(summary = "影响因素计算") void influenceFactorHandle(@RequestBody MmPredictInfluenceFactorHandleReqVO reqVO); } iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -1029,3 +1029,34 @@ PRIMARY KEY (`id`), UNIQUE KEY `config_code` (`config_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='预测结果自动调整配置表'; -- 预测项影响因素 CREATE TABLE `t_mm_predict_influence_factor_config` ( `id` varchar(36) NOT NULL, `output_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '预测项id', `pattern` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '统计方式', `is_enable` tinyint DEFAULT NULL COMMENT '是否启用(0禁用 1启用)', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `output_id` (`output_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='预测项影响因素配置表'; CREATE TABLE `t_mm_predict_influence_factor` ( `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, `config_id` varchar(36) DEFAULT NULL COMMENT '配置id', `factor_output_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '因素预测项id', `deviation_value` double DEFAULT NULL COMMENT '偏差值', PRIMARY KEY (`id`), KEY `config_id` (`config_id`), KEY `item_id` (`factor_output_id`), CONSTRAINT `t_mm_predict_influence_factor_ibfk_1` FOREIGN KEY (`config_id`) REFERENCES `t_mm_predict_influence_factor_config` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='预测项影响因素关联表'; CREATE TABLE `t_mm_predict_influence_factor_result` ( `factor_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '因素id', `time` datetime DEFAULT NULL COMMENT '影响时间', `value` double DEFAULT NULL COMMENT '影响值', UNIQUE KEY `factor_id_time_unique` (`factor_id`,`time` DESC) USING BTREE, CONSTRAINT `t_mm_predict_influence_factor_result_ibfk_1` FOREIGN KEY (`factor_id`) REFERENCES `t_mm_predict_influence_factor` (`id`) ON DELETE CASCADE ) 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/MdkApiImpl.java
@@ -5,6 +5,7 @@ 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.MmPredictAutoAdjustReqVO; import com.iailab.module.model.api.mcs.dto.MmPredictInfluenceFactorHandleReqVO; import com.iailab.module.model.api.mcs.dto.StScheduleModelOutDTO; import com.iailab.module.model.api.mdk.MdkApi; import com.iailab.module.model.api.mdk.dto.*; @@ -15,6 +16,7 @@ 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.MmPredictAutoAdjustConfigService; import com.iailab.module.model.mcs.pre.service.MmPredictInfluenceFactorService; 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.StAdjustConfigEntity; @@ -85,6 +87,9 @@ @Autowired private MmPredictAutoAdjustConfigService autoAdjustService; @Autowired private MmPredictInfluenceFactorService influenceFactorService; public static final long offset = 60 * 3L; @@ -419,4 +424,9 @@ public Boolean autoAdjustByCode(MmPredictAutoAdjustReqVO reqVO) { return autoAdjustService.autoAdjustByCode(reqVO.getConfigCode(), reqVO.getAdjustStartTime()); } @Override public void influenceFactorHandle(MmPredictInfluenceFactorHandleReqVO reqVO) { influenceFactorService.influenceFactorHandle(reqVO); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/controller/admin/MmPredictInfluenceFactorController.java
对比新文件 @@ -0,0 +1,81 @@ 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.service.MmPredictInfluenceFactorResultService; import com.iailab.module.model.mcs.pre.service.MmPredictInfluenceFactorService; import com.iailab.module.model.mcs.pre.vo.*; 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/influence-factor") public class MmPredictInfluenceFactorController { @Autowired private MmPredictInfluenceFactorService influenceFactorService; @Autowired private MmPredictInfluenceFactorResultService influenceFactorResultService; @PostMapping("/create") @Operation(summary = "创建影响因素配置") @PreAuthorize("@ss.hasPermission('pre:influence-factor:create')") public CommonResult<Boolean> create(@RequestBody MmPredictInfluenceFactorConfigVO vo) { influenceFactorService.create(vo); return success(true); } @PutMapping("/update") @Operation(summary = "更新影响因素配置") @PreAuthorize("@ss.hasPermission('pre:influence-factor:update')") public CommonResult<Boolean> update(@RequestBody MmPredictInfluenceFactorConfigVO vo) { influenceFactorService.update(vo); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除影响因素配置") @PreAuthorize("@ss.hasPermission('pre:influence-factor:delete')") public CommonResult<Boolean> delete(@RequestParam("id") String id) { influenceFactorService.delete(id); return success(true); } @GetMapping("/get/{id}") @Operation(summary = "获得影响因素配置") @PreAuthorize("@ss.hasPermission('pre:influence-factor:query')") public CommonResult<MmPredictInfluenceFactorConfigVO> getInfo(@PathVariable("id") String id) { MmPredictInfluenceFactorConfigVO info = influenceFactorService.getInfo(id); return success(info); } @GetMapping("/page") @Operation(summary = "获得影响因素配置分页") @PreAuthorize("@ss.hasPermission('pre:influence-factor:query')") public CommonResult<PageResult<MmPredictInfluenceFactorConfigVO>> page(MmPredictInfluenceFactorPageReqVO params) { PageResult<MmPredictInfluenceFactorConfigVO> pageResult = influenceFactorService.page(params); return success(pageResult); } @GetMapping("/getResultPage") @Operation(summary = "获得影响因素结果分页") public CommonResult<PageResult<MmPredictInfluenceFactorResultVO>> getResultPage(MmPredictInfluenceFactorResultPageReqVO params) { PageResult<MmPredictInfluenceFactorResultVO> pageResult = influenceFactorResultService.page(params); return success(pageResult); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictInfluenceFactorDao.java
对比新文件 @@ -0,0 +1,39 @@ 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.entity.MmPredictInfluenceFactorConfigEntity; import com.iailab.module.model.mcs.pre.vo.*; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** * @description: * @author: dzd * @date: 2025/4/8 14:16 **/ @TenantDS @Mapper public interface MmPredictInfluenceFactorDao extends BaseMapperX<MmPredictInfluenceFactorConfigEntity> { IPage<MmPredictInfluenceFactorConfigVO> getPage(IPage<MmPredictInfluenceFactorConfigEntity> page, @Param("params") MmPredictInfluenceFactorPageReqVO reqVO); default IPage<MmPredictInfluenceFactorConfigVO> selectPage(MmPredictInfluenceFactorPageReqVO params) { return getPage(getPage(params), params); } MmPredictInfluenceFactorConfigVO getInfo(String id); void insertInfluenceFactor(List<MmPredictInfluenceFactorVO> list); @Delete("DELETE FROM t_mm_predict_influence_factor WHERE config_id = #{configId}") void deleteInfluenceFactor(String configId); List<MmPredictInfluenceFactorHandleVO> selectList(@Param("params") Map<String, Object> params); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictInfluenceFactorResultDao.java
对比新文件 @@ -0,0 +1,20 @@ package com.iailab.module.model.mcs.pre.dao; 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.MmPredictInfluenceFactorResultEntity; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; /** * @description: * @author: dzd * @date: 2025/4/8 14:16 **/ @TenantDS @Mapper public interface MmPredictInfluenceFactorResultDao extends BaseMapperX<MmPredictInfluenceFactorResultEntity> { void insertOrUpdate(List<MmPredictInfluenceFactorResultEntity> list); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictInfluenceFactorConfigEntity.java
对比新文件 @@ -0,0 +1,47 @@ 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.util.Date; /** * @description: 预测项影响因素配置表 * @author: dzd * @date: 2025/4/14 13:36 **/ @Data @TableName("t_mm_predict_influence_factor_config") public class MmPredictInfluenceFactorConfigEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 主键 */ @TableId(value = "id",type = IdType.INPUT) private String id; /** * 预测项id */ private String outputId; /** * 统计方式 */ private String pattern; /** * 是否启用(0禁用 1启用) */ private Integer isEnable; /** * 创建时间 */ private Date createTime; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictInfluenceFactorEntity.java
对比新文件 @@ -0,0 +1,41 @@ 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.util.Date; /** * @description: 预测项影响因素关联表 * @author: dzd * @date: 2025/4/14 13:36 **/ @Data @TableName("t_mm_predict_influence_factor") public class MmPredictInfluenceFactorEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 主键 */ @TableId(value = "id",type = IdType.INPUT) private String id; /** * 配置id */ private String configId; /** * 因素预测项id */ private String factorOutputId; /** * 偏差值 */ private Double deviationValue; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/entity/MmPredictInfluenceFactorResultEntity.java
对比新文件 @@ -0,0 +1,34 @@ 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.util.Date; /** * @description: 预测项影响因素结果表 * @author: dzd * @date: 2025/4/14 13:36 **/ @Data @TableName("t_mm_predict_influence_factor_result") public class MmPredictInfluenceFactorResultEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 因素id */ private String factorId; /** * 影响时间 */ private Date time; /** * 影响值 */ private Double value; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/enums/InfluenceFactorPatternEnum.java
对比新文件 @@ -0,0 +1,30 @@ package com.iailab.module.model.mcs.pre.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * 自动调整 触发规则 */ @Getter @AllArgsConstructor public enum InfluenceFactorPatternEnum { // 累计量误差 ACCUMULATE("accumulate"), // 精确度误差 ACCURACY("accuracy"), UNKNOW("unknow"); private final String code; public static InfluenceFactorPatternEnum fromCode(String code) { for (InfluenceFactorPatternEnum 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/service/MmPredictInfluenceFactorResultService.java
对比新文件 @@ -0,0 +1,24 @@ 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.MmPredictInfluenceFactorConfigEntity; import com.iailab.module.model.mcs.pre.entity.MmPredictInfluenceFactorResultEntity; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorConfigVO; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorPageReqVO; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorResultPageReqVO; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorResultVO; import java.util.List; /** * @description: * @author: dzd * @date: 2025/4/8 13:44 **/ public interface MmPredictInfluenceFactorResultService extends BaseService<MmPredictInfluenceFactorResultEntity> { PageResult<MmPredictInfluenceFactorResultVO> page(MmPredictInfluenceFactorResultPageReqVO params); void insert(List<MmPredictInfluenceFactorResultEntity> resultList); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictInfluenceFactorService.java
对比新文件 @@ -0,0 +1,30 @@ 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.api.mcs.dto.MmPredictInfluenceFactorHandleReqVO; import com.iailab.module.model.mcs.pre.entity.MmPredictInfluenceFactorConfigEntity; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorConfigVO; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorPageReqVO; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorResultPageReqVO; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorResultVO; /** * @description: * @author: dzd * @date: 2025/4/8 13:44 **/ public interface MmPredictInfluenceFactorService extends BaseService<MmPredictInfluenceFactorConfigEntity> { PageResult<MmPredictInfluenceFactorConfigVO> page(MmPredictInfluenceFactorPageReqVO params); MmPredictInfluenceFactorConfigVO getInfo(String id); void create(MmPredictInfluenceFactorConfigVO vo); void update(MmPredictInfluenceFactorConfigVO vo); void delete(String id); void influenceFactorHandle(MmPredictInfluenceFactorHandleReqVO reqVO); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
@@ -95,8 +95,9 @@ Date endTime; Date startTime; List<ApiPointValueDTO> apiPointValueDTOS; // 判断是否调整 // 触发规则 AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule()); // 判断是否符合触发条件 并计算调整值 switch (triggerRuleEnum) { case SLOPE: queryDTO = new ApiPointValueQueryDTO(); iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictInfluenceFactorResultServiceImpl.java
对比新文件 @@ -0,0 +1,46 @@ package com.iailab.module.model.mcs.pre.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.pojo.SortingField; import com.iailab.framework.common.service.impl.BaseServiceImpl; import com.iailab.framework.common.util.object.BeanUtils; import com.iailab.module.model.mcs.pre.dao.MmPredictInfluenceFactorResultDao; import com.iailab.module.model.mcs.pre.entity.MmPredictInfluenceFactorResultEntity; import com.iailab.module.model.mcs.pre.service.MmPredictInfluenceFactorResultService; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorConfigVO; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorResultPageReqVO; import com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorResultVO; import lombok.extern.slf4j.Slf4j; import org.checkerframework.checker.units.qual.C; import org.springframework.stereotype.Service; import java.sql.Array; import java.util.ArrayList; import java.util.Collection; import java.util.List; @Slf4j @Service public class MmPredictInfluenceFactorResultServiceImpl extends BaseServiceImpl<MmPredictInfluenceFactorResultDao, MmPredictInfluenceFactorResultEntity> implements MmPredictInfluenceFactorResultService { @Override public PageResult<MmPredictInfluenceFactorResultVO> page(MmPredictInfluenceFactorResultPageReqVO params) { SortingField sortingField = new SortingField("time",SortingField.ORDER_DESC); List<SortingField> sortingFields = new ArrayList<>(); sortingFields.add(sortingField); QueryWrapper<MmPredictInfluenceFactorResultEntity> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("factor_id",params.getFactorId()); queryWrapper.ge(params.getStartTime() != null,"time",params.getStartTime()); queryWrapper.le(params.getEndTime() != null,"time",params.getEndTime()); PageResult<MmPredictInfluenceFactorResultEntity> result = baseDao.selectPage(params, sortingFields, queryWrapper); return new PageResult<>(BeanUtils.toBean(result.getList(),MmPredictInfluenceFactorResultVO.class), result.getTotal()); } @Override public void insert(List<MmPredictInfluenceFactorResultEntity> resultList) { baseDao.insertOrUpdate(resultList); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictInfluenceFactorServiceImpl.java
对比新文件 @@ -0,0 +1,302 @@ 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.framework.common.util.date.DateUtils; import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.data.api.point.dto.ApiPointDTO; import com.iailab.module.data.api.point.dto.ApiPointValueDTO; import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO; import com.iailab.module.data.enums.DataPointFreqEnum; import com.iailab.module.model.api.mcs.dto.MmPredictInfluenceFactorHandleReqVO; import com.iailab.module.model.mcs.pre.dao.MmPredictInfluenceFactorDao; import com.iailab.module.model.mcs.pre.entity.MmPredictInfluenceFactorConfigEntity; import com.iailab.module.model.mcs.pre.entity.MmPredictInfluenceFactorResultEntity; import com.iailab.module.model.mcs.pre.enums.InfluenceFactorPatternEnum; import com.iailab.module.model.mcs.pre.service.MmItemResultJsonService; import com.iailab.module.model.mcs.pre.service.MmPredictInfluenceFactorResultService; import com.iailab.module.model.mcs.pre.service.MmPredictInfluenceFactorService; import com.iailab.module.model.mcs.pre.vo.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; 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.function.BinaryOperator; import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @Service public class MmPredictInfluenceFactorServiceImpl extends BaseServiceImpl<MmPredictInfluenceFactorDao, MmPredictInfluenceFactorConfigEntity> implements MmPredictInfluenceFactorService { @Autowired private MmItemResultJsonService mmItemResultJsonService; @Autowired private DataPointApi dataPointApi; @Autowired private MmPredictInfluenceFactorResultService influenceFactorResultService; @Override public PageResult<MmPredictInfluenceFactorConfigVO> page(MmPredictInfluenceFactorPageReqVO params) { IPage<MmPredictInfluenceFactorConfigVO> page = baseDao.selectPage(params); return new PageResult<>(page.getRecords(), page.getTotal()); } @Override public MmPredictInfluenceFactorConfigVO getInfo(String id) { return baseDao.getInfo(id); } @Override public void create(MmPredictInfluenceFactorConfigVO vo) { MmPredictInfluenceFactorConfigEntity entity = new MmPredictInfluenceFactorConfigEntity(); String configId = UUID.randomUUID().toString(); entity.setId(configId); entity.setOutputId(vo.getOutputId()); entity.setPattern(vo.getPattern()); entity.setIsEnable(vo.getIsEnable()); entity.setCreateTime(new Date()); baseDao.insert(entity); // 添加因素 if (CollectionUtils.isEmpty(vo.getInfluenceFactors())) { return; } List<MmPredictInfluenceFactorVO> influenceFactors = vo.getInfluenceFactors(); influenceFactors.forEach(e -> { e.setId(UUID.randomUUID().toString()); e.setConfigId(configId); }); baseDao.insertInfluenceFactor(influenceFactors); } @Override public void update(MmPredictInfluenceFactorConfigVO vo) { MmPredictInfluenceFactorConfigEntity entity = new MmPredictInfluenceFactorConfigEntity(); entity.setId(vo.getId()); entity.setOutputId(vo.getOutputId()); entity.setPattern(vo.getPattern()); entity.setIsEnable(vo.getIsEnable()); baseDao.updateById(entity); // 删除因素 baseDao.deleteInfluenceFactor(vo.getId()); // 添加因素 if (CollectionUtils.isEmpty(vo.getInfluenceFactors())) { return; } List<MmPredictInfluenceFactorVO> influenceFactors = vo.getInfluenceFactors(); influenceFactors.forEach(e -> { if (StringUtils.isBlank(e.getId())) { e.setId(UUID.randomUUID().toString()); } e.setConfigId(vo.getId()); }); baseDao.insertInfluenceFactor(influenceFactors); } @Override public void delete(String id) { // 删除因素 baseDao.deleteById(id); } @Override public void influenceFactorHandle(MmPredictInfluenceFactorHandleReqVO reqVO) { // 影响时间 Date influenceTime = new Date(reqVO.getInfluenceTime()); // 判断影响时间一定是历史时间 if (influenceTime.after(new Date())) { log.info("计算影响因素失败:影响时间大于当前时间"); return; } // 查询所有影响因素 Map<String, Object> params = new HashMap<>(); params.put("isEnable",1); List<MmPredictInfluenceFactorHandleVO> influenceFactorConfigs = baseDao.selectList(params); // 根据统计方式分组 Map<String, List<MmPredictInfluenceFactorHandleVO>> patternMap = influenceFactorConfigs.stream().collect(Collectors.groupingBy(MmPredictInfluenceFactorHandleVO::getPattern)); List<MmPredictInfluenceFactorResultEntity> resultList = new ArrayList<>(influenceFactorConfigs.size()); for (Map.Entry<String, List<MmPredictInfluenceFactorHandleVO>> entry : patternMap.entrySet()) { List<MmPredictInfluenceFactorHandleVO> influenceFactors = entry.getValue(); // 缓存 因素预测项id-结果,相同因素预测项id只用计算一次 HashMap<String,Double> values = new HashMap<>(); switch (InfluenceFactorPatternEnum.fromCode(entry.getKey())) { case ACCUMULATE: for (MmPredictInfluenceFactorHandleVO influenceFactor : influenceFactors) { Double value = influenceFactorAccumulateCalculate(influenceFactor, values, influenceTime); if (value == null) { continue; } MmPredictInfluenceFactorResultEntity resultEntity = new MmPredictInfluenceFactorResultEntity(); resultEntity.setFactorId(influenceFactor.getId()); resultEntity.setTime(influenceTime); resultEntity.setValue(value); resultList.add(resultEntity); } break; case ACCURACY: for (MmPredictInfluenceFactorHandleVO influenceFactor : influenceFactors) { Double value = influenceFactorAccuracyCalculate(influenceFactor, values, influenceTime); if (value == null) { continue; } MmPredictInfluenceFactorResultEntity resultEntity = new MmPredictInfluenceFactorResultEntity(); resultEntity.setFactorId(influenceFactor.getId()); resultEntity.setTime(influenceTime); resultEntity.setValue(value); resultList.add(resultEntity); } break; default: } } if (CollectionUtils.isEmpty(resultList)) { return; } influenceFactorResultService.insert(resultList); } private Double influenceFactorAccuracyCalculate(MmPredictInfluenceFactorHandleVO influenceFactor, HashMap<String, Double> values, Date influenceTime) { if (values.containsKey(influenceFactor.getFactorOutputId())) { return values.get(influenceFactor.getFactorOutputId()); } // 根据 预测长度 和 预测粒度 推算预测时间 Calendar calendar = Calendar.getInstance(); calendar.setTime(influenceTime); calendar.add(Calendar.SECOND,-1 * influenceFactor.getPredictlength() * influenceFactor.getGranularity()); Date predictTime = calendar.getTime(); // 获取result_json,预测历史数据 List<Object[]> predictData = mmItemResultJsonService.getData(influenceFactor.getFactorOutputId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); if (CollectionUtils.isEmpty(predictData)) { return null; } // 获取真实测点历史值 ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO(); ApiPointDTO point = dataPointApi.getInfoById(influenceFactor.getPointid()); queryDTO.setPointNo(point.getPointNo()); queryDTO.setStart(predictTime); queryDTO.setEnd(influenceTime); List<ApiPointValueDTO> dataList = dataPointApi.queryPointHistoryValue(queryDTO); if (CollectionUtils.isEmpty(dataList)) { return null; } dataList = completionData(influenceFactor.getPredictlength(),dataList,predictTime,influenceTime,point.getMinfreqid()); Map<String, Double> dataMap = dataList.stream().collect(Collectors.toMap(e -> DateUtils.format(e.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND), ApiPointValueDTO::getV, (e1, e2) -> e1)); // 计算精确度误差 int sum = 0; for (int i = 0; i < predictData.size(); i++) { Object[] objects = predictData.get(i); if (dataMap.containsKey(objects[0].toString())) { double abs = Math.abs(new BigDecimal(objects[1].toString()).subtract(BigDecimal.valueOf(dataMap.get(objects[0].toString()))).doubleValue()); if (abs > influenceFactor.getDeviationValue()) { sum++; } } } double value = BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(predictData.size()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); values.put(influenceFactor.getFactorOutputId(),value); return value; } private Double influenceFactorAccumulateCalculate(MmPredictInfluenceFactorHandleVO influenceFactor, HashMap<String, Double> values,Date influenceTime) { if (values.containsKey(influenceFactor.getFactorOutputId())) { return values.get(influenceFactor.getFactorOutputId()); } // 根据 预测长度 和 预测粒度 推算预测时间 Calendar calendar = Calendar.getInstance(); calendar.setTime(influenceTime); calendar.add(Calendar.SECOND,-1 * influenceFactor.getPredictlength() * influenceFactor.getGranularity()); Date predictTime = calendar.getTime(); // 获取result_json,预测历史数据 double[] predictData = mmItemResultJsonService.getSimpleData(influenceFactor.getFactorOutputId(), predictTime, influenceFactor.getPredictlength()); if (predictData == null || predictData.length == 0) { return null; } // 获取真实测点历史值 ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO(); ApiPointDTO point = dataPointApi.getInfoById(influenceFactor.getPointid()); queryDTO.setPointNo(point.getPointNo()); queryDTO.setStart(predictTime); queryDTO.setEnd(influenceTime); List<ApiPointValueDTO> dataList = dataPointApi.queryPointHistoryValue(queryDTO); if (CollectionUtils.isEmpty(dataList)) { return null; } dataList = completionData(influenceFactor.getPredictlength(),dataList,predictTime,influenceTime,point.getMinfreqid()); // 计算累计量误差 double value = Math.abs(dataList.stream().mapToDouble(ApiPointValueDTO::getV).sum() - Arrays.stream(predictData).sum()); values.put(influenceFactor.getFactorOutputId(),value); return value; } private List<ApiPointValueDTO> completionData(int length, List<ApiPointValueDTO> dataList, Date startTime, Date endTime, String minfreqid) { if (CollectionUtils.isEmpty(dataList) || length == dataList.size()) { return dataList; } else if (length < dataList.size()) { return dataList.subList(dataList.size() - length, dataList.size()); } List<ApiPointValueDTO> result = new ArrayList<>(); long start = startTime.getTime(); long end = endTime.getTime(); long oneMin = 1000L * DataPointFreqEnum.getEumByCode(minfreqid).getValue(); long mins = (end - start) / oneMin; //找出缺少项 Map<Long, Double> sourceDataMap = new HashMap<>(dataList.size()); for (ApiPointValueDTO pv : dataList) { sourceDataMap.put(pv.getT().getTime(), pv.getV()); } Map<Long, Double> dataMap = new LinkedHashMap<>(); for (int i = 0; i < mins; i++) { Long key = start + oneMin * i; Double value = sourceDataMap.get(key); dataMap.put(key, value); } //补充缺少项 int k = 0; Map.Entry<Long, Double> lastItem = null; for (Map.Entry<Long, Double> item : dataMap.entrySet()) { if (k == 0 && item.getValue() == null) { item.setValue(getFirstValue(dataMap)); } else if (item.getValue() == null) { item.setValue(lastItem.getValue()); } k++; lastItem = item; ApiPointValueDTO dataEntity = new ApiPointValueDTO(); dataEntity.setT(new Date(item.getKey())); dataEntity.setV(item.getValue()); result.add(dataEntity); } return result; } private Double getFirstValue(Map<Long, Double> dataMap) { for (Map.Entry<Long, Double> item : dataMap.entrySet()) { if (item.getValue() != null) { return item.getValue(); } } return 0.0; } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictInfluenceFactorConfigVO.java
对比新文件 @@ -0,0 +1,56 @@ package com.iailab.module.model.mcs.pre.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.io.Serializable; import java.util.Date; import java.util.List; /** * @description: 预测项影响因素 * @author: dzd * @date: 2025/4/14 13:36 **/ @Data public class MmPredictInfluenceFactorConfigVO implements Serializable { private static final long serialVersionUID = 1L; /** * 主键 */ private String id; /** * 预测项id */ private String outputId; /** * 预测项名称 */ private String outputName; /** * 统计方式 */ private String pattern; /** * 是否启用(0禁用 1启用) */ private Integer isEnable; /** * 创建时间 */ private Date createTime; /** * 影响因素 */ private List<MmPredictInfluenceFactorVO> influenceFactors; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictInfluenceFactorHandleVO.java
对比新文件 @@ -0,0 +1,52 @@ package com.iailab.module.model.mcs.pre.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.io.Serializable; /** * @description: 预测项影响因素关联表 * @author: dzd * @date: 2025/4/14 13:36 **/ @Data public class MmPredictInfluenceFactorHandleVO implements Serializable { private static final long serialVersionUID = 1L; /** * 主键 */ private String id; /** * 因素预测项id */ private String factorOutputId; /** * 偏差值 */ private Double deviationValue; /** * 统计方式 */ private String pattern; /** * 真实测点id */ private String pointid; /** * 预测长度 */ private Integer predictlength; /** * 预测粒度 */ private Integer granularity; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictInfluenceFactorPageReqVO.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 MmPredictInfluenceFactorPageReqVO extends PageParam { @Schema(description = "预测项名称") private String outputName; @Schema(description = "统计方式") private String pattern; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictInfluenceFactorResultPageReqVO.java
对比新文件 @@ -0,0 +1,34 @@ package com.iailab.module.model.mcs.pre.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.iailab.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; /** * @description: * @author: dzd * @date: 2025/4/8 14:35 **/ @Schema(description = "预测影响因素结果 - Page Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class MmPredictInfluenceFactorResultPageReqVO extends PageParam { @Schema(description = "因素id") private String factorId; @Schema(description = "开始时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date startTime; @Schema(description = "结束时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date endTime; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictInfluenceFactorResultVO.java
对比新文件 @@ -0,0 +1,30 @@ package com.iailab.module.model.mcs.pre.vo; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * @description: 预测项影响因素结果表 * @author: dzd * @date: 2025/4/14 13:36 **/ @Data public class MmPredictInfluenceFactorResultVO implements Serializable { private static final long serialVersionUID = 1L; /** * 因素id */ private String factorId; /** * 影响时间 */ private Date time; /** * 影响值 */ private Double value; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/vo/MmPredictInfluenceFactorVO.java
对比新文件 @@ -0,0 +1,43 @@ package com.iailab.module.model.mcs.pre.vo; 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; /** * @description: 预测项影响因素关联表 * @author: dzd * @date: 2025/4/14 13:36 **/ @Data public class MmPredictInfluenceFactorVO implements Serializable { private static final long serialVersionUID = 1L; /** * 主键 */ private String id; /** * 配置id */ private String configId; /** * 因素预测项id */ private String factorOutputId; /** * 因素预测项名称 */ private String factorOutputName; /** * 偏差值 */ private Double deviationValue; } iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml
@@ -228,6 +228,9 @@ - t_ml_project - t_ml_project_model - t_mm_predict_auto_adjust_config - t_mm_predict_influence_factor_config - t_mm_predict_influence_factor - t_mm_predict_influence_factor_result app: app-key: model app-secret: 85b0df7edc3df3611913df34ed695011 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictInfluenceFactorResultDao.xml
对比新文件 @@ -0,0 +1,14 @@ <?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.MmPredictInfluenceFactorResultDao"> <insert id="insertOrUpdate" parameterType="com.iailab.module.model.mcs.pre.entity.MmPredictInfluenceFactorResultEntity"> INSERT INTO t_mm_predict_influence_factor_result (factor_id, time, value) VALUES <foreach collection="list" item="item" separator=","> (#{item.factorId},#{item.time},#{item.value}) </foreach> ON DUPLICATE KEY UPDATE value = VALUES(value); </insert> </mapper> iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/pre/MmPredictInfluenceFactorDao.xml
对比新文件 @@ -0,0 +1,96 @@ <?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.MmPredictInfluenceFactorDao"> <resultMap id="influenceFactor" type="com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorConfigVO"> <id property="id" column="id"/> <result property="outputId" column="output_id"/> <result property="outputName" column="output_name"/> <result property="pattern" column="pattern"/> <result property="isEnable" column="is_enable"/> <result property="createTime" column="create_time"/> <collection property="influenceFactors" ofType="com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorVO"> <id property="id" column="factors_id"/> <result property="factorOutputId" column="factor_output_id"/> <result property="factorOutputName" column="factor_output_name"/> <result property="deviationValue" column="deviation_value"/> </collection> </resultMap> <insert id="insertInfluenceFactor" parameterType="com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorVO"> INSERT INTO t_mm_predict_influence_factor (id,config_id,factor_output_id,deviation_value) VALUES <foreach collection="list" item="item" separator=","> (#{item.id},#{item.configId},#{item.factorOutputId},#{item.deviationValue}) </foreach> </insert> <select id="getPage" resultMap="influenceFactor"> SELECT t1.id, t1.output_id, t3.result_name output_name, t1.pattern, t1.is_enable, t1.create_time, t2.id factors_id, t2.factor_output_id, t4.result_name factor_output_name, t2.deviation_value FROM t_mm_predict_influence_factor_config t1 LEFT JOIN t_mm_predict_influence_factor t2 ON t1.id = t2.config_id LEFT JOIN t_mm_item_output t3 ON t1.output_id = t3.id LEFT JOIN t_mm_item_output t4 ON t2.factor_output_id = t4.id <where> <if test="params.outputName != null and params.outputName != ''"> and t3.result_name like CONCAT('%', #{params.outputName},'%') </if> <if test="params.pattern != null and params.pattern != ''"> and t1.pattern = #{params.pattern} </if> </where> order by t1.create_time desc </select> <select id="getInfo" resultMap="influenceFactor" parameterType="java.lang.String"> SELECT t1.id, t1.output_id, t3.result_name output_name, t1.pattern, t1.is_enable, t1.create_time, t2.id factors_id, t2.factor_output_id, t2.deviation_value FROM t_mm_predict_influence_factor_config t1 LEFT JOIN t_mm_predict_influence_factor t2 ON t1.id = t2.config_id LEFT JOIN t_mm_item_output t3 on t1.output_id = t3.id where t1.id = #{id} </select> <select id="selectList" resultType="com.iailab.module.model.mcs.pre.vo.MmPredictInfluenceFactorHandleVO" parameterType="map"> SELECT t2.id, t2.factor_output_id, t2.deviation_value, t1.pattern, t3.pointid, t4.predictlength, t4.granularity FROM t_mm_predict_influence_factor_config t1 LEFT JOIN t_mm_predict_influence_factor t2 ON t1.id = t2.config_id LEFT JOIN t_mm_item_output t3 ON t2.factor_output_id = t3.id LEFT JOIN t_mm_predict_item t4 ON t3.itemid = t4.id <where> <if test="params.isEnable != null and params.isEnable != ''"> and t1.is_enable = #{params.isEnable} </if> <if test="params.pattern != null and params.pattern != ''"> and t1.pattern = #{params.pattern} </if> </where> order by t1.create_time desc </select> </mapper>