Initial commit of akmon project
This commit is contained in:
180
setup_student_class_data.sql
Normal file
180
setup_student_class_data.sql
Normal file
@@ -0,0 +1,180 @@
|
||||
-- 设置学生班级数据脚本
|
||||
-- 为从 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);
|
||||
Reference in New Issue
Block a user