package com.iailab.module.model.mcs.pre.service.impl;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.iailab.framework.common.util.date.DateUtils;
|
import com.iailab.module.model.common.enums.DataTypeEnum;
|
import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastSimPOJO;
|
import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO;
|
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.mdk.vo.DataValueVO;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author PanZhibao
|
* @date 2021年05月28日 10:34
|
*/
|
@Service
|
public class MmItemResultServiceImpl implements MmItemResultService {
|
|
@Autowired
|
private MmItemResultJsonService mmItemResultJsonService;
|
@Autowired
|
private InfluxDBService influxDBService;
|
|
@Override
|
public void savePredictValue(Map<String, List<DataValueVO>> predictValueMap, int t, String nIndex, Date predictTime) {
|
List<InfluxModelResultPOJO> importList = new ArrayList<>();
|
List<InfluxModelResultPOJO> lastList = new ArrayList<>();
|
List<MmItemResultJsonEntity> resultJsonList = new ArrayList<>();
|
|
for (Map.Entry<String, List<DataValueVO>> entry : predictValueMap.entrySet()) {
|
for (DataValueVO dataVo : entry.getValue()) {
|
InfluxModelResultSimPOJO pojo = new InfluxModelResultSimPOJO();
|
pojo.setValue(dataVo.getDataValue());
|
pojo.setTimestamp(dataVo.getDataTime().toInstant());
|
pojo.setOutPutId(entry.getKey());
|
pojo.setType(DataTypeEnum.FLOAT.getCode());
|
importList.add(pojo);
|
}
|
|
List<DataValueVO> lastVoList = new ArrayList<>();
|
int size = entry.getValue().size();
|
t = Math.max(t, 0);
|
int n = "n".equals(nIndex) ? size : Integer.parseInt(nIndex);
|
int length = Math.max((n - t), 0); //预测完不变的数据长度
|
if (size >= n) {
|
for (int i = 0; i < (size - length); i ++) {
|
int index = length + i;
|
lastVoList.add(entry.getValue().get(index));
|
}
|
} else {
|
lastVoList = entry.getValue();
|
}
|
|
for (DataValueVO dataVo : lastVoList) {
|
InfluxModelResultLastSimPOJO pojo = new InfluxModelResultLastSimPOJO();
|
pojo.setValue(dataVo.getDataValue());
|
pojo.setTimestamp(dataVo.getDataTime().toInstant());
|
pojo.setOutPutId(entry.getKey());
|
pojo.setType(DataTypeEnum.FLOAT.getCode());
|
lastList.add(pojo);
|
}
|
|
MmItemResultJsonEntity resultJson = new MmItemResultJsonEntity();
|
resultJson.setId(UUID.randomUUID().toString());
|
resultJson.setOutputid(entry.getKey());
|
resultJson.setPredicttime(predictTime);
|
List<Double> jsonValueList = entry.getValue().stream().map(valueVO -> valueVO.getDataValue()).collect(Collectors.toList());
|
resultJson.setJsonvalue(JSONArray.toJSONString(jsonValueList));
|
resultJsonList.add(resultJson);
|
}
|
// json结果存入mysql
|
mmItemResultJsonService.insert(resultJsonList);
|
// double结果存入influxdb
|
influxDBService.asyncWriteModelResults(importList);
|
influxDBService.asyncWriteModelResults(lastList);
|
}
|
|
@Override
|
public List<DataValueVO> getPredictValue(String outputid, Date startTime, Date endTime) {
|
InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
|
pojo.setType(DataTypeEnum.FLOAT.getCode());
|
pojo.setOutPutId(outputid);
|
List<InfluxModelResultVO> influxModelResultVOS = influxDBService.queryModelResults(pojo, startTime, endTime);
|
List<DataValueVO> result = influxModelResultVOS.stream().map(t -> {
|
DataValueVO dv = new DataValueVO();
|
dv.setDataTime(Date.from(t.getTimestamp()));
|
dv.setDataValue(Double.valueOf(t.getValue().toString()));
|
return dv;
|
}).collect(Collectors.toList());
|
return result;
|
}
|
|
@Override
|
public List<Object[]> getData(String outputid, Date startTime, Date endTime, String timeFormat) {
|
List<Object[]> result = new ArrayList<>();
|
InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
|
pojo.setType(DataTypeEnum.FLOAT.getCode());
|
pojo.setOutPutId(outputid);
|
List<InfluxModelResultVO> influxModelResultVOS = influxDBService.queryModelResults(pojo, startTime, endTime);
|
influxModelResultVOS.forEach(item -> {
|
Object[] dataItem = new Object[2];
|
dataItem[0] = DateUtils.format(Date.from(item.getTimestamp()), timeFormat);
|
dataItem[1] = BigDecimal.valueOf(Double.valueOf(item.getValue().toString())).setScale(2, BigDecimal.ROUND_HALF_UP);
|
result.add(dataItem);
|
});
|
return result;
|
}
|
|
@Override
|
public void savePredictValue(Map<MmItemOutputEntity, Double> predictDoubleValues, Date predictTime) {
|
List<InfluxModelResultPOJO> list = new ArrayList<>();
|
for (Map.Entry<MmItemOutputEntity, Double> entry : predictDoubleValues.entrySet()) {
|
InfluxModelResultSimPOJO pojo = new InfluxModelResultSimPOJO();
|
pojo.setValue(entry.getValue());
|
pojo.setTimestamp(predictTime.toInstant());
|
pojo.setOutPutId(entry.getKey().getId());
|
pojo.setType(DataTypeEnum.FLOAT.getCode());
|
list.add(pojo);
|
}
|
influxDBService.asyncWriteModelResults(list);
|
}
|
}
|