-- 默认任务开放范围调整:平台默认/学校默认只默认开放第一个项目的前 3 个任务。 -- -- 背景:此前平台默认(class_id='999999999')与学校默认(class_id LIKE 'SCHOOL_DEFAULT:%') -- 的任务目录默认全部开放,与产品约定不一致——任务分配的默认口径是 -- "教学班未保存发布配置时,仅默认开放第一个项目的前三项,不是全部任务"。 -- -- 影响范围:只调整 disabled_status,不增删任务、不改 module/sort; -- 第一个项目的前 3 项置为开放(0),其余任务(含综合实训)置为停用(1)。 -- 学校管理员仍可在"默认实训任务配置"页按需放开。 -- -- 前置条件:task_allocation.module 已是英文 task_key,即已执行 -- 2026-10-16-repair-task-allocation-module-keys.sql -- 若仍有中文任务名残留,JOIN 不上的行保持原值,请先执行修复脚本重建。 -- -- 幂等:可重复执行。执行前建议备份: -- CREATE TABLE task_allocation_bak_20261016_first3 AS -- SELECT * FROM task_allocation -- WHERE class_id='999999999' OR class_id LIKE 'SCHOOL_DEFAULT:%'; -- 1) 第一项目前 3 项开放,其余启用目录内的任务置为停用 UPDATE task_allocation a JOIN training_task t ON t.task_key = a.module JOIN ( SELECT task_key, ROW_NUMBER() OVER (ORDER BY sort ASC, id ASC) AS rank_in_project, COALESCE(project_name, '其他') AS project_name FROM training_task WHERE enabled = 1 AND task_key <> 'comprehensive-case-training' ) ranked ON ranked.task_key = a.module CROSS JOIN ( SELECT COALESCE(project_name, '其他') AS project_name FROM training_task WHERE enabled = 1 AND task_key <> 'comprehensive-case-training' ORDER BY sort ASC, id ASC LIMIT 1 ) fp SET a.disabled_status = CASE WHEN ranked.project_name = fp.project_name AND ranked.rank_in_project <= 3 THEN 0 ELSE 1 END WHERE a.class_id = '999999999' OR a.class_id LIKE 'SCHOOL_DEFAULT:%'; -- 2) 综合实训始终默认停用(各班发布后才参与) UPDATE task_allocation SET disabled_status = 1 WHERE (class_id = '999999999' OR class_id LIKE 'SCHOOL_DEFAULT:%') AND module = 'comprehensive-case-training'; -- 3) 校验:每个 class_id 下应只有 3 条开放(即第一个项目的前 3 项) SELECT a.class_id, SUM(a.disabled_status = 0) AS open_count, COUNT(*) AS total FROM task_allocation a WHERE a.class_id = '999999999' OR a.class_id LIKE 'SCHOOL_DEFAULT:%' GROUP BY a.class_id;