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:
@@ -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,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user