import { create } from 'zustand'; import type { KnowledgeBase, Document } from '../api/knowledgeBaseApi'; import { knowledgeBaseApi, documentApi } from '../api/knowledgeBaseApi'; interface KnowledgeBaseState { // 知识库列表 knowledgeBases: KnowledgeBase[]; currentKb: KnowledgeBase | null; // 文档列表 documents: Document[]; // 加载状态 loading: boolean; error: string | null; // 操作方法 fetchKnowledgeBases: () => Promise; fetchKnowledgeBaseById: (id: string) => Promise; createKnowledgeBase: (name: string, description?: string) => Promise; updateKnowledgeBase: (id: string, name?: string, description?: string) => Promise; deleteKnowledgeBase: (id: string) => Promise; // 文档操作 fetchDocuments: (kbId: string) => Promise; uploadDocument: (kbId: string, file: File, onProgress?: (progress: number) => void) => Promise; deleteDocument: (id: string) => Promise; reprocessDocument: (id: string) => Promise; // 辅助方法 setCurrentKb: (kb: KnowledgeBase | null) => void; clearError: () => void; } export const useKnowledgeBaseStore = create((set, get) => ({ knowledgeBases: [], currentKb: null, documents: [], loading: false, error: null, // 获取知识库列表 fetchKnowledgeBases: async () => { set({ loading: true, error: null }); try { const knowledgeBases = await knowledgeBaseApi.getList(); set({ knowledgeBases, loading: false }); } catch (error: any) { set({ error: error.response?.data?.message || '获取知识库列表失败', loading: false }); } }, // 获取知识库详情 fetchKnowledgeBaseById: async (id: string) => { set({ loading: true, error: null }); try { const kb = await knowledgeBaseApi.getById(id); set({ currentKb: kb, loading: false }); // 同时获取文档列表 if (kb.id) { await get().fetchDocuments(kb.id); } } catch (error: any) { set({ error: error.response?.data?.message || '获取知识库详情失败', loading: false }); } }, // 创建知识库 createKnowledgeBase: async (name: string, description?: string) => { set({ loading: true, error: null }); try { const kb = await knowledgeBaseApi.create({ name, description }); // 更新列表 const knowledgeBases = [...get().knowledgeBases, kb]; set({ knowledgeBases, loading: false }); return kb; } catch (error: any) { const errorMsg = error.response?.data?.message || '创建知识库失败'; set({ error: errorMsg, loading: false }); throw new Error(errorMsg); } }, // 更新知识库 updateKnowledgeBase: async (id: string, name?: string, description?: string) => { set({ loading: true, error: null }); try { const updatedKb = await knowledgeBaseApi.update(id, { name, description }); // 更新列表 const knowledgeBases = get().knowledgeBases.map(kb => kb.id === id ? updatedKb : kb ); // 更新当前知识库 const currentKb = get().currentKb?.id === id ? updatedKb : get().currentKb; set({ knowledgeBases, currentKb, loading: false }); } catch (error: any) { set({ error: error.response?.data?.message || '更新知识库失败', loading: false }); throw error; } }, // 删除知识库 deleteKnowledgeBase: async (id: string) => { set({ loading: true, error: null }); try { await knowledgeBaseApi.delete(id); // 更新列表 const knowledgeBases = get().knowledgeBases.filter(kb => kb.id !== id); // 清除当前知识库(如果是被删除的) const currentKb = get().currentKb?.id === id ? null : get().currentKb; set({ knowledgeBases, currentKb, loading: false }); } catch (error: any) { set({ error: error.response?.data?.message || '删除知识库失败', loading: false }); throw error; } }, // 获取文档列表 fetchDocuments: async (kbId: string) => { try { const documents = await documentApi.getList(kbId); set({ documents }); } catch (error: any) { set({ error: error.response?.data?.message || '获取文档列表失败' }); } }, // 上传文档 uploadDocument: async (kbId: string, file: File, onProgress?: (progress: number) => void) => { set({ loading: true, error: null }); try { const document = await documentApi.upload(kbId, file, onProgress); // 更新文档列表 const documents = [document, ...get().documents]; set({ documents, loading: false }); return document; } catch (error: any) { const errorMsg = error.response?.data?.message || '上传文档失败'; set({ error: errorMsg, loading: false }); throw new Error(errorMsg); } }, // 删除文档 deleteDocument: async (id: string) => { set({ loading: true, error: null }); try { await documentApi.delete(id); // 更新文档列表 const documents = get().documents.filter(doc => doc.id !== id); set({ documents, loading: false }); } catch (error: any) { set({ error: error.response?.data?.message || '删除文档失败', loading: false }); throw error; } }, // 重新处理文档 reprocessDocument: async (id: string) => { set({ loading: true, error: null }); try { await documentApi.reprocess(id); // 更新文档状态 const documents = get().documents.map(doc => doc.id === id ? { ...doc, status: 'parsing' as const, progress: 0 } : doc ); set({ documents, loading: false }); } catch (error: any) { set({ error: error.response?.data?.message || '重新处理文档失败', loading: false }); throw error; } }, // 设置当前知识库 setCurrentKb: (kb: KnowledgeBase | null) => { set({ currentKb: kb }); }, // 清除错误 clearError: () => { set({ error: null }); }, }));