diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/AnnotationTaskController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/AnnotationTaskController.java index 910ad24..554fd25 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/AnnotationTaskController.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/AnnotationTaskController.java @@ -45,7 +45,6 @@ public class AnnotationTaskController extends BaseController { */ @PostMapping("/edit") public AjaxResult edit(@Validated @RequestBody AnnotationTaskEntity task) { - int status = annotationTaskService.updateTask(task); return status == 1 ? AjaxResult.success() : AjaxResult.error("更新任务失败"); } diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/DatasetController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/DatasetController.java index b7ecc72..382d579 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/DatasetController.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/DatasetController.java @@ -6,12 +6,15 @@ import com.bonus.common.core.web.controller.BaseController; import com.bonus.ai.service.dataset.DatasetService; import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.common.core.web.page.TableDataInfo; +import com.bonus.common.security.annotation.RequiresPermissions; import com.bonus.common.security.utils.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -86,6 +89,17 @@ public class DatasetController extends BaseController { } } + /** + * 查看由我创建的数据集 + * 统一获取文件列表 + * @param + * @return 返回满足条件的数据集列表 + */ + @GetMapping("/datasetList") + public AjaxResult datasetList(DataSetEntity dataSet) { + return AjaxResult.success(datasetService.getDatasetList(dataSet)); + } + /** * 根据数据集编号获取数据集详情 * @param datasetId 数据集编号 @@ -136,8 +150,8 @@ public class DatasetController extends BaseController { * @param isPublic 是否设置为公共文件:true - 设置为公共文件, false - 取消公共状态 * @return 操作结果 */ - @PostMapping("/set-public") - public AjaxResult setDatasetPublicStatus(@RequestParam Long datasetId, @RequestParam Boolean isPublic){ + @PostMapping("/setPublic") + public AjaxResult setDatasetPublicStatus(@RequestParam String datasetId, @RequestParam String isPublic){ datasetService.setPublicStatus(datasetId, isPublic); return AjaxResult.success(); } @@ -147,16 +161,17 @@ public class DatasetController extends BaseController { * @return 返回满足条件的版本列表 */ @PostMapping("/import") - public AjaxResult importDataset() { - return null; + public AjaxResult importDataset(@RequestBody DataSetEntity entity) { + return datasetService.importDataset(entity); } /** * 数据集导出 * @return 返回满足条件的版本列表 */ - @PostMapping("/export") - public AjaxResult exportDataset() { - return null; + @PostMapping("/export/{datasetId}") + public void exportDataset(HttpServletResponse response, HttpServletRequest request, @PathVariable Long datasetId) { + datasetService.exportDataset(request,response,datasetId); } + } diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/DatasetMapper.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/DatasetMapper.java index 14cf686..a16c8f8 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/DatasetMapper.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/DatasetMapper.java @@ -50,7 +50,7 @@ public interface DatasetMapper { /** * 更新数据集公开状态 */ - int updatePublicStatus(@Param("datasetId") Long datasetId, @Param("isPublic") String isPublic); + int updatePublicStatus(@Param("datasetId") String datasetId, @Param("isPublic") String isPublic); /** * 更新数据集标注状态 diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/AnnotationTaskServiceImpl.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/AnnotationTaskServiceImpl.java index 508add3..b5081d0 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/AnnotationTaskServiceImpl.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/AnnotationTaskServiceImpl.java @@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; + import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -55,21 +56,20 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { * 创建标注任务 */ @Override - public int createTask(AnnotationTaskEntity task){ - - int status =0; + public int createTask(AnnotationTaskEntity task) { + task.setCreateBy(SecurityUtils.getUserId().toString()); + int status = 0; //1.调用label studio 接口创建project,将projectid 关联到标注任务里 //2.插入标注任务表 String uuid = UUID.randomUUID().toString().replace("-", ""); task.setTaskUuid(uuid); - status= annotationTaskMapper.insertAnnotationTask(task); - + status = annotationTaskMapper.insertAnnotationTask(task); AnnotationTaskEntity tempTask = new AnnotationTaskEntity(); tempTask.setTaskUuid(uuid); - List tempTasks = annotationTaskMapper.selectAnnotationTaskList(task); + List tempTasks = annotationTaskMapper.selectAnnotationTaskList(task); Long annotationTaskid = 0L; - if (!tempTasks.isEmpty()){ + if (!tempTasks.isEmpty()) { annotationTaskid = tempTasks.get(0).getTaskId(); } @@ -86,12 +86,12 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { //4. 文件分配后需要调用label studio 接口创建task,将taskid与 文件和标注人表进行关联(因为文件较多启用异步调用) // 5. 将文件和标注人等信息 插入文件和标注人关联表 - if(status == 1){ + if (status == 1) { try { - for(AnnotationTaskAnnotatorEntity entity:annotationTaskAnnotatorEntities){ + for (AnnotationTaskAnnotatorEntity entity : annotationTaskAnnotatorEntities) { status = annotationTaskMapper.insertAnnotTaskannotator(entity); } - }catch (Exception e){ + } catch (Exception e) { log.error("Error updating task: ", e); throw e; // 抛出异常以触发回滚 } @@ -101,10 +101,10 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { /** - * 获取任务列表,分配给我的标注任务,我创建的标注任务 - */ + * 获取任务列表,分配给我的标注任务,我创建的标注任务 + */ @Override - public List getTaskList(AnnotationTaskEntity task){ + public List getTaskList(AnnotationTaskEntity task) { try { //这样设置不合适,设置后会改变真实用户的意图 // String userId = SecurityUtils.getUserId().toString(); @@ -122,15 +122,14 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { /** - * 更新任务 - */ + * 更新任务 + */ @Override - public int updateTask(AnnotationTaskEntity task){ + public int updateTask(AnnotationTaskEntity task) { int result = 0; try { - result = annotationTaskMapper.updateAnnotationTaskById(task); - }catch(Exception e) - { + result = annotationTaskMapper.updateAnnotationTaskById(task); + } catch (Exception e) { e.printStackTrace(); } return result; @@ -139,6 +138,7 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { /** * 根据taskid 删除任务 + * * @param taskId * @return */ @@ -146,13 +146,13 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { public int deleteTaskById(Long taskId) { //删除任务需要删除两个个表 对应两个个表删除状态修改成1 int status = 0; - try{ + try { //删除主表任务信息 status = annotationTaskMapper.deleteTaskById(taskId); //删除团队成员表信息 status = annotationTaskMapper.deleteAnnotator(taskId); - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } return status; @@ -160,6 +160,7 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { /** * 获取任务详情 + * * @param taskId * @return */ @@ -171,18 +172,18 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { task.setTaskId(taskId); //查询对应的label studio project id , 从label studio这个标注任务对应的label studio project List resultTasks = annotationTaskMapper.selectAnnotationTaskList(task); - if (!resultTasks.isEmpty()) { - return resultTasks.get(0); + if (!resultTasks.isEmpty()) { + return resultTasks.get(0); } - } catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } return null; } @Override - public List getMyAnnotaionTaskBasicFile(Long taskId, String annotationStatus){ + public List getMyAnnotaionTaskBasicFile(Long taskId, String annotationStatus) { try { Long userId = SecurityUtils.getUserId(); AnnotationTaskEntity task = new AnnotationTaskEntity(); @@ -196,14 +197,14 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { } task.setFileAnnotationStatus(annotationStatus); return annotationTaskMapper.getTaskBasicFile(task); - }catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); return new ArrayList<>(); } } @Override - public List getMyAuditTaskBasicFile(Long taskId, String annotationStatus){ + public List getMyAuditTaskBasicFile(Long taskId, String annotationStatus) { Long userId = SecurityUtils.getUserId(); AnnotationTaskEntity task = new AnnotationTaskEntity(); task.setTaskId(taskId); @@ -211,8 +212,7 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { Long intAnnotationStatus = Long.valueOf(annotationStatus); if (intAnnotationStatus < 4 && intAnnotationStatus >= 0) { task.setFileAnnotationStatus(annotationStatus); - } - else { + } else { task.setFileAnnotationStatus("5"); } return annotationTaskMapper.getTaskBasicFile(task); @@ -220,10 +220,10 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { @Override - public String getAuditFailReasonByFileId(Long taskId, Long fileId){ + public String getAuditFailReasonByFileId(Long taskId, Long fileId) { try { return annotationTaskMapper.getAuditFailReasonByFileId(taskId, fileId); - }catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); return ""; } @@ -231,11 +231,12 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { /** * 检查任务名称是否重复 + * * @param task * @return */ @Override - public boolean checkTaskNameUnique(AnnotationTaskEntity task){ + public boolean checkTaskNameUnique(AnnotationTaskEntity task) { return false; } diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/DatasetServiceImpl.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/DatasetServiceImpl.java index 02eaa6a..4bb07eb 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/DatasetServiceImpl.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/DatasetServiceImpl.java @@ -8,9 +8,15 @@ import com.bonus.ai.mapper.DataSetBasicFileMapper; import com.bonus.ai.mapper.DatasetFileMapper; import com.bonus.ai.mapper.DatasetMapper; import com.bonus.ai.service.dataset.DatasetService; +import com.bonus.ai.utils.MinioUtil; import com.bonus.common.core.constant.UserConstants; import com.bonus.common.core.utils.StringUtils; +import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.common.security.utils.SecurityUtils; +import io.minio.Result; +import io.minio.errors.MinioException; +import io.minio.messages.Item; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -19,11 +25,18 @@ import org.springframework.transaction.annotation.Transactional; import com.bonus.common.security.utils.SecurityUtils; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; @Service public class DatasetServiceImpl implements DatasetService { @@ -44,6 +57,9 @@ public class DatasetServiceImpl implements DatasetService { @Resource private DataSetBasicFileMapper dataSetBasicFileMapper; + @Resource + private MinioUtil minioUtil; + @Override @Transactional(rollbackFor = Exception.class) public int createDataset(DataSetEntity dataSet) { @@ -113,9 +129,9 @@ public class DatasetServiceImpl implements DatasetService { @Override @Transactional(rollbackFor = Exception.class) - public boolean setPublicStatus(Long datasetId, Boolean isPublic) { + public boolean setPublicStatus(String datasetId, String isPublic) { try { - datasetMapper.updatePublicStatus(datasetId, String.valueOf(isPublic ?'1':'0')); + datasetMapper.updatePublicStatus(datasetId, isPublic); return true; } catch (Exception e) { log.error("设置数据集公共状态失败", e); @@ -157,6 +173,53 @@ public class DatasetServiceImpl implements DatasetService { return datasetMapper.removeDataSetBasicFile(dataSetId,fileIds); } + /** + * @param entity + * @return + */ + @Override + public AjaxResult importDataset(DataSetEntity entity) { + insertDatasetFileMap(entity); + return AjaxResult.success(); + } + + /** + * @param request + * @param response + * @param datasetId + */ + @Override + public void exportDataset(HttpServletRequest request, HttpServletResponse response, Long datasetId) { + List list = datasetFileMapper.selectFilesByDatasetId(datasetId); + try { + downloadMultipleFiles(response,list); + }catch (Exception e){ + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + + } + + // 下载多个文件(可以选择压缩成 ZIP) + private void downloadMultipleFiles(HttpServletResponse response, List list) throws IOException, MinioException { + // 示例:将多个文件打包成一个 ZIP 文件 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=files.zip"); + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + for (DataSetBasicFileEntity entity : list) { + InputStream fileStream = minioUtil.downloadFile(entity.getFileUrl()); + // 创建 ZIP 条目 + ZipEntry zipEntry = new ZipEntry(entity.getFileName()); + zos.putNextEntry(zipEntry); + // 使用 IOUtils.copy 直接复制文件流 + IOUtils.copy(fileStream, zos); + zos.closeEntry(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** * 插入数据集文件映射关系 * @param dataSet 数据集实体,包含数据集ID、输入ID、数据类型等信息 diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/dataset/DatasetService.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/dataset/DatasetService.java index 0b87dcc..b5acd53 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/dataset/DatasetService.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/dataset/DatasetService.java @@ -2,7 +2,10 @@ package com.bonus.ai.service.dataset; import com.bonus.ai.domain.DataSetBasicFileEntity; import com.bonus.ai.domain.dataset.DataSetEntity; +import com.bonus.common.core.web.domain.AjaxResult; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; public interface DatasetService { @@ -47,7 +50,7 @@ public interface DatasetService { * @param isPublic 是否公共 * @return 设置结果 */ - boolean setPublicStatus(Long datasetId, Boolean isPublic); + boolean setPublicStatus(String datasetId, String isPublic); /**验证数据集名称的唯一性*/ boolean checkDatasetNameUnique(DataSetEntity dataSet); @@ -65,4 +68,8 @@ public interface DatasetService { * @return */ int removeDataSetBasicFile(String dataSetId, long[] fileIds); + + AjaxResult importDataset(DataSetEntity entity); + + void exportDataset(HttpServletRequest request, HttpServletResponse response, Long datasetId); } \ No newline at end of file diff --git a/bonus-modules/bonus-ai/src/main/resources/mapper/DatasetFileMapper.xml b/bonus-modules/bonus-ai/src/main/resources/mapper/DatasetFileMapper.xml index 4327576..035c1b1 100644 --- a/bonus-modules/bonus-ai/src/main/resources/mapper/DatasetFileMapper.xml +++ b/bonus-modules/bonus-ai/src/main/resources/mapper/DatasetFileMapper.xml @@ -8,14 +8,8 @@ - - - - - - - insert into ai_dataset_file_map(file_id, dataset_id) values + replace into ai_dataset_file_map(file_id, dataset_id) values (#{item.fileId},#{item.datasetId}) @@ -44,7 +38,7 @@