iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictItemRespDTO.java
@@ -5,8 +5,11 @@ import java.util.Date; import java.util.List; import java.util.Map; /** * 单个预测项预测结果 * * @author PanZhibao * @Description * @createTime 2024年08月26日 @@ -19,5 +22,6 @@ private Date predictTime; private List<MdkPredictDataDTO> predictData; @Schema(description = "单个预测项预测结果,KEY为预测项目编码") private Map<String, List<MdkPredictDataDTO>> predictData; } iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictModuleRespDTO.java
@@ -1,5 +1,6 @@ package com.iailab.module.model.api.mdk.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -15,9 +16,11 @@ @Data public class MdkPredictModuleRespDTO { @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private Date predictTime; private String moduleType; @Schema(description = "模块预测结果,KEY为预测项目编码") private Map<String, MdkPredictItemRespDTO> predictItemRespMap; } iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictReqDTO.java
@@ -1,5 +1,6 @@ package com.iailab.module.model.api.mdk.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -17,6 +18,7 @@ @Schema(description = "预测时间") @NotNull(message="预测时间不能为空") @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private Date predictTime; @Schema(description = "预测模块(管网类型)") @@ -24,4 +26,7 @@ @Schema(description = "预测项编号") private String itemNo; @Schema(description = "是否返回预测结果") private Boolean isResult; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java
@@ -99,34 +99,32 @@ } List<ItemVO> predictItemList = mmPredictItemService.getByModuleId(module.getId()); Map<String, PredictResultVO> predictResultMap = predictModuleHandler.predict(predictItemList, reqDTO.getPredictTime(), intervalTime); // 更新Module时间 dmModuleService.updatePredictTime(module.getId(), reqDTO.getPredictTime()); // for (Map.Entry<String, PredictResultVO> entry : predictResultMap.entrySet()) { // for (Map.Entry<String, List<DataValueVO>> dataListEntry : entry.getValue().getPredictLists().entrySet()) { // List<MdkPredictDataDTO> predictData = dataListEntry.getValue().stream().map(t -> { // MdkPredictDataDTO dto1 = new MdkPredictDataDTO(); // dto1.setDataTime(t.getDataTime()); // dto1.setDataValue(t.getDataValue()); // return dto1; // }).collect(Collectors.toList()); // MdkPredictItemRespDTO itemResp = new MdkPredictItemRespDTO(); // itemResp.setItemId(dataListEntry.getKey()); // itemResp.setPredictData(predictData); // predictItemRespMap.put(entry.getKey(), itemResp); // } // } if (reqDTO.getIsResult() == null || !reqDTO.getIsResult()) { return resp; } // for (Map.Entry<String, PredictResultVO> entry : predictResultMap.entrySet()) { // List<MdkPredictDataDTO> predictData = entry.getValue().getPredictList().stream().map(t-> { // MdkPredictDataDTO dto1 = new MdkPredictDataDTO(); // dto1.setDataTime(t.getDataTime()); // dto1.setDataValue(t.getDataValue()); // return dto1; // }).collect(Collectors.toList()); // MdkPredictItemRespDTO itemResp = new MdkPredictItemRespDTO(); // itemResp.setItemId(entry.getValue().getPredictId()); // itemResp.setPredictData(predictData); // predictItemRespMap.put(entry.getKey(), itemResp); // } for (Map.Entry<String, PredictResultVO> entry : predictResultMap.entrySet()) { MdkPredictItemRespDTO itemResp = new MdkPredictItemRespDTO(); itemResp.setItemId(entry.getKey()); itemResp.setPredictTime(reqDTO.getPredictTime()); Map<String, List<MdkPredictDataDTO>> itemPredictData = new HashMap<>(); Map<String, List<DataValueVO>> predictLists = predictResultHandler.convertToPredictData2(entry.getValue()); for (Map.Entry<String, List<DataValueVO>> dataListEntry : predictLists.entrySet()) { List<MdkPredictDataDTO> predictData = dataListEntry.getValue().stream().map(t -> { MdkPredictDataDTO dto1 = new MdkPredictDataDTO(); dto1.setDataTime(t.getDataTime()); dto1.setDataValue(t.getDataValue()); return dto1; }).collect(Collectors.toList()); itemPredictData.put(dataListEntry.getKey(), predictData); } itemResp.setPredictData(itemPredictData); predictItemRespMap.put(entry.getKey(), itemResp); } } log.info("预测计算结束: " + System.currentTimeMillis()); } catch (Exception ex) { @@ -149,14 +147,15 @@ try { log.info("预测计算开始: " + System.currentTimeMillis()); List<MdkPredictDataDTO> predictData = new ArrayList<>(); Map<String, List<MdkPredictDataDTO>> predictData = new HashMap<>(); ItemVO predictItem = itemEntityFactory.getItemByItemNo(reqDTO.getItemNo()); PredictItemHandler predictItemHandler = (PredictItemHandler)predictItemFactory.create(predictItem.getId()); PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId()); PredictResultVO predictResult = predictItemHandler.predict(reqDTO.getPredictTime(), predictItem); Map<String, List<DataValueVO>> resultMap = predictResultHandler.convertToPredictData(predictResult); if (!CollectionUtils.isEmpty(resultMap)) { for (Map.Entry<String, List<DataValueVO>> entry : resultMap.entrySet()) { predictData = ConvertUtils.sourceToTarget(entry.getValue(), MdkPredictDataDTO.class); List<MdkPredictDataDTO> data = ConvertUtils.sourceToTarget(entry.getValue(), MdkPredictDataDTO.class); predictData.put(entry.getKey(), data); } } resp.setPredictData(predictData); @@ -164,7 +163,7 @@ resp.setPredictTime(reqDTO.getPredictTime()); log.info("预测计算结束: " + System.currentTimeMillis()); } catch (Exception ex) { log.info("预测计算异常: " + System.currentTimeMillis(),ex); log.info("预测计算异常: " + System.currentTimeMillis(), ex); return resp; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonConstant.java
@@ -15,4 +15,10 @@ BigDecimal ZERO_VALUE = new BigDecimal("0"); String MDK_SUFFIX = ".miail"; String MDK_RESULT = "result"; String MDK_STATUS_CODE = "status_code"; String MDK_STATUS_100 = "100"; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/DmModuleService.java
@@ -4,6 +4,7 @@ import com.iailab.module.model.mcs.pre.entity.DmModuleEntity; import com.iailab.module.model.mcs.pre.vo.DmModulePageReqVO; import java.util.Date; import java.util.List; import java.util.Map; @@ -30,4 +31,6 @@ DmModuleEntity info(String id); DmModuleEntity getModuleByItemId(String itemId); void updatePredictTime(String id, Date predictTime); } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultService.java
@@ -1,6 +1,5 @@ package com.iailab.module.model.mcs.pre.service; import com.iailab.module.data.api.point.dto.ApiPointDTO; import com.iailab.module.model.mcs.pre.entity.MmItemResultEntity; import com.iailab.module.model.mdk.vo.DataValueVO; iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/DmModuleServiceImpl.java
@@ -86,7 +86,16 @@ params.put("moduletype", moduletype); QueryWrapper<DmModuleEntity> wrapper = getWrapper(params); return dmModuleDao.selectList(wrapper); } @Override public void updatePredictTime(String id, Date predictTime) { DmModuleEntity entity = dmModuleDao.selectById(id); if (entity == null) { return; } entity.setPredicttime(predictTime); dmModuleDao.updateById(entity); } @Override iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultServiceImpl.java
@@ -75,9 +75,9 @@ List<DataValueVO> lastVoList = new ArrayList<>(); int size = entry.getValue().size(); t = t > 0 ? t : 0; t = Math.max(t, 0); int n = "n".equals(nIndex) ? size : Integer.parseInt(nIndex); int length = (n - t) > 0 ? (n - t) : 0; //预测完不变的数据长度 int length = Math.max((n - t), 0); //预测完不变的数据长度 if (size >= n) { for (int i = 0; i < (size - length); i ++) { int index = length + i; @@ -112,41 +112,7 @@ params.put("STARTTIME", importList.get(0).getDatatime()); params.put("ENDTIME", importList.get(importList.size() - 1).getDatatime()); mmItemResultDao.deletePredictValue(params); } // Map<String, Object> params = new HashMap(4); // params.put("TABLENAME", T_MM_ITEM_RESULT); // params.put("OUTPUTID", importList.get(0).getOutputid()); // params.put("STARTTIME", importList.get(0).getDatatime()); // params.put("ENDTIME", importList.get(importList.size() - 1).getDatatime()); // mmItemResultDao.deletePredictValue(params); // int num1 = importList.size() / max_group_count; // int num2 = importList.size() % max_group_count; // if (num2 != 0) { // num1++; // } // // List<MmItemResultEntity> tempList; // //先删除已经存在的数据,再插入新数据 // for (int i = 0; i < num1; i++) { // int startIndex = max_group_count * i; // int count = max_group_count; // if (num2!=0 && i == num1 - 1) { // count = num2; // } // tempList = new ArrayList<>(); // //获取某个索引范围内的对象集合 // for (int j = startIndex; j < startIndex + count; j++) { // tempList.add(importList.get(j)); // } // Map<String, Object> map2 = new HashMap<>(2); // map2.put("TABLENAME", T_MM_ITEM_RESULT); // map2.put("list", tempList); // mmItemResultDao.savePredictValue(map2); // } mmItemResultDao.insertBatch(importList,max_group_count); Map<String, Object> map3 = new HashMap<>(2); iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictItemHandler.java
@@ -13,5 +13,13 @@ */ public interface PredictItemHandler { /** * 单个预测项预测 * * @param predictTime * @param predictItemDto * @return * @throws ItemInvokeException */ PredictResultVO predict(Date predictTime, ItemVO predictItemDto) throws ItemInvokeException; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModelHandler.java
@@ -13,5 +13,13 @@ */ public interface PredictModelHandler { /** * 根据模型预测 * * @param predictTime * @param predictModel * @return * @throws ModelInvokeException */ PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel) throws ModelInvokeException; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java
@@ -1,6 +1,5 @@ package com.iailab.module.model.mdk.predict; import com.iailab.module.model.mcs.pre.entity.MmItemStatusEntity; import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum; import com.iailab.module.model.mcs.pre.enums.ItemStatus; import com.iailab.module.model.mcs.pre.service.MmItemStatusService; @@ -39,6 +38,14 @@ private MmItemStatusService mmItemStatusService; /** * 预测处理 * * @param predictItemList * @param predictTime * @param intervalTime * @return */ public Map<String, PredictResultVO> predict(List<ItemVO> predictItemList, Date predictTime, int intervalTime) { Map<String, PredictResultVO> result = new HashMap<>(); @@ -53,6 +60,7 @@ PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId()); Instant start = Instant.now(); try { // 预测项开始预测 predictResult = predictItemHandler.predict(predictTime, predictItem); } catch (Exception e) { e.printStackTrace(); @@ -63,9 +71,12 @@ log.info(MessageFormat.format("预测项:{0},预测时间:{1}秒", predictItem.getItemName(), drtPre)); totalDur = totalDur + drtPre; predictResult.setGranularity(predictItem.getGranularity()); predictResult.setT(intervalTime); predictResult.setSaveIndex(predictItem.getSaveIndex()); predictResult.setLt(1); // 保存预测结果 predictResultHandler.savePredictResult(predictResult); Instant endSave = Instant.now(); Long drtSave = Duration.between(end, endSave).getSeconds(); iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictResultHandler.java
@@ -1,9 +1,6 @@ package com.iailab.module.model.mdk.predict; import com.baomidou.dynamic.datasource.annotation.DSTransactional; 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.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.service.MmItemResultService; import com.iailab.module.model.mdk.factory.ItemEntityFactory; @@ -25,9 +22,6 @@ @Autowired private ItemEntityFactory itemEntityFactory; @Autowired private DataPointApi dataPointApi; /** * convertToPredictData * @@ -45,8 +39,6 @@ Map<MmItemOutputEntity, double[]> predictMatrixs = predictResult.getPredictMatrixs(); HashMap<String,List<DataValueVO>> predictLists = new HashMap<>(); for (Map.Entry<MmItemOutputEntity, double[]> entry : predictMatrixs.entrySet()) { ApiPointDTO point = dataPointApi.getInfoById(entry.getKey().getPointid()); Integer pointMinfreq = DataPointFreqEnum.getEumByCode(point.getMinfreqid()).getValue(); Integer rows = entry.getValue().length; List<DataValueVO> predictDataList = new ArrayList<>(); Calendar calendar = Calendar.getInstance(); @@ -57,14 +49,39 @@ predictData.setDataValue(Double.valueOf(entry.getValue()[i])); predictDataList.add(predictData); calendar.add(Calendar.SECOND, pointMinfreq); calendar.add(Calendar.SECOND, predictResult.getGranularity()); } resultMap.put(entry.getKey().getId(), predictDataList); predictLists.put(entry.getKey().getResultstr(), predictDataList); } predictResult.setPredictLists(predictLists); return resultMap; } public Map<String, List<DataValueVO>> convertToPredictData2(PredictResultVO predictResult) { Map<String, List<DataValueVO>> predictLists = new HashMap<>(); if (!CollectionUtils.isEmpty(predictResult.getPredictList())) { return predictLists; } Map<MmItemOutputEntity, double[]> predictMatrixs = predictResult.getPredictMatrixs(); for (Map.Entry<MmItemOutputEntity, double[]> entry : predictMatrixs.entrySet()) { Integer rows = entry.getValue().length; List<DataValueVO> predictDataList = new ArrayList<>(); Calendar calendar = Calendar.getInstance(); calendar.setTime(predictResult.getPredictTime()); for (Integer i = 0; i < rows; i++) { DataValueVO predictData = new DataValueVO(); predictData.setDataTime(calendar.getTime()); predictData.setDataValue(Double.valueOf(entry.getValue()[i])); predictDataList.add(predictData); calendar.add(Calendar.SECOND, predictResult.getGranularity()); } predictLists.put(entry.getKey().getResultstr(), predictDataList); } return predictLists; } /** * savePredictResult * iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemMergeHandlerImpl.java
@@ -41,6 +41,14 @@ @Autowired private PredictResultHandler predictResultHandler; /** * MergeItem预测 * * @param predictTime * @param predictItemDto * @return * @throws ItemInvokeException */ @Override public PredictResultVO predict(Date predictTime, ItemVO predictItemDto) throws ItemInvokeException { iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictItemNormalHandlerImpl.java
@@ -34,13 +34,20 @@ @Autowired private PredictModelHandler predictModelHandler; /** * NormalItem预测 * * @param predictTime * @param predictItemDto * @return * @throws ItemInvokeException */ @Override public PredictResultVO predict(Date predictTime, ItemVO predictItemDto) throws ItemInvokeException{ String itemId = predictItemDto.getId(); PredictResultVO finalResult = new PredictResultVO(); PredictResultVO predictResult = new PredictResultVO(); List<PredictResultVO> predictResultList = new ArrayList<>(); String itemId = predictItemDto.getId(); predictResult.setPredictId(itemId); try { // 获取预测项模型 List<MmPredictModelEntity> predictModelList = mmPredictModelService.getActiveModelByItemId(itemId); @@ -48,17 +55,8 @@ throw new ModelInvokeException(MessageFormat.format("{0},itemId={1}", ModelInvokeException.errorGetModelEntity, itemId)); } for (MmPredictModelEntity predictModel : predictModelList) { predictResult = predictModelHandler.predictByModel(predictTime, predictModel); predictResult.setPredictId(itemId); predictResultList.add(predictResult); } /*Calendar calendar = Calendar.getInstance(); calendar.setTime(predictTime); calendar.add(Calendar.MINUTE, predictResult.getPredictMatrix().length - 1); Timestamp endTime = new Timestamp(calendar.getTime().getTime());*/ finalResult = predictResultList.get(0); MmPredictModelEntity predictModel = predictModelList.get(0); predictResult = predictModelHandler.predictByModel(predictTime, predictModel); } catch (Exception ex) { ex.printStackTrace(); //预测项预测失败的状态 @@ -66,6 +64,6 @@ ItemInvokeException.errorItemFailed, itemId)); } return finalResult; return predictResult; } } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/impl/PredictModelHandlerImpl.java
@@ -2,16 +2,13 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.iail.IAILMDK; import com.iail.model.IAILModel; import com.iailab.module.model.mcs.pre.controller.admin.MmItemOutputController; import com.iailab.module.model.common.enums.CommonConstant; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.entity.MmModelArithSettingsEntity; import com.iailab.module.model.mcs.pre.entity.MmModelResultstrEntity; import com.iailab.module.model.mcs.pre.entity.MmPredictModelEntity; import com.iailab.module.model.mcs.pre.service.MmItemOutputService; import com.iailab.module.model.mcs.pre.service.MmModelArithSettingsService; import com.iailab.module.model.mcs.pre.service.MmModelResultstrService; import com.iailab.module.model.mdk.common.enums.TypeA; import com.iailab.module.model.mdk.common.exceptions.ModelInvokeException; import com.iailab.module.model.mdk.predict.PredictModelHandler; @@ -21,7 +18,6 @@ import com.iailab.module.model.mpk.common.utils.DllUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Component; import java.util.*; @@ -39,15 +35,21 @@ private MmModelArithSettingsService mmModelArithSettingsService; @Autowired private MmModelResultstrService mmModelResultstrService; @Autowired private MmItemOutputService mmItemOutputService; @Autowired private SampleConstructor sampleConstructor; /** * 根据模型预测,返回预测结果 * * @param predictTime * @param predictModel * @return * @throws ModelInvokeException */ @Override public PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel) throws ModelInvokeException { public synchronized PredictResultVO predictByModel(Date predictTime, MmPredictModelEntity predictModel) throws ModelInvokeException { PredictResultVO result = new PredictResultVO(); if (predictModel == null) { throw new ModelInvokeException("modelEntity is null"); @@ -70,10 +72,10 @@ int portLength = sampleDataList.size(); Object[] param2Values = new Object[portLength + 2]; for (int i = 0; i < portLength; i++) { param2Values[i]=sampleDataList.get(i).getMatrix(); param2Values[i] = sampleDataList.get(i).getMatrix(); } param2Values[portLength] = newModelBean.getDataMap().get("models"); param2Values[portLength+1] = settings; param2Values[portLength + 1] = settings; log.info("#######################预测模型 " + predictModel.getItemid() + " ##########################"); JSONObject jsonObjNewModelBean = new JSONObject(); @@ -84,13 +86,12 @@ log.info(String.valueOf(jsonObjParam2Values)); //IAILMDK.run // HashMap<String, Object> modelResult = IAILMDK.run(newModelBean, param2Values); HashMap<String, Object> modelResult = DllUtils.run(newModelBean, param2Values, predictModel.getMpkprojectid()); if(!modelResult.containsKey("status_code") || !modelResult.containsKey("result") || Integer.parseInt(modelResult.get("status_code").toString()) != 100) { if (!modelResult.containsKey(CommonConstant.MDK_STATUS_CODE) || !modelResult.containsKey(CommonConstant.MDK_RESULT) || !modelResult.get(CommonConstant.MDK_STATUS_CODE).toString().equals(CommonConstant.MDK_STATUS_100)) { throw new RuntimeException("模型结果异常:" + modelResult); } modelResult = (HashMap<String, Object>) modelResult.get("result"); modelResult = (HashMap<String, Object>) modelResult.get(CommonConstant.MDK_RESULT); //打印结果 JSONObject jsonObjResult = new JSONObject(); jsonObjResult.put("result", modelResult); @@ -99,7 +100,7 @@ List<MmItemOutputEntity> ItemOutputList = mmItemOutputService.getByItemid(predictModel.getItemid()); log.info("模型计算完成:modelId=" + modelId + modelResult); Map<MmItemOutputEntity,double[]> predictMatrixs = new HashMap<>(ItemOutputList.size()); Map<MmItemOutputEntity, double[]> predictMatrixs = new HashMap<>(ItemOutputList.size()); for (MmItemOutputEntity outputEntity : ItemOutputList) { String resultStr = outputEntity.getResultstr(); @@ -111,8 +112,8 @@ for (int i = 0; i < temp.length; i++) { temp1[i] = temp[i].doubleValue(); } predictMatrixs.put(outputEntity,temp1); }else if (outputEntity.getResultType() == 2) { predictMatrixs.put(outputEntity, temp1); } else if (outputEntity.getResultType() == 2) { // 二维数组 Double[][] temp = (Double[][]) modelResult.get(resultStr); Double[] temp2 = temp[outputEntity.getResultIndex()]; @@ -120,20 +121,17 @@ for (int i = 0; i < temp2.length; i++) { temp1[i] = temp2[i].doubleValue(); } predictMatrixs.put(outputEntity,temp1); predictMatrixs.put(outputEntity, temp1); } } } result.setPredictMatrixs(predictMatrixs); result.setModelResult(modelResult); result.setPredictTime(predictTime); } catch (Exception ex) { log.error("IAILModel对象构造失败,modelId=" + modelId); log.error("调用发生异常,异常信息为:{}", ex); log.error(ex.getMessage()); log.error("调用发生异常,异常信息为:{}" , ex); ex.printStackTrace(); } return result; } iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/vo/PredictResultVO.java
@@ -35,7 +35,7 @@ /** * 统一预测入口的预测类型(循环调用、手动调用) Map<MmItemOutputEntity,double[]> */ private Map<MmItemOutputEntity,double[]> predictMatrixs; private Map<MmItemOutputEntity, double[]> predictMatrixs; /** * 时间间隔 (当前预测时间 与 上一次预测时间 相差的分钟数;系统计算得出) @@ -53,13 +53,18 @@ private String saveIndex; /** * 粒度 */ private Integer granularity; /** * 预测集合 */ private List<DataValueVO> predictList; /** * 预测集合 */ private HashMap<String,List<DataValueVO>> predictLists; private HashMap<String, List<DataValueVO>> predictLists; /** * 模型结果