马一丁

Add automatic refresh functionality to GraphRAG

@@ -1858,6 +1858,9 @@ @@ -1858,6 +1858,9 @@
1858 let graphPanelTaskId = null; 1858 let graphPanelTaskId = null;
1859 let graphPanelState = 'idle'; 1859 let graphPanelState = 'idle';
1860 let graphPanelLoading = false; 1860 let graphPanelLoading = false;
  1861 + let graphPanelPollingTimer = null;
  1862 + let graphPanelPollingTaskId = null;
  1863 + const GRAPH_PANEL_POLL_INTERVAL = 4000;
1861 let configAutoRefreshTimer = null; 1864 let configAutoRefreshTimer = null;
1862 let systemStarted = false; 1865 let systemStarted = false;
1863 let systemStarting = false; 1866 let systemStarting = false;
@@ -5156,6 +5159,8 @@ function getConsoleContainer() { @@ -5156,6 +5159,8 @@ function getConsoleContainer() {
5156 const target = graphPanelTaskId || (lastCompletedReportTask ? lastCompletedReportTask.task_id : null); 5159 const target = graphPanelTaskId || (lastCompletedReportTask ? lastCompletedReportTask.task_id : null);
5157 const url = target ? `/graph-viewer/${target}` : '/graph-viewer'; 5160 const url = target ? `/graph-viewer/${target}` : '/graph-viewer';
5158 window.open(url, '_blank'); 5161 window.open(url, '_blank');
  5162 + // 用户手动查看时也可尝试拉取最新数据
  5163 + refreshGraphPanel(target || graphPanelTaskId, true);
5159 }); 5164 });
5160 } 5165 }
5161 5166
@@ -5224,6 +5229,9 @@ function getConsoleContainer() { @@ -5224,6 +5229,9 @@ function getConsoleContainer() {
5224 if (message) { 5229 if (message) {
5225 setGraphPanelPlaceholder(message, state === 'error' ? 'error' : ''); 5230 setGraphPanelPlaceholder(message, state === 'error' ? 'error' : '');
5226 } 5231 }
  5232 + if (state === 'ready' || state === 'error') {
  5233 + stopGraphPanelPolling();
  5234 + }
5227 } 5235 }
5228 5236
5229 function setGraphPanelPlaceholder(message, type = '') { 5237 function setGraphPanelPlaceholder(message, type = '') {
@@ -5421,6 +5429,25 @@ function getConsoleContainer() { @@ -5421,6 +5429,25 @@ function getConsoleContainer() {
5421 hideGraphDetail(); 5429 hideGraphDetail();
5422 } 5430 }
5423 5431
  5432 + function startGraphPanelPolling(taskId) {
  5433 + stopGraphPanelPolling();
  5434 + graphPanelPollingTaskId = taskId || graphPanelTaskId || (lastCompletedReportTask ? lastCompletedReportTask.task_id : null);
  5435 + if (!graphPanelPollingTaskId) {
  5436 + return;
  5437 + }
  5438 + const poll = () => refreshGraphPanel(graphPanelPollingTaskId, true);
  5439 + poll();
  5440 + graphPanelPollingTimer = setInterval(poll, GRAPH_PANEL_POLL_INTERVAL);
  5441 + }
  5442 +
  5443 + function stopGraphPanelPolling() {
  5444 + if (graphPanelPollingTimer) {
  5445 + clearInterval(graphPanelPollingTimer);
  5446 + graphPanelPollingTimer = null;
  5447 + }
  5448 + graphPanelPollingTaskId = null;
  5449 + }
  5450 +
5424 async function fetchGraphData(taskId = null) { 5451 async function fetchGraphData(taskId = null) {
5425 const url = taskId ? `/api/graph/${taskId}` : '/api/graph/latest'; 5452 const url = taskId ? `/api/graph/${taskId}` : '/api/graph/latest';
5426 try { 5453 try {
@@ -5493,6 +5520,7 @@ function getConsoleContainer() { @@ -5493,6 +5520,7 @@ function getConsoleContainer() {
5493 updateGraphStats({ nodes: [], edges: [] }); 5520 updateGraphStats({ nodes: [], edges: [] });
5494 setGraphPanelState('loading', '报告生成中,知识图谱生成后自动刷新'); 5521 setGraphPanelState('loading', '报告生成中,知识图谱生成后自动刷新');
5495 setGraphPanelPlaceholder('正在生成知识图谱...'); 5522 setGraphPanelPlaceholder('正在生成知识图谱...');
  5523 + startGraphPanelPolling(graphPanelTaskId);
5496 }); 5524 });
5497 } 5525 }
5498 5526
@@ -5927,6 +5955,7 @@ function getConsoleContainer() { @@ -5927,6 +5955,7 @@ function getConsoleContainer() {
5927 updateTaskProgressStatus(null, 'error', '启动失败: ' + data.error); 5955 updateTaskProgressStatus(null, 'error', '启动失败: ' + data.error);
5928 // 重置标志允许重新尝试 5956 // 重置标志允许重新尝试
5929 autoGenerateTriggered = false; 5957 autoGenerateTriggered = false;
  5958 + stopGraphPanelPolling();
5930 reportTaskId = null; 5959 reportTaskId = null;
5931 setGenerateButtonState(false); 5960 setGenerateButtonState(false);
5932 appendReportStreamLine('任务启动失败: ' + (data.error || '未知错误'), 'error'); 5961 appendReportStreamLine('任务启动失败: ' + (data.error || '未知错误'), 'error');
@@ -5939,6 +5968,7 @@ function getConsoleContainer() { @@ -5939,6 +5968,7 @@ function getConsoleContainer() {
5939 updateTaskProgressStatus(null, 'error', '生成报告失败: ' + error.message); 5968 updateTaskProgressStatus(null, 'error', '生成报告失败: ' + error.message);
5940 // 重置标志允许重新尝试 5969 // 重置标志允许重新尝试
5941 autoGenerateTriggered = false; 5970 autoGenerateTriggered = false;
  5971 + stopGraphPanelPolling();
5942 reportTaskId = null; 5972 reportTaskId = null;
5943 setGenerateButtonState(false); 5973 setGenerateButtonState(false);
5944 appendReportStreamLine('任务启动阶段异常: ' + error.message, 'error'); 5974 appendReportStreamLine('任务启动阶段异常: ' + error.message, 'error');
@@ -5985,6 +6015,7 @@ function getConsoleContainer() { @@ -5985,6 +6015,7 @@ function getConsoleContainer() {
5985 showMessage('报告生成完成!', 'success'); 6015 showMessage('报告生成完成!', 'success');
5986 graphPanelTaskId = data.task.task_id; 6016 graphPanelTaskId = data.task.task_id;
5987 refreshGraphPanel(data.task.task_id, true); 6017 refreshGraphPanel(data.task.task_id, true);
  6018 + stopGraphPanelPolling();
5988 6019
5989 // 自动显示报告 6020 // 自动显示报告
5990 viewReport(taskId); 6021 viewReport(taskId);
@@ -5997,6 +6028,7 @@ function getConsoleContainer() { @@ -5997,6 +6028,7 @@ function getConsoleContainer() {
5997 } else if (data.task.status === 'error') { 6028 } else if (data.task.status === 'error') {
5998 stopProgressPolling(); 6029 stopProgressPolling();
5999 showMessage('报告生成失败: ' + data.task.error_message, 'error'); 6030 showMessage('报告生成失败: ' + data.task.error_message, 'error');
  6031 + stopGraphPanelPolling();
6000 6032
6001 // 重置自动生成标志,允许重新尝试 6033 // 重置自动生成标志,允许重新尝试
6002 autoGenerateTriggered = false; 6034 autoGenerateTriggered = false;
@@ -6356,6 +6388,7 @@ function getConsoleContainer() { @@ -6356,6 +6388,7 @@ function getConsoleContainer() {
6356 case 'completed': 6388 case 'completed':
6357 appendReportStreamLine(payload.message || '任务完成', 'success'); 6389 appendReportStreamLine(payload.message || '任务完成', 'success');
6358 stopProgressPolling(); 6390 stopProgressPolling();
  6391 + stopGraphPanelPolling();
6359 6392
6360 // 【修复】任务完成前强制刷新最后一次日志,确保所有日志都被读取 6393 // 【修复】任务完成前强制刷新最后一次日志,确保所有日志都被读取
6361 if (reportLogManager && reportLogManager.isRunning) { 6394 if (reportLogManager && reportLogManager.isRunning) {
@@ -6383,6 +6416,7 @@ function getConsoleContainer() { @@ -6383,6 +6416,7 @@ function getConsoleContainer() {
6383 case 'cancelled': 6416 case 'cancelled':
6384 appendReportStreamLine(payload.message || '任务已取消', 'warn'); 6417 appendReportStreamLine(payload.message || '任务已取消', 'warn');
6385 stopProgressPolling(); 6418 stopProgressPolling();
  6419 + stopGraphPanelPolling();
6386 safeCloseReportStream(); 6420 safeCloseReportStream();
6387 updateReportStreamStatus('idle'); 6421 updateReportStreamStatus('idle');
6388 reportTaskId = null; 6422 reportTaskId = null;
@@ -6391,6 +6425,7 @@ function getConsoleContainer() { @@ -6391,6 +6425,7 @@ function getConsoleContainer() {
6391 case 'error': 6425 case 'error':
6392 appendReportStreamLine(payload.message || '任务失败', 'error', { badge: 'ERROR' }); 6426 appendReportStreamLine(payload.message || '任务失败', 'error', { badge: 'ERROR' });
6393 stopProgressPolling(); 6427 stopProgressPolling();
  6428 + stopGraphPanelPolling();
6394 safeCloseReportStream(); 6429 safeCloseReportStream();
6395 updateReportStreamStatus('error'); 6430 updateReportStreamStatus('error');
6396 reportTaskId = null; 6431 reportTaskId = null;