package com.iailab.module.model.mpk.controller.admin; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants; import com.iailab.framework.common.pojo.CommonResult; import com.iailab.module.model.mpk.common.MdkConstant; import com.iailab.module.model.mpk.common.utils.DllUtils; import com.iailab.module.model.mpk.common.utils.Readtxt; import com.iailab.module.model.mpk.dto.MdkDTO; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static com.iailab.framework.common.pojo.CommonResult.error; import static com.iailab.framework.common.pojo.CommonResult.success; /** * @author PanZhibao * @Description * @createTime 2024年08月08日 */ @RestController @Slf4j @RequestMapping("/model/mpk/api") public class MdkController { @Value("${mpk.bak-file-path}") private String mpkBakFilePath; @PostMapping("run") public CommonResult run(@RequestBody MdkDTO dto) { Class clazz; URLClassLoader classLoader; try { File jarFile = new File(mpkBakFilePath + File.separator + MdkConstant.JAR + File.separator + dto.getPyName() + ".jar"); if (!jarFile.exists()) { throw new RuntimeException("jar包不存在,请先生成代码。jarPath:" + jarFile.getAbsolutePath()); } File dllFile = new File(mpkBakFilePath + File.separator + MdkConstant.DLL + File.separator + dto.getPyName() + ".dll"); if (!dllFile.exists()) { throw new RuntimeException("dll文件不存在,请先生成代码。dllPath:" + dllFile.getAbsolutePath()); } // 加载jar包 classLoader = DllUtils.loadJar(jarFile.getAbsolutePath()); // 实现类 clazz = classLoader.loadClass(dto.getClassName()); // 加载dll到实现类 DllUtils.loadDll(clazz,dllFile.getAbsolutePath()); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("加载运行环境失败。"); } System.out.println("runTime=" + System.currentTimeMillis()); try { List datas = dto.getDatas(); int paramLength = dto.getHasModel() ? datas.size() + 2 : datas.size() + 1; Object[] paramsValueArray = new Object[paramLength]; Class[] paramsArray = new Class[paramLength]; try { for (int i = 0; i < datas.size(); i++) { String json = datas.get(i); JSONArray jsonArray = JSON.parseArray(json); double[][] data = new double[jsonArray.size()][jsonArray.getJSONArray(0).size()]; for (int j = 0; j < jsonArray.size(); j++) { for (int k = 0; k < jsonArray.getJSONArray(j).size(); k++) { data[j][k] = jsonArray.getJSONArray(j).getDoubleValue(k); } } paramsValueArray[i] = data; paramsArray[i] = double[][].class; } } catch (Exception e) { e.printStackTrace(); return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"参数错误,请检查!"); } if (dto.getHasModel()) { paramsValueArray[datas.size()] = dto.getModel(); paramsValueArray[datas.size() + 1] = dto.getModelSettings(); paramsArray[datas.size()] = HashMap.class; paramsArray[datas.size() + 1] = HashMap.class; }else { paramsValueArray[datas.size()] = dto.getModelSettings(); paramsArray[datas.size()] = HashMap.class; } HashMap result = (HashMap) clazz.getDeclaredMethod(dto.getMethodName(), paramsArray).invoke(clazz.newInstance(), paramsValueArray); return success(JSON.toJSONString(result)); } catch (Exception ex) { ex.printStackTrace(); return error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"运行异常"); } finally { if (classLoader != null) { DllUtils.unloadDll(classLoader); DllUtils.unloadJar(classLoader); } System.gc(); } } @PostMapping("/import") @Operation(summary = "导入参数") public CommonResult> importExcel(@RequestParam("file") MultipartFile file) throws Exception { List datas = Readtxt.readMethodExcel(file); List result = new ArrayList<>(); if (!CollectionUtils.isEmpty(datas)) { for (double[][] data : datas) { if (data.length > 0) { result.add(JSON.toJSONString(data)); } } } return success(result); } }