2 处改动:

  1. ValidateRequestAsync — 当 classIds 为空时跳过行政班验证(选修课可不选班)
  2. ValidatePublishingTasksAsync — 移除了"发布前至少需要关联一个行政班"的强制校验,允许无行政班的教学任务直接发布
This commit is contained in:
2026-07-25 13:10:19 +08:00 Unverified
parent b015514115
commit a081273ac6
2 changed files with 12 additions and 16 deletions
@@ -614,12 +614,15 @@ public sealed class TeachingTasksController(
return ValidationProblem("授课教师必须已完成该课程申报并经学院审核通过。");
var classIds = request.ClassIds.Distinct().ToArray();
var classes = db.AdministrativeClasses.AsNoTracking()
.Where(x => classIds.Contains(x.Id));
if (collegeId.HasValue)
classes = classes.Where(x => x.Major!.CollegeId == collegeId.Value);
if (await classes.CountAsync(cancellationToken) != classIds.Length)
return ValidationProblem("存在无效或不在当前数据范围内的行政班。");
if (classIds.Length > 0)
{
var classes = db.AdministrativeClasses.AsNoTracking()
.Where(x => classIds.Contains(x.Id));
if (collegeId.HasValue)
classes = classes.Where(x => x.Major!.CollegeId == collegeId.Value);
if (await classes.CountAsync(cancellationToken) != classIds.Length)
return ValidationProblem("存在无效或不在当前数据范围内的行政班。");
}
return null;
}
@@ -661,13 +664,6 @@ public sealed class TeachingTasksController(
invalidPrimaryTeacher,
"发布前必须指定且只能指定一名主讲教师。");
var missingClass = tasks.FirstOrDefault(x => x.Classes.Count == 0);
if (missingClass is not null)
return PublishingProblem(
tasks,
missingClass,
"发布前至少需要关联一个行政班。");
var termIds = tasks.Select(x => x.AcademicTermId).Distinct().ToArray();
var courseIds = tasks.Select(x => x.CourseId).Distinct().ToArray();
var teacherIds = tasks
+3 -3
View File
@@ -597,7 +597,7 @@ onMounted(async () => {
<section class="task-summary">
<div><span>当前结果</span><b>{{ total }}</b><small>个教学班</small></div>
<p>{{ responsibilityText }} 发布时还会校验教师授课资格行政班容量和周次</p>
<p>{{ responsibilityText }} 发布时还会校验教师授课资格容量和周次选修课可不关联行政班</p>
</section>
<section class="data-card">
@@ -681,7 +681,7 @@ onMounted(async () => {
</el-table-column>
<el-table-column prop="termName" label="开课学期" min-width="180" />
<el-table-column label="授课教师" min-width="130"><template #default="{ row }">{{ row.teacherNames.join('、') || '未安排' }}</template></el-table-column>
<el-table-column label="行政班" min-width="150"><template #default="{ row }">{{ row.classNames.join('、') || '未关联' }}</template></el-table-column>
<el-table-column label="行政班" min-width="150"><template #default="{ row }">{{ row.classNames.join('、') || '开放选课' }}</template></el-table-column>
<el-table-column label="人数 / 容量" width="105"><template #default="{ row }">{{ row.studentCount }} / {{ row.capacity }}</template></el-table-column>
<el-table-column label="周次" width="105"><template #default="{ row }">{{ row.startWeek }}{{ row.endWeek }} </template></el-table-column>
<el-table-column label="状态" width="90"><template #default="{ row }"><span class="table-status" :class="{ off: row.status === 'Closed' }">{{ statusLabels[row.status] }}</span></template></el-table-column>
@@ -768,7 +768,7 @@ onMounted(async () => {
<el-option v-for="item in selectedTeachers" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="关联行政班">
<el-form-item label="关联行政班(选修课可留空)">
<div class="class-picker">
<div class="option-filter-grid classes">
<el-input v-model="manualClassFilters.keyword" clearable placeholder="班级代码、名称或专业" />