Initial commit of akmon project

This commit is contained in:
2026-01-20 08:04:15 +08:00
commit 77a2bab985
1309 changed files with 343305 additions and 0 deletions

151
map_dept_to_class.sql Normal file
View File

@@ -0,0 +1,151 @@
-- 通过ak_users的名字反查学生所在的部门数组并映射到班级ID
-- 处理member_user表中的dept_ids数组字段通过system_dept的name字段进行映射
-- 方案1: 基础查询 - 处理dept_ids数组通过system_dept.name进行映射
SELECT
au.id as ak_user_id,
au.username as student_name,
au.email as ak_email,
mu.dept_ids as original_dept_ids,
unnest(mu.dept_ids) as dept_id, -- 展开数组
sd.name as dept_name, -- 这是真正的条件字段
sd.id as dept_table_id,
mu.name as original_name,
mu.email as original_email,
-- 通过system_dept.name字段进行班级ID映射
CASE
WHEN sd.name = '2022001' THEN 'bc333301-78cd-4ef0-a123-456789012345'::uuid
WHEN sd.name = '2022002' THEN 'bc333302-78cd-4ef0-a123-456789012345'::uuid
WHEN sd.name = '2022003' THEN 'bc333303-78cd-4ef0-a123-456789012345'::uuid
WHEN sd.name = '2022004' THEN 'bc333304-78cd-4ef0-a123-456789012345'::uuid
WHEN sd.name = '2022005' THEN 'bc333305-78cd-4ef0-a123-456789012345'::uuid
WHEN sd.name = '2022006' THEN 'bc333306-78cd-4ef0-a123-456789012345'::uuid
ELSE NULL
END as mapped_class_id
FROM public.ak_users au
LEFT JOIN public.member_user mu ON au.username = mu.name
LEFT JOIN LATERAL unnest(mu.dept_ids) AS dept_id ON true
LEFT JOIN public.system_dept sd ON dept_id = sd.id
WHERE au.role = 'student'
AND mu.dept_ids IS NOT NULL
ORDER BY au.username;
-- 方案2: 使用子查询处理数组 - 通过system_dept.name进行映射
WITH dept_expanded AS (
SELECT
au.id as ak_user_id,
au.username as student_name,
mu.name as original_name,
mu.dept_ids as original_dept_ids,
dept_id,
sd.name as dept_name, -- 这是映射的关键字段
sd.id as dept_table_id
FROM public.ak_users au
LEFT JOIN public.member_user mu ON au.username = mu.name
LEFT JOIN LATERAL unnest(mu.dept_ids) AS dept_id ON true
LEFT JOIN public.system_dept sd ON dept_id = sd.id
WHERE au.role = 'student' AND mu.dept_ids IS NOT NULL
)
SELECT
ak_user_id,
student_name,
original_name,
array_agg(dept_name) as all_dept_names, -- 显示所有部门名称
array_agg(dept_table_id) as all_dept_ids,
-- 通过dept_name进行班级映射优先选择第一个匹配的
CASE
WHEN '2022001' = ANY(array_agg(dept_name)) THEN 'bc333301-78cd-4ef0-a123-456789012345'::uuid
WHEN '2022002' = ANY(array_agg(dept_name)) THEN 'bc333302-78cd-4ef0-a123-456789012345'::uuid
WHEN '2022003' = ANY(array_agg(dept_name)) THEN 'bc333303-78cd-4ef0-a123-456789012345'::uuid
WHEN '2022004' = ANY(array_agg(dept_name)) THEN 'bc333304-78cd-4ef0-a123-456789012345'::uuid
WHEN '2022005' = ANY(array_agg(dept_name)) THEN 'bc333305-78cd-4ef0-a123-456789012345'::uuid
WHEN '2022006' = ANY(array_agg(dept_name)) THEN 'bc333306-78cd-4ef0-a123-456789012345'::uuid
ELSE NULL
END as mapped_class_id
FROM dept_expanded
GROUP BY ak_user_id, student_name, original_name
ORDER BY student_name;
-- 方案3: 直接更新ak_users表 - 通过system_dept.name进行映射
UPDATE public.ak_users
SET class_id = dept_mapping.mapped_class_id
FROM (
WITH dept_expanded AS (
SELECT
au.id as ak_user_id,
sd.name as dept_name -- 使用dept_name进行映射
FROM public.ak_users au
LEFT JOIN public.member_user mu ON au.username = mu.name
LEFT JOIN LATERAL unnest(mu.dept_ids) AS dept_id ON true
LEFT JOIN public.system_dept sd ON dept_id = sd.id
WHERE au.role = 'student' AND mu.dept_ids IS NOT NULL
)
SELECT
ak_user_id,
CASE
WHEN dept_name = '2022001' THEN 'bc333301-78cd-4ef0-a123-456789012345'::uuid
WHEN dept_name = '2022002' THEN 'bc333302-78cd-4ef0-a123-456789012345'::uuid
WHEN dept_name = '2022003' THEN 'bc333303-78cd-4ef0-a123-456789012345'::uuid
WHEN dept_name = '2022004' THEN 'bc333304-78cd-4ef0-a123-456789012345'::uuid
WHEN dept_name = '2022005' THEN 'bc333305-78cd-4ef0-a123-456789012345'::uuid
WHEN dept_name = '2022006' THEN 'bc333306-78cd-4ef0-a123-456789012345'::uuid
ELSE NULL
END as mapped_class_id
FROM dept_expanded
WHERE dept_name IN ('2022001', '2022002', '2022003', '2022004', '2022005', '2022006')
-- 如果一个学生属于多个相关部门,按优先级选择
ORDER BY ak_user_id,
CASE dept_name
WHEN '2022001' THEN 1
WHEN '2022002' THEN 2
WHEN '2022003' THEN 3
WHEN '2022004' THEN 4
WHEN '2022005' THEN 5
WHEN '2022006' THEN 6
ELSE 999
END
) dept_mapping
WHERE ak_users.id = dept_mapping.ak_user_id
AND dept_mapping.mapped_class_id IS NOT NULL;
-- 方案4: 查看数组字段和部门名称统计
SELECT
sd.name as dept_name,
COUNT(DISTINCT au.id) as student_count,
array_agg(DISTINCT au.username) as sample_students
FROM public.ak_users au
LEFT JOIN public.member_user mu ON au.username = mu.name
LEFT JOIN LATERAL unnest(mu.dept_ids) AS dept_id ON true
LEFT JOIN public.system_dept sd ON dept_id = sd.id
WHERE au.role = 'student' AND mu.dept_ids IS NOT NULL
GROUP BY sd.name
ORDER BY sd.name;
-- 方案5: 检查包含特定部门名称的学生
SELECT
au.username,
array_agg(sd.name) as dept_names, -- 显示所有相关的部门名称
CASE
WHEN '2022001' = ANY(array_agg(sd.name)) THEN '初三(1)班'
WHEN '2022002' = ANY(array_agg(sd.name)) THEN '初三(2)班'
WHEN '2022003' = ANY(array_agg(sd.name)) THEN '初三(3)班'
WHEN '2022004' = ANY(array_agg(sd.name)) THEN '初三(4)班'
WHEN '2022005' = ANY(array_agg(sd.name)) THEN '初三(5)班'
WHEN '2022006' = ANY(array_agg(sd.name)) THEN '初三(6)班'
ELSE '未分配班级'
END as target_class_name
FROM public.ak_users au
LEFT JOIN public.member_user mu ON au.username = mu.name
LEFT JOIN LATERAL unnest(mu.dept_ids) AS dept_id ON true
LEFT JOIN public.system_dept sd ON dept_id = sd.id
WHERE au.role = 'student'
AND mu.dept_ids IS NOT NULL
GROUP BY au.username
HAVING
'2022001' = ANY(array_agg(sd.name)) OR
'2022002' = ANY(array_agg(sd.name)) OR
'2022003' = ANY(array_agg(sd.name)) OR
'2022004' = ANY(array_agg(sd.name)) OR
'2022005' = ANY(array_agg(sd.name)) OR
'2022006' = ANY(array_agg(sd.name))
ORDER BY au.username;