iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
@@ -97,6 +97,10 @@ @Operation(summary = "获取预警信息和调度建议分页列表") PageResult<StAlarmAndSuggestRespVO> getAlarmAndSuggestPage(@RequestBody StAlarmAndSuggestPageReqVO reqVO); @PostMapping(PREFIX + "/predict-data/doubleValue") @Operation(summary = "获取多个预测项Double类型数据") Map<String, Map<String, Double>> getPreDoubleData(PreDoubleDataReqVO reqVO); /*@PostMapping(PREFIX + "/predict-data/last-value") @Operation(summary = "获取最后预测值") Double getPredictLastValue();*/ iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDoubleDataReqVO.java
对比新文件 @@ -0,0 +1,20 @@ package com.iailab.module.model.api.mcs.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @description: * @author: dzd * @date: 2025/1/13 13:59 **/ @Data public class PreDoubleDataReqVO implements Serializable { private static final long serialVersionUID = 1L; @Schema(description = "预测编号") private List<String> itemNos; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -12,13 +12,19 @@ import com.iailab.module.data.common.ApiDataQueryDTO; import com.iailab.module.model.api.mcs.McsApi; import com.iailab.module.model.api.mcs.dto.*; import com.iailab.module.model.common.enums.DataTypeEnum; import com.iailab.module.model.enums.CommonConstant; import com.iailab.module.model.common.enums.PreLineTypeEnum; import com.iailab.module.model.influxdb.pojo.InfluxModelResultByOutPutIdsPOJO; import com.iailab.module.model.influxdb.service.InfluxDBService; import com.iailab.module.model.influxdb.vo.InfluxModelResultVO; import com.iailab.module.model.mcs.pre.entity.DmModuleEntity; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.entity.MmPredictAlarmMessageEntity; import com.iailab.module.model.mcs.pre.service.*; import com.iailab.module.model.mcs.pre.vo.MmItemOutputRespVO; import com.iailab.module.model.mcs.pre.vo.MmPredictAlarmMessageSaveReqVO; import com.iailab.module.model.mcs.pre.vo.MmPredictItemRespVO; import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity; import com.iailab.module.model.mcs.sche.service.StScheduleSchemeService; import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService; @@ -35,7 +41,9 @@ import java.math.BigDecimal; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @author PanZhibao @@ -88,6 +96,9 @@ @Autowired private ChartParamService chartParamService; @Autowired private InfluxDBService influxDBService; private int HOUR_MINS = 60; @@ -581,6 +592,34 @@ return stScheduleSchemeService.getAlarmAndSuggestPage(reqVO); } @Override public Map<String, Map<String, Double>> getPreDoubleData(PreDoubleDataReqVO reqVO) { List<MmPredictItemRespVO> doubleItemOutPuts = mmPredictItemService.getDoubleOutPutsByItemNos(reqVO.getItemNos()); //<itemNo,<resultStr,double>> Map<String, Map<String, Double>> result = new HashMap<>(reqVO.getItemNos().size()); for (MmPredictItemRespVO mmPredictItemRespVO : doubleItemOutPuts) { List<String> outPutIds = mmPredictItemRespVO.getOutPuts().stream().map(MmItemOutputRespVO::getId).collect(Collectors.toList()); InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO(); pojo.setOutPutIds(outPutIds); pojo.setType(DataTypeEnum.FLOAT.getCode()); Map<String, List<InfluxModelResultVO>> outPutIdDoubles = influxDBService.queryModelResultsByOutPutIds(pojo, mmPredictItemRespVO.getLastTime(), mmPredictItemRespVO.getLastTime()); Map<String, Double> outPutIdDouble = new HashMap<>(outPutIds.size()); for (MmItemOutputRespVO outPut : mmPredictItemRespVO.getOutPuts()) { String outPutId = outPut.getId(); if (outPutIdDoubles.containsKey(outPutId)) { List<InfluxModelResultVO> influxModelResultVOS = outPutIdDoubles.get(outPutId); if (!CollectionUtils.isEmpty(influxModelResultVOS)) { outPutIdDouble.put(outPut.getResultstr(),Double.valueOf(influxModelResultVOS.get(0).getValue().toString())); } } } result.put(mmPredictItemRespVO.getItemno(),outPutIdDouble); } return result; } private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) { Date[] result = new Date[3]; Date predictTime = predictItem.getLastTime(); iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
@@ -163,4 +163,11 @@ List<ChartParamDTO> chartParamList = mcsApi.getChartParamList(chartCode); return CommonResult.success(chartParamList); } @PostMapping("/predict-data/doubleValue") @Operation(summary = "获取多个预测项Double类型数据") public CommonResult<Map<String, Map<String,Double>>> getPreDoubleData(@RequestBody PreDoubleDataReqVO reqVO) { Map<String, Map<String,Double>> map = mcsApi.getPreDoubleData(reqVO); return CommonResult.success(map); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java
@@ -4,6 +4,7 @@ import com.influxdb.client.InfluxDBClient; import com.influxdb.client.InfluxDBClientFactory; import com.influxdb.client.domain.Bucket; import com.influxdb.client.domain.BucketRetentionRules; import com.influxdb.client.domain.Organization; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,6 +41,8 @@ private Logger logger = LoggerFactory.getLogger(getClass()); private InfluxDBClient client; // bucket过期时间 private Integer everySeconds = 3600 * 24 * 10; public InfluxDBClient getClient() { try { @@ -60,7 +63,8 @@ Bucket bucketByName = client.getBucketsApi().findBucketByName(bucketName); if (null == bucketByName) { Organization organization = client.getOrganizationsApi().findOrganizations().stream().filter(e -> e.getName().equals(org)).findFirst().orElseThrow(() -> new RuntimeException("influxdb:org不存在,org:" + org)); client.getBucketsApi().createBucket(bucketName,organization); // 创建Bucket,并设置过期时间 client.getBucketsApi().createBucket(bucketName,new BucketRetentionRules().everySeconds(everySeconds),organization); }else { isExistBucket.add(bucketName); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/pojo/InfluxModelResultByOutPutIdsPOJO.java
对比新文件 @@ -0,0 +1,23 @@ package com.iailab.module.model.influxdb.pojo; import lombok.Data; import java.io.Serializable; import java.time.Instant; import java.util.List; /** * @description: * @author: dzd * @date: 2025/1/13 14:39 **/ @Data public class InfluxModelResultByOutPutIdsPOJO implements Serializable { private static final long serialVersionUID = 1L; private List<String> outPutIds; private Instant timestamp; private String type; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java
@@ -1,10 +1,12 @@ package com.iailab.module.model.influxdb.service; import com.iailab.module.model.influxdb.pojo.InfluxModelResultByOutPutIdsPOJO; import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO; import com.iailab.module.model.influxdb.vo.InfluxModelResultVO; import java.util.Date; import java.util.List; import java.util.Map; /** * InfluxDB操作类 @@ -14,4 +16,5 @@ void asyncWriteModelResults(List<InfluxModelResultPOJO> pointValues); List<InfluxModelResultVO> queryModelResults(InfluxModelResultPOJO pojo, Date startTime, Date endTime); Map<String,List<InfluxModelResultVO>> queryModelResultsByOutPutIds(InfluxModelResultByOutPutIdsPOJO pojo, Date startTime, Date endTime); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/impl/InfluxDBServiceImpl.java
@@ -2,6 +2,7 @@ import com.iailab.module.model.influxdb.common.config.InfluxDBInstance; import com.iailab.module.model.influxdb.common.utils.MeasurementUtils; import com.iailab.module.model.influxdb.pojo.InfluxModelResultByOutPutIdsPOJO; import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO; import com.iailab.module.model.influxdb.service.InfluxDBService; import com.iailab.module.model.influxdb.vo.InfluxModelResultVO; @@ -17,6 +18,7 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * InfluxDB操作类 @@ -80,4 +82,48 @@ } return dataList; } @Override public Map<String, List<InfluxModelResultVO>> queryModelResultsByOutPutIds(InfluxModelResultByOutPutIdsPOJO pojo, Date startTime, Date endTime) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); String start = startTime.toInstant().toString(); if (startTime.getTime() == endTime.getTime()) { // 如果相等,则engTime加1毫秒,否则influxdb报错(因为influxdb的range函数是左闭右开区间,所以将engTime加一毫秒,才可以查到startTime时间点的数据) endTime.setTime(endTime.getTime() + 1); } String stop = endTime.toInstant().toString(); String measurement = MeasurementUtils.getMeasurement(pojo.getType()); // 拼接OutPutIds String outPutIdsFilter = pojo.getOutPutIds().stream().map(id -> "r[\"outPutId\"] == \"" + id + "\"").collect(Collectors.joining(" or ")); StringBuilder sb = new StringBuilder(); sb.append("from(bucket:\"" + influxDBInstance.getBucket() + "\") "); sb.append("|> range(start: ").append(start).append(", stop: ").append(stop).append(") "); sb.append("|> filter(fn: (r) => r[\"_measurement\"] == \"" + measurement + "\")"); sb.append("|> filter(fn: (r) => r[\"_field\"] == \"value\")"); sb.append("|> filter(fn: (r) => " + outPutIdsFilter + ")"); sb.append("|> sort(columns: [\"_time\"]) "); sb.append("|> yield(name: \"mean\")"); log.info("influxdbSql===============" + sb); List<FluxTable> tables = queryApi.query(sb.toString(), influxDBInstance.org); Map<String, List<InfluxModelResultVO>> result = new HashMap<>(pojo.getOutPutIds().size()); for (FluxTable table : tables) { List<FluxRecord> records = table.getRecords(); for (FluxRecord record : records) { String outPutId = record.getValueByKey("outPutId").toString(); if (result.containsKey(outPutId)) { result.get(outPutId).add( new InfluxModelResultVO(record.getValueByKey("_value"),record.getTime())); } else { List<InfluxModelResultVO> dataList = new ArrayList<>(); InfluxModelResultVO vo = new InfluxModelResultVO(record.getValueByKey("_value"),record.getTime()); dataList.add(vo); result.put(outPutId,dataList); } } } return result; } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictItemDao.java
@@ -35,4 +35,6 @@ default IPage<MmPredictItemRespVO> selectPage(MmPredictItemPageReqVO reqVO) { return getPageList(getPage(reqVO), reqVO); } List<MmPredictItemRespVO> getDoubleOutPutsByItemNos(Map<String, Object> params); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictItemService.java
@@ -45,4 +45,6 @@ List<MmPredictItemRespVO> list(Map<String, Object> params); MmPredictItemEntity getById(String id); List<MmPredictItemRespVO> getDoubleOutPutsByItemNos(List<String> itemNos); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictItemServiceImpl.java
@@ -78,6 +78,17 @@ return mmPredictItemDao.selectById(id); } @Override public List<MmPredictItemRespVO> getDoubleOutPutsByItemNos(List<String> itemNos) { if (CollectionUtils.isEmpty(itemNos)) { return new ArrayList<>(); } Map<String, Object> params = new HashMap(1); params.put("itemNos", itemNos); List<MmPredictItemRespVO> list = mmPredictItemDao.getDoubleOutPutsByItemNos(params); return list; } @DSTransactional(rollbackFor = Exception.class) @Override public void add(MmPredictItemDTO mmPredictItemDto) { iailab-module-model/iailab-module-model-biz/src/main/resources/logback-spring.xml
@@ -31,7 +31,7 @@ <!-- 启动服务时,是否清理历史日志,一般不建议清理 --> <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart> <!-- 日志文件,到达多少容量,进行滚动 --> <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-100MB}</maxFileSize> <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-50MB}</maxFileSize> <!-- 日志文件的总大小,0 表示不限制 --> <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap> <!-- 日志文件的保留天数 --> @@ -57,15 +57,15 @@ </appender> <!-- 本地环境 --> <springProfile name="local"> <root level="INFO"> <springProfile name="dev"> <root level="DEBUG"> <appender-ref ref="STDOUT"/> <appender-ref ref="GRPC"/> <!-- 本地环境下,如果不想接入 SkyWalking 日志服务,可以注释掉本行 --> <appender-ref ref="ASYNC"/> <!-- 本地环境下,如果不想打印日志,可以注释掉本行 --> </root> </springProfile> <!-- 其它环境 --> <springProfile name="dev,test,stage,prod,default"> <springProfile name="test,stage,prod,default"> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="ASYNC"/> iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictItemDao.xml
@@ -88,10 +88,12 @@ <result property="itemorder" column="ITEMORDER"/> <result property="status" column="STATUS"/> <result property="categoryid" column="CATEGORYID"/> <result property="lastTime" column="last_time"/> <collection property="outPuts" ofType="com.iailab.module.model.mcs.pre.vo.MmItemOutputRespVO"> <result property="id" column="out_put_id"/> <result property="outputorder" column="out_put_order"/> <result property="resultName" column="result_name"/> <result property="resultstr" column="result_str"/> </collection> </resultMap> @@ -191,6 +193,30 @@ FROM t_mm_predict_merge_item t1 WHERE t1.itemid = #{ITEMID} </select> <select id="getDoubleOutPutsByItemNos" resultMap="MmPredictItemRespVO" parameterType="map"> SELECT TMPI.ID, TMPI.ITEMNO, TMPI.ITEMNAME, TMPI.ITEMTYPEID, TMPI.predictlength, TMPI.GRANULARITY, TMPI.ISFUSE, TMPI.WORKCHECKED, TMPI.STATUS, TMIO.id out_put_id, TMIO.outputorder out_put_order, TMIO.resultstr result_str, TMIO.result_name, TMIS.last_time FROM T_MM_PREDICT_ITEM TMPI LEFT JOIN t_mm_item_output TMIO ON TMIO.itemid = TMPI.ID AND TMIO.result_type = 3 LEFT JOIN t_mm_item_status TMIS ON TMIS.item_id = TMPI.ID WHERE TMPI.itemno in <foreach collection="itemNos" item="item" open="(" close=")" separator=","> #{item} </foreach> </select> </mapper>