50 lines
1.6 KiB
Dart
50 lines
1.6 KiB
Dart
import 'school_identity.dart';
|
|
import 'school_term.dart';
|
|
import 'exam_schedule.dart';
|
|
|
|
enum UndergraduateExamType {
|
|
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('考试类型无效'),
|
|
);
|
|
}
|
|
|
|
class UndergraduateExamQuery {
|
|
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();
|
|
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}'},
|
|
);
|
|
}
|
|
|
|
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(),
|
|
);
|
|
}
|
|
}
|