From 28ad29d6edb516420b0e9118c43b5130e3905e58 Mon Sep 17 00:00:00 2001 From: RobustH <1511209518@qq.com> Date: Sun, 12 Apr 2026 18:37:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(knowledge):=20=E5=AE=8C=E5=96=84=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E5=BA=93=E5=8F=8A=E9=99=84=E4=BB=B6=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BF=AE=E5=A4=8D=E5=88=86=E5=9D=97?= =?UTF-8?q?=E6=95=B0=E7=BB=9F=E8=AE=A1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/knowledge/DocFragmentCountVo.java | 20 ++++++++++++ .../vo/knowledge/KnowledgeAttachVo.java | 12 +++++++ .../domain/vo/knowledge/KnowledgeInfoVo.java | 5 +++ .../knowledge/KnowledgeAttachMapper.java | 7 ++++ .../knowledge/KnowledgeFragmentMapper.java | 19 +++++++++++ .../impl/KnowledgeAttachServiceImpl.java | 32 ++++++++++++++++++- .../impl/KnowledgeInfoServiceImpl.java | 16 ++++++++++ 7 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/DocFragmentCountVo.java diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/DocFragmentCountVo.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/DocFragmentCountVo.java new file mode 100644 index 00000000..f162d93b --- /dev/null +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/DocFragmentCountVo.java @@ -0,0 +1,20 @@ +package org.ruoyi.domain.vo.knowledge; + +import lombok.Data; + +/** + * 文档分块数统计 VO(用于 GROUP BY 查询结果接收) + */ +@Data +public class DocFragmentCountVo { + + /** + * 文档ID(关联 knowledge_attach.doc_id) + */ + private String docId; + + /** + * 该文档下的分块数量 + */ + private Integer fragmentCount; +} diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/KnowledgeAttachVo.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/KnowledgeAttachVo.java index 8d3f2f08..adf27c9c 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/KnowledgeAttachVo.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/KnowledgeAttachVo.java @@ -8,6 +8,7 @@ import org.ruoyi.domain.entity.knowledge.KnowledgeAttach; import java.io.Serial; import java.io.Serializable; +import java.util.Date; @@ -68,5 +69,16 @@ public class KnowledgeAttachVo implements Serializable { @ExcelProperty(value = "备注") private String remark; + /** + * 上传时间(来自 BaseEntity.createTime) + */ + @ExcelProperty(value = "上传时间") + private Date createTime; + + /** + * 分块数(统计字段,非数据库列) + */ + private Integer fragmentCount; + } diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/KnowledgeInfoVo.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/KnowledgeInfoVo.java index bf0580dd..53e136dd 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/KnowledgeInfoVo.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/knowledge/KnowledgeInfoVo.java @@ -100,5 +100,10 @@ public class KnowledgeInfoVo implements Serializable { @ExcelProperty(value = "备注") private String remark; + /** + * 文档数(统计字段,非数据库列) + */ + private Integer documentCount; + } diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/knowledge/KnowledgeAttachMapper.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/knowledge/KnowledgeAttachMapper.java index 71ab3b28..b413916b 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/knowledge/KnowledgeAttachMapper.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/knowledge/KnowledgeAttachMapper.java @@ -1,5 +1,7 @@ package org.ruoyi.mapper.knowledge; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.ruoyi.domain.entity.knowledge.KnowledgeAttach; import org.ruoyi.domain.vo.knowledge.KnowledgeAttachVo; import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; @@ -12,4 +14,9 @@ import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; */ public interface KnowledgeAttachMapper extends BaseMapperPlus { + /** + * 统计指定知识库下的文档数量 + */ + @Select("SELECT COUNT(*) FROM knowledge_attach WHERE knowledge_id = #{knowledgeId}") + int countByKnowledgeId(@Param("knowledgeId") Long knowledgeId); } diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/knowledge/KnowledgeFragmentMapper.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/knowledge/KnowledgeFragmentMapper.java index b16995fa..2d4f5d32 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/knowledge/KnowledgeFragmentMapper.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/knowledge/KnowledgeFragmentMapper.java @@ -1,9 +1,14 @@ package org.ruoyi.mapper.knowledge; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.ruoyi.domain.entity.knowledge.KnowledgeFragment; +import org.ruoyi.domain.vo.knowledge.DocFragmentCountVo; import org.ruoyi.domain.vo.knowledge.KnowledgeFragmentVo; import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; +import java.util.List; + /** * 知识片段Mapper接口 * @@ -12,4 +17,18 @@ import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; */ public interface KnowledgeFragmentMapper extends BaseMapperPlus { + /** + * 批量统计各文档的分块数(强类型接收,避免 Map key 大小写问题) + * + * @param docIds 文档 ID 列表 + * @return 每个 docId 对应的分块数列表 + */ + @Select("") + List selectFragmentCountByDocIds(@Param("docIds") List docIds); } diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/knowledge/impl/KnowledgeAttachServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/knowledge/impl/KnowledgeAttachServiceImpl.java index ce02785e..a030d599 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/knowledge/impl/KnowledgeAttachServiceImpl.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/knowledge/impl/KnowledgeAttachServiceImpl.java @@ -20,6 +20,7 @@ import org.ruoyi.domain.bo.knowledge.KnowledgeInfoUploadBo; import org.ruoyi.domain.bo.vector.StoreEmbeddingBo; import org.ruoyi.domain.entity.knowledge.KnowledgeAttach; import org.ruoyi.domain.entity.knowledge.KnowledgeFragment; +import org.ruoyi.domain.vo.knowledge.DocFragmentCountVo; import org.ruoyi.domain.vo.knowledge.KnowledgeAttachVo; import org.ruoyi.domain.vo.knowledge.KnowledgeInfoVo; import org.ruoyi.factory.ResourceLoaderFactory; @@ -81,6 +82,9 @@ public class KnowledgeAttachServiceImpl implements IKnowledgeAttachService { public TableDataInfo queryPageList(KnowledgeAttachBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 批量填充分块数 + List records = result.getRecords(); + fillFragmentCount(records); return TableDataInfo.build(result); } @@ -93,7 +97,33 @@ public class KnowledgeAttachServiceImpl implements IKnowledgeAttachService { @Override public List queryList(KnowledgeAttachBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List list = baseMapper.selectVoList(lqw); + fillFragmentCount(list); + return list; + } + + /** + * 批量填充每个附件记录的分块数(fragmentCount) + */ + private void fillFragmentCount(List records) { + if (records == null || records.isEmpty()) return; + List docIds = records.stream() + .map(KnowledgeAttachVo::getDocId) + .filter(docId -> docId != null && !docId.isEmpty()) + .distinct() + .collect(java.util.stream.Collectors.toList()); + if (docIds.isEmpty()) return; + List countList = + knowledgeFragmentMapper.selectFragmentCountByDocIds(docIds); + Map countMap = new java.util.HashMap<>(); + for (DocFragmentCountVo item : countList) { + if (item.getDocId() != null) { + countMap.put(item.getDocId(), item.getFragmentCount()); + } + } + for (KnowledgeAttachVo vo : records) { + vo.setFragmentCount(countMap.getOrDefault(vo.getDocId(), 0)); + } } private LambdaQueryWrapper buildQueryWrapper(KnowledgeAttachBo bo) { diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/knowledge/impl/KnowledgeInfoServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/knowledge/impl/KnowledgeInfoServiceImpl.java index 6e7a8d7b..266fd5c8 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/knowledge/impl/KnowledgeInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/knowledge/impl/KnowledgeInfoServiceImpl.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.ruoyi.domain.bo.knowledge.KnowledgeInfoBo; import org.ruoyi.domain.entity.knowledge.KnowledgeInfo; import org.ruoyi.domain.vo.knowledge.KnowledgeInfoVo; +import org.ruoyi.mapper.knowledge.KnowledgeAttachMapper; import org.ruoyi.mapper.knowledge.KnowledgeInfoMapper; import org.ruoyi.service.knowledge.IKnowledgeInfoService; import org.springframework.stereotype.Service; @@ -33,6 +34,8 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService { private final KnowledgeInfoMapper baseMapper; + private final KnowledgeAttachMapper knowledgeAttachMapper; + /** * 查询知识库 * @@ -55,6 +58,8 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService { public TableDataInfo queryPageList(KnowledgeInfoBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 批量填充文档数 + fillDocumentCount(result.getRecords()); return TableDataInfo.build(result); } @@ -87,6 +92,17 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService { return lqw; } + /** + * 批量填充知识库列表每一条记录的文档数(documentCount) + */ + private void fillDocumentCount(List records) { + if (records == null || records.isEmpty()) return; + for (KnowledgeInfoVo vo : records) { + int count = knowledgeAttachMapper.countByKnowledgeId(vo.getId()); + vo.setDocumentCount(count); + } + } + /** * 新增知识库 *