From 56656693c36e40ef448ab1ec685214d48704200d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=A0=E5=B1=B1?= <17738440858@163.com> Date: Sat, 28 Feb 2026 11:48:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai-sample):=20=E6=B7=BB=E5=8A=A0=E6=A0=B7?= =?UTF-8?q?=E6=9C=AC=E6=89=B9=E9=87=8F=E4=B8=8B=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在AiSampleController中新增/download接口支持批量下载 - 实现downloadSamples方法处理单个和多个样本下载逻辑 - 集成HttpUtil下载文件并使用ZipOutputStream打包多文件 - 添加文件服务器地址配置注入 --- .../admin/aisample/AiSampleController.java | 11 ++++++ .../dal/dataobject/aisample/AiSampleDO.java | 2 ++ .../ai/dal/mysql/aisample/AiSampleMapper.java | 2 +- .../ai/service/aisample/AiSampleService.java | 9 +++++ .../service/aisample/AiSampleServiceImpl.java | 35 ++++++++++++++++++- 5 files changed, 57 insertions(+), 2 deletions(-) diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java index 467e677..435e009 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java @@ -11,10 +11,12 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.io.IOException; import java.util.List; import static com.tashow.cloud.common.pojo.CommonResult.success; @@ -91,4 +93,13 @@ public class AiSampleController { PageResult pageResult = aiSampleService.getAiSamplePage(pageReqVO); return success(BeanUtils.toBean(pageResult, AiSampleRespVO.class)); } + + @GetMapping("/download") + @Operation(summary = "批量下载样本") + @Parameter(name = "ids", description = "样本ID列表(逗号分隔)", required = true, example = "1,2,3") + @PermitAll + public void downloadSamples(@RequestParam("ids") String ids, HttpServletResponse response) throws IOException { + aiSampleService.downloadSamples(ids, response); + } + } \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleDO.java index ae22fe3..de91367 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleDO.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleDO.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.tashow.cloud.common.serializer.ImgJsonSerializer; import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO; import lombok.*; diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleMapper.java index f4db01d..1dc8e28 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleMapper.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleMapper.java @@ -32,7 +32,7 @@ public interface AiSampleMapper extends BaseMapperX { "" + "AND t.deleted =0"+ " " + - " AND FIND_IN_SET(r.sample_tag_id,${pageReqVO.tagIds}) " + + " AND FIND_IN_SET(r.sample_tag_id, '${pageReqVO.tagIds}') " + " " + " " + " AND t.sample_name LIKE CONCAT('%',#{pageReqVO.sampleName},'%')" + diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java index 8e9d3c3..fdfcfff 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java @@ -3,8 +3,10 @@ package com.tashow.cloud.ai.service.aisample; import com.tashow.cloud.ai.controller.admin.aisample.vo.*; import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO; import com.tashow.cloud.common.pojo.PageResult; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; +import java.io.IOException; import java.util.List; /** @@ -69,5 +71,12 @@ public interface AiSampleService { */ PageResult getAiSamplePage(AiSamplePageReqVO pageReqVO); + /** + * 批量下载样本 + * + * @param ids 样本ID列表(逗号分隔) + * @param response HTTP响应 + */ + void downloadSamples(String ids, HttpServletResponse response) throws IOException; } \ No newline at end of file diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java index 736ecc3..51a29af 100644 --- a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java +++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java @@ -3,6 +3,7 @@ package com.tashow.cloud.ai.service.aisample; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.tashow.cloud.ai.controller.admin.aisample.vo.*; @@ -17,15 +18,20 @@ import com.tashow.cloud.common.util.object.BeanUtils; import com.tashow.cloud.fileapi.api.file.FileApi; import com.tashow.cloud.mybatis.mybatis.core.util.MyBatisUtils; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 样本库 Service 实现类 @@ -44,7 +50,8 @@ public class AiSampleServiceImpl implements AiSampleService { private AiSampleTagRelateMapper aiSampleTagRelateMapper; @Resource private FileApi fileApi; - + @Value("${file-server}") + private String fileServer; @Override @SneakyThrows @@ -175,4 +182,30 @@ public class AiSampleServiceImpl implements AiSampleService { return new PageResult<>(aiSampleDOPageResult.getRecords(), aiSampleDOPageResult.getTotal()); } + @Override + public void downloadSamples(String ids, HttpServletResponse response) throws IOException { + List samples = aiSampleMapper.selectBatchIds(Arrays.asList(ids.split(StrUtil.COMMA))); + + if (samples.size() == 1) { + // 单个文件直接下载 + AiSampleDO sample = samples.get(0); + byte[] bytes = HttpUtil.downloadBytes(fileServer + sample.getSampleFilePath()); + response.setContentType(sample.getSampleMineType()); + response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(sample.getSampleName(), "UTF-8")); + response.getOutputStream().write(bytes); + } else { + // 多个文件打包成ZIP + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=samples.zip"); + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + for (AiSampleDO sample : samples) { + byte[] bytes = HttpUtil.downloadBytes(fileServer + sample.getSampleFilePath()); + zos.putNextEntry(new ZipEntry(sample.getSampleName())); + zos.write(bytes); + zos.closeEntry(); + } + } + } + } + } \ No newline at end of file