Files
akmon/doc_mall/database/mock_data_insert.sql
2026-01-20 08:04:15 +08:00

1181 lines
48 KiB
PL/PgSQL
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.
-- =====================================================================================
-- 商城系统模拟数据插入脚本
-- 依赖: complete_mall_database.sql (必须先执行主数据库脚本)
-- 重要: 需要先在 Supabase Auth 中创建测试用户,建议使用 create_supabase_auth_users.js
-- 用途: 为商城系统生成测试数据,便于开发和测试
-- =====================================================================================
-- =====================================================================================
-- 0. 检查 Supabase Auth 用户环境
-- =====================================================================================
-- 检查是否为 Supabase 环境
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'auth') THEN
RAISE WARNING '当前环境不是 Supabase将使用虚拟 auth_id';
RAISE WARNING '如果是 Supabase 环境,请先使用以下方式创建测试用户:';
RAISE WARNING '1. 执行 create_supabase_auth_users.js 脚本';
RAISE WARNING '2. 或在 Supabase Dashboard 中手动创建用户';
ELSE
RAISE NOTICE '检测到 Supabase 环境,将尝试关联真实 auth 用户';
-- 检查是否有测试用户
IF EXISTS (SELECT 1 FROM auth.users WHERE email LIKE '%@mall.com') THEN
RAISE NOTICE '发现测试用户,将使用真实 auth_id';
ELSE
RAISE WARNING '未发现测试用户,建议先执行 create_supabase_auth_users.js';
RAISE WARNING '或手动在 Supabase Dashboard 创建以下测试用户:';
RAISE WARNING '- admin@mall.com';
RAISE WARNING '- merchant1@mall.com';
RAISE WARNING '- merchant2@mall.com';
RAISE WARNING '- customer1@mall.com';
RAISE WARNING '- customer2@mall.com';
RAISE WARNING '- customer3@mall.com';
RAISE WARNING '- driver1@mall.com';
RAISE WARNING '- driver2@mall.com';
END IF;
END IF;
END $$;
-- =====================================================================================
-- 1. 清理现有测试数据 (可选,谨慎使用)
-- =====================================================================================
-- TRUNCATE TABLE public.ml_product_reviews CASCADE;
-- TRUNCATE TABLE public.ml_order_items CASCADE;
-- TRUNCATE TABLE public.ml_orders CASCADE;
-- TRUNCATE TABLE public.ml_shopping_cart CASCADE;
-- TRUNCATE TABLE public.ml_user_coupons CASCADE;
-- TRUNCATE TABLE public.ml_coupon_templates CASCADE;
-- TRUNCATE TABLE public.ml_product_skus CASCADE;
-- TRUNCATE TABLE public.ml_products CASCADE;
-- TRUNCATE TABLE public.ml_shops CASCADE;
-- TRUNCATE TABLE public.ml_brands CASCADE;
-- TRUNCATE TABLE public.ml_categories CASCADE;
-- TRUNCATE TABLE public.ml_user_addresses CASCADE;
-- TRUNCATE TABLE public.ml_user_profiles CASCADE;
-- =====================================================================================
-- 2. Supabase Auth 用户创建 + ak_users 数据
-- =====================================================================================
-- 重要提示:在 Supabase 环境中,建议通过以下方式创建测试用户:
--
-- 方法一:使用 Supabase Dashboard 手动创建用户
-- 1. 进入 Supabase Dashboard -> Authentication -> Users
-- 2. 点击 "Add user" 创建以下测试用户:
-- - admin@mall.com (密码: Test123456!)
-- - merchant1@mall.com (密码: Test123456!)
-- - merchant2@mall.com (密码: Test123456!)
-- - customer1@mall.com (密码: Test123456!)
-- - customer2@mall.com (密码: Test123456!)
-- - customer3@mall.com (密码: Test123456!)
-- - driver1@mall.com (密码: Test123456!)
-- - driver2@mall.com (密码: Test123456!)
--
-- 方法二:使用 Supabase Admin API (需要在服务端执行)
--
-- 方法三:如果在本地开发环境,可以尝试直接插入 auth.users 表(仅限开发)
-- 检查是否为 Supabase 环境
DO $$
DECLARE
is_supabase BOOLEAN := FALSE;
auth_user_rec RECORD;
test_emails TEXT[] := ARRAY[
'admin@mall.com',
'merchant1@mall.com',
'merchant2@mall.com',
'customer1@mall.com',
'customer2@mall.com',
'customer3@mall.com',
'driver1@mall.com',
'driver2@mall.com'
];
email_addr TEXT;
BEGIN
-- 检查是否存在 auth schema (Supabase 特征)
SELECT EXISTS (
SELECT 1 FROM information_schema.schemata WHERE schema_name = 'auth'
) INTO is_supabase;
IF is_supabase THEN
RAISE NOTICE '检测到 Supabase 环境,检查 auth.users 表中的测试用户...';
-- 检查测试用户是否存在
FOREACH email_addr IN ARRAY test_emails LOOP
SELECT id, email INTO auth_user_rec
FROM auth.users
WHERE email = email_addr
LIMIT 1;
IF FOUND THEN
RAISE NOTICE '✓ Auth用户已存在: % (ID: %)', auth_user_rec.email, auth_user_rec.id;
ELSE
RAISE NOTICE '✗ Auth用户不存在: %', email_addr;
RAISE NOTICE '请在 Supabase Dashboard 中创建此用户或使用 Admin API';
END IF;
END LOOP;
RAISE NOTICE '============================================';
RAISE NOTICE '如果有缺失的用户,请按以下步骤操作:';
RAISE NOTICE '1. 登录 Supabase Dashboard';
RAISE NOTICE '2. 进入 Authentication -> Users';
RAISE NOTICE '3. 点击 "Add user" 创建缺失的用户';
RAISE NOTICE '4. 邮箱格式: user@mall.com, 密码: Test123456!';
RAISE NOTICE '5. 重新执行此脚本';
RAISE NOTICE '============================================';
ELSE
RAISE NOTICE '非 Supabase 环境,将创建虚拟 auth_id...';
END IF;
END $$;
-- =====================================================================================
-- 1. 插入用户数据 (ak_users) - 关联 Supabase Auth 用户
-- =====================================================================================
-- 临时函数:获取或创建 auth_id
CREATE OR REPLACE FUNCTION get_or_create_auth_id(user_email TEXT)
RETURNS UUID AS $$
DECLARE
auth_user_id UUID;
BEGIN
-- 尝试从 auth.users 获取真实用户ID
IF EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'auth') THEN
SELECT id INTO auth_user_id FROM auth.users WHERE email = user_email LIMIT 1;
IF auth_user_id IS NOT NULL THEN
RETURN auth_user_id;
ELSE
RAISE WARNING '用户 % 在 auth.users 中不存在使用虚拟UUID', user_email;
END IF;
END IF;
-- 生成确定性虚拟UUID (基于邮箱)
RETURN uuid_generate_v5(uuid_ns_dns(), user_email);
END;
$$ LANGUAGE plpgsql;
-- 插入系统管理员
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT
get_or_create_auth_id('admin@mall.com'),
'系统管理员',
'admin',
'admin@mall.com',
'13800138000',
'https://example.com/avatars/admin.jpg',
'active',
'web',
NOW() - INTERVAL '365 days',
NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'admin@mall.com');
-- 插入商家用户
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT
get_or_create_auth_id('merchant1@mall.com'),
'数码专营店',
'merchant',
'merchant1@mall.com',
'13800138001',
'https://example.com/avatars/merchant1.jpg',
'active',
'web',
NOW() - INTERVAL '300 days',
NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'merchant1@mall.com');
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT
get_or_create_auth_id('merchant2@mall.com'),
'时尚服饰店',
'merchant',
'merchant2@mall.com',
'13800138002',
'https://example.com/avatars/merchant2.jpg',
'active',
'web',
NOW() - INTERVAL '200 days',
NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'merchant2@mall.com');
-- 插入普通用户
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT
get_or_create_auth_id('customer1@mall.com'),
'张小明',
'customer',
'customer1@mall.com',
'13800138101',
'https://example.com/avatars/customer1.jpg',
'active',
'mobile',
NOW() - INTERVAL '180 days',
NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'customer1@mall.com');
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT
get_or_create_auth_id('customer2@mall.com'),
'李小红',
'customer',
'customer2@mall.com',
'13800138102',
'https://example.com/avatars/customer2.jpg',
'active',
'mobile',
NOW() - INTERVAL '120 days',
NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'customer2@mall.com');
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT
get_or_create_auth_id('customer3@mall.com'),
'王小华',
'customer',
'customer3@mall.com',
'13800138103',
'https://example.com/avatars/customer3.jpg',
'active',
'web',
NOW() - INTERVAL '90 days',
NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'customer3@mall.com');
-- 插入配送员
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT
get_or_create_auth_id('driver1@mall.com'),
'快递小哥1',
'delivery',
'driver1@mall.com',
'13800138201',
'https://example.com/avatars/driver1.jpg',
'active',
'mobile',
NOW() - INTERVAL '150 days',
NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'driver1@mall.com');
INSERT INTO ak_users (auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at)
SELECT
get_or_create_auth_id('driver2@mall.com'),
'快递小哥2',
'delivery',
'driver2@mall.com',
'13800138202',
'https://example.com/avatars/driver2.jpg',
'active',
'mobile',
NOW() - INTERVAL '100 days',
NOW()
WHERE NOT EXISTS (SELECT 1 FROM ak_users WHERE email = 'driver2@mall.com');
-- 清理临时函数
DROP FUNCTION get_or_create_auth_id(TEXT);
-- =====================================================================================
-- 2. 获取用户ID (用于后续插入)
-- =====================================================================================
DO $$
DECLARE
admin_id UUID;
merchant1_id UUID;
merchant2_id UUID;
customer1_id UUID;
customer2_id UUID;
customer3_id UUID;
driver1_id UUID;
driver2_id UUID;
BEGIN
-- 获取用户ID使用email字段
SELECT id INTO admin_id FROM ak_users WHERE email = 'admin@mall.com';
SELECT id INTO merchant1_id FROM ak_users WHERE email = 'merchant1@mall.com';
SELECT id INTO merchant2_id FROM ak_users WHERE email = 'merchant2@mall.com';
SELECT id INTO customer1_id FROM ak_users WHERE email = 'customer1@mall.com';
SELECT id INTO customer2_id FROM ak_users WHERE email = 'customer2@mall.com';
SELECT id INTO customer3_id FROM ak_users WHERE email = 'customer3@mall.com';
SELECT id INTO driver1_id FROM ak_users WHERE email = 'driver1@mall.com';
SELECT id INTO driver2_id FROM ak_users WHERE email = 'driver2@mall.com';
-- 创建临时表存储ID
CREATE TEMP TABLE IF NOT EXISTS temp_user_ids (
role VARCHAR(20),
user_id UUID
);
INSERT INTO temp_user_ids VALUES
('admin', admin_id),
('merchant1', merchant1_id),
('merchant2', merchant2_id),
('customer1', customer1_id),
('customer2', customer2_id),
('customer3', customer3_id),
('driver1', driver1_id),
('driver2', driver2_id);
END $$;
-- =====================================================================================
-- 3. 用户档案数据
-- =====================================================================================
-- 插入用户档案
INSERT INTO public.ml_user_profiles (user_id, status, real_name, credit_score, verification_status, verification_data, preferences)
SELECT
t.user_id,
1, -- 正常状态
CASE
WHEN t.role = 'admin' THEN '系统管理员'
WHEN t.role = 'merchant1' THEN '张三丰'
WHEN t.role = 'merchant2' THEN '李四海'
WHEN t.role = 'customer1' THEN '王小明'
WHEN t.role = 'customer2' THEN '刘小红'
WHEN t.role = 'customer3' THEN '陈小华'
WHEN t.role = 'driver1' THEN '赵配送'
WHEN t.role = 'driver2' THEN '钱师傅'
END,
CASE
WHEN t.role = 'admin' THEN 1000
WHEN t.role IN ('merchant1', 'merchant2') THEN 950
WHEN t.role IN ('driver1', 'driver2') THEN 900
ELSE 850
END,
CASE
WHEN t.role IN ('admin', 'merchant1', 'merchant2') THEN 1 -- 已认证
ELSE 0 -- 未认证
END,
'{}', -- 认证数据
'{"language": "zh-CN", "currency": "CNY", "notifications": true}' -- 偏好设置
FROM temp_user_ids t
ON CONFLICT (user_id) DO UPDATE SET
real_name = EXCLUDED.real_name,
credit_score = EXCLUDED.credit_score,
verification_status = EXCLUDED.verification_status;
-- =====================================================================================
-- 4. 用户地址数据
-- =====================================================================================
-- 插入用户地址
INSERT INTO public.ml_user_addresses (user_id, receiver_name, receiver_phone, province, city, district, address_detail, is_default, label, latitude, longitude)
SELECT
t.user_id,
CASE
WHEN t.role = 'customer1' THEN '王小明'
WHEN t.role = 'customer2' THEN '刘小红'
WHEN t.role = 'customer3' THEN '陈小华'
WHEN t.role = 'merchant1' THEN '张三丰'
WHEN t.role = 'merchant2' THEN '李四海'
END,
CASE
WHEN t.role = 'customer1' THEN '13800138003'
WHEN t.role = 'customer2' THEN '13800138004'
WHEN t.role = 'customer3' THEN '13800138005'
WHEN t.role = 'merchant1' THEN '13800138001'
WHEN t.role = 'merchant2' THEN '13800138002'
END,
'北京市',
'朝阳区',
'望京街道',
CASE
WHEN t.role = 'customer1' THEN '望京SOHO T1座 1201室'
WHEN t.role = 'customer2' THEN '国贸大厦 A座 2301室'
WHEN t.role = 'customer3' THEN '三里屯太古里 B1-023'
WHEN t.role = 'merchant1' THEN '中关村创业大街 8号楼'
WHEN t.role = 'merchant2' THEN '亦庄经济开发区 科创园'
END,
TRUE, -- 默认地址
'home',
39.9942 + (random() - 0.5) * 0.01, -- 北京纬度附近
116.3258 + (random() - 0.5) * 0.01 -- 北京经度附近
FROM temp_user_ids t
WHERE t.role IN ('customer1', 'customer2', 'customer3', 'merchant1', 'merchant2');
-- 为部分用户添加第二个地址
INSERT INTO public.ml_user_addresses (user_id, receiver_name, receiver_phone, province, city, district, address_detail, is_default, label, latitude, longitude)
SELECT
t.user_id,
'公司收货',
'010-12345678',
'北京市',
'海淀区',
'中关村街道',
'中关村大街1号 科技大厦',
FALSE,
'office',
39.9042,
116.3958
FROM temp_user_ids t
WHERE t.role IN ('customer1', 'customer2');
-- =====================================================================================
-- 5. 商品分类数据
-- =====================================================================================
-- 删除默认分类,插入更详细的分类
DELETE FROM public.ml_categories;
-- 一级分类
INSERT INTO public.ml_categories (id, name, slug, level, path, sort_order, icon_url, description) VALUES
(uuid_generate_v4(), '数码电器', 'digital', 1, ARRAY['数码电器'], 1, 'icon-digital', '手机、电脑、家电等数码产品'),
(uuid_generate_v4(), '服装鞋帽', 'fashion', 1, ARRAY['服装鞋帽'], 2, 'icon-fashion', '男装、女装、鞋子、配饰'),
(uuid_generate_v4(), '家居用品', 'home', 1, ARRAY['家居用品'], 3, 'icon-home', '家具、装饰、生活用品'),
(uuid_generate_v4(), '食品饮料', 'food', 1, ARRAY['食品饮料'], 4, 'icon-food', '新鲜食材、零食、饮品'),
(uuid_generate_v4(), '美妆护肤', 'beauty', 1, ARRAY['美妆护肤'], 5, 'icon-beauty', '化妆品、护肤品、个人护理'),
(uuid_generate_v4(), '运动户外', 'sports', 1, ARRAY['运动户外'], 6, 'icon-sports', '运动器材、户外装备、健身用品'),
(uuid_generate_v4(), '图书文娱', 'books', 1, ARRAY['图书文娱'], 7, 'icon-books', '图书、音像、文具、玩具'),
(uuid_generate_v4(), '母婴用品', 'baby', 1, ARRAY['母婴用品'], 8, 'icon-baby', '婴儿用品、孕妇用品、儿童玩具');
-- 获取一级分类ID并创建二级分类
DO $$
DECLARE
digital_id UUID;
fashion_id UUID;
home_id UUID;
food_id UUID;
BEGIN
-- 获取一级分类ID
SELECT id INTO digital_id FROM public.ml_categories WHERE slug = 'digital';
SELECT id INTO fashion_id FROM public.ml_categories WHERE slug = 'fashion';
SELECT id INTO home_id FROM public.ml_categories WHERE slug = 'home';
SELECT id INTO food_id FROM public.ml_categories WHERE slug = 'food';
-- 数码电器二级分类
INSERT INTO public.ml_categories (parent_id, name, slug, level, path, sort_order) VALUES
(digital_id, '手机通讯', 'mobile', 2, ARRAY['数码电器', '手机通讯'], 1),
(digital_id, '电脑办公', 'computer', 2, ARRAY['数码电器', '电脑办公'], 2),
(digital_id, '家用电器', 'appliance', 2, ARRAY['数码电器', '家用电器'], 3),
(digital_id, '数码配件', 'accessories', 2, ARRAY['数码电器', '数码配件'], 4);
-- 服装鞋帽二级分类
INSERT INTO public.ml_categories (parent_id, name, slug, level, path, sort_order) VALUES
(fashion_id, '男装', 'mens-wear', 2, ARRAY['服装鞋帽', '男装'], 1),
(fashion_id, '女装', 'womens-wear', 2, ARRAY['服装鞋帽', '女装'], 2),
(fashion_id, '男鞋', 'mens-shoes', 2, ARRAY['服装鞋帽', '男鞋'], 3),
(fashion_id, '女鞋', 'womens-shoes', 2, ARRAY['服装鞋帽', '女鞋'], 4);
-- 家居用品二级分类
INSERT INTO public.ml_categories (parent_id, name, slug, level, path, sort_order) VALUES
(home_id, '家具', 'furniture', 2, ARRAY['家居用品', '家具'], 1),
(home_id, '家装', 'decoration', 2, ARRAY['家居用品', '家装'], 2),
(home_id, '厨具', 'kitchen', 2, ARRAY['家居用品', '厨具'], 3),
(home_id, '生活用品', 'daily', 2, ARRAY['家居用品', '生活用品'], 4);
-- 食品饮料二级分类
INSERT INTO public.ml_categories (parent_id, name, slug, level, path, sort_order) VALUES
(food_id, '新鲜水果', 'fruits', 2, ARRAY['食品饮料', '新鲜水果'], 1),
(food_id, '肉禽蛋类', 'meat', 2, ARRAY['食品饮料', '肉禽蛋类'], 2),
(food_id, '零食坚果', 'snacks', 2, ARRAY['食品饮料', '零食坚果'], 3),
(food_id, '酒水饮料', 'drinks', 2, ARRAY['食品饮料', '酒水饮料'], 4);
END $$;
-- =====================================================================================
-- 6. 品牌数据
-- =====================================================================================
INSERT INTO public.ml_brands (name, logo_url, description, website) VALUES
('苹果', 'https://cdn.jsdelivr.net/gh/devicons/devicon/icons/apple/apple-original.svg', '创新科技品牌', 'https://www.apple.com'),
('华为', 'https://logo.clearbit.com/huawei.com', '全球领先的信息与通信技术解决方案供应商', 'https://www.huawei.com'),
('小米', 'https://logo.clearbit.com/mi.com', '专注于智能硬件和电子产品', 'https://www.mi.com'),
('三星', 'https://logo.clearbit.com/samsung.com', '全球知名电子产品制造商', 'https://www.samsung.com'),
('耐克', 'https://logo.clearbit.com/nike.com', '全球著名体育用品品牌', 'https://www.nike.com'),
('阿迪达斯', 'https://logo.clearbit.com/adidas.com', '德国运动用品制造商', 'https://www.adidas.com'),
('优衣库', 'https://logo.clearbit.com/uniqlo.com', '日本休闲服饰品牌', 'https://www.uniqlo.com'),
('宜家', 'https://logo.clearbit.com/ikea.com', '瑞典家居用品零售商', 'https://www.ikea.com'),
('美的', 'https://logo.clearbit.com/midea.com', '中国家电制造商', 'https://www.midea.com'),
('海尔', 'https://logo.clearbit.com/haier.com', '全球知名家电品牌', 'https://www.haier.com');
-- =====================================================================================
-- 7. 店铺数据
-- =====================================================================================
-- 获取商家用户ID并创建店铺
INSERT INTO public.ml_shops (merchant_id, shop_name, shop_logo, shop_banner, description, business_license, contact_name, contact_phone, contact_email, address, business_hours, status, verified_at)
SELECT
t.user_id,
CASE
WHEN t.role = 'merchant1' THEN '张三丰数码专营店'
WHEN t.role = 'merchant2' THEN '李四海时尚小铺'
END,
CASE
WHEN t.role = 'merchant1' THEN 'https://api.dicebear.com/7.x/shapes/svg?seed=shop1'
WHEN t.role = 'merchant2' THEN 'https://api.dicebear.com/7.x/shapes/svg?seed=shop2'
END,
CASE
WHEN t.role = 'merchant1' THEN 'https://picsum.photos/800/200?random=1'
WHEN t.role = 'merchant2' THEN 'https://picsum.photos/800/200?random=2'
END,
CASE
WHEN t.role = 'merchant1' THEN '专业销售各类数码产品,品质保证,服务至上'
WHEN t.role = 'merchant2' THEN '时尚潮流服饰,让您成为街头最亮的星'
END,
CASE
WHEN t.role = 'merchant1' THEN '91110000MA0001234A'
WHEN t.role = 'merchant2' THEN '91110000MA0005678B'
END,
CASE
WHEN t.role = 'merchant1' THEN '张三丰'
WHEN t.role = 'merchant2' THEN '李四海'
END,
CASE
WHEN t.role = 'merchant1' THEN '13800138001'
WHEN t.role = 'merchant2' THEN '13800138002'
END,
CASE
WHEN t.role = 'merchant1' THEN 'merchant1@mall.com'
WHEN t.role = 'merchant2' THEN 'merchant2@mall.com'
END,
'{"province": "北京市", "city": "朝阳区", "district": "望京街道", "detail": "望京商业中心"}',
'{"monday": "09:00-21:00", "tuesday": "09:00-21:00", "wednesday": "09:00-21:00", "thursday": "09:00-21:00", "friday": "09:00-21:00", "saturday": "09:00-22:00", "sunday": "10:00-20:00"}',
1, -- 正常状态
NOW() - INTERVAL '30 days' -- 30天前认证
FROM temp_user_ids t
WHERE t.role IN ('merchant1', 'merchant2');
-- =====================================================================================
-- 8. 商品数据
-- =====================================================================================
-- 获取分类和品牌ID
DO $$
DECLARE
mobile_cat_id UUID;
computer_cat_id UUID;
mens_wear_cat_id UUID;
womens_wear_cat_id UUID;
furniture_cat_id UUID;
fruits_cat_id UUID;
apple_brand_id UUID;
huawei_brand_id UUID;
xiaomi_brand_id UUID;
nike_brand_id UUID;
uniqlo_brand_id UUID;
ikea_brand_id UUID;
merchant1_id UUID;
merchant2_id UUID;
BEGIN
-- 获取分类ID
SELECT id INTO mobile_cat_id FROM public.ml_categories WHERE slug = 'mobile';
SELECT id INTO computer_cat_id FROM public.ml_categories WHERE slug = 'computer';
SELECT id INTO mens_wear_cat_id FROM public.ml_categories WHERE slug = 'mens-wear';
SELECT id INTO womens_wear_cat_id FROM public.ml_categories WHERE slug = 'womens-wear';
SELECT id INTO furniture_cat_id FROM public.ml_categories WHERE slug = 'furniture';
SELECT id INTO fruits_cat_id FROM public.ml_categories WHERE slug = 'fruits';
-- 获取品牌ID
SELECT id INTO apple_brand_id FROM public.ml_brands WHERE name = '苹果';
SELECT id INTO huawei_brand_id FROM public.ml_brands WHERE name = '华为';
SELECT id INTO xiaomi_brand_id FROM public.ml_brands WHERE name = '小米';
SELECT id INTO nike_brand_id FROM public.ml_brands WHERE name = '耐克';
SELECT id INTO uniqlo_brand_id FROM public.ml_brands WHERE name = '优衣库';
SELECT id INTO ikea_brand_id FROM public.ml_brands WHERE name = '宜家';
-- 获取商家ID
SELECT user_id INTO merchant1_id FROM temp_user_ids WHERE role = 'merchant1';
SELECT user_id INTO merchant2_id FROM temp_user_ids WHERE role = 'merchant2';
-- 插入商品数据 - 商家1的数码产品
INSERT INTO public.ml_products (
merchant_id, category_id, brand_id, product_code, name, subtitle, description,
main_image_url, image_urls, base_price, market_price, total_stock, available_stock,
weight, status, is_featured, is_new, is_hot, tags, slug
) VALUES
-- iPhone 15 Pro
(merchant1_id, mobile_cat_id, apple_brand_id, 'IP15P-001',
'iPhone 15 Pro 256GB 深空黑色',
'A17 Pro芯片钛金属设计专业级摄像头系统',
'全新iPhone 15 Pro采用航空级钛金属设计搭载A17 Pro芯片配备专业级摄像头系统支持5G网络。48MP主摄像头2倍变焦4K视频录制。',
'https://picsum.photos/600/600?random=10',
'["https://picsum.photos/600/600?random=11", "https://picsum.photos/600/600?random=12", "https://picsum.photos/600/600?random=13"]',
8999.00, 9999.00, 50, 45, 0.187, 1, true, true, true,
ARRAY['手机', '苹果', 'iPhone', '5G', '新品'], 'iphone-15-pro-256gb-black'),
-- 华为 Mate 60 Pro
(merchant1_id, mobile_cat_id, huawei_brand_id, 'HW-M60P-001',
'华为 Mate 60 Pro 512GB 雅川青',
'卫星通话,昆仑玻璃,超聚光夜拍',
'华为Mate 60 Pro支持卫星通话功能采用昆仑玻璃配备超聚光夜拍摄像头5000万像素主摄支持100倍数字变焦。',
'https://picsum.photos/600/600?random=20',
'["https://picsum.photos/600/600?random=21", "https://picsum.photos/600/600?random=22"]',
6999.00, 7999.00, 30, 28, 0.225, 1, true, false, true,
ARRAY['手机', '华为', 'Mate', '卫星通话'], 'huawei-mate-60-pro-512gb'),
-- 小米笔记本
(merchant1_id, computer_cat_id, xiaomi_brand_id, 'XM-NB-001',
'小米笔记本 Pro 14 增强版',
'2.8K OLED屏幕12代酷睿处理器',
'14英寸2.8K OLED全面屏120Hz刷新率第12代Intel Core处理器16GB内存512GB固态硬盘雷电4接口。',
'https://picsum.photos/600/600?random=30',
'["https://picsum.photos/600/600?random=31", "https://picsum.photos/600/600?random=32"]',
5999.00, 6999.00, 20, 18, 1.4, 1, false, true, false,
ARRAY['笔记本', '小米', 'OLED', '办公'], 'xiaomi-notebook-pro-14');
-- 插入商品数据 - 商家2的时尚产品
INSERT INTO public.ml_products (
merchant_id, category_id, brand_id, product_code, name, subtitle, description,
main_image_url, image_urls, base_price, market_price, total_stock, available_stock,
weight, status, is_featured, is_new, is_hot, tags, slug
) VALUES
-- 耐克运动鞋
(merchant2_id, mens_wear_cat_id, nike_brand_id, 'NK-AIR-001',
'Nike Air Max 270 男士运动鞋',
'全掌气垫,舒适透气,时尚百搭',
'Nike Air Max 270采用全新的Air Max气垫设计提供卓越的缓震效果。透气网面鞋身轻量化设计适合日常运动和休闲穿着。',
'https://picsum.photos/600/600?random=40',
'["https://picsum.photos/600/600?random=41", "https://picsum.photos/600/600?random=42"]',
899.00, 1099.00, 100, 95, 0.8, 1, true, false, true,
ARRAY['运动鞋', '耐克', '气垫', '男鞋'], 'nike-air-max-270-mens'),
-- 优衣库T恤
(merchant2_id, mens_wear_cat_id, uniqlo_brand_id, 'UQ-TEE-001',
'UNIQLO 优质棉圆领T恤短袖',
'100%纯棉,柔软舒适,多色可选',
'采用100%精选纯棉制作,触感柔软,吸汗透气。简约设计,多种颜色可选,是日常穿搭的必备单品。',
'https://picsum.photos/600/600?random=50',
'["https://picsum.photos/600/600?random=51", "https://picsum.photos/600/600?random=52"]',
59.00, 79.00, 200, 180, 0.2, 1, false, false, false,
ARRAY['T恤', '优衣库', '纯棉', '基础款'], 'uniqlo-cotton-tshirt'),
-- 女装连衣裙
(merchant2_id, womens_wear_cat_id, uniqlo_brand_id, 'UQ-DRESS-001',
'UNIQLO 女装雪纺连衣裙',
'轻盈雪纺面料,优雅飘逸,职场通勤',
'采用轻盈雪纺面料版型优雅适合职场通勤和日常聚会。A字版型修饰身形多种花色可选。',
'https://picsum.photos/600/600?random=60',
'["https://picsum.photos/600/600?random=61", "https://picsum.photos/600/600?random=62"]',
299.00, 399.00, 80, 75, 0.3, 1, true, true, false,
ARRAY['连衣裙', '优衣库', '雪纺', '女装'], 'uniqlo-chiffon-dress');
END $$;
-- =====================================================================================
-- 9. 商品SKU数据
-- =====================================================================================
-- 为iPhone添加SKU
INSERT INTO public.ml_product_skus (product_id, sku_code, specifications, price, market_price, stock, image_url)
SELECT
p.id,
'IP15P-' || color.code || '-' || storage.code,
jsonb_build_object('颜色', color.name, '存储容量', storage.name),
p.base_price + storage.price_diff,
p.market_price + storage.price_diff,
15,
'https://picsum.photos/400/400?random=' || (10 + color.id)
FROM public.ml_products p
CROSS JOIN (VALUES
(1, 'BLK', '深空黑色', 0),
(2, 'WHT', '白色钛金属', 0),
(3, 'BLU', '蓝色钛金属', 0)
) AS color(id, code, name, price_diff)
CROSS JOIN (VALUES
(1, '128G', '128GB', -1000),
(2, '256G', '256GB', 0),
(3, '512G', '512GB', 1500)
) AS storage(id, code, name, price_diff)
WHERE p.product_code = 'IP15P-001';
-- 为运动鞋添加SKU
INSERT INTO public.ml_product_skus (product_id, sku_code, specifications, price, market_price, stock, image_url)
SELECT
p.id,
'NK-AIR-' || color.code || '-' || size.code,
jsonb_build_object('颜色', color.name, '尺码', size.name),
p.base_price,
p.market_price,
10,
'https://picsum.photos/400/400?random=' || (40 + color.id)
FROM public.ml_products p
CROSS JOIN (VALUES
(1, 'BLK', '黑色'),
(2, 'WHT', '白色'),
(3, 'RED', '红色')
) AS color(id, code, name)
CROSS JOIN (VALUES
(1, '40', '40码'),
(2, '41', '41码'),
(3, '42', '42码'),
(4, '43', '43码'),
(5, '44', '44码')
) AS size(id, code, name)
WHERE p.product_code = 'NK-AIR-001';
-- 为T恤添加SKU
INSERT INTO public.ml_product_skus (product_id, sku_code, specifications, price, market_price, stock, image_url)
SELECT
p.id,
'UQ-TEE-' || color.code || '-' || size.code,
jsonb_build_object('颜色', color.name, '尺码', size.name),
p.base_price,
p.market_price,
25,
'https://picsum.photos/400/400?random=' || (50 + color.id)
FROM public.ml_products p
CROSS JOIN (VALUES
(1, 'WHT', '白色'),
(2, 'BLK', '黑色'),
(3, 'GRY', '灰色'),
(4, 'NVY', '深蓝色')
) AS color(id, code, name)
CROSS JOIN (VALUES
(1, 'S', 'S'),
(2, 'M', 'M'),
(3, 'L', 'L'),
(4, 'XL', 'XL')
) AS size(id, code, name)
WHERE p.product_code = 'UQ-TEE-001';
-- =====================================================================================
-- 10. 购物车数据
-- =====================================================================================
-- 为消费者添加购物车数据
INSERT INTO public.ml_shopping_cart (user_id, product_id, sku_id, quantity, selected)
SELECT
customer.user_id,
p.id,
s.id,
CASE
WHEN customer.role = 'customer1' THEN 1
WHEN customer.role = 'customer2' THEN 2
ELSE 1
END,
true
FROM temp_user_ids customer
CROSS JOIN public.ml_products p
LEFT JOIN public.ml_product_skus s ON p.id = s.product_id
WHERE customer.role IN ('customer1', 'customer2', 'customer3')
AND p.status = 1
AND (s.id IS NULL OR s.status = 1)
AND random() < 0.3 -- 30%的概率添加到购物车
LIMIT 15;
-- =====================================================================================
-- 11. 优惠券数据
-- =====================================================================================
-- 创建优惠券模板
INSERT INTO public.ml_coupon_templates (
merchant_id, name, description, coupon_type, discount_type, discount_value,
min_order_amount, max_discount_amount, total_quantity, per_user_limit,
start_time, end_time, status
) VALUES
-- 平台券
(NULL, '新用户专享券', '新用户注册即送50元无门槛券', 1, 1, 50.00, 0, 50.00, 1000, 1,
NOW() - INTERVAL '1 day', NOW() + INTERVAL '30 days', 1),
(NULL, '满200减30', '全平台满200元减30元', 1, 1, 30.00, 200.00, 30.00, 500, 3,
NOW() - INTERVAL '1 day', NOW() + INTERVAL '15 days', 1),
(NULL, '9折优惠券', '全平台9折优惠最高减100元', 2, 2, 0.9, 100.00, 100.00, 200, 1,
NOW() - INTERVAL '1 day', NOW() + INTERVAL '7 days', 1),
-- 商家券
((SELECT user_id FROM temp_user_ids WHERE role = 'merchant1'),
'数码专营店满1000减100', '店铺满1000元减100元', 1, 1, 100.00, 1000.00, 100.00, 100, 2,
NOW() - INTERVAL '1 day', NOW() + INTERVAL '20 days', 1),
((SELECT user_id FROM temp_user_ids WHERE role = 'merchant2'),
'时尚小铺免运费券', '店铺订单免运费', 3, 1, 15.00, 0, 15.00, 50, 1,
NOW() - INTERVAL '1 day', NOW() + INTERVAL '10 days', 1);
-- 为用户发放优惠券
INSERT INTO public.ml_user_coupons (user_id, template_id, coupon_code, status, expire_at)
SELECT
customer.user_id,
t.id,
public.generate_coupon_code(),
1, -- 未使用
t.end_time
FROM temp_user_ids customer
CROSS JOIN public.ml_coupon_templates t
WHERE customer.role IN ('customer1', 'customer2', 'customer3')
AND t.status = 1
AND random() < 0.6; -- 60%的概率获得优惠券
-- =====================================================================================
-- 12. 订单数据
-- =====================================================================================
-- 生成订单数据
DO $$
DECLARE
customer_rec RECORD;
selected_merchant_id UUID;
product_rec RECORD;
order_id UUID;
order_no TEXT;
total_amount DECIMAL;
BEGIN
-- 为每个客户生成2-4个订单
FOR customer_rec IN
SELECT user_id, role FROM temp_user_ids WHERE role LIKE 'customer%'
LOOP
FOR i IN 1..FLOOR(2 + random() * 3)::INTEGER LOOP
-- 生成订单号
order_no := public.generate_order_no();
-- 随机选择商家
SELECT user_id INTO selected_merchant_id FROM temp_user_ids
WHERE role LIKE 'merchant%'
ORDER BY random() LIMIT 1;
-- 计算订单总金额(这里简化,实际应该根据商品计算)
total_amount := 100 + random() * 2000;
-- 创建订单
INSERT INTO public.ml_orders (
id, order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount,
shipping_address, order_status, payment_status, shipping_status,
paid_at, shipped_at, delivered_at,
remark, created_at
) VALUES (
uuid_generate_v4(), order_no, customer_rec.user_id, selected_merchant_id,
total_amount - 10, 10.00, total_amount,
jsonb_build_object(
'receiver_name', '收货人姓名',
'receiver_phone', '13800138000',
'province', '北京市',
'city', '朝阳区',
'district', '望京街道',
'address_detail', '望京SOHO T1座 1201室'
),
CASE
WHEN random() < 0.6 THEN 4 -- 已完成
WHEN random() < 0.8 THEN 3 -- 待收货
WHEN random() < 0.9 THEN 2 -- 待发货
ELSE 1 -- 待付款
END,
CASE
WHEN random() < 0.8 THEN 2 -- 已付款
ELSE 1 -- 未付款
END,
CASE
WHEN random() < 0.7 THEN 4 -- 已送达
WHEN random() < 0.85 THEN 3 -- 运输中
WHEN random() < 0.9 THEN 2 -- 已发货
ELSE 1 -- 未发货
END,
CASE WHEN random() < 0.8 THEN NOW() - INTERVAL '1 day' * FLOOR(random() * 10) END,
CASE WHEN random() < 0.7 THEN NOW() - INTERVAL '1 day' * FLOOR(random() * 8) END,
CASE WHEN random() < 0.6 THEN NOW() - INTERVAL '1 day' * FLOOR(random() * 5) END,
'请尽快发货,谢谢!',
NOW() - INTERVAL '1 day' * FLOOR(random() * 30)
) RETURNING id INTO order_id;
-- 为订单添加商品
FOR product_rec IN
SELECT
p.id as product_id,
s.id as sku_id,
p.name,
COALESCE(s.price, p.base_price) as price, -- 使用SKU价格如果没有则使用基础价格
COALESCE(s.image_url, p.main_image_url) as image_url -- 使用SKU图片如果没有则使用主图
FROM public.ml_products p
LEFT JOIN public.ml_product_skus s ON p.id = s.product_id
WHERE p.merchant_id = selected_merchant_id
AND p.status = 1
AND (s.id IS NULL OR s.status = 1)
ORDER BY random()
LIMIT FLOOR(1 + random() * 3)::INTEGER
LOOP
DECLARE
item_quantity INTEGER;
item_price DECIMAL;
BEGIN
item_quantity := FLOOR(1 + random() * 2)::INTEGER;
item_price := product_rec.price;
INSERT INTO public.ml_order_items (
order_id, product_id, sku_id, product_name,
price, quantity, total_amount, image_url
) VALUES (
order_id, product_rec.product_id, product_rec.sku_id, product_rec.name,
item_price, item_quantity,
item_price * item_quantity,
product_rec.image_url
);
END;
END LOOP;
END LOOP;
END LOOP;
END $$;
-- =====================================================================================
-- 13. 商品评价数据
-- =====================================================================================
-- 为已完成的订单生成评价
INSERT INTO public.ml_product_reviews (
order_id, order_item_id, user_id, product_id, merchant_id,
rating, content, images, is_anonymous, status, created_at
)
SELECT
o.id,
oi.id,
o.user_id,
oi.product_id,
o.merchant_id,
FLOOR(3 + random() * 3)::INTEGER, -- 3-5星评价
CASE
WHEN random() < 0.3 THEN '商品质量很好,物流很快,推荐购买!'
WHEN random() < 0.6 THEN '包装完好,商品和描述一致,满意的购物体验。'
WHEN random() < 0.8 THEN '性价比不错,会再次购买的。'
ELSE '商品不错,快递也很快,好评!'
END,
CASE
WHEN random() < 0.3 THEN '["https://picsum.photos/300/300?random=' || FLOOR(random() * 100)::INTEGER || '"]'
ELSE '[]'
END::JSONB,
random() < 0.1, -- 10%匿名评价
1, -- 正常状态
o.delivered_at + INTERVAL '1 day' * FLOOR(random() * 10)
FROM public.ml_orders o
JOIN public.ml_order_items oi ON o.id = oi.order_id
WHERE o.order_status = 4 -- 已完成的订单
AND o.delivered_at IS NOT NULL
AND random() < 0.7; -- 70%的概率有评价
-- =====================================================================================
-- 14. 用户行为数据
-- =====================================================================================
-- 用户收藏数据
INSERT INTO public.ml_user_favorites (user_id, target_type, target_id)
SELECT
customer.user_id,
1, -- 商品收藏
p.id
FROM temp_user_ids customer
CROSS JOIN public.ml_products p
WHERE customer.role LIKE 'customer%'
AND p.status = 1
AND random() < 0.2 -- 20%的概率收藏
ON CONFLICT (user_id, target_type, target_id) DO NOTHING;
-- 店铺收藏
INSERT INTO public.ml_user_favorites (user_id, target_type, target_id)
SELECT
customer.user_id,
2, -- 店铺收藏
s.merchant_id
FROM temp_user_ids customer
CROSS JOIN public.ml_shops s
WHERE customer.role LIKE 'customer%'
AND random() < 0.3 -- 30%的概率收藏店铺
ON CONFLICT (user_id, target_type, target_id) DO NOTHING;
-- 浏览历史数据
INSERT INTO public.ml_browse_history (user_id, product_id, browse_duration, created_at, updated_at)
SELECT
customer.user_id,
p.id,
FLOOR(10 + random() * 300)::INTEGER, -- 10-300秒浏览时长
NOW() - INTERVAL '1 day' * FLOOR(random() * 30), -- 30天内的浏览记录
NOW() - INTERVAL '1 day' * FLOOR(random() * 30)
FROM temp_user_ids customer
CROSS JOIN public.ml_products p
WHERE customer.role LIKE 'customer%'
AND p.status = 1
AND random() < 0.4 -- 40%的概率有浏览记录
ON CONFLICT (user_id, product_id) DO UPDATE SET
browse_duration = EXCLUDED.browse_duration,
updated_at = EXCLUDED.updated_at;
-- 搜索历史数据
INSERT INTO public.ml_search_history (user_id, keyword, result_count, created_at)
SELECT
customer.user_id,
keyword.word,
FLOOR(1 + random() * 50)::INTEGER, -- 1-50个结果
NOW() - INTERVAL '1 day' * FLOOR(random() * 30)
FROM temp_user_ids customer
CROSS JOIN (VALUES
('iPhone'), ('华为手机'), ('笔记本电脑'), ('运动鞋'),
('T恤'), ('连衣裙'), ('耳机'), ('充电器'), ('数据线'), ('手机壳')
) AS keyword(word)
WHERE customer.role LIKE 'customer%'
AND random() < 0.3; -- 30%的概率有搜索记录
-- =====================================================================================
-- 15. 配送数据
-- =====================================================================================
-- 配送员信息
INSERT INTO public.ml_delivery_drivers (
user_id, real_name, id_card, driver_license, vehicle_type, vehicle_number,
service_areas, work_status, current_lat, current_lng, status
)
SELECT
t.user_id,
CASE
WHEN t.role = 'driver1' THEN '赵配送'
WHEN t.role = 'driver2' THEN '钱师傅'
END,
CASE
WHEN t.role = 'driver1' THEN '110101199001011234'
WHEN t.role = 'driver2' THEN '110101199002022345'
END,
CASE
WHEN t.role = 'driver1' THEN 'D110101199001011234'
WHEN t.role = 'driver2' THEN 'D110101199002022345'
END,
1, -- 电动车
CASE
WHEN t.role = 'driver1' THEN '京A12345'
WHEN t.role = 'driver2' THEN '京A67890'
END,
'["朝阳区", "海淀区", "东城区"]'::JSONB,
1, -- 在线
39.9042 + (random() - 0.5) * 0.01,
116.4074 + (random() - 0.5) * 0.01,
1 -- 正常状态
FROM temp_user_ids t
WHERE t.role LIKE 'driver%';
-- 配送任务(为部分已发货订单创建配送任务)
INSERT INTO public.ml_delivery_tasks (
order_id, driver_id, pickup_address, delivery_address,
distance, estimated_time, delivery_fee, status,
assigned_at, picked_at, delivered_at, delivery_code
)
SELECT DISTINCT ON (o.id) -- 确保每个订单只有一个配送任务
o.id,
d.id,
jsonb_build_object(
'name', '商家仓库',
'phone', '010-12345678',
'address', '北京市朝阳区望京商业中心'
),
o.shipping_address,
ROUND((5 + random() * 15)::NUMERIC, 2), -- 5-20公里
FLOOR(20 + random() * 40)::INTEGER, -- 20-60分钟
CASE
WHEN (o.shipping_address->>'district') = '朝阳区' THEN 8.00
ELSE 12.00
END,
CASE
WHEN o.order_status >= 4 THEN 5 -- 已送达
WHEN o.order_status >= 3 THEN 4 -- 配送中
WHEN o.shipping_status >= 2 THEN 2 -- 已接单
ELSE 1 -- 待接单
END,
o.shipped_at,
CASE WHEN o.order_status >= 3 THEN o.shipped_at + INTERVAL '30 minutes' END,
CASE WHEN o.order_status >= 4 THEN o.delivered_at END,
LPAD(FLOOR(random() * 10000)::TEXT, 4, '0') -- 4位取货码
FROM public.ml_orders o
CROSS JOIN public.ml_delivery_drivers d
WHERE o.shipping_status >= 2 -- 已发货的订单
AND random() < 0.8 -- 80%的概率有配送任务
AND NOT EXISTS ( -- 确保订单尚未有配送任务
SELECT 1 FROM public.ml_delivery_tasks dt WHERE dt.order_id = o.id
)
ORDER BY o.id, random() -- 每个订单随机选择一个配送员
LIMIT 50; -- 限制配送任务数量,避免过多数据
-- =====================================================================================
-- 16. 更新统计数据
-- =====================================================================================
-- 更新商品统计数据
UPDATE public.ml_products SET
view_count = FLOOR(100 + random() * 9900)::INTEGER,
sale_count = (
SELECT COALESCE(SUM(oi.quantity), 0)
FROM public.ml_order_items oi
JOIN public.ml_orders o ON oi.order_id = o.id
WHERE oi.product_id = ml_products.id
AND o.order_status = 4
),
favorite_count = (
SELECT COUNT(*)
FROM public.ml_user_favorites f
WHERE f.target_type = 1
AND f.target_id = ml_products.id
),
rating_avg = (
SELECT COALESCE(AVG(rating), 0)
FROM public.ml_product_reviews r
WHERE r.product_id = ml_products.id
AND r.status = 1
),
rating_count = (
SELECT COUNT(*)
FROM public.ml_product_reviews r
WHERE r.product_id = ml_products.id
AND r.status = 1
);
-- 更新店铺统计数据
UPDATE public.ml_shops SET
product_count = (
SELECT COUNT(*)
FROM public.ml_products p
WHERE p.merchant_id = ml_shops.merchant_id
AND p.status = 1
),
order_count = (
SELECT COUNT(*)
FROM public.ml_orders o
WHERE o.merchant_id = ml_shops.merchant_id
AND o.order_status = 4
),
rating_avg = (
SELECT COALESCE(AVG(r.rating), 0)
FROM public.ml_product_reviews r
WHERE r.merchant_id = ml_shops.merchant_id
AND r.status = 1
),
rating_count = (
SELECT COUNT(*)
FROM public.ml_product_reviews r
WHERE r.merchant_id = ml_shops.merchant_id
AND r.status = 1
);
-- 更新配送员统计数据
UPDATE public.ml_delivery_drivers SET
order_count = (
SELECT COUNT(*)
FROM public.ml_delivery_tasks dt
WHERE dt.driver_id = ml_delivery_drivers.id
AND dt.status = 5
),
rating_avg = 4.5 + random() * 0.5, -- 4.5-5.0星评价
rating_count = FLOOR(10 + random() * 90)::INTEGER; -- 10-100个评价
-- =====================================================================================
-- 17. 清理临时数据
-- =====================================================================================
DROP TABLE IF EXISTS temp_user_ids;
-- =====================================================================================
-- 18. 完成提示
-- =====================================================================================
DO $$
BEGIN
RAISE NOTICE '=======================================================';
RAISE NOTICE '商城系统模拟数据插入完成!';
RAISE NOTICE '=======================================================';
RAISE NOTICE '已创建数据概况:';
RAISE NOTICE '- 测试用户: 8个 (管理员1个, 商家2个, 消费者3个, 配送员2个)';
RAISE NOTICE '- 用户地址: 7个';
RAISE NOTICE '- 商品分类: 多级分类体系';
RAISE NOTICE '- 品牌: 10个知名品牌';
RAISE NOTICE '- 店铺: 2个商家店铺';
RAISE NOTICE '- 商品: 6个商品 + 多规格SKU';
RAISE NOTICE '- 购物车: 随机购物车数据';
RAISE NOTICE '- 优惠券: 5个优惠券模板 + 用户优惠券';
RAISE NOTICE '- 订单: 多个测试订单 + 订单商品';
RAISE NOTICE '- 商品评价: 基于完成订单的评价';
RAISE NOTICE '- 用户行为: 收藏、浏览、搜索记录';
RAISE NOTICE '- 配送数据: 配送员 + 配送任务';
RAISE NOTICE '=======================================================';
RAISE NOTICE '数据状态: 包含各种业务场景的测试数据';
RAISE NOTICE '建议: 可根据实际需要调整数据量和内容';
RAISE NOTICE '=======================================================';
END $$;