优化前端生成报表时的细节内容
This commit is contained in:
@@ -12,6 +12,8 @@ async function loadGenerateConfigs() {
|
||||
<span>${c.config_name}</span>
|
||||
</label>
|
||||
`).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 = '<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() {
|
||||
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 = '<div class="alert alert-info">正在批量生成日报,请稍候...</div>';
|
||||
|
||||
@@ -168,5 +299,32 @@ async function generateReport() {
|
||||
|
||||
html += '</div>';
|
||||
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';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
</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>
|
||||
@@ -372,7 +372,7 @@
|
||||
<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/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/sum_data.js?v=2026071507"></script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user