已把选课的“年级划分”和限制规则补成完整闭环:

选课批次可指定多个适用年级;留空兼容原有“全部年级”。
新增可选的“最多课程门数”,与原有学分上限并行。
年级、门数限制统一作用于学生可见批次、自主选课、候补、管理员代选和自动递补。
普通候选名单遵守年级及行政班范围;强制选课可绕过业务限制,但仍严格遵守管理员学院权限。
管理页面会展示“2026 级 · 最多 6 门 · 最多 30 学分”,名单和候补列表也增加年级列。
新增 MySQL 迁移:[CourseSelectionGradeLimits.cs](E:/jiaowu/src/Jiaowu.Api/Infrastructure/Persistence/Migrations/MySql/20260726180000_CourseSelectionGradeLimits.cs)。
This commit is contained in:
2026-07-26 16:12:21 +08:00 Unverified
parent 56b13b3adb
commit f62cd21319
11 changed files with 4920 additions and 25 deletions
@@ -81,6 +81,31 @@ public sealed class CourseSelectionRulesTests
Assert.Equal(expected, CourseSelectionRules.SupportsProxyEnrollment(nature));
}
[Fact]
public void Empty_grade_scope_allows_all_students_and_configured_scope_is_enforced()
{
Assert.True(CourseSelectionRules.IsGradeEligible([], 2026));
Assert.True(CourseSelectionRules.IsGradeEligible([2025, 2026], 2026));
Assert.False(CourseSelectionRules.IsGradeEligible([2024, 2025], 2026));
}
[Theory]
[InlineData(null, 99, false)]
[InlineData(6, 5, false)]
[InlineData(6, 6, true)]
[InlineData(6, 7, true)]
public void Course_count_limit_is_optional_and_blocks_at_the_boundary(
int? maxCourseCount,
int selectedCourseCount,
bool expected)
{
Assert.Equal(
expected,
CourseSelectionRules.HasReachedCourseLimit(
maxCourseCount,
selectedCourseCount));
}
[Theory]
[InlineData(TeachingTaskSchedulingMode.Standard, true)]
[InlineData(TeachingTaskSchedulingMode.Flexible, false)]