1+ package com .datamate .rag .indexer .application ;
2+
3+ import com .baomidou .mybatisplus .core .metadata .IPage ;
4+ import com .baomidou .mybatisplus .extension .plugins .pagination .Page ;
5+ import com .datamate .rag .indexer .domain .model .FileStatus ;
6+ import com .datamate .rag .indexer .domain .model .KnowledgeBase ;
7+ import com .datamate .rag .indexer .domain .model .RagChunk ;
8+ import com .datamate .rag .indexer .domain .model .RagFile ;
9+ import com .datamate .rag .indexer .domain .repository .KnowledgeBaseRepository ;
10+ import com .datamate .rag .indexer .domain .repository .RagFileRepository ;
11+ import com .datamate .rag .indexer .infrastructure .event .DataInsertedEvent ;
12+ import com .datamate .common .infrastructure .exception .BusinessException ;
13+ import com .datamate .common .infrastructure .exception .KnowledgeBaseErrorCode ;
14+ import com .datamate .common .interfaces .PagedResponse ;
15+ import com .datamate .common .interfaces .PagingQuery ;
16+ import com .datamate .rag .indexer .interfaces .dto .*;
17+ import lombok .RequiredArgsConstructor ;
18+ import org .springframework .beans .BeanUtils ;
19+ import org .springframework .context .ApplicationEventPublisher ;
20+ import org .springframework .stereotype .Service ;
21+ import org .springframework .transaction .annotation .Transactional ;
22+ import org .springframework .util .StringUtils ;
23+
24+ import java .util .List ;
25+ import java .util .Optional ;
26+
27+ /**
28+ * 知识库服务类
29+ *
30+ * @author dallas
31+ * @since 2025-10-24
32+ */
33+ @ Service
34+ @ RequiredArgsConstructor
35+ public class KnowledgeBaseService {
36+ private final KnowledgeBaseRepository knowledgeBaseRepository ;
37+ private final RagFileRepository ragFileRepository ;
38+ private final ApplicationEventPublisher eventPublisher ;
39+
40+
41+ /**
42+ * 创建知识库
43+ *
44+ * @param request 知识库创建请求
45+ * @return 知识库 ID
46+ */
47+ public String create (KnowledgeBaseCreateReq request ) {
48+ KnowledgeBase knowledgeBase = new KnowledgeBase ();
49+ BeanUtils .copyProperties (request , knowledgeBase );
50+ knowledgeBaseRepository .save (knowledgeBase );
51+ return knowledgeBase .getId ();
52+ }
53+
54+ /**
55+ * 更新知识库
56+ *
57+ * @param knowledgeBaseId 知识库 ID
58+ * @param request 知识库更新请求
59+ */
60+ public void update (String knowledgeBaseId , KnowledgeBaseUpdateReq request ) {
61+ KnowledgeBase knowledgeBase = Optional .ofNullable (knowledgeBaseRepository .getById (knowledgeBaseId ))
62+ .orElseThrow (() -> BusinessException .of (KnowledgeBaseErrorCode .KNOWLEDGE_BASE_NOT_FOUND ));
63+ if (StringUtils .hasText (request .getName ())) {
64+ knowledgeBase .setName (request .getName ());
65+ }
66+ if (StringUtils .hasText (request .getDescription ())) {
67+ knowledgeBase .setDescription (request .getDescription ());
68+ }
69+ knowledgeBaseRepository .updateById (knowledgeBase );
70+ }
71+
72+ public void delete (String knowledgeBaseId ) {
73+ knowledgeBaseRepository .removeById (knowledgeBaseId );
74+ ragFileRepository .removeByKnowledgeBaseId (knowledgeBaseId );
75+ // TODO: 删除知识库关联的所有文档
76+ }
77+
78+ public KnowledgeBase getById (String knowledgeBaseId ) {
79+ return Optional .ofNullable (knowledgeBaseRepository .getById (knowledgeBaseId ))
80+ .orElseThrow (() -> BusinessException .of (KnowledgeBaseErrorCode .KNOWLEDGE_BASE_NOT_FOUND ));
81+ }
82+
83+ public PagedResponse <KnowledgeBase > list (KnowledgeBaseQueryReq request ) {
84+ IPage <KnowledgeBase > page = new Page <>(request .getPage (), request .getSize ());
85+ page = knowledgeBaseRepository .page (page , request );
86+ return PagedResponse .of (page .getRecords (), page .getCurrent (), page .getTotal (), page .getPages ());
87+ }
88+
89+ @ Transactional (rollbackFor = Exception .class )
90+ public void addFiles (AddFilesReq request ) {
91+ KnowledgeBase knowledgeBase = Optional .ofNullable (knowledgeBaseRepository .getById (request .getKnowledgeBaseId ()))
92+ .orElseThrow (() -> BusinessException .of (KnowledgeBaseErrorCode .KNOWLEDGE_BASE_NOT_FOUND ));
93+ List <RagFile > ragFiles = request .getFiles ().stream ().map (fileInfo -> {
94+ RagFile ragFile = new RagFile ();
95+ ragFile .setKnowledgeBaseId (knowledgeBase .getId ());
96+ ragFile .setFileId (fileInfo .fileId ());
97+ ragFile .setFileName (fileInfo .fileName ());
98+ ragFile .setStatus (FileStatus .UNPROCESSED );
99+ return ragFile ;
100+ }).toList ();
101+ ragFileRepository .saveBatch (ragFiles , 100 );
102+ eventPublisher .publishEvent (new DataInsertedEvent (knowledgeBase .getId (), request .getProcessType ()));
103+ }
104+
105+ public PagedResponse <RagFile > listFiles (String knowledgeBaseId , RagFileReq request ) {
106+ IPage <RagFile > page = new Page <>(request .getPage (), request .getSize ());
107+ page = ragFileRepository .page (page );
108+ return PagedResponse .of (page .getRecords (), page .getCurrent (), page .getTotal (), page .getPages ());
109+ }
110+
111+ public void deleteFile (String knowledgeBaseId , DeleteFilesReq request ) {
112+ }
113+
114+ public PagedResponse <RagChunk > getChunks (String knowledgeBaseId , String ragFileId , PagingQuery pagingQuery ) {
115+ IPage <RagChunk > page = new Page <>(pagingQuery .getPage (), pagingQuery .getSize ());
116+ return PagedResponse .of (page .getRecords (), page .getCurrent (), page .getTotal (), page .getPages ());
117+ }
118+ }
0 commit comments