fix(task-review): 实训任务下拉首次加载按实训项目联动过滤

现象:进入任务评阅页、默认选中教学班后,「实训项目」已显示某项目,
但「实训任务」下拉列出该教学班全部任务;手动重选一次实训项目才恢复。

根因:首次进入/切换班级时的首个请求不带 projectName,后端在 projectName 为空时
不做项目过滤、返回全量任务;normalizeReview 随后用 selectedTask 回填了
filters.projectName,但没有因此重新请求,任务下拉仍停留在全量数据上。

修法:loadReview 记录本次请求是否带了项目;若未带且响应后回填出了 projectName,
则按该项目补查一次 getTaskReview。常规分支只替换 review.tasks 与 projects,
不整体 normalize —— selectedTask 的对象引用被预览 watcher 监听,整体替换会白白
重建一次右侧学生页预览 iframe(预览页会真实发起接口请求)。补查结果不含当前
taskId 时整体刷新兜底;结果为空时保留首份响应。补查请求已带 projectName,
不会再触发补查,幂等无死循环。

影响面:仅首次进入/切换班级多一次接口调用,其余选择路径请求次数不变。
master
qinzhenpen 14 hours ago
parent 0e237e5cdb
commit 39113aa091

@ -202,8 +202,34 @@ async function loadReview() {
if (!filters.value.classId) return; if (!filters.value.classId) return;
loading.value = true; loading.value = true;
try { try {
/*
* 首次进入 / 切换班级时,前端还不知道该选哪个实训项目,因此首个请求不带
* projectName;后端在 projectName 为空时不会按项目联动过滤,会把该教学班的
* 全部实训任务都返回回来。normalizeReview 随后用 selectedTask 回填了
* projectName,但任务列表仍停留在"全量"那份数据上,表现为:
* 「实训任务」下拉展示了全部任务,手动重选一次实训项目才恢复正常。
* 这里在回填出 projectName 后按该项目重新查一次,保证两个下拉始终联动一致。
*/
const requestedProject = filters.value.projectName;
const res = await teacherApi.getTaskReview({ ...filters.value }); const res = await teacherApi.getTaskReview({ ...filters.value });
normalizeReview(res.data); 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 { } finally {
loading.value = false; loading.value = false;
} }

Loading…
Cancel
Save