优化项目整合内容

This commit is contained in:
2025-08-05 20:11:28 +08:00
parent 4a0800a776
commit 867bf67b16

View File

@@ -3439,6 +3439,11 @@ function displayModalGroupedQueryLogs(groupedLogs) {
return; return;
} }
// 获取当前的过滤器状态,如果复选框不存在则默认显示所有
const showInfo = document.getElementById('modal-log-level-info')?.checked ?? true;
const showWarning = document.getElementById('modal-log-level-warning')?.checked ?? true;
const showError = document.getElementById('modal-log-level-error')?.checked ?? true;
let html = ''; let html = '';
// 为每个批次生成折叠面板 // 为每个批次生成折叠面板
@@ -3447,7 +3452,19 @@ function displayModalGroupedQueryLogs(groupedLogs) {
const isExpanded = index === groupedLogs.length - 1; // 默认展开最新批次 const isExpanded = index === groupedLogs.length - 1; // 默认展开最新批次
const collapseId = `modal-batch-${batchId}`; const collapseId = `modal-batch-${batchId}`;
// 统计批次信息 // 过滤日志
const filteredLogs = logs.filter(log => {
return (log.level === 'INFO' && showInfo) ||
(log.level === 'WARNING' && showWarning) ||
(log.level === 'ERROR' && showError);
});
// 如果过滤后没有日志,跳过这个批次
if (filteredLogs.length === 0) {
return;
}
// 统计批次信息(基于原始日志)
const logCounts = { const logCounts = {
INFO: logs.filter(log => log.level === 'INFO').length, INFO: logs.filter(log => log.level === 'INFO').length,
WARNING: logs.filter(log => log.level === 'WARNING').length, WARNING: logs.filter(log => log.level === 'WARNING').length,
@@ -3455,6 +3472,7 @@ function displayModalGroupedQueryLogs(groupedLogs) {
}; };
const totalLogs = logs.length; const totalLogs = logs.length;
const filteredCount = filteredLogs.length;
const firstLog = logs[0]; const firstLog = logs[0];
const lastLog = logs[logs.length - 1]; const lastLog = logs[logs.length - 1];
const duration = firstLog && lastLog ? calculateDuration(firstLog.timestamp, lastLog.timestamp) : '0秒'; const duration = firstLog && lastLog ? calculateDuration(firstLog.timestamp, lastLog.timestamp) : '0秒';
@@ -3466,7 +3484,7 @@ function displayModalGroupedQueryLogs(groupedLogs) {
const batchIcon = hasErrors ? 'fas fa-times-circle' : hasWarnings ? 'fas fa-exclamation-triangle' : 'fas fa-check-circle'; const batchIcon = hasErrors ? 'fas fa-times-circle' : hasWarnings ? 'fas fa-exclamation-triangle' : 'fas fa-check-circle';
// 提取查询类型 // 提取查询类型
const batchTypeMatch = firstLog?.message.match(/开始(\w+)查询批次/); const batchTypeMatch = firstLog?.message.match(/开始(\w+)查询批次/) || firstLog?.message.match(/🚀 开始执行(\w+)数据比较/);
const batchType = batchTypeMatch ? batchTypeMatch[1] : '未知'; const batchType = batchTypeMatch ? batchTypeMatch[1] : '未知';
// 提取并格式化查询日期 // 提取并格式化查询日期
@@ -3479,13 +3497,6 @@ function displayModalGroupedQueryLogs(groupedLogs) {
second: '2-digit' second: '2-digit'
}) : '未知时间'; }) : '未知时间';
// 简化的日期显示(仅显示日期部分)
const queryDateShort = firstLog ? new Date(firstLog.timestamp).toLocaleDateString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
}) : '未知';
// 检查是否有关联的历史记录ID // 检查是否有关联的历史记录ID
const historyId = firstLog?.history_id; const historyId = firstLog?.history_id;
const historyBadge = historyId ? const historyBadge = historyId ?
@@ -3505,7 +3516,7 @@ function displayModalGroupedQueryLogs(groupedLogs) {
<div class="d-flex align-items-center mb-1"> <div class="d-flex align-items-center mb-1">
<i class="${batchIcon} text-${batchStatus} me-2"></i> <i class="${batchIcon} text-${batchStatus} me-2"></i>
<strong>${batchType}查询批次 ${batchId}</strong> <strong>${batchType}查询批次 ${batchId}</strong>
<span class="badge bg-primary ms-2">${totalLogs}条日志</span> <span class="badge bg-primary ms-2">${filteredCount}/${totalLogs}条日志</span>
${historyBadge} ${historyBadge}
</div> </div>
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@@ -3533,41 +3544,31 @@ function displayModalGroupedQueryLogs(groupedLogs) {
<div class="log-entries" style="max-height: 400px; overflow-y: auto;"> <div class="log-entries" style="max-height: 400px; overflow-y: auto;">
`; `;
// 显示该批次的日志条目 // 显示过滤后的日志条目
logs.forEach(log => { filteredLogs.forEach(log => {
const showInfo = document.getElementById('modal-log-level-info').checked; const levelClass = log.level === 'ERROR' ? 'danger' :
const showWarning = document.getElementById('modal-log-level-warning').checked; log.level === 'WARNING' ? 'warning' : 'info';
const showError = document.getElementById('modal-log-level-error').checked; const levelIcon = log.level === 'ERROR' ? 'fas fa-times-circle' :
log.level === 'WARNING' ? 'fas fa-exclamation-triangle' : 'fas fa-info-circle';
const shouldShow = (log.level === 'INFO' && showInfo) || // 简化时间戳显示
(log.level === 'WARNING' && showWarning) || const timeOnly = log.timestamp ? (log.timestamp.split(' ')[1] || log.timestamp) : '未知时间';
(log.level === 'ERROR' && showError);
if (shouldShow) { html += `
const levelClass = log.level === 'ERROR' ? 'danger' : <div class="log-entry p-2 border-bottom" data-level="${log.level}">
log.level === 'WARNING' ? 'warning' : 'info'; <div class="d-flex align-items-start">
const levelIcon = log.level === 'ERROR' ? 'fas fa-times-circle' : <span class="badge bg-${levelClass} me-2" style="min-width: 60px;">
log.level === 'WARNING' ? 'fas fa-exclamation-triangle' : 'fas fa-info-circle'; <i class="${levelIcon}"></i> ${log.level}
</span>
// 简化时间戳显示 <small class="text-muted me-2 flex-shrink-0" style="min-width: 80px;">
const timeOnly = log.timestamp.split(' ')[1] || log.timestamp; ${timeOnly}
</small>
html += ` <div class="log-message flex-grow-1" style="word-wrap: break-word; white-space: pre-wrap;">
<div class="log-entry p-2 border-bottom"> ${formatLogMessage(log.message || '无消息内容')}
<div class="d-flex align-items-start">
<span class="badge bg-${levelClass} me-2">
<i class="${levelIcon}"></i> ${log.level}
</span>
<small class="text-muted me-2 flex-shrink-0" style="min-width: 80px;">
${timeOnly}
</small>
<div class="log-message flex-grow-1">
${formatLogMessage(log.message)}
</div>
</div> </div>
</div> </div>
`; </div>
} `;
}); });
html += ` html += `
@@ -3578,6 +3579,10 @@ function displayModalGroupedQueryLogs(groupedLogs) {
`; `;
}); });
if (html === '') {
html = '<div class="alert alert-warning">没有符合过滤条件的日志</div>';
}
container.innerHTML = html; container.innerHTML = html;
} }