package com.iailab.module.model.mdk.sample; import com.iailab.module.data.api.ind.IndItemApi; import com.iailab.module.data.api.ind.dto.ApiIndItemDTO; import com.iailab.module.data.api.plan.PlanItemApi; import com.iailab.module.data.api.plan.dto.ApiPlanItemDTO; import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.data.api.point.dto.ApiPointDTO; import com.iailab.module.data.enums.DataPointFreqEnum; import com.iailab.module.data.enums.TimeGranularityEnum; import com.iailab.module.data.enums.TimeGranularitySecEnum; import com.iailab.module.model.mcs.pre.service.MmPredictItemService; import com.iailab.module.model.mdk.common.enums.ModelParamType; import com.iailab.module.model.mdk.sample.dto.ColumnItem; import com.iailab.module.model.mdk.sample.dto.ColumnItemPort; import com.iailab.module.model.mdk.sample.dto.SampleInfo; import org.springframework.beans.factory.annotation.Autowired; import java.util.Calendar; import java.util.Date; import java.util.List; /** * @author PanZhibao * @Description * @createTime 2024年09月03日 */ abstract class SampleInfoConstructor { @Autowired private DataPointApi dataPointApi; @Autowired private PlanItemApi planItemApi; @Autowired private IndItemApi indItemApi; @Autowired private MmPredictItemService mmPredictItemService; /** * prepareSampleInfo * * @param modelId * @param predictTime * @return */ public SampleInfo prepareSampleInfo(String modelId, Date predictTime) { SampleInfo sampleInfo = new SampleInfo(); //调用样本列数的方法 sampleInfo.setSampleColumn(getSampleColumn(modelId)); //样本的列信息 sampleInfo.setColumnInfo(getColumnInfo(modelId, predictTime)); //样本的采样周期 sampleInfo.setSampleCycle(getSampleCycle(modelId)); return sampleInfo; } /** * 返回样本矩阵的列数 * * @param modelId * @return */ protected abstract Integer getSampleColumn(String modelId); /** * 获取开始时间 * * @param columnItem * @param originalTime * @return * @throws Exception */ protected Date getStartTime(ColumnItem columnItem, Date originalTime) { Date dateTime = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(originalTime); switch (ModelParamType.getEumByCode(columnItem.getParamType())) { case DATAPOINT: ApiPointDTO dataPoint = dataPointApi.getInfoById(columnItem.getParamId()); if (dataPoint == null) { return null; } dateTime = calculateTime(originalTime, true, columnItem.getDataLength(), DataPointFreqEnum.getEumByCode(dataPoint.getMinfreqid()).getValue()); break; case NORMALITEM: case MERGEITEM: dateTime = calendar.getTime(); break; case IND: dateTime = calculateTime(originalTime, true, columnItem.getDataLength(), 60); break; case PLAN: dateTime = calendar.getTime(); break; default: break; } return dateTime; } /** * 获取结束时间 * * @param columnItem * @param originalTime * @return * @throws Exception */ protected Date getEndTime(ColumnItem columnItem, Date originalTime) { Date dateTime = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(originalTime); switch (ModelParamType.getEumByCode(columnItem.getParamType())) { case DATAPOINT: ApiPointDTO dataPoint = dataPointApi.getInfoById(columnItem.getParamId()); if (dataPoint == null) { return null; } dateTime = calendar.getTime(); break; case NORMALITEM: case MERGEITEM: dateTime = calendar.getTime(); break; case IND: dateTime = calendar.getTime(); break; case PLAN: ApiPlanItemDTO planItem = planItemApi.getInfoByNo(columnItem.getParamId()); if (planItem == null) { return null; } dateTime = calculateDate(originalTime, false, columnItem.getDataLength(), TimeGranularityEnum.getEumByCode(planItem.getTimeGranularity()).getValue()); break; default: break; } return dateTime; } /** * 获取粒度,s * * @param columnItem * @return * @throws Exception */ protected Integer getGranularity(ColumnItem columnItem) { // 默认60s Integer granularity = 60; switch (ModelParamType.getEumByCode(columnItem.getParamType())) { case DATAPOINT: ApiPointDTO dataPoint = dataPointApi.getInfoById(columnItem.getParamId()); granularity = DataPointFreqEnum.getEumByCode(dataPoint.getMinfreqid()).getValue(); break; case NORMALITEM: granularity = mmPredictItemService.getItemByOutPutId(columnItem.getParamId()).getGranularity(); break; case MERGEITEM: granularity = mmPredictItemService.getItemById(columnItem.getParamId()).getGranularity(); break; case IND: ApiIndItemDTO indItemDTO = indItemApi.getInfoById(columnItem.getParamId()); granularity = TimeGranularitySecEnum.getEumByCode(indItemDTO.getTimeGranularity()).getValue();; break; case PLAN: ApiPlanItemDTO apiPlanItemDTO = planItemApi.getInfoById(columnItem.getParamId()); granularity = TimeGranularitySecEnum.getEumByCode(apiPlanItemDTO.getTimeGranularity()).getValue(); break; default: break; } return granularity; } /** * 样本的列信息 * * @param modelId * @param predictTime * @return */ protected abstract List getColumnInfo(String modelId, Date predictTime); /** * 样本的采样周期 * * @param modelId * @return */ protected abstract Integer getSampleCycle(String modelId); /** * 计算取值的时间 * * @param originalTime * @param backward * @param dataLength * @param granularity * @return */ public Date calculateTime(Date originalTime, Boolean backward, int dataLength, int granularity) { int timeLength; if (backward) { timeLength = (-1) * dataLength; } else { timeLength = dataLength - 1; } Date desTime = originalTime; Calendar calendar = Calendar.getInstance(); calendar.setTime(desTime); calendar.set(Calendar.MILLISECOND, 0); // 数据长度 * 粒度 calendar.add(Calendar.SECOND, timeLength * granularity); return calendar.getTime(); } public Date calculateDate(Date originalTime, Boolean backward, int dataLength, int field) { int timeLength; if (backward) { timeLength = (-1) * dataLength; } else { timeLength = dataLength - 1; } Date desTime = originalTime; Calendar calendar = Calendar.getInstance(); calendar.setTime(desTime); calendar.set(Calendar.MILLISECOND, 0); // 数据长度 * 粒度 calendar.add(Calendar.SECOND, timeLength); return calendar.getTime(); } }