修改选课页面课程表

This commit is contained in:
2026-08-09 16:43:35 +08:00 Unverified
parent 26a39322fd
commit f246378d5b
2 changed files with 86 additions and 1 deletions
@@ -1011,7 +1011,11 @@ public sealed class CourseSelectionsController(
x.TeachingTask!.Status == TeachingTaskStatus.Published &&
(x.IsOpenToAll ||
x.TeachingTask.Classes.Any(item =>
item.AdministrativeClassId == student.AdministrativeClassId)))
item.AdministrativeClassId == student.AdministrativeClassId) ||
x.Enrollments.Any(item =>
item.StudentId == student.Id &&
(item.Status == CourseEnrollmentStatus.Enrolled ||
item.Status == CourseEnrollmentStatus.Waitlisted))))
.OrderBy(x => x.TeachingTask!.Course!.Code)
.Select(x => new StudentOfferingDto(
x.Id,
@@ -205,6 +205,79 @@ public sealed class CourseSelectionsControllerTests
x.Grade == 2026));
}
[Fact]
public async Task Student_options_include_an_administrator_assigned_offering_outside_the_students_class_scope()
{
await using var connection = new SqliteConnection("Data Source=:memory:");
await connection.OpenAsync();
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseSqlite(connection)
.Options;
await using var db = new AppDbContext(options);
await db.Database.EnsureCreatedAsync();
var data = await SeedFullOfferingAsync(db);
var originalClass = await db.AdministrativeClasses.SingleAsync();
var otherClass = new AdministrativeClass
{
Code = "CS2026-02",
Name = "计科 2026-2 班",
MajorId = originalClass.MajorId,
Grade = 2026
};
var taskId = await db.CourseSelectionOfferings
.Where(x => x.Id == data.OfferingId)
.Select(x => x.TeachingTaskId)
.SingleAsync();
var task = await db.TeachingTasks
.Include(x => x.Classes)
.SingleAsync(x => x.Id == taskId);
task.Classes.Clear();
task.Classes.Add(new TeachingTaskClass { AdministrativeClassId = otherClass.Id });
task.SchedulingMode = TeachingTaskSchedulingMode.Standard;
var termId = await db.CourseSelectionRounds
.Where(x => x.Id == data.RoundId)
.Select(x => x.AcademicTermId)
.SingleAsync();
var plan = new SchedulePlan
{
AcademicTermId = termId,
Name = "正式课表",
Version = "V1",
Status = SchedulePlanStatus.Published,
PublishedAt = DateTime.UtcNow
};
db.AddRange(otherClass, plan);
await db.SaveChangesAsync();
db.ScheduleEntries.Add(new ScheduleEntry
{
SchedulePlanId = plan.Id,
TeachingTaskId = task.Id,
DayOfWeek = 1,
StartPeriod = 1,
PeriodCount = 2,
StartWeek = 1,
EndWeek = 16,
WeekPattern = WeekPattern.All
});
await db.SaveChangesAsync();
db.ChangeTracker.Clear();
var controller = new CourseSelectionsController(
db,
new StudentDataScope(data.EnrolledUserId));
var result = Assert.IsType<OkObjectResult>(await controller.GetStudentOptions(
data.RoundId,
CancellationToken.None));
var offerings = ReadProperty<IEnumerable<StudentOfferingDto>>(
result.Value, "Offerings");
var assignedOffering = Assert.Single(offerings);
Assert.Equal(data.OfferingId, assignedOffering.Id);
Assert.Equal(CourseEnrollmentStatus.Enrolled, assignedOffering.EnrollmentStatus);
Assert.Single(assignedOffering.Schedules);
}
private static async Task<SeededSelection> SeedFullOfferingAsync(AppDbContext db)
{
var college = new College { Code = "CS", Name = "计算机学院" };
@@ -358,6 +431,14 @@ public sealed class CourseSelectionsControllerTests
return Assert.IsType<int>(property.GetValue(value));
}
private static T ReadProperty<T>(object? value, string propertyName)
{
Assert.NotNull(value);
var property = value.GetType().GetProperty(propertyName);
Assert.NotNull(property);
return Assert.IsAssignableFrom<T>(property.GetValue(value));
}
private static Student CreateStudent(
string number,
string name,