| @@ -9,7 +9,9 @@ import io.swagger.annotations.Api; | |||||
| import io.swagger.annotations.ApiImplicitParam; | import io.swagger.annotations.ApiImplicitParam; | ||||
| import io.swagger.annotations.ApiImplicitParams; | import io.swagger.annotations.ApiImplicitParams; | ||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import org.springframework.core.io.InputStreamResource; | |||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| import org.springframework.http.ResponseEntity; | |||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | import org.springframework.web.multipart.MultipartFile; | ||||
| @@ -106,26 +108,22 @@ public class DatasetController { | |||||
| */ | */ | ||||
| @GetMapping("/download/{dataset_version_id}") | @GetMapping("/download/{dataset_version_id}") | ||||
| @ApiOperation(value = "下载数据集", notes = "根据数据集版本表id下载数据集文件") | @ApiOperation(value = "下载数据集", notes = "根据数据集版本表id下载数据集文件") | ||||
| public AjaxResult downloadDataset(@PathVariable("dataset_version_id") Integer dataset_version_id) { | |||||
| return AjaxResult.success(datasetService.downloadDataset(dataset_version_id)); | |||||
| public ResponseEntity<InputStreamResource> downloadDataset(@PathVariable("dataset_version_id") Integer dataset_version_id) { | |||||
| return datasetService.downloadDataset(dataset_version_id); | |||||
| } | } | ||||
| /** | /** | ||||
| * 上传数据集 | * 上传数据集 | ||||
| * | * | ||||
| * @param dataset_version_id ps:这里的id是dataset_version表的主键 | |||||
| * @param file 上传的数据集文件 | |||||
| * @param datasetId 数据集ID | |||||
| * @param files 上传的数据集文件 | |||||
| * @param version 版本文件 | |||||
| * @return 上传结果 | * @return 上传结果 | ||||
| */ | */ | ||||
| @PostMapping("/upload/{dataset_version_id}") | |||||
| @PostMapping("/upload") | |||||
| @ApiOperation(value = "上传数据集", notes = "根据数据集版本表id上传数据集文件,并将信息存入数据库。") | @ApiOperation(value = "上传数据集", notes = "根据数据集版本表id上传数据集文件,并将信息存入数据库。") | ||||
| @ApiImplicitParams({ | |||||
| @ApiImplicitParam(name = "file", value = "要上传的数据集文件", required = true, dataType = "file", paramType = "form"), | |||||
| @ApiImplicitParam(name = "dataset_version_id", value = "数据集版本表id", required = true, dataType = "integer", paramType = "path") | |||||
| }) | |||||
| public AjaxResult uploadDataset(@RequestParam("file") MultipartFile file, | |||||
| @PathVariable("dataset_version_id") Integer dataset_version_id) throws Exception { | |||||
| return AjaxResult.success(this.datasetService.uploadDataset(file, dataset_version_id)); | |||||
| public AjaxResult uploadDataset(@RequestParam("files") MultipartFile[] files, @RequestParam("dataset_id") Integer datasetId, @RequestParam("version") String version) throws Exception { | |||||
| return AjaxResult.success(this.datasetService.uploadDataset(files,datasetId,version )); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -53,6 +53,20 @@ public class DatasetVersionController { | |||||
| return AjaxResult.success(this.datasetVersionService.queryById(id)); | return AjaxResult.success(this.datasetVersionService.queryById(id)); | ||||
| } | } | ||||
| /** | |||||
| * 通过数据集id和version查询版本列表 | |||||
| * | |||||
| * @param datasetId 数据集ID | |||||
| * @param version 数据集版本 | |||||
| * @return 匹配的数据集版本记录列表 | |||||
| */ | |||||
| @GetMapping("/versions") | |||||
| public AjaxResult queryByDatasetIdAndVersion(@RequestParam("dataset_id") Integer datasetId, | |||||
| @RequestParam("version") String version) { | |||||
| return AjaxResult.success(this.datasetVersionService.queryByDatasetIdAndVersion(datasetId, version)); | |||||
| } | |||||
| /** | /** | ||||
| * 新增数据 | * 新增数据 | ||||
| * | * | ||||
| @@ -89,5 +103,19 @@ public class DatasetVersionController { | |||||
| return AjaxResult.success(this.datasetVersionService.removeById(id)); | return AjaxResult.success(this.datasetVersionService.removeById(id)); | ||||
| } | } | ||||
| /** | |||||
| * 删除版本下的所有数据 | |||||
| * | |||||
| * @param datasetId 模型主键 | |||||
| * @param version 版本 | |||||
| * @return 删除是否成功 | |||||
| */ | |||||
| @DeleteMapping("/deleteVersion") | |||||
| @ApiOperation(value = "逻辑删除模型版本", notes = "根据模型ID和版本逻辑删除模型版本记录。") | |||||
| public AjaxResult deleteModelsVersion(@RequestParam("dataset_id") Integer datasetId, | |||||
| @RequestParam("version") String version) { | |||||
| return AjaxResult.success(this.datasetVersionService.deleteDatasetVersion(datasetId, version)); | |||||
| } | |||||
| } | } | ||||
| @@ -7,7 +7,9 @@ import com.ruoyi.platform.domain.ModelsVersion; | |||||
| import com.ruoyi.platform.service.ModelsService; | import com.ruoyi.platform.service.ModelsService; | ||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import org.springframework.core.io.InputStreamResource; | |||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| import org.springframework.http.ResponseEntity; | |||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | import org.springframework.web.multipart.MultipartFile; | ||||
| @@ -102,10 +104,10 @@ public class ModelsController { | |||||
| * @return 上传结果 | * @return 上传结果 | ||||
| */ | */ | ||||
| @PostMapping("/upload/{models_version_id}") | |||||
| @ApiOperation(value = "上传模型", notes = "根据模型版本表id上传模型文件,并将信息存入数据库。") | |||||
| public AjaxResult uploadModels(@RequestParam("file") MultipartFile file, @PathVariable("models_version_id") Integer models_version_id) throws Exception { | |||||
| return AjaxResult.success(this.modelsService.uploadModels(file,models_version_id)); | |||||
| @PostMapping("/upload") | |||||
| @ApiOperation(value = "上传模型", notes = "根据模型id和版本号上传模型文件,并将信息存入数据库。") | |||||
| public AjaxResult uploadModels(@RequestParam("files") MultipartFile[] files, @RequestParam("models_id") Integer modelsId, @RequestParam("version") String version) throws Exception { | |||||
| return AjaxResult.success(this.modelsService.uploadModels(files,modelsId,version)); | |||||
| } | } | ||||
| @@ -120,16 +122,32 @@ public class ModelsController { | |||||
| } | } | ||||
| /** | /** | ||||
| * 模型下载 | |||||
| * 模型单个文件下载 | |||||
| * | * | ||||
| *@param models_version_id 模型版本表主键 | *@param models_version_id 模型版本表主键 | ||||
| * @return 单条数据 | * @return 单条数据 | ||||
| */ | */ | ||||
| @GetMapping("/download/{models_version_id}") | @GetMapping("/download/{models_version_id}") | ||||
| @ApiOperation(value = "下载模型", notes = "根据模型版本表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<InputStreamResource> downloadModels(@PathVariable("models_version_id") Integer models_version_id) { | |||||
| return modelsService.downloadModels(models_version_id); | |||||
| } | } | ||||
| /** | |||||
| * 模型打包下载 | |||||
| * | |||||
| * @param modelsId 模型版本表主键 | |||||
| * @param version 模型版本表主键 | |||||
| * @return 单条数据 | |||||
| */ | |||||
| @GetMapping("/downloadAllFiles") | |||||
| @ApiOperation(value = "下载模型压缩包", notes = "根据模型ID和版本下载所有模型文件,并打包。") | |||||
| public ResponseEntity<InputStreamResource> downloadAllModelFiles(@RequestParam("models_id") Integer modelsId, @RequestParam("version") String version) { | |||||
| return modelsService.downloadAllModelFiles(modelsId, version); | |||||
| } | |||||
| } | } | ||||
| @@ -52,6 +52,23 @@ public class ModelsVersionController { | |||||
| return AjaxResult.success(this.modelsVersionService.queryById(id)); | return AjaxResult.success(this.modelsVersionService.queryById(id)); | ||||
| } | } | ||||
| /** | |||||
| * 通过模型id和version查询版本列表 | |||||
| * | |||||
| * @param modelsId 模型ID | |||||
| * @param version 模型版本 | |||||
| * @return 匹配的模型版本记录列表 | |||||
| */ | |||||
| @GetMapping("/versions") | |||||
| public AjaxResult queryByModelsIdAndVersion(@RequestParam("models_id") Integer modelsId, | |||||
| @RequestParam("version") String version) { | |||||
| return AjaxResult.success(this.modelsVersionService.queryByModelsIdAndVersion(modelsId, version)); | |||||
| } | |||||
| /** | /** | ||||
| * 新增数据 | * 新增数据 | ||||
| * | * | ||||
| @@ -75,7 +92,7 @@ public class ModelsVersionController { | |||||
| } | } | ||||
| /** | /** | ||||
| * 删除数据 | |||||
| * 根据id删除单条数据 | |||||
| * | * | ||||
| * @param id 主键 | * @param id 主键 | ||||
| * @return 删除是否成功 | * @return 删除是否成功 | ||||
| @@ -85,5 +102,21 @@ public class ModelsVersionController { | |||||
| return AjaxResult.success(this.modelsVersionService.removeById(id)); | return AjaxResult.success(this.modelsVersionService.removeById(id)); | ||||
| } | } | ||||
| /** | |||||
| * 删除版本下的所有数据 | |||||
| * | |||||
| * @param modelsId 模型主键 | |||||
| * @param version 版本 | |||||
| * @return 删除是否成功 | |||||
| */ | |||||
| @DeleteMapping("/deleteVersion") | |||||
| @ApiOperation(value = "逻辑删除模型版本", notes = "根据模型ID和版本逻辑删除模型版本记录。") | |||||
| public AjaxResult deleteModelsVersion(@RequestParam("models_id") Integer modelsId, | |||||
| @RequestParam("version") String version) { | |||||
| return AjaxResult.success(this.modelsVersionService.deleteModelsVersion(modelsId, version)); | |||||
| } | |||||
| } | } | ||||
| @@ -86,6 +86,9 @@ public interface DatasetVersionDao { | |||||
| DatasetVersion queryByDatasetVersion(DatasetVersion datasetVersion); | DatasetVersion queryByDatasetVersion(DatasetVersion datasetVersion); | ||||
| List<DatasetVersion> queryAllByDatasetVersion(@Param("datasetId") Integer datasetId, @Param("version") String version); | |||||
| } | } | ||||
| @@ -45,7 +45,7 @@ public interface ExperimentDao { | |||||
| * @param experiment 实例对象 | * @param experiment 实例对象 | ||||
| * @return 影响行数 | * @return 影响行数 | ||||
| */ | */ | ||||
| int insert(Experiment experiment); | |||||
| int insert(@Param("experiment") Experiment experiment); | |||||
| /** | /** | ||||
| * 批量新增数据(MyBatis原生foreach方法) | * 批量新增数据(MyBatis原生foreach方法) | ||||
| @@ -70,7 +70,7 @@ public interface ExperimentDao { | |||||
| * @param experiment 实例对象 | * @param experiment 实例对象 | ||||
| * @return 影响行数 | * @return 影响行数 | ||||
| */ | */ | ||||
| int update(Experiment experiment); | |||||
| int update(@Param("experiment") Experiment experiment); | |||||
| /** | /** | ||||
| * 通过主键删除数据 | * 通过主键删除数据 | ||||
| @@ -82,6 +82,8 @@ public interface ModelsVersionDao { | |||||
| List<ModelsVersion> queryByModelsId(Integer modelsId); | List<ModelsVersion> queryByModelsId(Integer modelsId); | ||||
| ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion); | |||||
| ModelsVersion queryByModelsVersion(@Param("modelsVersion") ModelsVersion modelsVersion); | |||||
| List<ModelsVersion> queryAllByModelsVersion(@Param("modelsId") Integer modelsId, @Param("version") String version); | |||||
| } | } | ||||
| @@ -69,7 +69,7 @@ public interface DatasetService { | |||||
| ResponseEntity<InputStreamResource> downloadDataset(Integer id); | ResponseEntity<InputStreamResource> downloadDataset(Integer id); | ||||
| Map uploadDataset(MultipartFile file, Integer id) throws Exception; | |||||
| Map uploadDataset(MultipartFile[] files, Integer id, String version) throws Exception; | |||||
| Map uploadDatasetPipeline(DatasetVersion datasetVersion) throws Exception; | Map uploadDatasetPipeline(DatasetVersion datasetVersion) throws Exception; | ||||
| } | } | ||||
| @@ -8,6 +8,7 @@ import org.springframework.data.domain.Page; | |||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| /** | /** | ||||
| * (DatasetVersion)表服务接口 | * (DatasetVersion)表服务接口 | ||||
| @@ -65,4 +66,8 @@ public interface DatasetVersionService { | |||||
| DatasetVersion duplicateDatasetVersion(DatasetVersion oldDatasetVersion); | DatasetVersion duplicateDatasetVersion(DatasetVersion oldDatasetVersion); | ||||
| DatasetVersion queryByDatasetVersion(DatasetVersion datasetVersion); | DatasetVersion queryByDatasetVersion(DatasetVersion datasetVersion); | ||||
| List<DatasetVersion> queryByDatasetIdAndVersion(Integer datasetId, String version); | |||||
| Map<Integer,String> deleteDatasetVersion(Integer datasetId, String version); | |||||
| } | } | ||||
| @@ -66,7 +66,11 @@ public interface ModelsService { | |||||
| ResponseEntity<InputStreamResource> downloadModels(Integer id); | ResponseEntity<InputStreamResource> downloadModels(Integer id); | ||||
| Map uploadModels(MultipartFile file, Integer id) throws Exception; | |||||
| Map uploadModels(MultipartFile[] files, Integer id, String version) throws Exception; | |||||
| Map uploadModelsPipeline(ModelsVersion modelsVersion) throws Exception; | Map uploadModelsPipeline(ModelsVersion modelsVersion) throws Exception; | ||||
| ResponseEntity<InputStreamResource> downloadAllModelFiles(Integer modelsId, String version); | |||||
| } | } | ||||
| @@ -2,12 +2,12 @@ package com.ruoyi.platform.service; | |||||
| import com.ruoyi.platform.domain.Models; | |||||
| import com.ruoyi.platform.domain.ModelsVersion; | import com.ruoyi.platform.domain.ModelsVersion; | ||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| /** | /** | ||||
| * (ModelsVersion)表服务接口 | * (ModelsVersion)表服务接口 | ||||
| @@ -65,4 +65,8 @@ public interface ModelsVersionService { | |||||
| ModelsVersion duplicateModelsVersion(ModelsVersion oldModelsVersion); | ModelsVersion duplicateModelsVersion(ModelsVersion oldModelsVersion); | ||||
| ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion); | ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion); | ||||
| List<ModelsVersion> queryByModelsIdAndVersion(Integer modelsId, String version); | |||||
| Map<Integer, String> deleteModelsVersion(Integer modelsId, String version); | |||||
| } | } | ||||
| @@ -4,7 +4,8 @@ package com.ruoyi.platform.service.impl; | |||||
| import com.ruoyi.common.security.utils.SecurityUtils; | import com.ruoyi.common.security.utils.SecurityUtils; | ||||
| import com.ruoyi.platform.domain.Dataset; | import com.ruoyi.platform.domain.Dataset; | ||||
| import com.ruoyi.platform.domain.DatasetVersion; | import com.ruoyi.platform.domain.DatasetVersion; | ||||
| import com.ruoyi.platform.domain.Workflow; | |||||
| import com.ruoyi.platform.domain.Models; | |||||
| import com.ruoyi.platform.domain.ModelsVersion; | |||||
| import com.ruoyi.platform.mapper.DatasetDao; | import com.ruoyi.platform.mapper.DatasetDao; | ||||
| import com.ruoyi.platform.mapper.DatasetVersionDao; | import com.ruoyi.platform.mapper.DatasetVersionDao; | ||||
| import com.ruoyi.platform.service.DatasetService; | import com.ruoyi.platform.service.DatasetService; | ||||
| @@ -14,7 +15,6 @@ import com.ruoyi.platform.utils.MinioUtil; | |||||
| import com.ruoyi.system.api.model.LoginUser; | import com.ruoyi.system.api.model.LoginUser; | ||||
| import io.minio.MinioClient; | import io.minio.MinioClient; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.BeanUtils; | |||||
| import org.springframework.beans.factory.annotation.Value; | import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.core.io.InputStreamResource; | import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| @@ -34,7 +34,6 @@ import java.io.InputStream; | |||||
| import java.text.SimpleDateFormat; | import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | |||||
| import java.util.Map; | import java.util.Map; | ||||
| /** | /** | ||||
| @@ -212,65 +211,56 @@ public class DatasetServiceImpl implements DatasetService { | |||||
| /** | /** | ||||
| * 上传数据集 | * 上传数据集 | ||||
| * | * | ||||
| * @param file 文件 | |||||
| * @param id 注意是dataset_version表的主键 | |||||
| * @param files 文件 | |||||
| * @param id 注意是dataset_version表的主键 | |||||
| * @param version | |||||
| * @return 是否成功 | * @return 是否成功 | ||||
| */ | */ | ||||
| @Override | @Override | ||||
| public Map uploadDataset(MultipartFile file, Integer id) throws Exception { | |||||
| if (file.isEmpty()) { | |||||
| throw new Exception("文件为空,无法上传"); | |||||
| } | |||||
| // 获取文件大小并转换为KB | |||||
| long sizeInBytes = file.getSize(); | |||||
| double sizeInKB = sizeInBytes / 1024.0; | |||||
| // 检查并处理现有的数据集版本记录 | |||||
| DatasetVersion currentDatasetVersion = this.datasetVersionDao.queryById(id); | |||||
| if (currentDatasetVersion == null) { | |||||
| throw new Exception("未找到数据集版本记录"); | |||||
| } | |||||
| DatasetVersion datasetVersionToUse = currentDatasetVersion; | |||||
| //检查版本下是否存在URL记录 | |||||
| String url = currentDatasetVersion.getUrl(); | |||||
| if (url != null && !url.isEmpty()) { | |||||
| // 逻辑删除当前版本 | |||||
| currentDatasetVersion.setState(0); | |||||
| datasetVersionDao.update(currentDatasetVersion); | |||||
| // 创建并插入新版本 | |||||
| datasetVersionToUse = this.datasetVersionService.duplicateDatasetVersion(currentDatasetVersion); | |||||
| public Map uploadDataset(MultipartFile[] files, Integer id, String version) throws Exception { | |||||
| Map<String, Object> results = new HashMap<String, Object>(); | |||||
| } | |||||
| //查询数据集名称 | |||||
| Integer datasetID = datasetVersionToUse.getDatasetId(); | |||||
| Dataset dataset = this.datasetDao.queryById(datasetID); | |||||
| // 验证模型是否存在 | |||||
| Dataset dataset = this.datasetDao.queryById(id); | |||||
| if (dataset == null) { | if (dataset == null) { | ||||
| throw new Exception("未找到数据集记录"); | |||||
| throw new Exception("未找到模型记录"); | |||||
| } | } | ||||
| // 其余操作基于 datasetVersionToUse | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | |||||
| 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; | |||||
| // 上传文件到MinIO | |||||
| try (InputStream inputStream = file.getInputStream()) { | |||||
| minioUtil.uploadObject(bucketName, objectName, inputStream); | |||||
| datasetVersionToUse.setUrl(objectName); | |||||
| datasetVersionToUse.setFileName(fileName); | |||||
| datasetVersionToUse.setFileSize(String.valueOf(sizeInKB)); | |||||
| datasetVersionDao.update(datasetVersionToUse); | |||||
| } catch (Exception e) { | |||||
| throw new Exception("上传到数据集失败: " + e.getMessage(), e); | |||||
| for (MultipartFile file:files){ | |||||
| if (file.isEmpty()) { | |||||
| throw new Exception("文件为空,无法上传"); | |||||
| } | |||||
| // 获取文件大小并转换为KB | |||||
| long sizeInBytes = file.getSize(); | |||||
| double sizeInKB = sizeInBytes / 1024.0; | |||||
| // 其余操作基于 modelsVersionToUse | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | |||||
| String fileName = file.getOriginalFilename(); | |||||
| // String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); | |||||
| String objectName = "datasets/" + username + "/" + dataset.getName() + "/" + version + "/" + fileName; | |||||
| // 上传文件到MinIO并将记录新增到数据库中 | |||||
| try (InputStream inputStream = file.getInputStream()) { | |||||
| minioUtil.uploadObject(bucketName, objectName, inputStream); | |||||
| DatasetVersion datasetVersion = new DatasetVersion(); | |||||
| datasetVersion.setDatasetId(id); | |||||
| datasetVersion.setVersion(version); | |||||
| datasetVersion.setUrl(objectName); | |||||
| datasetVersion.setFileName(fileName); | |||||
| datasetVersion.setFileSize(String.valueOf(sizeInKB)); | |||||
| datasetVersionService.insert(datasetVersion); | |||||
| } catch (Exception e) { | |||||
| throw new Exception("上传数据集失败: " + e.getMessage(), e); | |||||
| } | |||||
| Map<String, String> fileResult = new HashMap<>(); | |||||
| fileResult.put("fileName", file.getOriginalFilename()); | |||||
| fileResult.put("url", objectName); // objectName根据实际情况定义 | |||||
| results.put(file.getOriginalFilename(), fileResult); | |||||
| } | } | ||||
| Map<String, String> result = new HashMap<String, String>(); | |||||
| result.put("url",objectName); | |||||
| return result; | |||||
| return results; | |||||
| } | } | ||||
| @Override | @Override | ||||
| @@ -2,6 +2,7 @@ package com.ruoyi.platform.service.impl; | |||||
| import com.ruoyi.common.security.utils.SecurityUtils; | import com.ruoyi.common.security.utils.SecurityUtils; | ||||
| import com.ruoyi.platform.domain.DatasetVersion; | import com.ruoyi.platform.domain.DatasetVersion; | ||||
| import com.ruoyi.platform.domain.ModelsVersion; | |||||
| import com.ruoyi.platform.domain.Workflow; | import com.ruoyi.platform.domain.Workflow; | ||||
| import com.ruoyi.platform.mapper.DatasetVersionDao; | import com.ruoyi.platform.mapper.DatasetVersionDao; | ||||
| import com.ruoyi.platform.service.DatasetVersionService; | import com.ruoyi.platform.service.DatasetVersionService; | ||||
| @@ -14,7 +15,9 @@ import org.springframework.stereotype.Service; | |||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.HashMap; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| /** | /** | ||||
| * (DatasetVersion)表服务实现类 | * (DatasetVersion)表服务实现类 | ||||
| @@ -145,4 +148,22 @@ public class DatasetVersionServiceImpl implements DatasetVersionService { | |||||
| return datasetVersionDao.queryByDatasetVersion(datasetVersion); | return datasetVersionDao.queryByDatasetVersion(datasetVersion); | ||||
| } | } | ||||
| @Override | |||||
| public List<DatasetVersion> queryByDatasetIdAndVersion(Integer datasetId, String version) { | |||||
| return this.datasetVersionDao.queryAllByDatasetVersion(datasetId, version); | |||||
| } | |||||
| @Override | |||||
| public Map<Integer, String> deleteDatasetVersion(Integer datasetId, String version) { | |||||
| Map<Integer, String> results = new HashMap<Integer,String>(); | |||||
| // 根据模型ID和版本查询所有模型版本 | |||||
| List<DatasetVersion> versions = this.datasetVersionDao.queryAllByDatasetVersion(datasetId, version); | |||||
| //逻辑删除列表中的数据项 | |||||
| for(DatasetVersion datasetVersion:versions){ | |||||
| String result = this.removeById(datasetVersion.getId()); | |||||
| results.put(datasetVersion.getId(), result); | |||||
| } | |||||
| return results; | |||||
| } | |||||
| } | } | ||||
| @@ -103,6 +103,8 @@ public class ExperimentServiceImpl implements ExperimentService { | |||||
| /** | /** | ||||
| * 分页查询实验状态 | * 分页查询实验状态 | ||||
| * | * | ||||
| * | |||||
| * | |||||
| * @param experiment 筛选条件 | * @param experiment 筛选条件 | ||||
| * @param pageRequest 分页对象 | * @param pageRequest 分页对象 | ||||
| * @return 查询结果 | * @return 查询结果 | ||||
| @@ -1,8 +1,6 @@ | |||||
| package com.ruoyi.platform.service.impl; | package com.ruoyi.platform.service.impl; | ||||
| import com.ruoyi.common.security.utils.SecurityUtils; | 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.Models; | ||||
| import com.ruoyi.platform.domain.ModelsVersion; | import com.ruoyi.platform.domain.ModelsVersion; | ||||
| import com.ruoyi.platform.mapper.ModelsDao; | import com.ruoyi.platform.mapper.ModelsDao; | ||||
| @@ -14,7 +12,6 @@ import com.ruoyi.platform.utils.MinioUtil; | |||||
| import com.ruoyi.system.api.model.LoginUser; | import com.ruoyi.system.api.model.LoginUser; | ||||
| import io.minio.MinioClient; | import io.minio.MinioClient; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.BeanUtils; | |||||
| import org.springframework.beans.factory.annotation.Value; | import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.core.io.InputStreamResource; | import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| @@ -31,10 +28,12 @@ import javax.annotation.Resource; | |||||
| import java.io.ByteArrayInputStream; | import java.io.ByteArrayInputStream; | ||||
| import java.io.ByteArrayOutputStream; | import java.io.ByteArrayOutputStream; | ||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | |||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.zip.ZipEntry; | |||||
| import java.util.zip.ZipOutputStream; | |||||
| /** | /** | ||||
| * (Models)表服务实现类 | * (Models)表服务实现类 | ||||
| @@ -153,6 +152,8 @@ public class ModelsServiceImpl implements ModelsService { | |||||
| //判断权限,只有admin和创建者本身可以删除该数据集 | //判断权限,只有admin和创建者本身可以删除该数据集 | ||||
| LoginUser loginUser = SecurityUtils.getLoginUser(); | LoginUser loginUser = SecurityUtils.getLoginUser(); | ||||
| String username = loginUser.getUsername(); | String username = loginUser.getUsername(); | ||||
| String createdBy = models.getCreateBy(); | String createdBy = models.getCreateBy(); | ||||
| if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ | if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ | ||||
| return "无权限删除该模型"; | return "无权限删除该模型"; | ||||
| @@ -203,65 +204,56 @@ public class ModelsServiceImpl implements ModelsService { | |||||
| /** | /** | ||||
| * 上传模型 | * 上传模型 | ||||
| * | * | ||||
| * @param file 文件 | |||||
| * @param id 注意是models_version表的主键 | |||||
| * @param files 文件 | |||||
| * @param id 模型id | |||||
| * @param version 模型版本 | |||||
| * @return 是否成功 | * @return 是否成功 | ||||
| */ | */ | ||||
| @Override | @Override | ||||
| public Map uploadModels(MultipartFile file, Integer id) throws Exception { | |||||
| if (file.isEmpty()) { | |||||
| throw new Exception("文件为空,无法上传"); | |||||
| } | |||||
| // 获取文件大小并转换为KB | |||||
| long sizeInBytes = file.getSize(); | |||||
| double sizeInKB = sizeInBytes / 1024.0; | |||||
| // 检查并处理现有的数据集版本记录 | |||||
| ModelsVersion currentModelsVersion = this.modelsVersionDao.queryById(id); | |||||
| if (currentModelsVersion == null) { | |||||
| throw new Exception("未找到模型版本记录"); | |||||
| } | |||||
| public Map uploadModels(MultipartFile[] files, Integer id, String version) throws Exception { | |||||
| ModelsVersion modelsVersionToUse = currentModelsVersion; | |||||
| //检查是否存在URL记录 | |||||
| String url = currentModelsVersion.getUrl(); | |||||
| if (url != null && !url.isEmpty()) { | |||||
| // 逻辑删除当前版本 | |||||
| currentModelsVersion.setState(0); | |||||
| modelsVersionDao.update(currentModelsVersion); | |||||
| Map<String, Object> results = new HashMap<String, Object>(); | |||||
| // 复制原有版本并在数据库中插入新版本 | |||||
| modelsVersionToUse = this.modelsVersionService.duplicateModelsVersion(currentModelsVersion); | |||||
| } | |||||
| //查询模型名称 | |||||
| Integer modelsId = modelsVersionToUse.getModelsId(); | |||||
| Models models = this.modelsDao.queryById(modelsId); | |||||
| // 验证模型是否存在 | |||||
| Models models = this.modelsDao.queryById(id); | |||||
| if (models == null) { | if (models == null) { | ||||
| throw new Exception("未找到模型记录"); | throw new Exception("未找到模型记录"); | ||||
| } | } | ||||
| // 其余操作基于 datasetVersionToUse | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | |||||
| 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; | |||||
| // 上传文件到MinIO | |||||
| try (InputStream inputStream = file.getInputStream()) { | |||||
| minioUtil.uploadObject(bucketName, objectName, inputStream); | |||||
| modelsVersionToUse.setUrl(objectName); | |||||
| modelsVersionToUse.setFileName(fileName); | |||||
| modelsVersionToUse.setFileSize(String.valueOf(sizeInKB)); | |||||
| modelsVersionDao.update(modelsVersionToUse); | |||||
| } catch (Exception e) { | |||||
| throw new Exception("上传到模型失败: " + e.getMessage(), e); | |||||
| for (MultipartFile file:files){ | |||||
| if (file.isEmpty()) { | |||||
| throw new Exception("文件为空,无法上传"); | |||||
| } | |||||
| // 获取文件大小并转换为KB | |||||
| long sizeInBytes = file.getSize(); | |||||
| double sizeInKB = sizeInBytes / 1024.0; | |||||
| // 其余操作基于 modelsVersionToUse | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | |||||
| String fileName = file.getOriginalFilename(); | |||||
| // String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); | |||||
| String objectName = "models/" + username + "/" + models.getName() + "/" + version + "/" + fileName; | |||||
| // 上传文件到MinIO并将记录新增到数据库中 | |||||
| try (InputStream inputStream = file.getInputStream()) { | |||||
| minioUtil.uploadObject(bucketName, objectName, inputStream); | |||||
| ModelsVersion modelsVersion = new ModelsVersion(); | |||||
| modelsVersion.setModelsId(id); | |||||
| modelsVersion.setVersion(version); | |||||
| modelsVersion.setUrl(objectName); | |||||
| modelsVersion.setFileName(fileName); | |||||
| modelsVersion.setFileSize(String.valueOf(sizeInKB)); | |||||
| modelsVersionService.insert(modelsVersion); | |||||
| } catch (Exception e) { | |||||
| throw new Exception("上传到模型失败: " + e.getMessage(), e); | |||||
| } | |||||
| Map<String, String> fileResult = new HashMap<>(); | |||||
| fileResult.put("fileName", file.getOriginalFilename()); | |||||
| fileResult.put("url", objectName); // objectName根据实际情况定义 | |||||
| results.put(file.getOriginalFilename(), fileResult); | |||||
| } | } | ||||
| Map<String, String> result = new HashMap<String, String>(); | |||||
| result.put("url",objectName); | |||||
| return result; | |||||
| return results; | |||||
| } | } | ||||
| @@ -270,17 +262,20 @@ public class ModelsServiceImpl implements ModelsService { | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | String username = SecurityUtils.getLoginUser().getUsername(); | ||||
| // 检查是否存在 | // 检查是否存在 | ||||
| Models models = this.queryById(modelsVersion.getModelsId()); | Models models = this.queryById(modelsVersion.getModelsId()); | ||||
| if (models == null) { | if (models == null) { | ||||
| throw new Exception("模型不存在,请检查模型id"); | throw new Exception("模型不存在,请检查模型id"); | ||||
| } | } | ||||
| ModelsVersion version = modelsVersionService.queryByModelsVersion(modelsVersion); | ModelsVersion version = modelsVersionService.queryByModelsVersion(modelsVersion); | ||||
| String url = ""; | String url = ""; | ||||
| if (version == null) { | if (version == null) { | ||||
| //插表,因为这里是一次直接插表所以这里定掉date,然后用DAO插入 | //插表,因为这里是一次直接插表所以这里定掉date,然后用DAO插入 | ||||
| Date date = new Date(); | 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.setUrl(url); | ||||
| modelsVersion.setCreateBy(username); | modelsVersion.setCreateBy(username); | ||||
| modelsVersion.setUpdateBy(username); | modelsVersion.setUpdateBy(username); | ||||
| @@ -292,8 +287,8 @@ public class ModelsServiceImpl implements ModelsService { | |||||
| //改表 | //改表 | ||||
| BeansUtils.copyPropertiesIgnoreNull(modelsVersion, version); | BeansUtils.copyPropertiesIgnoreNull(modelsVersion, version); | ||||
| Date createTime = version.getCreateTime(); | 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); | version.setUrl(url); | ||||
| modelsVersionService.update(version); | modelsVersionService.update(version); | ||||
| } | } | ||||
| @@ -302,6 +297,57 @@ public class ModelsServiceImpl implements ModelsService { | |||||
| return result; | return result; | ||||
| } | } | ||||
| /** | |||||
| * 下载所有模型文件,用压缩包的方式返回 | |||||
| * | |||||
| * @param modelsId 模型ID | |||||
| * @param version 模型版本号 | |||||
| * @return 文件内容 | |||||
| */ | |||||
| @Override | |||||
| public ResponseEntity<InputStreamResource> downloadAllModelFiles(Integer modelsId, String version) { | |||||
| // 根据模型id查模型名 | |||||
| Models model = this.modelsDao.queryById(modelsId); | |||||
| String modelName = model.getName(); | |||||
| // 查询特定模型和版本对应的所有文件 | |||||
| List<ModelsVersion> 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=\"" + modelName + "_" + 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) { | private String extractFileName(String urlStr) { | ||||
| return urlStr.substring(urlStr.lastIndexOf('/') + 1); | return urlStr.substring(urlStr.lastIndexOf('/') + 1); | ||||
| } | } | ||||
| @@ -1,7 +1,6 @@ | |||||
| package com.ruoyi.platform.service.impl; | package com.ruoyi.platform.service.impl; | ||||
| import com.ruoyi.common.security.utils.SecurityUtils; | import com.ruoyi.common.security.utils.SecurityUtils; | ||||
| import com.ruoyi.platform.domain.DatasetVersion; | |||||
| import com.ruoyi.platform.domain.ModelsVersion; | import com.ruoyi.platform.domain.ModelsVersion; | ||||
| import com.ruoyi.platform.mapper.ModelsDao; | import com.ruoyi.platform.mapper.ModelsDao; | ||||
| import com.ruoyi.platform.mapper.ModelsVersionDao; | import com.ruoyi.platform.mapper.ModelsVersionDao; | ||||
| @@ -15,7 +14,9 @@ import org.springframework.stereotype.Service; | |||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.HashMap; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| /** | /** | ||||
| * (ModelsVersion)表服务实现类 | * (ModelsVersion)表服务实现类 | ||||
| @@ -110,7 +111,7 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { | |||||
| public String removeById(Integer id) { | public String removeById(Integer id) { | ||||
| ModelsVersion modelsVersion = this.modelsVersionDao.queryById(id); | ModelsVersion modelsVersion = this.modelsVersionDao.queryById(id); | ||||
| if (modelsVersion == null){ | if (modelsVersion == null){ | ||||
| return "模型版本信息不存在"; | |||||
| return "该版本下模型文件信息不存在"; | |||||
| } | } | ||||
| //判断权限,只有admin和创建者本身可以删除该数据集 | //判断权限,只有admin和创建者本身可以删除该数据集 | ||||
| @@ -118,7 +119,7 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { | |||||
| String username = loginUser.getUsername(); | String username = loginUser.getUsername(); | ||||
| String createdBy = modelsVersion.getCreateBy(); | String createdBy = modelsVersion.getCreateBy(); | ||||
| if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ | if (!(StringUtils.equals(username,"admin") || StringUtils.equals(username,createdBy))){ | ||||
| return "无权限删除该模型版本信息"; | |||||
| return "无权限删除该版本下模型信息"; | |||||
| } | } | ||||
| modelsVersion.setState(0); | modelsVersion.setState(0); | ||||
| @@ -146,7 +147,36 @@ public class ModelsVersionServiceImpl implements ModelsVersionService { | |||||
| } | } | ||||
| public ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion){ | public ModelsVersion queryByModelsVersion(ModelsVersion modelsVersion){ | ||||
| return this.modelsVersionDao.queryByModelsVersion(modelsVersion); | return this.modelsVersionDao.queryByModelsVersion(modelsVersion); | ||||
| } | } | ||||
| /** | |||||
| * 复制模型版本 | |||||
| * | |||||
| * @param modelsId 模型的id | |||||
| * @param version 模型版本号 | |||||
| * @return 新的模型版本记录列表 | |||||
| */ | |||||
| @Override | |||||
| public List<ModelsVersion> queryByModelsIdAndVersion(Integer modelsId, String version) { | |||||
| return this.modelsVersionDao.queryAllByModelsVersion(modelsId, version) ; | |||||
| } | |||||
| @Override | |||||
| public Map<Integer, String> deleteModelsVersion(Integer modelsId, String version) { | |||||
| Map<Integer, String> results = new HashMap<Integer,String>(); | |||||
| // 根据模型ID和版本查询所有模型版本 | |||||
| List<ModelsVersion> versions = this.modelsVersionDao.queryAllByModelsVersion(modelsId, version); | |||||
| //逻辑删除列表中的数据项 | |||||
| for(ModelsVersion modelsVersion:versions){ | |||||
| String result = this.removeById(modelsVersion.getId()); | |||||
| results.put(modelsVersion.getId(), result); | |||||
| } | |||||
| return results; | |||||
| } | |||||
| } | } | ||||
| @@ -49,6 +49,24 @@ | |||||
| </where> | </where> | ||||
| limit 1 | limit 1 | ||||
| </select> | </select> | ||||
| <select id="queryAllByDatasetVersion" resultMap="DatasetVersionMap"> | |||||
| 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 | |||||
| <where> | |||||
| state = 1 | |||||
| <if test="datasetId != null"> | |||||
| and dataset_id = #{datasetId} | |||||
| </if> | |||||
| <if test="version != null and version != ''"> | |||||
| and version = #{version} | |||||
| </if> | |||||
| </where> | |||||
| </select> | |||||
| <!--查询指定行数据--> | <!--查询指定行数据--> | ||||
| <select id="queryAllByLimit" resultMap="DatasetVersionMap"> | <select id="queryAllByLimit" resultMap="DatasetVersionMap"> | ||||
| select | select | ||||
| @@ -31,6 +31,23 @@ | |||||
| </select> | </select> | ||||
| <select id="queryByModelsVersion" resultMap="ModelsVersionMap"> | <select id="queryByModelsVersion" resultMap="ModelsVersionMap"> | ||||
| select | |||||
| id,models_id,version,url,file_name,file_size,status,create_by,create_time,update_by,update_time,state | |||||
| from models_version | |||||
| <where> | |||||
| state = 1 | |||||
| <if test="modelsId != null"> | |||||
| and models_id = #{modelsVersion.modelsId} | |||||
| </if> | |||||
| <if test="version != null and version != ''"> | |||||
| and version = #{modelsVersion.version} | |||||
| </if> | |||||
| </where> | |||||
| limit 1 | |||||
| </select> | |||||
| <!-- 查询模型同一个版本下的所有文件 --> | |||||
| <select id="queryAllByModelsVersion" resultMap="ModelsVersionMap"> | |||||
| select | select | ||||
| id,models_id,version,url,file_name,file_size,status,create_by,create_time,update_by,update_time,state | id,models_id,version,url,file_name,file_size,status,create_by,create_time,update_by,update_time,state | ||||
| from models_version | from models_version | ||||
| @@ -43,9 +60,10 @@ | |||||
| and version = #{version} | and version = #{version} | ||||
| </if> | </if> | ||||
| </where> | </where> | ||||
| limit 1 | |||||
| </select> | </select> | ||||
| <!--查询指定行数据--> | <!--查询指定行数据--> | ||||
| <select id="queryAllByLimit" resultMap="ModelsVersionMap"> | <select id="queryAllByLimit" resultMap="ModelsVersionMap"> | ||||
| select | select | ||||