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-repair-task-allo...

77 lines
3.8 KiB
MySQL

-- 修复平台默认/学校默认任务分配的 module 存了中文任务名的问题。
--
-- 现象:task_allocation 里 class_id='999999999'(平台默认)与 class_id LIKE 'SCHOOL_DEFAULT:%'
-- (学校默认,由 initializeSchoolDefault 从平台默认复制而来)的 module 存的是中文任务展示名
-- (如"行业需求分析-蛋糕指数"),而所有消费方(任务评阅 taskReview、学生端实训任务解析等)
-- 都用 module 匹配 training_task.task_key(英文标识),一条都匹配不上。
-- 表现为:没有班级级任务分配的教学班,任务评阅页实训项目/实训任务下拉为空、学生列表为 0,
-- 学生端实训列表为空;有班级级分配的教学班(班级管理/实训任务管理保存过)不受影响。
--
-- 2026-10-16 补充:重建时默认只开放第一个项目的前 3 个任务(disabled_status=0),
-- 其余任务保留完整目录但置为停用(disabled_status=1),与产品约定一致——
-- 教学班未保存发布配置时,学生端默认只开放第一个项目的前三项,不是全部任务。
-- 综合实训(comprehensive-case-training)仍默认停用,由各班发布后参与。
--
-- 执行前先备份:
-- CREATE TABLE task_allocation_bak_20261016 AS
-- SELECT * FROM task_allocation
-- WHERE class_id='999999999' OR class_id LIKE 'SCHOOL_DEFAULT:%';
--
-- 判定是否需要执行:
-- SELECT a.module FROM task_allocation a
-- LEFT JOIN training_task t ON t.task_key = a.module
-- WHERE (a.class_id='999999999' OR a.class_id LIKE 'SCHOOL_DEFAULT:%') AND t.id IS NULL;
-- 查出中文任务名即需要修复。
-- 1) 平台默认:以 training_task 为基线重建(启用任务全量入目录;默认仅第一项目前 3 项开放)
DELETE FROM task_allocation WHERE class_id = '999999999';
INSERT INTO task_allocation (id, class_id, school_id, module, disabled_status, sort)
SELECT UUID(), '999999999', '999999999', tt.task_key,
CASE WHEN tt.project_name = fp.project_name
AND tt.rank_in_project <= 3
AND tt.task_key <> 'comprehensive-case-training'
THEN 0 ELSE 1 END,
tt.sort
FROM (
SELECT t.task_key, t.sort,
COALESCE(t.project_name, '其他') AS project_name,
ROW_NUMBER() OVER (PARTITION BY COALESCE(t.project_name, '其他')
ORDER BY t.sort ASC, t.id ASC) AS rank_in_project
FROM training_task t
WHERE t.enabled = 1
) tt
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;
-- 2) 学校默认:逐个学校执行(把 <SCHOOL_ID> 替换为实际学校ID后运行;
-- 已确认无问题的学校跳过。学校清单:
-- SELECT DISTINCT school_id FROM school_class WHERE class_type='TEACHING';)
-- DELETE FROM task_allocation WHERE class_id = CONCAT('SCHOOL_DEFAULT:', '<SCHOOL_ID>');
-- INSERT INTO task_allocation (id, class_id, school_id, module, disabled_status, sort)
-- SELECT UUID(), CONCAT('SCHOOL_DEFAULT:', '<SCHOOL_ID>'), '<SCHOOL_ID>', tt.task_key,
-- CASE WHEN tt.project_name = fp.project_name
-- AND tt.rank_in_project <= 3
-- AND tt.task_key <> 'comprehensive-case-training'
-- THEN 0 ELSE 1 END,
-- tt.sort
-- FROM (
-- SELECT t.task_key, t.sort,
-- COALESCE(t.project_name, '其他') AS project_name,
-- ROW_NUMBER() OVER (PARTITION BY COALESCE(t.project_name, '其他')
-- ORDER BY t.sort ASC, t.id ASC) AS rank_in_project
-- FROM training_task t
-- WHERE t.enabled = 1
-- ) tt
-- 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;