优化前端生成报表时的细节内容

This commit is contained in:
2026-07-21 14:13:29 +08:00
parent d2ba256889
commit 0c73c40e8a
2 changed files with 160 additions and 2 deletions

View File

@@ -12,6 +12,8 @@ async function loadGenerateConfigs() {
<span>${c.config_name}</span> <span>${c.config_name}</span>
</label> </label>
`).join(''); `).join('');
initGenerateState();
} }
} catch (error) { } catch (error) {
console.error('加载配置失败:', error); console.error('加载配置失败:', error);
@@ -94,8 +96,129 @@ function formatDateDisplay(dateStr) {
return String(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 = '<div class="alert alert-info">检测到报表已生成完成,请在历史记录中查看。</div>';
}
}
}
} 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 = '<div class="alert alert-info">检测到有正在生成的报表,请稍候...</div>';
}
}
}
// 生成日报(支持多选) // 生成日报(支持多选)
async function generateReport() { async function generateReport() {
if (isGenerating) {
return;
}
const checkboxes = document.querySelectorAll('.config-checkbox:checked'); const checkboxes = document.querySelectorAll('.config-checkbox:checked');
const startTime = document.getElementById('start-time').value; const startTime = document.getElementById('start-time').value;
const endTime = document.getElementById('end-time').value; const endTime = document.getElementById('end-time').value;
@@ -110,6 +233,14 @@ async function generateReport() {
return; 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'); const resultDiv = document.getElementById('generate-result');
resultDiv.innerHTML = '<div class="alert alert-info">正在批量生成日报,请稍候...</div>'; resultDiv.innerHTML = '<div class="alert alert-info">正在批量生成日报,请稍候...</div>';
@@ -168,5 +299,32 @@ async function generateReport() {
html += '</div>'; html += '</div>';
resultDiv.innerHTML = 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';
});
} }

View File

@@ -82,7 +82,7 @@
</div> </div>
</div> </div>
<button class="btn btn-success" onclick="generateReport()">生成日报</button> <button id="generate-btn" class="btn btn-success" onclick="generateReport()">生成日报</button>
<div id="generate-result" style="margin-top: 20px;"></div> <div id="generate-result" style="margin-top: 20px;"></div>
</div> </div>
@@ -372,7 +372,7 @@
<script src="/public/static/js/common.js?v=2026071507"></script> <script src="/public/static/js/common.js?v=2026071507"></script>
<script src="/public/static/js/config.js?v=2026071507"></script> <script src="/public/static/js/config.js?v=2026071507"></script>
<script src="/public/static/js/entity.js?v=2026071507"></script> <script src="/public/static/js/entity.js?v=2026071507"></script>
<script src="/public/static/js/report.js?v=2026071507"></script> <script src="/public/static/js/report.js?v=2026072102"></script>
<script src="/public/static/js/history.js?v=2026072103"></script> <script src="/public/static/js/history.js?v=2026072103"></script>
<script src="/public/static/js/sum_data.js?v=2026071507"></script> <script src="/public/static/js/sum_data.js?v=2026071507"></script>
</body> </body>