自动排课完成后逐条显示“需人工处理”的任务和原因,并提供“检查排课约束”入口;刷新页面后仍可读取最近一次结果。

批量排课约束新增校区、教学楼、多教室统一指定,也支持清除原有限定。
课表新增“总视图”,同一时段、不同周次课程会并列显示。
周视图按教学周过滤,支持上一周、下一周、周次下拉和回到本周。
日视图按周次过滤;连续两节课程会跨两行完整占格。
This commit is contained in:
2026-07-25 10:55:09 +08:00 Unverified
parent db91988264
commit e4a12931ea
8 changed files with 652 additions and 51 deletions
+11 -12
View File
@@ -19,7 +19,6 @@ const editingId = ref('')
const selectedRows = ref<any[]>([])
const terms = ref<any[]>([])
const courses = ref<any[]>([])
const teachers = ref<any[]>([])
const classes = ref<any[]>([])
const majors = ref<any[]>([])
const query = reactive({
@@ -85,13 +84,15 @@ const plannedHours = computed(() =>
const hoursMatch = computed(() =>
!selectedCourse.value || plannedHours.value === selectedCourse.value.totalHours,
)
const assignableTeachers = computed(() => {
if (!selectedCourse.value) return teachers.value
const approvedIds = new Set(manualEligibleTeachers.value.map((item) => item.teacherId))
return teachers.value.filter((item) =>
approvedIds.has(item.id) || form.teacherIds?.includes(item.id),
)
})
const assignableTeachers = computed(() =>
manualEligibleTeachers.value.map((item) => ({
id: item.teacherId,
teacherNumber: item.teacherNumber,
name: item.name,
title: item.title,
collegeName: item.collegeName,
})),
)
const selectedTeachers = computed(() =>
assignableTeachers.value.filter((item) => form.teacherIds?.includes(item.id)),
)
@@ -521,16 +522,14 @@ async function generatePublicTasks() {
}
onMounted(async () => {
const [termRes, courseRes, teacherRes, classRes, majorRes] = await Promise.all([
const [termRes, courseRes, classRes, majorRes] = await Promise.all([
http.get('/base-data/terms'),
http.get('/courses/options'),
http.get('/personnel/teachers', { params: { page: 1, pageSize: 100, teacherStatus: 'Active' } }),
http.get('/base-data/classes'),
http.get('/base-data/majors'),
])
terms.value = termRes.data
courses.value = courseRes.data
teachers.value = teacherRes.data.items
classes.value = classRes.data
majors.value = majorRes.data
query.academicTermId = terms.value.find((item) => item.isCurrent)?.id
@@ -700,7 +699,7 @@ onMounted(async () => {
<el-select v-model="form.teacherIds" multiple filterable @change="onTeachersChanged">
<el-option v-for="item in assignableTeachers" :key="item.id" :label="`${item.teacherNumber} · ${item.name}`" :value="item.id" />
</el-select>
<small v-if="selectedCourse" class="field-hint">仅显示本学期申报该课程且学院审核通过的教师</small>
<small v-if="selectedCourse" class="field-hint">仅显示本学期已审核通过或由学院直接分配的授课资格教师</small>
</el-form-item>
<el-form-item label="主讲教师">
<el-select v-model="form.primaryTeacherId" clearable :disabled="!form.teacherIds?.length">