const COMPREHENSIVE_TASK_KEY = "comprehensive-case-training"; const knownTaskPaths = Object.freeze({ "new-product-survey": "/foundation/new-product-survey", "product-development-factors": "/foundation/product-development-factors", "product-development-process": "/foundation/product-development-process", "industry-demand-analysis": "/demand/index", "competitive-environment-analysis": "/demand/environment", "market-opportunity-selection": "/product/index", "business-feasibility": "/demand/business-feasibility", "target-user-profile": "/demand/people", "consumer-behavior": "/demand/consumer-behavior", "consumer-scenario": "/demand/consumer-scenario", "feature-conversion": "/demand/feature-conversion", "product-value-positioning": "/product/differentiation", "product-structure": "/product/structure", "after-sales-service": "/product/after-sales-service", "requirements-doc": "/product/requirements-doc", "hardware-cost": "/product/hardware-cost", "supplier-evaluation": "/channel/supplier", "purchase-demand-forecast": "/channel/index", "product-pricing": "/product/price", "category-optimization": "/assessment/optimization", "release-channel-evaluation": "/test/index", "promotion-effect-optimization": "/test/promotion", "product-diagnosis-iteration": "/assessment/diagnosis", }); function taskPath(taskKey) { return knownTaskPaths[taskKey] || `/training/task/${encodeURIComponent(taskKey)}`; } function taskSort(task) { return Number.isFinite(Number(task?.sort)) ? Number(task.sort) : Number.MAX_SAFE_INTEGER; } export function buildStudentTaskSections(tasks = []) { const sections = new Map(); [...tasks] .filter((task) => task?.taskKey && task.taskKey !== COMPREHENSIVE_TASK_KEY) .sort((left, right) => taskSort(left) - taskSort(right)) .forEach((task) => { const title = task.projectName || "其他实训"; if (!sections.has(title)) sections.set(title, { title, children: [] }); sections.get(title).children.push({ title: task.taskName || task.taskKey, path: taskPath(task.taskKey), }); }); return [...sections.values()]; } export function getComprehensiveTopTask(tasks = []) { const task = tasks.find((item) => item?.taskKey === COMPREHENSIVE_TASK_KEY); return task ? { title: task.taskName || "综合实训", path: "/comprehensive/index", activePrefix: "/comprehensive" } : null; }