current.isAfter(dayjs(), 'day')}
onChange={(value) => {
setAttendanceDate(value);
setScheduleId(undefined);
setPage(1);
}}
/>
: '当前日期没有排课'}
onChange={(value) => {
setScheduleId(value);
setPage(1);
}}
options={subjectScheduleOptions}
/>
} onClick={() => void loadRecords()}>
查询
班级考勤概览
{selectedClass}
{dateLabel} · 当前展示 {visibleStudents.length} 名学生 / {total} 条记录
生
生活老师
{lifeTeacherNames}
任
任课老师
{subjectTeacherNames}
{ADMIN_METRIC_META.map((metric) => {
const value =
metric.key === 'all'
? `${attendanceRate}%`
: metric.key === 'absent'
? summary.absent + summary.pending
: (summary[metric.key as keyof AttendanceSummary] ?? 0);
const meta = STATUS_META[metric.key] ?? { className: 'is-present' };
return (
);
})}
{alerts.length > 0 && (
{alerts.length} 名学生存在连续异常
建议优先核查最近 14 天的缺勤记录
`${item.studentName}:${item.type}${item.count}次`)
.join(';')}
>
)}
班级学生考勤
{metricFilter === 'all'
? `显示全部 ${visibleStudents.length} 名学生`
: `筛出 ${ADMIN_METRIC_META.find((item) => item.key === metricFilter)?.label || ''}相关 ${visibleStudents.length} 名学生`}
setStudentSearch(event.target.value)}
/>
} onClick={handleExport}>
导出
正常
请假
缺勤
仅显示当天已生成考勤的课程/时段,不再为无课时段补默认缺勤
{visibleStudents.length === 0 ? (
) : (
{visibleStudents.map((student) => (
))}
)}
rowKey="id"
columns={columns}
dataSource={records}
loading={loading}
scroll={{ x: 'max-content' }}
pagination={{
current: page,
pageSize,
total,
showSizeChanger: true,
showTotal: (value) => `共 ${value} 条历史记录`,
onChange: (nextPage, nextPageSize) => {
setPage(nextPage);
setPageSize(nextPageSize);
},
}}
locale={{
emptyText: (
),
}}
/>
setSelectedStudent(null)}
width={isMobile ? '100%' : 520}
title="学生考勤明细"
className="student-detail-drawer"
>
{selectedStudent && (
{selectedStudent.studentName.slice(0, 1)}
{selectedStudent.studentName}
{selectedStudent.className}
{selectedStudent.studentNo ? ` · 学号 ${selectedStudent.studentNo}` : ''}
{selectedStudent.rate}%
累计出勤率
{sortAttendanceRecords(selectedStudent.records).map((record) => {
const normal = record.status === 'present';
return (
{normal ? '100%' : '0%'}
{sessionMap[record.session] || record.session}
);
})}
当天打卡时间
{sortAttendanceRecords(selectedStudent.records).map((record) => (
{sessionMap[record.session] || record.session}
{record.punchTime ? dayjs(record.punchTime).format('HH:mm:ss') : '未记录'}
{canEdit && (
void updateAdminRecordStatus(record, String(value))}
/>
)}
))}
)}
setPeriodModalOpen(false)}
footer={(_, { OkBtn, CancelBtn }) => (
<>
>
)}
>
{(fields, { add, remove }) => (
)}
);
};
export default AttendancePage;