Files
medical-mall/mall_sql/scripts/seed_homecare_worker.sql
2026-06-10 20:20:47 +08:00

270 lines
8.4 KiB
SQL
Raw 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.
-- =====================================================================================
-- 脚本:创建居家服务员测试账号及完整档案(一站式 SQL
-- 用途:为 delivery 端登录提供真实的服务人员档案
-- 执行环境Supabase SQL Editor需 postgres/superuser 权限)
-- 对应前端配置:医疗-delivery/ak/config.uts
-- - SUPA_URL: http://119.146.131.237:9126
-- - 测试账号: homecare_worker@test.com / Homecare123!
-- =====================================================================================
-- 0. 确保 pgcrypto 扩展可用(用于 bcrypt 密码哈希)
CREATE EXTENSION IF NOT EXISTS pgcrypto;
DO $$
DECLARE
v_auth_id UUID;
v_instance_id UUID;
v_email TEXT := 'homecare_worker@test.com';
v_password TEXT := 'Homecare123!';
v_nickname TEXT := '居家服务员';
v_phone TEXT := '13800138000';
BEGIN
-- -------------------------------------------------------------------------
-- 步骤 1获取 instance_id自托管 Supabase 通常只有一个 instance
-- -------------------------------------------------------------------------
SELECT id INTO v_instance_id FROM auth.instances LIMIT 1;
IF v_instance_id IS NULL THEN
v_instance_id := '00000000-0000-0000-0000-000000000000'::UUID;
END IF;
-- -------------------------------------------------------------------------
-- 步骤 2创建/更新 auth.usersSupabase Auth 核心用户表)
-- 使用 crypt(..., gen_salt('bf')) 生成 bcrypt 哈希,与 gotrue 兼容
-- -------------------------------------------------------------------------
INSERT INTO auth.users (
instance_id,
id,
aud,
role,
email,
encrypted_password,
email_confirmed_at,
confirmation_sent_at,
recovery_sent_at,
email_change_sent_at,
new_email,
invited_at,
confirmation_token,
recovery_token,
email_change_token_new,
email_change_token_current,
email_change,
email_change_confirm_status,
banned_until,
reauthentication_token,
reauthentication_sent_at,
is_super_admin,
created_at,
updated_at,
phone,
phone_confirmed_at,
phone_change,
phone_change_token,
phone_change_sent_at,
confirmed_at,
raw_app_meta_data,
raw_user_meta_data,
is_sso_user,
deleted_at,
is_anonymous
) VALUES (
v_instance_id,
gen_random_uuid(),
'authenticated',
'authenticated',
v_email,
crypt(v_password, gen_salt('bf')),
NOW(),
NULL,
NULL,
NULL,
NULL,
NULL,
'',
'',
'',
'',
'',
0,
NULL,
'',
NULL,
FALSE,
NOW(),
NOW(),
NULL,
NULL,
NULL,
'',
NULL,
NOW(),
'{"provider":"email","providers":["email"]}'::jsonb,
'{"name":"居家服务员","role":"delivery","nickname":"居家服务员"}'::jsonb,
FALSE,
NULL,
FALSE
)
ON CONFLICT (email) DO UPDATE SET
encrypted_password = crypt(v_password, gen_salt('bf')),
email_confirmed_at = COALESCE(auth.users.email_confirmed_at, NOW()),
confirmed_at = COALESCE(auth.users.confirmed_at, NOW()),
updated_at = NOW(),
raw_user_meta_data = '{"name":"居家服务员","role":"delivery","nickname":"居家服务员"}'::jsonb,
deleted_at = NULL,
is_anonymous = FALSE;
-- 获取刚创建/更新的用户 ID
SELECT id INTO v_auth_id FROM auth.users WHERE email = v_email LIMIT 1;
IF v_auth_id IS NULL THEN
RAISE EXCEPTION 'auth.users 插入失败,请检查权限或表结构';
END IF;
RAISE NOTICE '✓ auth.users 已创建/更新: % (ID: %)', v_email, v_auth_id;
-- -------------------------------------------------------------------------
-- 步骤 3创建 auth.identitiesSupabase Auth 身份表,某些版本必需)
-- -------------------------------------------------------------------------
INSERT INTO auth.identities (
id,
user_id,
identity_data,
provider,
created_at,
updated_at
) VALUES (
v_auth_id::TEXT,
v_auth_id,
jsonb_build_object('sub', v_auth_id::TEXT, 'email', v_email),
'email',
NOW(),
NOW()
)
ON CONFLICT (id) DO UPDATE SET
identity_data = jsonb_build_object('sub', v_auth_id::TEXT, 'email', v_email),
updated_at = NOW();
RAISE NOTICE '✓ auth.identities 已创建/更新';
-- -------------------------------------------------------------------------
-- 步骤 4创建 public.ak_users业务用户资料表
-- -------------------------------------------------------------------------
INSERT INTO public.ak_users (
id,
username,
email,
gender,
birthday,
height_cm,
weight_kg,
bio,
avatar_url,
preferred_language,
health_goal,
service_address,
emergency_contact,
chronic_notes,
care_preference,
role,
school_id,
grade_id,
class_id,
created_at,
updated_at
) VALUES (
v_auth_id,
v_nickname,
v_email,
'unknown',
NULL,
0,
0,
'居家养老护理员,具备基础护理和康复训练资质',
'https://api.dicebear.com/7.x/avataaars/svg?seed=homecare',
'zh-CN',
'',
'',
'',
'',
'',
'delivery',
'',
'',
'',
NOW(),
NOW()
)
ON CONFLICT (id) DO UPDATE SET
username = EXCLUDED.username,
email = EXCLUDED.email,
role = EXCLUDED.role,
bio = EXCLUDED.bio,
avatar_url = EXCLUDED.avatar_url,
updated_at = NOW();
RAISE NOTICE '✓ public.ak_users 已插入/更新';
-- -------------------------------------------------------------------------
-- 步骤 5创建 public.ml_delivery_staff服务人员档案表
-- -------------------------------------------------------------------------
INSERT INTO public.ml_delivery_staff (
id,
uid,
nickname,
avatar,
phone,
status,
is_active,
station_id,
staff_no,
online_status,
certificate_status,
certificate_expire_at,
service_area,
skills,
created_at,
updated_at
) VALUES (
gen_random_uuid(),
v_auth_id,
v_nickname,
'https://api.dicebear.com/7.x/avataaars/svg?seed=homecare',
v_phone,
1, -- 状态: 1-启用
TRUE, -- 是否激活
NULL, -- 所属站点(可选)
'HC' || EXTRACT(YEAR FROM NOW()) || LPAD(FLOOR(RANDOM() * 10000)::TEXT, 4, '0'), -- 工号
'resting', -- 在线状态
'valid', -- 资质状态
(NOW() + INTERVAL '1 year')::DATE, -- 资质到期日
'北京市朝阳区',
'["基础护理", "康复训练", "上门照护", "健康监测"]'::jsonb,
NOW(),
NOW()
)
ON CONFLICT (uid) WHERE deleted_at IS NULL DO UPDATE SET
nickname = EXCLUDED.nickname,
phone = EXCLUDED.phone,
status = EXCLUDED.status,
is_active = EXCLUDED.is_active,
online_status = EXCLUDED.online_status,
certificate_status = EXCLUDED.certificate_status,
service_area = EXCLUDED.service_area,
skills = EXCLUDED.skills,
updated_at = NOW();
RAISE NOTICE '✓ public.ml_delivery_staff 已插入/更新';
-- -------------------------------------------------------------------------
-- 完成
-- -------------------------------------------------------------------------
RAISE NOTICE '============================================';
RAISE NOTICE '居家服务员账号初始化完成!';
RAISE NOTICE '邮箱: %', v_email;
RAISE NOTICE '密码: %', v_password;
RAISE NOTICE '用户ID: %', v_auth_id;
RAISE NOTICE 'SUPA_URL: http://119.146.131.237:9126';
RAISE NOTICE '============================================';
END $$;