From 3e61b6d86d6a98214e56c652a36a2290d471a695 Mon Sep 17 00:00:00 2001
From: dengzedong <dengzedong@email>
Date: 星期四, 27 二月 2025 16:03:08 +0800
Subject: [PATCH] matlab模型管理 matlab项目管理

---
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/package-info.java                      |    1 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileInfoDTO.java                     |   16 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectDao.java                             |   16 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodSettingService.java          |   18 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/utils/MatlabUtils.java                     |  405 +++++++++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java                 |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelEntity.java                         |   73 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectModelDTO.java                        |   24 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlModelController.java           |  113 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectModelServiceImpl.java       |   70 +
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlModelDao.xml                                                |  120 +++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectDTO.java                             |   32 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectModelEntity.java                  |   27 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectModelService.java                |   25 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodSettingServiceImpl.java |   25 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodSettingDao.java                  |   18 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileClassInfoDTO.java                |   13 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodEntity.java                   |   46 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlProjectController.java         |   93 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectModelDao.java                        |   23 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectService.java                     |   34 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelDao.java                               |   30 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodService.java                 |   20 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodDao.java                         |   18 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectEntity.java                       |   37 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/exceptions/IllegalityJarException.java     |   22 
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlProjectModelDao.xml                                         |   14 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabRunDTO.java                             |   28 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelService.java                       |   44 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelDTO.java                               |   46 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodSettingEntity.java            |   46 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectServiceImpl.java            |  192 +++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileMethodInfoDTO.java               |   13 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodSettingDTO.java                  |   32 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/MatlabConstant.java                        |   13 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodServiceImpl.java        |   60 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodDTO.java                         |   34 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelServiceImpl.java              |  287 +++++++
 38 files changed, 2,129 insertions(+), 1 deletions(-)

diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/MatlabConstant.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/MatlabConstant.java
new file mode 100644
index 0000000..21c11fa
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/MatlabConstant.java
@@ -0,0 +1,13 @@
+package com.iailab.module.model.matlab.common;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/2/14 10:59
+ **/
+public interface MatlabConstant {
+    /**
+     * JNI
+     */
+    String JNI = "JNI";
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/exceptions/IllegalityJarException.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/exceptions/IllegalityJarException.java
new file mode 100644
index 0000000..6d727f1
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/exceptions/IllegalityJarException.java
@@ -0,0 +1,22 @@
+package com.iailab.module.model.matlab.common.exceptions;
+
+/**
+ * @description: 非法jar包异常
+ * @author: dzd
+ * @date: 2025/2/26 17:52
+ **/
+public class IllegalityJarException extends Exception {
+    private Throwable cause;
+
+    public IllegalityJarException() {
+    }
+
+    public IllegalityJarException(String msg) {
+        super(msg);
+    }
+
+    public IllegalityJarException(String msg, Exception cause) {
+        super(msg, cause);
+        this.cause = cause;
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/utils/MatlabUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/utils/MatlabUtils.java
new file mode 100644
index 0000000..13281e3
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/common/utils/MatlabUtils.java
@@ -0,0 +1,405 @@
+package com.iailab.module.model.matlab.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.iail.model.IAILModel;
+import com.iailab.module.model.matlab.common.exceptions.IllegalityJarException;
+import com.iailab.module.model.matlab.dto.MatlabJarFileClassInfoDTO;
+import com.iailab.module.model.matlab.dto.MatlabJarFileMethodInfoDTO;
+import com.iailab.module.model.matlab.dto.MlModelMethodSettingDTO;
+import com.iailab.module.model.mpk.common.MdkConstant;
+import com.mathworks.toolbox.javabuilder.*;
+import com.mathworks.toolbox.javabuilder.internal.MWFunctionSignature;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.*;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class MatlabUtils {
+
+    private static HashMap<String, URLClassLoader> classLoaderCache = new HashMap<>();
+    private static HashMap<String, Object> classCache = new HashMap<>();
+    private static HashMap<String, Method> classMethodCache = new HashMap<>();
+
+    /**
+     * @description: 解析matlab jar文件
+     **/
+    public static List<MatlabJarFileClassInfoDTO> parseJarInfo(String jarFilePath, String jatName) throws IllegalityJarException {
+        List<MatlabJarFileClassInfoDTO> classInfos = new ArrayList<>();
+        //加载jar用于解析内部class method
+        URLClassLoader urlClassLoader = loadJar(null,jarFilePath);
+        try (JarFile jarFile = new JarFile(jarFilePath)) {
+            // 获取 JAR 文件中所有的条目
+            Enumeration<JarEntry> entries = jarFile.entries();
+            while (entries.hasMoreElements()) {
+                JarEntry entry = entries.nextElement();
+                String entryName = entry.getName();
+                // 检查条目是否为类文件
+                if (entryName.endsWith(".class") && !entryName.endsWith("Remote.class") && !entryName.endsWith("MCRFactory.class")) {
+                    MatlabJarFileClassInfoDTO classInfo = new MatlabJarFileClassInfoDTO();
+                    // 将类文件的路径转换为类的全限定名
+                    String className = entryName.replace('/', '.').substring(0, entryName.lastIndexOf(".class"));
+                    // 校验包名是否和文件名一致,不一致则说明修改过jar包名,判定为非法包
+                    if (!className.startsWith(jatName)) {
+                        throw new IllegalityJarException();
+                    }
+
+                    classInfo.setClassName(className);
+                    try {
+                        // 加载类
+                        Class<?> clazz = urlClassLoader.loadClass(className);
+                        // 获取该类的所有属性
+                        Field[] fields = clazz.getDeclaredFields();
+                        List<MatlabJarFileMethodInfoDTO> methodInfos = new ArrayList<>();
+                        for (Field field : fields) {
+                            int modifiers = field.getModifiers();
+                            if (Modifier.isPrivate(modifiers) && Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
+                                try {
+                                    // 绕过访问控制检查
+                                    field.setAccessible(true);
+                                    Object value = field.get(null); // 静态字段不需要实例,传 null
+                                    if (value instanceof MWFunctionSignature) {
+                                        MatlabJarFileMethodInfoDTO methodInfo = new MatlabJarFileMethodInfoDTO();
+                                        methodInfo.setMethodName(value.getClass().getField("name").get(value).toString());
+                                        // 减1是为了排除最后面的setting
+                                        methodInfo.setDataLength((Integer) value.getClass().getField("numInputs").get(value) - 1);
+                                        methodInfo.setOutLength((Integer) value.getClass().getField("numOutputs").get(value));
+                                        methodInfos.add(methodInfo);
+                                    }
+                                } catch (Exception e) {
+                                    log.error("get matlab method info exception,className:" + className, e);
+                                }
+                            }
+                        }
+                        classInfo.setMethodInfos(methodInfos);
+                    } catch (Exception e) {
+                        log.error("get matlab class info exception,className:" + className, e);
+                    }
+                    classInfos.add(classInfo);
+                }
+            }
+        } catch (IOException e) {
+            log.error("get matlab jar info exception,jarFilePath:" + jarFilePath, e);
+        } finally {
+            unloadJar(urlClassLoader);
+        }
+        return classInfos;
+    }
+
+    public static synchronized URLClassLoader loadJar(String projectId, String... jarPaths) {
+        try {
+            URL[] urls = new URL[jarPaths.length];
+            for (int i = 0; i < jarPaths.length; i++) {
+                String jarPath = jarPaths[i];
+                File jarFile = new File(jarPath);
+                if (!jarFile.exists()) {
+                    throw new RuntimeException("jar沒有找到!" + jarPath);
+                }
+                urls[i] = new File(jarPath).toURI().toURL();
+            }
+
+            // 不能设置classloader的patent,让它使用双亲委派去找系统classloader中javabuilder.jar中的依赖。因为javabuilder.jar只能加载一次,加载多次会报资源占用
+            URLClassLoader urlClassLoader = new URLClassLoader(urls);
+            if (projectId != null) {
+                addClassLoaderCache(projectId, urlClassLoader);
+            }
+            log.info("成功加载jar包:" + String.join(";",jarPaths));
+            return urlClassLoader;
+        } catch (Exception e) {
+            throw new RuntimeException("加载jar异常", e);
+        }
+    }
+
+    public static synchronized void unloadJar(URLClassLoader urlClassLoader) {
+        try {
+            urlClassLoader.close();
+            log.info("成功卸载jar包。");
+        } catch (Exception e) {
+            throw new RuntimeException("卸载jar异常", e);
+        }
+    }
+
+    public static synchronized void addClassLoaderCache(String projectId, URLClassLoader urlClassLoader) {
+        classLoaderCache.put(projectId, urlClassLoader);
+    }
+
+    public static synchronized URLClassLoader getClassLoader(String projectId) {
+        return classLoaderCache.get(projectId);
+    }
+
+    public static synchronized void removeClassLoaderCache(String projectId) {
+        if (classLoaderCache.containsKey(projectId)) {
+            URLClassLoader urlClassLoader = classLoaderCache.get(projectId);
+            unloadJar(urlClassLoader);
+            classLoaderCache.remove(projectId);
+            removeClassCache(projectId);
+            removeClassMethodCache(projectId);
+        }
+    }
+
+    public static synchronized void removeClassCache(String projectId) {
+        Iterator<String> iterator = classCache.keySet().iterator();
+        while (iterator.hasNext()) {
+            String key = iterator.next();
+            if (key.startsWith(projectId)) {
+                iterator.remove();
+            }
+        }
+    }
+
+    public static synchronized void removeClassMethodCache(String projectId) {
+        Iterator<String> iterator = classMethodCache.keySet().iterator();
+        while (iterator.hasNext()) {
+            String key = iterator.next();
+            if (key.startsWith(projectId)) {
+                iterator.remove();
+            }
+        }
+    }
+
+    public static void removeOldFile(String bakPath, String projectId) {
+        File dir = new File(bakPath);
+        if (dir.exists() && dir.isDirectory()) {
+            File[] files = dir.listFiles();
+            if (null != files && files.length > 0) {
+                for (File file : files) {
+                    if (file.getName().startsWith(projectId)) {
+                        file.delete();
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @description: 项目启动加载已发布的dll和jar
+     * @author: dzd
+     * @date: 2024/10/10 11:58
+     **/
+    public static void loadProjectPublish(String bakPath) {
+        File dir = new File(bakPath);
+        if (dir.exists() && dir.isDirectory()) {
+            File[] files = dir.listFiles();
+            if (null != files && files.length > 0) {
+                for (File file : files) {
+                    String fileName = file.getName();
+                    if (fileName.endsWith(".jar")) {
+                        String[] split = fileName.split(MdkConstant.SPLIT);
+                        String projectId = split[0];
+
+                        URLClassLoader urlClassLoader = null;
+                        try {
+                            // 加载新的jar
+                            urlClassLoader = loadJar(projectId,file.getAbsolutePath());
+                        } catch (Exception e) {
+                            throw new RuntimeException("加载jar异常", e);
+                        }
+                        // 成功后加入缓存
+                        addClassLoaderCache(projectId, urlClassLoader);
+                    }
+                }
+            }
+        }
+
+    }
+
+    public static HashMap<String, Object> run(IAILModel model, Object[] paramsValueArray, String projectId) throws Exception {
+        if (model == null) {
+            throw new RuntimeException("模型文件不能为空!");
+        } else {
+            // 上传时校验文件名和class的开头是相同的,保证className唯一,可以用 projectId_className 作为唯一key
+            String classCacheKey = projectId + "_" + model.getClassName();
+            String methodParams = Arrays.stream(model.getParamsArray()).map(e -> e.getName()).collect(Collectors.joining(","));
+            String classMethodCacheKey = classCacheKey + "." + model.getMethodName() + "(" + methodParams + ")";
+            // 因为一个类下可能有多多个方法,所以这里classCacheKey 和 classMethodCacheKey 要分开判断
+            if (classCache.containsKey(classCacheKey)) {
+                if (classMethodCache.containsKey(classMethodCacheKey)) {
+                    return (HashMap) classMethodCache.get(classMethodCacheKey).invoke(classCache.get(classCacheKey), paramsValueArray);
+                } else {
+                    // 运行过这个类的其他方法,类从缓存中取,新建方法
+                    Object o = classCache.get(classCacheKey);
+                    Class<?>[] paramsArray = new Class[2];
+                    paramsArray[0] = int.class;
+                    paramsArray[1] = Object[].class;
+                    Method method = o.getClass().getMethod(model.getMethodName(), paramsArray);
+                    classMethodCache.put(classMethodCacheKey, method);
+                    Object[] objects = (Object[]) method.invoke(o, paramsValueArray);
+                    HashMap<String, Object> map = convertStructToMap((MWStructArray) objects[0]);
+                    return map;
+                }
+
+            } else {
+                URLClassLoader classLoader = getClassLoader(projectId);
+                if (null == classLoader) {
+                    throw new RuntimeException("matlab未发布,classLoader为null");
+                }
+                Class<?> clazz = classLoader.loadClass(model.getClassName());
+                Object o = clazz.newInstance();
+                Class<?>[] paramsArray = new Class[2];
+                paramsArray[0] = int.class;
+                paramsArray[1] = Object[].class;
+                Method method = clazz.getMethod(model.getMethodName(), paramsArray);
+                classCache.put(classCacheKey, o);
+                classMethodCache.put(classMethodCacheKey, method);
+                Object[] objects = (Object[]) method.invoke(o, paramsValueArray);
+                HashMap<String, Object> map = convertStructToMap((MWStructArray) objects[0]);
+                return map;
+            }
+        }
+    }
+
+    public static HashMap<String, Object> convertStructToMap(MWStructArray struct) {
+        HashMap<String, Object> map;
+        try {
+            map = new HashMap<>();
+            String[] fieldNames = struct.fieldNames();
+            int numElements = struct.numberOfElements();
+            for (int i = 1; i <= numElements; i++) {
+                for (String fieldName : fieldNames) {
+                    MWArray value = struct.getField(fieldName, i);
+                    Object javaValue = convertMWArrayToJavaObject(value);
+                    map.put(fieldName, javaValue);
+                }
+            }
+        } finally {
+            struct.dispose();
+        }
+        return map;
+    }
+
+    private static Object convertMWArrayToJavaObject(MWArray mwArray) {
+        try {
+            if (mwArray instanceof MWNumericArray) {
+                MWNumericArray numArray = (MWNumericArray) mwArray;
+                if (numArray.numberOfElements() == 1) {
+                    MWClassID mwClassID = numArray.classID();
+                    if (mwClassID.equals(MWClassID.DOUBLE)) {
+                        return numArray.getDouble();
+                    } else if (mwClassID.equals(MWClassID.SINGLE)) {
+                        return numArray.getFloat();
+                    } else if (mwClassID.equals(MWClassID.INT8) || mwClassID.equals(MWClassID.UINT8)) {
+                        return numArray.getByte();
+                    } else if (mwClassID.equals(MWClassID.INT16) || mwClassID.equals(MWClassID.UINT16)) {
+                        return numArray.getShort();
+                    } else if (mwClassID.equals(MWClassID.INT32) || mwClassID.equals(MWClassID.UINT32)) {
+                        return numArray.getInt();
+                    } else if (mwClassID.equals(MWClassID.INT64) || mwClassID.equals(MWClassID.UINT64)) {
+                        return numArray.getLong();
+                    } else if (mwClassID.equals(MWClassID.LOGICAL)) {
+                        return numArray.getByte();
+                    }
+                    return null;
+                } else {
+                    MWClassID mwClassID = numArray.classID();
+                    if (mwClassID.equals(MWClassID.DOUBLE)) {
+                        return numArray.toDoubleArray();
+                    } else if (mwClassID.equals(MWClassID.SINGLE)) {
+                        return numArray.toFloatArray();
+                    } else if (mwClassID.equals(MWClassID.INT8)) {
+                        return numArray.toByteArray();
+                    } else if (mwClassID.equals(MWClassID.INT16) || mwClassID.equals(MWClassID.UINT16)) {
+                        return numArray.toShortArray();
+                    } else if (mwClassID.equals(MWClassID.INT32) || mwClassID.equals(MWClassID.UINT32)) {
+                        return numArray.toIntArray();
+                    } else if (mwClassID.equals(MWClassID.INT64) || mwClassID.equals(MWClassID.UINT64)) {
+                        return numArray.toLongArray();
+                    } else if (mwClassID.equals(MWClassID.LOGICAL)) {
+                        return numArray.toByteArray();
+                    }
+                    return null;
+                }
+            } else if (mwArray instanceof MWCharArray) {
+                MWCharArray stringArray = (MWCharArray) mwArray;
+                if (stringArray.numberOfElements() == 1) {
+                    return stringArray.getChar(1);
+                } else {
+                    // 不支持string,string都是用char[]返回,所以这里将char[]转为string
+                    int[] dimensions = stringArray.getDimensions();
+                    if (dimensions[0] == 1) {
+                        //string
+                        return stringArray.toString();
+                    } else {
+                        //String[] 暂时只考虑一维string
+                        char[][] array = (char[][]) stringArray.toArray();
+                        String[] list = new String[dimensions[0]];
+                        for (int i = 0; i < dimensions[0]; i++) {
+                            list[i] = (String.valueOf(array[i]));
+                        }
+                        return list;
+                    }
+                }
+            } else if (mwArray instanceof MWLogicalArray) {
+                MWLogicalArray logicalArray = (MWLogicalArray) mwArray;
+                if (logicalArray.numberOfElements() == 1) {
+                    return logicalArray.getBoolean(1);
+                } else {
+                    int[] dimensions = logicalArray.getDimensions();
+                    return logicalArray.toArray();
+                }
+            } else if (mwArray instanceof MWStructArray) {
+                MWStructArray structArray = (MWStructArray) mwArray;
+                return convertStructToMap(structArray);
+            }
+        } finally {
+            mwArray.dispose();
+        }
+        return null;
+    }
+
+    public static HashMap<String, Object> handleModelSettings(List<MlModelMethodSettingDTO> modelSettings) {
+        HashMap<String, Object> resultMap = null;
+        try {
+            resultMap = new HashMap<>(modelSettings.size());
+            for (MlModelMethodSettingDTO modelSetting : modelSettings) {
+                switch (modelSetting.getValueType()) {
+                    case "int":
+                        resultMap.put(modelSetting.getSettingKey(), Integer.valueOf(modelSetting.getSettingValue()));
+                        break;
+                    case "string":
+                        resultMap.put(modelSetting.getSettingKey(), modelSetting.getSettingValue());
+                        break;
+                    case "decimal":
+                        resultMap.put(modelSetting.getSettingKey(), Double.valueOf(modelSetting.getSettingValue()));
+                        break;
+                    case "decimalArray":
+                        JSONArray jsonArray = JSON.parseArray(modelSetting.getSettingValue());
+                        double[] doubles = new double[jsonArray.size()];
+                        for (int i = 0; i < jsonArray.size(); i++) {
+                            doubles[i] = Double.valueOf(String.valueOf(jsonArray.get(i)));
+                        }
+                        resultMap.put(modelSetting.getSettingKey(), doubles);
+                        break;
+                }
+            }
+        } catch (NumberFormatException e) {
+            throw new RuntimeException("模型参数有误,请检查!!!");
+        }
+        return resultMap;
+    }
+
+    public static MWStructArray convertMapToStruct(Map<String, Object> map) {
+        String[] fieldNames = map.keySet().toArray(new String[0]);
+        MWStructArray struct = new MWStructArray(1, 1, fieldNames);
+        for (String key : map.keySet()) {
+            Object value = map.get(key);
+            if (value instanceof Number) {
+                struct.set(key, 1, ((Number) value).doubleValue());
+            } else if (value instanceof String) {
+                struct.set(key, 1, value);
+            }
+            // 可以根据需要添加更多类型的处理
+        }
+        return struct;
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlModelController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlModelController.java
new file mode 100644
index 0000000..ab73a82
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlModelController.java
@@ -0,0 +1,113 @@
+package com.iailab.module.model.matlab.controller.admin;
+
+import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants;
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.module.model.matlab.common.exceptions.IllegalityJarException;
+import com.iailab.module.model.matlab.dto.MatlabJarFileInfoDTO;
+import com.iailab.module.model.matlab.dto.MatlabRunDTO;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.service.MlModelService;
+import com.iailab.module.model.mpk.dto.MpkFileDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+
+/**
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@RestController
+@RequestMapping("/model/matlab/model")
+public class MlModelController {
+    @Autowired
+    private MlModelService mlModelService;
+
+    @GetMapping("page")
+    @Operation(summary = "分页")
+    @PreAuthorize("@ss.hasPermission('ml:model:query')")
+    public CommonResult<PageData<MlModelDTO>> page(@RequestParam Map<String, Object> params) {
+        PageData<MlModelDTO> page = mlModelService.page(params);
+        return success(page);
+    }
+
+    @GetMapping("{id}")
+    @Operation(summary = "信息")
+    @PreAuthorize("@ss.hasPermission('ml:model:query')")
+    public CommonResult<MlModelDTO> get(@PathVariable("id") String id){
+        MlModelDTO data = mlModelService.get(id);
+
+        return success(data);
+    }
+
+    @PreAuthorize("@ss.hasPermission('ml:model:query')")
+    @GetMapping("list")
+    public CommonResult<List<MlModelDTO>> list(@RequestParam Map<String, Object> params) {
+        List<MlModelDTO> list = mlModelService.list(params);
+
+        return success(list);
+    }
+
+    @PostMapping
+    @Operation(summary = "保存")
+    @PreAuthorize("@ss.hasPermission('ml:model:create')")
+    public CommonResult save(@RequestBody MlModelDTO dto){
+        mlModelService.save(dto);
+
+        return success();
+    }
+
+    @PutMapping
+    @Operation(summary = "修改")
+    @PreAuthorize("@ss.hasPermission('ml:model:update')")
+    public CommonResult update(@RequestBody MlModelDTO dto){
+        mlModelService.update(dto);
+
+        return success();
+    }
+
+    @DeleteMapping
+    @Operation(summary = "删除")
+    @PreAuthorize("@ss.hasPermission('ml:model:delete')")
+    public CommonResult delete(String id){
+
+        mlModelService.delete(id);
+
+        return success();
+    }
+
+    @PostMapping("/upload")
+    @Operation(summary = "算法封装jar文件上传")
+    public CommonResult<MatlabJarFileInfoDTO> upload(@RequestParam("file") MultipartFile file){
+        MatlabJarFileInfoDTO result = null;
+        try {
+            result = mlModelService.uploadJarFile(file);
+        } catch (IllegalityJarException e) {
+            return CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"非法jar包");
+        }
+        return success(result);
+    }
+
+    @PostMapping("/test")
+    @Operation(summary = "Matlab测试运行")
+    public CommonResult<String> test(@RequestBody MatlabRunDTO dto) {
+        return mlModelService.test(dto);
+    }
+
+    @PostMapping("/importData")
+    @Operation(summary = "导入参数")
+    public CommonResult<List<HashMap<String,Object>>> importData(@RequestParam("file") MultipartFile file) throws Exception {
+        List<HashMap<String,Object>> result = mlModelService.importData(file);
+        return success(result);
+    }
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlProjectController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlProjectController.java
new file mode 100644
index 0000000..bf9545c
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/admin/MlProjectController.java
@@ -0,0 +1,93 @@
+package com.iailab.module.model.matlab.controller.admin;
+
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.dto.MlProjectDTO;
+import com.iailab.module.model.matlab.service.MlProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2024/8/22 14:40
+ **/
+@RestController
+@RequestMapping("/model/matlab/project")
+public class MlProjectController {
+    @Autowired
+    private MlProjectService mlProjectService;
+
+    @PreAuthorize("@ss.hasPermission('matlab:project:query')")
+    @GetMapping("page")
+    public CommonResult<PageData<MlProjectDTO>> page(@RequestParam Map<String, Object> params){
+        PageData<MlProjectDTO> page = mlProjectService.page(params);
+
+        return success(page);
+    }
+
+    @PreAuthorize("@ss.hasPermission('matlab:project:query')")
+    @GetMapping("list")
+    public CommonResult<List<MlProjectDTO>> list() {
+        List<MlProjectDTO> list = mlProjectService.list(new HashMap<>());
+
+        return success(list);
+    }
+
+    @PreAuthorize("@ss.hasPermission('matlab:project:query')")
+    @GetMapping("{id}")
+    public CommonResult<MlProjectDTO> get(@PathVariable("id") String id){
+        MlProjectDTO data = mlProjectService.get(id);
+
+        return success(data);
+    }
+
+    @PreAuthorize("@ss.hasPermission('matlab:project:create')")
+    @PostMapping
+    public CommonResult<Boolean> save(@RequestBody MlProjectDTO dto){
+        mlProjectService.save(dto);
+
+        return CommonResult.success(true);
+    }
+
+    @PreAuthorize("@ss.hasPermission('matlab:project:update')")
+    @PutMapping
+    public CommonResult<Boolean> update(@RequestBody MlProjectDTO dto){
+        dto.setUpdateTime(new Date());
+        mlProjectService.update(dto);
+
+        return CommonResult.success(true);
+    }
+
+    @PreAuthorize("@ss.hasPermission('matlab:project:delete')")
+    @DeleteMapping
+    public CommonResult<Boolean> delete(String id){
+
+        mlProjectService.delete(id);
+
+        return CommonResult.success(true);
+    }
+
+    @GetMapping("getProjectModel")
+    public CommonResult<PageData<MlModelDTO>> getProjectModel(@RequestParam Map<String, Object> params){
+        PageData<MlModelDTO> page = mlProjectService.getProjectModel(params);
+
+        return CommonResult.success(page);
+    }
+
+    @PostMapping("/publish")
+    public CommonResult<String> publish(@RequestBody Map<String, Object> params) {
+        return mlProjectService.publish(params);
+    }
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/package-info.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/package-info.java
new file mode 100644
index 0000000..b3a3ac8
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/controller/package-info.java
@@ -0,0 +1 @@
+package com.iailab.module.model.matlab.controller;
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelDao.java
new file mode 100644
index 0000000..f21f632
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelDao.java
@@ -0,0 +1,30 @@
+package com.iailab.module.model.matlab.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.entity.MlModelEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@TenantDS
+@Mapper
+public interface MlModelDao extends BaseDao<MlModelEntity> {
+
+    List<MlModelDTO> list(Map<String, Object> params);
+
+    MlModelDTO get(String id);
+
+    int getProjectModelCount(String projectId);
+
+    List<MlModelDTO> getProjectModel(@Param("params") Map<String, Object> params);
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodDao.java
new file mode 100644
index 0000000..3e2b868
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodDao.java
@@ -0,0 +1,18 @@
+package com.iailab.module.model.matlab.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.model.matlab.entity.MlModelMethodEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@TenantDS
+@Mapper
+public interface MlModelMethodDao extends BaseDao<MlModelMethodEntity> {
+	
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodSettingDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodSettingDao.java
new file mode 100644
index 0000000..8b1e920
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlModelMethodSettingDao.java
@@ -0,0 +1,18 @@
+package com.iailab.module.model.matlab.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.model.matlab.entity.MlModelMethodSettingEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@TenantDS
+@Mapper
+public interface MlModelMethodSettingDao extends BaseDao<MlModelMethodSettingEntity> {
+	
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectDao.java
new file mode 100644
index 0000000..c3369f1
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectDao.java
@@ -0,0 +1,16 @@
+package com.iailab.module.model.matlab.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.model.matlab.entity.MlProjectEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/2/25 14:11
+ **/
+@TenantDS
+@Mapper
+public interface MlProjectDao extends BaseDao<MlProjectEntity> {
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectModelDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectModelDao.java
new file mode 100644
index 0000000..a6ca000
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dao/MlProjectModelDao.java
@@ -0,0 +1,23 @@
+package com.iailab.module.model.matlab.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.entity.MlProjectModelEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/2/25 14:10
+ **/
+@TenantDS
+@Mapper
+public interface MlProjectModelDao extends BaseDao<MlProjectModelEntity> {
+
+    List<MlModelDTO> getProjectModel(@Param("params") Map<String, Object> params);
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileClassInfoDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileClassInfoDTO.java
new file mode 100644
index 0000000..26105ab
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileClassInfoDTO.java
@@ -0,0 +1,13 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MatlabJarFileClassInfoDTO {
+
+    private String className;
+
+    private List<MatlabJarFileMethodInfoDTO> methodInfos;
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileInfoDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileInfoDTO.java
new file mode 100644
index 0000000..85ed1cb
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileInfoDTO.java
@@ -0,0 +1,16 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.List;
+
+@Data
+public class MatlabJarFileInfoDTO {
+
+    private String fileName;
+
+    private String filePath;
+
+    private List<MatlabJarFileClassInfoDTO> classInfos;
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileMethodInfoDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileMethodInfoDTO.java
new file mode 100644
index 0000000..a5a84ee
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabJarFileMethodInfoDTO.java
@@ -0,0 +1,13 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+@Data
+public class MatlabJarFileMethodInfoDTO {
+
+    private String methodName;
+
+    private Integer dataLength;
+
+    private Integer outLength;
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabRunDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabRunDTO.java
new file mode 100644
index 0000000..4695ad1
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MatlabRunDTO.java
@@ -0,0 +1,28 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/2/24 15:59
+ **/
+@Data
+public class MatlabRunDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String modelFileName;
+
+    private String className;
+
+    private String methodName;
+
+    private Integer outLength;
+
+    private List<MlModelMethodSettingDTO> modelSettings;
+
+    private List<String> uuids;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelDTO.java
new file mode 100644
index 0000000..e22a9ca
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelDTO.java
@@ -0,0 +1,46 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Data
+public class MlModelDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	private String id;
+
+	private String modelName;
+
+	private String modelFileName;
+
+	private String modelFilePath;
+
+	private String modelType;
+
+	private String matlabPlatform;
+
+	private String matlabVersion;
+
+	private String remark;
+
+	private Long updater;
+
+	private Date updateDate;
+
+	private Long  creator;
+
+	private Date createDate;
+
+	private List<MlModelMethodDTO> modelMethods;
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodDTO.java
new file mode 100644
index 0000000..2cbe8f6
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodDTO.java
@@ -0,0 +1,34 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Data
+public class MlModelMethodDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	private String id;
+
+	private String mlModelId;
+
+	private String className;
+
+	private String methodName;
+
+	private Integer dataLength;
+
+	private Integer outLength;
+
+	private Integer sort;
+
+	private List<MlModelMethodSettingDTO> methodSettings;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodSettingDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodSettingDTO.java
new file mode 100644
index 0000000..85a2012
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlModelMethodSettingDTO.java
@@ -0,0 +1,32 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Data
+public class MlModelMethodSettingDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	private String id;
+
+	private String mlModelMethodId;
+
+	private String name;
+
+	private String settingKey;
+
+	private String settingValue;
+
+	private String valueType;
+
+	private String sort;
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectDTO.java
new file mode 100644
index 0000000..77cef43
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectDTO.java
@@ -0,0 +1,32 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @description: 项目表
+ * @author: dzd
+ * @date: 2024/8/22 14:41
+ **/
+@Data
+public class MlProjectDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	private String id;
+
+	private String projectName;
+
+	private String projectCode;
+
+	private Date createTime;
+
+	private Date updateTime;
+
+	private List<MlModelDTO> models;
+
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectModelDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectModelDTO.java
new file mode 100644
index 0000000..2456247
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/dto/MlProjectModelDTO.java
@@ -0,0 +1,24 @@
+package com.iailab.module.model.matlab.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/2/25 14:39
+ **/
+@Data
+public class MlProjectModelDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	private String id;
+
+	private String projectId;
+
+	private String modelId;
+
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelEntity.java
new file mode 100644
index 0000000..a280cb6
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelEntity.java
@@ -0,0 +1,73 @@
+package com.iailab.module.model.matlab.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Data
+@TableName("t_ml_model")
+public class MlModelEntity {
+
+    /**
+     * 
+     */
+	private String id;
+    /**
+     * 模型名称
+     */
+	private String modelName;
+    /**
+     * 模型文件名
+     */
+	private String modelFileName;
+    /**
+     * 模型文件路径
+     */
+	private String modelFilePath;
+    /**
+     * 模型类型
+     */
+	private String modelType;
+    /**
+     * matlab平台
+     */
+	private String matlabPlatform;
+    /**
+     * matlab版本
+     */
+	private String matlabVersion;
+    /**
+     * 备注
+     */
+	private String remark;
+    /**
+     * 更新者
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updater;
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateDate;
+
+    /**
+     * 创建者
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long  creator;
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodEntity.java
new file mode 100644
index 0000000..7bf16e1
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodEntity.java
@@ -0,0 +1,46 @@
+package com.iailab.module.model.matlab.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Data
+@TableName("t_ml_model_method")
+public class MlModelMethodEntity {
+
+    /**
+     * 
+     */
+	private String id;
+    /**
+     * 模型id
+     */
+	private String mlModelId;
+    /**
+     * 全类名
+     */
+	private String className;
+    /**
+     * 方法名
+     */
+	private String methodName;
+    /**
+     * 数据长度
+     */
+	private Integer dataLength;
+    /**
+     * 输出长度
+     */
+	private Integer outLength;
+    /**
+     * 排序
+     */
+	private Integer sort;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodSettingEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodSettingEntity.java
new file mode 100644
index 0000000..9917bb0
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlModelMethodSettingEntity.java
@@ -0,0 +1,46 @@
+package com.iailab.module.model.matlab.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Data
+@TableName("t_ml_model_method_setting")
+public class MlModelMethodSettingEntity {
+
+    /**
+     * id
+     */
+	private String id;
+    /**
+     * 模型方法id
+     */
+	private String mlModelMethodId;
+    /**
+     * 参数名称
+     */
+	private String name;
+    /**
+     * 参数key
+     */
+	private String settingKey;
+    /**
+     * 参数值
+     */
+	private String settingValue;
+    /**
+     * 参数类型
+     */
+	private String valueType;
+    /**
+     * 排序
+     */
+	private Integer sort;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectEntity.java
new file mode 100644
index 0000000..d48e0bd
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectEntity.java
@@ -0,0 +1,37 @@
+package com.iailab.module.model.matlab.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2025/2/25 14:10
+ **/
+@Data
+@TableName("t_ml_project")
+public class MlProjectEntity {
+
+    /**
+     * id
+     */
+	private String id;
+    /**
+     * 项目名称
+     */
+	private String projectName;
+    /**
+     * 项目编码
+     */
+	private String projectCode;
+    /**
+     * 创建时间
+     */
+	private Date createTime;
+    /**
+     * 修改时间
+     */
+	private Date updateTime;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectModelEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectModelEntity.java
new file mode 100644
index 0000000..114ed2f
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/entity/MlProjectModelEntity.java
@@ -0,0 +1,27 @@
+package com.iailab.module.model.matlab.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: dzd 
+ * @date: 2025/2/25 14:16
+ **/
+@Data
+@TableName("t_ml_project_model")
+public class MlProjectModelEntity {
+
+    /**
+     * id
+     */
+	private String id;
+    /**
+     * 项目id
+     */
+	private String projectId;
+    /**
+     * 模型id
+     */
+	private String modelId;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodService.java
new file mode 100644
index 0000000..e31cce4
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodService.java
@@ -0,0 +1,20 @@
+package com.iailab.module.model.matlab.service;
+
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.model.matlab.dto.MlModelMethodDTO;
+import com.iailab.module.model.matlab.entity.MlModelMethodEntity;
+
+import java.util.List;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+public interface MlModelMethodService extends BaseService<MlModelMethodEntity> {
+
+    void insertList(List<MlModelMethodDTO> modelMethods, String id);
+
+    void deleteModelMethod(String modelId);
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodSettingService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodSettingService.java
new file mode 100644
index 0000000..3ceb4d6
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelMethodSettingService.java
@@ -0,0 +1,18 @@
+package com.iailab.module.model.matlab.service;
+
+
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.model.matlab.entity.MlModelMethodSettingEntity;
+
+import java.util.List;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+public interface MlModelMethodSettingService extends BaseService<MlModelMethodSettingEntity> {
+
+    void insertList(List<MlModelMethodSettingEntity> settingEntities);
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelService.java
new file mode 100644
index 0000000..fdc97ca
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlModelService.java
@@ -0,0 +1,44 @@
+package com.iailab.module.model.matlab.service;
+
+
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.framework.common.service.CrudService;
+import com.iailab.module.model.matlab.common.exceptions.IllegalityJarException;
+import com.iailab.module.model.matlab.dto.MatlabJarFileInfoDTO;
+import com.iailab.module.model.matlab.dto.MatlabRunDTO;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.entity.MlModelEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+public interface MlModelService extends BaseService<MlModelEntity> {
+    PageData<MlModelDTO> page(Map<String, Object> params);
+
+    List<MlModelDTO> list(Map<String, Object> params);
+
+    MlModelDTO get(String id);
+
+    void save(MlModelDTO dto);
+
+    void update(MlModelDTO dto);
+
+    void delete(String id);
+
+    MatlabJarFileInfoDTO uploadJarFile(MultipartFile file) throws IllegalityJarException;
+
+    CommonResult<String> test(MatlabRunDTO dto);
+
+    List<HashMap<String, Object>> importData(MultipartFile file) throws IOException;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectModelService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectModelService.java
new file mode 100644
index 0000000..afddf7f
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectModelService.java
@@ -0,0 +1,25 @@
+package com.iailab.module.model.matlab.service;
+
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.dto.MlProjectModelDTO;
+import com.iailab.module.model.matlab.entity.MlProjectModelEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2024/8/22 14:41
+ **/
+public interface MlProjectModelService extends BaseService<MlProjectModelEntity> {
+
+    List<MlProjectModelDTO> list(Map<String, Object> params);
+
+    void deleteByMap(Map<String,Object> map);
+
+    void create(List<MlModelDTO> models, String projectId);
+
+    List<MlModelDTO> getProjectModel(Map<String, Object> params);
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectService.java
new file mode 100644
index 0000000..72d4568
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/MlProjectService.java
@@ -0,0 +1,34 @@
+package com.iailab.module.model.matlab.service;
+
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.dto.MlProjectDTO;
+import com.iailab.module.model.matlab.entity.MlProjectEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2024/8/22 14:41
+ **/
+public interface MlProjectService extends BaseService<MlProjectEntity> {
+    PageData<MlProjectDTO> page(Map<String, Object> params);
+
+    List<MlProjectDTO> list(Map<String, Object> params);
+
+    MlProjectDTO get(String id);
+
+    void save(MlProjectDTO dto);
+
+    void update(MlProjectDTO dto);
+
+    void delete(String id);
+
+    PageData<MlModelDTO> getProjectModel(Map<String, Object> params);
+
+    CommonResult<String> publish(Map<String, Object> params);
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodServiceImpl.java
new file mode 100644
index 0000000..96b9128
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodServiceImpl.java
@@ -0,0 +1,60 @@
+package com.iailab.module.model.matlab.service.impl;
+
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.ConvertUtils;
+import com.iailab.module.model.matlab.dao.MlModelMethodDao;
+import com.iailab.module.model.matlab.dto.MlModelMethodDTO;
+import com.iailab.module.model.matlab.entity.MlModelMethodEntity;
+import com.iailab.module.model.matlab.entity.MlModelMethodSettingEntity;
+import com.iailab.module.model.matlab.service.MlModelMethodService;
+import com.iailab.module.model.matlab.service.MlModelMethodSettingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Service
+public class MlModelMethodServiceImpl extends BaseServiceImpl<MlModelMethodDao, MlModelMethodEntity> implements MlModelMethodService {
+
+    @Autowired
+    private MlModelMethodSettingService mlModelMethodSettingService;
+    @Override
+    public void insertList(List<MlModelMethodDTO> list, String modelId) {
+        List<MlModelMethodEntity> methodEntities = new ArrayList<>();
+        List<MlModelMethodSettingEntity> settingEntities = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            MlModelMethodEntity entity = ConvertUtils.sourceToTarget(list.get(i), MlModelMethodEntity.class);
+            String methodId = UUID.randomUUID().toString();
+            entity.setId(methodId);
+            entity.setMlModelId(modelId);
+            entity.setSort(i);
+            methodEntities.add(entity);
+            if (!CollectionUtils.isEmpty(list.get(i).getMethodSettings())) {
+                List<MlModelMethodSettingEntity> settingEntityList = ConvertUtils.sourceToTarget(list.get(i).getMethodSettings(), MlModelMethodSettingEntity.class);
+                for (int j = 0; j < settingEntityList.size(); j++) {
+                    MlModelMethodSettingEntity mlModelMethodSettingEntity = settingEntityList.get(j);
+                    mlModelMethodSettingEntity.setId(UUID.randomUUID().toString());
+                    mlModelMethodSettingEntity.setMlModelMethodId(methodId);
+                    mlModelMethodSettingEntity.setSort(j);
+                    settingEntities.add(mlModelMethodSettingEntity);
+                }
+            }
+        }
+        baseDao.insert(methodEntities);
+        mlModelMethodSettingService.insertList(settingEntities);
+    }
+
+    @Override
+    public void deleteModelMethod(String modelId) {
+        Map<String,Object> map = new HashMap<>();
+        map.put("ml_model_id", modelId);
+        baseDao.deleteByMap(map);
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodSettingServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodSettingServiceImpl.java
new file mode 100644
index 0000000..155c9b5
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelMethodSettingServiceImpl.java
@@ -0,0 +1,25 @@
+package com.iailab.module.model.matlab.service.impl;
+
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.module.model.matlab.dao.MlModelMethodSettingDao;
+import com.iailab.module.model.matlab.entity.MlModelMethodSettingEntity;
+import com.iailab.module.model.matlab.service.MlModelMethodSettingService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Service
+public class MlModelMethodSettingServiceImpl extends BaseServiceImpl<MlModelMethodSettingDao, MlModelMethodSettingEntity> implements MlModelMethodSettingService {
+
+
+    @Override
+    public void insertList(List<MlModelMethodSettingEntity> settingEntities) {
+        baseDao.insert(settingEntities);
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelServiceImpl.java
new file mode 100644
index 0000000..2211a31
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlModelServiceImpl.java
@@ -0,0 +1,287 @@
+package com.iailab.module.model.matlab.service.impl;
+
+
+import cn.hutool.cache.CacheUtil;
+import cn.hutool.cache.impl.FIFOCache;
+import cn.hutool.core.io.FileUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants;
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.ConvertUtils;
+import com.iailab.framework.security.core.util.SecurityFrameworkUtils;
+import com.iailab.framework.tenant.core.context.TenantContextHolder;
+import com.iailab.module.model.common.utils.DateUtils;
+import com.iailab.module.model.matlab.common.exceptions.IllegalityJarException;
+import com.iailab.module.model.matlab.common.utils.MatlabUtils;
+import com.iailab.module.model.matlab.dao.MlModelDao;
+import com.iailab.module.model.matlab.dto.MatlabJarFileInfoDTO;
+import com.iailab.module.model.matlab.dto.MatlabRunDTO;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.entity.MlModelEntity;
+import com.iailab.module.model.matlab.service.MlModelMethodService;
+import com.iailab.module.model.matlab.service.MlModelService;
+import com.iailab.module.model.mpk.common.MdkConstant;
+import com.iailab.module.model.mpk.common.utils.Readtxt;
+import com.mathworks.toolbox.javabuilder.MWStructArray;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URLClassLoader;
+import java.util.*;
+
+import static com.iailab.framework.common.pojo.CommonResult.error;
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+/**
+ * 
+ *
+ * @author Dzd 
+ * @since 1.0.0 2025-02-08
+ */
+@Slf4j
+@Service
+public class MlModelServiceImpl extends BaseServiceImpl<MlModelDao, MlModelEntity> implements MlModelService {
+
+    @Value("${mablab.bak-file-path}")
+    private String mablabBakFilePath;
+
+    @Autowired
+    private MlModelMethodService mlModelMethodService;
+
+    // 先进先出缓存 临时保存导入的数据
+    private static FIFOCache<String, String> cache = CacheUtil.newFIFOCache(100);
+
+    @Override
+    public PageData<MlModelDTO> page(Map<String, Object> params) {
+        IPage<MlModelEntity> page = baseDao.selectPage(
+                getPage(params, "create_date", false),
+                getWrapper(params)
+        );
+
+        return getPageData(page, MlModelDTO.class);
+    }
+
+    @Override
+    public List<MlModelDTO> list(Map<String, Object> params) {
+        List<MlModelDTO> list = baseDao.list(params);
+
+        return list;
+    }
+
+    private QueryWrapper<MlModelEntity> getWrapper(Map<String, Object> params) {
+        String modelName = (String) params.get("modelName");
+        String modelFileName = (String) params.get("modelFileName");
+
+        QueryWrapper<MlModelEntity> wrapper = new QueryWrapper<>();
+        wrapper.like(StringUtils.isNotBlank(modelName), "model_name", modelName)
+                .like(StringUtils.isNotBlank(modelFileName), "model_file_name", modelFileName);
+        return wrapper;
+    }
+
+    @Override
+    public MlModelDTO get(String id) {
+        MlModelDTO entity = baseDao.get(id);
+
+        return entity;
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void save(MlModelDTO dto) {
+        MlModelEntity entity = ConvertUtils.sourceToTarget(dto, MlModelEntity.class);
+        entity.setId(UUID.randomUUID().toString());
+        entity.setModelFilePath(dto.getModelFilePath().trim());
+        entity.setModelFileName(dto.getModelFileName().trim());
+        entity.setCreator(SecurityFrameworkUtils.getLoginUserId());
+        entity.setCreateDate(new Date());
+        insert(entity);
+
+        mlModelMethodService.insertList(dto.getModelMethods(), entity.getId());
+
+        saveJarFile(dto.getModelFilePath(),dto.getModelFileName());
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void update(MlModelDTO dto) {
+        MlModelEntity entity = ConvertUtils.sourceToTarget(dto, MlModelEntity.class);
+        entity.setUpdater(SecurityFrameworkUtils.getLoginUserId());
+        entity.setUpdateDate(new Date());
+        updateById(entity);
+        mlModelMethodService.deleteModelMethod(entity.getId());
+        mlModelMethodService.insertList(dto.getModelMethods(), entity.getId());
+
+        saveJarFile(dto.getModelFilePath(),dto.getModelFileName());
+    }
+
+    /**
+     * @description: 保存最新jar文件,用于测试运行
+     * @author: dzd
+     * @date: 2025/2/24 16:25
+     **/
+    private void saveJarFile(String modelFilePath,String modelFileName) {
+        String matlabTenantBakFilePath = getMatlabTenantBakFilePath();
+
+        String jarBakPath = matlabTenantBakFilePath + File.separator + MdkConstant.JAR + File.separator + modelFileName + ".jar";
+        FileUtil.copy(modelFilePath, jarBakPath, true);
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void delete(String id) {
+
+        //删除源文件
+        MlModelEntity MlModelEntity = selectById(id);
+        if (StringUtils.isNoneBlank(MlModelEntity.getModelFilePath())) {
+            File mpkFile = new File(MlModelEntity.getModelFilePath());
+            if (mpkFile.exists()) {
+                mpkFile.delete();
+                log.info("删除源文件备份文件:" + MlModelEntity.getModelFilePath());
+            }
+        }
+        //删除 会级联删除掉关联表
+        deleteById(id);
+    }
+
+    @Override
+    public MatlabJarFileInfoDTO uploadJarFile(MultipartFile file) throws IllegalityJarException {
+        String matlabTenantBakFilePath = getMatlabTenantBakFilePath();
+        File bakDir = new File(matlabTenantBakFilePath);
+
+        String jarName = null;
+        File jarBakFile = null;
+        try {
+            String fileName = file.getOriginalFilename();
+            jarName = fileName.substring(0, fileName.lastIndexOf("."));
+            String pyName_time = jarName + "_" + DateUtils.format(new Date(),DateUtils.DATE_TIME_STRING);
+            jarBakFile = new File(bakDir.getAbsolutePath() + File.separator + pyName_time + ".jar");
+            file.transferTo(jarBakFile);
+        } catch (IOException e) {
+            throw new RuntimeException("保存算法封装jar文件失败!");
+        }
+
+        //解析jar info
+        MatlabJarFileInfoDTO result = new MatlabJarFileInfoDTO();
+        result.setFilePath(jarBakFile.getAbsolutePath());
+        result.setFileName(jarName);
+        result.setClassInfos(MatlabUtils.parseJarInfo(jarBakFile.getAbsolutePath(),jarName));
+        return result;
+    }
+
+    @Override
+    public CommonResult<String> test(MatlabRunDTO dto) {
+        String matlabTenantBakFilePath = getMatlabTenantBakFilePath();
+
+        Class<?> clazz;
+        URLClassLoader classLoader;
+        try {
+            File jarFile = new File(matlabTenantBakFilePath + File.separator + MdkConstant.JAR + File.separator + dto.getModelFileName() + ".jar");
+            if (!jarFile.exists()) {
+                throw new RuntimeException("jar包不存在,请检查。jarPath:" + jarFile.getAbsolutePath());
+            }
+            // 加载jar包
+            classLoader = MatlabUtils.loadJar(null,jarFile.getAbsolutePath());
+            // 实现类
+            clazz = classLoader.loadClass(dto.getClassName());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("加载运行环境失败。");
+        }
+
+        try {
+            List<String> uuids = dto.getUuids();
+
+            Object[] paramsValueArray = new Object[uuids.size() + 1];
+
+            try {
+                for (int i = 0; i < uuids.size(); i++) {
+                    String uuid = uuids.get(i);
+                    if (!cache.containsKey(uuid)) {
+                        return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"请重新导入模型参数");
+                    }
+                    JSONArray jsonArray = JSON.parseArray(cache.get(uuid));
+                    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;
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"模型参数错误,请检查!");
+            }
+
+            MWStructArray mwStructArraySetting;
+            try {
+
+                HashMap<String, Object> settings = MatlabUtils.handleModelSettings(dto.getModelSettings());
+                mwStructArraySetting = MatlabUtils.convertMapToStruct(settings);
+                paramsValueArray[uuids.size()] = mwStructArraySetting;
+            } catch (Exception e) {
+                e.printStackTrace();
+                return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"模型设置错误,请检查!");
+            }
+
+            Class<?>[] paramsArray = new Class[2];
+            paramsArray[0] = int.class;
+            paramsArray[1] = Object[].class;
+            Object[] objects = (Object[]) clazz.getDeclaredMethod(dto.getMethodName(), paramsArray).invoke(clazz.newInstance(), new Object[]{dto.getOutLength(), paramsValueArray});
+            mwStructArraySetting.dispose();
+            Map<String, Object> result = MatlabUtils.convertStructToMap((MWStructArray) objects[0]);
+            return success(JSON.toJSONString(result));
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            return error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"运行异常");
+        } finally {
+            if (classLoader != null) {
+                MatlabUtils.unloadJar(classLoader);
+            }
+        }
+    }
+
+    @Override
+    public List<HashMap<String, Object>> importData(MultipartFile file) throws IOException {
+        List<double[][]> datas = Readtxt.readMethodExcel(file);
+        List<HashMap<String,Object>> result = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(datas)) {
+            for (double[][] data : datas) {
+                if (data.length > 0) {
+                    HashMap<String,Object> map = new HashMap<>();
+                    String uuid = UUID.randomUUID().toString();
+                    map.put("uuid",uuid);
+                    map.put("data", JSON.toJSONString(data));
+                    cache.put(uuid,JSON.toJSONString(data));
+                    result.add(map);
+                }
+            }
+        }
+        return result;
+    }
+
+    private String getMatlabTenantBakFilePath() {
+        Long tenantId = TenantContextHolder.getTenantId();
+        // 备份文件夹 租户隔离
+        String matlabTenantBakFilePath = mablabBakFilePath + File.separator + tenantId;
+        File bakDir = new File(matlabTenantBakFilePath);
+        if (!bakDir.exists()) {
+            bakDir.mkdirs();
+        }
+        return matlabTenantBakFilePath;
+    }
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectModelServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectModelServiceImpl.java
new file mode 100644
index 0000000..168f641
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectModelServiceImpl.java
@@ -0,0 +1,70 @@
+package com.iailab.module.model.matlab.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.ConvertUtils;
+import com.iailab.module.model.matlab.dao.MlProjectModelDao;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.dto.MlProjectModelDTO;
+import com.iailab.module.model.matlab.entity.MlProjectModelEntity;
+import com.iailab.module.model.matlab.service.MlProjectModelService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @description:
+ * @author: dzd
+ * @date: 2024/8/22 14:41
+ **/
+@Service
+public class MlProjectModelServiceImpl extends BaseServiceImpl<MlProjectModelDao, MlProjectModelEntity> implements MlProjectModelService {
+    @Override
+    public List<MlProjectModelDTO> list(Map<String, Object> params) {
+        List<MlProjectModelEntity> entityList = baseDao.selectList(getWrapper(params));
+
+        return ConvertUtils.sourceToTarget(entityList, MlProjectModelDTO.class);
+    }
+
+    @Override
+    public void deleteByMap(Map<String,Object> map) {
+        baseDao.delete(getWrapper(map));
+    }
+
+    @Override
+    public void create(List<MlModelDTO> models, String projectId) {
+        List<MlProjectModelEntity> list = new ArrayList<>(models.size());
+        for (MlModelDTO model : models) {
+            MlProjectModelEntity projectModel = new MlProjectModelEntity();
+            projectModel.setId(UUID.randomUUID().toString());
+            projectModel.setProjectId(projectId);
+            projectModel.setModelId(model.getId());
+            list.add(projectModel);
+        }
+        baseDao.insert(list);
+    }
+
+    @Override
+    public List<MlModelDTO> getProjectModel(Map<String, Object> params) {
+        return baseDao.getProjectModel(params);
+    }
+
+    public QueryWrapper<MlProjectModelEntity> getWrapper(Map<String, Object> params){
+        String id = (String)params.get("id");
+        String projectId = (String)params.get("projectId");
+        String modelId = (String)params.get("modelId");
+
+        QueryWrapper<MlProjectModelEntity> wrapper = new QueryWrapper<>();
+        wrapper.eq(StringUtils.isNotBlank(id), "id", id)
+                .eq(StringUtils.isNotBlank(projectId), "project_id", projectId)
+                .eq(StringUtils.isNotBlank(modelId),"model_id",modelId);
+
+        return wrapper;
+    }
+
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectServiceImpl.java
new file mode 100644
index 0000000..ca70a63
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/matlab/service/impl/MlProjectServiceImpl.java
@@ -0,0 +1,192 @@
+package com.iailab.module.model.matlab.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.ConvertUtils;
+import com.iailab.module.model.matlab.common.utils.MatlabUtils;
+import com.iailab.module.model.matlab.dao.MlModelDao;
+import com.iailab.module.model.matlab.dao.MlProjectDao;
+import com.iailab.module.model.matlab.dto.MlModelDTO;
+import com.iailab.module.model.matlab.dto.MlProjectDTO;
+import com.iailab.module.model.matlab.dto.MlProjectModelDTO;
+import com.iailab.module.model.matlab.entity.MlProjectEntity;
+import com.iailab.module.model.matlab.service.MlProjectModelService;
+import com.iailab.module.model.matlab.service.MlProjectService;
+import com.iailab.module.model.mpk.common.MdkConstant;
+import com.iailab.module.model.mpk.common.utils.DllUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.net.URLClassLoader;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @description:
+ * @author: dzd 
+ * @date: 2025/2/25 14:45
+ **/
+@Service
+@Slf4j
+public class MlProjectServiceImpl extends BaseServiceImpl<MlProjectDao, MlProjectEntity> implements MlProjectService {
+
+    @Autowired
+    MlProjectModelService mlProjectModelService;
+    @Autowired
+    MlModelDao mlModelDao;
+
+    @Value("${mablab.bak-file-path}")
+    private String mablabBakFilePath;
+
+    @Override
+    public PageData<MlProjectDTO> page(Map<String, Object> params) {
+        IPage<MlProjectEntity> page = baseDao.selectPage(
+                getPage(params, null, false),
+                getWrapper(params)
+        );
+
+        return getPageData(page, MlProjectDTO.class);
+    }
+
+    @Override
+    public List<MlProjectDTO> list(Map<String, Object> params) {
+        List<MlProjectEntity> entityList = baseDao.selectList(getWrapper(params).orderByDesc("create_time"));
+
+        return ConvertUtils.sourceToTarget(entityList, MlProjectDTO.class);
+    }
+
+    @Override
+    public MlProjectDTO get(String id) {
+        MlProjectEntity entity = baseDao.selectById(id);
+        MlProjectDTO dto = ConvertUtils.sourceToTarget(entity, MlProjectDTO.class);
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("projectId",id);
+        List<MlProjectModelDTO> projectModelList = mlProjectModelService.list(map);
+        dto.setModels(projectModelList.stream().map(e -> {
+            MlModelDTO mlModelDTO = new MlModelDTO();
+            mlModelDTO.setId(e.getModelId());
+            return mlModelDTO;
+        }).collect(Collectors.toList()));
+
+        return dto;
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void save(MlProjectDTO dto) {
+        MlProjectEntity entity = ConvertUtils.sourceToTarget(dto, MlProjectEntity.class);
+        String projectId = UUID.randomUUID().toString();
+        entity.setId(projectId);
+        entity.setCreateTime(new Date());
+        insert(entity);
+
+        //关联模型
+        List<MlModelDTO> models = dto.getModels();
+        if (CollectionUtils.isNotEmpty(models)) {
+            mlProjectModelService.create(models,projectId);
+        }
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void update(MlProjectDTO dto) {
+        MlProjectEntity entity = ConvertUtils.sourceToTarget(dto, MlProjectEntity.class);
+        entity.setUpdateTime(new Date());
+        updateById(entity);
+
+        String projectId = dto.getId();
+        //删除关联
+        Map<String,Object> map = new HashMap<>();
+        map.put("projectId",projectId);
+        mlProjectModelService.deleteByMap(map);
+
+        //关联模型
+        List<MlModelDTO> models = dto.getModels();
+        if (CollectionUtils.isNotEmpty(models)) {
+            mlProjectModelService.create(models,projectId);
+        }
+    }
+
+    @Override
+    @DSTransactional(rollbackFor = Exception.class)
+    public void delete(String id) {
+        //删除 (级联删除)
+        baseDao.deleteById(id);
+    }
+
+    @Override
+    public PageData<MlModelDTO> getProjectModel(Map<String, Object> params) {
+        String projectId = (String) params.get("projectId");
+
+        int total = mlModelDao.getProjectModelCount(projectId);
+        if (total == 0) {
+            return new PageData<>(new ArrayList<>(), 0);
+        }
+        int page = Integer.parseInt((String) params.get("page"));
+        int pageSize = Integer.parseInt((String) params.get("pageSize"));
+        int offset = (page - 1)*pageSize;
+        params.put("offset",offset);
+        params.put("pageSize",pageSize);
+        List<MlModelDTO> list =  mlModelDao.getProjectModel(params);
+
+        return new PageData<>(list,total);
+    }
+
+    @Override
+    public CommonResult<String> publish(Map<String, Object> params) {
+        String projectId = (String) params.get("projectId");
+
+        // 卸载上次发布的classloader 并删除发布备份文件
+        MatlabUtils.removeClassLoaderCache(projectId);
+        MatlabUtils.removeOldFile(mablabBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH,projectId);
+
+        // 查询关联模型
+        List<MlModelDTO> list = mlProjectModelService.getProjectModel(params);
+        // 将模型文件备份到发布文件
+        String[] jarFilePaths = new String[list.size()];
+        for (int i = 0; i < list.size(); i++) {
+            MlModelDTO mlModelDTO = list.get(i);
+            String jarFilePath = mablabBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH + File.separator + projectId + MdkConstant.SPLIT + mlModelDTO.getId() + ".jar";
+            FileUtil.copy(mlModelDTO.getModelFilePath(),jarFilePath,true);
+            jarFilePaths[i] = jarFilePath;
+        }
+
+        // 加载新的jar,将classloader存入缓存
+        URLClassLoader urlClassLoader = null;
+        try {
+            // 加载新的jar
+            urlClassLoader = MatlabUtils.loadJar(projectId,jarFilePaths);
+        } catch (Exception e) {
+            throw new RuntimeException("加载新的jar异常",e);
+        }
+
+
+        return CommonResult.success();
+    }
+
+    public QueryWrapper<MlProjectEntity> getWrapper(Map<String, Object> params){
+        String id = (String)params.get("id");
+        String projectName = (String)params.get("projectName");
+        String projectCode = (String)params.get("projectCode");
+
+        QueryWrapper<MlProjectEntity> wrapper = new QueryWrapper<>();
+        wrapper.eq(StringUtils.isNotBlank(id), "id", id)
+                .like(StringUtils.isNotBlank(projectName),"project_name",projectName)
+                .like(StringUtils.isNotBlank(projectCode),"project_code",projectCode);
+
+        return wrapper;
+    }
+
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java
index f141bdf..0c592b3 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java
@@ -347,7 +347,7 @@
         String jarSavePath = pkgJar(dirPath.getAbsolutePath());
         //备份jar文件,用于后续运行
         String jarBakPath = mpkTenantBakFilePath + File.separator + MdkConstant.JAR + File.separator + entity.getPyName() + ".jar";
-        FileUtil.mkParentDirs(dllBakPath);
+        FileUtil.mkParentDirs(jarBakPath);
         FileUtil.copy(jarSavePath, jarBakPath, true);
         // 打zip包
         String zipPath = mpkTenantBakFilePath + File.separator + zipFileName;
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlModelDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlModelDao.xml
new file mode 100644
index 0000000..57dc09e
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlModelDao.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.iailab.module.model.matlab.dao.MlModelDao">
+    <resultMap type="com.iailab.module.model.matlab.dto.MlModelDTO" id="mlModelMap">
+        <result property="id" column="id"/>
+        <result property="modelName" column="model_name"/>
+        <result property="modelFileName" column="model_file_name"/>
+        <result property="modelFilePath" column="model_file_path"/>
+        <result property="modelType" column="model_type"/>
+        <result property="matlabPlatform" column="matlab_platform"/>
+        <result property="matlabVersion" column="matlab_version"/>
+        <result property="remark" column="remark"/>
+        <result property="creator" column="creator"/>
+        <result property="createDate" column="create_date"/>
+        <result property="updater" column="updater"/>
+        <result property="updateDate" column="update_date"/>
+        <collection property="modelMethods" ofType="com.iailab.module.model.matlab.dto.MlModelMethodDTO">
+            <id property="id" column="method_id"/>
+            <result property="className" column="class_name"/>
+            <result property="methodName" column="method_name"/>
+            <result property="dataLength" column="data_length"/>
+            <result property="outLength" column="out_length"/>
+            <collection property="methodSettings" ofType="com.iailab.module.model.matlab.dto.MlModelMethodSettingDTO">
+                <id property="id" column="setting_id"/>
+                <result property="name" column="setting_name"/>
+                <result property="settingKey" column="setting_key"/>
+                <result property="settingValue" column="setting_value"/>
+                <result property="valueType" column="value_type"/>
+            </collection>
+        </collection>
+    </resultMap>
+
+    <select id="list" resultMap="mlModelMap" parameterType="java.util.Map">
+        SELECT
+        a.*,
+        b.id method_id,
+        b.class_name,
+        b.method_name,
+        b.data_length,
+        b.out_length,
+        c.id setting_id,
+        c.NAME setting_name,
+        c.setting_key,
+        c.setting_value,
+        c.value_type
+        FROM
+        t_ml_model a
+        LEFT JOIN t_ml_model_method b ON a.id = b.ml_model_id
+        LEFT JOIN t_ml_model_method_setting c ON b.id = c.ml_model_method_id
+        <where>
+            <if test="params.modelType != null and params.modelType != ''">
+                AND a.model_type = #{params.modelType}
+            </if>
+        </where>
+        ORDER BY
+        a.create_date,
+        b.sort,
+        c.sort
+    </select>
+    <select id="get" resultMap="mlModelMap" parameterType="java.lang.String">
+        SELECT
+            a.*,
+            b.id method_id,
+            b.class_name,
+            b.method_name,
+            b.data_length,
+            b.out_length,
+            c.id setting_id,
+            c.NAME setting_name,
+            c.setting_key,
+            c.setting_value,
+            c.value_type
+        FROM
+            t_ml_model a
+        LEFT JOIN t_ml_model_method b ON a.id = b.ml_model_id
+        LEFT JOIN t_ml_model_method_setting c ON b.id = c.ml_model_method_id
+        WHERE a.id = #{id}
+        ORDER BY b.sort,c.sort
+    </select>
+    <select id="getProjectModelCount" resultType="java.lang.Integer" parameterType="java.lang.String">
+        SELECT
+            count(*)
+        FROM
+            t_ml_project_model
+        WHERE
+            project_id = #{projectId}
+    </select>
+    <select id="getProjectModel" resultMap="mlModelMap" parameterType="java.util.Map">
+        SELECT
+        t3.*,
+        t4.id method_id,
+        t4.class_name,
+        t4.method_name,
+        t4.data_length,
+        t4.out_length,
+        t5.id setting_id,
+        t5.setting_key,
+        t5.name setting_name,
+        t5.setting_value,
+        t5.value_type
+        FROM
+        (
+        SELECT
+        t2.*
+        FROM
+        t_ml_project_model t1
+        LEFT JOIN t_ml_model t2 ON t1.model_id = t2.id
+        WHERE
+        t1.project_id = #{params.projectId}
+        <if test="params.modelFileName != null and params.modelFileName != ''">
+            AND t2.model_file_name LIKE CONCAT('%',#{params.modelFileName},'%')
+        </if>
+        ORDER BY
+        t2.create_date DESC
+        LIMIT #{params.offset},#{params.pageSize}
+        ) t3
+        LEFT JOIN t_ml_model_method t4 ON t3.id = t4.ml_model_id
+        LEFT JOIN t_ml_model_method_setting t5 ON t4.id = t5.ml_model_method_id
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlProjectModelDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlProjectModelDao.xml
new file mode 100644
index 0000000..a14eab5
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/matlab/MlProjectModelDao.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.iailab.module.model.matlab.dao.MlProjectModelDao">
+    <select id="getProjectModel" resultType="com.iailab.module.model.matlab.dto.MlModelDTO">
+        SELECT
+            t2.id,
+            t2.model_file_path
+        FROM
+            t_ml_project_model t1
+                LEFT JOIN t_ml_model t2 ON t1.model_id = t2.id
+        WHERE
+            t1.project_id = #{params.projectId}
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3