Showing
1 changed file
with
35 additions
and
0 deletions
| @@ -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; |
-
Please register or login to post a comment