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> predictValueMap, int t, String nIndex, Date predictTime) { List importList = new ArrayList<>(); List lastList = new ArrayList<>(); List resultJsonList = new ArrayList<>(); for (Map.Entry> 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 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 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 getPredictValue(String outputid, Date startTime, Date endTime) { InfluxModelResultPOJO pojo = new InfluxModelResultPOJO(); pojo.setType(DataTypeEnum.FLOAT.getCode()); pojo.setOutPutId(outputid); List influxModelResultVOS = influxDBService.queryModelResults(pojo, startTime, endTime); List 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 getData(String outputid, Date startTime, Date endTime, String timeFormat) { List result = new ArrayList<>(); InfluxModelResultPOJO pojo = new InfluxModelResultPOJO(); pojo.setType(DataTypeEnum.FLOAT.getCode()); pojo.setOutPutId(outputid); List 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 predictDoubleValues, Date predictTime) { List list = new ArrayList<>(); for (Map.Entry 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); } }