iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java
@@ -97,12 +97,12 @@ Object dataValue = e.getDataValue(); if (dataValue != null && dataValue instanceof Number) { BigDecimal value = new BigDecimal(dataValue.toString()); if (indItem.getPrecision() != null) { value = new BigDecimal(dataValue.toString()).setScale(indItem.getPrecision(), BigDecimal.ROUND_HALF_UP); } if (StringUtils.isNotBlank(indItem.getCoefficient())) { value = value.multiply(new BigDecimal(indItem.getCoefficient())); } if (indItem.getPrecision() != null) { value = value.setScale(indItem.getPrecision(), BigDecimal.ROUND_HALF_UP); } e.setDataValue(value.doubleValue()); } } iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/InsertInfluxdbTask.java
@@ -24,7 +24,7 @@ @Override public void run(String params){ logger.debug("insertInfluxdbTask定时任务正在执行,参数为:{}", params); logger.info("insertInfluxdbTask定时任务正在执行,参数为:{}", params); String[] split = params.split(","); // List<InfluxPointValuePOJO> pointValues = new ArrayList<>(); // InfluxPointValueSimPOJO pojo = new InfluxPointValueSimPOJO(); iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
@@ -76,7 +76,7 @@ public static final String PV = "point_value:"; public static final long offset = 60 * 2L; public static final long offset = 30L; /** * 采集 @@ -100,17 +100,17 @@ List<DaPointDTO> pointMeasureList = daPointService.getMeasurePoint(minfreq); pointValues.addAll(measureHandle.handle(collectTime, pointMeasureList, dataMap, listGood, listBad)); log.info("读取计算点"); List<DaPointDTO> pointCalculateList = daPointService.getMathPoint(minfreq); pointValues.addAll(calculateHandle.handle(collectTime, pointCalculateList, dataMap, listGood, listBad)); log.info("读取累计点"); List<DaPointDTO> pointCumulateList = daPointService.getCumulatePoint(minfreq); pointValues.addAll(cumulateHandle.handle(collectTime, pointCumulateList, listGood, listBad)); pointValues.addAll(cumulateHandle.handle(collectTime, pointCumulateList, dataMap, listGood, listBad)); log.info("读取极值点"); List<DaPointDTO> pointExtremalList = daPointService.getExtremalPoint(minfreq); pointValues.addAll(extremalHandle.handle(collectTime, pointExtremalList, listGood, listBad)); pointValues.addAll(extremalHandle.handle(collectTime, pointExtremalList, dataMap, listGood, listBad)); log.info("读取计算点"); List<DaPointDTO> pointCalculateList = daPointService.getMathPoint(minfreq); pointValues.addAll(calculateHandle.handle(collectTime, pointCalculateList, dataMap, listGood, listBad)); log.info("存入时序库"); log.info("pointValueTimestamp=" + (pointValues.get(0) == null ? 0 : pointValues.get(0).getTimestamp().getNano())); iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
@@ -47,6 +47,12 @@ private ConstantHandle constantHandle; @Resource private CumulateHandle cumulateHandle; @Resource private ExtremalHandle extremalHandle; @Resource private JavaScriptHandler javaScriptHandler; @Autowired @@ -171,6 +177,8 @@ pointNos.add(s); dataMap.putAll(measureHandle.getCurrent(pointNos)); dataMap.putAll(constantHandle.getCurrent(pointNos)); dataMap.putAll(cumulateHandle.getCurrent(pointNos)); dataMap.putAll(extremalHandle.getCurrent(pointNos)); if (dataMap.get(s) == null) { log.info("计算点数据异常"); log.info("pointNo=" + dto.getPointNo() + ";dataMap.key=" + s); iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java
@@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.*; /** @@ -33,9 +34,13 @@ return result; } dtos.forEach(dto -> { InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto); BigDecimal defaultValue = dto.getDefaultValue(); BigDecimal coefficient = dto.getUnittransfactor() == null ? BigDecimal.ONE : dto.getUnittransfactor(); defaultValue = defaultValue.multiply(coefficient); InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto,defaultValue); pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid()))); dataMap.put(dto.getPointNo(), dto.getDefaultValue()); dataMap.put(dto.getPointNo(), defaultValue); result.add(pojo); listGood.add(dto.getPointNo()); }); @@ -49,7 +54,8 @@ List<DaPointDTO> pointConstantList = daPointService.getConstantPoint(pointNos); if (!CollectionUtils.isEmpty(pointConstantList)) { pointConstantList.forEach(item -> { data.put(item.getPointNo(), item.getDefaultValue()); BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor(); data.put(item.getPointNo(), item.getDefaultValue().multiply(coefficient)); }); } return data; iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java
@@ -23,6 +23,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; import java.util.concurrent.TimeUnit; /** * 累计点处理 @@ -45,7 +46,7 @@ @Autowired private RedisTemplate<String, Object> redisTemplate; public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, List<String> listGood, List<String> listBad) { public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap, List<String> listGood, List<String> listBad) { List<InfluxPointValuePOJO> result = new ArrayList<>(); try { log.info("累计点处理开始"); @@ -59,6 +60,7 @@ BigDecimal calValue = new BigDecimal(rawValue.toString()).multiply(coefficient); InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, calValue); pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid()))); dataMap.put(dto.getPointNo(), calValue); result.add(pojo); } catch (Exception ex) { ex.printStackTrace(); @@ -90,6 +92,9 @@ Object rawValue = singleCompute(item, calendar.getTime()); BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor(); value = new BigDecimal(rawValue.toString()).multiply(coefficient); // 写入缓存 redisTemplate.opsForValue().set(PointCollector.PV + item.getPointNo(), new BigDecimal(value.toString()).doubleValue(), PointCollector.offset, TimeUnit.SECONDS); } data.put(item.getPointNo(), value); }); @@ -126,7 +131,7 @@ List<ApiPointValueDTO> dataList = new ArrayList<>(); List<ApiPointValueDTO> dataListTemp = dataPointApi.queryPointHistoryValue(queryDto); if (dto.getIsCumuNeg() != null && dto.getIsCumuNeg().equals(0)) { for(ApiPointValueDTO item : dataListTemp) { for (ApiPointValueDTO item : dataListTemp) { if (item.getV() > 0) { dataList.add(item); } @@ -163,7 +168,7 @@ long start = startTime.getTime(); long end = endTime.getTime(); long oneMin = 1000L * DataPointFreqEnum.getEumByCode(minfreqid).getValue(); long mins = (end - start) / oneMin; long mins = ((end - start) / oneMin) + 1; //找出缺少项 Map<Long, Double> sourceDataMap = new HashMap<>(dataList.size()); iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ExtremalHandle.java
@@ -20,6 +20,7 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; /** @@ -43,7 +44,7 @@ @Autowired private RedisTemplate<String, Object> redisTemplate; public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, List<String> listGood, List<String> listBad) { public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap, List<String> listGood, List<String> listBad) { List<InfluxPointValuePOJO> result = new ArrayList<>(); try { log.info("极值点处理开始"); @@ -52,9 +53,12 @@ } dtos.forEach(dto -> { try { Object value = singleCompute(dto, collectTime, listGood, listBad); InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, value); Object rawValue = singleCompute(dto, collectTime, listGood, listBad); BigDecimal coefficient = dto.getUnittransfactor() == null ? BigDecimal.ONE : dto.getUnittransfactor(); BigDecimal calValue = new BigDecimal(rawValue.toString()).multiply(coefficient); InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, calValue); pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid()))); dataMap.put(dto.getPointNo(), calValue); result.add(pojo); } catch (Exception ex) { ex.printStackTrace(); @@ -83,6 +87,8 @@ value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo()); } else { value = singleCompute(item, calendar.getTime(), new ArrayList<>(), new ArrayList<>()); BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor(); value = new BigDecimal(value.toString()).multiply(coefficient); } data.put(item.getPointNo(), value); }); iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
@@ -224,61 +224,61 @@ public Map<String, Object> getCurrent(List<String> pointNos) { Map<String, Object> data = new HashMap<>(); List<DaPointDTO> pointMeasureList = daPointService.getMeasurePoint(pointNos); pointMeasureList.forEach( item -> { try { Object value = CommonConstant.BAD_VALUE; boolean hasKey = redisTemplate.hasKey(PointCollector.PV + item.getPointNo()); if (hasKey) { value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo()); } if(hasKey && StrUtils.isNumeric(value.toString()) && new BigDecimal(value.toString()).compareTo(CommonConstant.BAD_VALUE) != 0 ) { value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo()); } else if (DataSourceType.OPCUA.getCode().equals(item.getSourceType())) { value = opcUaCollector.getTagValue(item.getSourceId(), item.getTagNo()); } else if (DataSourceType.ModBus.getCode().equals(item.getSourceType())) { value = modBusCollector.getTagValue(item.getSourceId(), item.getTagNo()); } else if (DataSourceType.KIO.getCode().equals(item.getSourceType())) { value = kingIOCollector.getTagValue(item.getSourceId(), item.getTagNo()); } else if (DataSourceType.HTTP.getCode().equals(item.getSourceType())) { if (SourceApiEnum.iHyperDB.getCode().equals(item.getSourceName())) { value = httpCollectorForIhd.getTagValue(item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType()); } else if (SourceApiEnum.ASDB.getCode().equals(item.getSourceName())) { value = httpCollectorForAsdb.getTagValue(item.getSourceId(), item.getTagNo()); } else if (SourceApiEnum.ASDE.getCode().equals(item.getSourceName())) { value = httpCollectorForAsde.getTagValue(item.getSourceId(), item.getTagNo()); } else if (SourceApiEnum.ASDC.getCode().equals(item.getSourceName())) { value = httpCollectorForAsdc.getTagValue(item.getSourceId(), item.getTagNo()); } else if (SourceApiEnum.ASDY.getCode().equals(item.getSourceName())) { value = httpCollectorForAsdy.getTagValue(item.getSourceId(), item.getTagNo()); } } else { log.info("没有匹配的TagNo=" + item.getTagNo()); } log.info("TagNo=" + item.getTagNo() + ",value=" + value.toString()); if (!PointDataTypeEnum.BOOLEAN.getCode().equals(item.getDataType())) { BigDecimal decValue = new BigDecimal(value.toString()); if (PointDataTypeEnum.FLOAT.getCode().equals(item.getDataType())) { decValue = decValue.setScale(2, BigDecimal.ROUND_HALF_UP); } else if (PointDataTypeEnum.INT.getCode().equals(item.getDataType())) { decValue = decValue.setScale(0, BigDecimal.ROUND_HALF_UP); } data.put(item.getPointNo(), decValue); } else { data.put(item.getPointNo(), value); } if (!hasKey) { // 存入缓存 toRedis(value, item); } } catch (Exception ex) { ex.printStackTrace(); for (DaPointDTO item : pointMeasureList) { try { Object value = CommonConstant.BAD_VALUE; boolean hasKey = redisTemplate.hasKey(PointCollector.PV + item.getPointNo()); if (hasKey && !StrUtils.isNumeric(value.toString())) { value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo()); data.put(item.getPointNo(), value); continue; } else if(hasKey && StrUtils.isNumeric(value.toString()) && new BigDecimal(value.toString()).compareTo(CommonConstant.BAD_VALUE) != 0 ) { value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo()); data.put(item.getPointNo(), value); continue; } else if (DataSourceType.OPCUA.getCode().equals(item.getSourceType())) { value = opcUaCollector.getTagValue(item.getSourceId(), item.getTagNo()); } else if (DataSourceType.ModBus.getCode().equals(item.getSourceType())) { value = modBusCollector.getTagValue(item.getSourceId(), item.getTagNo()); } else if (DataSourceType.KIO.getCode().equals(item.getSourceType())) { value = kingIOCollector.getTagValue(item.getSourceId(), item.getTagNo()); } else if (DataSourceType.HTTP.getCode().equals(item.getSourceType())) { if (SourceApiEnum.iHyperDB.getCode().equals(item.getSourceName())) { value = httpCollectorForIhd.getTagValue(item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType()); } else if (SourceApiEnum.ASDB.getCode().equals(item.getSourceName())) { value = httpCollectorForAsdb.getTagValue(item.getSourceId(), item.getTagNo()); } else if (SourceApiEnum.ASDE.getCode().equals(item.getSourceName())) { value = httpCollectorForAsde.getTagValue(item.getSourceId(), item.getTagNo()); } else if (SourceApiEnum.ASDC.getCode().equals(item.getSourceName())) { value = httpCollectorForAsdc.getTagValue(item.getSourceId(), item.getTagNo()); } else if (SourceApiEnum.ASDY.getCode().equals(item.getSourceName())) { value = httpCollectorForAsdy.getTagValue(item.getSourceId(), item.getTagNo()); } } else { log.info("没有匹配的TagNo=" + item.getTagNo()); } ); log.info("TagNo=" + item.getTagNo() + ",value=" + value.toString()); if (!PointDataTypeEnum.BOOLEAN.getCode().equals(item.getDataType())) { BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor(); BigDecimal decValue = new BigDecimal(value.toString()).multiply(coefficient); if (PointDataTypeEnum.FLOAT.getCode().equals(item.getDataType())) { decValue = decValue.setScale(2, BigDecimal.ROUND_HALF_UP); } else if (PointDataTypeEnum.INT.getCode().equals(item.getDataType())) { decValue = decValue.setScale(0, BigDecimal.ROUND_HALF_UP); } data.put(item.getPointNo(), decValue); } else { data.put(item.getPointNo(), value); } if (!hasKey) { // 存入缓存 toRedis(value, item); } } catch (Exception ex) { ex.printStackTrace(); } } return data; } iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/common/PointCumulateUnitEnum.java
@@ -1,6 +1,5 @@ package com.iailab.module.data.point.common; import com.iailab.framework.common.util.date.DateUtils; import lombok.AllArgsConstructor; import lombok.Getter; @@ -27,6 +26,14 @@ DAY("day", (end, length) -> { Calendar cal = (Calendar) end.clone(); cal.add(Calendar.DAY_OF_MONTH, -length); return cal; }), THIS_DAY("this_day", (end, length) -> { Calendar cal = (Calendar) end.clone(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal; }), THIS_MONTH("this_month", (end, length) -> { @@ -67,7 +74,7 @@ } } Calendar startCal = unit.calculate(endTime, length); Calendar startCal = unit.calculate(endTime, length - 1); return startCal.getTime(); } } iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java
@@ -2,6 +2,7 @@ import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -427,7 +428,7 @@ // 2. 遍历,逐个创建 or 更新 PointImportRespVO respVO = PointImportRespVO.builder().createPointnames(new ArrayList<>()) .updatePointnames(new ArrayList<>()).failurePointnames(new LinkedHashMap<>()).build(); importPoints.forEach(importPoint -> { for(PointImportExcelVO importPoint : importPoints) { // 判断如果不存在,再进行插入 DaPointEntity existPoint = null; if (StringUtils.isNotBlank(importPoint.getPointNo())) { @@ -439,6 +440,9 @@ daPointEntity.setId(UUID.randomUUID().toString()); daPointEntity.setIsEnable(CommonConstant.IS_ENABLE); daPointEntity.setCreateTime(new Date()); if(PointTypeEnum.getEumByCode(daPointEntity.getPointType()) == null) { continue; } switch (PointTypeEnum.getEumByCode(daPointEntity.getPointType())) { case MEASURE_POINT: DaMeasurePointDTO measurePoint = new DaMeasurePointDTO(); @@ -462,6 +466,7 @@ cumulatePoint.setMomentPoint(importPoint.getMomentPoint()); cumulatePoint.setLength(importPoint.getLength()); cumulatePoint.setDivisor(importPoint.getDivisor()); cumulatePoint.setIsCumuNeg(importPoint.getIsCumuNeg()); daCumulatePointService.add(cumulatePoint, daPointEntity.getId()); daPointEntity.setPointNo(daSequenceNumService.getAndIncreaseByCode(IncreaseCodeEnum.POINT_L.name())); default: @@ -471,13 +476,13 @@ daPointDao.insert(daPointEntity); daPointCollectStatusService.add(daPointEntity.getPointNo()); respVO.getCreatePointnames().add(importPoint.getPointName()); return; continue; } // 如果存在,判断是否允许更新 if (!isUpdateSupport) { respVO.getFailurePointnames().put(importPoint.getPointName(), POINT_EXISTS.getMsg()); return; continue; } DaPointEntity updatePoint = BeanUtils.toBean(importPoint, DaPointEntity.class); @@ -490,8 +495,6 @@ measurePoint.setSourceId(sourcesIdMap.get(importPoint.getSourceType()).get(importPoint.getSourceName())); measurePoint.setTagNo(importPoint.getTagNo()); daMeasurePointService.update(measurePoint, new QueryWrapper<DaMeasurePointEntity>().eq("point_id",updatePoint.getId())); break; case CALCULATE_POINT: break; @@ -499,7 +502,7 @@ break; } respVO.getUpdatePointnames().add(importPoint.getPointName()); }); } return respVO; } iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml
@@ -161,6 +161,7 @@ t1.point_type, t1.store_type, t1.data_type, t1.unittransfactor, t1.minfreqid FROM t_da_point t1 <where> iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -1028,11 +1028,9 @@ `adjust_value_rule` varchar(36) DEFAULT NULL COMMENT '调整值计算规则', `is_enable` tinyint DEFAULT NULL COMMENT '是否启用(0禁用 1启用)', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `config_code` (`config_code`) `adjust_coefficient` decimal(10,6) DEFAULT '1.000000' COMMENT '调整系数', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='预测结果自动调整配置表'; alter table t_mm_predict_auto_adjust_config add column `adjust_coefficient` decimal(10,6) DEFAULT 1 COMMENT '调整系数'; -- 预测项影响因素 iailab-module-model/iailab-module-model-biz/db/增量SQL/2025.sql
@@ -43,6 +43,7 @@ `conf_id` varchar(36) COMMENT '快照配置ID', `data_type` varchar(20) DEFAULT NULL COMMENT '数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)', `data_no` varchar(36) COMMENT '数据编号', `data_name` varchar(36) COMMENT '数据名称', `left_length` integer COMMENT '左侧长度(min)', `right_length` integer COMMENT '右侧侧长度(min)', `sort` integer COMMENT '排序', @@ -57,20 +58,21 @@ CREATE TABLE `t_st_suggest_snapshot_record` ( `id` varchar(36) NOT NULL, `suggest_id` varchar(36) COMMENT '建议ID(只记录采纳)', `operation_id` varchar(36) COMMENT '操作记录ID(只记录采纳)', `model_id` varchar(36) DEFAULT NULL COMMENT '模型ID', `data_type` varchar(20) DEFAULT NULL COMMENT '数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)', `data_no` varchar(36) COMMENT '数据编号', `schedule_time` datetime DEFAULT NULL COMMENT '调度时间', `start_time` datetime DEFAULT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '结束时间', `json_value` varchar(50) COMMENT '序列化的数据', `sort` integer COMMENT '排序', `id` varchar(36) NOT NULL, `suggest_id` varchar(36) COMMENT '建议ID(只记录采纳)', `operation_id` varchar(36) COMMENT '操作记录ID(只记录采纳)', `model_id` varchar(36) DEFAULT NULL COMMENT '模型ID', `data_type` varchar(20) DEFAULT NULL COMMENT '数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)', `data_no` varchar(36) COMMENT '数据编号', `data_name` varchar(36) COMMENT '数据名称', `schedule_time` datetime DEFAULT NULL COMMENT '调度时间', `start_time` datetime DEFAULT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '结束时间', `json_value` varchar(50) COMMENT '序列化的数据', `sort` integer COMMENT '排序', PRIMARY KEY (`id`) USING BTREE, KEY `idx_suggest_id` (`suggest_id`) USING BTREE KEY `idx_suggest_id` (`suggest_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='调度建议快照记录表'; ALTER TABLE `iailab_expert_tenant_shasteel`.`t_st_suggest_operation_record` ALTER TABLE `t_st_suggest_operation_record` ADD COLUMN `reason` varchar(255) NULL COMMENT '原因' AFTER `operate`; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -1022,6 +1022,7 @@ if (entity != null){ operationRecordVo.setTitle(entity.getTitle()); operationRecordVo.setContent(entity.getContent()); operationRecordVo.setScheduleObj(entity.getScheduleObj()); if (StringUtils.isNotBlank(entity.getModelId())){ //获取模型记录信息 StScheduleRecordRespVO scheduleRecordVO = stScheduleRecordService.getInfoByModelIdAndScheduleTime(entity.getModelId(), entity.getScheduleTime()); iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataCategoryEnum.java
对比新文件 @@ -0,0 +1,37 @@ package com.iailab.module.model.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * @author Jay */ @Getter @AllArgsConstructor public enum DataCategoryEnum { DATAPOINT("DATAPOINT", "测点"), IND("IND", "指标"), PLAN("PLAN", "计划"), PREDICT_ITEM_N("PREDICT_ITEM_N", "T+N预测值"), PREDICT_ITEM_L("PREDICT_ITEM_L", "T+L预测值"), PREDICT_ITEM_C("PREDICT_ITEM_C", "当时预测值"); private String code; private String desc; public static PreLineTypeEnum getEumByCode(String code) { if (code == null) { return null; } for (PreLineTypeEnum statusEnum : PreLineTypeEnum.values()) { if (statusEnum.getCode().equals(code)) { return statusEnum; } } return null; } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java
@@ -20,7 +20,7 @@ MmPredictAutoAdjustConfigEntity getInfo(String id); MmPredictAutoAdjustConfigEntity getByCode(String code); List<MmPredictAutoAdjustConfigEntity> getByCode(String code); void create(MmPredictAutoAdjustConfigEntity entity); 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,164 +85,185 @@ 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(outputId); if (item == null) { log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + outputId); continue; } calendar.add(Calendar.SECOND,item.getPredictLength() * item.getGranularity() * -1); Date startTime = calendar.getTime(); // 查询调整用户adjustStartTime 至 adjustStartTime - 预测长度 * 预测粒度 范围的值 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(adjustStartTime); Date endTime = calendar.getTime(); ItemVO item = mmPredictItemService.getItemByOutPutId(configEntity.getOutputId()); if (item == null) { log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + configEntity.getOutputId()); return false; } calendar.add(Calendar.SECOND,item.getPredictLength() * item.getGranularity() * -1); Date startTime = calendar.getTime(); ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO(); ApiPointDTO pointInfo = dataPointApi.getInfoById(configEntity.getPointId()); queryDTO.setPointNo(pointInfo.getPointNo()); queryDTO.setEnd(endTime); queryDTO.setStart(startTime); List<ApiPointValueDTO> apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO); if (CollectionUtils.isEmpty(apiPointValueDTOS)) { log.info("自动调整失败原因:测点数据长度为0。queryDTO:" + queryDTO); return false; } // 过滤掉-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_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; } // 获取预测历史结果 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; } // 触发规则 AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule()); Double adjustValue = null; // 判断是否符合触发条件 并计算调整值 switch (triggerRuleEnum) { case SLOPE: // 计算每个△t的斜率,任意一个大于触发值则认为该区间有调整 Calendar slopeCalendar = Calendar.getInstance(); slopeCalendar.setTime(startTime); Date slopeStartTime = slopeCalendar.getTime(); slopeCalendar.add(Calendar.MINUTE,configEntity.getT()); Date slopeEndTime = slopeCalendar.getTime(); if (slopeEndTime.after(endTime)) { log.info("自动调整失败原因:△t设置过大,大于模型预测长度 * 预测粒度。△t:" + configEntity.getT()); return false; // 计算所有影响用户的最终调整值 Double finalAdjustValue = 0.0; for (MmPredictAutoAdjustConfigEntity configEntity : entry.getValue()) { Double adjustValue = null; // 查询影响用户历史值 ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO(); ApiPointDTO pointInfo = dataPointApi.getInfoById(configEntity.getPointId()); if (pointInfo == null) { log.info("自动调整失败原因:影响用户pointInfo为空。pointId:" + configEntity.getPointId() + "configCode:" + configEntity.getConfigCode() + "configName:" + configEntity.getConfigName()); continue; } while (!slopeEndTime.after(endTime)) { //计算斜率 //△t开始时间测点值 Date finalSlopeStartTime = slopeStartTime; Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(apiPointValueDTO -> apiPointValueDTO.getT().equals(finalSlopeStartTime)).findFirst(); //△t结束时间测点值 Date finalSlopeEndTime = slopeEndTime; Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(finalSlopeEndTime)).findFirst(); if (startOptional.isPresent() && endOptional.isPresent()) { 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) { // 计算调整值 并跳出循环 adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS); log.info("计算调整值:" + adjustValue + ",斜率:" + slope + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",slopeStartTime:" + slopeStartTime + ",slopeEndTime:" + slopeEndTime); break; log.info("自动调整开始处理:configName:" + configEntity.getConfigName() + "影响用户:" + pointInfo.getPointName()); queryDTO.setPointNo(pointInfo.getPointNo()); queryDTO.setEnd(endTime); queryDTO.setStart(startTime); List<ApiPointValueDTO> apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO); if (CollectionUtils.isEmpty(apiPointValueDTOS)) { 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); continue; } // 触发规则 AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule()); // 判断是否符合触发条件 并计算调整值 switch (triggerRuleEnum) { case SLOPE: // 计算每个△t的斜率,任意一个大于触发值则认为该区间有调整 Calendar slopeCalendar = Calendar.getInstance(); slopeCalendar.setTime(startTime); Date slopeStartTime = slopeCalendar.getTime(); slopeCalendar.add(Calendar.MINUTE,configEntity.getT()); Date slopeEndTime = slopeCalendar.getTime(); if (slopeEndTime.after(endTime)) { log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:△t设置过大,大于模型预测长度 * 预测粒度。△t:" + configEntity.getT()); continue; } log.info("斜率不满足条件,斜率:" + slope); } // 下一个△t slopeStartTime = slopeCalendar.getTime(); slopeCalendar.add(Calendar.MINUTE,configEntity.getT()); slopeEndTime = slopeCalendar.getTime(); } break; case AVERAGE_GAP: // 计算每两个△t的平均差,任意一个大于触发值则认为该区间有调整 Calendar averageCalendar = Calendar.getInstance(); averageCalendar.setTime(startTime); Date averageStartTime = averageCalendar.getTime(); averageCalendar.add(Calendar.MINUTE,configEntity.getT()); Date averageMiddleTime = averageCalendar.getTime(); averageCalendar.add(Calendar.MINUTE,configEntity.getT()); Date averageEndTime = averageCalendar.getTime(); if (averageEndTime.after(endTime)) { log.info("自动调整失败原因:△t设置过大,△t*2大于模型预测长度 * 预测粒度。△t:" + configEntity.getT()); return false; } while (!averageEndTime.after(endTime)) { //计算均值差 //前△t测点平均值 Date finalAverageStartTime = averageStartTime; Date finalAverageMiddleTime = averageMiddleTime; OptionalDouble startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageStartTime) && !e.getT().after(finalAverageMiddleTime)).mapToDouble(ApiPointValueDTO::getV).average(); //后△t测点平均值 Date finalAverageEndTime = averageEndTime; OptionalDouble endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageMiddleTime) && !e.getT().after(finalAverageEndTime)).mapToDouble(ApiPointValueDTO::getV).average(); if (startAverage.isPresent() && endAverage.isPresent()) { double averageGapValue = startAverage.getAsDouble() - endAverage.getAsDouble(); // 均值差,大于等于触发值则进行调整 if (Double.valueOf(Math.abs(averageGapValue)).compareTo(configEntity.getTriggerValue()) >= 0) { // 计算调整值 并跳出循环 adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS); log.info("计算调整值:" + adjustValue + ",均值差:" + averageGapValue + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",averageStartTime:" + averageStartTime + ",averageMiddleTime:" + averageMiddleTime + ",averageEndTime:" + averageEndTime); break; while (!slopeEndTime.after(endTime)) { //计算斜率 //△t开始时间测点值 Date finalSlopeStartTime = slopeStartTime; Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(apiPointValueDTO -> apiPointValueDTO.getT().equals(finalSlopeStartTime)).findFirst(); //△t结束时间测点值 Date finalSlopeEndTime = slopeEndTime; Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(finalSlopeEndTime)).findFirst(); if (startOptional.isPresent() && endOptional.isPresent()) { 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) { // 计算调整值 并跳出循环 adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS); log.info("计算调整值:" + adjustValue + ",斜率:" + slope + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",slopeStartTime:" + slopeStartTime + ",slopeEndTime:" + slopeEndTime); break; } log.info("斜率不满足条件,斜率:" + slope); } // 下一个△t slopeStartTime = slopeCalendar.getTime(); slopeCalendar.add(Calendar.MINUTE,configEntity.getT()); slopeEndTime = slopeCalendar.getTime(); } log.info("均值差不满足条件,均值差:" + averageGapValue); } break; case AVERAGE_GAP: // 计算每两个△t的平均差,任意一个大于触发值则认为该区间有调整 Calendar averageCalendar = Calendar.getInstance(); averageCalendar.setTime(startTime); Date averageStartTime = averageCalendar.getTime(); averageCalendar.add(Calendar.MINUTE,configEntity.getT()); Date averageMiddleTime = averageCalendar.getTime(); averageCalendar.add(Calendar.MINUTE,configEntity.getT()); Date averageEndTime = averageCalendar.getTime(); // 下一个△t averageStartTime = averageMiddleTime; averageMiddleTime = averageEndTime; averageCalendar.add(Calendar.MINUTE,configEntity.getT()); averageEndTime = averageCalendar.getTime(); if (averageEndTime.after(endTime)) { log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:△t设置过大,△t*2大于模型预测长度 * 预测粒度。△t:" + configEntity.getT()); continue; } while (!averageEndTime.after(endTime)) { //计算均值差 //前△t测点平均值 Date finalAverageStartTime = averageStartTime; Date finalAverageMiddleTime = averageMiddleTime; OptionalDouble startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageStartTime) && !e.getT().after(finalAverageMiddleTime)).mapToDouble(ApiPointValueDTO::getV).average(); //后△t测点平均值 Date finalAverageEndTime = averageEndTime; OptionalDouble endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageMiddleTime) && !e.getT().after(finalAverageEndTime)).mapToDouble(ApiPointValueDTO::getV).average(); if (startAverage.isPresent() && endAverage.isPresent()) { double averageGapValue = startAverage.getAsDouble() - endAverage.getAsDouble(); // 均值差,大于等于触发值则进行调整 if (Double.valueOf(Math.abs(averageGapValue)).compareTo(configEntity.getTriggerValue()) >= 0) { // 计算调整值 并跳出循环 adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS); log.info("计算调整值:" + adjustValue + ",均值差:" + averageGapValue + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",averageStartTime:" + averageStartTime + ",averageMiddleTime:" + averageMiddleTime + ",averageEndTime:" + averageEndTime); break; } log.info("均值差不满足条件,均值差:" + averageGapValue); } // 下一个△t averageStartTime = averageMiddleTime; averageMiddleTime = averageEndTime; averageCalendar.add(Calendar.MINUTE,configEntity.getT()); averageEndTime = averageCalendar.getTime(); } break; default: log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule()); continue; } break; default: log.info("自动调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule()); return false; } if (adjustValue == null) { log.info("自动调整失败原因:未达到触发条件"); return false; if (adjustValue == null) { 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()) + finalAdjustValue); adjustPojo.setTimestamp(resultVO.getTimestamp()); adjustPojo.setOutPutId(outputId); lastList.add(adjustPojo); } // 相同时间直接覆盖旧值 influxDBService.asyncWriteModelResults(lastList); log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + finalAdjustValue + ",itemNo:" + item.getItemNo() + ",itemName:" + item.getItemName() + ",outputId:" + outputId + ",adjustTime:" + adjustStartTime); } // 调整系数 adjustValue = adjustValue * configEntity.getAdjustCoefficient(); // 调整方向 adjustValue = adjustValue * configEntity.getAdjustDirection(); 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 + ",itemNo:" + item.getItemNo() + ",itemName" + item.getItemName() + ",outputId" + configEntity.getOutputId() + ",adjustTime:" + adjustStartTime); return true; } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestOperationRecordController.java
@@ -20,9 +20,7 @@ import static com.iailab.framework.common.pojo.CommonResult.success; /** * @author PanZhibao * @Description * @createTime 2024年12月25日 * @author Jay */ @Tag(name = "模型服务 - 调度建议操作记录表") @RestController iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfDetController.java
@@ -5,10 +5,7 @@ import com.iailab.framework.common.util.object.BeanUtils; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity; import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfDetService; import com.iailab.module.model.mcs.sche.vo.StScheduleModelRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetSaveReqVO; import com.iailab.module.model.mcs.sche.vo.*; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +22,7 @@ * @Description * @createTime 2025年05月23日 */ @Tag(name = "调度建议快照详情") @Tag(name = "调度建议快照配置详情") @RestController @RequestMapping("/model/suggest/snapshot/conf-det") public class StSuggestSnapshotConfDetController { @@ -61,4 +58,11 @@ stSuggestSnapshotConfDetService.delete(id); return success(true); } @GetMapping("/get") @PreAuthorize("@ss.hasPermission('suggest:snapshot:info')") public CommonResult<StSuggestSnapshotConfDetRespVO> get(@RequestParam("id") String id) { StSuggestSnapshotConfDetRespVO result = stSuggestSnapshotConfDetService.get(id); return success(result); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfMainController.java
@@ -3,19 +3,20 @@ 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.mcs.sche.entity.StSuggestSnapshotConfDetEntity; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity; import com.iailab.module.model.api.mcs.dto.StScheduleModelOutDTO; import com.iailab.module.model.mcs.sche.entity.*; import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService; import com.iailab.module.model.mcs.sche.vo.StScheduleModelRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainSaveReqVO; import com.iailab.module.model.mcs.sche.vo.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; import static com.iailab.framework.common.pojo.CommonResult.success; @@ -24,7 +25,7 @@ * @Description * @createTime 2025年05月23日 */ @Tag(name = "调度建议快照") @Tag(name = "调度建议快照配置主表") @RestController @RequestMapping("/model/suggest/snapshot/conf-main") public class StSuggestSnapshotConfMainController { @@ -33,24 +34,35 @@ private StSuggestSnapshotConfMainService stSuggestSnapshotConfMainService; @GetMapping("/page") @PreAuthorize("@ss.hasPermission('suggest:snapshot:query')") public CommonResult<PageResult<StSuggestSnapshotConfMainRespVO>> getPage(@Valid StSuggestSnapshotConfMainPageReqVO pageVO) { PageResult<StSuggestSnapshotConfMainEntity> pageResult = stSuggestSnapshotConfMainService.page(pageVO); return success(BeanUtils.toBean(pageResult, StSuggestSnapshotConfMainRespVO.class)); } @GetMapping("/get") @PreAuthorize("@ss.hasPermission('suggest:snapshot:info')") public CommonResult<StSuggestSnapshotConfMainRespVO> get(@RequestParam("id") String id) { StSuggestSnapshotConfMainRespVO result = stSuggestSnapshotConfMainService.get(id); return success(result); } @PostMapping("/create") @PreAuthorize("@ss.hasPermission('suggest:snapshot:create')") public CommonResult<Boolean> create(@Valid @RequestBody StSuggestSnapshotConfMainSaveReqVO createReqVO) { stSuggestSnapshotConfMainService.create(createReqVO); return success(true); } @PutMapping("/update") @PreAuthorize("@ss.hasPermission('suggest:snapshot:update')") public CommonResult<Boolean> update(@Valid @RequestBody StSuggestSnapshotConfMainSaveReqVO updateReqVO) { stSuggestSnapshotConfMainService.update(updateReqVO); return success(true); } @DeleteMapping("/delete") @PreAuthorize("@ss.hasPermission('suggest:snapshot:delete')") @Parameter(name = "id", description = "编号", required = true, example = "1024") public CommonResult<Boolean> deleteTenant(@RequestParam("id") String id) { stSuggestSnapshotConfMainService.delete(id); iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotRecordController.java
@@ -1,40 +1,143 @@ package com.iailab.module.model.mcs.sche.controller.admin; import com.iailab.framework.common.pojo.CommonResult; import com.iailab.framework.common.pojo.PageResult; import com.iailab.module.data.api.ind.IndItemApi; import com.iailab.module.data.api.ind.dto.ApiIndItemQueryDTO; import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO; import com.iailab.module.data.api.plan.PlanItemApi; 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.data.common.ApiDataQueryDTO; import com.iailab.module.data.common.ApiDataValueDTO; import com.iailab.module.model.api.mcs.McsApi; import com.iailab.module.model.api.mcs.dto.PreDataBarLineReqVO; import com.iailab.module.model.api.mcs.dto.PreDataBarLineRespVO; import com.iailab.module.model.common.enums.DataCategoryEnum; import com.iailab.module.model.common.utils.DateUtils; import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO; import com.mysql.cj.util.TimeUtil; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import static com.iailab.framework.common.pojo.CommonResult.success; import static com.iailab.module.model.common.utils.DateUtils.DATE_TIME_PATTERN; /** * @author Jay */ @Tag(name = "调度建议快照") @RestController @RequestMapping("/model/suggest/snapshot/record") public class StSuggestSnapshotRecordController { @Autowired private StSuggestSnapshotRecordService stSuggestSnapshotRecordService; @PostMapping("/create") public CommonResult<Boolean> create(@Valid @RequestBody StSuggestSnapshotRecordSaveReqVO createReqVO) { stSuggestSnapshotRecordService.create(createReqVO); return success(true); @Autowired private DataPointApi dataPointApi; @Autowired private IndItemApi indItemApi; @Autowired private PlanItemApi planItemApi; @Autowired private McsApi mcsApi; @GetMapping("/list") @Parameter(name = "operationId", description = "操作id", required = true, example = "1024") public CommonResult<List<StSuggestSnapshotRecordRespVO>> getListByOperationId(@RequestParam("operationId") String operationId) { return success(stSuggestSnapshotRecordService.getListByOperationId(operationId)); } @PutMapping("/update") public CommonResult<Boolean> update(@Valid @RequestBody StSuggestSnapshotRecordSaveReqVO updateReqVO) { stSuggestSnapshotRecordService.update(updateReqVO); return success(true); } @PostMapping("/getChartData") public CommonResult<List<StSuggestSnapshotRecordRespVO>> getChartData(@RequestBody List<StSuggestSnapshotRecordRespVO> reqList){ reqList.forEach(item -> { List<Object[]> dataList = new ArrayList<>(); if(DataCategoryEnum.DATAPOINT.getCode().equals(item.getDataType())){ ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO(); queryDTO.setPointNo(item.getDataNo()); queryDTO.setStart(item.getStartTime()); queryDTO.setEnd(item.getEndTime()); List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDTO); if (valueList != null && !valueList.isEmpty()){ for (ApiPointValueDTO apiPointValueDTO : valueList) { Object[] data = new Object[2]; data[0] = DateUtils.format(new Date(String.valueOf(apiPointValueDTO.getT())), DATE_TIME_PATTERN); data[1] = apiPointValueDTO.getV(); dataList.add(data); } } } else if (DataCategoryEnum.IND.getCode().equals(item.getDataType())) { ApiIndItemQueryDTO queryDTO = new ApiIndItemQueryDTO(); queryDTO.setItemNo(item.getDataNo()); queryDTO.setStart(item.getStartTime()); queryDTO.setEnd(item.getEndTime()); List<ApiIndItemValueDTO> valueList = indItemApi.queryIndItemHistoryValue(queryDTO); if (valueList != null && !valueList.isEmpty()){ for (ApiIndItemValueDTO apiIndItemValueDTO : valueList) { Object[] data = new Object[2]; data[0] = DateUtils.format(new Date(apiIndItemValueDTO.getDataTime()), DATE_TIME_PATTERN); data[1] = apiIndItemValueDTO.getDataValue(); dataList.add(data); } } } else if (DataCategoryEnum.PLAN.getCode().equals(item.getDataType())) { ApiDataQueryDTO queryDTO = new ApiDataQueryDTO(); queryDTO.setItemNo(item.getDataNo()); queryDTO.setStart(item.getStartTime()); queryDTO.setEnd(item.getEndTime()); List<ApiDataValueDTO> valueList = planItemApi.queryPlanItemHistoryValue(queryDTO); if (valueList != null && !valueList.isEmpty()){ for (ApiDataValueDTO apiDataValueDTO : valueList) { Object[] data = new Object[2]; data[0] = DateUtils.format(apiDataValueDTO.getDataTime(), DATE_TIME_PATTERN); data[1] = apiDataValueDTO.getDataValue(); dataList.add(data); } } } else if (DataCategoryEnum.PREDICT_ITEM_N.getCode().equals(item.getDataType())) { dataList = getPreDataList(item, "N"); }else if (DataCategoryEnum.PREDICT_ITEM_L.getCode().equals(item.getDataType())) { dataList = getPreDataList(item, "L"); }else if (DataCategoryEnum.PREDICT_ITEM_C.getCode().equals(item.getDataType())) { dataList = getPreDataList(item, "C"); } item.setDataList(dataList); @DeleteMapping("/delete") @Parameter(name = "id", description = "编号", required = true, example = "1024") public CommonResult<Boolean> deleteTenant(@RequestParam("id") String id) { stSuggestSnapshotRecordService.delete(id); return success(true); }); return success(reqList); } private List<Object[]> getPreDataList(StSuggestSnapshotRecordRespVO resVo, String type){ List<Object[]> dataList = new ArrayList<>(); PreDataBarLineReqVO reqVO = new PreDataBarLineReqVO(); List<String> outIds = new ArrayList<>(); outIds.add(resVo.getDataNo()); reqVO.setOutIds(outIds); reqVO.setStartTime(resVo.getStartTime()); reqVO.setEndTime(resVo.getEndTime()); PreDataBarLineRespVO result = mcsApi.getPreDataCharts(reqVO); if (result == null || result.getDataViewList() == null || result.getDataViewList().isEmpty()){ return dataList; } if ("N".equals(type) && result.getDataViewList().get(0).getPreDataN()!=null){ dataList = result.getDataViewList().get(0).getPreDataN(); }else if ("L".equals(type) && result.getDataViewList().get(0).getPreDataL()!=null){ dataList = result.getDataViewList().get(0).getPreDataL(); }else if ("C".equals(type) && result.getDataViewList().get(0).getCurData()!=null){ dataList = result.getDataViewList().get(0).getCurData(); } return dataList; } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java
@@ -25,6 +25,7 @@ default PageResult<StScheduleSuggestEntity> selectPage(StScheduleSuggestPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX<StScheduleSuggestEntity>() .likeIfPresent(StScheduleSuggestEntity::getTitle, reqVO.getTitle()) .eqIfPresent(StScheduleSuggestEntity::getStatus, reqVO.getStatus()) .eqIfPresent(StScheduleSuggestEntity::getModelId, reqVO.getModelId()) .likeIfPresent(StScheduleSuggestEntity::getScheduleObj, reqVO.getScheduleObj()) .orderByDesc(StScheduleSuggestEntity::getCreateTime)); iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfDetDao.java
@@ -4,11 +4,9 @@ import com.iailab.framework.mybatis.core.mapper.BaseMapperX; import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX; import com.iailab.framework.tenant.core.db.dynamic.TenantDS; import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * @author Jay @@ -17,6 +15,7 @@ @Mapper public interface StSuggestSnapshotConfDetDao extends BaseMapperX<StSuggestSnapshotConfDetEntity> { default PageResult<StSuggestSnapshotConfDetEntity> selectPage(StSuggestSnapshotConfDetPageReqVO reqVO) { return selectPage(reqVO); return selectPage(reqVO,new LambdaQueryWrapperX<StSuggestSnapshotConfDetEntity>() .likeIfPresent(StSuggestSnapshotConfDetEntity::getConfId,reqVO.getConfId())); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfMainDao.java
@@ -6,13 +6,8 @@ import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX; import com.iailab.framework.tenant.core.db.dynamic.TenantDS; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * @author Jay @@ -21,6 +16,7 @@ @Mapper public interface StSuggestSnapshotConfMainDao extends BaseMapperX<StSuggestSnapshotConfMainEntity> { default PageResult<StSuggestSnapshotConfMainEntity> selectPage(StSuggestSnapshotConfMainPageReqVO reqVO) { return selectPage(reqVO); return selectPage(reqVO,new LambdaQueryWrapperX<StSuggestSnapshotConfMainEntity>() .likeIfPresent(StSuggestSnapshotConfMainEntity::getModelId,reqVO.getModelId())); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotConfDetEntity.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.iailab.framework.mybatis.core.dataobject.BaseDO; import lombok.Data; import java.io.Serializable; @@ -14,7 +13,7 @@ */ @Data @TableName("t_st_suggest_snapshot_conf_det") public class StSuggestSnapshotConfDetEntity extends BaseDO { public class StSuggestSnapshotConfDetEntity implements Serializable { private static final long serialVersionUID = 1L; /** @@ -39,12 +38,17 @@ private String dataNo; /** * 数据名称 */ private String dataName; /** * 左侧长度(min) */ private Integer leftLength; /** * 右侧侧长度(min) * 右侧长度(min) */ private Integer rightLength; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotRecordEntity.java
@@ -13,7 +13,7 @@ */ @Data @TableName("t_st_suggest_snapshot_conf_main") @TableName("t_st_suggest_snapshot_record") public class StSuggestSnapshotRecordEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -49,6 +49,11 @@ private String dataNo; /** * 数据名称 */ private String dataName; /** * 开始时间 */ private Date scheduleTime; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfDetService.java
@@ -23,4 +23,6 @@ void delete(String id); List<StSuggestSnapshotConfDetRespVO> getByConfId(String confId); StSuggestSnapshotConfDetRespVO get(String id); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfMainService.java
@@ -2,6 +2,7 @@ import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.service.BaseService; import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO; @@ -20,4 +21,6 @@ void delete(String id); StSuggestSnapshotConfMainRespVO getByModelIdAndScheduleObj(String modelId, String scheduleObj); StSuggestSnapshotConfMainRespVO get(String id); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java
@@ -1,11 +1,11 @@ package com.iailab.module.model.mcs.sche.service; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.service.BaseService; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO; import java.util.List; /** * @author Jay @@ -17,4 +17,6 @@ void update(StSuggestSnapshotRecordSaveReqVO createReqVO); void delete(String id); List<StSuggestSnapshotRecordRespVO> getListByOperationId(String operationId); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java
@@ -2,6 +2,7 @@ import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.service.impl.BaseServiceImpl; import com.iailab.framework.common.util.collection.CollectionUtils; import com.iailab.framework.common.util.object.BeanUtils; import com.iailab.module.model.mcs.sche.dao.StSuggestOperationRecordDao; import com.iailab.module.model.mcs.sche.entity.StSuggestOperationRecordEntity; @@ -47,28 +48,37 @@ entity.setId(UUID.randomUUID().toString()); entity.setHandleTime(new Date()); baseDao.insert(entity); //获取调度建议快照配置表信息 StSuggestSnapshotConfMainRespVO confMain = stSuggestSnapshotConfMainService.getByModelIdAndScheduleObj(reqVo.getModelId(), reqVo.getSuggestId()); if (confMain != null){ StSuggestSnapshotRecordSaveReqVO snapshotRecordSaveReqVO = new StSuggestSnapshotRecordSaveReqVO(); snapshotRecordSaveReqVO.setModelId(entity.getModelId()); List<StSuggestSnapshotConfDetRespVO> confDetList = stSuggestSnapshotConfDetService.getByConfId(confMain.getId()); confDetList.forEach(confDet -> { snapshotRecordSaveReqVO.setDataNo(confDet.getDataNo()); snapshotRecordSaveReqVO.setDataType(confDet.getDataType()); snapshotRecordSaveReqVO.setScheduleTime(entity.getScheduleTime()); //计算开始时间,开始时间为当前调度时间减去快照配置表配置的左侧时间长度 LocalDateTime localStartDateTime = entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().minusMinutes(confDet.getLeftLength()); Date startTime = Date.from(localStartDateTime.atZone(ZoneId.systemDefault()).toInstant()); snapshotRecordSaveReqVO.setStartTime(startTime); //计算结束时间,结束时间为当前调度时间加上快照配置表配置的右侧时间长度 LocalDateTime localEndDateTime = entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusMinutes(confDet.getRightLength()); Date endTime = Date.from(localEndDateTime.atZone(ZoneId.systemDefault()).toInstant()); snapshotRecordSaveReqVO.setEndTime(endTime); stSuggestSnapshotRecordService.create(snapshotRecordSaveReqVO); }); if (!"采纳建议".equals(reqVo.getOperate())){ return; } //获取调度建议快照配置表信息 StSuggestSnapshotConfMainRespVO confMain = stSuggestSnapshotConfMainService.getByModelIdAndScheduleObj(reqVo.getModelId(), reqVo.getScheduleObj()); if (confMain == null) { return; } List<StSuggestSnapshotConfDetRespVO> confDetList = stSuggestSnapshotConfDetService.getByConfId(confMain.getId()); if (CollectionUtils.isAnyEmpty(confDetList)) { return; } confDetList.forEach(confDet -> { StSuggestSnapshotRecordSaveReqVO snapshotRecordSaveReqVO = new StSuggestSnapshotRecordSaveReqVO(); snapshotRecordSaveReqVO.setSuggestId(reqVo.getSuggestId()); snapshotRecordSaveReqVO.setModelId(entity.getModelId()); snapshotRecordSaveReqVO.setOperationId(entity.getId()); snapshotRecordSaveReqVO.setDataNo(confDet.getDataNo()); snapshotRecordSaveReqVO.setDataType(confDet.getDataType()); snapshotRecordSaveReqVO.setDataName(confDet.getDataName()); snapshotRecordSaveReqVO.setScheduleTime(entity.getScheduleTime()); //计算开始时间,开始时间为当前调度时间减去快照配置表配置的左侧时间长度 LocalDateTime localStartDateTime = entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().minusMinutes(confDet.getLeftLength() == null ? 60 : confDet.getLeftLength()); Date startTime = Date.from(localStartDateTime.atZone(ZoneId.systemDefault()).toInstant()); snapshotRecordSaveReqVO.setStartTime(startTime); //计算结束时间,结束时间为当前调度时间加上快照配置表配置的右侧时间长度 LocalDateTime localEndDateTime = entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusMinutes(confDet.getRightLength() == null ? 60 : confDet.getLeftLength()); Date endTime = Date.from(localEndDateTime.atZone(ZoneId.systemDefault()).toInstant()); snapshotRecordSaveReqVO.setEndTime(endTime); stSuggestSnapshotRecordService.create(snapshotRecordSaveReqVO); }); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfDetServiceImpl.java
@@ -11,6 +11,7 @@ import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetSaveReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -59,4 +60,9 @@ public List<StSuggestSnapshotConfDetRespVO> getByConfId(String confId) { return ConvertUtils.sourceToTarget(baseDao.selectList("conf_id", confId), StSuggestSnapshotConfDetRespVO.class); } @Override public StSuggestSnapshotConfDetRespVO get(String id) { return ConvertUtils.sourceToTarget( baseDao.selectById(id), StSuggestSnapshotConfDetRespVO.class); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfMainServiceImpl.java
@@ -6,6 +6,7 @@ import com.iailab.framework.common.util.object.BeanUtils; import com.iailab.framework.common.util.object.ConvertUtils; import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotConfMainDao; import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity; import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO; @@ -53,4 +54,9 @@ public StSuggestSnapshotConfMainRespVO getByModelIdAndScheduleObj(String modelId, String scheduleObj) { return ConvertUtils.sourceToTarget( baseDao.selectOne("model_id", modelId, "schedule_obj", scheduleObj), StSuggestSnapshotConfMainRespVO.class); } @Override public StSuggestSnapshotConfMainRespVO get(String id) { return ConvertUtils.sourceToTarget( baseDao.selectById(id), StSuggestSnapshotConfMainRespVO.class); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java
@@ -1,24 +1,19 @@ package com.iailab.module.model.mcs.sche.service.impl; import com.baomidou.dynamic.datasource.annotation.DSTransactional; 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.object.BeanUtils; import com.iailab.framework.common.util.object.ConvertUtils; import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotRecordDao; import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity; import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService; import com.iailab.module.model.mcs.sche.vo.StScheduleModelRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; import static com.iailab.framework.common.pojo.CommonResult.success; /** @@ -52,4 +47,9 @@ public void delete(String id) { baseDao.deleteById(id); } @Override public List<StSuggestSnapshotRecordRespVO> getListByOperationId(String operationId) { return ConvertUtils.sourceToTarget(baseDao.selectList("operation_id", operationId), StSuggestSnapshotRecordRespVO.class); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StScheduleSuggestPageReqVO.java
@@ -30,6 +30,9 @@ @Schema(description = "调整对象,模糊匹配", example = "") private String scheduleObj; @Schema(description = "状态", example = "") private String status; @Schema(description = "预测时间", example = "") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date predictTime; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordReqVO.java
@@ -63,4 +63,8 @@ @Schema(description = "建议ID") private String suggestId; @Schema(description = "调整对象") private String scheduleObj; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetPageReqVO.java
@@ -1,7 +1,10 @@ package com.iailab.module.model.mcs.sche.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; /** @@ -9,7 +12,9 @@ */ @Schema(description = "模型服务 - 调度建议快照配置分页 Request VO") @Data public class StSuggestSnapshotConfDetPageReqVO { @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class StSuggestSnapshotConfDetPageReqVO extends PageParam { @Schema(description = "模型ID") private String confId; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetReqVO.java
@@ -20,6 +20,9 @@ @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)") private String dataType; @Schema(description = "数据名称") private String dataName; @Schema(description = "数据编号") private String dataNo; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetRespVO.java
@@ -20,6 +20,9 @@ @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)") private String dataType; @Schema(description = "数据名称") private String dataName; @Schema(description = "数据编号") private String dataNo; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetSaveReqVO.java
@@ -23,6 +23,9 @@ @Schema(description = "数据编号") private String dataNo; @Schema(description = "数据名称") private String dataName; @Schema(description = "左侧长度(min)") private Integer leftLength; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainPageReqVO.java
@@ -1,8 +1,11 @@ package com.iailab.module.model.mcs.sche.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 java.util.Date; @@ -12,7 +15,9 @@ */ @Schema(description = "模型服务 - 调度建议快照配置详情分页 Request VO") @Data public class StSuggestSnapshotConfMainPageReqVO { @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class StSuggestSnapshotConfMainPageReqVO extends PageParam { @Schema(description = "标题") private String title; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordReqVO.java
文件已删除 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordRespVO.java
@@ -5,6 +5,7 @@ import lombok.Data; import java.util.Date; import java.util.List; /** @@ -32,6 +33,9 @@ @Schema(description = "数据编号") private String dataNo; @Schema(description = "数据名称") private String dataName; @Schema(description = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; @@ -46,5 +50,7 @@ @Schema(description = "排序") private Integer sort; @Schema(description = "数据列表") List<Object[]> dataList; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordSaveReqVO.java
@@ -32,6 +32,9 @@ @Schema(description = "数据编号") private String dataNo; @Schema(description = "数据名称") private String dataName; @Schema(description = "调度时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date scheduleTime; iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml
@@ -232,6 +232,9 @@ - t_mm_predict_influence_factor - t_mm_predict_influence_factor_result - t_st_suggest_operation_record - t_st_suggest_snapshot_conf_det - t_st_suggest_snapshot_conf_main - t_st_suggest_snapshot_record app: app-key: model app-secret: 85b0df7edc3df3611913df34ed695011 iailab-plat-sdk/pom.xml
@@ -9,6 +9,7 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>iailab-plat-sdk</artifactId> <version>1.0.1</version> <packaging>jar</packaging> <name>${project.artifactId}</name> iailab-plat-sdk/src/main/java/com/iailab/sdk/util/http/IailabHttpUtils.java
@@ -90,7 +90,7 @@ httpPost.addHeader("Content-Type", "application/json;charset=UTF-8"); httpPost.addHeader("Authorization", "Bearer " + IailabClient.accessToken); httpPost.addHeader("Tenant-Id", SdkAutoConfiguration.TENANT_ID.toString()); StringEntity stringEntity = new StringEntity(json); StringEntity stringEntity = new StringEntity(json,"UTF-8"); stringEntity.setContentEncoding("UTF-8"); stringEntity.setContentType("application/json"); httpPost.setEntity(stringEntity);