Initial commit of akmon project
This commit is contained in:
382
doc_zhipao/analytics_rpc_complete_fix.sql
Normal file
382
doc_zhipao/analytics_rpc_complete_fix.sql
Normal file
@@ -0,0 +1,382 @@
|
||||
-- 完全修复 Analytics RPC 函数冲突问题
|
||||
-- 删除所有可能存在的函数签名并重新创建
|
||||
|
||||
-- 1. 删除所有可能的函数签名(包括不同参数组合)
|
||||
-- get_teacher_analytics 的所有可能签名
|
||||
DROP FUNCTION IF EXISTS public.get_teacher_analytics();
|
||||
DROP FUNCTION IF EXISTS public.get_teacher_analytics(uuid);
|
||||
DROP FUNCTION IF EXISTS public.get_teacher_analytics(uuid, text);
|
||||
DROP FUNCTION IF EXISTS public.get_teacher_analytics(uuid, text, text);
|
||||
DROP FUNCTION IF EXISTS public.get_teacher_analytics(text);
|
||||
DROP FUNCTION IF EXISTS public.get_teacher_analytics(text, text);
|
||||
DROP FUNCTION IF EXISTS public.get_teacher_analytics(text, text, text);
|
||||
|
||||
-- get_top_performers 的所有可能签名
|
||||
DROP FUNCTION IF EXISTS public.get_top_performers();
|
||||
DROP FUNCTION IF EXISTS public.get_top_performers(uuid);
|
||||
DROP FUNCTION IF EXISTS public.get_top_performers(uuid, text);
|
||||
DROP FUNCTION IF EXISTS public.get_top_performers(uuid, text, text);
|
||||
DROP FUNCTION IF EXISTS public.get_top_performers(uuid, text, text, integer);
|
||||
DROP FUNCTION IF EXISTS public.get_top_performers(uuid, integer);
|
||||
DROP FUNCTION IF EXISTS public.get_top_performers(text, text, text, integer);
|
||||
DROP FUNCTION IF EXISTS public.get_top_performers(integer);
|
||||
|
||||
-- get_chart_data 的所有可能签名
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data();
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data(uuid);
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data(uuid, text);
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data(uuid, text, text);
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data(uuid, text, text, text);
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data(text);
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data(text, text);
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data(text, text, text);
|
||||
DROP FUNCTION IF EXISTS public.get_chart_data(text, text, text, text);
|
||||
|
||||
-- get_recent_activities 的所有可能签名
|
||||
DROP FUNCTION IF EXISTS public.get_recent_activities();
|
||||
DROP FUNCTION IF EXISTS public.get_recent_activities(uuid);
|
||||
DROP FUNCTION IF EXISTS public.get_recent_activities(uuid, integer);
|
||||
DROP FUNCTION IF EXISTS public.get_recent_activities(integer);
|
||||
|
||||
-- 2. 等待一秒确保删除完成
|
||||
SELECT pg_sleep(1);
|
||||
|
||||
-- 3. 创建新的 get_teacher_analytics 函数
|
||||
CREATE FUNCTION public.get_teacher_analytics(
|
||||
teacher_id_param uuid DEFAULT NULL,
|
||||
start_date_param text DEFAULT NULL,
|
||||
end_date_param text DEFAULT NULL
|
||||
)
|
||||
RETURNS jsonb
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
result_data jsonb;
|
||||
BEGIN
|
||||
-- 返回模拟统计数据
|
||||
result_data := jsonb_build_object(
|
||||
'total_students', 28,
|
||||
'total_assignments', 12,
|
||||
'completion_rate', 87.5,
|
||||
'average_score', 82.3,
|
||||
'active_classes', 4,
|
||||
'total_submissions', 285,
|
||||
'pending_reviews', 15,
|
||||
'graded_submissions', 270,
|
||||
'teacher_id', COALESCE(teacher_id_param::text, 'default'),
|
||||
'date_range', jsonb_build_object(
|
||||
'start_date', COALESCE(start_date_param, '2024-06-01'),
|
||||
'end_date', COALESCE(end_date_param, '2024-06-12')
|
||||
)
|
||||
);
|
||||
|
||||
RETURN result_data;
|
||||
EXCEPTION WHEN OTHERS THEN
|
||||
RETURN jsonb_build_object(
|
||||
'error', true,
|
||||
'message', 'Function execution failed: ' || SQLERRM,
|
||||
'code', SQLSTATE
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 4. 创建新的 get_top_performers 函数
|
||||
CREATE FUNCTION public.get_top_performers(
|
||||
teacher_id_param uuid DEFAULT NULL,
|
||||
start_date_param text DEFAULT NULL,
|
||||
end_date_param text DEFAULT NULL,
|
||||
limit_param integer DEFAULT 10
|
||||
)
|
||||
RETURNS jsonb
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
result_data jsonb;
|
||||
actual_limit integer;
|
||||
BEGIN
|
||||
actual_limit := COALESCE(limit_param, 10);
|
||||
|
||||
-- 返回模拟的优秀学员数据
|
||||
result_data := jsonb_build_array(
|
||||
jsonb_build_object(
|
||||
'student_id', '550e8400-e29b-41d4-a716-446655440001',
|
||||
'name', '王小明',
|
||||
'username', 'wangxiaoming',
|
||||
'avatar_url', null,
|
||||
'score', 96.8,
|
||||
'submission_count', 12,
|
||||
'completion_rate', 100.0,
|
||||
'class_name', '高三(1)班',
|
||||
'rank_position', 1
|
||||
),
|
||||
jsonb_build_object(
|
||||
'student_id', '550e8400-e29b-41d4-a716-446655440002',
|
||||
'name', '张丽华',
|
||||
'username', 'zhanglihua',
|
||||
'avatar_url', null,
|
||||
'score', 94.2,
|
||||
'submission_count', 11,
|
||||
'completion_rate', 91.7,
|
||||
'class_name', '高三(2)班',
|
||||
'rank_position', 2
|
||||
),
|
||||
jsonb_build_object(
|
||||
'student_id', '550e8400-e29b-41d4-a716-446655440003',
|
||||
'name', '李强',
|
||||
'username', 'liqiang',
|
||||
'avatar_url', null,
|
||||
'score', 92.5,
|
||||
'submission_count', 10,
|
||||
'completion_rate', 83.3,
|
||||
'class_name', '高三(1)班',
|
||||
'rank_position', 3
|
||||
),
|
||||
jsonb_build_object(
|
||||
'student_id', '550e8400-e29b-41d4-a716-446655440004',
|
||||
'name', '陈美丽',
|
||||
'username', 'chenmeili',
|
||||
'avatar_url', null,
|
||||
'score', 90.1,
|
||||
'submission_count', 9,
|
||||
'completion_rate', 75.0,
|
||||
'class_name', '高三(2)班',
|
||||
'rank_position', 4
|
||||
),
|
||||
jsonb_build_object(
|
||||
'student_id', '550e8400-e29b-41d4-a716-446655440005',
|
||||
'name', '刘志伟',
|
||||
'username', 'liuzhiwei',
|
||||
'avatar_url', null,
|
||||
'score', 88.7,
|
||||
'submission_count', 8,
|
||||
'completion_rate', 66.7,
|
||||
'class_name', '高三(1)班',
|
||||
'rank_position', 5
|
||||
)
|
||||
);
|
||||
|
||||
RETURN result_data;
|
||||
EXCEPTION WHEN OTHERS THEN
|
||||
RETURN jsonb_build_object(
|
||||
'error', true,
|
||||
'message', 'Function execution failed: ' || SQLERRM,
|
||||
'code', SQLSTATE
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 5. 创建新的 get_chart_data 函数
|
||||
CREATE FUNCTION public.get_chart_data(
|
||||
teacher_id_param uuid DEFAULT NULL,
|
||||
start_date_param text DEFAULT NULL,
|
||||
end_date_param text DEFAULT NULL,
|
||||
type_param text DEFAULT 'completion_rate'
|
||||
)
|
||||
RETURNS jsonb
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
result_data jsonb;
|
||||
chart_type text;
|
||||
BEGIN
|
||||
chart_type := COALESCE(type_param, 'completion_rate');
|
||||
|
||||
-- 根据类型返回不同的图表数据
|
||||
CASE chart_type
|
||||
WHEN 'completion_rate' THEN
|
||||
-- 完成率趋势数据
|
||||
result_data := jsonb_build_array(
|
||||
jsonb_build_object('date_key', '2024-06-01', 'value', 75.5, 'label', '完成率', 'count', 15),
|
||||
jsonb_build_object('date_key', '2024-06-02', 'value', 82.3, 'label', '完成率', 'count', 18),
|
||||
jsonb_build_object('date_key', '2024-06-03', 'value', 88.1, 'label', '完成率', 'count', 22),
|
||||
jsonb_build_object('date_key', '2024-06-04', 'value', 90.5, 'label', '完成率', 'count', 25),
|
||||
jsonb_build_object('date_key', '2024-06-05', 'value', 87.2, 'label', '完成率', 'count', 23),
|
||||
jsonb_build_object('date_key', '2024-06-06', 'value', 92.8, 'label', '完成率', 'count', 28),
|
||||
jsonb_build_object('date_key', '2024-06-07', 'value', 85.6, 'label', '完成率', 'count', 21)
|
||||
);
|
||||
WHEN 'score_distribution' THEN
|
||||
-- 成绩分布数据
|
||||
result_data := jsonb_build_array(
|
||||
jsonb_build_object('range', '90-100', 'label', '优秀', 'count', 25, 'percentage', 18.7),
|
||||
jsonb_build_object('range', '80-89', 'label', '良好', 'count', 45, 'percentage', 33.6),
|
||||
jsonb_build_object('range', '70-79', 'label', '中等', 'count', 35, 'percentage', 26.1),
|
||||
jsonb_build_object('range', '60-69', 'label', '及格', 'count', 20, 'percentage', 14.9),
|
||||
jsonb_build_object('range', '60以下', 'label', '不及格', 'count', 8, 'percentage', 6.0)
|
||||
);
|
||||
WHEN 'submission_trend' THEN
|
||||
-- 提交趋势数据
|
||||
result_data := jsonb_build_array(
|
||||
jsonb_build_object('date_key', '2024-06-01', 'value', 12, 'label', '提交数量', 'count', 12),
|
||||
jsonb_build_object('date_key', '2024-06-02', 'value', 15, 'label', '提交数量', 'count', 15),
|
||||
jsonb_build_object('date_key', '2024-06-03', 'value', 18, 'label', '提交数量', 'count', 18),
|
||||
jsonb_build_object('date_key', '2024-06-04', 'value', 22, 'label', '提交数量', 'count', 22),
|
||||
jsonb_build_object('date_key', '2024-06-05', 'value', 19, 'label', '提交数量', 'count', 19),
|
||||
jsonb_build_object('date_key', '2024-06-06', 'value', 25, 'label', '提交数量', 'count', 25),
|
||||
jsonb_build_object('date_key', '2024-06-07', 'value', 16, 'label', '提交数量', 'count', 16)
|
||||
);
|
||||
ELSE
|
||||
-- 默认返回空数组
|
||||
result_data := '[]'::jsonb;
|
||||
END CASE;
|
||||
|
||||
RETURN result_data;
|
||||
EXCEPTION WHEN OTHERS THEN
|
||||
RETURN jsonb_build_object(
|
||||
'error', true,
|
||||
'message', 'Function execution failed: ' || SQLERRM,
|
||||
'code', SQLSTATE,
|
||||
'chart_type', chart_type
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 6. 创建新的 get_recent_activities 函数
|
||||
CREATE FUNCTION public.get_recent_activities(
|
||||
teacher_id_param uuid DEFAULT NULL,
|
||||
limit_param integer DEFAULT 20
|
||||
)
|
||||
RETURNS jsonb
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
result_data jsonb;
|
||||
actual_limit integer;
|
||||
BEGIN
|
||||
actual_limit := COALESCE(limit_param, 20);
|
||||
|
||||
-- 返回模拟的近期活动数据
|
||||
result_data := jsonb_build_array(
|
||||
jsonb_build_object(
|
||||
'activity_id', '550e8400-e29b-41d4-a716-446655440001',
|
||||
'activity_type', 'assignment_submitted',
|
||||
'title', '王小明提交了跑步训练作业',
|
||||
'description', '完成了5公里跑步训练,用时25分钟',
|
||||
'student_name', '王小明',
|
||||
'assignment_title', '跑步训练',
|
||||
'activity_time', '2024-06-12T08:30:00Z',
|
||||
'time_ago', '2小时前'
|
||||
),
|
||||
jsonb_build_object(
|
||||
'activity_id', '550e8400-e29b-41d4-a716-446655440002',
|
||||
'activity_type', 'assignment_submitted',
|
||||
'title', '张丽华提交了力量训练作业',
|
||||
'description', '完成了器械训练,表现优秀',
|
||||
'student_name', '张丽华',
|
||||
'assignment_title', '力量训练',
|
||||
'activity_time', '2024-06-12T07:15:00Z',
|
||||
'time_ago', '3小时前'
|
||||
),
|
||||
jsonb_build_object(
|
||||
'activity_id', '550e8400-e29b-41d4-a716-446655440003',
|
||||
'activity_type', 'project_completed',
|
||||
'title', '李强完成了体能测试项目',
|
||||
'description', '各项指标达到优秀标准',
|
||||
'student_name', '李强',
|
||||
'assignment_title', '体能测试',
|
||||
'activity_time', '2024-06-12T06:45:00Z',
|
||||
'time_ago', '4小时前'
|
||||
),
|
||||
jsonb_build_object(
|
||||
'activity_id', '550e8400-e29b-41d4-a716-446655440004',
|
||||
'activity_type', 'assignment_graded',
|
||||
'title', '陈美丽的作业已批改',
|
||||
'description', '体操训练作业获得优秀评价',
|
||||
'student_name', '陈美丽',
|
||||
'assignment_title', '体操训练',
|
||||
'activity_time', '2024-06-12T05:20:00Z',
|
||||
'time_ago', '5小时前'
|
||||
),
|
||||
jsonb_build_object(
|
||||
'activity_id', '550e8400-e29b-41d4-a716-446655440005',
|
||||
'activity_type', 'assignment_submitted',
|
||||
'title', '刘志伟提交了游泳训练作业',
|
||||
'description', '完成了1000米自由泳,技术有所提升',
|
||||
'student_name', '刘志伟',
|
||||
'assignment_title', '游泳训练',
|
||||
'activity_time', '2024-06-12T04:15:00Z',
|
||||
'time_ago', '6小时前'
|
||||
)
|
||||
);
|
||||
|
||||
RETURN result_data;
|
||||
EXCEPTION WHEN OTHERS THEN
|
||||
RETURN jsonb_build_object(
|
||||
'error', true,
|
||||
'message', 'Function execution failed: ' || SQLERRM,
|
||||
'code', SQLSTATE
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 7. 设置函数所有者和权限
|
||||
ALTER FUNCTION public.get_teacher_analytics OWNER TO postgres;
|
||||
ALTER FUNCTION public.get_top_performers OWNER TO postgres;
|
||||
ALTER FUNCTION public.get_chart_data OWNER TO postgres;
|
||||
ALTER FUNCTION public.get_recent_activities OWNER TO postgres;
|
||||
|
||||
-- 8. 授权函数给相关角色
|
||||
GRANT EXECUTE ON FUNCTION public.get_teacher_analytics TO authenticated;
|
||||
GRANT EXECUTE ON FUNCTION public.get_top_performers TO authenticated;
|
||||
GRANT EXECUTE ON FUNCTION public.get_chart_data TO authenticated;
|
||||
GRANT EXECUTE ON FUNCTION public.get_recent_activities TO authenticated;
|
||||
|
||||
GRANT EXECUTE ON FUNCTION public.get_teacher_analytics TO anon;
|
||||
GRANT EXECUTE ON FUNCTION public.get_top_performers TO anon;
|
||||
GRANT EXECUTE ON FUNCTION public.get_chart_data TO anon;
|
||||
GRANT EXECUTE ON FUNCTION public.get_recent_activities TO anon;
|
||||
|
||||
-- 9. 添加函数注释
|
||||
COMMENT ON FUNCTION public.get_teacher_analytics IS '获取教师统计数据 - 返回教师相关的各种统计信息';
|
||||
COMMENT ON FUNCTION public.get_top_performers IS '获取优秀学员排行榜 - 返回表现优异的学生列表';
|
||||
COMMENT ON FUNCTION public.get_chart_data IS '获取图表数据 - 支持多种类型的统计图表数据';
|
||||
COMMENT ON FUNCTION public.get_recent_activities IS '获取近期活动 - 返回最近的学习活动记录';
|
||||
|
||||
-- 10. 验证函数创建成功
|
||||
SELECT
|
||||
routine_name as function_name,
|
||||
routine_type as type,
|
||||
data_type as return_type,
|
||||
routine_definition as definition_snippet
|
||||
FROM information_schema.routines
|
||||
WHERE routine_schema = 'public'
|
||||
AND routine_name IN ('get_teacher_analytics', 'get_top_performers', 'get_chart_data', 'get_recent_activities')
|
||||
ORDER BY routine_name;
|
||||
|
||||
-- 11. 快速测试所有函数
|
||||
DO $$
|
||||
DECLARE
|
||||
test_result jsonb;
|
||||
BEGIN
|
||||
-- 测试 get_teacher_analytics
|
||||
SELECT public.get_teacher_analytics() INTO test_result;
|
||||
RAISE NOTICE 'get_teacher_analytics 测试结果: %', test_result;
|
||||
|
||||
-- 测试 get_top_performers
|
||||
SELECT public.get_top_performers() INTO test_result;
|
||||
RAISE NOTICE 'get_top_performers 测试结果: %', jsonb_array_length(test_result);
|
||||
|
||||
-- 测试 get_chart_data
|
||||
SELECT public.get_chart_data() INTO test_result;
|
||||
RAISE NOTICE 'get_chart_data 测试结果: %', jsonb_array_length(test_result);
|
||||
|
||||
-- 测试 get_recent_activities
|
||||
SELECT public.get_recent_activities() INTO test_result;
|
||||
RAISE NOTICE 'get_recent_activities 测试结果: %', jsonb_array_length(test_result);
|
||||
|
||||
RAISE NOTICE '所有函数测试完成!';
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 12. 显示成功信息
|
||||
SELECT
|
||||
'Analytics RPC Functions Deployment Completed Successfully!' as status,
|
||||
'All functions are ready for use' as message,
|
||||
now() as deployed_at;
|
||||
Reference in New Issue
Block a user