From 0c73c40e8ad74fc8009654397e9839c41ca9e310 Mon Sep 17 00:00:00 2001 From: haoslm <6083297@qq.com> Date: Tue, 21 Jul 2026 14:13:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=89=8D=E7=AB=AF=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=8A=A5=E8=A1=A8=E6=97=B6=E7=9A=84=E7=BB=86=E8=8A=82?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/static/js/report.js | 158 +++++++++++++++++++++++++++++++++++++ templates/index.html | 4 +- 2 files changed, 160 insertions(+), 2 deletions(-) diff --git a/public/static/js/report.js b/public/static/js/report.js index bd8ece0..4f16101 100644 --- a/public/static/js/report.js +++ b/public/static/js/report.js @@ -12,6 +12,8 @@ async function loadGenerateConfigs() { ${c.config_name} `).join(''); + + initGenerateState(); } } catch (error) { console.error('加载配置失败:', error); @@ -94,8 +96,129 @@ function formatDateDisplay(dateStr) { return String(dateStr); } +let isGenerating = false; +let generatePollTimer = null; + +// 保存生成状态到 localStorage +function saveGenerateState(configIds, startTime) { + const state = { + configIds: configIds, + startTime: startTime + }; + localStorage.setItem('report_generate_state', JSON.stringify(state)); +} + +// 从 localStorage 读取生成状态 +function getGenerateState() { + const stateStr = localStorage.getItem('report_generate_state'); + if (!stateStr) return null; + try { + return JSON.parse(stateStr); + } catch (e) { + return null; + } +} + +// 清除生成状态 +function clearGenerateState() { + localStorage.removeItem('report_generate_state'); +} + +// 检查生成是否完成 +async function checkGenerateComplete() { + const state = getGenerateState(); + if (!state) { + stopGeneratePolling(); + setGenerateControlsDisabled(false); + isGenerating = false; + return; + } + + const { configIds, startTime } = state; + + try { + const response = await fetch('/api/report/history?page=1&page_size=50'); + const result = await response.json(); + + if (result.success && result.data && result.data.list) { + const historyList = result.data.list; + let allDone = true; + + for (const configId of configIds) { + const configHistory = historyList.filter(h => h.config_id === configId); + if (configHistory.length === 0) { + allDone = false; + break; + } + const latest = configHistory[0]; + const latestTime = new Date(latest.start_time).getTime(); + if (latestTime < startTime) { + allDone = false; + break; + } + } + + if (allDone) { + stopGeneratePolling(); + clearGenerateState(); + setGenerateControlsDisabled(false); + isGenerating = false; + + const resultDiv = document.getElementById('generate-result'); + if (resultDiv && !resultDiv.innerHTML.includes('生成完成')) { + resultDiv.innerHTML = '
检测到报表已生成完成,请在历史记录中查看。
'; + } + } + } + } catch (e) { + console.error('检查生成状态失败:', e); + } +} + +// 开始轮询 +function startGeneratePolling() { + stopGeneratePolling(); + generatePollTimer = setInterval(checkGenerateComplete, 3000); +} + +// 停止轮询 +function stopGeneratePolling() { + if (generatePollTimer) { + clearInterval(generatePollTimer); + generatePollTimer = null; + } +} + +// 页面加载时检查生成状态 +function initGenerateState() { + const state = getGenerateState(); + if (state) { + const { startTime } = state; + const now = Date.now(); + const elapsed = now - startTime; + + if (elapsed > 30 * 60 * 1000) { + clearGenerateState(); + return; + } + + isGenerating = true; + setGenerateControlsDisabled(true); + startGeneratePolling(); + + const resultDiv = document.getElementById('generate-result'); + if (resultDiv) { + resultDiv.innerHTML = '
检测到有正在生成的报表,请稍候...
'; + } + } +} + // 生成日报(支持多选) async function generateReport() { + if (isGenerating) { + return; + } + const checkboxes = document.querySelectorAll('.config-checkbox:checked'); const startTime = document.getElementById('start-time').value; const endTime = document.getElementById('end-time').value; @@ -110,6 +233,14 @@ async function generateReport() { return; } + isGenerating = true; + setGenerateControlsDisabled(true); + + const configIds = Array.from(checkboxes).map(cb => parseInt(cb.value)); + const generateStartTime = Date.now(); + saveGenerateState(configIds, generateStartTime); + startGeneratePolling(); + const resultDiv = document.getElementById('generate-result'); resultDiv.innerHTML = '
正在批量生成日报,请稍候...
'; @@ -168,5 +299,32 @@ async function generateReport() { html += ''; resultDiv.innerHTML = html; + + isGenerating = false; + setGenerateControlsDisabled(false); + clearGenerateState(); + stopGeneratePolling(); +} + +// 设置生成相关控件的禁用状态 +function setGenerateControlsDisabled(disabled) { + const generateBtn = document.getElementById('generate-btn'); + if (generateBtn) { + generateBtn.disabled = disabled; + generateBtn.style.opacity = disabled ? '0.6' : '1'; + generateBtn.style.cursor = disabled ? 'not-allowed' : 'pointer'; + } + + document.querySelectorAll('.config-checkbox').forEach(cb => { + cb.disabled = disabled; + }); + + document.getElementById('start-time').disabled = disabled; + document.getElementById('end-time').disabled = disabled; + + document.querySelectorAll('[onclick^="setPresetTime"]').forEach(btn => { + btn.style.opacity = disabled ? '0.6' : '1'; + btn.style.pointerEvents = disabled ? 'none' : 'auto'; + }); } diff --git a/templates/index.html b/templates/index.html index 07f1638..e6c62e6 100644 --- a/templates/index.html +++ b/templates/index.html @@ -82,7 +82,7 @@ - +
@@ -372,7 +372,7 @@ - +