-- ============================================================ -- 丹阳公益婚恋服务平台 — Demo Seed 最终版(单次事务,纯 SQL) -- ============================================================ BEGIN; -- 1. 组织 INSERT INTO organizations (id, name, type, contact_name, status) VALUES (gen_random_uuid(), '丹阳市妇女联合会', 'women_federation', '张丽华', 'active'), (gen_random_uuid(), '丹阳市总工会', 'trade_union', '李明远', 'active'), (gen_random_uuid(), '丹阳市慈善基金会', 'charity_center', '王秀英', 'active'); -- 2. 工作人员(V1.0原有 + V1.1新增) INSERT INTO operators (id, organization_id, display_id, name, username, password_hash, status) SELECT gen_random_uuid(), id, 'HN20261019001', '陈主任', 'admin', '$2a$10$rKkmfph0xE1zQgqbBteLhO34H64Qt7ZxNDevd/P00inoKhA6mPvTG', 'active' FROM organizations WHERE type='women_federation' UNION ALL SELECT gen_random_uuid(), id, 'HN20261019002', '红娘小王', 'wanghongniang', '$2a$10$rKkmfph0xE1zQgqbBteLhO34H64Qt7ZxNDevd/P00inoKhA6mPvTG', 'active' FROM organizations WHERE type='women_federation' UNION ALL SELECT gen_random_uuid(), id, 'HN20261019003', '审核员小张', 'reviewer01', '$2a$10$rKkmfph0xE1zQgqbBteLhO34H64Qt7ZxNDevd/P00inoKhA6mPvTG', 'active' FROM organizations WHERE type='charity_center' UNION ALL SELECT gen_random_uuid(), id, 'HN20261019004', '活动管理员赵', 'activitymgr','$2a$10$rKkmfph0xE1zQgqbBteLhO34H64Qt7ZxNDevd/P00inoKhA6mPvTG', 'active' FROM organizations WHERE type='trade_union' -- V1.1 新增演示操作员 UNION ALL SELECT gen_random_uuid(), id, 'HN20261019005', '服务站小李', 'stationop', '$2a$10$rKkmfph0xE1zQgqbBteLhO34H64Qt7ZxNDevd/P00inoKhA6mPvTG', 'active' FROM organizations WHERE type='women_federation' UNION ALL SELECT gen_random_uuid(), id, 'HN20261019006', '咨询师小周', 'counselor', '$2a$10$rKkmfph0xE1zQgqbBteLhO34H64Qt7ZxNDevd/P00inoKhA6mPvTG', 'active' FROM organizations WHERE type='charity_center' UNION ALL SELECT gen_random_uuid(), id, 'HN20261019007', '内容编辑小吴', 'contenteditor','$2a$10$rKkmfph0xE1zQgqbBteLhO34H64Qt7ZxNDevd/P00inoKhA6mPvTG', 'active' FROM organizations WHERE type='women_federation'; -- 操作员角色绑定(V1.0原有 + V1.1新增) INSERT INTO operator_roles (operator_id, role_id) -- V1.0: admin = super_admin + platform_admin SELECT o.id, '00000000-0000-0000-0000-000000000001'::uuid FROM operators o WHERE username='admin' UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000002'::uuid FROM operators o WHERE username='admin' -- V1.0: wanghongniang = matchmaker + activity_manager UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000005'::uuid FROM operators o WHERE username='wanghongniang' UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000006'::uuid FROM operators o WHERE username='wanghongniang' -- V1.0: reviewer01 = reviewer + risk_operator UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000004'::uuid FROM operators o WHERE username='reviewer01' UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000007'::uuid FROM operators o WHERE username='reviewer01' -- V1.0: activitymgr = activity_manager + volunteer UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000006'::uuid FROM operators o WHERE username='activitymgr' UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000008'::uuid FROM operators o WHERE username='activitymgr' -- V1.1: stationop = service_station_operator UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000010'::uuid FROM operators o WHERE username='stationop' -- V1.1: counselor = counselor UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000011'::uuid FROM operators o WHERE username='counselor' -- V1.1: contenteditor = content_editor UNION ALL SELECT o.id, '00000000-0000-0000-0000-000000000013'::uuid FROM operators o WHERE username='contenteditor'; -- 3. 用户 + 资料 + 偏好 + 实名 + 兴趣 + 隐私 + 照片(一次性生成UUID并关联) CREATE TEMP TABLE user_data ON COMMIT DROP AS WITH demo_users AS ( INSERT INTO users (id, wechat_openid, account_status, relationship_status, recommendation_enabled, created_at) VALUES (gen_random_uuid(),'demo_openid_f01','normal','searching',true,'2026-03-15T10:00:00Z'), (gen_random_uuid(),'demo_openid_f02','normal','searching',true,'2026-03-20T14:30:00Z'), (gen_random_uuid(),'demo_openid_f03','normal','searching',true,'2026-04-01T09:15:00Z'), (gen_random_uuid(),'demo_openid_f04','normal','paused',true,'2026-04-10T16:00:00Z'), (gen_random_uuid(),'demo_openid_f05','normal','searching',true,'2026-05-01T11:20:00Z'), (gen_random_uuid(),'demo_openid_f06','normal','searching',true,'2026-05-15T08:45:00Z'), (gen_random_uuid(),'demo_openid_m01','normal','searching',true,'2026-03-10T09:00:00Z'), (gen_random_uuid(),'demo_openid_m02','normal','getting_to_know',true,'2026-03-25T13:00:00Z'), (gen_random_uuid(),'demo_openid_m03','normal','searching',true,'2026-04-05T15:30:00Z'), (gen_random_uuid(),'demo_openid_m04','normal','searching',true,'2026-04-20T10:00:00Z'), (gen_random_uuid(),'demo_openid_m05','normal','matched_successfully',true,'2026-05-01T14:00:00Z'), (gen_random_uuid(),'demo_openid_m06','normal','searching',true,'2026-05-10T16:30:00Z') RETURNING id, wechat_openid ), user_map AS ( SELECT id, wechat_openid, CASE wechat_openid WHEN 'demo_openid_f01' THEN 'f01' WHEN 'demo_openid_f02' THEN 'f02' WHEN 'demo_openid_f03' THEN 'f03' WHEN 'demo_openid_f04' THEN 'f04' WHEN 'demo_openid_f05' THEN 'f05' WHEN 'demo_openid_f06' THEN 'f06' WHEN 'demo_openid_m01' THEN 'm01' WHEN 'demo_openid_m02' THEN 'm02' WHEN 'demo_openid_m03' THEN 'm03' WHEN 'demo_openid_m04' THEN 'm04' WHEN 'demo_openid_m05' THEN 'm05' WHEN 'demo_openid_m06' THEN 'm06' END as alias FROM demo_users ), prepared_user_data AS ( SELECT id, wechat_openid, alias, CASE alias WHEN 'f01' THEN '小芳' WHEN 'f02' THEN '晓燕' WHEN 'f03' THEN '婷婷' WHEN 'f04' THEN '美玲' WHEN 'f05' THEN '慧琴' WHEN 'f06' THEN '秀英' WHEN 'm01' THEN '张伟' WHEN 'm02' THEN '李强' WHEN 'm03' THEN '王磊' WHEN 'm04' THEN '赵明' WHEN 'm05' THEN '孙浩' WHEN 'm06' THEN '周洋' END as display_name, CASE WHEN alias LIKE 'f%' THEN 'female' ELSE 'male' END as gender, CASE alias WHEN 'f01' THEN '1995-06-15' WHEN 'f02' THEN '1993-09-20' WHEN 'f03' THEN '1998-02-10' WHEN 'f04' THEN '1990-11-05' WHEN 'f05' THEN '1996-07-22' WHEN 'f06' THEN '1992-04-18' WHEN 'm01' THEN '1992-01-10' WHEN 'm02' THEN '1990-08-25' WHEN 'm03' THEN '1997-12-03' WHEN 'm04' THEN '1988-05-30' WHEN 'm05' THEN '1994-03-14' WHEN 'm06' THEN '1999-08-08' END as birth_date, CASE alias WHEN 'f01' THEN 162 WHEN 'f02' THEN 165 WHEN 'f03' THEN 158 WHEN 'f04' THEN 160 WHEN 'f05' THEN 163 WHEN 'f06' THEN 157 WHEN 'm01' THEN 175 WHEN 'm02' THEN 178 WHEN 'm03' THEN 180 WHEN 'm04' THEN 172 WHEN 'm05' THEN 182 WHEN 'm06' THEN 176 END as height_cm, CASE WHEN alias IN ('f01','f02','f04','f05','m01','m02','m04','m05') THEN '321181' WHEN alias IN ('f03','m03') THEN '321100' WHEN alias='m06' THEN '320500' END as region_code, CASE WHEN alias IN ('f01','f02','f04','f05','m01','m02','m04','m05') THEN '丹阳' WHEN alias IN ('f03','m03') THEN '镇江' WHEN alias='m06' THEN '苏州' END as region_name, CASE alias WHEN 'f02' THEN 'divorced' WHEN 'f06' THEN 'widowed' ELSE 'never_married' END as marital_status, CASE alias WHEN 'f01' THEN 'bachelor' WHEN 'f02' THEN 'college' WHEN 'f03' THEN 'master' WHEN 'f04' THEN 'senior_high' WHEN 'f05' THEN 'bachelor' WHEN 'f06' THEN 'junior_high' WHEN 'm01' THEN 'bachelor' WHEN 'm02' THEN 'master' WHEN 'm03' THEN 'college' WHEN 'm04' THEN 'senior_high' WHEN 'm05' THEN 'bachelor' WHEN 'm06' THEN 'master' END as education_code, CASE alias WHEN 'f01' THEN 'clerical' WHEN 'f02' THEN 'teacher' WHEN 'f03' THEN 'designer' WHEN 'f04' THEN 'factory' WHEN 'f05' THEN 'nurse' WHEN 'f06' THEN 'farmer' WHEN 'm01' THEN 'engineer' WHEN 'm02' THEN 'manager' WHEN 'm03' THEN 'programmer' WHEN 'm04' THEN 'sales' WHEN 'm05' THEN 'doctor' WHEN 'm06' THEN 'researcher' END as occupation_code, CASE alias WHEN 'f03' THEN 'sometimes' WHEN 'f06' THEN 'often' WHEN 'm02' THEN 'sometimes' WHEN 'm04' THEN 'often' WHEN 'm05' THEN 'sometimes' ELSE 'never' END as smoking, CASE alias WHEN 'f03' THEN 'often' WHEN 'f06' THEN 'often' WHEN 'm02' THEN 'often' WHEN 'm04' THEN 'often' ELSE 'sometimes' END as drinking, CASE WHEN alias IN ('f03','m06') THEN '否' ELSE '是' END as long_term, CASE WHEN alias IN ('f03','m06') THEN '否' ELSE '是' END as future, CASE WHEN alias IN ('f03','m06') THEN '恋爱' ELSE '结婚' END as goal, CASE alias WHEN 'f01' THEN 90 WHEN 'f02' THEN 95 WHEN 'f03' THEN 85 WHEN 'f04' THEN 70 WHEN 'f05' THEN 92 WHEN 'f06' THEN 60 WHEN 'm01' THEN 88 WHEN 'm02' THEN 95 WHEN 'm03' THEN 82 WHEN 'm04' THEN 75 WHEN 'm05' THEN 97 WHEN 'm06' THEN 80 END as completion FROM user_map ) SELECT * FROM prepared_user_data; INSERT INTO user_profiles (user_id, display_name, gender, birth_date, height_cm, region_code, region_name, marital_status, children_status, education_code, occupation_code, smoking_status, drinking_status, long_term_danyang, future_danyang, relationship_goal, profile_completion, profile_status) SELECT id, display_name, gender, birth_date::date, height_cm, region_code, region_name, marital_status, 'none', education_code, occupation_code, smoking, drinking, long_term, future, goal, completion, 'approved' FROM user_data; -- 偏好 INSERT INTO user_preferences (user_id, min_age, max_age, age_priority, min_height_cm, max_height_cm, height_priority, region_scope, region_priority, marital_statuses, marital_priority, min_education_code, education_priority) SELECT id, CASE WHEN alias LIKE 'f%' THEN 28 WHEN alias LIKE 'm%' THEN 22 ELSE 25 END, CASE WHEN alias LIKE 'f%' THEN 40 WHEN alias LIKE 'm%' THEN 38 ELSE 35 END, 'required', CASE WHEN alias LIKE 'f%' THEN 155 WHEN alias LIKE 'm%' THEN 170 ELSE 158 END, CASE WHEN alias LIKE 'f%' THEN 172 WHEN alias LIKE 'm%' THEN 188 ELSE 185 END, 'preferred', '["321181","321100"]', 'required', '["never_married"]', 'required', CASE alias WHEN 'f02' THEN 'college' WHEN 'm02' THEN 'college' WHEN 'f01' THEN 'bachelor' WHEN 'm01' THEN 'bachelor' WHEN 'm05' THEN 'bachelor' ELSE NULL END, 'preferred' FROM user_data; -- 实名认证 INSERT INTO user_identities (id, user_id, real_name_enc, id_number_enc, id_number_hash, gender, birth_date, verification_status, provider, verified_at) SELECT gen_random_uuid(), id, encode(('demo_enc_'||alias)::bytea,'escape'), encode(('demo_id_'||alias)::bytea,'escape'), 'demo_sha256_'||alias, gender, birth_date::date, 'verified', 'mock', NOW()-INTERVAL '1 day' FROM user_data; -- 兴趣 WITH interests AS ( SELECT ud.id as user_id, ic.code FROM user_data ud CROSS JOIN (VALUES ('reading'),('cooking'),('travel'),('sports'),('music'),('outdoor'), ('photography'),('dance'),('movie'),('pets'),('fitness'),('charity'),('gardening'), ('gaming'),('hiking'),('coding'),('cars'),('running'),('research')) ic(code) WHERE (ud.alias='f01' AND ic.code IN ('reading','cooking','travel')) OR (ud.alias='f02' AND ic.code IN ('sports','music','outdoor')) OR (ud.alias='f03' AND ic.code IN ('photography','dance','movie')) OR (ud.alias='f04' AND ic.code IN ('pets','cooking')) OR (ud.alias='f05' AND ic.code IN ('reading','fitness','charity')) OR (ud.alias='f06' AND ic.code IN ('gardening','cooking')) OR (ud.alias='m01' AND ic.code IN ('sports','gaming','travel')) OR (ud.alias='m02' AND ic.code IN ('reading','investment','hiking')) OR (ud.alias='m03' AND ic.code IN ('gaming','music','coding')) OR (ud.alias='m04' AND ic.code IN ('cars','cooking')) OR (ud.alias='m05' AND ic.code IN ('running','reading','charity')) OR (ud.alias='m06' AND ic.code IN ('research','travel','photography')) ) INSERT INTO user_interests (user_id, interest_code) SELECT user_id, code FROM interests; -- 隐私设置 INSERT INTO user_privacy_settings (user_id, visible_in_recommendations, visible_in_search, show_occupation, show_lifestyle_photos, receive_activity_recommendations, accept_matchmaker_recommendations) SELECT id, true, CASE WHEN alias IN ('f03','f06','m04') THEN false ELSE true END, CASE WHEN alias IN ('f02','f04','m02','m03') THEN false ELSE true END, CASE WHEN alias IN ('f02','m02','m03') THEN false ELSE true END, CASE WHEN alias IN ('f05','m03') THEN false ELSE true END, CASE WHEN alias='f03' THEN false ELSE true END FROM user_data; -- 照片 WITH photo_source AS ( SELECT id, alias FROM user_data ) INSERT INTO user_photos (id, user_id, file_key, photo_type, sort_order, review_status) SELECT gen_random_uuid(), id, 'photos/demo/'||alias||'/avatar.jpg', 'avatar', 0, 'approved' FROM photo_source UNION ALL SELECT gen_random_uuid(), id, 'photos/demo/'||alias||'/lifestyle1.jpg', 'lifestyle', 1, 'approved' FROM photo_source; -- ============================================================ -- 4. 审核任务 -- ============================================================ INSERT INTO review_tasks (id, user_id, review_type, status, assigned_operator_id, submitted_at, started_at, completed_at, final_comment, version, display_id) SELECT gen_random_uuid(), ud.id, 'initial_profile', 'approved', (SELECT id FROM operators WHERE username='reviewer01'), NOW()-INTERVAL '60 days', NOW()-INTERVAL '59 days', NOW()-INTERVAL '58 days', '资料完整', 1, 'RW'||LPAD(ROW_NUMBER() OVER (ORDER BY ud.alias)::text, 11, '0') FROM user_data ud WHERE ud.alias IN ('f01','f02','f03','m01','m02','m03','m05'); -- ============================================================ -- 5. 用户关系 -- ============================================================ WITH f01 AS (SELECT id FROM user_data WHERE alias='f01'), f02 AS (SELECT id FROM user_data WHERE alias='f02'), f03 AS (SELECT id FROM user_data WHERE alias='f03'), f04 AS (SELECT id FROM user_data WHERE alias='f04'), f05 AS (SELECT id FROM user_data WHERE alias='f05'), f06 AS (SELECT id FROM user_data WHERE alias='f06'), m01 AS (SELECT id FROM user_data WHERE alias='m01'), m02 AS (SELECT id FROM user_data WHERE alias='m02'), m03 AS (SELECT id FROM user_data WHERE alias='m03'), m04 AS (SELECT id FROM user_data WHERE alias='m04'), m05 AS (SELECT id FROM user_data WHERE alias='m05'), m06 AS (SELECT id FROM user_data WHERE alias='m06') INSERT INTO user_relations (id, user_id, target_user_id, relation_type, created_at) VALUES (gen_random_uuid(), (SELECT id FROM f01), (SELECT id FROM m01), 'liked', '2026-06-01T10:00:00Z'), (gen_random_uuid(), (SELECT id FROM m01), (SELECT id FROM f01), 'liked', '2026-06-01T10:05:00Z'), (gen_random_uuid(), (SELECT id FROM f02), (SELECT id FROM m02), 'liked', '2026-06-02T14:00:00Z'), (gen_random_uuid(), (SELECT id FROM f03), (SELECT id FROM m03), 'liked', '2026-06-03T09:00:00Z'), (gen_random_uuid(), (SELECT id FROM m03), (SELECT id FROM f03), 'liked', '2026-06-03T09:30:00Z'), (gen_random_uuid(), (SELECT id FROM m04), (SELECT id FROM f02), 'liked', '2026-06-04T11:00:00Z'), (gen_random_uuid(), (SELECT id FROM f04), (SELECT id FROM m04), 'passed', '2026-06-04T12:00:00Z'), (gen_random_uuid(), (SELECT id FROM f05), (SELECT id FROM m05), 'liked', '2026-06-05T10:00:00Z'), (gen_random_uuid(), (SELECT id FROM m05), (SELECT id FROM f05), 'liked', '2026-06-05T10:05:00Z'), (gen_random_uuid(), (SELECT id FROM m06), (SELECT id FROM f01), 'liked', '2026-06-06T14:00:00Z'), (gen_random_uuid(), (SELECT id FROM f04), (SELECT id FROM m06), 'passed', '2026-06-06T15:00:00Z'), (gen_random_uuid(), (SELECT id FROM f06), (SELECT id FROM m04), 'blocked', '2026-06-07T09:00:00Z'), (gen_random_uuid(), (SELECT id FROM m02), (SELECT id FROM f03), 'passed', '2026-06-07T10:00:00Z'); -- ============================================================ -- 6. Match -- ==================================================== WITH f01 AS (SELECT id FROM user_data WHERE alias='f01'), f03 AS (SELECT id FROM user_data WHERE alias='f03'), f05 AS (SELECT id FROM user_data WHERE alias='f05'), m01 AS (SELECT id FROM user_data WHERE alias='m01'), m03 AS (SELECT id FROM user_data WHERE alias='m03'), m05 AS (SELECT id FROM user_data WHERE alias='m05') INSERT INTO matches (id, user_a_id, user_b_id, status, source, matched_at) VALUES (gen_random_uuid(), (SELECT id FROM f01), (SELECT id FROM m01), 'active', 'user_like', '2026-06-01T10:05:00Z'), (gen_random_uuid(), (SELECT id FROM f03), (SELECT id FROM m03), 'active', 'user_like', '2026-06-03T09:30:00Z'), (gen_random_uuid(), (SELECT id FROM f05), (SELECT id FROM m05), 'successful', 'user_like', '2026-06-05T10:05:00Z'); -- ============================================================ -- 7. 成功牵手请求 -- ==================================================== WITH match_success AS (SELECT id FROM matches WHERE status='successful' LIMIT 1), match_active AS (SELECT id FROM matches WHERE status='active' ORDER BY created_at LIMIT 1), f01 AS (SELECT id FROM user_data WHERE alias='f01'), m05 AS (SELECT id FROM user_data WHERE alias='m05'), f05 AS (SELECT id FROM user_data WHERE alias='f05') INSERT INTO relationship_success_requests (id, match_id, initiated_by, status, confirmed_by, created_at, resolved_at) VALUES (gen_random_uuid(), (SELECT id FROM match_success), (SELECT id FROM f05), 'confirmed', (SELECT id FROM m05), '2026-07-01T10:00:00Z', '2026-07-01T10:30:00Z'), (gen_random_uuid(), (SELECT id FROM match_active), (SELECT id FROM f01), 'pending', NULL, '2026-07-15T14:00:00Z', NULL); -- ============================================================ -- 8. Conversations & Messages -- ==================================================== CREATE TEMP TABLE _conv_result ON COMMIT DROP AS SELECT gen_random_uuid() as id, id AS match_id FROM matches WHERE status IN ('active','successful') ORDER BY created_at; INSERT INTO conversations (id, match_id, status, last_message_at) SELECT id, match_id, 'active', NOW()-INTERVAL '5 days' FROM _conv_result; -- members WITH _match_pairs AS ( SELECT m.id AS match_id, m.user_a_id, m.user_b_id FROM matches m JOIN _conv_result c ON c.match_id=m.id ) INSERT INTO conversation_members (conversation_id, user_id, unread_count, can_send, joined_at) SELECT (SELECT id FROM _conv_result WHERE match_id=(SELECT match_id FROM _match_pairs WHERE user_a_id=up.user_a_id LIMIT 1)), up.user_a_id, 0, true, NOW() FROM _match_pairs up UNION ALL SELECT (SELECT id FROM _conv_result WHERE match_id=(SELECT match_id FROM _match_pairs WHERE user_b_id=up.user_b_id LIMIT 1)), up.user_b_id, 0, true, NOW() FROM _match_pairs up; -- messages INSERT INTO messages (id, conversation_id, sender_id, message_type, content, status, risk_level, created_at) VALUES (gen_random_uuid(), (SELECT id FROM conversations ORDER BY created_at LIMIT 1), (SELECT id FROM user_data WHERE alias='f01'), 'text', '你好!看到你的资料觉得挺合适的~', 'sent', 'normal', '2026-06-15T14:00:00Z'), (gen_random_uuid(), (SELECT id FROM conversations ORDER BY created_at LIMIT 1), (SELECT id FROM user_data WHERE alias='m01'), 'text', '你好!谢谢你的喜欢,我也觉得挺有缘的', 'sent', 'normal', '2026-06-15T14:05:00Z'), (gen_random_uuid(), (SELECT id FROM conversations ORDER BY created_at LIMIT 1), (SELECT id FROM user_data WHERE alias='f01'), 'text', '你也在丹阳工作吗?平时喜欢做些什么?', 'sent', 'normal', '2026-06-15T14:10:00Z'), (gen_random_uuid(), (SELECT id FROM conversations ORDER BY created_at OFFSET 1 LIMIT 1), (SELECT id FROM user_data WHERE alias='m03'), 'text', '嗨,你好!很高兴认识你', 'sent', 'normal', '2026-07-05T19:30:00Z'), (gen_random_uuid(), (SELECT id FROM conversations ORDER BY created_at OFFSET 1 LIMIT 1), (SELECT id FROM user_data WHERE alias='f03'), 'text', '你好呀!我平时喜欢拍照和跳舞,你呢?', 'sent', 'normal', '2026-07-05T19:35:00Z'), (gen_random_uuid(), (SELECT id FROM conversations ORDER BY created_at OFFSET 2 LIMIT 1), (SELECT id FROM user_data WHERE alias='m05'), 'text', '你好,很高兴认识你!', 'sent', 'normal', '2026-06-10T10:00:00Z'); -- update last_message_at UPDATE conversations SET last_message_at = (SELECT MAX(created_at) FROM messages WHERE messages.conversation_id = conversations.id); -- ============================================================ -- 9. 推荐记录 -- ==================================================== WITH f01 AS (SELECT id FROM user_data WHERE alias='f01'), f03 AS (SELECT id FROM user_data WHERE alias='f03'), f05 AS (SELECT id FROM user_data WHERE alias='f05'), m01 AS (SELECT id FROM user_data WHERE alias='m01'), m03 AS (SELECT id FROM user_data WHERE alias='m03'), m05 AS (SELECT id FROM user_data WHERE alias='m05'), m06 AS (SELECT id FROM user_data WHERE alias='m06') INSERT INTO recommendation_records (id, user_id, target_user_id, source, score, level, shown_at, action, action_at, rule_version) VALUES (gen_random_uuid(), (SELECT id FROM f01), (SELECT id FROM m01), 'daily', 82.50, 'high', '2026-05-28T10:00:00Z', 'liked', '2026-06-01T10:00:00Z', 1), (gen_random_uuid(), (SELECT id FROM f01), (SELECT id FROM m03), 'daily', 70.00, 'medium', '2026-05-28T10:00:00Z', 'passed','2026-05-28T10:01:00Z', 1), (gen_random_uuid(), (SELECT id FROM m01), (SELECT id FROM f01), 'daily', 85.00, 'high', '2026-05-28T11:00:00Z', 'liked', '2026-06-01T10:05:00Z', 1), (gen_random_uuid(), (SELECT id FROM f03), (SELECT id FROM m03), 'daily', 78.00, 'high', '2026-06-01T09:00:00Z', 'liked', '2026-06-03T09:30:00Z', 1), (gen_random_uuid(), (SELECT id FROM m03), (SELECT id FROM f03), 'daily', 75.00, 'high', '2026-06-01T09:30:00Z', 'liked', '2026-06-03T09:30:00Z', 1), (gen_random_uuid(), (SELECT id FROM f05), (SELECT id FROM m05), 'daily', 88.00, 'high', '2026-06-01T10:00:00Z', 'liked', '2026-06-05T10:00:00Z', 1), (gen_random_uuid(), (SELECT id FROM m05), (SELECT id FROM f05), 'daily', 86.00, 'high', '2026-06-01T10:30:00Z', 'liked', '2026-06-05T10:05:00Z', 1), (gen_random_uuid(), (SELECT id FROM m06), (SELECT id FROM f01), 'daily', 62.00, 'medium','2026-06-06T14:00:00Z', 'liked', '2026-06-06T14:00:00Z', 1); -- ============================================================ -- 10. 相亲活动 -- ==================================================== WITH women_org AS (SELECT id FROM organizations WHERE type='women_federation' LIMIT 1), trade_org AS (SELECT id FROM organizations WHERE type='trade_union' LIMIT 1), mgr AS (SELECT id FROM operators WHERE username='activitymgr' LIMIT 1) INSERT INTO activities (id, title, display_id, description, organizer_org_id, coorganizer_text, start_at, end_at, location_name, location_address, male_limit, female_limit, total_limit, min_age, max_age, registration_start_at, registration_end_at, need_review, status, created_by) VALUES (gen_random_uuid(), '丹阳公益单身联谊会(夏季场)', 'HD20261019001', '面向丹阳市区及周边乡镇的单身青年,由妇联、工会联合主办。', (SELECT id FROM women_org), '丹阳市总工会、丹阳市慈善基金会', '2026-08-15T14:00:00Z', '2026-08-15T17:30:00Z', '丹阳市文化馆多功能厅', '丹阳市丹北路168号', 15, 15, 30, 22, 40, '2026-07-01T00:00:00Z', '2026-08-10T23:59:59Z', true, 'registration_open', (SELECT id FROM mgr)), (gen_random_uuid(), '七夕特别活动·丹阳缘来是你', 'HD20261019002', '七夕节特别策划,浪漫主题相亲活动。', (SELECT id FROM trade_org), '丹阳市新时代文明实践中心', '2026-08-29T15:00:00Z', '2026-08-29T18:00:00Z', '丹阳大剧院报告厅', '丹阳市书院路28号', 20, 20, 40, 25, 45, '2026-08-01T00:00:00Z', '2026-08-25T23:59:59Z', true, 'draft', (SELECT id FROM mgr)); -- ============================================================ -- 11. 活动报名 -- ==================================================== WITH act1 AS (SELECT id FROM activities WHERE title LIKE '%夏季%' LIMIT 1), mgr2 AS (SELECT id FROM operators WHERE username='activitymgr' LIMIT 1) INSERT INTO activity_registrations (id, activity_id, user_id, status, registered_at, reviewed_by, reviewed_at, checkin_status) SELECT gen_random_uuid(), (SELECT id FROM act1), ud.id, CASE ud.alias WHEN 'f01' THEN 'approved' WHEN 'f02' THEN 'pending' WHEN 'f03' THEN 'approved' WHEN 'f04' THEN 'rejected' WHEN 'f05' THEN 'approved' WHEN 'm01' THEN 'approved' WHEN 'm02' THEN 'approved' WHEN 'm03' THEN 'approved' WHEN 'm05' THEN 'approved' END, NOW()-INTERVAL '30 days', CASE WHEN ud.alias='f02' THEN NULL ELSE (SELECT id FROM mgr2) END, CASE WHEN ud.alias='f02' THEN NULL ELSE NOW()-INTERVAL '29 days' END, 'not_checked_in' FROM user_data ud WHERE ud.alias IN ('f01','f02','f03','f04','f05','m01','m02','m03','m05'); -- ============================================================ -- 12. 活动互选意向 -- ==================================================== WITH act1 AS (SELECT id FROM activities WHERE title LIKE '%夏季%' LIMIT 1) INSERT INTO activity_interests (id, source_user_id, target_user_id, activity_id, status, confirmed_at, created_at) SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f01'), (SELECT id FROM user_data WHERE alias='m01'), (SELECT id FROM act1), 'mutual', '2026-08-15T17:00:00Z'::timestamptz, '2026-08-15T17:00:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f03'), (SELECT id FROM user_data WHERE alias='m03'), (SELECT id FROM act1), 'mutual', '2026-08-15T17:05:00Z'::timestamptz, '2026-08-15T17:05:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f05'), (SELECT id FROM user_data WHERE alias='m05'), (SELECT id FROM act1), 'expressed','2026-08-15T17:10:00Z'::timestamptz, '2026-08-15T17:10:00Z'::timestamptz; -- ============================================================ -- 13. 红娘服务 -- ==================================================== WITH mh_op AS (SELECT id FROM operators WHERE username='wanghongniang' LIMIT 1), women_org AS (SELECT id FROM organizations WHERE type='women_federation' LIMIT 1), charity_org AS (SELECT id FROM organizations WHERE type='charity_center' LIMIT 1) INSERT INTO matchmaker_services (id, user_id, service_type, description, status, organization_id, assigned_operator_id, assigned_at, completed_at) VALUES (gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f02'), 'recommend_partner', '离异用户希望找到合适的伴侣', 'in_service', (SELECT id FROM women_org), (SELECT id FROM mh_op), '2026-06-20T10:00:00Z', NULL), (gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f06'), 'no_match_help', '丧偶用户希望重新融入社交', 'waiting_user', (SELECT id FROM charity_org), (SELECT id FROM mh_op), '2026-06-25T14:00:00Z', NULL), (gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f04'), 'review_preference', '用户希望调整择偶条件', 'completed', (SELECT id FROM women_org), (SELECT id FROM mh_op), '2026-06-15T09:00:00Z', '2026-06-20T11:00:00Z'); -- 红娘推荐 WITH ms_f02 AS (SELECT id FROM matchmaker_services WHERE user_id=(SELECT id FROM user_data WHERE alias='f02') LIMIT 1), mh_op2 AS (SELECT id FROM operators WHERE username='wanghongniang' LIMIT 1) INSERT INTO matchmaker_recommendations (id, service_id, user_id, target_user_id, operator_id, reason, status, created_at, viewed_at, responded_at) VALUES (gen_random_uuid(), (SELECT id FROM ms_f02), (SELECT id FROM user_data WHERE alias='f02'), (SELECT id FROM user_data WHERE alias='m02'), (SELECT id FROM mh_op2), '两人同在丹阳工作,年龄相仿,都离过婚有共同语言', 'viewed', '2026-06-21T10:00:00Z', '2026-06-22T09:00:00Z', NULL); -- 红娘跟进 WITH ms_f02_2 AS (SELECT id FROM matchmaker_services WHERE user_id=(SELECT id FROM user_data WHERE alias='f02') LIMIT 1), ms_f04 AS (SELECT id FROM matchmaker_services WHERE user_id=(SELECT id FROM user_data WHERE alias='f04') LIMIT 1), mh_op3 AS (SELECT id FROM operators WHERE username='wanghongniang' LIMIT 1) INSERT INTO matchmaker_followups (id, service_id, operator_id, followup_type, content, result_code, next_followup_at, created_at) VALUES (gen_random_uuid(), (SELECT id FROM ms_f02_2), (SELECT id FROM mh_op3), 'phone_call', '电话沟通用户情况,了解离异原因及择偶期望', '正常', '2026-07-01T10:00:00Z', '2026-06-22T10:00:00Z'), (gen_random_uuid(), (SELECT id FROM ms_f04), (SELECT id FROM mh_op3), 'face_to_face','面对面交流,帮助用户调整身高要求', '已调整', NULL, '2026-06-18T15:00:00Z'); -- ============================================================ -- 14. 系统通知 -- ==================================================== INSERT INTO notifications (id, user_id, type, title, content, business_type, read_status, created_at) SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f01'), 'match', '你们互相喜欢!', '张伟也喜欢了你,可以开始聊天啦~', 'match', 'read', '2026-06-01T10:05:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='m01'), 'match', '你们互相喜欢!', '小芳也喜欢了你,可以开始聊天啦~', 'match', 'read', '2026-06-01T10:05:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f03'), 'match', '你们互相喜欢!', '王磊也喜欢了你,可以开始聊天啦~', 'match', 'read', '2026-06-03T09:30:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='m03'), 'match', '你们互相喜欢!', '婷婷也喜欢了你,可以开始聊天啦~', 'match', 'unread','2026-06-03T09:30:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f05'), 'match', '你们互相喜欢!', '孙浩也喜欢了你,可以开始聊天啦~', 'match', 'read', '2026-06-05T10:05:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='m05'), 'match', '你们互相喜欢!', '慧琴也喜欢了你,可以开始聊天啦~', 'match', 'read', '2026-06-05T10:05:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f05'), 'system', '恭喜牵手成功!', '您与孙浩已成功牵手,祝你们幸福!', 'match', 'read', '2026-07-01T10:30:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='m05'), 'system', '恭喜牵手成功!', '您与慧琴已成功牵手,祝你们幸福!', 'match', 'read', '2026-07-01T10:30:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f01'), 'activity', '活动报名已确认', '您已成功报名「丹阳公益单身联谊会」', 'activity', 'read', '2026-07-05T10:30:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f05'), 'activity', '活动报名已确认', '您已成功报名「丹阳公益单身联谊会」', 'activity', 'unread','2026-07-07T09:20:00Z'::timestamptz UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f02'), 'matchmaker', '红娘已为您服务', '您的红娘服务申请已被分配,红娘小王将在24小时内与您联系', 'matchmaker', 'read', '2026-06-20T10:30:00Z'::timestamptz; -- ============================================================ -- 15. 同意记录 -- ==================================================== INSERT INTO consent_records (id, user_id, type, version, agreed_at, ip_address, user_agent) SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f01'), 'terms_of_service', '1.0', '2026-03-15T10:00:00Z'::timestamptz, '127.0.0.1', 'WeChat/8.0' UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='f01'), 'privacy_policy', '1.0', '2026-03-15T10:00:00Z'::timestamptz, '127.0.0.1', 'WeChat/8.0' UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='m01'), 'terms_of_service', '1.0', '2026-03-10T09:00:00Z'::timestamptz, '127.0.0.1', 'WeChat/8.0' UNION ALL SELECT gen_random_uuid(), (SELECT id FROM user_data WHERE alias='m01'), 'privacy_policy', '1.0', '2026-03-10T09:00:00Z'::timestamptz, '127.0.0.1', 'WeChat/8.0'; -- ============================================================ -- 16. 审核原因字典 -- ==================================================== INSERT INTO review_reasons (code, name, category, enabled, sort_order) VALUES ('profile_incomplete', '资料不完整', 'quality', true, 1), ('photo_unclear', '照片不清晰', 'quality', true, 2), ('fake_info', '信息疑似虚假', 'trust', true, 3), ('inappropriate_photo', '照片内容不当', 'safety', true, 4), ('duplicate_identity', '重复注册', 'duplicate', true, 5), ('suspicious_behavior', '行为异常', 'risk', true, 6), ('manual_review_needed', '需人工复核', 'quality', true, 7) ON CONFLICT (code) DO NOTHING; DROP TABLE IF EXISTS _conv_result; -- ============================================================ -- V1.1 Feature Flag 初始化 -- ============================================================ INSERT INTO system_configs (config_key, config_value, description) VALUES ('localEligibility.evidencePolicy', '"need_based"', '本地资格佐证策略:need_based=按需触发 / mandatory=全部强制'), ('counseling.enabled', 'true', '婚恋咨询功能开关'), ('premarital.enabled', 'true', '婚前辅导功能开关'), ('serviceLocation.enabled', 'true', '善缘服务站功能开关'), ('content.enabled', 'true', '内容中心功能开关'), ('localEligibility.enabled', 'true', '本地资格功能开关'), ('banner.maxActiveCount', '5', 'Banner最大活跃数量') ON CONFLICT (config_key) DO NOTHING; -- ============================================================ -- 验证 -- ==================================================== DO $$ DECLARE u_cnt INTEGER; op_cnt INTEGER; m_cnt INTEGER; a_cnt INTEGER; r_cnt INTEGER; n_cnt INTEGER; p_cnt INTEGER; BEGIN SELECT COUNT(*) INTO u_cnt FROM users WHERE deleted_at IS NULL; SELECT COUNT(*) INTO op_cnt FROM operators; SELECT COUNT(*) INTO m_cnt FROM matches; SELECT COUNT(*) INTO a_cnt FROM activities WHERE deleted_at IS NULL; SELECT COUNT(*) INTO r_cnt FROM user_relations; SELECT COUNT(*) INTO n_cnt FROM notifications; SELECT COUNT(*) INTO p_cnt FROM user_profiles; RAISE NOTICE '========================================'; RAISE NOTICE '✅ Demo 数据填充完成!'; RAISE NOTICE '========================================'; RAISE NOTICE ' 用户: %人 | 资料: %条 | 操作员: %人', u_cnt, p_cnt, op_cnt; RAISE NOTICE ' Match: %对 | 关系: %条 | 活动: %个 | 通知: %条', m_cnt, r_cnt, a_cnt, n_cnt; RAISE NOTICE '========================================'; END $$; COMMIT;