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

1137 lines
32 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.
-- ===================================================================
-- 消息系统测试数据生成脚本
-- PostgreSQL 15+ 兼容版本
-- 教师ID: 7bf7378e-a027-473e-97ac-3460ed3f170a
-- 学生ID: eed3824b-bba1-4309-8048-19d17367c084
-- ===================================================================
-- 清理现有测试数据
DELETE FROM ak_message_recipients
WHERE message_id IN (
SELECT id FROM ak_messages
WHERE metadata @> '{"test_data": "true"}'
);
DELETE FROM ak_messages
WHERE metadata @> '{"test_data": "true"}';
DELETE FROM ak_message_group_members
WHERE group_id IN (
SELECT id FROM ak_message_groups
WHERE name LIKE '%测试%' OR name LIKE '%训练群%' OR name LIKE '%交流群%'
);
DELETE FROM ak_message_groups
WHERE name LIKE '%测试%' OR name LIKE '%训练群%' OR name LIKE '%交流群%';
-- ===================================================================
-- 1. 创建测试用户消息偏好设置
-- ===================================================================
-- 教师用户消息偏好
INSERT INTO ak_user_message_preferences (
user_id,
global_enabled,
push_enabled,
email_enabled,
type_preferences
) VALUES (
'7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid,
true,
true,
true,
'{
"system": {"enabled": true, "push": true, "email": true},
"device": {"enabled": true, "push": true, "email": false},
"training": {"enabled": true, "push": true, "email": false},
"social": {"enabled": true, "push": true, "email": false},
"assignment": {"enabled": true, "push": true, "email": true},
"achievement": {"enabled": true, "push": true, "email": false},
"chat": {"enabled": true, "push": true, "email": false},
"announcement": {"enabled": true, "push": true, "email": true},
"reminder": {"enabled": true, "push": true, "email": true},
"alert": {"enabled": true, "push": true, "email": true}
}'::jsonb
) ON CONFLICT (user_id) DO UPDATE SET
global_enabled = EXCLUDED.global_enabled,
push_enabled = EXCLUDED.push_enabled,
email_enabled = EXCLUDED.email_enabled,
type_preferences = EXCLUDED.type_preferences,
updated_at = now();
-- 学生用户消息偏好
INSERT INTO ak_user_message_preferences (
user_id,
global_enabled,
push_enabled,
email_enabled,
type_preferences
) VALUES (
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
true,
true,
false,
'{
"system": {"enabled": true, "push": true, "email": false},
"device": {"enabled": true, "push": true, "email": false},
"training": {"enabled": true, "push": true, "email": false},
"social": {"enabled": true, "push": true, "email": false},
"assignment": {"enabled": true, "push": true, "email": false},
"achievement": {"enabled": true, "push": true, "email": false},
"chat": {"enabled": true, "push": true, "email": false},
"announcement": {"enabled": true, "push": true, "email": false},
"reminder": {"enabled": true, "push": true, "email": false},
"alert": {"enabled": true, "push": true, "email": false}
}'::jsonb
) ON CONFLICT (user_id) DO UPDATE SET
global_enabled = EXCLUDED.global_enabled,
push_enabled = EXCLUDED.push_enabled,
email_enabled = EXCLUDED.email_enabled,
type_preferences = EXCLUDED.type_preferences,
updated_at = now();
-- ===================================================================
-- 2. 创建测试群组
-- ===================================================================
-- 班级群组
INSERT INTO ak_message_groups (
id,
name,
description,
group_type,
owner_id,
is_public,
member_limit,
settings
) VALUES (
'f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid,
'高一(1)班运动训练群',
'高一(1)班运动训练讨论群,用于发布训练任务和交流心得',
'class',
'7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid,
false,
50,
'{"allow_file_upload": true, "allow_voice_message": true, "auto_archive_days": 30}'::jsonb
);
-- 师生交流群
INSERT INTO ak_message_groups (
id,
name,
description,
group_type,
owner_id,
is_public,
member_limit,
settings
) VALUES (
'a1b2c3d4-e5f6-7890-abcd-ef1234567890'::uuid,
'师生交流群',
'教师与学生的日常交流群组',
'normal',
'7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid,
false,
100,
'{"allow_file_upload": true, "allow_voice_message": true}'::jsonb
);
-- 添加群组成员
INSERT INTO ak_message_group_members (
group_id,
user_id,
role,
status,
nickname,
notification_enabled
) VALUES
-- 班级群成员
('f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid, '7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid, 'owner', 'active', '李老师', true),
('f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid, 'eed3824b-bba1-4309-8048-19d17367c084'::uuid, 'member', 'active', '张同学', true),
-- 师生交流群成员
('a1b2c3d4-e5f6-7890-abcd-ef1234567890'::uuid, '7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid, 'owner', 'active', '李老师', true),
('a1b2c3d4-e5f6-7890-abcd-ef1234567890'::uuid, 'eed3824b-bba1-4309-8048-19d17367c084'::uuid, 'member', 'active', '张同学', true);
-- ===================================================================
-- 3. 创建测试消息数据
-- ===================================================================
-- 获取消息类型ID的临时变量
WITH message_types AS (
SELECT
id,
code,
ROW_NUMBER() OVER (ORDER BY code) as rn
FROM ak_message_types
),
-- 3.1 系统欢迎消息
system_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'system',
'系统',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'欢迎使用运动训练平台!',
'欢迎来到运动训练监测平台您可以在这里记录训练数据、查看AI分析报告、与老师同学交流。祝您运动愉快',
100,
'{"test_data": "true", "welcome_message": true}'::jsonb,
now() - INTERVAL '2 days'
FROM message_types mt WHERE mt.code = 'system'
RETURNING id, receiver_id
),
system_recipient AS (
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
sm.id,
'user',
sm.receiver_id,
'read',
now() - INTERVAL '2 days',
now() - INTERVAL '1 day'
FROM system_msg sm
RETURNING message_id
),
-- 3.2 设备连接消息
device_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_id,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
device_data,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'device',
gen_random_uuid(),
'智能手环Pro',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'设备连接成功',
'您的智能手环Pro已成功连接电量85%,可以开始记录运动数据了。',
80,
'{"device_name": "智能手环Pro", "battery_level": 85, "firmware_version": "2.1.3", "connection_type": "bluetooth"}'::jsonb,
'{"test_data": "true", "device_type": "wearable"}'::jsonb,
now() - INTERVAL '1 day'
FROM message_types mt WHERE mt.code = 'device'
RETURNING id, receiver_id
),
device_recipient AS (
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
dm.id,
'user',
dm.receiver_id,
'read',
now() - INTERVAL '1 day',
now() - INTERVAL '20 hours'
FROM device_msg dm
RETURNING message_id
),
-- 3.3 设备低电量警告(未读)
device_alert AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_id,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
is_urgent,
device_data,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'device',
gen_random_uuid(),
'智能手环Pro',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'⚠️ 设备电量不足',
'您的智能手环Pro电量仅剩15%,请及时充电以确保正常使用。',
85,
true,
'{"device_name": "智能手环Pro", "battery_level": 15, "estimated_time_left": "2小时"}'::jsonb,
'{"test_data": "true", "alert_type": "low_battery"}'::jsonb,
now() - INTERVAL '2 hours'
FROM message_types mt WHERE mt.code = 'device'
RETURNING id, receiver_id
),
device_alert_recipient AS (
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at
)
SELECT
da.id,
'user',
da.receiver_id,
'delivered',
now() - INTERVAL '2 hours'
FROM device_alert da
RETURNING message_id
),
-- 3.4 训练完成通知
training_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'system',
'训练助手',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'🎉 训练完成!',
'恭喜完成跑步训练用时25分钟消耗180卡路里步数3250步平均心率145 bpm。您的表现很棒继续保持',
70,
'{"test_data": "true", "activity_type": "running", "duration": 25, "calories": 180, "steps": 3250, "avg_heart_rate": 145}'::jsonb,
now() - INTERVAL '3 hours'
FROM message_types mt WHERE mt.code = 'training'
RETURNING id, receiver_id
),
training_recipient AS (
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
tm.id,
'user',
tm.receiver_id,
'read',
now() - INTERVAL '3 hours',
now() - INTERVAL '2 hours'
FROM training_msg tm
RETURNING message_id
),
-- 3.5 教师发布作业通知
assignment_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_id,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
expires_at,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'user',
'7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid,
'李老师',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'新作业:每日运动打卡',
'同学们好本周的运动作业已发布每天完成30分钟有氧运动记录心率和步数数据。截止时间本周日23:59。请按时完成并上传数据。',
75,
'2025-06-22 23:59:00'::timestamp with time zone,
'{"test_data": "true", "assignment_id": "homework_001", "subject": "体育"}'::jsonb,
now() - INTERVAL '1 day'
FROM message_types mt WHERE mt.code = 'assignment'
RETURNING id, receiver_id
),
assignment_recipient AS (
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
am.id,
'user',
am.receiver_id,
'read',
now() - INTERVAL '1 day',
now() - INTERVAL '18 hours'
FROM assignment_msg am
RETURNING message_id
),
-- 3.6 成就解锁通知(未读)
achievement_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'system',
'成就系统',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'🏆 恭喜解锁新成就!',
'恭喜您解锁了"坚持不懈"成就连续7天完成运动打卡获得50积分奖励。继续努力向更高目标前进',
50,
'{"test_data": "true", "achievement_name": "坚持不懈", "points": 50, "days_streak": 7}'::jsonb,
now() - INTERVAL '6 hours'
FROM message_types mt WHERE mt.code = 'achievement'
RETURNING id, receiver_id
),
achievement_recipient AS (
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at
)
SELECT
achm.id,
'user',
achm.receiver_id,
'delivered',
now() - INTERVAL '6 hours'
FROM achievement_msg achm
RETURNING message_id
)
-- 查询插入结果统计
SELECT
'CTE 批量插入完成' as status,
(SELECT COUNT(*) FROM ak_messages WHERE metadata @> '{"test_data": "true"}') as total_messages,
(SELECT COUNT(*) FROM ak_message_recipients mr
JOIN ak_messages m ON mr.message_id = m.id
WHERE m.metadata @> '{"test_data": "true"}') as total_recipients;
-- ===================================================================
-- 4. 创建群组消息
-- ===================================================================
-- 教师群组消息
WITH group_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_id,
sender_name,
receiver_type,
receiver_id,
content,
priority,
conversation_id,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'user',
'7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid,
'李老师',
'group',
'f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid,
'同学们下周一我们将进行体能测试请大家提前做好准备。测试项目包括50米跑、立定跳远、引体向上。有问题随时问我。',
90,
'f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid,
'{"test_data": "true", "group_message": true}'::jsonb,
now() - INTERVAL '4 hours'
FROM ak_message_types mt WHERE mt.code = 'chat'
RETURNING id
),
group_recipients AS (
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
gm.id,
'user',
gmem.user_id,
CASE
WHEN gmem.user_id = 'eed3824b-bba1-4309-8048-19d17367c084'::uuid THEN 'read'
ELSE 'read'
END,
now() - INTERVAL '4 hours',
CASE
WHEN gmem.user_id = 'eed3824b-bba1-4309-8048-19d17367c084'::uuid THEN now() - INTERVAL '3 hours'
ELSE now() - INTERVAL '4 hours'
END
FROM group_msg gm
CROSS JOIN ak_message_group_members gmem
WHERE gmem.group_id = 'f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid
RETURNING message_id, recipient_id
)
-- 学生回复群组消息
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_id,
sender_name,
receiver_type,
receiver_id,
content,
priority,
conversation_id,
parent_message_id,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'张同学',
'group',
'f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid,
'好的老师,我会认真准备的!请问引体向上有什么技巧吗?',
90,
'f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid,
gm.id,
'{"test_data": "true", "group_message": true, "reply": true}'::jsonb,
now() - INTERVAL '3 hours'
FROM group_msg gm
CROSS JOIN ak_message_types mt
WHERE mt.code = 'chat';
-- 为学生回复创建接收记录
WITH reply_msg AS (
SELECT id, receiver_id
FROM ak_messages
WHERE content LIKE '%引体向上有什么技巧%'
AND metadata @> '{"test_data": "true"}'
LIMIT 1
)
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
rm.id,
'user',
gmem.user_id,
'read',
now() - INTERVAL '3 hours',
CASE
WHEN gmem.user_id = '7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid THEN now() - INTERVAL '2 hours'
ELSE now() - INTERVAL '3 hours'
END
FROM reply_msg rm
CROSS JOIN ak_message_group_members gmem
WHERE gmem.group_id = 'f47ac10b-58cc-4372-a567-0e02b2c3d479'::uuid;
-- ===================================================================
-- 5. 创建更多测试消息
-- ===================================================================
-- 教师私信学生(未读)
WITH private_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_id,
sender_name,
receiver_type,
receiver_id,
content,
priority,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'user',
'7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid,
'李老师',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'张同学,我看到你最近的运动数据很不错,心率控制得很好。继续保持这个节奏,相信你的体能会有很大提升。',
90,
'{"test_data": "true", "private_message": true}'::jsonb,
now() - INTERVAL '1 hour'
FROM ak_message_types mt WHERE mt.code = 'chat'
RETURNING id, receiver_id
)
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at
)
SELECT
pm.id,
'user',
pm.receiver_id,
'delivered',
now() - INTERVAL '1 hour'
FROM private_msg pm;
-- 系统公告(广播消息)
WITH announcement_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_name,
receiver_type,
title,
content,
priority,
is_broadcast,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'system',
'运动平台',
'broadcast',
'平台升级通知',
'各位用户运动训练平台将于本周六凌晨2:00-4:00进行系统升级届时将暂停服务。升级后将新增AI运动分析功能敬请期待',
95,
true,
'{"test_data": "true", "maintenance": true, "upgrade": true}'::jsonb,
now() - INTERVAL '12 hours'
FROM ak_message_types mt WHERE mt.code = 'announcement'
RETURNING id
)
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
am.id,
'user',
users.user_id,
'read',
now() - INTERVAL '12 hours',
now() - INTERVAL '10 hours'
FROM announcement_msg am
CROSS JOIN (
VALUES
('7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid),
('eed3824b-bba1-4309-8048-19d17367c084'::uuid)
) AS users(user_id);
-- 运动提醒(未读)
WITH reminder_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
scheduled_at,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'system',
'运动助手',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'⏰ 运动时间到了!',
'根据您的运动计划现在是跑步时间。建议运动30分钟注意热身和拉伸。今天天气不错适合户外运动',
65,
now() - INTERVAL '30 minutes',
'{"test_data": "true", "reminder_type": "exercise", "activity": "running"}'::jsonb,
now() - INTERVAL '30 minutes'
FROM ak_message_types mt WHERE mt.code = 'reminder'
RETURNING id, receiver_id
)
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at
)
SELECT
rm.id,
'user',
rm.receiver_id,
'delivered',
now() - INTERVAL '30 minutes'
FROM reminder_msg rm;
-- 心率异常警报
WITH alert_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_id,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
is_urgent,
device_data,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'device',
gen_random_uuid(),
'智能手环Pro',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'⚠️ 心率异常警报',
'检测到您的心率持续偏高185 bpm已超过安全范围。建议立即停止运动休息并观察。如有不适请及时就医。',
99,
true,
'{"device_name": "智能手环Pro", "heart_rate": 185, "safe_range": "60-180"}'::jsonb,
'{"test_data": "true", "alert_type": "heart_rate", "severity": "high"}'::jsonb,
now() - INTERVAL '10 minutes'
FROM ak_message_types mt WHERE mt.code = 'alert'
RETURNING id, receiver_id
)
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
alm.id,
'user',
alm.receiver_id,
'read',
now() - INTERVAL '10 minutes',
now() - INTERVAL '8 minutes'
FROM alert_msg alm;
-- 社交点赞消息
WITH social_msg AS (
INSERT INTO ak_messages (
id,
message_type_id,
sender_type,
sender_id,
sender_name,
receiver_type,
receiver_id,
title,
content,
priority,
metadata,
created_at
)
SELECT
gen_random_uuid(),
mt.id,
'user',
'7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid,
'李老师',
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'👍 老师为您点赞了',
'李老师为您的运动记录"今日跑步5公里"点赞了,并评论:"坚持得很好,继续加油!"',
60,
'{"test_data": "true", "social_action": "like", "post_id": "post_001"}'::jsonb,
now() - INTERVAL '5 hours'
FROM ak_message_types mt WHERE mt.code = 'social'
RETURNING id, receiver_id
)
INSERT INTO ak_message_recipients (
message_id,
recipient_type,
recipient_id,
status,
delivered_at,
read_at
)
SELECT
sm.id,
'user',
sm.receiver_id,
'read',
now() - INTERVAL '5 hours',
now() - INTERVAL '4 hours'
FROM social_msg sm;
-- ===================================================================
-- 6. 更新消息统计
-- ===================================================================
-- 更新所有测试消息的统计数据
UPDATE ak_messages
SET
total_recipients = (
SELECT COUNT(*)
FROM ak_message_recipients mr
WHERE mr.message_id = ak_messages.id
),
delivered_count = (
SELECT COUNT(*)
FROM ak_message_recipients mr
WHERE mr.message_id = ak_messages.id
AND mr.status IN ('delivered', 'read')
),
read_count = (
SELECT COUNT(*)
FROM ak_message_recipients mr
WHERE mr.message_id = ak_messages.id
AND mr.status = 'read'
),
updated_at = now()
WHERE metadata @> '{"test_data": "true"}';
-- ===================================================================
-- 7. 创建一些历史统计数据
-- ===================================================================
INSERT INTO ak_message_stats (
date_bucket,
hour_bucket,
message_type_id,
sender_type,
total_sent,
total_delivered,
total_read,
total_replied
)
SELECT
date_series.date_bucket,
hour_series.hour_bucket,
mt.id,
sender_types.sender_type,
(FLOOR(RANDOM() * 50) + 10)::INT as total_sent,
(FLOOR(RANDOM() * 45) + 8)::INT as total_delivered,
(FLOOR(RANDOM() * 40) + 5)::INT as total_read,
(FLOOR(RANDOM() * 10) + 1)::INT as total_replied
FROM (
SELECT generate_series(
CURRENT_DATE - INTERVAL '30 days',
CURRENT_DATE - INTERVAL '1 day',
INTERVAL '1 day'
)::DATE as date_bucket
) date_series
CROSS JOIN (
SELECT generate_series(8, 22) as hour_bucket
) hour_series
CROSS JOIN (
SELECT UNNEST(ARRAY['user', 'system', 'device']) as sender_type
) sender_types
CROSS JOIN ak_message_types mt
WHERE mt.is_active = true
AND RANDOM() > 0.3 -- 随机生成70%的数据
ON CONFLICT (date_bucket, COALESCE(hour_bucket, -1), COALESCE(message_type_id::text, ''), COALESCE(sender_type, '')) DO NOTHING;
-- ===================================================================
-- 8. 输出测试数据统计
-- ===================================================================
-- 最终统计报告
WITH stats AS (
SELECT
(SELECT COUNT(*) FROM ak_messages WHERE metadata @> '{"test_data": "true"}') as total_messages,
(SELECT COUNT(*) FROM ak_message_recipients mr
JOIN ak_messages m ON mr.message_id = m.id
WHERE m.metadata @> '{"test_data": "true"}') as total_recipients,
(SELECT COUNT(*) FROM ak_message_recipients mr
JOIN ak_messages m ON mr.message_id = m.id
WHERE m.metadata @> '{"test_data": "true"}'
AND mr.recipient_id = 'eed3824b-bba1-4309-8048-19d17367c084'::uuid
AND mr.status != 'read') as student_unread_count,
(SELECT COUNT(*) FROM ak_message_groups
WHERE name LIKE '%测试%' OR name LIKE '%群%') as test_groups,
(SELECT COUNT(*) FROM ak_message_stats
WHERE created_at >= CURRENT_DATE - INTERVAL '1 day') as stats_records
)
SELECT
'====================================================================' as separator
UNION ALL
SELECT '✅ 测试数据生成完成!' as info
UNION ALL
SELECT '📊 数据统计:' as info
UNION ALL
SELECT ' - 总消息数:' || s.total_messages as info FROM stats s
UNION ALL
SELECT ' - 总接收记录数:' || s.total_recipients as info FROM stats s
UNION ALL
SELECT ' - 学生未读消息数:' || s.student_unread_count as info FROM stats s
UNION ALL
SELECT ' - 测试群组数:' || s.test_groups as info FROM stats s
UNION ALL
SELECT ' - 统计记录数:' || s.stats_records as info FROM stats s
UNION ALL
SELECT '====================================================================' as separator
UNION ALL
SELECT '👥 测试用户:' as info
UNION ALL
SELECT ' - 教师ID: 7bf7378e-a027-473e-97ac-3460ed3f170a' as info
UNION ALL
SELECT ' - 学生ID: eed3824b-bba1-4309-8048-19d17367c084' as info
UNION ALL
SELECT '====================================================================' as separator
UNION ALL
SELECT '🏠 测试群组:' as info
UNION ALL
SELECT ' - 班级群组ID: f47ac10b-58cc-4372-a567-0e02b2c3d479' as info
UNION ALL
SELECT ' - 师生群组ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890' as info
UNION ALL
SELECT '====================================================================' as separator
UNION ALL
SELECT '🎯 包含的消息类型:' as info
UNION ALL
SELECT ' ✓ 系统欢迎消息(已读)' as info
UNION ALL
SELECT ' ✓ 设备连接成功(已读)' as info
UNION ALL
SELECT ' ⚠️ 设备低电量警告(未读)' as info
UNION ALL
SELECT ' ✓ 训练完成通知(已读)' as info
UNION ALL
SELECT ' ✓ 作业发布通知(已读)' as info
UNION ALL
SELECT ' 🏆 成就解锁通知(未读)' as info
UNION ALL
SELECT ' 💬 群组消息和回复(已读)' as info
UNION ALL
SELECT ' 📩 教师私信(未读)' as info
UNION ALL
SELECT ' 📢 系统公告(已读)' as info
UNION ALL
SELECT ' ⏰ 运动提醒(未读)' as info
UNION ALL
SELECT ' 🚨 心率异常警报(已读)' as info
UNION ALL
SELECT ' 👍 社交点赞消息(已读)' as info
UNION ALL
SELECT '====================================================================' as separator;
-- ===================================================================
-- 9. 测试查询示例(注释形式)
-- ===================================================================
/*
-- 查询学生的所有消息(按时间倒序)
SELECT
m.title,
m.content,
mt.name as message_type,
m.sender_name,
mr.status,
m.created_at,
m.is_urgent,
m.priority
FROM ak_messages m
JOIN ak_message_types mt ON m.message_type_id = mt.id
JOIN ak_message_recipients mr ON m.id = mr.message_id
WHERE mr.recipient_id = 'eed3824b-bba1-4309-8048-19d17367c084'::uuid
AND mr.recipient_type = 'user'
AND m.metadata @> '{"test_data": "true"}'
ORDER BY m.created_at DESC;
-- 查询学生未读消息
SELECT
m.title,
m.content,
mt.name as message_type,
m.sender_name,
m.created_at,
m.is_urgent,
m.priority
FROM ak_messages m
JOIN ak_message_types mt ON m.message_type_id = mt.id
JOIN ak_message_recipients mr ON m.id = mr.message_id
WHERE mr.recipient_id = 'eed3824b-bba1-4309-8048-19d17367c084'::uuid
AND mr.recipient_type = 'user'
AND mr.status != 'read'
AND m.metadata @> '{"test_data": "true"}'
ORDER BY m.priority DESC, m.created_at DESC;
-- 查询教师发送的消息
SELECT
m.title,
m.content,
mt.name as message_type,
m.receiver_type,
m.created_at,
m.total_recipients,
m.read_count
FROM ak_messages m
JOIN ak_message_types mt ON m.message_type_id = mt.id
WHERE m.sender_id = '7bf7378e-a027-473e-97ac-3460ed3f170a'::uuid
AND m.metadata @> '{"test_data": "true"}'
ORDER BY m.created_at DESC;
-- 查询群组消息
SELECT
m.content,
m.sender_name,
mg.name as group_name,
m.created_at,
CASE WHEN m.parent_message_id IS NOT NULL THEN '回复' ELSE '原始消息' END as message_type
FROM ak_messages m
JOIN ak_message_groups mg ON m.receiver_id = mg.id
WHERE m.receiver_type = 'group'
AND m.metadata @> '{"test_data": "true"}'
ORDER BY m.created_at DESC;
-- 查询设备消息
SELECT
m.title,
m.content,
m.device_data,
m.is_urgent,
mr.status,
m.created_at
FROM ak_messages m
JOIN ak_message_recipients mr ON m.id = mr.message_id
WHERE m.sender_type = 'device'
AND mr.recipient_id = 'eed3824b-bba1-4309-8048-19d17367c084'::uuid
AND m.metadata @> '{"test_data": "true"}'
ORDER BY m.created_at DESC;
-- 查询未读消息统计
SELECT
mt.name as message_type,
COUNT(*) as unread_count
FROM ak_message_recipients mr
JOIN ak_messages m ON mr.message_id = m.id
JOIN ak_message_types mt ON m.message_type_id = mt.id
WHERE mr.recipient_id = 'eed3824b-bba1-4309-8048-19d17367c084'::uuid
AND mr.recipient_type = 'user'
AND mr.status != 'read'
AND m.metadata @> '{"test_data": "true"}'
GROUP BY mt.name, mt.priority
ORDER BY mt.priority DESC;
-- 使用系统函数查询未读消息统计
SELECT * FROM get_unread_message_count('eed3824b-bba1-4309-8048-19d17367c084'::uuid);
-- 标记消息为已读的示例
SELECT mark_message_read(
(SELECT id FROM ak_messages WHERE title = '⚠️ 设备电量不足' AND metadata @> '{"test_data": "true"}' LIMIT 1),
'eed3824b-bba1-4309-8048-19d17367c084'::uuid
);
-- 发送新消息的示例
SELECT send_message(
'system',
'system',
NULL,
'user',
'eed3824b-bba1-4309-8048-19d17367c084'::uuid,
'测试消息',
'这是一条通过函数发送的测试消息',
NULL,
NULL,
50,
'{"test_data": "true", "manual_test": true}'::jsonb
);
*/