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

201 lines
6.1 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 初三年级班级数据设置脚本
-- 专门为初三1-6班创建完整的数据结构
-- 步骤1: 创建或更新基础数据结构
-- 创建学校(如果不存在)
INSERT INTO public.ak_schools (id, name, type)
VALUES
('school-middle-001', '某某中学', '中学')
ON CONFLICT (id) DO UPDATE SET
name = EXCLUDED.name,
type = EXCLUDED.type;
-- 创建初三年级(如果不存在)
INSERT INTO public.ak_grades (id, school_id, name)
VALUES
('grade-junior3-001', 'school-middle-001', '初三年级')
ON CONFLICT (id) DO UPDATE SET
school_id = EXCLUDED.school_id,
name = EXCLUDED.name;
-- 创建初三1-6班如果不存在否则更新
INSERT INTO public.ak_classes (id, grade_id, name)
VALUES
('class-junior3-01', 'grade-junior3-001', '初三(1)班'),
('class-junior3-02', 'grade-junior3-001', '初三(2)班'),
('class-junior3-03', 'grade-junior3-001', '初三(3)班'),
('class-junior3-04', 'grade-junior3-001', '初三(4)班'),
('class-junior3-05', 'grade-junior3-001', '初三(5)班'),
('class-junior3-06', 'grade-junior3-001', '初三(6)班')
ON CONFLICT (id) DO UPDATE SET
grade_id = EXCLUDED.grade_id,
name = EXCLUDED.name;
-- 步骤2: 如果您已有班级数据我们可以将现有的class_id映射到标准结构
-- 这部分需要根据您的实际数据调整
-- 查看现有班级数据,以便进行映射
SELECT
id as current_class_id,
name as current_class_name
FROM public.ak_classes
WHERE name LIKE '%初三%' OR name LIKE '%三年级%' OR name LIKE '%九年级%'
ORDER BY name;
-- 步骤3: 更新现有学生的学校和年级信息
-- 假设您的学生已经有class_id我们需要补充school_id和grade_id
UPDATE public.ak_users
SET
school_id = 'school-middle-001',
grade_id = 'grade-junior3-001'
WHERE role = 'student'
AND class_id IS NOT NULL
AND (school_id IS NULL OR grade_id IS NULL);
-- 步骤4: 创建测试教师并分配班级管理权限
-- 创建初三年级的班主任教师
INSERT INTO public.ak_users (
id,
username,
email,
password_hash,
role,
school_id,
grade_id
)
VALUES
('teacher-jr3-001', '王老师', 'wang.teacher@school.edu', '$2b$10$dummy.hash.for.testing', 'teacher', 'school-middle-001', 'grade-junior3-001'),
('teacher-jr3-002', '陈老师', 'chen.teacher@school.edu', '$2b$10$dummy.hash.for.testing', 'teacher', 'school-middle-001', 'grade-junior3-001'),
('teacher-jr3-003', '刘老师', 'liu.teacher@school.edu', '$2b$10$dummy.hash.for.testing', 'teacher', 'school-middle-001', 'grade-junior3-001')
ON CONFLICT (id) DO UPDATE SET
username = EXCLUDED.username,
email = EXCLUDED.email,
school_id = EXCLUDED.school_id,
grade_id = EXCLUDED.grade_id;
-- 步骤5: 创建教师-班级关系
-- 每个老师负责2个班级
-- 王老师负责初三(1)班和初三(2)班
INSERT INTO public.ak_teacher_roles (id, user_id, class_id)
SELECT
gen_random_uuid(),
'teacher-jr3-001',
c.id
FROM public.ak_classes c
WHERE c.name IN ('初三(1)班', '初三(2)班')
ON CONFLICT (user_id, class_id) DO NOTHING;
-- 陈老师负责初三(3)班和初三(4)班
INSERT INTO public.ak_teacher_roles (id, user_id, class_id)
SELECT
gen_random_uuid(),
'teacher-jr3-002',
c.id
FROM public.ak_classes c
WHERE c.name IN ('初三(3)班', '初三(4)班')
ON CONFLICT (user_id, class_id) DO NOTHING;
-- 刘老师负责初三(5)班和初三(6)班
INSERT INTO public.ak_teacher_roles (id, user_id, class_id)
SELECT
gen_random_uuid(),
'teacher-jr3-003',
c.id
FROM public.ak_classes c
WHERE c.name IN ('初三(5)班', '初三(6)班')
ON CONFLICT (user_id, class_id) DO NOTHING;
-- 步骤6: 验证和查看结果
-- 查看初三年级的完整结构
SELECT
s.name as school_name,
g.name as grade_name,
c.name as class_name,
c.id as class_id,
COUNT(u.id) as student_count
FROM public.ak_classes c
JOIN public.ak_grades g ON c.grade_id = g.id
JOIN public.ak_schools s ON g.school_id = s.id
LEFT JOIN public.ak_users u ON u.class_id = c.id AND u.role = 'student'
WHERE g.name LIKE '%初三%'
GROUP BY s.name, g.name, c.name, c.id
ORDER BY c.name;
-- 查看教师负责的班级情况
SELECT
u.username as teacher_name,
string_agg(c.name, ', ') as managed_classes,
COUNT(DISTINCT c.id) as class_count,
SUM(CASE WHEN students.student_count IS NOT NULL THEN students.student_count ELSE 0 END) as total_students
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
LEFT JOIN (
SELECT
class_id,
COUNT(*) as student_count
FROM public.ak_users
WHERE role = 'student'
GROUP BY class_id
) students ON students.class_id = c.id
WHERE u.role = 'teacher'
GROUP BY u.id, u.username
ORDER BY u.username;
-- 检查数据完整性
SELECT
'Students without class' as check_type,
COUNT(*) as count
FROM public.ak_users
WHERE role = 'student' AND class_id IS NULL
UNION ALL
SELECT
'Students without school' as check_type,
COUNT(*) as count
FROM public.ak_users
WHERE role = 'student' AND school_id IS NULL
UNION ALL
SELECT
'Students without grade' as check_type,
COUNT(*) as count
FROM public.ak_users
WHERE role = 'student' AND grade_id IS NULL;
-- 如果您需要重新分配学生到各个班级,可以使用以下脚本
-- (注释掉,仅在需要时使用)
/*
-- 将现有学生随机分配到初三1-6班
WITH class_list AS (
SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) as class_order
FROM public.ak_classes c
JOIN public.ak_grades g ON c.grade_id = g.id
WHERE g.name LIKE '%初三%'
),
student_assignment AS (
SELECT
u.id as user_id,
cl.id as new_class_id
FROM public.ak_users u
CROSS JOIN class_list cl
WHERE u.role = 'student'
AND (u.class_id IS NULL OR u.class_id NOT IN (SELECT id FROM class_list))
AND (hashtext(u.id::text) % 6 + 1) = cl.class_order
)
UPDATE public.ak_users
SET
class_id = sa.new_class_id,
school_id = 'school-middle-001',
grade_id = 'grade-junior3-001'
FROM student_assignment sa
WHERE ak_users.id = sa.user_id;
*/