package com.iailab.module.model.mdk.sample;
|
|
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.model.mdk.common.enums.ModelParamType;
|
import com.iailab.module.model.mdk.sample.dto.SampleData;
|
import com.iailab.module.model.mdk.sample.dto.SampleInfo;
|
import com.iailab.module.model.mdk.vo.DataValueVO;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.util.CollectionUtils;
|
|
import java.sql.Timestamp;
|
import java.util.*;
|
|
abstract class SampleDataConstructor {
|
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
|
@Autowired
|
private DataPointApi dataPointApi;
|
|
/**
|
* prepareSampleData
|
*
|
* @param sampleInfo
|
* @return
|
*/
|
public abstract List<SampleData> prepareSampleData(SampleInfo sampleInfo);
|
|
/**
|
* 补全数据
|
*
|
* @param length
|
* @param dataEntityList
|
* @param startTime
|
* @param endTime
|
* @return
|
*/
|
public List<DataValueVO> completionData(int length, List<DataValueVO> dataEntityList, Date startTime, Date endTime,
|
String paramId, String paramType) {
|
if (CollectionUtils.isEmpty(dataEntityList) || length == dataEntityList.size()) {
|
return dataEntityList;
|
} else if (length < dataEntityList.size()) {
|
return dataEntityList.subList(dataEntityList.size() - length, dataEntityList.size());
|
}
|
|
List<DataValueVO> completionDataEntityList = new ArrayList<>();
|
long oneMin = 0L;
|
|
long start = startTime.getTime();
|
long end = endTime.getTime();
|
long mins = 0L;
|
|
switch (ModelParamType.getEumByCode(paramType)) {
|
case NORMALITEM:
|
case MERGEITEM:
|
// 预测值
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(startTime);
|
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
calendar.set(Calendar.MINUTE, 0);
|
calendar.set(Calendar.SECOND, 0);
|
calendar.add(Calendar.DAY_OF_YEAR, 1);
|
startTime = calendar.getTime();
|
start = startTime.getTime();
|
|
calendar.setTime(endTime);
|
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
calendar.set(Calendar.MINUTE, 0);
|
calendar.set(Calendar.SECOND, 0);
|
endTime = calendar.getTime();
|
end = endTime.getTime();
|
|
oneMin = 24 * 60 * 60 * 1000;
|
mins = ((end - start) / oneMin);
|
break;
|
case DATAPOINT:
|
// 测点值
|
ApiPointDTO dataPoint = dataPointApi.getInfoById(paramId);
|
oneMin = 1000L * DataPointFreqEnum.getEumByCode(dataPoint.getMinfreqid()).getValue();
|
// 设置时间偏移量
|
start = start - (start % oneMin) + oneMin;
|
end = end - (end % oneMin) + oneMin;
|
mins = ((end - start) / oneMin);
|
break;
|
case IND:
|
// 指标数据
|
oneMin = 24 * 60 * 60 * 1000;
|
Calendar calendar2 = Calendar.getInstance();
|
calendar2.setTime(startTime);
|
calendar2.set(Calendar.HOUR_OF_DAY, 0);
|
calendar2.set(Calendar.MINUTE, 0);
|
calendar2.set(Calendar.SECOND, 0);
|
start = calendar2.getTime().getTime();
|
|
calendar2.setTime(endTime);
|
calendar2.set(Calendar.HOUR_OF_DAY, 0);
|
calendar2.set(Calendar.MINUTE, 0);
|
calendar2.set(Calendar.SECOND, 0);
|
end = calendar2.getTime().getTime();
|
mins = ((end - start) / oneMin);
|
break;
|
default:
|
break;
|
}
|
Map<Long, Double> sourceDataMap = new HashMap<>(dataEntityList.size());
|
for (DataValueVO dataEntity : dataEntityList) {
|
sourceDataMap.put(dataEntity.getDataTime().getTime(), dataEntity.getDataValue());
|
}
|
|
//找出缺少项
|
Map<Long, Double> dataMap = new LinkedHashMap<>();
|
for (int i = 0; i < mins; i++) {
|
Long key = start + oneMin * i;
|
Double value = sourceDataMap.get(key);
|
dataMap.put(key, value);
|
}
|
|
//补充缺少项
|
int k = 0;
|
Map.Entry<Long, Double> lastItem = null;
|
for (Map.Entry<Long, Double> item : dataMap.entrySet()) {
|
if (k == 0 && item.getValue() == null) {
|
item.setValue(getFirstValue(dataMap));
|
} else if (item.getValue() == null) {
|
item.setValue(lastItem.getValue());
|
}
|
k++;
|
lastItem = item;
|
|
DataValueVO dataEntity = new DataValueVO();
|
dataEntity.setDataTime(new Timestamp(item.getKey()));
|
dataEntity.setDataValue(item.getValue());
|
completionDataEntityList.add(dataEntity);
|
}
|
return completionDataEntityList;
|
}
|
|
/**
|
* getFirstValue
|
*
|
* @param dataMap
|
* @return
|
*/
|
private Double getFirstValue(Map<Long, Double> dataMap) {
|
for (Map.Entry<Long, Double> item : dataMap.entrySet()) {
|
if (item.getValue() != null) {
|
return item.getValue();
|
}
|
}
|
return null;
|
}
|
|
}
|