feat(knowledge): add overview page for knowledge base logs

- Implement new overview page to display file and dataset processing logs
This commit is contained in:
2025-11-04 15:32:55 +08:00
parent 74c4f798a5
commit 37dcab1597
12 changed files with 397 additions and 8 deletions

View File

@@ -1,7 +1,7 @@
import { useState, useEffect, useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import knowledgeService from '@/services/knowledge_service';
import type { IKnowledge, IKnowledgeGraph, IKnowledgeResult } from '@/interfaces/database/knowledge';
import type { IKnowledge, IKnowledgeGraph, IKnowledgeResult, IOverviewTital, IFileLogList } from '@/interfaces/database/knowledge';
import type { IFetchKnowledgeListRequestBody, IFetchKnowledgeListRequestParams } from '@/interfaces/request/knowledge';
import logger from '@/utils/logger';
@@ -477,3 +477,161 @@ export const useKnowledgeBatchOperations = () => {
};
};
/* ============================================================================
* useKnowledgeOverview
* ============================================================================ */
const LOGS_TABS = {
FILE_LOGS: 'fileLogs',
DATASET_LOGS: 'datasetLogs',
} as const
type LogTabs = typeof LOGS_TABS[keyof typeof LOGS_TABS]
/**
* 知识库详情页 - 概览数据获取Hook
*/
export interface UseKnowledgeOverviewReturn {
overview: IOverviewTital | null;
fileLogs: IFileLogList | null;
datasetLogs: IFileLogList | null;
loading: boolean;
error: string | null;
currentPage: number;
pageSize: number;
activeTab: LogTabs;
keywords: string;
setCurrentPage: (page: number) => void;
setPageSize: (size: number) => void;
setActiveTab: (tab: LogTabs) => void;
setKeywords: (keywords: string) => void;
refresh: () => Promise<void>;
}
export const useKnowledgeOverview = (kb_id: string): UseKnowledgeOverviewReturn => {
const { t } = useTranslation();
const [overview, setOverview] = useState<IOverviewTital | null>(null);
const [fileLogs, setFileLogs] = useState<IFileLogList | null>(null);
const [datasetLogs, setDatasetLogs] = useState<IFileLogList | null>(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [currentPage, setCurrentPage] = useState(1);
const [pageSize, setPageSize] = useState(20);
const [activeTab, setActiveTab] = useState<LogTabs>(LOGS_TABS.FILE_LOGS);
const [keywords, setKeywordsState] = useState('');
const fetchOverviewTital = useCallback(async () => {
if (!kb_id) return;
try {
setLoading(true);
setError(null);
const response = await knowledgeService.getKnowledgeBasicInfo({ kb_id });
if (response.data.code === 0) {
setOverview(response.data.data);
} else {
throw new Error(response.data.message || t('knowledgeHooks.fetchOverviewFailed'));
}
} catch (err: any) {
const errorMessage = err.response?.data?.message || err.message || t('knowledgeHooks.fetchOverviewFailed');
setError(errorMessage);
console.error('Failed to fetch overview tital:', err);
} finally {
setLoading(false);
}
}, [kb_id]);
const fetchPipelineLogs = useCallback(async () => {
if (!kb_id) return;
try {
setLoading(true);
setError(null);
const response = await knowledgeService.getDataPipelineLogs({
kb_id,
page: currentPage,
page_size: pageSize,
keywords,
});
if (response.data.code === 0) {
setFileLogs(response.data.data as IFileLogList);
} else {
throw new Error(response.data.message);
}
} catch (err: any) {
const errorMessage = err.response?.data?.message || err.message;
setError(errorMessage);
console.error('Failed to fetch data pipeline logs:', err);
} finally {
setLoading(false);
}
}, [kb_id, currentPage, pageSize, keywords]);
const fetchPipelineDatasetLogs = useCallback(async () => {
if (!kb_id) return;
try {
setLoading(true);
setError(null);
const response = await knowledgeService.getPipelineDatasetLogs({
kb_id,
page: currentPage,
page_size: pageSize,
keywords,
});
if (response.data.code === 0) {
setDatasetLogs(response.data.data as IFileLogList);
} else {
throw new Error(response.data.message);
}
} catch (err: any) {
const errorMessage = err.response?.data?.message || err.message;
setError(errorMessage);
console.error('Failed to fetch pipeline dataset logs:', err);
} finally {
setLoading(false);
}
}, [kb_id, currentPage, pageSize, keywords]);
useEffect(() => {
fetchOverviewTital();
}, [fetchOverviewTital]);
useEffect(() => {
if (activeTab === LOGS_TABS.FILE_LOGS) {
fetchPipelineLogs();
} else {
fetchPipelineDatasetLogs();
}
}, [activeTab, fetchPipelineLogs, fetchPipelineDatasetLogs]);
// 设置关键词并重置到第一页
const setKeywords = useCallback((kw: string) => {
setKeywordsState(kw);
setCurrentPage(1);
}, []);
const refresh = useCallback(async () => {
await Promise.all([
fetchOverviewTital(),
fetchPipelineLogs(),
fetchPipelineDatasetLogs(),
]);
}, [fetchOverviewTital, fetchPipelineLogs, fetchPipelineDatasetLogs]);
return {
overview,
fileLogs,
datasetLogs,
loading,
error,
currentPage,
pageSize,
activeTab,
keywords,
setCurrentPage,
setPageSize,
setActiveTab,
setKeywords,
refresh,
};
};