diff --git a/assets/app.js b/assets/app.js index 6acb325..4e1e497 100644 --- a/assets/app.js +++ b/assets/app.js @@ -236,13 +236,14 @@ } // 各面板计数文字按所选班级过滤(成绩明细 / 缺考名单) + // 缺考数与统计卡片保持一致:过滤后名单 − 过滤后提交(而非二次过滤后端 absent 数组) function renderHints() { const cls = $('#clsSel').value; const rowsForCls = cls ? state.rows.filter(r => (r.cls || '') === cls) : state.rows; const rosterForCls = cls ? (state.roster || []).filter(s => (s.cls || '') === cls) : (state.roster || []); - const absentForCls = cls ? state.absent.filter(a => (a.cls || '') === cls) : state.absent; + const absentForCls = Math.max(0, rosterForCls.length - rowsForCls.length); $('#tableHint').textContent = '共 ' + rowsForCls.length + ' 人已提交 · 名单 ' + rosterForCls.length + ' 人'; - $('#absentHint').textContent = absentForCls.length ? '共 ' + absentForCls.length + ' 人' : ''; + $('#absentHint').textContent = absentForCls ? '共 ' + absentForCls + ' 人' : ''; } function fmtDur(sec) { @@ -317,7 +318,11 @@ function renderAbsent() { const clsFilter = $('#clsSel').value; - const list = clsFilter ? state.absent.filter(a => (a.cls || '') === clsFilter) : state.absent; + // 与统计卡片保持一致:缺考 = 过滤后名单中未出现在提交记录里的学生(按 sid 匹配) + const rowsForCls = clsFilter ? state.rows.filter(r => (r.cls || '') === clsFilter) : state.rows; + const submittedSids = new Set(rowsForCls.map(r => r.sid).filter(Boolean)); + const rosterForCls = clsFilter ? (state.roster || []).filter(s => (s.cls || '') === clsFilter) : (state.roster || []); + const list = rosterForCls.filter(s => !submittedSids.has(s.sid)); const tb = $('#absentBody'); if (!list.length) { tb.innerHTML = '
请输入卷王系统连接信息,完成连接测试后登录。密码需每次输入,避免依赖一次配置直接查看数据。