iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/StSuggestSnapshotRecordRespVO.java
文件名从 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordRespVO.java 修改 @@ -1,4 +1,4 @@ package com.iailab.module.model.mcs.sche.vo; package com.iailab.module.model.api.mcs.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; iailab-module-model/iailab-module-model-biz/db/增量SQL/2025.sql
@@ -53,6 +53,7 @@ `ext4` varchar(50) COMMENT '拓展字段1', `ext5` varchar(50) COMMENT '拓展字段1', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `conf_id_data_name_unique` (`conf_id`,`data_name`), KEY `idx_conf_id` (`conf_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='调度建议快照配置详情表'; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -95,6 +95,9 @@ private StScheduleSuggestService stScheduleSuggestService; @Autowired private StSuggestSnapshotRecordService stSuggestSnapshotRecordService; @Autowired private PlanItemApi planItemApi; @Autowired @@ -129,8 +132,6 @@ @Autowired private StSuggestOperationRecordService stSuggestOperationRecordService; private int HOUR_MINS = 60; @Override public List<PredictItemTreeDTO> getPredictItemTree() { @@ -173,131 +174,7 @@ @Override public PreDataBarLineRespVO getPreDataCharts(PreDataBarLineReqVO reqVO) { PreDataBarLineRespVO result = new PreDataBarLineRespVO(); List<String> outIds = reqVO.getOutIds(); List<String> legends = new ArrayList<>(); List<PreDataViewRespDTO> dataViewList = new ArrayList<>(); if (CollectionUtils.isEmpty(outIds)) { return result; } Date predictTime = reqVO.getPredictTime(); if (predictTime == null) { MmItemOutputEntity output = null; for (String outId : outIds) { output = mmItemOutputService.getOutPutById(outId); if (output != null) { break; } } ItemVO predictItem = mmPredictItemService.getItemById(output.getItemid()); if (predictItem.getLastTime() != null) { predictTime = predictItem.getLastTime(); } else { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); predictTime = calendar.getTime(); } } Date startTime = reqVO.getStartTime(); if (startTime == null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(predictTime); calendar.add(Calendar.HOUR_OF_DAY, -1); startTime = calendar.getTime(); } Date endTime = reqVO.getEndTime(); if (endTime == null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(predictTime); calendar.add(Calendar.HOUR_OF_DAY, 1); calendar.add(Calendar.MINUTE, 1); endTime = calendar.getTime(); } for (int i = 0; i < outIds.size(); i++) { PreDataViewRespDTO viewDto = new PreDataViewRespDTO(); String outId = outIds.get(i); MmItemOutputEntity output = mmItemOutputService.getOutPutById(outId); if (output == null) { continue; } legends.add(output.getResultName()); viewDto.setItemId(output.getItemid()); viewDto.setOutId(outId); viewDto.setResultstr(output.getResultstr()); viewDto.setResultName(output.getResultName()); viewDto.setRealData(getHisData(output.getPointid(), startTime, endTime, reqVO.getPrec())); viewDto.setPreDataN(mmItemResultService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); viewDto.setPreDataL(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); viewDto.setPreDataLOriginal(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, DataTypeEnum.FLOAT_LAST_BAK)); viewDto.setCurData(mmItemResultJsonService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); // 模拟调整曲线 viewDto.setAdjData(stAdjustResultService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); List<Double> values = new ArrayList<>(); if (!CollectionUtils.isEmpty(viewDto.getRealData())) { List<Double> hisValues = new ArrayList<>(); viewDto.getRealData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); hisValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setHisMax(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setHisMin(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setHisAvg(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).average().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setHisCumulant(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).sum()) .divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getPreDataN())) { viewDto.getPreDataN().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); }); } if (!CollectionUtils.isEmpty(viewDto.getPreDataL())) { List<Double> preValues = new ArrayList<>(); viewDto.getPreDataL().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); preValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setPreMax(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setPreMin(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setPreAvg(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).average().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getCurData())) { List<Double> preValues = new ArrayList<>(); viewDto.getCurData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); preValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setPreCumulant(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).sum()) .divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getAdjData())) { viewDto.getAdjData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); }); } if (!CollectionUtils.isEmpty(values)) { viewDto.setMaxValue(new BigDecimal(values.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setMinValue(new BigDecimal(values.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); } //处理预测累计 if (output.getIscumulant() == 1) { if (StringUtils.isNotBlank(output.getCumulpoint())) { viewDto.setCumulantRealData(getHisData(output.getCumulpoint(), startTime, endTime, reqVO.getPrec())); } viewDto.setCumulantPreData(mmItemResultService.getData(output.getId() + CommonDict.CUMULANT_SUFFIX, startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); } dataViewList.add(viewDto); } result.setStartTime(startTime); result.setEndTime(endTime); result.setPredictTime(predictTime); result.setCategories(DateUtils.getTimeScale(startTime, endTime, 60)); result.setLegend(legends); result.setDataViewList(dataViewList); return result; return mmItemResultService.getPreDataCharts(reqVO); } @Override @@ -725,7 +602,11 @@ @Override public Boolean createScheduleSuggest(ScheduleSuggestRespDTO dto) { String suggestId = UUID.randomUUID().toString(); dto.setId(suggestId); stScheduleSuggestService.create(ConvertUtils.sourceToTarget(dto, StScheduleSuggestSaveReqVO.class)); // 根据建议产生快照 stSuggestSnapshotRecordService.createSnapshotRecord(dto.getModelId(),dto.getScheduleObj(),dto.getScheduleTime(),suggestId); return true; } @@ -1037,6 +918,12 @@ stSuggestOperationRecordService.create(operationRecordVo); return true; } @Override public List<StSuggestSnapshotRecordRespVO> getSuggestSnapshotAllChartData(String suggestId) { return stSuggestSnapshotRecordService.getAllChartData(suggestId); } 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
@@ -353,4 +353,10 @@ mcsApi.ignoreSuggest(reqVO); return success( true); } @GetMapping("/suggest/snapshot/getAllChartData") @Operation(summary = "根据建议id获取建议快照全部图表数据") public CommonResult<List<StSuggestSnapshotRecordRespVO>> getSuggestSnapshotAllChartData(@RequestParam("suggestId") String suggestId){ return success( mcsApi.getSuggestSnapshotAllChartData(suggestId)); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java
@@ -1,5 +1,7 @@ package com.iailab.module.model.mcs.pre.service; import com.iailab.module.model.api.mcs.dto.PreDataBarLineReqVO; import com.iailab.module.model.api.mcs.dto.PreDataBarLineRespVO; import com.iailab.module.model.mdk.vo.DataValueVO; import java.util.Date; @@ -21,4 +23,6 @@ List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat); List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat, int decimalPlaces); PreDataBarLineRespVO getPreDataCharts(PreDataBarLineReqVO reqVO); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java
@@ -2,6 +2,14 @@ import com.alibaba.fastjson.JSONArray; 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.model.api.mcs.dto.PreDataBarLineReqVO; import com.iailab.module.model.api.mcs.dto.PreDataBarLineRespVO; import com.iailab.module.model.api.mcs.dto.PreDataViewRespDTO; import com.iailab.module.model.common.enums.CommonDict; import com.iailab.module.model.common.enums.DataTypeEnum; import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastBakSimPOJO; import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastSimPOJO; @@ -9,10 +17,13 @@ import com.iailab.module.model.influxdb.pojo.InfluxModelResultSimPOJO; import com.iailab.module.model.influxdb.service.InfluxDBService; import com.iailab.module.model.influxdb.vo.InfluxModelResultVO; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.entity.MmItemResultJsonEntity; import com.iailab.module.model.mcs.pre.service.MmItemResultJsonService; import com.iailab.module.model.mcs.pre.service.MmItemResultService; import com.iailab.module.model.mcs.pre.service.*; import com.iailab.module.model.mcs.sche.service.StAdjustResultService; import com.iailab.module.model.mdk.vo.DataValueVO; import com.iailab.module.model.mdk.vo.ItemVO; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -32,6 +43,19 @@ private MmItemResultJsonService mmItemResultJsonService; @Autowired private InfluxDBService influxDBService; @Autowired private MmItemOutputService mmItemOutputService; @Autowired private MmPredictItemService mmPredictItemService; @Autowired private DataPointApi dataPointApi; @Autowired private MmItemResultService mmItemResultService; @Autowired private StAdjustResultService stAdjustResultService; @Autowired private MmItemResultLastPointService mmItemResultLastPointService; private int HOUR_MINS = 60; @Override public void savePredictValue(Map<String, List<DataValueVO>> predictValueMap, int t, String nIndex, Date predictTime) { @@ -163,4 +187,163 @@ }); return result; } @Override public PreDataBarLineRespVO getPreDataCharts(PreDataBarLineReqVO reqVO) { PreDataBarLineRespVO result = new PreDataBarLineRespVO(); List<String> outIds = reqVO.getOutIds(); List<String> legends = new ArrayList<>(); List<PreDataViewRespDTO> dataViewList = new ArrayList<>(); if (CollectionUtils.isEmpty(outIds)) { return result; } Date predictTime = reqVO.getPredictTime(); if (predictTime == null) { MmItemOutputEntity output = null; for (String outId : outIds) { output = mmItemOutputService.getOutPutById(outId); if (output != null) { break; } } ItemVO predictItem = mmPredictItemService.getItemById(output.getItemid()); if (predictItem.getLastTime() != null) { predictTime = predictItem.getLastTime(); } else { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); predictTime = calendar.getTime(); } } Date startTime = reqVO.getStartTime(); if (startTime == null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(predictTime); calendar.add(Calendar.HOUR_OF_DAY, -1); startTime = calendar.getTime(); } Date endTime = reqVO.getEndTime(); if (endTime == null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(predictTime); calendar.add(Calendar.HOUR_OF_DAY, 1); calendar.add(Calendar.MINUTE, 1); endTime = calendar.getTime(); } for (int i = 0; i < outIds.size(); i++) { PreDataViewRespDTO viewDto = new PreDataViewRespDTO(); String outId = outIds.get(i); MmItemOutputEntity output = mmItemOutputService.getOutPutById(outId); if (output == null) { continue; } legends.add(output.getResultName()); viewDto.setItemId(output.getItemid()); viewDto.setOutId(outId); viewDto.setResultstr(output.getResultstr()); viewDto.setResultName(output.getResultName()); viewDto.setRealData(getHisData(output.getPointid(), startTime, endTime, reqVO.getPrec())); viewDto.setPreDataN(mmItemResultService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); viewDto.setPreDataL(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); viewDto.setPreDataLOriginal(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, DataTypeEnum.FLOAT_LAST_BAK)); viewDto.setCurData(mmItemResultJsonService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); // 模拟调整曲线 viewDto.setAdjData(stAdjustResultService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); List<Double> values = new ArrayList<>(); if (!CollectionUtils.isEmpty(viewDto.getRealData())) { List<Double> hisValues = new ArrayList<>(); viewDto.getRealData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); hisValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setHisMax(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setHisMin(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setHisAvg(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).average().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setHisCumulant(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).sum()) .divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getPreDataN())) { viewDto.getPreDataN().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); }); } if (!CollectionUtils.isEmpty(viewDto.getPreDataL())) { List<Double> preValues = new ArrayList<>(); viewDto.getPreDataL().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); preValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setPreMax(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setPreMin(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setPreAvg(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).average().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getCurData())) { List<Double> preValues = new ArrayList<>(); viewDto.getCurData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); preValues.add(Double.parseDouble(item[1].toString())); }); viewDto.setPreCumulant(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).sum()) .divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP)); } if (!CollectionUtils.isEmpty(viewDto.getAdjData())) { viewDto.getAdjData().forEach(item -> { values.add(Double.parseDouble(item[1].toString())); }); } if (!CollectionUtils.isEmpty(values)) { viewDto.setMaxValue(new BigDecimal(values.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); viewDto.setMinValue(new BigDecimal(values.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); } //处理预测累计 if (output.getIscumulant() == 1) { if (StringUtils.isNotBlank(output.getCumulpoint())) { viewDto.setCumulantRealData(getHisData(output.getCumulpoint(), startTime, endTime, reqVO.getPrec())); } viewDto.setCumulantPreData(mmItemResultService.getData(output.getId() + CommonDict.CUMULANT_SUFFIX, startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); } dataViewList.add(viewDto); } result.setStartTime(startTime); result.setEndTime(endTime); result.setPredictTime(predictTime); result.setCategories(DateUtils.getTimeScale(startTime, endTime, 60)); result.setLegend(legends); result.setDataViewList(dataViewList); return result; } private List<Object[]> getHisData(String pointId, Date startTime, Date endTime, Integer prec) { List<Object[]> result = new ArrayList<>(); if (StringUtils.isBlank(pointId)) { return result; } ApiPointDTO pointDTO = dataPointApi.getInfoById(pointId); ApiPointValueQueryDTO queryPointDto = new ApiPointValueQueryDTO(); queryPointDto.setPointNo(pointDTO.getPointNo()); queryPointDto.setStart(startTime); queryPointDto.setEnd(endTime); List<ApiPointValueDTO> valueDTOS = dataPointApi.queryPointHistoryValue(queryPointDto); if (CollectionUtils.isEmpty(valueDTOS)) { return result; } int defaultPrec = 3; valueDTOS.forEach(item -> { Object[] values = new Object[2]; values[0] = DateUtils.format(item.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); if (prec != null && prec < 0) { values[1] = item.getV(); } else if (prec != null && prec > 0) { values[1] = new BigDecimal(item.getV()).setScale(prec, BigDecimal.ROUND_HALF_UP); } else { values[1] = new BigDecimal(item.getV()).setScale(defaultPrec, BigDecimal.ROUND_HALF_UP); } result.add(values); }); return result; } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotRecordController.java
@@ -1,35 +1,16 @@ package com.iailab.module.model.mcs.sche.controller.admin; import com.iailab.framework.common.pojo.CommonResult; 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.StSuggestSnapshotRecordRespVO; import com.mysql.cj.util.TimeUtil; import com.iailab.module.model.api.mcs.dto.StSuggestSnapshotRecordRespVO; 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 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 @@ -42,102 +23,19 @@ @Autowired private StSuggestSnapshotRecordService stSuggestSnapshotRecordService; @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)); public CommonResult<List<StSuggestSnapshotRecordRespVO>> getListByOperationId(@RequestParam("suggestId") String suggestId) { return success(stSuggestSnapshotRecordService.getListBySuggestId(suggestId)); } @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); }); return success(reqList); return success(stSuggestSnapshotRecordService.getChartData(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; @GetMapping("/getAllChartData") public CommonResult<List<StSuggestSnapshotRecordRespVO>> getAllChartData(@RequestParam("suggestId") String suggestId){ return success(stSuggestSnapshotRecordService.getAllChartData(suggestId)); } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java
@@ -2,9 +2,10 @@ import com.iailab.framework.common.service.BaseService; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO; import com.iailab.module.model.api.mcs.dto.StSuggestSnapshotRecordRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO; import java.util.Date; import java.util.List; /** @@ -18,5 +19,11 @@ void delete(String id); List<StSuggestSnapshotRecordRespVO> getListByOperationId(String operationId); List<StSuggestSnapshotRecordRespVO> getListBySuggestId(String suggestId); void createSnapshotRecord(String modelId, String scheduleObj, Date scheduleTime, String suggestId); List<StSuggestSnapshotRecordRespVO> getChartData(List<StSuggestSnapshotRecordRespVO> reqList); List<StSuggestSnapshotRecordRespVO> getAllChartData(String suggestId); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java
@@ -18,7 +18,10 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * @author PanZhibao @@ -37,7 +40,6 @@ @Override public void create(StScheduleSuggestSaveReqVO createReqVO) { StScheduleSuggestEntity entity = BeanUtils.toBean(createReqVO, StScheduleSuggestEntity.class); entity.setId(UUID.randomUUID().toString()); entity.setStatus(ScheduleSuggestStatusEnum.S0.getCode()); baseDao.insert(entity); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java
@@ -28,15 +28,6 @@ public class StSuggestOperationRecordServiceImpl extends BaseServiceImpl<StSuggestOperationRecordDao, StSuggestOperationRecordEntity> implements StSuggestOperationRecordService { @Autowired private StSuggestSnapshotConfMainService stSuggestSnapshotConfMainService; @Autowired private StSuggestSnapshotConfDetService stSuggestSnapshotConfDetService; @Autowired private StSuggestSnapshotRecordService stSuggestSnapshotRecordService; @Override public PageResult<StSuggestOperationRecordEntity> page(StSuggestOperationRecordPageReqVO reqVO) { return baseDao.selectPage(reqVO); @@ -48,37 +39,6 @@ entity.setId(UUID.randomUUID().toString()); entity.setHandleTime(new Date()); baseDao.insert(entity); 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/StSuggestSnapshotRecordServiceImpl.java
@@ -4,16 +4,42 @@ 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.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.dto.PreDataBarLineReqVO; import com.iailab.module.model.api.mcs.dto.PreDataBarLineRespVO; import com.iailab.module.model.api.mcs.dto.StSuggestSnapshotRecordRespVO; import com.iailab.module.model.common.enums.DataCategoryEnum; import com.iailab.module.model.common.utils.DateUtils; import com.iailab.module.model.mcs.pre.service.MmItemResultService; import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotRecordDao; import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity; import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfDetService; import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService; import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO; import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO; 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.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; import static com.iailab.module.model.common.utils.DateUtils.DATE_TIME_PATTERN; /** @@ -22,10 +48,25 @@ @Service public class StSuggestSnapshotRecordServiceImpl extends BaseServiceImpl<StSuggestSnapshotRecordDao, StSuggestSnapshotRecordEntity> implements StSuggestSnapshotRecordService { @Autowired private DataPointApi dataPointApi; @Autowired private IndItemApi indItemApi; @Autowired private PlanItemApi planItemApi; @Autowired private MmItemResultService mmItemResultService; @Autowired private StSuggestSnapshotRecordService StSuggestSnapshotRecordService; private StSuggestSnapshotConfMainService stSuggestSnapshotConfMainService; @Autowired private StSuggestSnapshotConfDetService stSuggestSnapshotConfDetService; @Override @DSTransactional(rollbackFor = Exception.class) @@ -49,7 +90,134 @@ } @Override public List<StSuggestSnapshotRecordRespVO> getListByOperationId(String operationId) { return ConvertUtils.sourceToTarget(baseDao.selectList("operation_id", operationId), StSuggestSnapshotRecordRespVO.class); public List<StSuggestSnapshotRecordRespVO> getListBySuggestId(String suggestId) { return ConvertUtils.sourceToTarget(baseDao.selectList("suggest_id", suggestId), StSuggestSnapshotRecordRespVO.class); } @Override public void createSnapshotRecord(String modelId, String scheduleObj,Date scheduleTime, String suggestId) { if (StringUtils.isBlank(modelId) || StringUtils.isBlank(scheduleObj) || StringUtils.isBlank(suggestId)) { log.error("生成快照失败,参数错误!modelId:" + modelId + ",scheduleObj:" + scheduleObj + ",suggestId:" + suggestId); return; } //获取调度建议快照配置表信息 StSuggestSnapshotConfMainRespVO confMain = stSuggestSnapshotConfMainService.getByModelIdAndScheduleObj(modelId, scheduleObj); if (confMain == null) { log.error("生成快照失败,confMain is null!modelId:" + modelId + ",scheduleObj:" + scheduleObj); return; } List<StSuggestSnapshotConfDetRespVO> confDetList = stSuggestSnapshotConfDetService.getByConfId(confMain.getId()); if (CollectionUtils.isEmpty(confDetList)) { log.error("生成快照失败,confDetList is empty!modelId:" + modelId + ",scheduleObj:" + scheduleObj); return; } confDetList.forEach(confDet -> { StSuggestSnapshotRecordSaveReqVO snapshotRecordSaveReqVO = new StSuggestSnapshotRecordSaveReqVO(); snapshotRecordSaveReqVO.setSuggestId(suggestId); snapshotRecordSaveReqVO.setModelId(modelId); snapshotRecordSaveReqVO.setDataNo(confDet.getDataNo()); snapshotRecordSaveReqVO.setDataType(confDet.getDataType()); snapshotRecordSaveReqVO.setDataName(confDet.getDataName()); snapshotRecordSaveReqVO.setScheduleTime(scheduleTime); //计算开始时间,开始时间为当前调度时间减去快照配置表配置的左侧时间长度 LocalDateTime localStartDateTime = scheduleTime.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 = scheduleTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusMinutes(confDet.getRightLength() == null ? 60 : confDet.getLeftLength()); Date endTime = Date.from(localEndDateTime.atZone(ZoneId.systemDefault()).toInstant()); snapshotRecordSaveReqVO.setEndTime(endTime); this.create(snapshotRecordSaveReqVO); }); } @Override public List<StSuggestSnapshotRecordRespVO> getChartData(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); }); return reqList; } @Override public List<StSuggestSnapshotRecordRespVO> getAllChartData(String suggestId) { List<StSuggestSnapshotRecordRespVO> records = this.getListBySuggestId(suggestId); if (CollectionUtils.isEmpty(records)) { return new ArrayList<>(); } return this.getChartData(records); } 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 = mmItemResultService.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/vo/StSuggestSnapshotConfMainRespVO.java
@@ -23,7 +23,7 @@ @Schema(description = "模型ID") private String modelId; @Schema(description = "模型ID") @Schema(description = "模型名称") private String modelName; @Schema(description = "调整对象")