feat(ai): 添加样本文件后缀支持和标签分组功能

- 在AiSampleDO中新增suffix字段存储文件后缀
- 在AiSampleRespVO中添加suffix响应字段
- 修改文件上传逻辑分离文件名和后缀并分别存储
- 新增根据标签ID获取分组列表的API接口
- 在标签服务中实现分组关联查询功能
- 修复标签分组关联关系创建和更新逻辑
- 优化标签分页查询添加软删除过滤条件
This commit is contained in:
2026-03-04 12:50:10 +08:00
parent 56656693c3
commit a8aa2a60fe
7 changed files with 60 additions and 9 deletions

View File

@@ -2,6 +2,7 @@ package com.tashow.cloud.ai.controller.admin.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagListRespVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupRespVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.ai.service.aisample.AiSampleTagService;
@@ -66,6 +67,14 @@ public class AiSampleTagController {
return success(BeanUtils.toBean(aiSampleTagService.getAiSampleTagList(), AiSampleTagListRespVO.class));
}
@GetMapping("/group-list-by-tag-id")
@Operation(summary = "根据标签 id 获取分组")
@Parameter(name = "tagId", description = "标签 id", required = true)
@PermitAll
public CommonResult<List<AiSampleTagGroupRespVO>> getGroupListByTagId(@RequestParam("tagId") Long tagId) {
return success(BeanUtils.toBean(aiSampleTagService.getGroupListByTagId(tagId), AiSampleTagGroupRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得样本标签库分页")
// @PreAuthorize("@ss.hasPermission('ai:sampleTag:query')")
@@ -75,4 +84,4 @@ public class AiSampleTagController {
return success(pageResult);
}
}
}

View File

@@ -47,4 +47,10 @@ public class AiSampleRespVO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime;
@Schema(description = "文件后缀")
private String suffix;
}

View File

@@ -59,5 +59,9 @@ public class AiSampleDO extends BaseDO {
* 样本注释
*/
private String remark;
/**
*后缀)
*/
private String suffix;
}

View File

@@ -28,6 +28,7 @@ public interface AiSampleTagMapper extends BaseMapperX<AiSampleTagDO> {
"FROM tz_ai_sample_tag t " +
"INNER JOIN tz_ai_sample_tag_group_relate r ON t.id = r.sample_tag_id " +
"<where>" +
"AND t.deleted =0"+
" <if test=\"pageReqVO.groupId != null\">" +
" AND r.sample_tag_group_id = #{pageReqVO.groupId}" +
" </if>" +

View File

@@ -65,11 +65,14 @@ public class AiSampleServiceImpl implements AiSampleService {
//保存样本信息
AiSampleDO aiSampleDO = new AiSampleDO();
aiSampleDO.setSampleFilePath(filePath);
aiSampleDO.setSampleName(file.getOriginalFilename());
String filename = file.getOriginalFilename();
String displayName = filename.substring(0, filename.lastIndexOf('.'));
aiSampleDO.setSampleName(displayName);
aiSampleDO.setSuffix(filename.substring(filename.lastIndexOf('.') + 1));
aiSampleDO.setSampleMineType(file.getContentType());
aiSampleDO.setSampleSize(file.getSize());
aiSampleMapper.insert(aiSampleDO);
urls.add(new AiSampleFileRespVO().setFileUrl(filePath).setFileName(file.getOriginalFilename()));
urls.add(new AiSampleFileRespVO().setFileUrl(filePath).setFileName(filename).setDisplayName(displayName));
}
// 返回
return urls;

View File

@@ -3,6 +3,7 @@ package com.tashow.cloud.ai.service.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
import com.tashow.cloud.common.pojo.PageResult;
import jakarta.validation.Valid;
@@ -58,4 +59,12 @@ public interface AiSampleTagService {
* @return
*/
List<AiSampleTagDO> getAiSampleTagList();
}
/**
* 根据标签 id 获取关联分组列表
*
* @param tagId 标签 id
* @return 分组列表
*/
List<AiSampleTagGroupDO> getGroupListByTagId(Long tagId);
}

View File

@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupRelateDO;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagGroupMapper;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagGroupRelateMapper;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagMapper;
import com.tashow.cloud.common.pojo.PageResult;
@@ -17,6 +19,7 @@ import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 样本标签库 Service 实现类
@@ -30,6 +33,8 @@ public class AiSampleTagServiceImpl implements AiSampleTagService {
@Resource
private AiSampleTagMapper aiSampleTagMapper;
@Resource
private AiSampleTagGroupMapper aiSampleTagGroupMapper;
@Resource
private AiSampleTagGroupRelateMapper tagGroupRelateMapper;
@Override
@@ -41,7 +46,6 @@ public class AiSampleTagServiceImpl implements AiSampleTagService {
List<AiSampleTagGroupRelateDO> tagGroupRelateDOS = new ArrayList<>();
for (Long groupId : createReqVO.getGroupIds()) {
AiSampleTagGroupRelateDO tagGroupRelateDO = new AiSampleTagGroupRelateDO();
tagGroupRelateDO.setSampleTagId(createReqVO.getId());
tagGroupRelateDO.setSampleTagGroupId(groupId);
tagGroupRelateDO.setSampleTagId(aiSampleTag.getId());
tagGroupRelateDOS.add(tagGroupRelateDO);
@@ -58,11 +62,13 @@ public class AiSampleTagServiceImpl implements AiSampleTagService {
// 更新
AiSampleTagDO updateObj = BeanUtils.toBean(updateReqVO, AiSampleTagDO.class);
aiSampleTagMapper.updateById(updateObj);
//删除所有关联
tagGroupRelateMapper.delete(new LambdaQueryWrapper<AiSampleTagGroupRelateDO>().eq(AiSampleTagGroupRelateDO::getSampleTagId, updateReqVO.getId()));
List<Long> groupIds = updateReqVO.getGroupIds();
// 删除该标签的所有旧关联
tagGroupRelateMapper.delete(new LambdaQueryWrapper<AiSampleTagGroupRelateDO>()
.eq(AiSampleTagGroupRelateDO::getSampleTagId, updateReqVO.getId()));
//插入关联
List<AiSampleTagGroupRelateDO> tagGroupRelateDOS = new ArrayList<>();
for (Long groupId : updateReqVO.getGroupIds()) {
for (Long groupId : groupIds) {
AiSampleTagGroupRelateDO tagGroupRelateDO = new AiSampleTagGroupRelateDO();
tagGroupRelateDO.setSampleTagId(updateReqVO.getId());
tagGroupRelateDO.setSampleTagGroupId(groupId);
@@ -100,4 +106,17 @@ public class AiSampleTagServiceImpl implements AiSampleTagService {
public List<AiSampleTagDO> getAiSampleTagList() {
return aiSampleTagMapper.selectList(new LambdaQueryWrapper<AiSampleTagDO>().orderByDesc(AiSampleTagDO::getId));
}
}
@Override
public List<AiSampleTagGroupDO> getGroupListByTagId(Long tagId) {
List<AiSampleTagGroupRelateDO> relateList = tagGroupRelateMapper.selectList(
new LambdaQueryWrapper<AiSampleTagGroupRelateDO>()
.eq(AiSampleTagGroupRelateDO::getSampleTagId, tagId));
List<Long> groupIds = relateList.stream()
.map(AiSampleTagGroupRelateDO::getSampleTagGroupId)
.distinct()
.collect(Collectors.toList());
return aiSampleTagGroupMapper.selectList(
new LambdaQueryWrapper<AiSampleTagGroupDO>().in(AiSampleTagGroupDO::getId, groupIds));
}
}