From 9038ef8e634b04aa393f54c54890e89fed27786e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Fri, 23 Feb 2024 17:05:35 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E4=B8=8A=E4=BC=A0=E4=B8=8B=E8=BD=BD=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A2=84=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/model/ModelsController.java | 15 +++- .../ruoyi/platform/mapper/ExperimentDao.java | 4 +- .../ruoyi/platform/service/ModelsService.java | 4 + .../service/impl/DatasetServiceImpl.java | 4 +- .../impl/ExperimentInsServiceImpl.java | 74 ++++++++----------- .../service/impl/ExperimentServiceImpl.java | 2 + .../service/impl/ModelsServiceImpl.java | 26 +++++-- .../impl/ModelsVersionServiceImpl.java | 1 + 8 files changed, 74 insertions(+), 56 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java index 01a7755..2424b23 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java @@ -120,7 +120,7 @@ public class ModelsController { } /** - * 模型下载 + * 模型单个文件下载 * *@param models_version_id 模型版本表主键 * @return 单条数据 @@ -131,5 +131,18 @@ public class ModelsController { return AjaxResult.success(modelsService.downloadModels(models_version_id)); } + /** + * 模型打包下载 + * + *@param models_version_id 模型版本表主键 + * @return 单条数据 + */ + @GetMapping("/downloadAllFiles/{models_version_id}") + @ApiOperation(value = "下载模型", notes = "根据模型版本表id下载模型文件。") + public AjaxResult downloadAllModelFiles(@PathVariable("models_version_id") Integer models_version_id) { + return AjaxResult.success(modelsService.downloadAllModelFiles(models_version_id)); + } + + } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java index fe7a750..b36ef9c 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java @@ -45,7 +45,7 @@ public interface ExperimentDao { * @param experiment 实例对象 * @return 影响行数 */ - int insert(Experiment experiment); + int insert(@Param("experiment") Experiment experiment); /** * 批量新增数据(MyBatis原生foreach方法) @@ -70,7 +70,7 @@ public interface ExperimentDao { * @param experiment 实例对象 * @return 影响行数 */ - int update(Experiment experiment); + int update(@Param("experiment") Experiment experiment); /** * 通过主键删除数据 diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java index d0883c3..3461c59 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java @@ -66,7 +66,11 @@ public interface ModelsService { ResponseEntity downloadModels(Integer id); + + Map uploadModels(MultipartFile file, Integer id) throws Exception; Map uploadModelsPipeline(ModelsVersion modelsVersion) throws Exception; + + ResponseEntity downloadAllModelFiles(Integer modelsVersionId); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java index 0b14f0e..d2b190d 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java @@ -255,8 +255,8 @@ public class DatasetServiceImpl implements DatasetService { String version = datasetVersionToUse.getVersion(); Date createTime = datasetVersionToUse.getCreateTime(); String fileName = file.getOriginalFilename(); - String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); - String objectName = "datasets/" + username + "/" + dataset.getName() + "-" + timestamp + "/" + version + "/" + fileName; + // String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); + String objectName = "datasets/" + username + "/" + dataset.getName() + "/" + version + "/" + fileName; // 上传文件到MinIO try (InputStream inputStream = file.getInputStream()) { diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java index 3aeb7e4..738f41a 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java @@ -56,12 +56,12 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { * @return 实例对象 */ @Override - public ExperimentIns queryById(Integer id) throws IOException { + public ExperimentIns queryById(Integer id) { ExperimentIns experimentIns = this.experimentInsDao.queryById(id); - if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { + if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns.getStatus())) { experimentIns = this.queryStatusFromArgo(experimentIns); //只有当新状态是终止态时才更新数据库 - if (isTerminatedState(experimentIns)) { + if (isTerminatedState(experimentIns.getStatus())) { //同时更新各个节点 this.update(experimentIns); } @@ -78,17 +78,17 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { * @return 实验列表 */ @Override - public List getByExperimentId(Integer experimentId) throws IOException { + public List getByExperimentId(Integer experimentId) { List experimentInsList = experimentInsDao.getByExperimentId(experimentId); List result = new ArrayList(); if (experimentInsList!=null&&experimentInsList.size()>0) { for (ExperimentIns experimentIns : experimentInsList) { //当原本状态为null或非终止态时才调用argo接口 - if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns)) { + if (experimentIns != null && (StringUtils.isEmpty(experimentIns.getStatus())) || !isTerminatedState(experimentIns.getStatus())) { experimentIns = this.queryStatusFromArgo(experimentIns); //只有当新状态是终止态时才更新数据库 - if (isTerminatedState(experimentIns)) { + if (isTerminatedState(experimentIns.getStatus())) { //同时更新各个节点 this.update(experimentIns); } @@ -109,7 +109,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { * @return 查询结果 */ @Override - public Page queryByPage(ExperimentIns experimentIns, PageRequest pageRequest) throws IOException { + public Page queryByPage(ExperimentIns experimentIns, PageRequest pageRequest) { long total = this.experimentInsDao.count(experimentIns); List experimentInsList = this.experimentInsDao.queryAllByLimit(experimentIns, pageRequest); if (experimentInsList!=null && experimentInsList.size()>0) { @@ -152,7 +152,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { * @return 实例对象 */ @Override - public ExperimentIns update(ExperimentIns experimentIns) throws IOException { + public ExperimentIns update(ExperimentIns experimentIns) { LoginUser loginUser = SecurityUtils.getLoginUser(); experimentIns.setUpdateBy(loginUser.getUsername()); experimentIns.setUpdateTime(new Date()); @@ -212,8 +212,8 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { String namespace = ins.getArgoInsNs(); String name = ins.getArgoInsName(); Integer id = ins.getId(); - // 创建请求数据map ExperimentIns experimentIns = this.experimentInsDao.queryById(id); + // 创建请求数据map Map requestData = new HashMap<>(); requestData.put("namespace", namespace); requestData.put("name", name); @@ -241,6 +241,10 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { if (status == null || status.isEmpty()) { throw new RuntimeException("工作流状态为空。"); } + //解析流水线开始时间,开始时间一定存在,所以不需要判断 + Date startTime = DateUtils.convertUTCtoShanghaiDate((String) status.get("startedAt")); + experimentIns.setStartTime(startTime); + //解析流水线结束时间 String finishedAtString = (String) status.get("finishedAt"); @@ -251,23 +255,21 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { // 解析nodes字段,提取节点状态并转换为JSON字符串 Map nodes = (Map) status.get("nodes"); + if (nodes == null || nodes.isEmpty()) { + throw new RuntimeException("工作流的节点数据为空。"); + } + Map modifiedNodes = new LinkedHashMap<>(); - if (nodes != null ) { - for (Map.Entry nodeEntry : nodes.entrySet()) { - Map nodeDetails = (Map) nodeEntry.getValue(); - String templateName = (String) nodeDetails.get("displayName"); - modifiedNodes.put(templateName, nodeDetails); - } + + for (Map.Entry nodeEntry : nodes.entrySet()) { + Map nodeDetails = (Map) nodeEntry.getValue(); + String templateName = (String) nodeDetails.get("displayName"); + modifiedNodes.put(templateName, nodeDetails); } String nodeStatusJson = JsonUtils.mapToJson(modifiedNodes); experimentIns.setNodesStatus(nodeStatusJson); - - //终止态为终止不改 - if (!StringUtils.equals(experimentIns.getStatus(),"Terminated")) { - experimentIns.setStatus(StringUtils.isNotEmpty((String) status.get("phase"))?(String) status.get("phase"):"Pending"); - } - + experimentIns.setStatus((String) status.get("phase")); return experimentIns; @@ -276,6 +278,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { } + } /** @@ -326,11 +329,9 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { // 从响应Map中直接获取"errCode"的值 Integer errCode = (Integer) runResMap.get("errCode"); if (errCode != null && errCode == 0) { + experimentIns.setStatus("Terminated"); //更新experimentIns,确保状态更新被保存到数据库 - ExperimentIns ins = queryStatusFromArgo(experimentIns); - ins.setStatus("Terminated"); - ins.setFinishTime(new Date()); - this.experimentInsDao.update(ins); + this.experimentInsDao.update(experimentIns); return true; } else { return false; @@ -394,27 +395,10 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { } } - private boolean isTerminatedState(ExperimentIns ins) throws IOException { + private boolean isTerminatedState(String state) { // 定义终止态的列表,例如 "Succeeded", "Failed" 等 - String status = ins.getStatus(); - boolean flag = true; - List terminatedStates = Arrays.asList("Succeeded", "Failed"); - flag = terminatedStates.contains(status); - if (StringUtils.equals(status, "Terminated")){ - //如果跟node_status里面不一样,就要去更新node_status的信息 - String nodesStatus = ins.getNodesStatus(); - Map nodeMap = JsonUtils.jsonToMap(nodesStatus); - String keyStartsWithWorkflow = nodeMap.keySet().stream() - .filter(key -> key.startsWith("workflow-")) - .findFirst() - .orElse(null); - Map workflowMap = (Map) nodeMap.get(keyStartsWithWorkflow); - if (workflowMap != null){ - flag = StringUtils.equals("Terminated", (String) workflowMap.get("phase")); - } - } - - return flag; + List terminatedStates = Arrays.asList("Succeeded", "Failed", "Terminated"); + return terminatedStates.contains(state); } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java index b0a8e63..36b6fc1 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java @@ -103,6 +103,8 @@ public class ExperimentServiceImpl implements ExperimentService { /** * 分页查询实验状态 * + * + * * @param experiment 筛选条件 * @param pageRequest 分页对象 * @return 查询结果 diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java index f42282f..14087f7 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java @@ -153,6 +153,8 @@ public class ModelsServiceImpl implements ModelsService { //判断权限,只有admin和创建者本身可以删除该数据集 LoginUser loginUser = SecurityUtils.getLoginUser(); String username = loginUser.getUsername(); + + String createdBy = models.getCreateBy(); if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ return "无权限删除该模型"; @@ -246,8 +248,8 @@ public class ModelsServiceImpl implements ModelsService { String version = modelsVersionToUse.getVersion(); Date createTime = modelsVersionToUse.getCreateTime(); String fileName = file.getOriginalFilename(); - String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); - String objectName = "models/" + username + "/" + models.getName() + "-" + timestamp + "/" + version + "/" + fileName; + // String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); + String objectName = "models/" + username + "/" + models.getName() + "/" + version + "/" + fileName; // 上传文件到MinIO try (InputStream inputStream = file.getInputStream()) { @@ -270,6 +272,7 @@ public class ModelsServiceImpl implements ModelsService { String username = SecurityUtils.getLoginUser().getUsername(); // 检查是否存在 Models models = this.queryById(modelsVersion.getModelsId()); + if (models == null) { throw new Exception("模型不存在,请检查模型id"); } @@ -279,8 +282,8 @@ public class ModelsServiceImpl implements ModelsService { if (version == null) { //插表,因为这里是一次直接插表所以这里定掉date,然后用DAO插入 Date date = new Date(); - String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(date); - url = "models/" + username + "/" + models.getName() + "-" + timestamp + "/" + modelsVersion.getVersion() + "/" + modelsVersion.getFileName(); + //String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(date); + url = "models/" + username + "/" + models.getName() + "-" + "/" + modelsVersion.getVersion() + "/" + modelsVersion.getFileName(); modelsVersion.setUrl(url); modelsVersion.setCreateBy(username); modelsVersion.setUpdateBy(username); @@ -292,8 +295,8 @@ public class ModelsServiceImpl implements ModelsService { //改表 BeansUtils.copyPropertiesIgnoreNull(modelsVersion, version); Date createTime = version.getCreateTime(); - String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); - url = "models/" + username + "/" + models.getName() + "-" + timestamp + "/" + modelsVersion.getVersion() + "/" + modelsVersion.getFileName(); + // String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); + url = "models/" + username + "/" + models.getName() + "-" + "/" + modelsVersion.getVersion() + "/" + modelsVersion.getFileName(); version.setUrl(url); modelsVersionService.update(version); } @@ -302,6 +305,17 @@ public class ModelsServiceImpl implements ModelsService { return result; } + /** + * 下载所有模型文件,用压缩包的方式返回 + * + * @param modelsVersionId models_version表的主键 + * @return 文件内容 + */ + @Override + public ResponseEntity downloadAllModelFiles(Integer modelsVersionId) { + return null; + } + private String extractFileName(String urlStr) { return urlStr.substring(urlStr.lastIndexOf('/') + 1); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java index d8ed146..8732275 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsVersionServiceImpl.java @@ -146,6 +146,7 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { } public ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion){ + return this.modelsVersionDao.queryByModelsVersion(modelsVersion); } From b4db59c5630a952420f8b4fc3a31208d68b5df28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Tue, 27 Feb 2024 16:31:47 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=90=8C=E6=A8=A1=E5=9E=8B=E5=90=8C?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=A4=9A=E6=96=87=E4=BB=B6=E6=89=93=E5=8C=85?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/model/ModelsController.java | 17 ++++--- .../platform/mapper/ModelsVersionDao.java | 4 +- .../ruoyi/platform/service/ModelsService.java | 2 +- .../service/impl/ModelsServiceImpl.java | 51 ++++++++++++++++--- .../ModelsVersionDaoMapper.xml | 20 +++++++- 5 files changed, 77 insertions(+), 17 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java index 2424b23..b2624c9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/model/ModelsController.java @@ -7,7 +7,9 @@ import com.ruoyi.platform.domain.ModelsVersion; import com.ruoyi.platform.service.ModelsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.core.io.InputStreamResource; import org.springframework.data.domain.PageRequest; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -127,20 +129,21 @@ public class ModelsController { */ @GetMapping("/download/{models_version_id}") @ApiOperation(value = "下载模型", notes = "根据模型版本表id下载模型文件。") - public AjaxResult downloadModels(@PathVariable("models_version_id") Integer models_version_id) { - return AjaxResult.success(modelsService.downloadModels(models_version_id)); + public ResponseEntity downloadModels(@PathVariable("models_version_id") Integer models_version_id) { + return modelsService.downloadModels(models_version_id); } /** * 模型打包下载 * - *@param models_version_id 模型版本表主键 + * @param modelsId 模型版本表主键 + * @param version 模型版本表主键 * @return 单条数据 */ - @GetMapping("/downloadAllFiles/{models_version_id}") - @ApiOperation(value = "下载模型", notes = "根据模型版本表id下载模型文件。") - public AjaxResult downloadAllModelFiles(@PathVariable("models_version_id") Integer models_version_id) { - return AjaxResult.success(modelsService.downloadAllModelFiles(models_version_id)); + @GetMapping("/downloadAllFiles") + @ApiOperation(value = "下载模型压缩包", notes = "根据模型ID和版本下载所有模型文件,并打包。") + public ResponseEntity downloadAllModelFiles(@RequestParam("models_id") Integer modelsId, @RequestParam("version") String version) { + return modelsService.downloadAllModelFiles(modelsId, version); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelsVersionDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelsVersionDao.java index d4a843a..a51ae5a 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelsVersionDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ModelsVersionDao.java @@ -82,6 +82,8 @@ public interface ModelsVersionDao { List queryByModelsId(Integer modelsId); - ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion); + ModelsVersion queryByModelsVersion(@Param("modelsVersion") ModelsVersion modelsVersion); + + List queryAllByModelsVersion(@Param("modelsId") Integer modelsId, @Param("version") String version); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java index 3461c59..5fc7ea9 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ModelsService.java @@ -72,5 +72,5 @@ public interface ModelsService { Map uploadModelsPipeline(ModelsVersion modelsVersion) throws Exception; - ResponseEntity downloadAllModelFiles(Integer modelsVersionId); + ResponseEntity downloadAllModelFiles(Integer modelsId, String version); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java index 14087f7..1452cb1 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java @@ -1,8 +1,6 @@ package com.ruoyi.platform.service.impl; import com.ruoyi.common.security.utils.SecurityUtils; -import com.ruoyi.platform.domain.Dataset; -import com.ruoyi.platform.domain.DatasetVersion; import com.ruoyi.platform.domain.Models; import com.ruoyi.platform.domain.ModelsVersion; import com.ruoyi.platform.mapper.ModelsDao; @@ -14,7 +12,6 @@ import com.ruoyi.platform.utils.MinioUtil; import com.ruoyi.system.api.model.LoginUser; import io.minio.MinioClient; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.InputStreamResource; import org.springframework.data.domain.Page; @@ -31,10 +28,12 @@ import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * (Models)表服务实现类 @@ -308,12 +307,50 @@ public class ModelsServiceImpl implements ModelsService { /** * 下载所有模型文件,用压缩包的方式返回 * - * @param modelsVersionId models_version表的主键 + * @param modelsId 模型ID + * @param version 模型版本号 * @return 文件内容 */ @Override - public ResponseEntity downloadAllModelFiles(Integer modelsVersionId) { - return null; + public ResponseEntity downloadAllModelFiles(Integer modelsId, String version) { + // 查询特定模型和版本对应的所有文件 + List modelsVersionList = this.modelsVersionDao.queryAllByModelsVersion(modelsId, version); + if (modelsVersionList == null || modelsVersionList.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); + } + + // 创建ZIP文件,准备打包下载 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (ZipOutputStream zos = new ZipOutputStream(baos)) { + //遍历每一个version数据项 + + for (ModelsVersion modelsVersion : modelsVersionList) { + String objectName = modelsVersion.getUrl(); + if (objectName != null && !objectName.isEmpty()) { + // 使用ByteArrayOutputStream来捕获MinIO中的文件 + ByteArrayOutputStream fileOutputStream = new ByteArrayOutputStream(); + minioUtil.downloadObject(bucketName, objectName, fileOutputStream); + // 添加到ZIP文件 + zos.putNextEntry(new ZipEntry(extractFileName(objectName))); + fileOutputStream.writeTo(zos); + zos.closeEntry(); + } + } + + // 转换为输入流 + ByteArrayInputStream inputStream = new ByteArrayInputStream(baos.toByteArray()); + InputStreamResource resource = new InputStreamResource(inputStream); + + // 设置响应 + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"models_" + modelsId + "_version_" + version + ".zip\"") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(resource); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); + } + } private String extractFileName(String urlStr) { diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ModelsVersionDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ModelsVersionDaoMapper.xml index bf38bf7..b704847 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ModelsVersionDaoMapper.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ModelsVersionDaoMapper.xml @@ -31,6 +31,23 @@ + + + + + + + + + + - select id,dataset_id,version,url,file_name,file_size,available_cluster,status,create_by,create_time,update_by,update_time,state from dataset_version