工业互联网平台2.0版本后端代码
潘志宝
2025-05-26 9881ce0814ad642646d9b76ad2caa70a0b966036
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
@@ -60,8 +60,8 @@
    }
    @Override
    public MmPredictAutoAdjustConfigEntity getByCode(String code) {
        return baseDao.selectOne("config_code",code,"is_enable",1);
    public List<MmPredictAutoAdjustConfigEntity> getByCode(String code) {
        return baseDao.selectList(MmPredictAutoAdjustConfigEntity::getConfigCode,code,MmPredictAutoAdjustConfigEntity::getIsEnable,1);
    }
    @Override
@@ -85,24 +85,43 @@
    public boolean autoAdjustByCode(String configCode,long adjustStartTime) {
        log.info("开始自动调整:configCode:" + configCode + ",adjustStartTime:" + new Date(adjustStartTime));
        // 查询调整配置
        MmPredictAutoAdjustConfigEntity configEntity = getByCode(configCode);
        if (configEntity == null) {
            log.info("自动调整失败原因:configEntity为null");
        List<MmPredictAutoAdjustConfigEntity> configEntityList = getByCode(configCode);
        if (CollectionUtils.isEmpty(configEntityList)) {
            log.info("自动调整失败原因:configEntityList为空");
            return false;
        }
        // 根据outputId分组
        Map<String, List<MmPredictAutoAdjustConfigEntity>> outputIdMap = configEntityList.stream().collect(Collectors.groupingBy(MmPredictAutoAdjustConfigEntity::getOutputId));
        for (Map.Entry<String, List<MmPredictAutoAdjustConfigEntity>> entry : outputIdMap.entrySet()) {
            String outputId = entry.getKey();
        // 查询调整用户adjustStartTime 至 adjustStartTime - 预测长度 * 预测粒度 范围的值
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(adjustStartTime);
        Date endTime = calendar.getTime();
        ItemVO item = mmPredictItemService.getItemByOutPutId(configEntity.getOutputId());
            ItemVO item = mmPredictItemService.getItemByOutPutId(outputId);
        if (item == null) {
            log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + configEntity.getOutputId());
            return false;
                log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + outputId);
                continue;
        }
        calendar.add(Calendar.SECOND,item.getPredictLength() * item.getGranularity() * -1);
        Date startTime = calendar.getTime();
            // 获取预测历史结果
            InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
            pojo.setType(DataTypeEnum.FLOAT_LAST_BAK.getCode());
            pojo.setOutPutId(outputId);
            List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, new Date(adjustStartTime), new Date(adjustStartTime));
            if (CollectionUtils.isEmpty(influxModelResult)) {
                log.info("自动调整失败原因:预测历史结果为空。itemNo:" + item.getItemNo() + ",itemName:" + item.getItemName() + ",outputId:" + outputId + ",time:" + adjustStartTime);
                continue;
            }
            // 计算所有影响用户的最终调整值
            Double finalAdjustValue = 0.0;
            for (MmPredictAutoAdjustConfigEntity configEntity : entry.getValue()) {
                Double adjustValue = null;
                // 查询影响用户历史值
        ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO();
        ApiPointDTO pointInfo = dataPointApi.getInfoById(configEntity.getPointId());
        queryDTO.setPointNo(pointInfo.getPointNo());
@@ -110,29 +129,18 @@
        queryDTO.setStart(startTime);
        List<ApiPointValueDTO> apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
        if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
            log.info("自动调整失败原因:测点数据长度为0。queryDTO:" + queryDTO);
            return false;
                    log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:测点数据长度为0。queryDTO:" + queryDTO);
                    continue;
        }
        // 过滤掉-2
        apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> !Double.valueOf(e.getV()).equals(-2.0)).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
            log.info("自动调整失败原因:过滤掉-2之后测点数据长度为0。queryDTO:" + queryDTO);
            return false;
        }
        // 获取预测历史结果
        InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
        pojo.setType(DataTypeEnum.FLOAT_LAST.getCode());
        pojo.setOutPutId(configEntity.getOutputId());
        List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, new Date(adjustStartTime), new Date(adjustStartTime));
        if (CollectionUtils.isEmpty(influxModelResult)) {
            log.info("自动调整失败原因:预测历史结果为空。itemNo:" + item.getItemNo() + ",itemName" + item.getItemName() + ",outputId" + configEntity.getOutputId() + ",time" + adjustStartTime);
            return false;
                    log.info("影响用户调整失败原因:过滤掉-2之后测点数据长度为0。queryDTO:" + queryDTO);
                    continue;
        }
        // 触发规则
        AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule());
        Double adjustValue = null;
        // 判断是否符合触发条件 并计算调整值
        switch (triggerRuleEnum) {
            case SLOPE:
@@ -143,8 +151,8 @@
                slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
                Date slopeEndTime = slopeCalendar.getTime();
                if (slopeEndTime.after(endTime)) {
                    log.info("自动调整失败原因:△t设置过大,大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
                    return false;
                            log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:△t设置过大,大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
                            continue;
                }
                while (!slopeEndTime.after(endTime)) {
                    //计算斜率
@@ -185,8 +193,8 @@
                Date averageEndTime = averageCalendar.getTime();
                if (averageEndTime.after(endTime)) {
                    log.info("自动调整失败原因:△t设置过大,△t*2大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
                    return false;
                            log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:△t设置过大,△t*2大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
                            continue;
                }
                while (!averageEndTime.after(endTime)) {
                    //计算均值差
@@ -217,32 +225,40 @@
                }
                break;
            default:
                log.info("自动调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
                return false;
                        log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
                        continue;
        }
        if (adjustValue == null) {
            log.info("自动调整失败原因:未达到触发条件");
            return false;
                    log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:未达到触发条件");
                    continue;
        }
        // 调整系数
        adjustValue = adjustValue * configEntity.getAdjustCoefficient();
        // 调整方向
        adjustValue = adjustValue * configEntity.getAdjustDirection();
                // 累加到最终调整值
                finalAdjustValue += adjustValue;
            }
            // 执行调整
            if (finalAdjustValue.equals(0.0)) {
                log.info("自动调整失败原因:finalAdjustValue为0,outputId:" + outputId + ",configCode:" + configCode);
                continue;
            }
        List<InfluxModelResultPOJO> lastList = new ArrayList<>();
        for (InfluxModelResultVO resultVO : influxModelResult) {
            InfluxModelResultLastSimPOJO adjustPojo = new InfluxModelResultLastSimPOJO();
            // 设置新的调整值
            adjustPojo.setValue(Double.parseDouble(resultVO.getValue().toString()) + adjustValue);
                adjustPojo.setValue(Double.parseDouble(resultVO.getValue().toString()) + finalAdjustValue);
            adjustPojo.setTimestamp(resultVO.getTimestamp());
            adjustPojo.setOutPutId(configEntity.getOutputId());
                adjustPojo.setOutPutId(outputId);
            lastList.add(adjustPojo);
        }
        // 相同时间直接覆盖旧值
        influxDBService.asyncWriteModelResults(lastList);
        log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + adjustValue + ",itemNo:" + item.getItemNo() + ",itemName" + item.getItemName() + ",outputId" + configEntity.getOutputId() + ",adjustTime:" + adjustStartTime);
            log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + finalAdjustValue + ",itemNo:" + item.getItemNo() + ",itemName:" + item.getItemName() + ",outputId:" + outputId + ",adjustTime:" + adjustStartTime);
        }
        return true;
    }
}