# 快速修复 Analytics RPC 函数冲突问题
## 🚨 错误原因
```
ERROR: 42P13: cannot change return type of existing function
HINT: Use DROP FUNCTION get_recent_activities(uuid,integer) first.
```
这个错误表明数据库中已经存在同名但返回类型不同的函数。
## ✅ 解决方案
### 步骤 1: 使用修复版 SQL 文件
执行 `analytics_rpc_fixed.sql` 文件,该文件会:
1. **先删除所有可能存在的旧函数**
2. **重新创建所有函数**
3. **验证创建结果**
### 步骤 2: 在 Supabase SQL Editor 中执行
```sql
-- 复制 analytics_rpc_fixed.sql 中的所有内容到 Supabase SQL Editor
-- 然后点击执行
```
### 步骤 3: 验证函数创建成功
执行后应该看到类似这样的消息:
```
NOTICE: 成功创建 4 个函数
NOTICE: ✅ 所有 Analytics RPC 函数创建成功!
```
### 步骤 4: 检查函数列表
```sql
-- 验证函数是否正确创建
SELECT
routine_name,
routine_type,
data_type
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;
```
应该看到 4 个函数都返回 `jsonb` 类型。
## 🔧 主要修复内容
### 1. 明确删除旧函数
```sql
DROP FUNCTION IF EXISTS public.get_recent_activities(uuid, integer);
-- 删除所有可能存在的旧版本函数
```
### 2. 重命名参数避免冲突
```sql
-- 原来
"limit" integer DEFAULT 20
-- 修改为
activity_limit integer DEFAULT 20
```
### 3. 重命名 chart_type 参数
```sql
-- 原来使用了保留字 "type"
"type" text DEFAULT 'completion_rate'
-- 修改为
chart_type text DEFAULT 'completion_rate'
```
### 4. 统一返回类型
所有函数都返回 `jsonb` 类型,确保一致性。
## 🧪 测试函数
创建成功后,可以测试函数调用:
```sql
-- 测试统计数据
SELECT public.get_teacher_analytics();
-- 测试优秀学员
SELECT public.get_top_performers();
-- 测试图表数据
SELECT public.get_chart_data();
-- 测试近期活动
SELECT public.get_recent_activities();
```
## 📱 前端调用
修复后,Analytics 页面应该能正常调用:
```vue
```
## ⚠️ 注意事项
1. **完全执行**: 确保整个 SQL 文件都执行完成
2. **权限检查**: 确认函数权限正确授予
3. **错误监控**: 查看执行过程中是否有其他错误
执行成功后,Analytics 页面将能够正常加载并显示测试数据。