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;
|
import java.util.Map;
|
|
/**
|
* @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
|
*/
|
protected 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 modelId
|
* @param predictTime
|
* @return
|
*/
|
protected abstract List<ColumnItemPort> getColumnInfo(String modelId, Date predictTime);
|
|
/**
|
* 样本的采样周期
|
*
|
* @param modelId
|
* @return
|
*/
|
protected abstract Integer getSampleCycle(String modelId);
|
|
/**
|
* 获取开始时间
|
*
|
* @param columnItem
|
* @param originalTime
|
* @return
|
* @throws Exception
|
*/
|
protected Date getStartTime(ColumnItem columnItem, Date originalTime, Map<String, ApiPointDTO> pointMap) {
|
Date dateTime = new Date();
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(originalTime);
|
switch (ModelParamType.getEumByCode(columnItem.getParamType())) {
|
case DATAPOINT:
|
ApiPointDTO dataPoint = pointMap.get(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,Map<String, ApiPointDTO> pointMap) {
|
Date dateTime = new Date();
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(originalTime);
|
switch (ModelParamType.getEumByCode(columnItem.getParamType())) {
|
case DATAPOINT:
|
ApiPointDTO dataPoint = pointMap.get(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.getItemByIdFromCache(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 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();
|
}
|
}
|