feat: add exam score management
Some checks failed
CI 检查 / lint (pull_request) Has been cancelled
CI 检查 / typecheck (pull_request) Has been cancelled
CI 检查 / test (pull_request) Has been cancelled

This commit is contained in:
2026-07-21 16:04:17 +08:00
parent 37ef6f9dd7
commit cbc04fea4f
27 changed files with 1061 additions and 16 deletions

View File

@@ -81,10 +81,12 @@ interface EnrollmentRecord {
interface ExamScoreRecord {
id: number;
examId?: number;
exam?: { class?: { name?: string } };
examType: string;
examName?: string;
subject: string;
score: number;
score: number | null;
classAvg?: number;
rank?: number;
examDate?: string;
@@ -865,6 +867,7 @@ const ExamScoresTab: React.FC<
editor="select"
options={EXAM_TYPE_OPTIONS}
permission="student:edit"
disabled={!!r.examId}
required
onSave={(next) => saveCell(r, 'examType', next)}
>
@@ -879,6 +882,7 @@ const ExamScoresTab: React.FC<
<EditableCell
value={v}
permission="student:edit"
disabled={!!r.examId}
onSave={(next) => saveCell(r, 'examName', next)}
>
{v || '-'}
@@ -893,6 +897,7 @@ const ExamScoresTab: React.FC<
value={v}
required
permission="student:edit"
disabled={!!r.examId}
onSave={(next) => saveCell(r, 'subject', next)}
>
{v}
@@ -902,16 +907,16 @@ const ExamScoresTab: React.FC<
{
title: '成绩',
dataIndex: 'score',
render: (v: number, r) => (
render: (v: number | null, r) => (
<EditableCell
value={v}
value={v ?? undefined}
editor="number"
min={0}
required
permission="student:edit"
disabled={!!r.examId}
onSave={(next) => saveCell(r, 'score', next)}
>
{v}
{v ?? '-'}
</EditableCell>
),
},
@@ -924,6 +929,7 @@ const ExamScoresTab: React.FC<
editor="number"
min={0}
permission="student:edit"
disabled={!!r.examId}
onSave={(next) => saveCell(r, 'classAvg', next)}
>
{v !== undefined ? v : '-'}
@@ -939,6 +945,7 @@ const ExamScoresTab: React.FC<
editor="number"
min={1}
permission="student:edit"
disabled={!!r.examId}
onSave={(next) => saveCell(r, 'rank', next)}
>
{v !== undefined ? v : '-'}
@@ -953,6 +960,7 @@ const ExamScoresTab: React.FC<
value={v}
editor="date"
permission="student:edit"
disabled={!!r.examId}
onSave={(next) => saveCell(r, 'examDate', next)}
>
{v || '-'}
@@ -971,9 +979,11 @@ const ExamScoresTab: React.FC<
label: formatEnrollmentDisplayName(item),
}))}
permission="student:edit"
disabled={!!r.examId}
onSave={(next) => saveCell(r, 'enrollmentId', next)}
>
{(() => {
if (r.examId) return r.exam?.class?.name || '-';
if (v === undefined) return '-';
const enr = enrollments.find((e) => e.id === v);
return enr ? formatEnrollmentDisplayName(enr) : String(v);