This commit is contained in:
2026-07-25 11:46:39 +08:00 Unverified
parent 533ff6b9f6
commit fdca6a3edf
8 changed files with 603 additions and 25 deletions
@@ -499,7 +499,8 @@ public sealed class CourseSelectionsController(
round.AcademicTermId,
[task.Id],
cancellationToken);
if (candidateEntries.Count == 0)
if (CourseSelectionRules.RequiresPublishedSchedule(task.SchedulingMode) &&
candidateEntries.Count == 0)
return ConflictProblem("该教学班尚未发布课表,暂时不能办理代选。");
foreach (var student in students)
@@ -804,7 +805,7 @@ public sealed class CourseSelectionsController(
round.AcademicTermId,
[task.Id],
cancellationToken);
if (task.SchedulingMode == TeachingTaskSchedulingMode.Standard &&
if (CourseSelectionRules.RequiresPublishedSchedule(task.SchedulingMode) &&
candidateEntries.Count == 0)
return ConflictProblem("该教学班尚未发布课表,暂时不能选课。");
var selectedTaskIds = await db.CourseEnrollments
@@ -95,6 +95,47 @@ public sealed class TeachingTasksController(
return Ok(new PagedResult<object>(items, total, page, pageSize));
}
[HttpGet("options")]
public async Task<ActionResult> GetOptions(
Guid academicTermId,
TeachingTaskStatus status = TeachingTaskStatus.Published,
CancellationToken cancellationToken = default)
{
var items = await ScopedTasks()
.AsNoTracking()
.Where(x =>
x.AcademicTermId == academicTermId &&
x.Status == status)
.OrderBy(x => x.Course!.Code)
.ThenBy(x => x.TaskNumber)
.Select(x => new
{
x.Id,
x.TaskNumber,
x.Name,
x.AcademicTermId,
x.CourseId,
CourseCode = x.Course!.Code,
CourseName = x.Course.Name,
CourseNature = x.Course.Nature,
CollegeId = x.Course.CollegeId,
CollegeName = x.Course.College!.Name,
x.Capacity,
x.StartWeek,
x.EndWeek,
x.WeeklyHours,
x.SchedulingMode,
TeacherNames = x.Teachers
.OrderByDescending(item => item.IsPrimary)
.Select(item => item.Teacher!.Name),
ClassNames = x.Classes
.OrderBy(item => item.AdministrativeClass!.Code)
.Select(item => item.AdministrativeClass!.Name)
})
.ToListAsync(cancellationToken);
return Ok(items);
}
[HttpGet("{id:guid}")]
public async Task<ActionResult> GetOne(Guid id, CancellationToken cancellationToken)
{
@@ -17,6 +17,9 @@ public static class CourseSelectionRules
public static bool SupportsProxyEnrollment(CourseNature nature) =>
nature == CourseNature.GeneralRequired;
public static bool RequiresPublishedSchedule(TeachingTaskSchedulingMode schedulingMode) =>
schedulingMode == TeachingTaskSchedulingMode.Standard;
public static bool HasScheduleConflict(
IEnumerable<ScheduleEntry> candidateEntries,
IEnumerable<ScheduleEntry> selectedEntries) =>