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.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 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<SampleData> 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<String, Object> 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("##############调度模型:modelId=" + modelId + " ##########################"); 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)); //IAILMDK.run HashMap<String, Object> result = IAILMDK.run(newModelBean, param2Values); //打å°ç»“æžœ JSONObject jsonObjResult = new JSONObject(); jsonObjResult.put("result", result); log.info(String.valueOf(jsonObjResult)); log.info("调度模型计算完æˆï¼šmodelId=" + modelId + result); //5.返回调度结果 scheduleResult.setResult(result); 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<String, Object> getPredictSettingsByModelId(String modelId) { List<StScheduleModelSettingEntity> list = stScheduleModelSettingService.getByModelId(modelId); if (CollectionUtils.isEmpty(list)) { return null; } HashMap<String, Object> 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 <value1.length ; j++) { len+= value1.length; }*/ //value = new double[len]; int index = 0; for (int i = 0; i < value1.length; i++) { for (int j = 0; j < value1[i].length; j++) { value[index++] = value1[i][j]; } } result.put(entry.getKey(), value); } catch (Exception ex) { System.out.println("二维数组类型的settingæ ¼å¼ä¸æ£ç¡®"); ex.printStackTrace(); } } else if ("decimalArray".equals(valueType)) { JSONArray valueArray = JSONArray.parseArray(entry.getValue()); double[] value = new double[valueArray.size()]; for (int i = 0; i < valueArray.size(); i++) { value[i] = Double.parseDouble(valueArray.get(i).toString()); } result.put(entry.getKey(), value); } else if ("decimal".equals(valueType)) { double value = Double.parseDouble(entry.getValue()); //BigDecimal value = new BigDecimal(entry.getValue()); result.put(entry.getKey(), value); } } return result; } }