You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-houduan/docs/sql/2026-10-16-default-task-ope...

54 lines
2.4 KiB
SQL

-- 默认任务开放范围调整:平台默认/学校默认只默认开放第一个项目的前 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;