package com.iailab.module.model.mdk.schedule.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.iail.IAILMDK; import com.iail.model.IAILModel; import com.iailab.module.model.common.enums.CommonConstant; import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity; import com.iailab.module.model.mcs.sche.entity.StScheduleModelSettingEntity; import com.iailab.module.model.mcs.sche.entity.StScheduleSchemeEntity; import com.iailab.module.model.mcs.sche.service.StScheduleModelService; import com.iailab.module.model.mcs.sche.service.StScheduleModelSettingService; import com.iailab.module.model.mcs.sche.service.StScheduleSchemeService; import com.iailab.module.model.mdk.common.enums.TypeA; import com.iailab.module.model.mdk.common.exceptions.ModelInvokeException; import com.iailab.module.model.mdk.sample.SampleConstructor; import com.iailab.module.model.mdk.sample.dto.SampleData; import com.iailab.module.model.mdk.schedule.ScheduleModelHandler; import com.iailab.module.model.mdk.vo.ScheduleResultVO; import com.iailab.module.model.mpk.common.utils.DllUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.text.MessageFormat; import java.util.*; /** * @author PanZhibao * @Description * @createTime 2024年09月05日 */ @Slf4j @Component public class ScheduleModelHandlerImpl implements ScheduleModelHandler { @Autowired private StScheduleSchemeService stScheduleSchemeService; @Autowired private StScheduleModelService stScheduleModelService; @Autowired private StScheduleModelSettingService stScheduleModelSettingService; @Autowired private SampleConstructor sampleConstructor; @Override public ScheduleResultVO doSchedule(String schemeCode, Date scheduleTime) throws ModelInvokeException { ScheduleResultVO scheduleResult = new ScheduleResultVO(); StScheduleSchemeEntity scheduleScheme = stScheduleSchemeService.getByCode(schemeCode); StScheduleModelEntity scheduleModel = stScheduleModelService.get(scheduleScheme.getModelId()); if (scheduleModel == null) { throw new ModelInvokeException(MessageFormat.format("{0},modelId={1}", ModelInvokeException.errorGetModelEntity, scheduleModel.getId())); } String modelId = scheduleModel.getId(); try { IAILModel newModelBean = new IAILModel(); //1.根据模型id构造模型输入样本 List sampleDataList = sampleConstructor.constructSample(TypeA.Schedule.name(), modelId, scheduleTime); if (CollectionUtils.isEmpty(sampleDataList)) { log.info("调度模型构造样本失败,schemeCode=" + schemeCode); return null; } //2.拼接newModelBean的参数结构:a.类名、方法名 b.参数类型 String className = scheduleModel.getClassName() .trim(); String methodName = scheduleModel.getMethodName().trim(); newModelBean.setClassName(className); newModelBean.setMethodName(methodName); Class[] paramsArray = new Class[3]; paramsArray[0] = double[][].class; paramsArray[1] = double[][].class; paramsArray[2] = HashMap.class; newModelBean.setParamsArray(paramsArray); //3.拼接settings参数 HashMap settings_predict = getPredictSettingsByModelId(modelId); //4.构造param2Values参数结构 int count = sampleDataList.size(); Object[] param2Values = new Object[count + 1]; for (int i = 0; i < count; i++) { param2Values[i] = sampleDataList.get(i).getMatrix(); } param2Values[count] = settings_predict; //打印参数 log.info("##############调度模型:scheduleScheme=" + scheduleScheme.getCode() + " ##########################"); JSONObject jsonObjNewModelBean = new JSONObject(); jsonObjNewModelBean.put("newModelBean", newModelBean); log.info(String.valueOf(jsonObjNewModelBean)); JSONObject jsonObjParam2Values = new JSONObject(); jsonObjParam2Values.put("param2Values", param2Values); log.info(String.valueOf(jsonObjParam2Values)); //运行模型 HashMap modelResult = DllUtils.run(newModelBean, param2Values, scheduleScheme.getMpkprojectid()); 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) modelResult.get(CommonConstant.MDK_RESULT); //打印结果 JSONObject jsonObjResult = new JSONObject(); jsonObjResult.put("result", modelResult); log.info(String.valueOf(jsonObjResult)); //5.返回调度结果 scheduleResult.setResult(modelResult); scheduleResult.setModelId(modelId); scheduleResult.setSchemeId(scheduleScheme.getId()); scheduleResult.setScheduleTime(scheduleTime); } catch (Exception ex) { log.error("IAILMDK.run()执行失败"); log.error(ex.getMessage()); log.error("调用发生异常,异常信息为:{}", ex); ex.printStackTrace(); } return scheduleResult; } /** * 根据模型id获取参数map * * @param modelId * @return */ private HashMap getPredictSettingsByModelId(String modelId) { List list = stScheduleModelSettingService.getByModelId(modelId); if (CollectionUtils.isEmpty(list)) { return null; } HashMap result = new HashMap<>(); for (StScheduleModelSettingEntity entry : list) { String valueType = entry.getValuetype().trim(); String valueStr = entry.getValue().trim(); if ("int".equals(valueType)) { int value = Integer.parseInt(valueStr); result.put(entry.getKey(), value); } else if ("double".equals(valueType)) { double value = Double.parseDouble(valueStr); result.put(entry.getKey(), value); } else if ("string".equals(valueType)) { String value = valueStr; result.put(entry.getKey(), value); } else if ("float".equals(valueType)) { float value = Float.parseFloat(valueStr); result.put(entry.getKey(), value); } else if ("[[D".equals(valueType)) { String valueStrTemp = entry.getValue(); try { //1.二位数组的行按照"/"来分割 String[] rowList = valueStrTemp.split("/"); int row = rowList.length; int col = rowList[0].split(",").length; double[][] value1 = new double[row][col]; for (int i = 0; i < rowList.length; i++) { //2.二位数组的列按照","来分割 String[] colList = rowList[i].split(","); for (int j = 0; j < colList.length; j++) { value1[i][j] = Double.parseDouble(colList[j]); } } //把从数据库的得到的参数的二维数组降为一维数组 //int len =0; double[] value = new double[row * col]; /*for (int j = 0; j