import request from "@/utils/request"; // 学生页面和全局“补充步骤”导航会在同一轮路由渲染中读取同一任务配置。 // 仅合并进行中的请求:教师保存后下一次读取仍会获得最新配置,不引入陈旧缓存。 const pendingTaskRequests = new Map(); function notifyStudentTaskConfigLoading(taskKey, loading) { if (typeof window === "undefined") return; window.dispatchEvent(new CustomEvent("student-task-config-loading", { detail: { taskKey, loading } })); } export function listTrainingTasks(params) { return request({ url: "/api/training-tasks", method: "get", params, }); } export function getTrainingTaskByKey(taskKey) { const normalizedTaskKey = String(taskKey || "").trim(); if (pendingTaskRequests.has(normalizedTaskKey)) { return pendingTaskRequests.get(normalizedTaskKey); } notifyStudentTaskConfigLoading(normalizedTaskKey, true); const requestPromise = request({ url: `/api/training-tasks/key/${normalizedTaskKey}`, method: "get", }); pendingTaskRequests.set(normalizedTaskKey, requestPromise); requestPromise.then( () => { pendingTaskRequests.delete(normalizedTaskKey); notifyStudentTaskConfigLoading(normalizedTaskKey, false); }, () => { pendingTaskRequests.delete(normalizedTaskKey); notifyStudentTaskConfigLoading(normalizedTaskKey, false); } ); return requestPromise; } export function updateTrainingTask(id, data) { return request({ url: `/api/training-tasks/${id}`, method: "put", data, }); } export function createTrainingTask(data) { return request({ url: "/api/training-tasks", method: "post", data, }); } export function importTrainingTasks(file) { const data = new FormData(); data.append("file", file); return request({ url: "/api/training-tasks/import", method: "post", data, headers: { "Content-Type": "multipart/form-data" }, }); } export function downloadTrainingTaskTemplate() { return request({ url: "/api/training-tasks/template", method: "get", responseType: "blob", }); } export function uploadTrainingTaskMaterial(data) { return request({ url: "/common/upload", method: "post", data, headers: { "Content-Type": "multipart/form-data", repeatSubmit: false, }, }); } export function listClassTrainingTasks(teachingClassId, params) { return request({ url: `/api/training-tasks/classes/${teachingClassId}`, method: "get", params, }); } export function getClassTrainingTaskByKey(teachingClassId, taskKey) { return request({ url: `/api/training-tasks/classes/${teachingClassId}/key/${taskKey}`, method: "get", }); } export function saveClassTrainingTask(teachingClassId, taskKey, data) { return request({ url: `/api/training-tasks/classes/${teachingClassId}/${taskKey}`, method: "put", data, }); } export function restoreClassTrainingTaskDefault(teachingClassId, taskKey) { return request({ url: `/api/training-tasks/classes/${teachingClassId}/${taskKey}/override`, method: "delete", }); } export function restoreClassTrainingTasksDefaults(teachingClassId) { return request({ url: `/api/training-tasks/classes/${teachingClassId}/overrides`, method: "delete", }); }