181 lines
7.7 KiB
SQL
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);
|