Files
akmon/setup_student_class_data.sql
2026-01-20 08:04:15 +08:00

181 lines
7.7 KiB
SQL

-- 设置学生班级数据脚本
-- 为从 member_users 迁移到 ak_users 的学生数据补充学校、年级、班级信息
-- 步骤1: 创建基础数据(如果不存在)
-- 创建默认地区
INSERT INTO public.ak_regions (id, name, level)
VALUES
('11111111-1111-1111-1111-111111111111', '北京市', 1),
('22222222-2222-2222-2222-222222222222', '海淀区', 3)
ON CONFLICT (id) DO NOTHING;
-- 创建测试学校
INSERT INTO public.ak_schools (id, name, region_id, type)
VALUES
('33333333-3333-3333-3333-333333333333', '北京市第一中学', '22222222-2222-2222-2222-222222222222', '中学'),
('44444444-4444-4444-4444-444444444444', '北京市实验小学', '22222222-2222-2222-2222-222222222222', '小学')
ON CONFLICT (id) DO NOTHING;
-- 创建年级(中学)
INSERT INTO public.ak_grades (id, school_id, name)
VALUES
('55555555-5555-5555-5555-555555555555', '33333333-3333-3333-3333-333333333333', '高一'),
('66666666-6666-6666-6666-666666666666', '33333333-3333-3333-3333-333333333333', '高二'),
('77777777-7777-7777-7777-777777777777', '33333333-3333-3333-3333-333333333333', '高三')
ON CONFLICT (id) DO NOTHING;
-- 创建年级(小学)
INSERT INTO public.ak_grades (id, school_id, name)
VALUES
('88888888-8888-8888-8888-888888888888', '44444444-4444-4444-4444-444444444444', '一年级'),
('99999999-9999-9999-9999-999999999999', '44444444-4444-4444-4444-444444444444', '二年级'),
('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '44444444-4444-4444-4444-444444444444', '三年级')
ON CONFLICT (id) DO NOTHING;
-- 创建班级(高一)
INSERT INTO public.ak_classes (id, grade_id, name)
VALUES
('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', '55555555-5555-5555-5555-555555555555', '高一(1)班'),
('cccccccc-cccc-cccc-cccc-cccccccccccc', '55555555-5555-5555-5555-555555555555', '高一(2)班'),
('dddddddd-dddd-dddd-dddd-dddddddddddd', '55555555-5555-5555-5555-555555555555', '高一(3)班')
ON CONFLICT (id) DO NOTHING;
-- 创建班级(高二)
INSERT INTO public.ak_classes (id, grade_id, name)
VALUES
('eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee', '66666666-6666-6666-6666-666666666666', '高二(1)班'),
('ffffffff-ffff-ffff-ffff-ffffffffffff', '66666666-6666-6666-6666-666666666666', '高二(2)班')
ON CONFLICT (id) DO NOTHING;
-- 创建班级(小学)
INSERT INTO public.ak_classes (id, grade_id, name)
VALUES
('12121212-1212-1212-1212-121212121212', '88888888-8888-8888-8888-888888888888', '一年级(1)班'),
('13131313-1313-1313-1313-131313131313', '99999999-9999-9999-9999-999999999999', '二年级(1)班')
ON CONFLICT (id) DO NOTHING;
-- 步骤2: 查看当前学生数据状态
-- 查看有多少学生还没有设置班级信息
SELECT
role,
COUNT(*) as user_count,
COUNT(CASE WHEN school_id IS NULL THEN 1 END) as no_school_count,
COUNT(CASE WHEN grade_id IS NULL THEN 1 END) as no_grade_count,
COUNT(CASE WHEN class_id IS NULL THEN 1 END) as no_class_count
FROM public.ak_users
WHERE role = 'student'
GROUP BY role;
-- 步骤3: 批量更新学生的学校、年级、班级信息
-- 这里提供几种方案,您可以根据实际情况选择:
-- 方案A: 将所有学生分配到默认的高一(1)班
-- 注意:这会将所有学生都分配到同一个班级
/*
UPDATE public.ak_users
SET
school_id = '33333333-3333-3333-3333-333333333333', -- 北京市第一中学
grade_id = '55555555-5555-5555-5555-555555555555', -- 高一
class_id = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb' -- 高一(1)班
WHERE role = 'student'
AND (school_id IS NULL OR grade_id IS NULL OR class_id IS NULL);
*/
-- 方案B: 根据用户ID的哈希值随机分配到不同班级
-- 这样可以让学生相对均匀地分布在不同班级中
WITH class_assignment AS (
SELECT
id,
CASE
WHEN (hashtext(id::text) % 5) = 0 THEN 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb' -- 高一(1)班
WHEN (hashtext(id::text) % 5) = 1 THEN 'cccccccc-cccc-cccc-cccc-cccccccccccc' -- 高一(2)班
WHEN (hashtext(id::text) % 5) = 2 THEN 'dddddddd-dddd-dddd-dddd-dddddddddddd' -- 高一(3)班
WHEN (hashtext(id::text) % 5) = 3 THEN 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee' -- 高二(1)班
ELSE 'ffffffff-ffff-ffff-ffff-ffffffffffff' -- 高二(2)班
END as assigned_class_id
FROM public.ak_users
WHERE role = 'student'
AND (school_id IS NULL OR grade_id IS NULL OR class_id IS NULL)
)
UPDATE public.ak_users
SET
school_id = '33333333-3333-3333-3333-333333333333', -- 北京市第一中学
grade_id = CASE
WHEN ca.assigned_class_id IN ('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'cccccccc-cccc-cccc-cccc-cccccccccccc', 'dddddddd-dddd-dddd-dddd-dddddddddddd')
THEN '55555555-5555-5555-5555-555555555555' -- 高一
ELSE '66666666-6666-6666-6666-666666666666' -- 高二
END,
class_id = ca.assigned_class_id
FROM class_assignment ca
WHERE public.ak_users.id = ca.id;
-- 步骤4: 创建教师账户并分配班级管理权限
-- 创建测试教师(如果不存在)
INSERT INTO public.ak_users (
id,
username,
email,
password_hash,
role,
school_id,
grade_id
)
VALUES
('teacher01-1111-1111-1111-111111111111', '张老师', 'zhang.teacher@school.edu', '$2b$10$dummy.hash.for.testing', 'teacher', '33333333-3333-3333-3333-333333333333', '55555555-5555-5555-5555-555555555555'),
('teacher02-2222-2222-2222-222222222222', '李老师', 'li.teacher@school.edu', '$2b$10$dummy.hash.for.testing', 'teacher', '33333333-3333-3333-3333-333333333333', '66666666-6666-6666-6666-666666666666')
ON CONFLICT (id) DO NOTHING;
-- 创建教师-班级关系(如果表结构存在)
-- 张老师负责高一的3个班级
INSERT INTO public.ak_teacher_roles (id, user_id, class_id)
VALUES
(gen_random_uuid(), 'teacher01-1111-1111-1111-111111111111', 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'),
(gen_random_uuid(), 'teacher01-1111-1111-1111-111111111111', 'cccccccc-cccc-cccc-cccc-cccccccccccc'),
(gen_random_uuid(), 'teacher01-1111-1111-1111-111111111111', 'dddddddd-dddd-dddd-dddd-dddddddddddd')
ON CONFLICT (user_id, class_id) DO NOTHING;
-- 李老师负责高二的2个班级
INSERT INTO public.ak_teacher_roles (id, user_id, class_id)
VALUES
(gen_random_uuid(), 'teacher02-2222-2222-2222-222222222222', 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'),
(gen_random_uuid(), 'teacher02-2222-2222-2222-222222222222', 'ffffffff-ffff-ffff-ffff-ffffffffffff')
ON CONFLICT (user_id, class_id) DO NOTHING;
-- 步骤5: 验证数据设置结果
-- 查看更新后的学生分布情况
SELECT
s.name as school_name,
g.name as grade_name,
c.name as class_name,
COUNT(u.id) as student_count
FROM public.ak_users u
LEFT JOIN public.ak_schools s ON u.school_id = s.id
LEFT JOIN public.ak_grades g ON u.grade_id = g.id
LEFT JOIN public.ak_classes c ON u.class_id = c.id
WHERE u.role = 'student'
GROUP BY s.name, g.name, c.name
ORDER BY s.name, g.name, c.name;
-- 查看教师负责的班级情况
SELECT
u.username as teacher_name,
s.name as school_name,
g.name as grade_name,
c.name as class_name,
(SELECT COUNT(*) FROM public.ak_users WHERE class_id = c.id AND role = 'student') as student_count
FROM public.ak_teacher_roles tr
JOIN public.ak_users u ON tr.user_id = u.id
JOIN public.ak_classes c ON tr.class_id = c.id
JOIN public.ak_grades g ON c.grade_id = g.id
JOIN public.ak_schools s ON g.school_id = s.id
ORDER BY u.username, s.name, g.name, c.name;
-- 检查是否还有未分配班级的学生
SELECT
COUNT(*) as unassigned_students,
array_agg(username) as usernames
FROM public.ak_users
WHERE role = 'student'
AND (school_id IS NULL OR grade_id IS NULL OR class_id IS NULL);