From 27e7299964b861c079dbb2826edab00dfd6dc27d Mon Sep 17 00:00:00 2001 From: 潘志宝 <979469083@qq.com> Date: 星期四, 12 九月 2024 17:30:27 +0800 Subject: [PATCH] Merge branch 'master' of ssh://172.16.8.100:29418/iailab-plat --- iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mpk/MpkFileDao.xml | 86 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/GeneratorCodeHistoryService.java | 25 iailab-module-model/iailab-module-model-biz/src/main/resources/template/Jni.h.vm | 28 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectPackageHistoryModelDao.java | 15 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectPackageHistoryDao.java | 16 iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/pojo/CommonResult.java | 7 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/GeneratorCodeHistoryEntity.java | 49 iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/Jni.cpp.vm | 31 iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/util/date/DateUtils.java | 4 iailab-module-model/iailab-module-model-biz/src/main/resources/template/log.txt.vm | 9 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/MpkFileDao.java | 31 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MdkFileService.java | 37 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mpk/ProjectDao.xml | 38 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/Environment.java | 44 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/framework/rpc/config/RpcConfiguration.java | 5 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectPackageHistoryServiceImpl.java | 57 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/GeneratorCodeHistoryDao.java | 15 iailab-module-model/iailab-module-model-biz/src/main/resources/template/cpp.vm | 120 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/ProjectPackageHistoryController.java | 60 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/GenUtils.java | 185 ++ iailab-module-model/iailab-module-model-biz/src/main/resources/template/h.vm | 26 iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/exception/enums/GlobalErrorCodeConstants.java | 1 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java | 22 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ModelMethodEntity.java | 46 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java | 17 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/GeneratorCodeHistoryDTO.java | 47 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ModelMethodDTO.java | 27 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/MdkDTO.java | 29 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectPackageHistoryModelDTO.java | 50 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectPackageHistoryDTO.java | 36 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectDTO.java | 32 iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/impl.java.vm | 48 iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/pkg.Jni.cpp.vm | 33 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectPackageHistoryModelEntity.java | 47 iailab-framework/iailab-common-web/src/main/java/com/iailab/framework/web/core/handler/GlobalExceptionHandler.java | 15 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectPackageHistoryEntity.java | 50 iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/abstract.java.vm | 9 iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/cpp.vm | 161 ++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectModelServiceImpl.java | 51 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectModelEntity.java | 27 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java | 106 + iailab-module-model/iailab-module-model-biz/src/main/resources/bak/Environment.java | 44 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectPackageHistoryService.java | 23 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/AlgsUtils.java | 172 ++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectModelDao.java | 15 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/GeneratorCodeHistoryServiceImpl.java | 77 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ModelMethodServiceImpl.java | 37 iailab-module-model/iailab-module-model-biz/src/main/resources/template/abstract.java.vm | 11 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectDao.java | 21 iailab-module-model/iailab-module-model-biz/src/main/resources/template/pkg.Jni.cpp.vm | 24 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/ProjectController.java | 82 + iailab-module-model/iailab-module-model-biz/src/main/resources/template/pkg.cpp.vm | 122 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectEntity.java | 37 iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/Jni.h.vm | 28 iailab-module-model/iailab-module-model-biz/src/main/resources/bak/AlgsUtils.java | 172 ++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/MpkFileDTO.java | 44 iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/log.txt.vm | 9 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectModelDTO.java | 24 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/MpkFileEntity.java | 85 + iailab-module-model/iailab-module-model-biz/src/main/resources/template/impl.java.vm | 33 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MpkFileController.java | 110 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ModelMethodService.java | 16 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/Readtxt.java | 143 ++ iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/h.vm | 24 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectModelService.java | 20 iailab-module-model/iailab-module-model-biz/src/main/resources/template/Jni.cpp.vm | 22 iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/pkg.cpp.vm | 163 ++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectPackageHistoryModelService.java | 21 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectServiceImpl.java | 197 ++ iailab-framework/iailab-common-web/pom.xml | 4 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/GeneratorCodeHistoryController.java | 81 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MdkFileServiceImpl.java | 436 ++++++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ModelMethodDao.java | 14 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectPackageHistoryModelServiceImpl.java | 57 iailab-module-model/iailab-module-model-biz/pom.xml | 42 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectService.java | 31 76 files changed, 4,179 insertions(+), 4 deletions(-) diff --git a/iailab-framework/iailab-common-web/pom.xml b/iailab-framework/iailab-common-web/pom.xml index 046950a..02aa5b3 100644 --- a/iailab-framework/iailab-common-web/pom.xml +++ b/iailab-framework/iailab-common-web/pom.xml @@ -20,6 +20,10 @@ <groupId>com.iailab</groupId> <artifactId>iailab-common</artifactId> </dependency> + <dependency> + <groupId>com.baomidou</groupId> + <artifactId>mybatis-plus-boot-starter</artifactId> <!-- 捕获mybatis全局异常 --> + </dependency> <!-- Spring Boot 配置所需依赖 --> <dependency> diff --git a/iailab-framework/iailab-common-web/src/main/java/com/iailab/framework/web/core/handler/GlobalExceptionHandler.java b/iailab-framework/iailab-common-web/src/main/java/com/iailab/framework/web/core/handler/GlobalExceptionHandler.java index 958589c..79930b8 100644 --- a/iailab-framework/iailab-common-web/src/main/java/com/iailab/framework/web/core/handler/GlobalExceptionHandler.java +++ b/iailab-framework/iailab-common-web/src/main/java/com/iailab/framework/web/core/handler/GlobalExceptionHandler.java @@ -25,6 +25,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.servlet.NoHandlerFoundException; +import org.springframework.dao.DuplicateKeyException; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; @@ -94,6 +95,9 @@ } if (ex instanceof AccessDeniedException) { return accessDeniedExceptionHandler(request, (AccessDeniedException) ex); + } + if (ex instanceof DuplicateKeyException) { + return duplicateKeyExceptionHandler((DuplicateKeyException) ex); } return defaultExceptionHandler(request, ex); } @@ -199,6 +203,17 @@ } /** + * 处理业务异常 SQLIntegrityConstraintViolationException + * + * 数据库存在重复数据 + */ + @ExceptionHandler(value = DuplicateKeyException.class) + public CommonResult<?> duplicateKeyExceptionHandler(DuplicateKeyException ex) { + log.warn("[duplicateKeyExceptionHandler]", ex); + return CommonResult.error(DATA_REPETITION.getCode(), DATA_REPETITION.getMsg()); + } + + /** * 处理业务异常 ServiceException * * 例如说,商品库存不足,用户手机号已存在。 diff --git a/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/exception/enums/GlobalErrorCodeConstants.java b/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/exception/enums/GlobalErrorCodeConstants.java index 68d2766..bf1e415 100644 --- a/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/exception/enums/GlobalErrorCodeConstants.java +++ b/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/exception/enums/GlobalErrorCodeConstants.java @@ -23,6 +23,7 @@ ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限"); ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到"); ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确"); + ErrorCode DATA_REPETITION = new ErrorCode(406, "数据库存在重复数据"); ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); diff --git a/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/pojo/CommonResult.java b/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/pojo/CommonResult.java index d890066..2f39029 100644 --- a/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/pojo/CommonResult.java +++ b/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/pojo/CommonResult.java @@ -68,6 +68,13 @@ return result; } + public static CommonResult<String> success() { + CommonResult<String> result = new CommonResult<>(); + result.code = GlobalErrorCodeConstants.SUCCESS.getCode(); + result.msg = "success"; + return result; + } + public static boolean isSuccess(Integer code) { return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode()); } diff --git a/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/util/date/DateUtils.java b/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/util/date/DateUtils.java index dc63f08..cb47d49 100644 --- a/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/util/date/DateUtils.java +++ b/iailab-framework/iailab-common/src/main/java/com/iailab/framework/common/util/date/DateUtils.java @@ -29,9 +29,13 @@ public static final long SECOND_MILLIS = 1000; public static final String FORMAT_YEAR_MONTH_DAY = "yyyy-MM-dd"; + /** 时间格式(yyyy.MM.dd) */ + public final static String DATE_PATTERN_POINT = "yyyy.MM.dd"; public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + public final static String DATE_TIME_PATTERN_STRING = "yyyyMMddHHmmss"; + /** * 日期格式化 日期格式为:yyyy-MM-dd * @param date 日期 diff --git a/iailab-module-model/iailab-module-model-biz/pom.xml b/iailab-module-model/iailab-module-model-biz/pom.xml index 56a3d1b..d04cd7a 100644 --- a/iailab-module-model/iailab-module-model-biz/pom.xml +++ b/iailab-module-model/iailab-module-model-biz/pom.xml @@ -16,6 +16,9 @@ <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <mdk.version>MDK.taisteel.202308231710</mdk.version> + <easypoi.version>4.1.0</easypoi.version> + <commons.io.version>2.11.0</commons.io.version> + <velocity.version>1.7</velocity.version> </properties> <dependencies> @@ -80,6 +83,11 @@ <version>${revision}</version> </dependency> <dependency> + <groupId>com.iailab</groupId> + <artifactId>iailab-module-infra-api</artifactId> + <version>${revision}</version> + </dependency> + <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency> @@ -138,6 +146,40 @@ <artifactId>MDK</artifactId> <version>${mdk.version}</version> </dependency> + <dependency> + <groupId>com.iail</groupId> + <artifactId>IAILMDK</artifactId> + <version>0.94.9</version> + </dependency> + + <!-- MPK --> + <dependency> + <groupId>cn.afterturn</groupId> + <artifactId>easypoi-base</artifactId> + <version>${easypoi.version}</version> + </dependency> + <dependency> + <groupId>cn.afterturn</groupId> + <artifactId>easypoi-web</artifactId> + <version>${easypoi.version}</version> + </dependency> + <dependency> + <groupId>cn.afterturn</groupId> + <artifactId>easypoi-annotation</artifactId> + <version>${easypoi.version}</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>${commons.io.version}</version> + </dependency> + <dependency> + <artifactId>velocity</artifactId> + <groupId>org.apache.velocity</groupId> + <version>${velocity.version}</version> + </dependency> + + </dependencies> <build> diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java index 133ad84..df28449 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java @@ -4,9 +4,12 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import com.iail.IAILMDK; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.scheduling.annotation.EnableAsync; +import java.io.File; import java.io.InputStream; +import java.util.Objects; import java.util.Properties; @EnableAsync @@ -26,6 +29,25 @@ e.printStackTrace(); System.out.println("动态链接库IAILMDK初始化失败"); } + + try { + System.out.println("动态加载dll"); + String dllDir = Objects.requireNonNull(ModelServiceApplication.class.getClassLoader().getResource("dll")).getPath(); + File dir = new File(dllDir); + if (dir.exists()) { + File[] files = dir.listFiles(); + if (files.length > 0) { + for (File file : files) { + System.out.println("加载:" + file.getAbsolutePath()); + System.load(file.getAbsolutePath()); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println("动态加载dll失败"); + } + } */ diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/framework/rpc/config/RpcConfiguration.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/framework/rpc/config/RpcConfiguration.java index e5981b9..34ffc5d 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/framework/rpc/config/RpcConfiguration.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/framework/rpc/config/RpcConfiguration.java @@ -2,13 +2,10 @@ import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.infra.api.config.ConfigApi; -import com.iailab.module.infra.api.file.FileApi; -import com.iailab.module.system.api.tenant.TenantApi; -import com.iailab.module.system.api.user.AdminUserApi; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) -@EnableFeignClients(clients = {FileApi.class, AdminUserApi.class, ConfigApi.class, TenantApi.class, DataPointApi.class}) +@EnableFeignClients(clients = {DataPointApi.class,ConfigApi.class}) public class RpcConfiguration { } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/Environment.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/Environment.java new file mode 100644 index 0000000..795fa7b --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/Environment.java @@ -0,0 +1,44 @@ +package com.iailab.module.model.mpk.common; + +/** + * @Description + * @Author Forrest + * @Mail 1255187617@qq.com + * @Date 2021/1/12 + */ +public class Environment { + private native int jniInit(); + + private native int jniIsInit(); + + private native void jniRelease(); + + private native int statusCode(); + + /** + * 初始化环境 + */ + public int init() { + return jniInit(); + } + + /** + * 获取初始化状态 + */ + public int isInit() { + return jniIsInit(); + } + + /** + * 释放资源 + */ + public void release() { + jniRelease(); + } + /** + *校验机器码 + * */ +// public int checkMachineCode(String mCode){ +// return statusCode(); +// } +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java new file mode 100644 index 0000000..fee2ea2 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java @@ -0,0 +1,17 @@ +package com.iailab.module.model.mpk.common; + +/** + * 常量 + * + * @author Mark sunlightcs@gmail.com + */ +public interface MdkConstant { + /** + * JNI + */ + String JNI = "JNI"; + /** + * impl + */ + String IMPL = "impl"; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/AlgsUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/AlgsUtils.java new file mode 100644 index 0000000..9fbec1a --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/AlgsUtils.java @@ -0,0 +1,172 @@ +package com.iailab.module.model.mpk.common.utils; + +import java.util.HashMap; + + +/** + * @Auther: Forrest + * @Date: 2020/6/8 14:05 + * @Description: + */ +public class AlgsUtils { + private HashMap<String, Object> model = new HashMap<String, Object>(); + + public HashMap<String, Object> createPredictHashmap(HashMap<String, Object> models) { + if ((models.containsKey("iail/mdk/model"))) { + if (((String) ((HashMap) models.get("iail/mdk/model")).get("param1")).isEmpty()) { + String aaa = "error"; + model.put("param1", aaa); + } else { + String model_train = (String) ((HashMap) models.get("iail/mdk/model")).get("param1"); + model.put("param1", model_train); + } + } else { + model = models; + } + return model; + } + + public HashMap<String, Object> createPredictHashmapplus(HashMap<String, Object> models) { + if (models != null && models.containsKey("models")) { + if (((String) ((HashMap) models.get("models")).get("paramFile")).isEmpty()) { + String aaa = "error"; + model.put("param1", aaa); + } else { + String model_train = (String) ((HashMap) models.get("models")).get("paramFile"); + model.put("paramFile", model_train); + if (((HashMap) models.get("models")).containsKey("dim")) { + Object dim = ((HashMap) models.get("models")).get("dim"); + model.put("dim", dim); + } + } + } else { + model = models; + } + return model; + } + + private HashMap<String, Object> eval_pre = new HashMap<String, Object>(); + + /** + * 对返回码进行转换 + * + * @param models + * @return + */ + public int reverseResultCode(HashMap<String, Object> models) { + if ((models.containsKey("result_code"))) { + return Integer.parseInt((String) models.get("result_code")); + } + return -2; + } + + /** + * 对评价指标进行转换 + * + * @param models + * @return + */ + public HashMap<String, Object> reverseEval(HashMap<String, Object> models) { + if ((models.containsKey("eval"))) { + if (((HashMap) models.get("eval")).containsKey("MAE")) { + double MAE = Double.parseDouble((String) ((HashMap) models.get("eval")).get("MAE")); + eval_pre.put("MAE", MAE); + } + if (((HashMap) models.get("eval")).containsKey("MAPE")) { + double MAPE = Double.parseDouble((String) ((HashMap) models.get("eval")).get("MAPE")); + eval_pre.put("MAPE", MAPE); + } + if (((HashMap) models.get("eval")).containsKey("RMSE")) { + double MAE = Double.parseDouble((String) ((HashMap) models.get("eval")).get("RMSE")); + eval_pre.put("RMSE", MAE); + } + } + + return eval_pre; + } + + /** + * 对models里面的参数进行转换 + */ + private HashMap<String, Object> train_result_models = new HashMap<String, Object>(); + + public HashMap<String, Object> reverseModels(HashMap<String, Object> train_result) { + if (train_result.containsKey("models")) { + train_result_models = (HashMap) train_result.get("models"); + if (((HashMap) train_result.get("models")).containsKey("dim")) { + double dim = Double.parseDouble((String) ((HashMap) train_result.get("models")).get("dim")); + train_result_models.put("dim", dim); + } + train_result.put("models", train_result_models); + } + return train_result; + } + + + /** + * 获取二维数组行列数 + * + * @param arr + * @return + */ + public int[] getColAndRow(double[][] arr) { + int row = arr.length; + int col = arr[0].length; + int[] result = new int[2]; + result[0] = row; + result[1] = col; + return result; + } + + /** + * 两个二维数组进行合并 + * + * @param data + * @param refs + * @return + */ + public double[][] getMathergeArr(double[][] data, double[][] refs) { + + int[] dataRowAndCol = getColAndRow(data); + int rowData = dataRowAndCol[0]; + int colData = dataRowAndCol[1]; + + int[] refsRowAndCol = getColAndRow(refs); + int rowrefs = refsRowAndCol[0]; + int colrefs = refsRowAndCol[1]; + + double[][] newData = new double[rowData + rowrefs][colData]; + for (int i = 0; i < rowData; i++) { + for (int j = 0; j < colData; j++) { + newData[i][j] = data[i][j]; + } + } + + for (int i = 0; i < rowrefs; i++) { + for (int j = 0; j < colrefs; j++) { + newData[i + rowData][j] = refs[i][j]; + } + } + return newData; + } + + /** + * 对训练方法进行处理,实现评价指标的转换 + */ + public HashMap<String, Object> trainUtil(HashMap<String, Object> train_result, HashMap<String, Object> eval, String time) { + if (train_result.containsKey("eval")) { + eval = (HashMap<String, Object>) train_result.get("eval"); + eval.put("time", time); + train_result.put("eval", eval); + } + train_result.put("result_code", reverseResultCode(train_result)); + return train_result; + } + + /** + * 对预测方法进行处理 + */ +// public HashMap<String,Object> predictUtil(){ +// +// } +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/GenUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/GenUtils.java new file mode 100644 index 0000000..d03fb95 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/GenUtils.java @@ -0,0 +1,185 @@ +package com.iailab.module.model.mpk.common.utils; + +import cn.hutool.core.io.FileUtil; +import com.iailab.module.model.mpk.common.MdkConstant; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.StringWriter; +import java.nio.file.Files; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@Slf4j +public class GenUtils { + public static List<String> getTemplates(){ + List<String> templates = new ArrayList<String>(); + templates.add("abstract.java.vm"); + templates.add("impl.java.vm"); + templates.add("cpp.vm"); + templates.add("Jni.cpp.vm"); + templates.add("h.vm"); + templates.add("Jni.h.vm"); + return templates; + } + /** + * 生成代码 + */ + public static void generatorCode(MpkFileDTO entity, ZipOutputStream zip){ + //设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + + //封装模板数据 + Map<String, Object> map = new HashMap<>(); + map.put("pkgName",entity.getPkgName()); + map.put("modelMethods",entity.getModelMethods()); + map.put("pyName",entity.getPyName()); + map.put("pyModule",entity.getPyModule()); + + VelocityContext context = new VelocityContext(map); + + //获取模板列表 + List<String> templates = getTemplates(); + for(String template : templates){ + //渲染模板 + StringWriter sw = drawTemplate(template,context); + + try { + //添加到zip + zip.putNextEntry(new ZipEntry(getFileName(template, entity.getPyName(),entity.getPkgName(),entity.getPyModule()))); + IOUtils.write(sw.toString(), zip, "UTF-8"); + IOUtils.closeQuietly(sw); + zip.closeEntry(); + + if (template.equals("cpp.vm")) { + File dirPath = new File("C:/DLUT/tmp/"); + if (!dirPath.exists()) { + dirPath.mkdirs(); + } + // 生成临时cpp文件 + File cppFile = new File(dirPath.getAbsolutePath() + File.separator + entity.getPyName() + ".cpp"); + cppFile.createNewFile(); + OutputStream cppOutputStream = Files.newOutputStream(cppFile.toPath()); + IOUtils.write(sw.toString(), cppOutputStream, "UTF-8"); + IOUtils.closeQuietly(cppOutputStream); + } + + if (template.equals("Jni.cpp.vm")) { + File dirPath = new File("C:/DLUT/tmp/"); + if (!dirPath.exists()) { + dirPath.mkdirs(); + } + + // 生成临时Jni.cpp文件 + File cppFile = new File(dirPath.getAbsolutePath() + File.separator + entity.getPyName() + ".cpp"); + File jniCppFile = new File(dirPath.getAbsolutePath() + File.separator + entity.getPyName() + "Jni.cpp"); + jniCppFile.createNewFile(); + OutputStream jniCppOutputStream = Files.newOutputStream(jniCppFile.toPath()); + IOUtils.write(sw.toString(), jniCppOutputStream, "UTF-8"); + IOUtils.closeQuietly(jniCppOutputStream); + try { + // 根据file 通过cmd命令 生成dll + String dllSavePath = dirPath.getAbsolutePath() + File.separator + entity.getPyName() + ".dll"; + String cppFilePath = cppFile.getAbsolutePath(); + String jniCppFilePath = jniCppFile.getAbsolutePath(); +// String command = "cmd.exe /c cl -o " + dllSavePath + " /LD " + jniCppFilePath + " " + cppFilePath; + String command = "cmd.exe /c cl -o " + dllSavePath + " /LD D:\\work\\mdk\\code\\makeDll\\src\\main\\java\\org\\example\\MakeDll.c D:\\work\\mdk\\code\\makeDll\\src\\main\\java\\org\\example\\MakeDll2.c"; + Process process = Runtime.getRuntime().exec(command); + // 等待命令执行完成 + process.waitFor(); + + File dllFile = new File(dllSavePath); + //添加到zip + zip.putNextEntry(new ZipEntry("dll" + File.separator + entity.getPyName() + ".dll")); + IOUtils.write(FileUtils.readFileToByteArray(dllFile), zip); + zip.closeEntry(); + + FileUtils.deleteDirectory(dirPath); + } catch (InterruptedException e) { + log.error("DLL生成失败" + entity.getPyName(), e); + throw new RuntimeException(e); + } + } + } catch (IOException e) { + log.error("渲染模板失败,模型名称:" + entity.getPyName(), e); + throw new RuntimeException("渲染模板失败,模型名称:" + entity.getPyName(), e); + } + } + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, String moduleName, String pkgName, String pyModule) { + // java + if (template.equals("abstract.java.vm")) { + return pkgName.replace(".", File.separator) + File.separator + moduleName + ".java"; + } + if (template.equals("impl.java.vm")) { + return pkgName.replace(".", File.separator) + File.separator + MdkConstant.IMPL + File.separator + moduleName + "Impl.java"; + } + // c++ + if (template.equals("cpp.vm")) { + return pyModule.replace(".", File.separator) + File.separator + moduleName + ".cpp"; + } + if (template.equals("h.vm")) { + return pyModule.replace(".", File.separator) + File.separator + moduleName + ".h"; + } + // Jni c++ + if (template.equals("Jni.cpp.vm")) { + return pyModule.replace(".", File.separator) + File.separator + MdkConstant.JNI + File.separator + moduleName + "Jni.cpp"; + } + if (template.equals("Jni.h.vm")) { + return pyModule.replace(".", File.separator) + File.separator + MdkConstant.JNI + File.separator + moduleName + "Jni.h"; + } + return null; + } + + /** + * 渲染模板 + **/ + public static StringWriter drawTemplate(String template,Map<String, Object> map) { + //模板数据 + VelocityContext context = new VelocityContext(map); + return drawTemplate(template,context); + } + + public static StringWriter drawTemplate(String template,VelocityContext context) { + Properties prop = new Properties(); + prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + + StringWriter writer = new StringWriter(); + Template tpl = Velocity.getTemplate("template/" + template, "UTF-8"); + tpl.merge(context, writer); + return writer; + } + + public static void drawTemplate(String template,Map<String, Object> map,File toFile) throws IOException { + VelocityContext context = new VelocityContext(map); + drawTemplate(template,context,toFile); + } + + public static void drawTemplate(String template,VelocityContext context,File toFile) throws IOException { + StringWriter writer = drawTemplate(template,context); + + FileUtil.mkParentDirs(toFile); + + if (!toFile.exists()) { + toFile.createNewFile(); + } + + FileUtil.writeUtf8String(writer.toString(),toFile); + } +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/Readtxt.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/Readtxt.java new file mode 100644 index 0000000..fd3e96e --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/Readtxt.java @@ -0,0 +1,143 @@ +package com.iailab.module.model.mpk.common.utils; + + +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +/** + * @Auther: Forrest + * @Date: 2020/4/23 09:50 + * @Description: + */ +public class Readtxt { + public float[] read(String filePath, int filelength) { + float data[] = new float[filelength]; + try { + File file = new File(filePath); + if (file.isFile() && file.exists()) { + InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "utf-8"); + BufferedReader br = new BufferedReader(isr); + for (int i = 0; i < filelength; i++) + data[i] = Float.parseFloat(br.readLine()); + br.close(); + } else { + System.out.print("文件不存在"); + } + } catch (Exception e) { + System.out.println("文件读取错误"); + } + return data; + + } + + public float[] read1(String filePath, int filelength) { + float data[] = new float[filelength]; + try { + File file = new File(filePath); + if (file.isFile() && file.exists()) { + InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "utf-8"); + BufferedReader br = new BufferedReader(isr); + br.readLine(); + for (int i = 0; i < filelength; i++) + data[i] = Float.parseFloat(br.readLine()); + br.close(); + } else { + System.out.println("文件不存在"); + } + } catch (Exception e) { + System.out.println("文件读取错误"); + } + return data; + + } + + public double[][] readCSV(String filePath, int row, int col) { + double[][] res = new double[row][col]; + String line = null; + try { + //BufferedReader bufferedReader=new BufferedReader(new FileReader(filePath)); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "utf-8")); + + int i = 0; + while ((line = bufferedReader.readLine()) != null && i < row) { + //数据行 + String[] items = line.split(","); + for (int j = 0; j < col; j++) { + res[i][j] = Double.parseDouble(items[j]); + } + i++; + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + + return res; + } + + + public String[][] readCSVString(String filePath, int row, int col) { + String[][] res = new String[row][col]; + String line = null; + try { + //BufferedReader bufferedReader=new BufferedReader(new FileReader(filePath)); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "utf-8")); + + int i = 0; + while ((line = bufferedReader.readLine()) != null && i < row) { + //数据行 + String[] items = line.split("\t"); + for (int j = 0; j < col; j++) { + res[i][j] = items[j]; + } + i++; + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + + return res; + } + + public static List<double[][]> readMethodExcel(MultipartFile file) throws IOException { + Workbook workbook = WorkbookFactory.create(file.getInputStream()); + //获取工作薄里面sheet的个数 + int sheetNum = workbook.getNumberOfSheets(); + List<double[][]> datas = new ArrayList<>(sheetNum - 1); + //从第二个sheet开始读,第一个为示例 + for (int i = 1; i < sheetNum; i++) { + Sheet sheet = workbook.getSheetAt(i); + //获取sheet中有数据的行数 + int rows = sheet.getPhysicalNumberOfRows(); + double[][] doubles2 = new double[rows][]; + for (int j = 0; j < rows; j++) { + //获取每一行的数据 + Row row = sheet.getRow(j); + //得到每一行中有效单元格的数据 + short cells = row.getLastCellNum(); + //定义一个doubles数组用来存储读取单元格的数据 + double[] doubles1 = new double[cells]; + //遍历每一个有效的单元格数据 + for (int k = 0; k < cells; k++) { + //获取每一个单元格的数据 + Cell cell = row.getCell(k, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); + doubles1[k] = cell.getNumericCellValue(); + } + doubles2[j] = doubles1; + } + datas.add(doubles2); + } + + return datas; + } +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/GeneratorCodeHistoryController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/GeneratorCodeHistoryController.java new file mode 100644 index 0000000..fc2dee8 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/GeneratorCodeHistoryController.java @@ -0,0 +1,81 @@ +package com.iailab.module.model.mpk.controller.admin; + + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.module.model.mpk.dto.GeneratorCodeHistoryDTO; +import com.iailab.module.model.mpk.service.GeneratorCodeHistoryService; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +import static com.iailab.framework.common.pojo.CommonResult.success; + + +/** + * @description: 生成代码记录表 + * @author: dzd + * @date: 2024/8/20 11:49 + **/ +@RestController +@RequestMapping("/model/mpk/generatorCodeHistory") +public class GeneratorCodeHistoryController { + @Autowired + private GeneratorCodeHistoryService generatorCodeHistoryService; + + @GetMapping("page") + public CommonResult<PageData<GeneratorCodeHistoryDTO>> page(@RequestParam Map<String, Object> params){ + PageData<GeneratorCodeHistoryDTO> page = generatorCodeHistoryService.page(params); + + return success(page); + } + + @GetMapping("{id}") + public CommonResult<GeneratorCodeHistoryDTO> get(@PathVariable("id") Long id){ + GeneratorCodeHistoryDTO data = generatorCodeHistoryService.get(id); + + return success(data); + } + + @PostMapping + public CommonResult save(@RequestBody GeneratorCodeHistoryDTO dto){ + + generatorCodeHistoryService.save(dto); + + return CommonResult.success(); + } + + @PutMapping + public CommonResult update(@RequestBody GeneratorCodeHistoryDTO dto){ + + generatorCodeHistoryService.update(dto); + + return CommonResult.success(); + } + + @DeleteMapping + public CommonResult delete(@RequestBody Long[] ids){ + + generatorCodeHistoryService.delete(ids); + + return CommonResult.success(); + } + + @GetMapping("download") + public void generat(String id, HttpServletResponse response) throws IOException { + GeneratorCodeHistoryDTO dto = generatorCodeHistoryService.get(id); + byte[] data = generatorCodeHistoryService.download(dto); + + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=\"" + dto.getFileName() + "\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + + IOUtils.write(data, response.getOutputStream()); + } + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java new file mode 100644 index 0000000..f9bfa10 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java @@ -0,0 +1,106 @@ +package com.iailab.module.model.mpk.controller.admin; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.converters.longconverter.LongStringConverter; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.iailab.framework.common.enums.CommonStatusEnum; +import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.excel.core.handler.SelectSheetWriteHandler; +import com.iailab.framework.excel.core.util.ExcelUtils; +import com.iailab.module.model.mpk.common.utils.Readtxt; +import com.iailab.module.model.mpk.dto.MdkDTO; +import com.iailab.module.system.enums.common.SexEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.Method; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.*; + +import static com.iailab.framework.common.pojo.CommonResult.error; +import static com.iailab.framework.common.pojo.CommonResult.success; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年08月08日 + */ +@RestController +@RequestMapping("/model/mpk/api") +public class MdkController { + @PostMapping("run") + public CommonResult<String> run(@RequestBody MdkDTO dto) { + System.out.println("runTime=" + System.currentTimeMillis()); + try { + List<String> datas = dto.getDatas(); + + int paramLength = dto.getHasModel() ? datas.size() + 2 : datas.size() + 1; + Object[] paramsValueArray = new Object[paramLength]; + Class<?>[] paramsArray = new Class[paramLength]; + + try { + for (int i = 0; i < datas.size(); i++) { + String json = datas.get(i); + JSONArray jsonArray = JSON.parseArray(json); + double[][] data = new double[jsonArray.size()][jsonArray.getJSONArray(0).size()]; + for (int j = 0; j < jsonArray.size(); j++) { + for (int k = 0; k < jsonArray.getJSONArray(j).size(); k++) { + data[j][k] = jsonArray.getJSONArray(j).getDoubleValue(k); + } + } + paramsValueArray[i] = data; + paramsArray[i] = double[][].class; + } + } catch (Exception e) { + e.printStackTrace(); + return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"参数错误,请检查!"); + } + + if (dto.getHasModel()) { + paramsValueArray[datas.size()] = dto.getModel(); + paramsValueArray[datas.size() + 1] = dto.getModelSettings(); + paramsArray[datas.size()] = HashMap.class; + paramsArray[datas.size() + 1] = HashMap.class; + }else { + paramsValueArray[datas.size()] = dto.getModelSettings(); + paramsArray[datas.size()] = HashMap.class; + } + + Class<?> clazz = Class.forName(dto.getClassName()); + Method method = clazz.getMethod(dto.getMethodName(), paramsArray); + HashMap result = (HashMap)method.invoke(clazz.newInstance(), paramsValueArray); + return success(JSON.toJSONString(result)); + } catch (Exception ex) { + ex.printStackTrace(); + return error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"运行异常"); + } finally { + System.gc(); + } + } + + @PostMapping("/import") + @Operation(summary = "导入参数") + public CommonResult<List<String>> importExcel(@RequestParam("file") MultipartFile file) throws Exception { + List<double[][]> datas = Readtxt.readMethodExcel(file); + List<String> result = new ArrayList<>(); + if (!CollectionUtils.isEmpty(datas)) { + for (double[][] data : datas) { + if (data.length > 0) { + result.add(JSON.toJSONString(data)); + } + } + } + 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/mpk/controller/admin/MpkFileController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MpkFileController.java new file mode 100644 index 0000000..bba6bb7 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MpkFileController.java @@ -0,0 +1,110 @@ +package com.iailab.module.model.mpk.controller.admin; + +import com.alibaba.fastjson.JSON; +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.util.date.DateUtils; +import com.iailab.module.model.mpk.common.utils.Readtxt; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import com.iailab.module.model.mpk.service.MdkFileService; +import io.swagger.v3.oas.annotations.Operation; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.*; + +import static com.iailab.framework.common.pojo.CommonResult.success; + +/** + * @author dzd + * @Description + * @createTime 2024年08月14日 + */ +@RestController +@RequestMapping("/model/mpk/file") +public class MpkFileController { + @Autowired + private MdkFileService mdkFileService; + + @GetMapping("page") + @Operation(summary = "分页") + public CommonResult<PageData<MpkFileDTO>> page(@RequestParam Map<String, Object> params) { + PageData<MpkFileDTO> page = mdkFileService.page(params); + + return success(page); + } + + @GetMapping("{id}") + public CommonResult<MpkFileDTO> info(@PathVariable("id") String id) { + MpkFileDTO schedule = mdkFileService.get(id); + + return success(schedule); + } + + @GetMapping("list") + public CommonResult<List<MpkFileDTO>> list() { + List<MpkFileDTO> list = mdkFileService.list(new HashMap<>()); + + return success(list); + } + + @PostMapping + public CommonResult save(@RequestBody MpkFileDTO dto) { + mdkFileService.save(dto); + return CommonResult.success(); + } + + @DeleteMapping + public CommonResult delete(String id) { + mdkFileService.delete(id); + return CommonResult.success(); + } + + @PutMapping + public CommonResult update(@RequestBody MpkFileDTO dto) { + mdkFileService.update(dto); + return CommonResult.success(); + } + + @GetMapping("generat") + public void generat(String id, String remark,String zipFileName, HttpServletResponse response) throws IOException { + byte[] data = mdkFileService.generatorCode(id, remark,zipFileName); + + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(zipFileName, "UTF-8") + "\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + + IOUtils.write(data, response.getOutputStream()); + } + + @GetMapping("packageModel") + public void packageModel(String ids ,String projectId,String log ,String projectName,String version,String zipFileName,HttpServletResponse response) throws IOException { + byte[] data; + try { + data = mdkFileService.packageModel(Arrays.asList(ids.split(",")),projectId,projectName,zipFileName,log,version); + } catch (InterruptedException e) { + throw new RuntimeException("模型打包失败",e); + } + + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(zipFileName, "UTF-8") + "\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + + IOUtils.write(data, response.getOutputStream()); + } + + @PostMapping("/upload") + @Operation(summary = "python文件上传") + public CommonResult<Map<String,String>> importExcel(@RequestParam("file") MultipartFile file) throws Exception { + Map<String,String> result = mdkFileService.savePyFile(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/mpk/controller/admin/ProjectController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/ProjectController.java new file mode 100644 index 0000000..7110831 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/ProjectController.java @@ -0,0 +1,82 @@ +package com.iailab.module.model.mpk.controller.admin; + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import com.iailab.module.model.mpk.dto.ProjectDTO; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryModelDTO; +import com.iailab.module.model.mpk.service.ProjectService; +import org.springframework.beans.factory.annotation.Autowired; +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/mpk/project") +public class ProjectController { + @Autowired + private ProjectService projectService; + + @GetMapping("page") + public CommonResult<PageData<ProjectDTO>> page(@RequestParam Map<String, Object> params){ + PageData<ProjectDTO> page = projectService.page(params); + + return success(page); + } + + @GetMapping("list") + public CommonResult<List<ProjectDTO>> list() { + List<ProjectDTO> list = projectService.list(new HashMap<>()); + + return success(list); + } + + @GetMapping("{id}") + public CommonResult<ProjectDTO> get(@PathVariable("id") String id){ + ProjectDTO data = projectService.get(id); + + return success(data); + } + + @PostMapping + public CommonResult save(@RequestBody ProjectDTO dto){ + projectService.save(dto); + + return CommonResult.success(); + } + + @PutMapping + public CommonResult update(@RequestBody ProjectDTO dto){ + dto.setUpdateTime(new Date()); + projectService.update(dto); + + return CommonResult.success(); + } + + @DeleteMapping + public CommonResult delete(String id){ + + projectService.delete(id); + + return CommonResult.success(); + } + + @GetMapping("getProjectModel") + public CommonResult<PageData<MpkFileDTO>> getProjectModel(@RequestParam Map<String, Object> params){ + PageData<MpkFileDTO> page = projectService.getProjectModel(params); + + return CommonResult.success(page); + } + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/ProjectPackageHistoryController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/ProjectPackageHistoryController.java new file mode 100644 index 0000000..4749518 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/ProjectPackageHistoryController.java @@ -0,0 +1,60 @@ +package com.iailab.module.model.mpk.controller.admin; + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryDTO; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryModelDTO; +import com.iailab.module.model.mpk.service.ProjectPackageHistoryModelService; +import com.iailab.module.model.mpk.service.ProjectPackageHistoryService; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.List; +import java.util.Map; + + +/** + * 项目打包历史记录表 + * + * @author Dzd + * @since 1.0.0 2024-08-22 + */ +@RestController +@RequestMapping("/model/mpk/projectPackageHistory") +public class ProjectPackageHistoryController { + @Autowired + private ProjectPackageHistoryService projectPackageHistoryService; + @Autowired + private ProjectPackageHistoryModelService projectPackageHistoryModelService; + + @GetMapping("page") + public CommonResult<PageData<ProjectPackageHistoryDTO>> page(@RequestParam Map<String, Object> params){ + PageData<ProjectPackageHistoryDTO> page = projectPackageHistoryService.page(params); + + return CommonResult.success(page); + } + + @GetMapping("download") + public void generat(String filePath, String fileName, HttpServletResponse response) throws IOException { + byte[] data = projectPackageHistoryService.download(filePath); + + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName,"utf-8") + "\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + + IOUtils.write(data, response.getOutputStream()); + } + + @GetMapping("getPackageModel") + public CommonResult<PageData<ProjectPackageHistoryModelDTO>> getPackageModel(@RequestParam Map<String, Object> params){ + PageData<ProjectPackageHistoryModelDTO> page = projectPackageHistoryModelService.page(params); + + return CommonResult.success(page); + } + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/GeneratorCodeHistoryDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/GeneratorCodeHistoryDao.java new file mode 100644 index 0000000..806b573 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/GeneratorCodeHistoryDao.java @@ -0,0 +1,15 @@ +package com.iailab.module.model.mpk.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.module.model.mpk.entity.GeneratorCodeHistoryEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @description: 生成代码记录表 + * @author: dzd + * @date: 2024/8/20 11:49 + **/ +@Mapper +public interface GeneratorCodeHistoryDao extends BaseDao<GeneratorCodeHistoryEntity> { + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ModelMethodDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ModelMethodDao.java new file mode 100644 index 0000000..8e096fe --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ModelMethodDao.java @@ -0,0 +1,14 @@ +package com.iailab.module.model.mpk.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.module.model.mpk.entity.ModelMethodEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @description: + * @author: dzd + * @date: 2024/9/9 10:55 + **/ +@Mapper +public interface ModelMethodDao extends BaseDao<ModelMethodEntity> { +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/MpkFileDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/MpkFileDao.java new file mode 100644 index 0000000..793f50b --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/MpkFileDao.java @@ -0,0 +1,31 @@ +package com.iailab.module.model.mpk.dao; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import com.iailab.module.model.mpk.dto.ProjectDTO; +import com.iailab.module.model.mpk.entity.MpkFileEntity; +import com.iailab.module.model.mpk.entity.ProjectEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * MDK模型文件 + * + * @author PanZhibao + * @Description + * @createTime 2024年08月14日 + */ +@Mapper +public interface MpkFileDao extends BaseDao<MpkFileEntity> { + MpkFileDTO get(String id); + + List<MpkFileDTO> selectByIds(@Param("ids") List<String> ids); + + int getProjectModelCount(String projectId); + + List<MpkFileDTO> getProjectModel(@Param("params") Map<String, Object> params); +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectDao.java new file mode 100644 index 0000000..7e2b698 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectDao.java @@ -0,0 +1,21 @@ +package com.iailab.module.model.mpk.dao; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.module.model.mpk.dto.ProjectDTO; +import com.iailab.module.model.mpk.entity.ProjectEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Mapper +public interface ProjectDao extends BaseDao<ProjectEntity> { + + IPage<ProjectDTO> getPageList(IPage<ProjectEntity> page, @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/mpk/dao/ProjectModelDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectModelDao.java new file mode 100644 index 0000000..145b864 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectModelDao.java @@ -0,0 +1,15 @@ +package com.iailab.module.model.mpk.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.module.model.mpk.entity.ProjectModelEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Mapper +public interface ProjectModelDao extends BaseDao<ProjectModelEntity> { + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectPackageHistoryDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectPackageHistoryDao.java new file mode 100644 index 0000000..d9abf60 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectPackageHistoryDao.java @@ -0,0 +1,16 @@ +package com.iailab.module.model.mpk.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 项目打包历史记录表 + * + * @author Dzd + * @since 1.0.0 2024-08-22 + */ +@Mapper +public interface ProjectPackageHistoryDao extends BaseDao<ProjectPackageHistoryEntity> { + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectPackageHistoryModelDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectPackageHistoryModelDao.java new file mode 100644 index 0000000..35cc692 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dao/ProjectPackageHistoryModelDao.java @@ -0,0 +1,15 @@ +package com.iailab.module.model.mpk.dao; + +import com.iailab.framework.common.dao.BaseDao; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryModelEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Mapper +public interface ProjectPackageHistoryModelDao extends BaseDao<ProjectPackageHistoryModelEntity> { + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/GeneratorCodeHistoryDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/GeneratorCodeHistoryDTO.java new file mode 100644 index 0000000..e2d9c9c --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/GeneratorCodeHistoryDTO.java @@ -0,0 +1,47 @@ +package com.iailab.module.model.mpk.dto; + +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @description: 生成代码记录表 + * @author: dzd + * @date: 2024/8/20 11:36 + **/ +@Data +public class GeneratorCodeHistoryDTO implements Serializable { + + /** + * id + */ + @TableId + private String id; + + /** + * mdk_id + */ + private String mdkId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 文件保存路径 + */ + private String filePath; + + /** + * 备注 + */ + private String remark; + + /** + * 生成时间 + */ + private Date createTime; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/MdkDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/MdkDTO.java new file mode 100644 index 0000000..ce6b964 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/MdkDTO.java @@ -0,0 +1,29 @@ +package com.iailab.module.model.mpk.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年08月08日 + */ +@Data +public class MdkDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String className; + + private String methodName; + + private Boolean hasModel; + + private HashMap<String, Object> model; + + private HashMap<String, Object> modelSettings; + + private List<String> datas; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ModelMethodDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ModelMethodDTO.java new file mode 100644 index 0000000..44681c3 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ModelMethodDTO.java @@ -0,0 +1,27 @@ +package com.iailab.module.model.mpk.dto; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @description: MPK模型方法 + * @author: dzd + * @date: 2024/9/9 10:52 + **/ +@Data +public class ModelMethodDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String mpkFileId; + + private String methodName; + + private Integer dataLength; + + private Integer model; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/MpkFileDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/MpkFileDTO.java new file mode 100644 index 0000000..815a5ad --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/MpkFileDTO.java @@ -0,0 +1,44 @@ +package com.iailab.module.model.mpk.dto; + +import com.iailab.module.model.mpk.entity.ModelMethodEntity; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年08月14日 + */ +@Data +public class MpkFileDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String pyName; + + private String filePath; + + private String pyType; + + private String pkgName; + + private String className; + + private String pyModule; + + private String remark; + + private Long updater; + + private Date updateDate; + + private Long creator; + + private Date createDate; + + private List<ModelMethodEntity> modelMethods; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectDTO.java new file mode 100644 index 0000000..ccb7fb0 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectDTO.java @@ -0,0 +1,32 @@ +package com.iailab.module.model.mpk.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 ProjectDTO 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<MpkFileDTO> models; + + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectModelDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectModelDTO.java new file mode 100644 index 0000000..323860d --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectModelDTO.java @@ -0,0 +1,24 @@ +package com.iailab.module.model.mpk.dto; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * @description: 项目模型关联表 + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Data +public class ProjectModelDTO 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/mpk/dto/ProjectPackageHistoryDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectPackageHistoryDTO.java new file mode 100644 index 0000000..e6c0d7c --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectPackageHistoryDTO.java @@ -0,0 +1,36 @@ +package com.iailab.module.model.mpk.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 项目打包历史记录表 + * + * @author Dzd + * @since 1.0.0 2024-08-22 + */ +@Data +public class ProjectPackageHistoryDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String projectId; + + private String fileName; + + private String filePath; + + private String log; + + private String version; + + private String modelNames; + + private Date createTime; + + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectPackageHistoryModelDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectPackageHistoryModelDTO.java new file mode 100644 index 0000000..f036a59 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/dto/ProjectPackageHistoryModelDTO.java @@ -0,0 +1,50 @@ +package com.iailab.module.model.mpk.dto; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * @description: 打包历史模型关联表 + * @author: dzd + * @date: 2024/9/11 11:38 + **/ +@Data +public class ProjectPackageHistoryModelDTO implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private String id; + /** + * 项目id + */ + private String projectId; + /** + * 打包历史id + */ + private String packageHistoryId; + /** + * 模型名称 + */ + private String pyName; + /** + * 包名 + */ + private String pkgName; + /** + * 模型路径 + */ + private String pyModule; + /** + * 备注 + */ + private String remark; + /** + * 模型方法信息 + */ + private String methodInfo; + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/GeneratorCodeHistoryEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/GeneratorCodeHistoryEntity.java new file mode 100644 index 0000000..b783144 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/GeneratorCodeHistoryEntity.java @@ -0,0 +1,49 @@ +package com.iailab.module.model.mpk.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @description: 生成代码记录表 + * @author: dzd + * @date: 2024/8/20 11:36 + **/ +@Data +@TableName("t_mpk_generator_code_history") +public class GeneratorCodeHistoryEntity implements Serializable { + + /** + * id + */ + @TableId + private String id; + + /** + * mdk_id + */ + private String mdkId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 文件保存路径 + */ + private String filePath; + + /** + * 备注 + */ + private String remark; + + /** + * 生成时间 + */ + private Date createTime; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ModelMethodEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ModelMethodEntity.java new file mode 100644 index 0000000..117b220 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ModelMethodEntity.java @@ -0,0 +1,46 @@ +package com.iailab.module.model.mpk.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @description: MPK模型方法 + * @author: dzd + * @date: 2024/9/9 10:52 + **/ +@Data +@TableName("t_mpk_model_method") +public class ModelMethodEntity implements Serializable { + + /** + * id + */ + @TableId + private String id; + + /** + * 模型文件id + */ + private String mpkFileId; + + /** + * 模型方法名 + */ + private String methodName; + + /** + * 输入个数 + */ + private Integer dataLength; + + /** + * 是否有model(0:否,1:是) + */ + private Integer model; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/MpkFileEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/MpkFileEntity.java new file mode 100644 index 0000000..146a966 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/MpkFileEntity.java @@ -0,0 +1,85 @@ +package com.iailab.module.model.mpk.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * MPK模型文件 + * + * @author PanZhibao + * @Description + * @createTime 2024年08月14日 + */ +@Data +@TableName("t_mpk_file") +public class MpkFileEntity implements Serializable { + + /** + * id + */ + @TableId + private String id; + + /** + * 模型名称 + */ + private String pyName; + + /** + * 源文件保存路径 + */ + private String filePath; + + /** + * 模型类型 + */ + private String pyType; + + /** + * 包名 + */ + private String pkgName; + + /** + * 类名 + */ + private String className; + + /** + * 模型路径 + */ + private String pyModule; + + /** + * 备注 + */ + 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/mpk/entity/ProjectEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectEntity.java new file mode 100644 index 0000000..a8b5f2f --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectEntity.java @@ -0,0 +1,37 @@ +package com.iailab.module.model.mpk.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * @description: 项目表 + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Data +@TableName("t_mpk_project") +public class ProjectEntity { + + /** + * 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/mpk/entity/ProjectModelEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectModelEntity.java new file mode 100644 index 0000000..d1bdfa9 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectModelEntity.java @@ -0,0 +1,27 @@ +package com.iailab.module.model.mpk.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * @description: 项目模型关联表 + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Data +@TableName("t_mpk_project_model") +public class ProjectModelEntity { + + /** + * 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/mpk/entity/ProjectPackageHistoryEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectPackageHistoryEntity.java new file mode 100644 index 0000000..8960827 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectPackageHistoryEntity.java @@ -0,0 +1,50 @@ +package com.iailab.module.model.mpk.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 项目打包历史记录表 + * + * @author Dzd + * @since 1.0.0 2024-08-22 + */ +@Data +@TableName("t_mpk_project_package_history") +public class ProjectPackageHistoryEntity { + + /** + * id + */ + private String id; + /** + * 项目id + */ + private String projectId; + /** + * 文件名 + */ + private String fileName; + /** + * 文件路径 + */ + private String filePath; + /** + * 更新日志 + */ + private String log; + /** + * 版本号 + */ + private String version; + /** + * 打包模型名称(“,”分割) + */ + private String modelNames; + /** + * 创建时间 + */ + private Date createTime; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectPackageHistoryModelEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectPackageHistoryModelEntity.java new file mode 100644 index 0000000..faf5c30 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/entity/ProjectPackageHistoryModelEntity.java @@ -0,0 +1,47 @@ +package com.iailab.module.model.mpk.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * @description: 打包历史模型关联表 + * @author: dzd + * @date: 2024/9/11 11:38 + **/ +@Data +@TableName("t_mpk_project_package_history_model") +public class ProjectPackageHistoryModelEntity { + + /** + * id + */ + private String id; + /** + * 项目id + */ + private String projectId; + /** + * 打包历史id + */ + private String packageHistoryId; + /** + * 模型名称 + */ + private String pyName; + /** + * 包名 + */ + private String pkgName; + /** + * 模型路径 + */ + private String pyModule; + /** + * 备注 + */ + private String remark; + /** + * 模型方法信息 + */ + private String methodInfo; +} \ 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/GeneratorCodeHistoryService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/GeneratorCodeHistoryService.java new file mode 100644 index 0000000..5b08c31 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/GeneratorCodeHistoryService.java @@ -0,0 +1,25 @@ +package com.iailab.module.model.mpk.service; + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.service.CrudService; +import com.iailab.module.model.mpk.dto.GeneratorCodeHistoryDTO; +import com.iailab.module.model.mpk.entity.GeneratorCodeHistoryEntity; + +import java.io.IOException; +import java.util.Map; + +/** + * @description: 生成代码记录表 + * @author: dzd + * @date: 2024/8/20 11:49 + **/ +public interface GeneratorCodeHistoryService extends CrudService<GeneratorCodeHistoryEntity, GeneratorCodeHistoryDTO> { + + PageData<GeneratorCodeHistoryDTO> page(Map<String, Object> params); + + GeneratorCodeHistoryDTO get(String id); + + byte[] download(GeneratorCodeHistoryDTO dto) throws IOException; + + void deleteByMap(Map<String, Object> map); +} \ 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/MdkFileService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MdkFileService.java new file mode 100644 index 0000000..9f684a4 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MdkFileService.java @@ -0,0 +1,37 @@ +package com.iailab.module.model.mpk.service; + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.service.BaseService; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import com.iailab.module.model.mpk.entity.MpkFileEntity; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年08月14日 + */ +public interface MdkFileService extends BaseService<MpkFileEntity> { + + PageData<MpkFileDTO> page(Map<String, Object> params); + + List<MpkFileDTO> list(Map<String, Object> params); + + MpkFileDTO get(String id); + + void save(MpkFileDTO dto); + + void update(MpkFileDTO dto); + + void delete(String id); + + byte[] generatorCode(String id, String remark, String zipFileName); + + byte[] packageModel(List<String> ids,String projectId,String projectName,String fileName,String log,String version) throws IOException, InterruptedException; + + Map<String,String> savePyFile(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/mpk/service/ModelMethodService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ModelMethodService.java new file mode 100644 index 0000000..db5616d --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ModelMethodService.java @@ -0,0 +1,16 @@ +package com.iailab.module.model.mpk.service; + +import com.iailab.framework.common.service.BaseService; +import com.iailab.module.model.mpk.entity.ModelMethodEntity; + +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/9/9 10:51 + **/ +public interface ModelMethodService extends BaseService<ModelMethodEntity> { + + void deleteByMap(Map<String, Object> map); +} \ 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/ProjectModelService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectModelService.java new file mode 100644 index 0000000..e4645c8 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectModelService.java @@ -0,0 +1,20 @@ +package com.iailab.module.model.mpk.service; + +import com.iailab.framework.common.service.CrudService; +import com.iailab.module.model.mpk.dto.ProjectModelDTO; +import com.iailab.module.model.mpk.entity.ProjectModelEntity; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +public interface ProjectModelService extends CrudService<ProjectModelEntity, ProjectModelDTO> { + + List<ProjectModelDTO> list(Map<String, Object> params); + + void deleteByMap(Map<String,Object> map); +} \ 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/ProjectPackageHistoryModelService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectPackageHistoryModelService.java new file mode 100644 index 0000000..c95c742 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectPackageHistoryModelService.java @@ -0,0 +1,21 @@ +package com.iailab.module.model.mpk.service; + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.service.CrudService; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryModelDTO; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryModelEntity; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/9/11 11:39 + **/ +public interface ProjectPackageHistoryModelService extends CrudService<ProjectPackageHistoryModelEntity, ProjectPackageHistoryModelDTO> { + + PageData<ProjectPackageHistoryModelDTO> page(Map<String, Object> params); + + void deleteByMap(Map<String,Object> map); +} \ 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/ProjectPackageHistoryService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectPackageHistoryService.java new file mode 100644 index 0000000..a927579 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectPackageHistoryService.java @@ -0,0 +1,23 @@ +package com.iailab.module.model.mpk.service; + +import com.iailab.framework.common.service.CrudService; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryDTO; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryModelDTO; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryEntity; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * 项目打包历史记录表 + * + * @author Dzd + * @since 1.0.0 2024-08-22 + */ +public interface ProjectPackageHistoryService extends CrudService<ProjectPackageHistoryEntity, ProjectPackageHistoryDTO> { + + byte[] download(String filePath) throws IOException; + + void deleteByMap(Map<String, Object> map); +} \ 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/ProjectService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectService.java new file mode 100644 index 0000000..aba997f --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/ProjectService.java @@ -0,0 +1,31 @@ +package com.iailab.module.model.mpk.service; + +import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.service.CrudService; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import com.iailab.module.model.mpk.dto.ProjectDTO; +import com.iailab.module.model.mpk.entity.ProjectEntity; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +public interface ProjectService extends CrudService<ProjectEntity, ProjectDTO> { + PageData<ProjectDTO> page(Map<String, Object> params); + + List<ProjectDTO> list(Map<String, Object> params); + + ProjectDTO get(String id); + + void save(ProjectDTO dto); + + void update(ProjectDTO dto); + + void delete(String id); + + PageData<MpkFileDTO> 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/mpk/service/impl/GeneratorCodeHistoryServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/GeneratorCodeHistoryServiceImpl.java new file mode 100644 index 0000000..96fb903 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/GeneratorCodeHistoryServiceImpl.java @@ -0,0 +1,77 @@ +package com.iailab.module.model.mpk.service.impl; + +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.service.impl.CrudServiceImpl; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.model.mpk.dao.GeneratorCodeHistoryDao; +import com.iailab.module.model.mpk.dto.GeneratorCodeHistoryDTO; +import com.iailab.module.model.mpk.entity.GeneratorCodeHistoryEntity; +import com.iailab.module.model.mpk.service.GeneratorCodeHistoryService; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +/** + * @description: 生成代码记录表 + * @author: dzd + * @date: 2024/8/20 11:49 + **/ + +@Service +public class GeneratorCodeHistoryServiceImpl extends CrudServiceImpl<GeneratorCodeHistoryDao, GeneratorCodeHistoryEntity, GeneratorCodeHistoryDTO> implements GeneratorCodeHistoryService { + + @Override + public PageData<GeneratorCodeHistoryDTO> page(Map<String, Object> params) { + IPage<GeneratorCodeHistoryEntity> page = baseDao.selectPage( + getPage(params, "create_time", false), + getWrapper(params) + ); + + return getPageData(page, GeneratorCodeHistoryDTO.class); + } + + @Override + public GeneratorCodeHistoryDTO get(String id) { + GeneratorCodeHistoryEntity entity = baseDao.selectById(id); + + return ConvertUtils.sourceToTarget(entity, GeneratorCodeHistoryDTO.class); + } + + @Override + public byte[] download(GeneratorCodeHistoryDTO dto) throws IOException { + File file = new File(dto.getFilePath()); + if (!file.exists()) { + log.error("文件不存在,路径:" + dto.getFilePath()); + } + return FileUtils.readFileToByteArray(file); + } + + @Override + public void deleteByMap(Map<String, Object> map) { + baseDao.delete(getWrapper(map)); + } + + @Override + public QueryWrapper<GeneratorCodeHistoryEntity> getWrapper(Map<String, Object> params){ + String id = (String)params.get("id"); + String mdkId = (String)params.get("mdkId"); + String startTime = (String)params.get("startTime"); + String endTime = (String)params.get("endTime"); + + QueryWrapper<GeneratorCodeHistoryEntity> wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), "id", id); + wrapper.eq(StringUtils.isNotBlank(mdkId), "mdk_id", mdkId); + wrapper.ge(StringUtils.isNotBlank(startTime), "create_time", startTime); + wrapper.le(StringUtils.isNotBlank(endTime), "create_time", endTime); + + 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/MdkFileServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MdkFileServiceImpl.java new file mode 100644 index 0000000..89110ec --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MdkFileServiceImpl.java @@ -0,0 +1,436 @@ +package com.iailab.module.model.mpk.service.impl; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.RuntimeUtil; +import cn.hutool.core.util.ZipUtil; +import com.alibaba.fastjson.JSON; +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.service.impl.BaseServiceImpl; +import com.iailab.framework.common.util.date.DateUtils; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.framework.security.core.util.SecurityFrameworkUtils; +import com.iailab.module.infra.api.config.ConfigApi; +import com.iailab.module.model.mpk.common.MdkConstant; +import com.iailab.module.model.mpk.common.utils.GenUtils; +import com.iailab.module.model.mpk.dao.MpkFileDao; +import com.iailab.module.model.mpk.dto.GeneratorCodeHistoryDTO; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryDTO; +import com.iailab.module.model.mpk.entity.GeneratorCodeHistoryEntity; +import com.iailab.module.model.mpk.entity.ModelMethodEntity; +import com.iailab.module.model.mpk.entity.MpkFileEntity; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryModelEntity; +import com.iailab.module.model.mpk.service.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.util.*; +import java.util.stream.Collectors; +import java.util.zip.ZipOutputStream; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年08月14日 + */ +@Slf4j +@Service +public class MdkFileServiceImpl extends BaseServiceImpl<MpkFileDao, MpkFileEntity> implements MdkFileService { + + @Autowired + private GeneratorCodeHistoryService generatorCodeHistoryService; + @Autowired + private ProjectModelService projectModelService; + @Autowired + private ProjectPackageHistoryService projectPackageHistoryService; + @Autowired + private ModelMethodService modelMethodService; + @Autowired + private ProjectPackageHistoryModelService projectPackageHistoryModelService; + + @Autowired + private ConfigApi configApi; + + private String mpkBakFilePath; + + @PostConstruct + public void init() { + mpkBakFilePath = configApi.getConfigValueByKey("mpkBakFilePath").getCheckedData(); + } + + @Override + public PageData<MpkFileDTO> page(Map<String, Object> params) { + IPage<MpkFileEntity> page = baseDao.selectPage( + getPage(params, "create_date", false), + getWrapper(params) + ); + + return getPageData(page, MpkFileDTO.class); + } + + @Override + public List<MpkFileDTO> list(Map<String, Object> params) { + List<MpkFileEntity> entityList = baseDao.selectList(getWrapper(params).orderByDesc("create_date")); + + return ConvertUtils.sourceToTarget(entityList, MpkFileDTO.class); + } + + private QueryWrapper<MpkFileEntity> getWrapper(Map<String, Object> params){ + String pyName = (String) params.get("pyName"); + String pyType = (String) params.get("pyType"); + String remark = (String) params.get("remark"); + + QueryWrapper<MpkFileEntity> wrapper = new QueryWrapper<>(); + wrapper.like(StringUtils.isNotBlank(pyName), "py_name", pyName) + .eq(StringUtils.isNotBlank(pyType), "py_type", pyType) + .like(StringUtils.isNotBlank(remark), "remark", remark); + return wrapper; + } + + @Override + public MpkFileDTO get(String id) { + MpkFileDTO entity = baseDao.get(id); + + return entity; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(MpkFileDTO dto) { + MpkFileEntity entity = ConvertUtils.sourceToTarget(dto, MpkFileEntity.class); + String mpkId = UUID.randomUUID().toString(); + entity.setId(mpkId); + entity.setCreator(SecurityFrameworkUtils.getLoginUserId()); + entity.setCreateDate(new Date()); + insert(entity); + + // 添加模型方法 + insertModelMethod(dto.getModelMethods(),mpkId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(MpkFileDTO dto) { + MpkFileEntity entity = ConvertUtils.sourceToTarget(dto, MpkFileEntity.class); + entity.setUpdater(SecurityFrameworkUtils.getLoginUserId()); + entity.setUpdateDate(new Date()); + updateById(entity); + + String mpkId = dto.getId(); + // 删除模型方法 + deleteModelMethod(mpkId); + + // 添加模型方法 + insertModelMethod(dto.getModelMethods(),mpkId); + } + + private void insertModelMethod(List<ModelMethodEntity> modelMethods,String mpkId) { + if (!CollectionUtils.isEmpty(modelMethods)) { + modelMethods.forEach(e -> { + e.setId(UUID.randomUUID().toString()); + e.setMpkFileId(mpkId); + }); + modelMethodService.insertBatch(modelMethods); + } + } + private void deleteModelMethod(String mpkId) { + Map<String,Object> map = new HashMap<>(); + map.put("mpkFileId", mpkId); + modelMethodService.deleteByMap(map); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String id) { + + //删除源文件 + MpkFileEntity mpkFileEntity = selectById(id); + if (StringUtils.isNoneBlank(mpkFileEntity.getFilePath())) { + File mpkFile = new File(mpkFileEntity.getFilePath()); + if (mpkFile.exists()) { + mpkFile.delete(); + log.info("删除源文件备份文件:" + mpkFileEntity.getFilePath()); + } + } + + //删除 + deleteById(id); + + //删除备份文件 + Map<String,Object> map1 = new HashMap<>(); + map1.put("mdkId",id); + List<GeneratorCodeHistoryDTO> list = generatorCodeHistoryService.list(map1); + list.forEach(e -> { + File file = new File(e.getFilePath()); + if (file.exists()) { + file.delete(); + log.info("删除生成代码备份文件:" + e.getFilePath()); + } + }); + + //删除生成历史 + + generatorCodeHistoryService.deleteByMap(map1); + + //删除关联项目 + Map<String,Object> map = new HashMap<>(); + map.put("modelId",id); + projectModelService.deleteByMap(map); + + //删除模型方法 + deleteModelMethod(id); + + } + + @Override + public byte[] generatorCode(String id, String remark, String zipFileName) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + + MpkFileDTO entity = baseDao.get(id); + //生成代码 + GenUtils.generatorCode(entity, zip); + IOUtils.closeQuietly(zip); + + File file = null; + OutputStream fileOutputStream = null; + //文件备份 + try { + String dirPath = mpkBakFilePath; + File dir = new File(dirPath); + if (!dir.exists()) { + dir.mkdirs(); + } + String filePath = dirPath + File.separator + zipFileName; + file = new File(filePath); + file.createNewFile(); + fileOutputStream = Files.newOutputStream(file.toPath()); + IOUtils.write(outputStream.toByteArray(), fileOutputStream); + } catch (IOException e) { + log.error("生成代码文件备份失败," + entity.getPyName(), e); + throw new RuntimeException(e); + } finally { + IOUtils.closeQuietly(fileOutputStream); + } + + //代码生成历史记录 + GeneratorCodeHistoryEntity historyEntity = new GeneratorCodeHistoryEntity(); + historyEntity.setId(UUID.randomUUID().toString()); + historyEntity.setMdkId(id); + historyEntity.setFileName(file.getName()); + historyEntity.setFilePath(file.getAbsolutePath()); + historyEntity.setRemark(remark); + historyEntity.setCreateTime(new Date()); + generatorCodeHistoryService.insert(historyEntity); + + return outputStream.toByteArray(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public byte[] packageModel(List<String> ids,String projectId,String projectName,String zipFileName,String log,String version) throws IOException, InterruptedException { + List<MpkFileDTO> entities = baseDao.selectByIds(ids); + + //模板数据 + Map<String, Object> map = new HashMap<>(); + map.put("entities",entities); + VelocityContext context = new VelocityContext(map); + + //临时文件夹 + File dirPath = new File("C:/DLUT/tmp/"); + if (!dirPath.exists()) { + dirPath.mkdirs(); + } + + //设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + + //生成cpp文件 + File cppFile = new File(dirPath.getAbsolutePath() + File.separator + UUID.randomUUID() + ".cpp"); + GenUtils.drawTemplate("pkg.cpp.vm",context,cppFile); + + //生成Jni.cpp文件 + File jniCppFile = new File(dirPath.getAbsolutePath() + File.separator + UUID.randomUUID() + "Jni.cpp"); + GenUtils.drawTemplate("pkg.Jni.cpp.vm",context,jniCppFile); + + //生成dll文件 + String dllSavePath = dirPath.getAbsolutePath() + File.separator + "IAIL.MDK.Mid.Windows.dll"; + String cppFilePath = cppFile.getAbsolutePath(); + String jniCppFilePath = jniCppFile.getAbsolutePath(); +// String command = "cmd.exe /c cl -o " + dllSavePath + " /LD " + jniCppFilePath + " " + cppFilePath; + String command = "cmd.exe /c cl -o " + dllSavePath + " /LD D:\\work\\mdk\\code\\makeDll\\src\\main\\java\\org\\example\\MakeDll.c D:\\work\\mdk\\code\\makeDll\\src\\main\\java\\org\\example\\MakeDll2.c"; + Process process = RuntimeUtil.exec(command); + // 等待命令执行完成 + process.waitFor(); + List<String> javaFilePaths = new ArrayList<>(); + + //生成java文件 + for (MpkFileDTO entity : entities) { + //封装模板数据 + Map<String, Object> data = new HashMap<>(); + data.put("pkgName",entity.getPkgName()); + data.put("modelMethods",entity.getModelMethods()); + data.put("pyName",entity.getPyName()); + data.put("pyModule",entity.getPyModule()); + VelocityContext dataContext = new VelocityContext(data); + //生成java文件 + File javaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + entity.getPkgName().replace(".", File.separator) + File.separator + entity.getPyName() + ".java"); + GenUtils.drawTemplate("abstract.java.vm",dataContext,javaFile); + javaFilePaths.add(javaFile.getAbsolutePath()); + + //生成Impl.java文件 + File implJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + entity.getPkgName().replace(".", File.separator) + File.separator + MdkConstant.IMPL + File.separator + entity.getPyName() + "Impl.java"); + GenUtils.drawTemplate("impl.java.vm",dataContext,implJavaFile); + javaFilePaths.add(implJavaFile.getAbsolutePath()); + + // 添加python源文件 + String pyFilePath = dirPath.getAbsolutePath() + File.separator + "py" + File.separator + entity.getPyName() + ".pyd"; + FileUtil.mkParentDirs(pyFilePath); + FileUtil.copy(entity.getFilePath(),pyFilePath,true); + } + + //utils + env java文件 + File utilsJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + "utils" + File.separator + "AlgsUtils.java"); + FileUtil.mkParentDirs(utilsJavaFile); + FileUtil.copy("bak/AlgsUtils.java",utilsJavaFile.getAbsolutePath(),true); + javaFilePaths.add(utilsJavaFile.getAbsolutePath()); + File envJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + "common" + File.separator + "Environment.java"); + FileUtil.mkParentDirs(envJavaFile); + FileUtil.copy("bak/Environment.java",envJavaFile.getAbsolutePath(),true); + javaFilePaths.add(envJavaFile.getAbsolutePath()); + // 生成class文件 + createClassFile(javaFilePaths); + // 删除java源文件 + deleteJavaFile(javaFilePaths); + // 打jar包 + pkgJar(dirPath.getAbsolutePath()); + // 本次更新日志 + ProjectPackageHistoryDTO dto = new ProjectPackageHistoryDTO(); + String historyId = UUID.randomUUID().toString(); + dto.setId(historyId); + dto.setProjectId(projectId); + dto.setFileName(zipFileName); + dto.setLog(log); + dto.setVersion(version); + dto.setModelNames(entities.stream().map(MpkFileDTO::getPyName).collect(Collectors.joining(","))); + dto.setCreateTime(new Date()); + // 生成更新日志 + createLog(projectId,projectName,dirPath.getAbsolutePath(),dto,version); + // 打zip包 + String zipPath = mpkBakFilePath + File.separator + zipFileName; + ZipUtil.zip(dirPath.getAbsolutePath(),zipPath); + byte[] bytes = FileUtil.readBytes(zipPath); + // 记录打包日志 + dto.setFilePath(zipPath); + projectPackageHistoryService.save(dto); + // 插入打包历史-模型关联表 + List<ProjectPackageHistoryModelEntity> historyModelList = new ArrayList<>(entities.size()); + entities.forEach(e -> { + ProjectPackageHistoryModelEntity entity = new ProjectPackageHistoryModelEntity(); + entity.setId(UUID.randomUUID().toString()); + entity.setProjectId(projectId); + entity.setPackageHistoryId(historyId); + entity.setPyName(e.getPyName()); + entity.setPkgName(e.getPkgName()); + entity.setPyModule(e.getPyModule()); + entity.setRemark(e.getRemark()); + List<ModelMethodEntity> methods = e.getModelMethods(); + if (!CollectionUtils.isEmpty(methods)) { + entity.setMethodInfo(JSON.toJSONString(methods)); + } + historyModelList.add(entity); + }); + projectPackageHistoryModelService.insertBatch(historyModelList); + // 删除临时文件 + FileUtils.deleteDirectory(dirPath); +// FileUtils.delete(new File(zipPath)); + return bytes; + } + + @Override + public Map<String,String> savePyFile(MultipartFile file) throws IOException { + File dir = new File(mpkBakFilePath); + if (!dir.exists()) { + dir.mkdirs(); + } + String fileName = file.getOriginalFilename(); + File saveFile = new File(dir.getAbsolutePath() + File.separator + fileName); + saveFile.createNewFile(); + // 保存 + file.transferTo(saveFile); + + Map<String,String> result = new HashMap<>(2); + result.put("filePath",saveFile.getAbsolutePath()); + result.put("fileName", fileName); + + return result; + } + + private void createLog(String projectId,String projectName,String dirPath,ProjectPackageHistoryDTO dto,String version) throws IOException { + Map<String,Object> map = new HashMap<>(); + map.put("projectId",projectId); + List<ProjectPackageHistoryDTO> list = projectPackageHistoryService.list(map); + list.add(dto); + // 按照日期分组再排序 + HashMap<String, List<ProjectPackageHistoryDTO>> dataMap = list.stream().collect( + Collectors.groupingBy(e -> DateUtils.format(e.getCreateTime(), DateUtils.DATE_PATTERN_POINT), + LinkedHashMap::new, + Collectors.collectingAndThen(Collectors.toList(), e -> e.stream().sorted(Comparator.comparing(ProjectPackageHistoryDTO::getCreateTime)).collect(Collectors.toList())))); + + Map<String, Object> data = new HashMap<>(); + data.put("dataMap",dataMap); + data.put("projectName",projectName); + data.put("version",version); + data.put("now",DateUtils.format(new Date(),DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + + File logFile = new File(dirPath + File.separator + "更新日志.txt"); + GenUtils.drawTemplate("log.txt.vm",data,logFile); + } + + private void pkgJar(String dirPath) throws InterruptedException { + StringBuilder sb = new StringBuilder(); + sb.append("jar -cvf"); + sb.append(" ").append(dirPath).append(File.separator).append("IAILMDK.jar"); + sb.append(" -C ").append(dirPath).append(File.separator).append("IAILMDK").append(File.separator).append(" ."); + log.info("执行cmd命令打jar包:" + sb); + Process process = RuntimeUtil.exec(sb.toString()); + process.waitFor(); + } + + private void deleteJavaFile(List<String> javaFilePaths) { + for (String javaFilePath : javaFilePaths) { + FileUtil.del(javaFilePath); + } + } + + private void createClassFile(List<String> javaFilePaths) throws InterruptedException { + StringBuilder sb = new StringBuilder(); + sb.append("javac -encoding utf-8"); + for (String path : javaFilePaths) { + sb.append(" ").append(path); + } + log.info("执行cmd命令生成class:" + sb); + Process process = RuntimeUtil.exec(sb.toString()); + process.waitFor(); + } +} \ 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/ModelMethodServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ModelMethodServiceImpl.java new file mode 100644 index 0000000..d4f4038 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ModelMethodServiceImpl.java @@ -0,0 +1,37 @@ +package com.iailab.module.model.mpk.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iailab.framework.common.service.impl.BaseServiceImpl; +import com.iailab.module.model.mpk.dao.ModelMethodDao; +import com.iailab.module.model.mpk.entity.ModelMethodEntity; +import com.iailab.module.model.mpk.service.ModelMethodService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/9/9 10:51 + **/ +@Slf4j +@Service +public class ModelMethodServiceImpl extends BaseServiceImpl<ModelMethodDao, ModelMethodEntity> implements ModelMethodService { + + + @Override + public void deleteByMap(Map<String, Object> map) { + baseDao.delete(getWrapper(map)); + } + + private QueryWrapper<ModelMethodEntity> getWrapper(Map<String, Object> params) { + String mpkFileId = (String) params.get("mpkFileId"); + + QueryWrapper<ModelMethodEntity> wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(mpkFileId), "mpk_file_id", mpkFileId); + + 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/ProjectModelServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectModelServiceImpl.java new file mode 100644 index 0000000..943aa45 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectModelServiceImpl.java @@ -0,0 +1,51 @@ +package com.iailab.module.model.mpk.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iailab.framework.common.service.impl.CrudServiceImpl; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.model.mpk.dao.ProjectModelDao; +import com.iailab.module.model.mpk.dto.ProjectModelDTO; +import com.iailab.module.model.mpk.entity.ProjectModelEntity; +import com.iailab.module.model.mpk.service.ProjectModelService; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Service +public class ProjectModelServiceImpl extends CrudServiceImpl<ProjectModelDao, ProjectModelEntity, ProjectModelDTO> implements ProjectModelService { + @Override + public List<ProjectModelDTO> list(Map<String, Object> params) { + List<ProjectModelEntity> entityList = baseDao.selectList(getWrapper(params)); + + return ConvertUtils.sourceToTarget(entityList, ProjectModelDTO.class); + } + + @Override + public void deleteByMap(Map<String,Object> map) { + baseDao.delete(getWrapper(map)); + } + + @Override + public QueryWrapper<ProjectModelEntity> getWrapper(Map<String, Object> params){ + String id = (String)params.get("id"); + String projectId = (String)params.get("projectId"); + String modelId = (String)params.get("modelId"); + + QueryWrapper<ProjectModelEntity> 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/mpk/service/impl/ProjectPackageHistoryModelServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectPackageHistoryModelServiceImpl.java new file mode 100644 index 0000000..0e6d903 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectPackageHistoryModelServiceImpl.java @@ -0,0 +1,57 @@ +package com.iailab.module.model.mpk.service.impl; + +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.service.impl.CrudServiceImpl; +import com.iailab.module.model.mpk.dao.ProjectPackageHistoryModelDao; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryModelDTO; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryModelEntity; +import com.iailab.module.model.mpk.service.ProjectPackageHistoryModelService; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * @description: + * @author: dzd + * @date: 2024/8/22 14:41 + **/ +@Service +public class ProjectPackageHistoryModelServiceImpl extends CrudServiceImpl<ProjectPackageHistoryModelDao, ProjectPackageHistoryModelEntity, ProjectPackageHistoryModelDTO> implements ProjectPackageHistoryModelService { + + @Override + public PageData<ProjectPackageHistoryModelDTO> page(Map<String, Object> params) { + IPage<ProjectPackageHistoryModelEntity> page = baseDao.selectPage( + getPage(params, "py_name", true), + getWrapper(params) + ); + + return getPageData(page, ProjectPackageHistoryModelDTO.class); + } + + @Override + public void deleteByMap(Map<String,Object> map) { + baseDao.delete(getWrapper(map)); + } + + @Override + public QueryWrapper<ProjectPackageHistoryModelEntity> getWrapper(Map<String, Object> params){ + String id = (String)params.get("id"); + String packageHistoryId = (String)params.get("packageHistoryId"); + String projectId = (String)params.get("projectId"); + String pyName = (String)params.get("pyName"); + + QueryWrapper<ProjectPackageHistoryModelEntity> wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), "id", id) + .eq(StringUtils.isNotBlank(packageHistoryId), "package_history_id", packageHistoryId) + .eq(StringUtils.isNotBlank(projectId),"project_id",projectId) + .like(StringUtils.isNotBlank(pyName),"py_name",pyName); + + 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/ProjectPackageHistoryServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectPackageHistoryServiceImpl.java new file mode 100644 index 0000000..e072ba0 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectPackageHistoryServiceImpl.java @@ -0,0 +1,57 @@ +package com.iailab.module.model.mpk.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iailab.framework.common.service.impl.CrudServiceImpl; +import com.iailab.module.model.mpk.dao.ProjectPackageHistoryDao; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryDTO; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryEntity; +import com.iailab.module.model.mpk.service.ProjectPackageHistoryService; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +/** + * 项目打包历史记录表 + * + * @author Dzd + * @since 1.0.0 2024-08-22 + */ +@Service +public class ProjectPackageHistoryServiceImpl extends CrudServiceImpl<ProjectPackageHistoryDao, ProjectPackageHistoryEntity, ProjectPackageHistoryDTO> implements ProjectPackageHistoryService { + + @Override + public QueryWrapper<ProjectPackageHistoryEntity> getWrapper(Map<String, Object> params){ + String id = (String)params.get("id"); + String projectId = (String)params.get("projectId"); + String startTime = (String)params.get("startTime"); + String endTime = (String)params.get("endTime"); + + QueryWrapper<ProjectPackageHistoryEntity> wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), "id", id); + wrapper.eq(StringUtils.isNotBlank(projectId), "project_id", projectId); + wrapper.ge(StringUtils.isNotBlank(startTime), "create_time", startTime); + wrapper.le(StringUtils.isNotBlank(endTime), "create_time", endTime); + wrapper.orderByDesc("create_time"); + + return wrapper; + } + + + @Override + public byte[] download(String filePath) throws IOException { + File file = new File(filePath); + if (!file.exists()) { + log.error("文件不存在,路径:" + filePath); + } + return FileUtils.readFileToByteArray(file); + } + + @Override + public void deleteByMap(Map<String, Object> map) { + baseDao.delete(getWrapper(map)); + } +} \ 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/ProjectServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectServiceImpl.java new file mode 100644 index 0000000..5e45ff9 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/ProjectServiceImpl.java @@ -0,0 +1,197 @@ +package com.iailab.module.model.mpk.service.impl; + +import cn.hutool.core.io.FileUtil; +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.service.impl.CrudServiceImpl; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.model.mpk.dao.MpkFileDao; +import com.iailab.module.model.mpk.dao.ProjectDao; +import com.iailab.module.model.mpk.dto.MpkFileDTO; +import com.iailab.module.model.mpk.dto.ProjectDTO; +import com.iailab.module.model.mpk.dto.ProjectModelDTO; +import com.iailab.module.model.mpk.dto.ProjectPackageHistoryDTO; +import com.iailab.module.model.mpk.entity.ProjectEntity; +import com.iailab.module.model.mpk.entity.ProjectModelEntity; +import com.iailab.module.model.mpk.entity.ProjectPackageHistoryModelEntity; +import com.iailab.module.model.mpk.service.ProjectModelService; +import com.iailab.module.model.mpk.service.ProjectPackageHistoryModelService; +import com.iailab.module.model.mpk.service.ProjectPackageHistoryService; +import com.iailab.module.model.mpk.service.ProjectService; +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.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @description: 项目表 + * @author: dzd + * @date: 2024/8/22 14:40 + **/ +@Service +@Slf4j +public class ProjectServiceImpl extends CrudServiceImpl<ProjectDao, ProjectEntity, ProjectDTO> implements ProjectService { + + @Autowired + ProjectModelService projectModelService; + @Autowired + ProjectPackageHistoryService projectPackageHistoryService; + @Autowired + ProjectPackageHistoryModelService projectPackageHistoryModelService; + @Autowired + MpkFileDao mpkFileDao; + + @Override + public PageData<ProjectDTO> page(Map<String, Object> params) { + IPage<ProjectDTO> page = baseDao.getPageList( + getPage(params, null, false), + params + ); + + return getPageData(page, ProjectDTO.class); + } + + @Override + public List<ProjectDTO> list(Map<String, Object> params) { + List<ProjectEntity> entityList = baseDao.selectList(getWrapper(params).orderByDesc("create_time")); + + return ConvertUtils.sourceToTarget(entityList, ProjectDTO.class); + } + + @Override + public ProjectDTO get(String id) { + ProjectEntity entity = baseDao.selectById(id); + ProjectDTO dto = ConvertUtils.sourceToTarget(entity, ProjectDTO.class); + + Map<String,Object> map = new HashMap<>(); + map.put("projectId",id); + List<ProjectModelDTO> projectModelList = projectModelService.list(map); + dto.setModels(projectModelList.stream().map(e -> { + MpkFileDTO mdkFileDTO = new MpkFileDTO(); + mdkFileDTO.setId(e.getModelId()); + return mdkFileDTO; + }).collect(Collectors.toList())); + + return dto; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(ProjectDTO dto) { + ProjectEntity entity = ConvertUtils.sourceToTarget(dto, ProjectEntity.class); + String projectId = UUID.randomUUID().toString(); + entity.setId(projectId); + entity.setCreateTime(new Date()); + insert(entity); + + //关联模型 + List<MpkFileDTO> models = dto.getModels(); + if (CollectionUtils.isNotEmpty(models)) { + List<ProjectModelEntity> projectModelList = new ArrayList<>(models.size()); + for (MpkFileDTO model : models) { + ProjectModelEntity projectModel = new ProjectModelEntity(); + projectModel.setId(UUID.randomUUID().toString()); + projectModel.setProjectId(projectId); + projectModel.setModelId(model.getId()); + projectModelList.add(projectModel); + } + projectModelService.insertBatch(projectModelList); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ProjectDTO dto) { + ProjectEntity entity = ConvertUtils.sourceToTarget(dto, ProjectEntity.class); + entity.setUpdateTime(new Date()); + updateById(entity); + + String projectId = dto.getId(); + //删除关联 + Map<String,Object> map = new HashMap<>(); + map.put("projectId",projectId); + projectModelService.deleteByMap(map); + + //关联模型 + List<MpkFileDTO> models = dto.getModels(); + if (CollectionUtils.isNotEmpty(models)) { + List<ProjectModelEntity> projectModelList = new ArrayList<>(models.size()); + for (MpkFileDTO model : models) { + ProjectModelEntity projectModel = new ProjectModelEntity(); + projectModel.setId(UUID.randomUUID().toString()); + projectModel.setProjectId(projectId); + projectModel.setModelId(model.getId()); + projectModelList.add(projectModel); + } + projectModelService.insertBatch(projectModelList); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delete(String id) { + + //删除 + baseDao.deleteById(id); + + //删除模型关联 + Map<String,Object> map = new HashMap<>(); + map.put("projectId",id); + projectModelService.deleteByMap(map); + + //删除备份文件 + List<ProjectPackageHistoryDTO> list = projectPackageHistoryService.list(map); + list.forEach(e -> { + File file = new File(e.getFilePath()); + if (file.exists()) { + file.delete(); + log.info("删除打包备份文件:" + e.getFilePath()); + } + }); + + //删除打包历史 + projectPackageHistoryService.deleteByMap(map); + + //删除打包历史模型关联 + projectPackageHistoryModelService.deleteByMap(map); + } + + @Override + public PageData<MpkFileDTO> getProjectModel(Map<String, Object> params) { + String projectId = (String) params.get("projectId"); + + int total = mpkFileDao.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<MpkFileDTO> list = mpkFileDao.getProjectModel(params); + + return new PageData<>(list,total); + } + + @Override + public QueryWrapper<ProjectEntity> getWrapper(Map<String, Object> params){ + String id = (String)params.get("id"); + String projectName = (String)params.get("projectName"); + + QueryWrapper<ProjectEntity> wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(id), "id", id) + .like(StringUtils.isNotBlank(projectName),"project_name",projectName); + + return wrapper; + } + + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/bak/AlgsUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/resources/bak/AlgsUtils.java new file mode 100644 index 0000000..f1740bb --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/bak/AlgsUtils.java @@ -0,0 +1,172 @@ +package utils; + +import java.util.HashMap; + + +/** + * @Auther: Forrest + * @Date: 2020/6/8 14:05 + * @Description: + */ +public class AlgsUtils { + private HashMap<String, Object> model = new HashMap<String, Object>(); + + public HashMap<String, Object> createPredictHashmap(HashMap<String, Object> models) { + if ((models.containsKey("iail/mdk/model"))) { + if (((String) ((HashMap) models.get("iail/mdk/model")).get("param1")).isEmpty()) { + String aaa = "error"; + model.put("param1", aaa); + } else { + String model_train = (String) ((HashMap) models.get("iail/mdk/model")).get("param1"); + model.put("param1", model_train); + } + } else { + model = models; + } + return model; + } + + public HashMap<String, Object> createPredictHashmapplus(HashMap<String, Object> models) { + if (models != null && models.containsKey("models")) { + if (((String) ((HashMap) models.get("models")).get("paramFile")).isEmpty()) { + String aaa = "error"; + model.put("param1", aaa); + } else { + String model_train = (String) ((HashMap) models.get("models")).get("paramFile"); + model.put("paramFile", model_train); + if (((HashMap) models.get("models")).containsKey("dim")) { + Object dim = ((HashMap) models.get("models")).get("dim"); + model.put("dim", dim); + } + } + } else { + model = models; + } + return model; + } + + private HashMap<String, Object> eval_pre = new HashMap<String, Object>(); + + /** + * 对返回码进行转换 + * + * @param models + * @return + */ + public int reverseResultCode(HashMap<String, Object> models) { + if ((models.containsKey("result_code"))) { + return Integer.parseInt((String) models.get("result_code")); + } + return -2; + } + + /** + * 对评价指标进行转换 + * + * @param models + * @return + */ + public HashMap<String, Object> reverseEval(HashMap<String, Object> models) { + if ((models.containsKey("eval"))) { + if (((HashMap) models.get("eval")).containsKey("MAE")) { + double MAE = Double.parseDouble((String) ((HashMap) models.get("eval")).get("MAE")); + eval_pre.put("MAE", MAE); + } + if (((HashMap) models.get("eval")).containsKey("MAPE")) { + double MAPE = Double.parseDouble((String) ((HashMap) models.get("eval")).get("MAPE")); + eval_pre.put("MAPE", MAPE); + } + if (((HashMap) models.get("eval")).containsKey("RMSE")) { + double MAE = Double.parseDouble((String) ((HashMap) models.get("eval")).get("RMSE")); + eval_pre.put("RMSE", MAE); + } + } + + return eval_pre; + } + + /** + * 对models里面的参数进行转换 + */ + private HashMap<String, Object> train_result_models = new HashMap<String, Object>(); + + public HashMap<String, Object> reverseModels(HashMap<String, Object> train_result) { + if (train_result.containsKey("models")) { + train_result_models = (HashMap) train_result.get("models"); + if (((HashMap) train_result.get("models")).containsKey("dim")) { + double dim = Double.parseDouble((String) ((HashMap) train_result.get("models")).get("dim")); + train_result_models.put("dim", dim); + } + train_result.put("models", train_result_models); + } + return train_result; + } + + + /** + * 获取二维数组行列数 + * + * @param arr + * @return + */ + public int[] getColAndRow(double[][] arr) { + int row = arr.length; + int col = arr[0].length; + int[] result = new int[2]; + result[0] = row; + result[1] = col; + return result; + } + + /** + * 两个二维数组进行合并 + * + * @param data + * @param refs + * @return + */ + public double[][] getMathergeArr(double[][] data, double[][] refs) { + + int[] dataRowAndCol = getColAndRow(data); + int rowData = dataRowAndCol[0]; + int colData = dataRowAndCol[1]; + + int[] refsRowAndCol = getColAndRow(refs); + int rowrefs = refsRowAndCol[0]; + int colrefs = refsRowAndCol[1]; + + double[][] newData = new double[rowData + rowrefs][colData]; + for (int i = 0; i < rowData; i++) { + for (int j = 0; j < colData; j++) { + newData[i][j] = data[i][j]; + } + } + + for (int i = 0; i < rowrefs; i++) { + for (int j = 0; j < colrefs; j++) { + newData[i + rowData][j] = refs[i][j]; + } + } + return newData; + } + + /** + * 对训练方法进行处理,实现评价指标的转换 + */ + public HashMap<String, Object> trainUtil(HashMap<String, Object> train_result, HashMap<String, Object> eval, String time) { + if (train_result.containsKey("eval")) { + eval = (HashMap<String, Object>) train_result.get("eval"); + eval.put("time", time); + train_result.put("eval", eval); + } + train_result.put("result_code", reverseResultCode(train_result)); + return train_result; + } + + /** + * 对预测方法进行处理 + */ +// public HashMap<String,Object> predictUtil(){ +// +// } +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/bak/Environment.java b/iailab-module-model/iailab-module-model-biz/src/main/resources/bak/Environment.java new file mode 100644 index 0000000..a4f2225 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/bak/Environment.java @@ -0,0 +1,44 @@ +package common; + +/** + * @Description + * @Author Forrest + * @Mail 1255187617@qq.com + * @Date 2021/1/12 + */ +public class Environment { + private native int jniInit(); + + private native int jniIsInit(); + + private native void jniRelease(); + + private native int statusCode(); + + /** + * 初始化环境 + */ + public int init() { + return jniInit(); + } + + /** + * 获取初始化状态 + */ + public int isInit() { + return jniIsInit(); + } + + /** + * 释放资源 + */ + public void release() { + jniRelease(); + } + /** + *校验机器码 + * */ +// public int checkMachineCode(String mCode){ +// return statusCode(); +// } +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mpk/MpkFileDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mpk/MpkFileDao.xml new file mode 100644 index 0000000..32ca7eb --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mpk/MpkFileDao.xml @@ -0,0 +1,86 @@ +<?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.mpk.dao.MpkFileDao"> + + <resultMap id="mpkFile" type="com.iailab.module.model.mpk.dto.MpkFileDTO"> + <id property="id" column="id"/> + <result property="pyName" column="py_name"/> + <result property="filePath" column="file_path"/> + <result property="pkgName" column="pkg_name"/> + <result property="className" column="class_name"/> + <result property="pyModule" column="py_module"/> + <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.mpk.entity.ModelMethodEntity"> + <id property="id" column="method_id"/> + <result property="methodName" column="method_name"/> + <result property="dataLength" column="data_length"/> + <result property="model" column="model"/> + </collection> + </resultMap> + + <select id="get" resultMap="mpkFile"> + SELECT + a.*, + b.id method_id, + b.method_name, + b.data_length, + b.model + FROM + t_mpk_file a + LEFT JOIN t_mpk_model_method b ON a.id = b.mpk_file_id + WHERE a.id = #{id} + </select> + <select id="selectByIds" resultMap="mpkFile"> + SELECT + a.*, + b.id method_id, + b.method_name, + b.data_length, + b.model + FROM + t_mpk_file a + LEFT JOIN t_mpk_model_method b ON a.id = b.mpk_file_id + WHERE a.id in + <foreach collection="ids" item="item" open="(" close=")" separator=","> + #{item} + </foreach> + </select> + <select id="getProjectModelCount" resultType="java.lang.Integer" parameterType="java.lang.String"> + SELECT + count(*) + FROM + t_mpk_project_model + WHERE + project_id = #{projectId} + </select> + <select id="getProjectModel" resultMap="mpkFile"> + SELECT + t3.*,t4.method_name,t4.data_length,t4.model + FROM + ( + SELECT + t2.id, + t2.py_name, + t2.pkg_name, + t2.py_module, + t2.remark, + t2.create_date + FROM + t_mpk_project_model t1 + LEFT JOIN t_mpk_file t2 ON t1.model_id = t2.id + WHERE + t1.project_id = #{params.projectId} + <if test="params.pyName != null and params.pyName != ''"> + AND t2.py_name LIKE CONCAT('%',#{params.pyName},'%') + </if> + ORDER BY + t2.create_date DESC + LIMIT #{params.offset},#{params.pageSize} + ) t3 + LEFT JOIN t_mpk_model_method t4 ON t3.id = t4.mpk_file_id + </select> +</mapper> \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mpk/ProjectDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mpk/ProjectDao.xml new file mode 100644 index 0000000..e707de7 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mpk/ProjectDao.xml @@ -0,0 +1,38 @@ +<?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.mpk.dao.ProjectDao"> + + <resultMap id="projectModel" type="com.iailab.module.model.mpk.dto.ProjectDTO"> + <id property="id" column="id"/> + <result property="projectName" column="project_name"/> + <result property="projectCode" column="project_code"/> + <result property="createTime" column="create_time"/> + <collection property="models" ofType="com.iailab.module.model.mpk.dto.MpkFileDTO"> + <id property="id" column="model_id"/> + <result property="pyName" column="py_name"/> + </collection> + </resultMap> + + <select id="getPageList" resultMap="projectModel" resultType="com.iailab.module.model.mpk.dto.ProjectDTO"> + SELECT + t1.id, + t1.project_name, + t1.project_code, + t1.create_time, + t2.model_id, + t3.py_name + FROM + t_mpk_project t1 + LEFT JOIN t_mpk_project_model t2 on t1.id = t2.project_id + LEFT JOIN t_mpk_file t3 ON t2.model_id = t3.id + <where> + <if test="params.projectName != null and params.projectName != ''"> + and t1.project_name like CONCAT('%',#{params.projectName},'%') + </if> + <if test="params.projectCode != null and params.projectCode != ''"> + and t1.project_code like CONCAT('%',#{params.projectCode},'%') + </if> + </where> + order by t1.create_time desc + </select> +</mapper> \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/Jni.cpp.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/Jni.cpp.vm new file mode 100644 index 0000000..027cf08 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/Jni.cpp.vm @@ -0,0 +1,22 @@ +\#include "pch.h" +\#include"cstring" +\#include <iostream> +\#include "framework.h" +\#include <fstream> +\#include <stdio.h> +\#include <stdlib.h> +\#include <string.h> +\#include"${pyName}Jni.h" + +#{foreach} ($entity in $modelMethods) +JNIEXPORT jobject JNICALL Java_${pkgName.replace('.','_')}_impl_${pyName}Impl_${pyName}${entity.methodName}(JNIEnv* env, jobject object1, #{foreach} ($column in [1..$entity.dataLength])jobjectArray data${column}, #{end}#{if}($entity.model==1)jobject model_path_, #{end}jobject settings) +{ + jclass class_hashmap = env->FindClass("java/util/HashMap"); + jmethodID hashmap_construct_method = env->GetMethodID(class_hashmap, "<init>", "()V"); + jobject obj_hashmap = env->NewObject(class_hashmap, hashmap_construct_method, ""); + env->DeleteLocalRef(class_hashmap); + + obj_hashmap = ${pyName}_${entity.methodName}(env, #{foreach} ($column in [1..$entity.dataLength])data${column}, #{end}#{if}($entity.model==1)model_path_, #{end}settings); + return obj_hashmap; +} +#{end} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/Jni.h.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/Jni.h.vm new file mode 100644 index 0000000..795cc74 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/Jni.h.vm @@ -0,0 +1,28 @@ +#pragma once +/* DO NOT EDIT THIS FILE - it is machine generated */ +//修改 +\#include "jni.h" +//\#include "common.h" +\#include"${pyName}.h" +/* Header for class Jni */ + +//修改cycleCom_impl_CycleComAlg_predFactGuiComShortPointLossRateV2Train +#ifndef _Included_iail_mdk_model_pred_fact_impl_${pyName}Impl_ +\#define _Included_iail_mdk_model_pred_fact_impl_${pyName}Impl_ +#ifdef __cplusplus +extern "C" { +#endif + /* + + */ + //修改Java_iail_mdk_model_pred_spred_impl_LssvmAlg_LssvmPredict +#{foreach} ($entity in $modelMethods) + JNIEXPORT jobject JNICALL Java_${pkgName.replace('.','_')}_impl_${pyName}Impl_${pyName}${entity.methodName} + (JNIEnv*, jobject, #{foreach} ($column in [1..$entity.dataLength])jobjectArray, #{end}#{if}($entity.model==1)jobject, #{end}jobject); +#{end} + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/abstract.java.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/abstract.java.vm new file mode 100644 index 0000000..57e56a9 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/abstract.java.vm @@ -0,0 +1,11 @@ +package ${pkgName}; + +import java.util.HashMap; + +public abstract class ${pyName} { + +#{foreach} ($entity in $modelMethods) + public abstract HashMap<String, Object> ${entity.methodName}(#{foreach} ($column in [1..$entity.dataLength])double data${column}[][], #{end}#{if}($entity.model==1)HashMap<String, Object> model, #{end}HashMap<String, Object> settings); + +#{end} +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/cpp.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/cpp.vm new file mode 100644 index 0000000..eeb2f81 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/cpp.vm @@ -0,0 +1,120 @@ +\#include "stdafx.h" +\#include "pch.h" +\#include "${pyName}.h" +\#include <string> +\#include "pyutils.h" +\#include "jni.h" +\#include "Python.h" +\#include "PyGILThreadLock.h" +\#include "convertutils.h" + +using namespace std; + +#{foreach} ($entity in $modelMethods) +jobject ${pyName}_${entity.methodName}(JNIEnv* env, #{foreach} ($column in [1..$entity.dataLength])jobjectArray data${column}, #{end}#{if}($entity.model==1)jobject model_path_, #{end}jobject settings) +{ + try + { + + PyGILThreadLock lock; + PyObject* pModule = create_py_module("${pyModule}.${pyName}"); + if (pModule == NULL) + { + cout << "model error" << endl; + throw "模块调用失败!"; + } + + //*************导入函数****************** + PyObject* pFunc = PyObject_GetAttrString(pModule, "${entity.methodName}"); + if (pFunc == NULL) + { + cout << "func error" << endl; + throw "函数调用失败!"; + } +#{foreach} ($column in [1..$entity.dataLength]) + PyObject* data_${column} = ConvertJdarrToPydarr(env, data${column}); +#{end} +#{if}($entity.model==1) + PyObject* model_path = ConvertJhmapToPydict(env, model_path_); +#{end} + PyObject* settings_1 = ConvertJhmapToPydict(env, settings); + + + //************构造参数数据 ******************** +#{if}($entity.model==1) +#set($a=$entity.dataLength + 2) + PyObject* pArg = PyTuple_New(${a}); +#{else} +#set($a=$entity.dataLength + 1) + PyObject* pArg = PyTuple_New(${a}); +#{end} +#{foreach} ($column in [1..$entity.dataLength]) +#set($a=$column - 1) + PyTuple_SetItem(pArg, ${a}, data_${column}); +#{end} +#{if}($entity.model==1) + PyTuple_SetItem(pArg, ${entity.dataLength}, model_path); +#set($a=$entity.dataLength + 1) + PyTuple_SetItem(pArg, ${a}, settings_1); +#{else} + PyTuple_SetItem(pArg, ${entity.dataLength}, settings_1); +#{end} + + /*PyTuple_SetItem(pArg, 1, parseCppData(data_in->feature_range));*/ + + + //********************调用python方法计算***************** + PyObject* pReturn = PyEval_CallObject(pFunc, pArg); + if (pReturn == NULL) + { + cout << "return error" << endl; + throw "函数返回值异常!"; + } + //*******************返回数据封装************************ + // 开辟返回数据内存空间,转换数据,拆分数据 + + /*jobject result = jhmappydict_(env, pReturn);*/ + jobject result = ConvertPydictToJhmap(env, pReturn); + if (result == NULL) + { + cout << "ConvertPydictToJhmap error" << endl; + throw "函数返回值异常!"; + } + delete pModule; + pModule = nullptr; + delete pModule; + + delete pFunc; + pFunc = nullptr; + delete pFunc; + +#{foreach} ($column in [1..$entity.dataLength]) + delete[] data_${column}; + data_${column} = nullptr; + delete data_${column}; + +#{end} +#{if}($entity.model==1) + delete model_path; + model_path = nullptr; + delete model_path; +#{end} + + delete settings_1; + settings_1 = nullptr; + delete settings_1; + + delete[] pArg; + pArg = nullptr; + delete pArg; + + return result; + } + catch (const char* msg) + { + cout << "${entity.methodName} error" << endl; + return NULL; + } +} + +#{end} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/h.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/h.vm new file mode 100644 index 0000000..6ed604c --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/h.vm @@ -0,0 +1,26 @@ +#pragma once + +#ifndef ${pyName}_H +\#define ${pyName}_H + +#endif //PCH_H + +#ifdef _EXPORTING +\#define API_DECLSPEC extern "C" __declspec(dllexport) +\#else +\#define API_DECLSPEC extern "C" __declspec(dllimport) +#endif +// 输入参数 + +\#include <string> +//\#include "PyGILThreadLock.h" +\#include <iostream> +\#include "Python.h" +\#include "jni.h" + +using namespace std; + +#{foreach} ($entity in $modelMethods) +jobject ${pyName}_${entity.methodName}(JNIEnv* env, #{foreach} ($column in [1..$entity.dataLength])jobjectArray data${column}, #{end}#{if}($entity.model==1)jobject model_path, #{end}jobject settings); + +#{end} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/impl.java.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/impl.java.vm new file mode 100644 index 0000000..64743f5 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/impl.java.vm @@ -0,0 +1,33 @@ +package ${pkgName}.impl; + +import ${pkgName}.${pyName}; +import utils.AlgsUtils; + +import java.util.HashMap; + +public class ${pyName}Impl extends ${pyName} { + private AlgsUtils utils = new AlgsUtils(); + //输出map + private HashMap<String, Object> result; + //predict输入模型 + private HashMap<String, Object> model; + +#{foreach} ($entity in $modelMethods) + public native HashMap<String, Object> ${pyName}${entity.methodName}(#foreach ($column in [1..$entity.dataLength])double data${column}[][], #{end}#{if}($entity.model==1)HashMap<String, Object> models, #{end}HashMap<String, Object> settings); + + @Override + public HashMap<String, Object> ${entity.methodName}(#foreach ($column in [1..$entity.dataLength])double data${column}[][], #{end}#{if}($entity.model==1)HashMap<String, Object> models, #{end}HashMap<String, Object> settings) { +#{if}($entity.model==1) + model = utils.createPredictHashmapplus(models); +#{end} + if (#{foreach} ($column in [1..$entity.dataLength])#{if}($column==1)data${column} == null || data${column}.length == 0 || data${column}[0].length == 0#{else} || data${column} == null || data${column}.length == 0 || data${column}[0].length == 0#{end}#{end}) { + result = new HashMap<String, Object>(); + result.put("status_code", -4); + return result; + } + result = ${pyName}${entity.methodName}(#foreach ($column in [1..$entity.dataLength])data${column}, #{end}#{if}($entity.model==1)model, #{end}settings); + + return result; + } +#{end} +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/log.txt.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/log.txt.vm new file mode 100644 index 0000000..c12249e --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/log.txt.vm @@ -0,0 +1,9 @@ +MPK ${projectName} 【${version}】 ${now} 更新日志 + +#{foreach} ($entry in $dataMap.entrySet()) +-------------${entry.getKey()}-------------- +#{foreach} ($dto in $entry.getValue()) +${foreach.count}.【${dto.version}】${dto.log} +#{end} + +#{end} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/pkg.Jni.cpp.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/pkg.Jni.cpp.vm new file mode 100644 index 0000000..a09adfe --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/pkg.Jni.cpp.vm @@ -0,0 +1,24 @@ +\#include "pch.h" +\#include"cstring" +\#include <iostream> +\#include "framework.h" +\#include <fstream> +\#include <stdio.h> +\#include <stdlib.h> +\#include <string.h> + +#{foreach} ($mpkEntity in $entities) +#{foreach} ($entity in $mpkEntity.modelMethods) +JNIEXPORT jobject JNICALL Java_${mpkEntity.pkgName.replace('.','_')}_impl_${mpkEntity.pyName}Impl_${mpkEntity.pyName}${entity.methodName}(JNIEnv* env, jobject object1, #{foreach} ($column in [1..$entity.dataLength])jobjectArray data${column}, #{end}#{if}($entity.model==1)jobject model_path_, #{end}jobject settings) +{ + jclass class_hashmap = env->FindClass("java/util/HashMap"); + jmethodID hashmap_construct_method = env->GetMethodID(class_hashmap, "<init>", "()V"); + jobject obj_hashmap = env->NewObject(class_hashmap, hashmap_construct_method, ""); + env->DeleteLocalRef(class_hashmap); + + obj_hashmap = ${mpkEntity.pyName}_${entity.methodName}(env, #{foreach} ($column in [1..$entity.dataLength])data${column}, #{end}#{if}($entity.model==1)model_path_, #{end}settings); + return obj_hashmap; +} +#{end} + +#{end} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template/pkg.cpp.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/pkg.cpp.vm new file mode 100644 index 0000000..4052d44 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template/pkg.cpp.vm @@ -0,0 +1,122 @@ +\#include "stdafx.h" +\#include "pch.h" +\#include <string> +\#include "pyutils.h" +\#include "jni.h" +\#include "Python.h" +\#include "PyGILThreadLock.h" +\#include "convertutils.h" + +using namespace std; + +#{foreach} ($mpkEntity in $entities) +#{foreach} ($entity in $mpkEntity.modelMethods) +jobject ${mpkEntity.pyName}_${entity.methodName}(JNIEnv* env, #{foreach} ($column in [1..$entity.dataLength])jobjectArray data${column}, #{end}#{if}($entity.model==1)jobject model_path_, #{end}jobject settings) +{ + try + { + + PyGILThreadLock lock; + PyObject* pModule = create_py_module("${mpkEntity.pyModule}.${mpkEntity.pyName}"); + if (pModule == NULL) + { + cout << "model error" << endl; + throw "模块调用失败!"; + } + + //*************导入函数****************** + PyObject* pFunc = PyObject_GetAttrString(pModule, "${entity.methodName}"); + if (pFunc == NULL) + { + cout << "func error" << endl; + throw "函数调用失败!"; + } +#{foreach} ($column in [1..$entity.dataLength]) + PyObject* data_${column} = ConvertJdarrToPydarr(env, data${column}); +#{end} +#{if}($entity.model==1) + PyObject* model_path = ConvertJhmapToPydict(env, model_path_); +#{end} + PyObject* settings_1 = ConvertJhmapToPydict(env, settings); + + + //************构造参数数据 ******************** +#{if}($entity.model==1) +#set($a=$entity.dataLength + 2) + PyObject* pArg = PyTuple_New(${a}); +#{else} +#set($a=$entity.dataLength + 1) + PyObject* pArg = PyTuple_New(${a}); +#{end} +#{foreach} ($column in [1..$entity.dataLength]) +#set($a=$column - 1) + PyTuple_SetItem(pArg, ${a}, data_${column}); +#{end} +#{if}($entity.model==1) + PyTuple_SetItem(pArg, ${entity.dataLength}, model_path); +#set($a=$entity.dataLength + 1) + PyTuple_SetItem(pArg, ${a}, settings_1); +#{else} + PyTuple_SetItem(pArg, ${entity.dataLength}, settings_1); +#{end} + + /*PyTuple_SetItem(pArg, 1, parseCppData(data_in->feature_range));*/ + + + //********************调用python方法计算***************** + PyObject* pReturn = PyEval_CallObject(pFunc, pArg); + if (pReturn == NULL) + { + cout << "return error" << endl; + throw "函数返回值异常!"; + } + //*******************返回数据封装************************ + // 开辟返回数据内存空间,转换数据,拆分数据 + + /*jobject result = jhmappydict_(env, pReturn);*/ + jobject result = ConvertPydictToJhmap(env, pReturn); + if (result == NULL) + { + cout << "ConvertPydictToJhmap error" << endl; + throw "函数返回值异常!"; + } + delete pModule; + pModule = nullptr; + delete pModule; + + delete pFunc; + pFunc = nullptr; + delete pFunc; + +#{foreach} ($column in [1..$entity.dataLength]) + delete[] data_${column}; + data_${column} = nullptr; + delete data_${column}; + +#{end} +#{if}($entity.model==1) + delete model_path; + model_path = nullptr; + delete model_path; +#{end} + + delete settings_1; + settings_1 = nullptr; + delete settings_1; + + delete[] pArg; + pArg = nullptr; + delete pArg; + + return result; + } + catch (const char* msg) + { + cout << "${entity.methodName} error" << endl; + return NULL; + } +} + +#{end} + +#{end} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/Jni.cpp.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/Jni.cpp.vm new file mode 100644 index 0000000..2b56a69 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/Jni.cpp.vm @@ -0,0 +1,31 @@ +\#include "pch.h" +\#include"cstring" +\#include <iostream> +\#include "framework.h" +\#include <fstream> +\#include <stdio.h> +\#include <stdlib.h> +\#include <string.h> +\#include"${pyName}Jni.h" + +JNIEXPORT jobject JNICALL Java_${pkgName.replace('.','_')}_impl_${pyName}Impl_${pyName}Train(JNIEnv* env, jobject object1, jobjectArray data_train, jobject settings) +{ + jclass class_hashmap = env->FindClass("java/util/HashMap"); + jmethodID hashmap_construct_method = env->GetMethodID(class_hashmap, "<init>", "()V"); + jobject obj_hashmap = env->NewObject(class_hashmap, hashmap_construct_method, ""); + env->DeleteLocalRef(class_hashmap); + + obj_hashmap = ${pyName}_train(env, data_train, settings); + return obj_hashmap; +} + +JNIEXPORT jobject JNICALL Java_${pkgName.replace('.','_')}_impl_${pyName}Impl_${pyName}Predict(JNIEnv* env, jobject object1, #{foreach} ($column in [1..$dataLength])jobjectArray data${column}, #{end}jobject model_path_, jobject settings) +{ + jclass class_hashmap = env->FindClass("java/util/HashMap"); + jmethodID hashmap_construct_method = env->GetMethodID(class_hashmap, "<init>", "()V"); + jobject obj_hashmap = env->NewObject(class_hashmap, hashmap_construct_method, ""); + env->DeleteLocalRef(class_hashmap); + + obj_hashmap = ${pyName}_predict(env, #{foreach} ($column in [1..$dataLength])data${column}, #{end}model_path_, settings); + return obj_hashmap; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/Jni.h.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/Jni.h.vm new file mode 100644 index 0000000..ea21d7d --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/Jni.h.vm @@ -0,0 +1,28 @@ +#pragma once +/* DO NOT EDIT THIS FILE - it is machine generated */ +//修改 +\#include "jni.h" +//\#include "common.h" +\#include"${pyName}.h" +/* Header for class Jni */ + +//修改cycleCom_impl_CycleComAlg_predFactGuiComShortPointLossRateV2Train +#ifndef _Included_iail_mdk_model_pred_fact_impl_${pyName}Impl_ +\#define _Included_iail_mdk_model_pred_fact_impl_${pyName}Impl_ +#ifdef __cplusplus +extern "C" { +#endif + /* + + */ + //修改Java_iail_mdk_model_pred_spred_impl_LssvmAlg_LssvmPredict + JNIEXPORT jobject JNICALL Java_${pkgName.replace('.','_')}_impl_${pyName}Impl_${pyName}Predict + (JNIEnv*, jobject, #{foreach} ($column in [1..$dataLength])jobjectArray, #{end}jobject, jobject); + JNIEXPORT jobject JNICALL Java_${pkgName.replace('.','_')}_impl_${pyName}Impl_${pyName}Train + (JNIEnv*, jobject, jobjectArray, jobject); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/abstract.java.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/abstract.java.vm new file mode 100644 index 0000000..584ced8 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/abstract.java.vm @@ -0,0 +1,9 @@ +package ${pkgName}; + +import java.util.HashMap; + +public abstract class ${pyName} { + public abstract HashMap<String, Object> train(double data[][], HashMap<String, Object> settings); + + public abstract HashMap<String, Object> predict(#foreach ($column in [1..$dataLength])double data${column}[][], #{end}HashMap<String, Object> model, HashMap<String, Object> settings); +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/cpp.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/cpp.vm new file mode 100644 index 0000000..25714c1 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/cpp.vm @@ -0,0 +1,161 @@ +\#include "stdafx.h" +\#include "pch.h" +\#include "${pyName}.h" +\#include <string> +\#include "pyutils.h" +\#include "jni.h" +\#include "Python.h" +\#include "PyGILThreadLock.h" +\#include "convertutils.h" + +using namespace std; + +jobject ${pyName}_train(JNIEnv* env, jobjectArray data_train, jobject settings) +{ + try + { + PyGILThreadLock lock; + PyObject* pModule = create_py_module("${pyModule}.${pyName}"); + if (pModule == NULL) + { + cout << "pModule error" << endl; + throw "模块调用失败!"; + } + + //*************导入函数****************** + PyObject* pFunc = PyObject_GetAttrString(pModule, "train"); + if (pFunc == NULL) + { + cout << "pfunc error" << endl; + throw "函数调用失败!"; + } + PyObject* data_1 = ConvertJdarrToPydarr(env, data_train); + PyObject* settings_ = ConvertJhmapToPydict(env, settings); + + //************构造参数数据 ******************** + PyObject* pArg = PyTuple_New(2); + PyTuple_SetItem(pArg, 0, data_1); + PyTuple_SetItem(pArg, 1, settings_); + + /*PyTuple_SetItem(pArg, 1, parseCppData(data_in->feature_range));*/ + + + //********************调用python方法计算***************** + PyObject* pReturn = PyEval_CallObject(pFunc, pArg); + if (pReturn == NULL) + { + cout << "pReturn error" << endl; + throw "函数返回值异常!"; + } + //*******************返回数据封装************************ + // 开辟返回数据内存空间,转换数据,拆分数据 + + /*jobject result = jhmappydict_(env, pReturn);*/ + jobject result = ConvertPydictToJhmap(env, pReturn); + if (result == NULL) + { + cout << "ConvertPydictToJhmap error" << endl; + throw "函数返回值异常!"; + } + delete pModule, pFunc, data_1, settings_, pArg; + return result; + } + catch (const char* msg) + { + cout << "train error" << endl; + return NULL; + } +} + +jobject ${pyName}_predict(JNIEnv* env, #{foreach} ($column in [1..$dataLength])jobjectArray data${column}, #{end}jobject model_path_,jobject settings) +{ + try + { + + PyGILThreadLock lock; + PyObject* pModule = create_py_module("${pyModule}.${pyName}"); + if (pModule == NULL) + { + cout << "model error" << endl; + throw "模块调用失败!"; + } + + //*************导入函数****************** + PyObject* pFunc = PyObject_GetAttrString(pModule, "predict"); + if (pFunc == NULL) + { + cout << "func error" << endl; + throw "函数调用失败!"; + } +#{foreach} ($column in [1..$dataLength]) + PyObject* data_${column} = ConvertJdarrToPydarr(env, data${column}); +#{end} + PyObject* model_path = ConvertJhmapToPydict(env, model_path_); + PyObject* settings_1 = ConvertJhmapToPydict(env, settings); + + + //************构造参数数据 ******************** +#set($a=$dataLength + 2) + PyObject* pArg = PyTuple_New(${a}); +#{foreach} ($column in [1..$dataLength]) +#set($a=$column - 1) + PyTuple_SetItem(pArg, ${a}, data_${column}); +#{end} + PyTuple_SetItem(pArg, ${dataLength}, model_path); +#set($a=$dataLength + 1) + PyTuple_SetItem(pArg, ${a}, settings_1); + + /*PyTuple_SetItem(pArg, 1, parseCppData(data_in->feature_range));*/ + + + //********************调用python方法计算***************** + PyObject* pReturn = PyEval_CallObject(pFunc, pArg); + if (pReturn == NULL) + { + cout << "return error" << endl; + throw "函数返回值异常!"; + } + //*******************返回数据封装************************ + // 开辟返回数据内存空间,转换数据,拆分数据 + + /*jobject result = jhmappydict_(env, pReturn);*/ + jobject result = ConvertPydictToJhmap(env, pReturn); + if (result == NULL) + { + cout << "ConvertPydictToJhmap error" << endl; + throw "函数返回值异常!"; + } + delete pModule; + pModule = nullptr; + delete pModule; + + delete pFunc; + pFunc = nullptr; + delete pFunc; + +#{foreach} ($column in [1..$dataLength]) + delete[] data_${column}; + data_${column} = nullptr; + delete data_${column}; + +#{end} + delete model_path; + model_path = nullptr; + delete model_path; + + delete settings_1; + settings_1 = nullptr; + delete settings_1; + + delete[] pArg; + pArg = nullptr; + delete pArg; + + return result; + } + catch (const char* msg) + { + cout << "predict error" << endl; + return NULL; + } +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/h.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/h.vm new file mode 100644 index 0000000..dc3490f --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/h.vm @@ -0,0 +1,24 @@ +#pragma once + +#ifndef ${pyName}_H +\#define ${pyName}_H + +#endif //PCH_H + +#ifdef _EXPORTING +\#define API_DECLSPEC extern "C" __declspec(dllexport) +\#else +\#define API_DECLSPEC extern "C" __declspec(dllimport) +#endif +// 输入参数 + +\#include <string> +//\#include "PyGILThreadLock.h" +\#include <iostream> +\#include "Python.h" +\#include "jni.h" + +using namespace std; + +jobject ${pyName}_train(JNIEnv* env, jobjectArray data_train, jobject settings); +jobject ${pyName}_predict(JNIEnv* env, #{foreach} ($column in [1..$dataLength])jobjectArray data${column}, #{end}jobject model_path, jobject settings); diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/impl.java.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/impl.java.vm new file mode 100644 index 0000000..1459b49 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/impl.java.vm @@ -0,0 +1,48 @@ +package ${pkgName}.impl; + +import ${pkgName}.${pyName}; +import utils.AlgsUtils; + +import java.util.HashMap; + +public class ${pyName}Impl extends ${pyName} { + private AlgsUtils utils = new AlgsUtils(); + //train的输出map + private HashMap<String, Object> train_result; + //predict输入模型 + private HashMap<String, Object> model; + //predict输出模型 + private HashMap<String, Object> predict_result; + + public native HashMap<String, Object> ${pyName}Train(double[][] dataone, HashMap<String, Object> settings); + + @Override + public HashMap<String, Object> train(double[][] dataone, HashMap<String, Object> settings) { + double startTime = System.currentTimeMillis(); //获取开始时间 + + if (dataone == null || dataone.length == 0 || dataone[0].length == 0) { + train_result = new HashMap<String, Object>(); + train_result.put("status_code", -4); + return train_result; + } + + train_result = ${pyName}Train(dataone, settings); + return train_result; + } + + public native HashMap<String, Object> ${pyName}Predict(#foreach ($column in [1..$dataLength])double data${column}[][], #{end}HashMap<String, Object> models, HashMap<String, Object> settings); + + @Override + public HashMap<String, Object> predict(#foreach ($column in [1..$dataLength])double data${column}[][], #{end}HashMap<String, Object> models, HashMap<String, Object> settings) { + model = utils.createPredictHashmapplus(models); + if (#{foreach} ($column in [1..$dataLength])#{if}($column==1)data${column} == null || data${column}.length == 0 || data${column}[0].length == 0#{else} || data${column} == null || data${column}.length == 0 || data${column}[0].length == 0#{end}#{end}) { + predict_result = new HashMap<String, Object>(); + predict_result.put("status_code", -4); + return predict_result; + } + predict_result = ${pyName}Predict(#foreach ($column in [1..$dataLength])data${column}, #{end}model, settings); + + // predict_result.put("result_code",utils.reverseResultCode(predict_result)); + return predict_result; + } +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/log.txt.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/log.txt.vm new file mode 100644 index 0000000..1658938 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/log.txt.vm @@ -0,0 +1,9 @@ +MDK ${projectName} ${now} 更新日志 + +#{foreach} ($entry in $dataMap.entrySet()) +-------------${entry.getKey()}-------------- +#{foreach} ($dto in $entry.getValue()) +${foreach.count}.${dto.getLog()} +#{end} + +#{end} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/pkg.Jni.cpp.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/pkg.Jni.cpp.vm new file mode 100644 index 0000000..95998fe --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/pkg.Jni.cpp.vm @@ -0,0 +1,33 @@ +\#include "pch.h" +\#include"cstring" +\#include <iostream> +\#include "framework.h" +\#include <fstream> +\#include <stdio.h> +\#include <stdlib.h> +\#include <string.h> + +#{foreach} ($entity in $entities) +JNIEXPORT jobject JNICALL Java_${entity.pkgName.replace('.','_')}_impl_${entity.pyName}Impl_${entity.pyName}Train(JNIEnv* env, jobject object1, jobjectArray data_train, jobject settings) +{ + jclass class_hashmap = env->FindClass("java/util/HashMap"); + jmethodID hashmap_construct_method = env->GetMethodID(class_hashmap, "<init>", "()V"); + jobject obj_hashmap = env->NewObject(class_hashmap, hashmap_construct_method, ""); + env->DeleteLocalRef(class_hashmap); + + obj_hashmap = ${entity.pyName}_train(env, data_train, settings); + return obj_hashmap; +} + +JNIEXPORT jobject JNICALL Java_${entity.pkgName.replace('.','_')}_impl_${entity.pyName}Impl_${entity.pyName}Predict(JNIEnv* env, jobject object1, #{foreach} ($column in [1..$entity.dataLength])jobjectArray data${column}, #{end}jobject model_path_, jobject settings) +{ + jclass class_hashmap = env->FindClass("java/util/HashMap"); + jmethodID hashmap_construct_method = env->GetMethodID(class_hashmap, "<init>", "()V"); + jobject obj_hashmap = env->NewObject(class_hashmap, hashmap_construct_method, ""); + env->DeleteLocalRef(class_hashmap); + + obj_hashmap = ${entity.pyName}_predict(env, #{foreach} ($column in [1..$entity.dataLength])data${column}, #{end}model_path_, settings); + return obj_hashmap; +} + +#{end} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/pkg.cpp.vm b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/pkg.cpp.vm new file mode 100644 index 0000000..37d6182 --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/template_bak/pkg.cpp.vm @@ -0,0 +1,163 @@ +\#include "stdafx.h" +\#include "pch.h" +\#include <string> +\#include "pyutils.h" +\#include "jni.h" +\#include "Python.h" +\#include "PyGILThreadLock.h" +\#include "convertutils.h" + +using namespace std; + +#{foreach} ($entity in $entities) +jobject ${entity.pyName}_train(JNIEnv* env, jobjectArray data_train, jobject settings) +{ + try + { + PyGILThreadLock lock; + PyObject* pModule = create_py_module("${entity.pyModule}.${entity.pyName}"); + if (pModule == NULL) + { + cout << "pModule error" << endl; + throw "模块调用失败!"; + } + + //*************导入函数****************** + PyObject* pFunc = PyObject_GetAttrString(pModule, "train"); + if (pFunc == NULL) + { + cout << "pfunc error" << endl; + throw "函数调用失败!"; + } + PyObject* data_1 = ConvertJdarrToPydarr(env, data_train); + PyObject* settings_ = ConvertJhmapToPydict(env, settings); + + //************构造参数数据 ******************** + PyObject* pArg = PyTuple_New(2); + PyTuple_SetItem(pArg, 0, data_1); + PyTuple_SetItem(pArg, 1, settings_); + + /*PyTuple_SetItem(pArg, 1, parseCppData(data_in->feature_range));*/ + + + //********************调用python方法计算***************** + PyObject* pReturn = PyEval_CallObject(pFunc, pArg); + if (pReturn == NULL) + { + cout << "pReturn error" << endl; + throw "函数返回值异常!"; + } + //*******************返回数据封装************************ + // 开辟返回数据内存空间,转换数据,拆分数据 + + /*jobject result = jhmappydict_(env, pReturn);*/ + jobject result = ConvertPydictToJhmap(env, pReturn); + if (result == NULL) + { + cout << "ConvertPydictToJhmap error" << endl; + throw "函数返回值异常!"; + } + delete pModule, pFunc, data_1, settings_, pArg; + return result; + } + catch (const char* msg) + { + cout << "train error" << endl; + return NULL; + } +} + +jobject ${entity.pyName}_predict(JNIEnv* env, #{foreach} ($column in [1..$entity.dataLength])jobjectArray data${column}, #{end}jobject model_path_,jobject settings) +{ + try + { + + PyGILThreadLock lock; + PyObject* pModule = create_py_module("${entity.pyModule}.${entity.pyName}"); + if (pModule == NULL) + { + cout << "model error" << endl; + throw "模块调用失败!"; + } + + //*************导入函数****************** + PyObject* pFunc = PyObject_GetAttrString(pModule, "predict"); + if (pFunc == NULL) + { + cout << "func error" << endl; + throw "函数调用失败!"; + } +#{foreach} ($column in [1..$entity.dataLength]) + PyObject* data_${column} = ConvertJdarrToPydarr(env, data${column}); +#{end} + PyObject* model_path = ConvertJhmapToPydict(env, model_path_); + PyObject* settings_1 = ConvertJhmapToPydict(env, settings); + + + //************构造参数数据 ******************** +#set($a=$entity.dataLength + 2) + PyObject* pArg = PyTuple_New(${a}); +#{foreach} ($column in [1..$entity.dataLength]) +#set($a=$column - 1) + PyTuple_SetItem(pArg, ${a}, data_${column}); +#{end} + PyTuple_SetItem(pArg, ${entity.dataLength}, model_path); +#set($a=$entity.dataLength + 1) + PyTuple_SetItem(pArg, ${a}, settings_1); + + /*PyTuple_SetItem(pArg, 1, parseCppData(data_in->feature_range));*/ + + + //********************调用python方法计算***************** + PyObject* pReturn = PyEval_CallObject(pFunc, pArg); + if (pReturn == NULL) + { + cout << "return error" << endl; + throw "函数返回值异常!"; + } + //*******************返回数据封装************************ + // 开辟返回数据内存空间,转换数据,拆分数据 + + /*jobject result = jhmappydict_(env, pReturn);*/ + jobject result = ConvertPydictToJhmap(env, pReturn); + if (result == NULL) + { + cout << "ConvertPydictToJhmap error" << endl; + throw "函数返回值异常!"; + } + delete pModule; + pModule = nullptr; + delete pModule; + + delete pFunc; + pFunc = nullptr; + delete pFunc; + +#{foreach} ($column in [1..$entity.dataLength]) + delete[] data_${column}; + data_${column} = nullptr; + delete data_${column}; + +#{end} + delete model_path; + model_path = nullptr; + delete model_path; + + delete settings_1; + settings_1 = nullptr; + delete settings_1; + + delete[] pArg; + pArg = nullptr; + delete pArg; + + return result; + } + catch (const char* msg) + { + cout << "predict error" << endl; + return NULL; + } +} + +#{end} \ No newline at end of file -- Gitblit v1.9.3