feat: keep undergraduate exams independent of course terms

This commit is contained in:
Codex
2026-10-14 23:19:11 +08:00
parent 48367b8273
commit 141436f545
9 changed files with 419 additions and 99 deletions
+30 -12
View File
@@ -3,29 +3,47 @@ import 'school_term.dart';
import 'exam_schedule.dart';
enum UndergraduateExamType {
finalExam(1,'期末考试'), midterm(2,'期中考试'), makeup(3,'补考/缓考');
finalExam(1, '期末考试'),
midterm(2, '期中考试'),
makeup(3, '补考/缓考');
const UndergraduateExamType(this.id, this.label);
final int id;
final String label;
static UndergraduateExamType fromId(int id) => values.firstWhere((t)=>t.id==id,
orElse:()=>throw const FormatException('考试类型无效'));
static UndergraduateExamType fromId(int id) => values.firstWhere(
(t) => t.id == id,
orElse: () => throw const FormatException('考试类型无效'),
);
}
class UndergraduateExamQuery {
UndergraduateExamQuery({required this.term, required Set<UndergraduateExamType> types})
: types=Set.unmodifiable(types) {
if(term.school != SupportedSchool.uestcUndergraduate || types.isEmpty) throw ArgumentError('请选择本科学期和考试类型');
UndergraduateExamQuery({
required this.term,
required Set<UndergraduateExamType> types,
}) : types = Set.unmodifiable(types) {
if (term.school != SupportedSchool.uestcUndergraduate || types.isEmpty)
throw ArgumentError('请选择本科学期和考试类型');
}
final SchoolTerm term;
final Set<UndergraduateExamType> types;
List<UndergraduateExamType> get orderedTypes => UndergraduateExamType.values.where(types.contains).toList();
List<UndergraduateExamType> get orderedTypes =>
UndergraduateExamType.values.where(types.contains).toList();
Uri uriFor(UndergraduateExamType type) {
if(!types.contains(type)) throw ArgumentError('考试类型不在查询选项中');
return Uri.https('eams.uestc.edu.cn','/eams/stdExamTable!examTable.action',{'semester.id':'${term.id}','examType.id':'${type.id}'});
if (!types.contains(type)) throw ArgumentError('考试类型不在查询选项中');
return Uri.https(
'eams.uestc.edu.cn',
'/eams/stdExamTable!examTable.action',
{'semester.id': '${term.id}', 'examType.id': '${type.id}'},
);
}
static UndergraduateExamQuery? fromSchedule(ExamSchedule? schedule) {
if(schedule?.school != SupportedSchool.uestcUndergraduate) return null;
return UndergraduateExamQuery(term:SchoolTerm(int.parse(schedule!.termId),school:schedule.school),
types:schedule.requestedExamTypes.map(UndergraduateExamType.fromId).toSet());
if (schedule?.school != SupportedSchool.uestcUndergraduate) return null;
return UndergraduateExamQuery(
term: SchoolTerm(int.parse(schedule!.termId), school: schedule.school),
types: schedule.requestedExamTypes
.map(UndergraduateExamType.fromId)
.toSet(),
);
}
}