diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationExportController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationExportController.java index 8185fbe..cc6a188 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationExportController.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationExportController.java @@ -1,9 +1,12 @@ package com.bonus.ai.controller; +import com.bonus.ai.utils.MinioUtil; import com.fasterxml.jackson.databind.ObjectMapper; import com.bonus.ai.domain.DataSetBasicFileEntity; import com.bonus.ai.service.dataset.AnnotationTaskService; import com.bonus.common.security.annotation.RequiresPermissions; +import io.swagger.models.auth.In; +import org.apache.commons.io.IOUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -11,9 +14,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; @RestController @@ -23,37 +30,64 @@ public class AnnotationExportController { @Resource private AnnotationTaskService annotationTaskService; private final ObjectMapper objectMapper = new ObjectMapper(); - + @Resource + private MinioUtil minioUtil; @RequiresPermissions("dataCenter:task:annotation:export") - @PostMapping("/export/{taskId}") - public void exportAuditedAnnotations(HttpServletResponse response, HttpServletRequest request, @PathVariable Long taskId) { - try { - // Step 1: 获取标注结果 - List annotations = annotationTaskService.geAllAuditAnnotationByTaskId(taskId); + @PostMapping("/export/{versionId}") + public void exportAuditedAnnotations(HttpServletResponse response, HttpServletRequest request, @PathVariable Long versionId) { + // Step 1: 获取标注结果 + List annotations = annotationTaskService.geAllAuditAnnotationByTaskId(versionId); - // Step 2: 按文件生成 JSON - List jsonFiles = new ArrayList<>(); - for (DataSetBasicFileEntity annotation : annotations) { - String fileName = annotation.getFileName() + ".json"; - File jsonFile = createJsonFile(fileName, annotation); - jsonFiles.add(jsonFile); - } + // Step 2: 设置响应头 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=annotations.zip"); - // Step 3: 压缩为 ZIP + // Step 3: 直接将数据写入 ZIP 输出流 + try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) { + // Step 4: 遍历标注结果,处理每个文件 + for (DataSetBasicFileEntity annotation : annotations) { + String fileName = annotation.getFileName(); - // Step 4: 设置响应头,提供文件下载 - } - catch (Exception e) { - e.printStackTrace(); - } + // 下载图片并写入 ZIP + writeImageToZip(zipOut, fileName, annotation.getFileUrl()); + // 去掉文件扩展名 + int dotIndex = fileName.lastIndexOf("."); + if (dotIndex != -1) { + fileName = fileName.substring(0, dotIndex); + } + // 写入 JSON 数据 + writeJsonToZip(zipOut, fileName + ".json", annotation.getAnnotationResult()); + + + } + } catch (Exception e) { + // 优化异常处理,记录详细错误信息 + e.printStackTrace(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + try { + response.getWriter().write("导出失败:" + e.getMessage()); + } catch (IOException ex) { + ex.printStackTrace(); + } + } } - - public File createJsonFile(String fileName, Object data) throws IOException { - File jsonFile = new File(fileName); - objectMapper.writerWithDefaultPrettyPrinter().writeValue(jsonFile, data); - return jsonFile; + private void writeJsonToZip(ZipOutputStream zipOut, String fileName, String jsonContent) throws IOException { + ZipEntry zipEntry = new ZipEntry(fileName); + zipOut.putNextEntry(zipEntry); + zipOut.write(jsonContent.getBytes(StandardCharsets.UTF_8)); + zipOut.closeEntry(); } + + private void writeImageToZip(ZipOutputStream zipOut, String fileName, String fileUrl) throws IOException { + try (InputStream inputStream = minioUtil.downloadFile(fileUrl)) { + ZipEntry zipEntryImg = new ZipEntry(fileName); + zipOut.putNextEntry(zipEntryImg); + IOUtils.copy(inputStream, zipOut); + zipOut.closeEntry(); + } + } + } diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/ReleaseVersionController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/ReleaseVersionController.java index 32eddaa..bb0cbd8 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/ReleaseVersionController.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/dataset/ReleaseVersionController.java @@ -22,7 +22,9 @@ public class ReleaseVersionController extends BaseController { @Resource private ReleaseVersionService releaseVersionService; - /**发布版本,可以针对数据集发布,也可以对标注任务发布 + /** + * 发布版本,可以针对数据集发布,也可以对标注任务发布 + * * @param version 发布数据集的版本信息 * @return 返回影响的行数或错误信 */ @@ -32,7 +34,9 @@ public class ReleaseVersionController extends BaseController { return releaseVersionService.release(version); } - /**导出发布版本的数据集 + /** + * 导出发布版本的数据集 + * * @param versionId 发布数据集的版本id * @return 返回影响的行数或错误信 */ @@ -44,6 +48,7 @@ public class ReleaseVersionController extends BaseController { /** * 删除版本发布 + * * @param versionIds id 集合 * @return */ @@ -54,9 +59,9 @@ public class ReleaseVersionController extends BaseController { } - /** * 查看发布的版本列表 + * * @return 返回满足条件的版本列表 */ @RequiresPermissions("dataCenter:version:list") @@ -66,8 +71,20 @@ public class ReleaseVersionController extends BaseController { startPage(); List allReleaseVersions = releaseVersionService.getAllReleaseVersions(version); return getDataTable(allReleaseVersions); - }catch (Exception e) { + } catch (Exception e) { return getDataTable(new ArrayList<>()); } } + + + /** + * 查看发布的版本列表 + * + * @return 返回满足条件的版本列表 + */ + @GetMapping("/listSelect") + public AjaxResult listSelect(ReleaseVersionEntity version) { + List allReleaseVersions = releaseVersionService.getAllReleaseVersions(version); + return AjaxResult.success(allReleaseVersions); + } } diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/ReleaseVersionMapper.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/ReleaseVersionMapper.java index 001bb63..6b7be83 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/ReleaseVersionMapper.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/mapper/ReleaseVersionMapper.java @@ -1,7 +1,9 @@ package com.bonus.ai.mapper; +import com.bonus.ai.domain.DataSetBasicFileEntity; import com.bonus.ai.domain.dataset.ReleaseVersionEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -31,4 +33,10 @@ public interface ReleaseVersionMapper { * @return 条数 */ int delete(Long[] versionIds); + + void releaseMap( @Param("taskBasicFile") List taskBasicFile,@Param("versionId") Long versionId); + + List getReleaseMapList(Long versionId); + + void deleteMap(Long versionId); } 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 ea71aef..e422614 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 @@ -8,6 +8,7 @@ import com.bonus.ai.domain.DataSetBasicFileEntity; import com.bonus.ai.domain.dataset.*; import com.bonus.ai.mapper.AnnotationTaskMapper; import com.bonus.ai.mapper.DatasetFileMapper; +import com.bonus.ai.mapper.ReleaseVersionMapper; import com.bonus.ai.service.dataset.AnnotationTaskService; import com.bonus.ai.utils.AverageUtil; import com.bonus.common.core.utils.SpringUtils; @@ -49,6 +50,9 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { @Resource private DatasetFileMapper datasetFileMapper; + @Resource + private ReleaseVersionMapper releaseVersionMapper; + @Resource private MinioConfig minioConfig; @@ -335,17 +339,8 @@ public class AnnotationTaskServiceImpl implements AnnotationTaskService { } @Override - public List geAllAuditAnnotationByTaskId(Long taskId){ - try { - AnnotationTaskEntity task = new AnnotationTaskEntity(); - task.setTaskId(taskId); - task.setFileAnnotationStatus("2"); - return annotationTaskMapper.getTaskBasicFile(task); - }catch (Exception e) - { - e.printStackTrace(); - return new ArrayList<>(); - } + public List geAllAuditAnnotationByTaskId(Long versionId){ + return releaseVersionMapper.getReleaseMapList(versionId); } @Override public String getLatestDatasetVersion(Long datasetId ){ diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/ReleaseVersionServiceImpl.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/ReleaseVersionServiceImpl.java index 1d77a6d..ff755f6 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/ReleaseVersionServiceImpl.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/Impl/dataset/ReleaseVersionServiceImpl.java @@ -1,6 +1,9 @@ package com.bonus.ai.service.Impl.dataset; +import com.bonus.ai.domain.DataSetBasicFileEntity; +import com.bonus.ai.domain.dataset.AnnotationTaskEntity; import com.bonus.ai.domain.dataset.ReleaseVersionEntity; +import com.bonus.ai.mapper.AnnotationTaskMapper; import com.bonus.ai.mapper.ReleaseVersionMapper; import com.bonus.ai.service.dataset.ReleaseVersionService; import com.bonus.common.core.web.domain.AjaxResult; @@ -15,9 +18,13 @@ import java.util.List; * @author bonus */ @Service -public class ReleaseVersionServiceImpl implements ReleaseVersionService { +public class ReleaseVersionServiceImpl implements ReleaseVersionService { @Resource private ReleaseVersionMapper mapper; + + @Resource + private AnnotationTaskMapper annotationTaskMapper; + /** * 获取数据集版本列表 * @@ -38,10 +45,21 @@ public class ReleaseVersionServiceImpl implements ReleaseVersionService { @Override public AjaxResult release(ReleaseVersionEntity version) { try { + AnnotationTaskEntity task = new AnnotationTaskEntity(); + task.setTaskId(version.getTaskId()); + task.setFileAnnotationStatus("2"); + List taskBasicFile = annotationTaskMapper.getTaskBasicFile(task); + + if (taskBasicFile.isEmpty()) { + return AjaxResult.error("不存在已审核的标注信息,不能发布"); + } version.setCreateBy(SecurityUtils.getUserId().toString()); - int num = mapper.release(version); - return num>0?AjaxResult.success():AjaxResult.error(); - }catch (Exception e) { + int num = mapper.release(version); + if (num > 0) { + mapper.releaseMap(taskBasicFile, version.getVersionId()); + } + return num > 0 ? AjaxResult.success() : AjaxResult.error(); + } catch (Exception e) { return AjaxResult.error(); } } @@ -56,8 +74,11 @@ public class ReleaseVersionServiceImpl implements ReleaseVersionService { public AjaxResult delete(Long[] versionIds) { try { int delete = mapper.delete(versionIds); - return delete>0?AjaxResult.success():AjaxResult.error(); - }catch (Exception e) { + for (Long versionId : versionIds) { + mapper.deleteMap(versionId); + } + return delete > 0 ? AjaxResult.success() : AjaxResult.error(); + } catch (Exception e) { return AjaxResult.error(); } } diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/dataset/ReleaseVersionService.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/dataset/ReleaseVersionService.java index 1b41885..e9ae6a2 100644 --- a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/dataset/ReleaseVersionService.java +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/service/dataset/ReleaseVersionService.java @@ -31,4 +31,7 @@ public interface ReleaseVersionService { * @return 条数 */ AjaxResult delete(Long[] versionIds); + + + } diff --git a/bonus-modules/bonus-ai/src/main/resources/mapper/AnnotationTaskMapper.xml b/bonus-modules/bonus-ai/src/main/resources/mapper/AnnotationTaskMapper.xml index 9a08b19..2c8281a 100644 --- a/bonus-modules/bonus-ai/src/main/resources/mapper/AnnotationTaskMapper.xml +++ b/bonus-modules/bonus-ai/src/main/resources/mapper/AnnotationTaskMapper.xml @@ -352,20 +352,11 @@ diff --git a/bonus-modules/bonus-ai/src/main/resources/mapper/ReleaseVersionMapper.xml b/bonus-modules/bonus-ai/src/main/resources/mapper/ReleaseVersionMapper.xml index 7d2c314..8582de5 100644 --- a/bonus-modules/bonus-ai/src/main/resources/mapper/ReleaseVersionMapper.xml +++ b/bonus-modules/bonus-ai/src/main/resources/mapper/ReleaseVersionMapper.xml @@ -1,10 +1,17 @@ - + INSERT INTO ai_dataset_version (version_name, version_description, dataset_id, task_id, create_by) VALUES (#{versionName}, #{versionDesc}, #{datasetId}, #{taskId}, #{createBy}); + + INSERT INTO ai_version_file_map (version_id, file_id, annotation_result) + VALUES + + (#{versionId}, #{item.fileId}, #{item.annotationResult}) + + update ai_dataset_version set del_flag='1' where version_id in @@ -12,32 +19,49 @@ #{id} + + delete from ai_version_file_map where version_id = #{versionId} + + \ No newline at end of file