| @@ -136,12 +136,12 @@ public class DatasetVersionController extends BaseController { | |||||
| return genericsSuccess(this.datasetVersionService.deleteDatasetVersion(datasetId, version)); | return genericsSuccess(this.datasetVersionService.deleteDatasetVersion(datasetId, version)); | ||||
| } | } | ||||
| @PostMapping("/addDatasetVersionsFromLabel") | |||||
| @ApiOperation("从数据标注添加数据集版本") | |||||
| public GenericsAjaxResult<?> addDatasetVersionsFromLabel(@RequestBody LabelDatasetVersionVo labelDatasetVersionVo) throws Exception { | |||||
| datasetVersionService.addDatasetVersionsFromLabel(labelDatasetVersionVo); | |||||
| return GenericsAjaxResult.success(); | |||||
| } | |||||
| // @PostMapping("/addDatasetVersionsFromLabel") | |||||
| // @ApiOperation("从数据标注添加数据集版本") | |||||
| // public GenericsAjaxResult<?> addDatasetVersionsFromLabel(@RequestBody LabelDatasetVersionVo labelDatasetVersionVo) throws Exception { | |||||
| // datasetVersionService.addDatasetVersionsFromLabel(labelDatasetVersionVo); | |||||
| // | |||||
| // return GenericsAjaxResult.success(); | |||||
| // } | |||||
| } | } | ||||
| @@ -3,6 +3,7 @@ package com.ruoyi.platform.controller.dataset; | |||||
| import com.ruoyi.common.core.web.domain.AjaxResult; | import com.ruoyi.common.core.web.domain.AjaxResult; | ||||
| import com.ruoyi.platform.domain.Dataset; | import com.ruoyi.platform.domain.Dataset; | ||||
| import com.ruoyi.platform.service.NewDatasetService; | import com.ruoyi.platform.service.NewDatasetService; | ||||
| import com.ruoyi.platform.vo.LabelDatasetVersionVo; | |||||
| import com.ruoyi.platform.vo.NewDatasetVo; | import com.ruoyi.platform.vo.NewDatasetVo; | ||||
| import com.ruoyi.platform.vo.QueryModelMetricsVo; | import com.ruoyi.platform.vo.QueryModelMetricsVo; | ||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| @@ -54,6 +55,19 @@ public class NewDatasetFromGitController { | |||||
| } | } | ||||
| /** | |||||
| * 新增数据集与版本新 | |||||
| * | |||||
| * @param datasetVo 实体 | |||||
| * @return 新增结果 | |||||
| */ | |||||
| @PostMapping("/addVersionFromLabelStudio") | |||||
| @ApiOperation("从labelsudio添加版本") | |||||
| public AjaxResult addVersionFromLabelStudio(@RequestBody LabelDatasetVersionVo datasetVo) throws Exception { | |||||
| return AjaxResult.success(this.newDatasetService.newCreateVersionFromLabelStudio(datasetVo)); | |||||
| } | |||||
| @GetMapping("/queryDatasets") | @GetMapping("/queryDatasets") | ||||
| @ApiOperation("数据集广场公开数据集分页查询,根据data_type,data_tag筛选,true公开false私有") | @ApiOperation("数据集广场公开数据集分页查询,根据data_type,data_tag筛选,true公开false私有") | ||||
| public AjaxResult queryDatasets(@RequestParam("page") int page, | public AjaxResult queryDatasets(@RequestParam("page") int page, | ||||
| @@ -72,6 +72,5 @@ public interface DatasetVersionService { | |||||
| String addDatasetVersions(List<DatasetVersion> datasetVersions) throws Exception; | String addDatasetVersions(List<DatasetVersion> datasetVersions) throws Exception; | ||||
| void | |||||
| addDatasetVersionsFromLabel(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception; | |||||
| // void addDatasetVersionsFromLabel(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception; | |||||
| } | } | ||||
| @@ -1,6 +1,7 @@ | |||||
| package com.ruoyi.platform.service; | package com.ruoyi.platform.service; | ||||
| import com.ruoyi.platform.domain.Dataset; | import com.ruoyi.platform.domain.Dataset; | ||||
| import com.ruoyi.platform.vo.LabelDatasetVersionVo; | |||||
| import com.ruoyi.platform.vo.NewDatasetVo; | import com.ruoyi.platform.vo.NewDatasetVo; | ||||
| import com.ruoyi.platform.vo.QueryModelMetricsVo; | import com.ruoyi.platform.vo.QueryModelMetricsVo; | ||||
| import org.springframework.core.io.InputStreamResource; | import org.springframework.core.io.InputStreamResource; | ||||
| @@ -39,4 +40,6 @@ public interface NewDatasetService { | |||||
| void deleteDatasetVersionNew(Integer repoId, String repo, String owner, String version, String relativePath) throws Exception; | void deleteDatasetVersionNew(Integer repoId, String repo, String owner, String version, String relativePath) throws Exception; | ||||
| Map<String, Object> getVersionsCompare(QueryModelMetricsVo querydatasetVo) throws Exception; | Map<String, Object> getVersionsCompare(QueryModelMetricsVo querydatasetVo) throws Exception; | ||||
| String newCreateVersionFromLabelStudio(LabelDatasetVersionVo datasetVo) throws Exception; | |||||
| } | } | ||||
| @@ -217,33 +217,33 @@ public class DatasetVersionServiceImpl implements DatasetVersionService { | |||||
| } | } | ||||
| } | } | ||||
| @Override | |||||
| public void addDatasetVersionsFromLabel(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception{ | |||||
| Dataset dataset = datasetDao.queryById(labelDatasetVersionVo.getDataset_id()); | |||||
| if (dataset == null){ | |||||
| throw new Exception("数据集不存在"); | |||||
| } | |||||
| // 获取label-studio数据流 | |||||
| Map<String, String> headers = new HashMap<String, String>(); | |||||
| headers.put("Authorization","Token "+labelDatasetVersionVo.getToken()); | |||||
| InputStream inputStream = HttpUtils.getIntputStream(labelloaclUrl+"/api/projects/"+labelDatasetVersionVo.getProject_id()+"/export?exportType="+labelDatasetVersionVo.getExportType(), headers); | |||||
| // 构建objectName | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | |||||
| String url = username + "/" + DateUtils.dateTimeNow() + "/" + dataset.getName()+"_"+labelDatasetVersionVo.getVersion()+"."+labelDatasetVersionVo.getExportType(); | |||||
| String objectName = "datasets/" + url; | |||||
| String formattedSize = FileUtil.formatFileSize(inputStream.available()); | |||||
| minioService.uploaInputStream(bucketName,objectName,inputStream); | |||||
| //保存DatasetVersion | |||||
| DatasetVersion datasetVersion = new DatasetVersion(); | |||||
| datasetVersion.setVersion(labelDatasetVersionVo.getVersion()); | |||||
| datasetVersion.setDatasetId(labelDatasetVersionVo.getDataset_id()); | |||||
| datasetVersion.setFileName(dataset.getName()+"_"+labelDatasetVersionVo.getVersion()+"."+labelDatasetVersionVo.getExportType()); | |||||
| datasetVersion.setFileSize(formattedSize); | |||||
| datasetVersion.setUrl(objectName); | |||||
| datasetVersion.setDescription(labelDatasetVersionVo.getDesc()); | |||||
| this.insert(datasetVersion); | |||||
| } | |||||
| // @Override | |||||
| // public void addDatasetVersionsFromLabel(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception{ | |||||
| // Dataset dataset = datasetDao.queryById(labelDatasetVersionVo.getDataset_id()); | |||||
| // if (dataset == null){ | |||||
| // throw new Exception("数据集不存在"); | |||||
| // } | |||||
| // // 获取label-studio数据流 | |||||
| // Map<String, String> headers = new HashMap<String, String>(); | |||||
| // headers.put("Authorization","Token "+labelDatasetVersionVo.getToken()); | |||||
| // InputStream inputStream = HttpUtils.getIntputStream(labelloaclUrl+"/api/projects/"+labelDatasetVersionVo.getProject_id()+"/export?exportType="+labelDatasetVersionVo.getExportType(), headers); | |||||
| // // 构建objectName | |||||
| // String username = SecurityUtils.getLoginUser().getUsername(); | |||||
| // String url = username + "/" + DateUtils.dateTimeNow() + "/" + dataset.getName()+"_"+labelDatasetVersionVo.getVersion()+"."+labelDatasetVersionVo.getExportType(); | |||||
| // String objectName = "datasets/" + url; | |||||
| // String formattedSize = FileUtil.formatFileSize(inputStream.available()); | |||||
| // minioService.uploaInputStream(bucketName,objectName,inputStream); | |||||
| // //保存DatasetVersion | |||||
| // DatasetVersion datasetVersion = new DatasetVersion(); | |||||
| // datasetVersion.setVersion(labelDatasetVersionVo.getVersion()); | |||||
| // datasetVersion.setDatasetId(labelDatasetVersionVo.getDataset_id()); | |||||
| // datasetVersion.setFileName(dataset.getName()+"_"+labelDatasetVersionVo.getVersion()+"."+labelDatasetVersionVo.getExportType()); | |||||
| // | |||||
| // datasetVersion.setFileSize(formattedSize); | |||||
| // datasetVersion.setUrl(objectName); | |||||
| // datasetVersion.setDescription(labelDatasetVersionVo.getDesc()); | |||||
| // this.insert(datasetVersion); | |||||
| // } | |||||
| private void insertPrepare(DatasetVersion datasetVersion) throws Exception { | private void insertPrepare(DatasetVersion datasetVersion) throws Exception { | ||||
| checkDeclaredVersion(datasetVersion); | checkDeclaredVersion(datasetVersion); | ||||
| @@ -14,10 +14,7 @@ import com.ruoyi.platform.service.DatasetTempStorageService; | |||||
| import com.ruoyi.platform.service.GitService; | import com.ruoyi.platform.service.GitService; | ||||
| import com.ruoyi.platform.service.NewDatasetService; | import com.ruoyi.platform.service.NewDatasetService; | ||||
| import com.ruoyi.platform.utils.*; | import com.ruoyi.platform.utils.*; | ||||
| import com.ruoyi.platform.vo.GitProjectVo; | |||||
| import com.ruoyi.platform.vo.NewDatasetVo; | |||||
| import com.ruoyi.platform.vo.QueryModelMetricsVo; | |||||
| import com.ruoyi.platform.vo.VersionVo; | |||||
| import com.ruoyi.platform.vo.*; | |||||
| import com.ruoyi.system.api.model.LoginUser; | import com.ruoyi.system.api.model.LoginUser; | ||||
| import org.apache.commons.io.FileUtils; | import org.apache.commons.io.FileUtils; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| @@ -40,10 +37,7 @@ import java.io.*; | |||||
| import java.nio.file.Files; | import java.nio.file.Files; | ||||
| import java.nio.file.Path; | import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | import java.nio.file.Paths; | ||||
| import java.util.ArrayList; | |||||
| import java.util.HashMap; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.*; | |||||
| import java.util.concurrent.CompletableFuture; | import java.util.concurrent.CompletableFuture; | ||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
| import java.util.zip.ZipEntry; | import java.util.zip.ZipEntry; | ||||
| @@ -79,6 +73,9 @@ public class NewDatasetServiceImpl implements NewDatasetService { | |||||
| private String bucketName; | private String bucketName; | ||||
| @Value("${git.localPath}") | @Value("${git.localPath}") | ||||
| String localPathlocal; | String localPathlocal; | ||||
| @Value("${labelStudio.loaclUrl}") | |||||
| private String labelloaclUrl; | |||||
| @Resource | @Resource | ||||
| private NewHttpUtils httpUtils; | private NewHttpUtils httpUtils; | ||||
| @Resource | @Resource | ||||
| @@ -472,6 +469,44 @@ public class NewDatasetServiceImpl implements NewDatasetService { | |||||
| return result; | return result; | ||||
| } | } | ||||
| // 在你的方法中调用 | |||||
| public String newCreateVersionFromLabelStudio(LabelDatasetVersionVo labelDatasetVersionVo) throws Exception { | |||||
| // 1. 下载数据集文件 | |||||
| // 获取label-studio数据流 | |||||
| Map<String, String> headers = new HashMap<String, String>(); | |||||
| headers.put("Authorization", "Token " + labelDatasetVersionVo.getToken()); | |||||
| InputStream inputStream = HttpUtils.getIntputStream(labelloaclUrl + "/api/projects/" + labelDatasetVersionVo.getProjectId() + "/export?exportType=" + labelDatasetVersionVo.getExportType(), headers); | |||||
| // 2. 打包成zip包 | |||||
| String zipFileName = labelDatasetVersionVo.getName()+"_"+labelDatasetVersionVo.getVersion() + ".zip"; | |||||
| MultipartFile[] files = FileUtil.toMultipartFiles(inputStream, zipFileName); | |||||
| // 3. 上传到minio | |||||
| List<Map<String, String>> maps = uploadDatasetlocal(files, UUID.randomUUID().toString()); | |||||
| // 4. 组装DatasetVersionVo | |||||
| NewDatasetVo newDatasetVo = new NewDatasetVo(); | |||||
| newDatasetVo.setId(labelDatasetVersionVo.getId()); | |||||
| newDatasetVo.setIdentifier(labelDatasetVersionVo.getIdentifier()); | |||||
| newDatasetVo.setIsPublic(labelDatasetVersionVo.getIsPublic()); | |||||
| newDatasetVo.setOwner(labelDatasetVersionVo.getOwner()); | |||||
| newDatasetVo.setName(labelDatasetVersionVo.getName()); | |||||
| newDatasetVo.setVersion(labelDatasetVersionVo.getVersion()); | |||||
| newDatasetVo.setDatasetSource(labelDatasetVersionVo.getDatasetSource()); | |||||
| newDatasetVo.setVersionDesc(labelDatasetVersionVo.getVersionDesc()); | |||||
| List<VersionVo> datasetVersionVos = new ArrayList<>(); | |||||
| for (Map<String, String> map : maps) { | |||||
| VersionVo versionVo = new VersionVo(); | |||||
| versionVo.setUrl(map.get("url")); | |||||
| versionVo.setFileName(map.get("fileName")); | |||||
| versionVo.setFileSize(map.get("fileSize")); | |||||
| datasetVersionVos.add(versionVo); | |||||
| } | |||||
| newDatasetVo.setDatasetVersionVos(datasetVersionVos); | |||||
| // 调用新增版本方法 | |||||
| return newCreateVersion(newDatasetVo); | |||||
| } | |||||
| @Override | @Override | ||||
| public List<Map<String, String>> uploadDatasetlocal(MultipartFile[] files, String uuid) throws Exception { | public List<Map<String, String>> uploadDatasetlocal(MultipartFile[] files, String uuid) throws Exception { | ||||
| List<Map<String, String>> results = new ArrayList<>(); | List<Map<String, String>> results = new ArrayList<>(); | ||||
| @@ -2,8 +2,10 @@ package com.ruoyi.platform.utils; | |||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| import org.springframework.core.io.ByteArrayResource; | |||||
| import org.springframework.web.multipart.MultipartFile; | |||||
| import java.io.File; | |||||
| import java.io.*; | |||||
| import java.nio.file.Files; | import java.nio.file.Files; | ||||
| import java.nio.file.Path; | import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | import java.nio.file.Paths; | ||||
| @@ -11,6 +13,8 @@ import java.util.ArrayList; | |||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.zip.ZipEntry; | |||||
| import java.util.zip.ZipOutputStream; | |||||
| public class FileUtil { | public class FileUtil { | ||||
| @@ -111,4 +115,75 @@ public class FileUtil { | |||||
| // 重命名文件夹 | // 重命名文件夹 | ||||
| boolean renamed = oldFolder.renameTo(newFolder); | boolean renamed = oldFolder.renameTo(newFolder); | ||||
| } | } | ||||
| public static MultipartFile[] toMultipartFiles(InputStream inputStream, String fileName) throws IOException { | |||||
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||||
| ZipOutputStream zos = new ZipOutputStream(baos); | |||||
| ZipEntry zipEntry = new ZipEntry(fileName); | |||||
| zos.putNextEntry(zipEntry); | |||||
| byte[] bytes = new byte[1024]; | |||||
| int length; | |||||
| while ((length = inputStream.read(bytes)) >= 0) { | |||||
| zos.write(bytes, 0, length); | |||||
| } | |||||
| zos.closeEntry(); | |||||
| zos.close(); | |||||
| inputStream.close(); | |||||
| ByteArrayResource resource = new ByteArrayResource(baos.toByteArray()); | |||||
| return new MultipartFile[]{new CustomMultipartFile(resource, fileName)}; | |||||
| } | |||||
| private static class CustomMultipartFile implements MultipartFile { | |||||
| private final ByteArrayResource resource; | |||||
| private final String fileName; | |||||
| CustomMultipartFile(ByteArrayResource resource, String fileName) { | |||||
| this.resource = resource; | |||||
| this.fileName = fileName; | |||||
| } | |||||
| @Override | |||||
| public String getName() { | |||||
| return fileName; | |||||
| } | |||||
| @Override | |||||
| public String getOriginalFilename() { | |||||
| return fileName; | |||||
| } | |||||
| @Override | |||||
| public String getContentType() { | |||||
| return "application/zip"; | |||||
| } | |||||
| @Override | |||||
| public boolean isEmpty() { | |||||
| return resource.contentLength() == 0; | |||||
| } | |||||
| @Override | |||||
| public long getSize() { | |||||
| return resource.contentLength(); | |||||
| } | |||||
| @Override | |||||
| public byte[] getBytes() throws IOException { | |||||
| return resource.getByteArray(); | |||||
| } | |||||
| @Override | |||||
| public InputStream getInputStream() throws IOException { | |||||
| return new ByteArrayInputStream(resource.getByteArray()); | |||||
| } | |||||
| @Override | |||||
| public void transferTo(File dest) throws IOException, IllegalStateException { | |||||
| resource.getByteArray(); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -2,62 +2,23 @@ package com.ruoyi.platform.vo; | |||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategy; | import com.fasterxml.jackson.databind.PropertyNamingStrategy; | ||||
| import com.fasterxml.jackson.databind.annotation.JsonNaming; | import com.fasterxml.jackson.databind.annotation.JsonNaming; | ||||
| import lombok.Data; | |||||
| import java.io.Serializable; | import java.io.Serializable; | ||||
| @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) | @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) | ||||
| @Data | |||||
| public class LabelDatasetVersionVo implements Serializable { | public class LabelDatasetVersionVo implements Serializable { | ||||
| private String token; | private String token; | ||||
| private String project_id; | |||||
| private Integer dataset_id; | |||||
| private String version; | |||||
| private String desc; | |||||
| private String projectId; | |||||
| private String exportType; | private String exportType; | ||||
| public String getToken() { | |||||
| return token; | |||||
| } | |||||
| public void setToken(String token) { | |||||
| this.token = token; | |||||
| } | |||||
| public String getProject_id() { | |||||
| return project_id; | |||||
| } | |||||
| public void setProject_id(String project_id) { | |||||
| this.project_id = project_id; | |||||
| } | |||||
| public Integer getDataset_id() { | |||||
| return dataset_id; | |||||
| } | |||||
| public void setDataset_id(Integer dataset_id) { | |||||
| this.dataset_id = dataset_id; | |||||
| } | |||||
| public String getVersion() { | |||||
| return version; | |||||
| } | |||||
| public void setVersion(String version) { | |||||
| this.version = version; | |||||
| } | |||||
| public String getDesc() { | |||||
| return desc; | |||||
| } | |||||
| public void setDesc(String desc) { | |||||
| this.desc = desc; | |||||
| } | |||||
| public String getExportType() { | |||||
| return exportType; | |||||
| } | |||||
| public void setExportType(String exportType) { | |||||
| this.exportType = exportType; | |||||
| } | |||||
| private Integer id; | |||||
| private String identifier; | |||||
| private Boolean isPublic; | |||||
| private String owner; | |||||
| private String name; | |||||
| private String version; | |||||
| private String versionDesc; | |||||
| private String datasetSource; | |||||
| } | } | ||||