diff --git a/src/views/teacherEnd/score/TaskReviewPanel.vue b/src/views/teacherEnd/score/TaskReviewPanel.vue index f0a29e6..5cb50bd 100644 --- a/src/views/teacherEnd/score/TaskReviewPanel.vue +++ b/src/views/teacherEnd/score/TaskReviewPanel.vue @@ -202,8 +202,34 @@ async function loadReview() { if (!filters.value.classId) return; loading.value = true; try { + /* + * 首次进入 / 切换班级时,前端还不知道该选哪个实训项目,因此首个请求不带 + * projectName;后端在 projectName 为空时不会按项目联动过滤,会把该教学班的 + * 全部实训任务都返回回来。normalizeReview 随后用 selectedTask 回填了 + * projectName,但任务列表仍停留在"全量"那份数据上,表现为: + * 「实训任务」下拉展示了全部任务,手动重选一次实训项目才恢复正常。 + * 这里在回填出 projectName 后按该项目重新查一次,保证两个下拉始终联动一致。 + */ + const requestedProject = filters.value.projectName; const res = await teacherApi.getTaskReview({ ...filters.value }); normalizeReview(res.data); + if (!requestedProject && filters.value.projectName) { + const projectRes = await teacherApi.getTaskReview({ ...filters.value }); + const projectTasks = projectRes?.data?.tasks || []; + const currentTaskListed = projectTasks.some((task) => String(task.taskId) === String(filters.value.taskId)); + if (currentTaskListed) { + // 常规路径:只替换「实训任务」下拉的选项,不动 selectedTask 与学生列表, + // 避免多触发一次右侧学生页预览重建(预览页会真实发起接口请求)。 + review.value = { + ...review.value, + projects: projectRes.data.projects || review.value.projects, + tasks: projectTasks, + }; + } else if (projectTasks.length) { + // 兜底:过滤后不含当前任务时整体刷新,保证下拉值与选中任务一致。 + normalizeReview(projectRes.data); + } + } } finally { loading.value = false; }