diff --git a/src/hooks/knowledge-hooks.ts b/src/hooks/knowledge-hooks.ts index 218ba71..01e6c2d 100644 --- a/src/hooks/knowledge-hooks.ts +++ b/src/hooks/knowledge-hooks.ts @@ -1,7 +1,8 @@ import { useState, useEffect, useCallback, useMemo } from 'react'; import knowledgeService from '@/services/knowledge_service'; import type { IKnowledge, IKnowledgeGraph, IKnowledgeResult } from '@/interfaces/database/knowledge'; -import type { IFetchKnowledgeListRequestParams } from '@/interfaces/request/knowledge'; +import type { IFetchKnowledgeListRequestBody, IFetchKnowledgeListRequestParams } from '@/interfaces/request/knowledge'; +import logger from '@/utils/logger'; /** { @@ -64,8 +65,9 @@ export interface UseKnowledgeListState { // 知识库列表Hook返回值接口 export interface UseKnowledgeListReturn extends UseKnowledgeListState { - fetchKnowledgeBases: (params?: IFetchKnowledgeListRequestParams) => Promise; + fetchKnowledgeBases: (params?: IFetchKnowledgeListRequestParams & IFetchKnowledgeListRequestBody) => Promise; setKeywords: (keywords: string) => void; + setTeamFilter: (teamFilter: string[]) => void; setCurrentPage: (page: number) => void; setPageSize: (size: number) => void; refresh: () => Promise; @@ -76,7 +78,7 @@ export interface UseKnowledgeListReturn extends UseKnowledgeListState { * 支持关键词搜索、分页等功能 */ export const useKnowledgeList = ( - initialParams?: IFetchKnowledgeListRequestParams + initialParams?: IFetchKnowledgeListRequestParams & IFetchKnowledgeListRequestBody ): UseKnowledgeListReturn => { const [knowledgeBases, setKnowledgeBases] = useState([]); const [total, setTotal] = useState(0); @@ -85,11 +87,12 @@ export const useKnowledgeList = ( const [currentPage, setCurrentPage] = useState(initialParams?.page || 1); const [pageSize, setPageSize] = useState(initialParams?.page_size || 10); const [keywords, setKeywords] = useState(initialParams?.keywords || ''); + const [filterData, setFilterData] = useState({}); /** * 获取知识库列表 */ - const fetchKnowledgeBases = useCallback(async (params?: IFetchKnowledgeListRequestParams) => { + const fetchKnowledgeBases = useCallback(async (params?: IFetchKnowledgeListRequestParams & IFetchKnowledgeListRequestBody) => { try { setLoading(true); setError(null); @@ -102,13 +105,17 @@ export const useKnowledgeList = ( }; // 构建请求体 - const requestBody: any = {}; - if (queryParams.keywords && queryParams.keywords.trim()) { - requestBody.keywords = queryParams.keywords.trim(); + const requestBody: IFetchKnowledgeListRequestBody = {}; + if (params?.owner_ids && params.owner_ids.length > 0) { + requestBody.owner_ids = params.owner_ids; + } + + if (filterData.owner_ids && filterData.owner_ids.length > 0) { + requestBody.owner_ids = filterData.owner_ids; } // 构建查询参数 - const requestParams: any = {}; + const requestParams: IFetchKnowledgeListRequestParams = {}; if (queryParams.page) { requestParams.page = queryParams.page; } @@ -139,7 +146,7 @@ export const useKnowledgeList = ( } finally { setLoading(false); } - }, [keywords, currentPage, pageSize]); + }, [keywords, currentPage, pageSize, filterData]); /** * 刷新当前页面数据 @@ -156,6 +163,10 @@ export const useKnowledgeList = ( setCurrentPage(1); }, []); + const handleSetTeamFilter = useCallback((newTeamFilter: string[]) => { + setFilterData({ ...filterData, owner_ids: newTeamFilter }); + }, []); + /** * 设置当前页 */ @@ -173,8 +184,10 @@ export const useKnowledgeList = ( // 当关键词、页码或页面大小变化时重新获取数据 useEffect(() => { + logger.info('useEffect currentPage:', currentPage); + logger.info('useEffect pageSize:', pageSize); fetchKnowledgeBases(); - }, [keywords, currentPage, pageSize]); + }, [currentPage, pageSize, filterData, keywords]); return { knowledgeBases, @@ -186,6 +199,7 @@ export const useKnowledgeList = ( keywords, fetchKnowledgeBases, setKeywords: handleSetKeywords, + setTeamFilter: handleSetTeamFilter, setCurrentPage: handleSetCurrentPage, setPageSize: handleSetPageSize, refresh, diff --git a/src/pages/knowledge/list.tsx b/src/pages/knowledge/list.tsx index 9f0d7bb..2de37ab 100644 --- a/src/pages/knowledge/list.tsx +++ b/src/pages/knowledge/list.tsx @@ -1,4 +1,4 @@ -import React, { useState, useCallback, useMemo } from 'react'; +import React, { useState, useCallback, useMemo, useEffect } from 'react'; import { Box, Typography, @@ -24,15 +24,16 @@ import { useUserData } from '@/hooks/useUserData'; import KnowledgeGridView from '@/components/knowledge/KnowledgeGridView'; import type { IKnowledge } from '@/interfaces/database/knowledge'; import { useDialog } from '@/hooks/useDialog'; +import logger from '@/utils/logger'; const KnowledgeBaseList: React.FC = () => { const navigate = useNavigate(); - const {deleteKnowledge} = useKnowledgeOperations(); - + const { deleteKnowledge } = useKnowledgeOperations(); + // 搜索和筛选状态 const [searchTerm, setSearchTerm] = useState(''); - const [teamFilter, setTeamFilter] = useState('all'); + const [teamFilter, setTeamFilter] = useState([]); const pageSize = 12; // 每页显示12个知识库 // 获取用户数据(包含租户列表) @@ -45,6 +46,7 @@ const KnowledgeBaseList: React.FC = () => { loading, error, currentPage, + setTeamFilter: hookSetTeamFilter, setKeywords, setCurrentPage, refresh, @@ -61,10 +63,16 @@ const KnowledgeBaseList: React.FC = () => { }, [setKeywords]); // 处理团队筛选 - const handleTeamFilterChange = useCallback((value: string) => { - setTeamFilter(value); - setCurrentPage(1); // 筛选时重置到第一页 - }, [setCurrentPage]); + const handleTeamFilterChange = useCallback((value: string[]) => { + if (value.includes('all')) { + setTeamFilter([]); + hookSetTeamFilter([]); + } else { + setTeamFilter(value); + hookSetTeamFilter(value); + } + setCurrentPage(1); + }, [setCurrentPage, hookSetTeamFilter]); // 处理分页变化 const handlePageChange = useCallback((_: React.ChangeEvent, page: number) => { @@ -107,46 +115,22 @@ const KnowledgeBaseList: React.FC = () => { navigate(`/knowledge/${kb.id}`); }, [navigate]); - // 根据团队筛选过滤知识库 - const filteredKnowledgeBases = useMemo(() => { - if (!knowledgeBases) return []; - - if (teamFilter === 'all') { - return knowledgeBases; - } - - // 根据租户ID筛选 - if (teamFilter !== 'all') { - return knowledgeBases.filter(kb => { - // 如果选择的是特定租户ID,则筛选该租户的知识库 - if (teamFilter === 'me') { - // 假设'me'表示当前用户的知识库,这里可以根据实际业务逻辑调整 - return kb.permission === 'me' || kb.tenant_id === tenantList?.[0].tenant_id; - } - // 如果是具体的租户ID - return kb.tenant_id === teamFilter; - }); - } - - return knowledgeBases; - }, [knowledgeBases, teamFilter, tenantList]); - // 计算总页数(基于筛选后的结果) - const totalPages = Math.ceil(filteredKnowledgeBases.length / pageSize); + const totalPages = Math.ceil(knowledgeBases.length / pageSize); // 获取当前页的数据 const currentPageData = useMemo(() => { const startIndex = (currentPage - 1) * pageSize; const endIndex = startIndex + pageSize; - return filteredKnowledgeBases.slice(startIndex, endIndex); - }, [filteredKnowledgeBases, currentPage, pageSize]); + return knowledgeBases.slice(startIndex, endIndex); + }, [knowledgeBases, currentPage, pageSize]); // 构建团队筛选选项 const teamFilterOptions = useMemo(() => { const options = [ { value: 'all', label: '全部' }, ]; - + // 添加租户选项 if (tenantList && tenantList.length > 0) { tenantList.forEach(tenant => { @@ -156,7 +140,7 @@ const KnowledgeBaseList: React.FC = () => { }); }); } - + return options; }, [tenantList]); @@ -192,13 +176,17 @@ const KnowledgeBaseList: React.FC = () => { ), }} /> - + 团队筛选