From 5bbca05d2e15651fa0a3cd979df46ac80ac6f8be Mon Sep 17 00:00:00 2001 From: not-like-juvenile <16056107+not-like-juvenile@user.noreply.gitee.com> Date: Tue, 3 Feb 2026 17:30:00 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E9=80=81=E7=AB=AF=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delivery/db/create_pending_orders.sql | 104 +++++ pages/mall/delivery/db/create_test_orders.sql | 213 +++++++++ .../mall/delivery/db/realistic_mock_data.sql | 408 ++++++++++++++++++ 3 files changed, 725 insertions(+) create mode 100644 pages/mall/delivery/db/create_pending_orders.sql create mode 100644 pages/mall/delivery/db/create_test_orders.sql create mode 100644 pages/mall/delivery/db/realistic_mock_data.sql diff --git a/pages/mall/delivery/db/create_pending_orders.sql b/pages/mall/delivery/db/create_pending_orders.sql new file mode 100644 index 00000000..ff454deb --- /dev/null +++ b/pages/mall/delivery/db/create_pending_orders.sql @@ -0,0 +1,104 @@ +-- create_pending_orders.sql +-- 在 dev 环境幂等创建若干 "待接取" 订单及对应配送任务 +-- 使用说明:在 Supabase SQL Editor 中选择 Role = postgres,整体执行此文件。 + +-- 订单 PENDING-20260202-001 +WITH o AS ( + INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, order_status, created_at, updated_at) + SELECT 'PENDING-20260202-001', + COALESCE((SELECT id FROM public.ak_users WHERE email='zhang.san@example.com' LIMIT 1),(SELECT id FROM public.ak_users LIMIT 1)), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 12.50, 3.00, 15.50, + ('{"contact":"张三","phone":"13811112222","detail":"测试地址 A"}')::jsonb, + 1, NOW(), NOW() + WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='PENDING-20260202-001') + RETURNING id +), it AS ( + INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) + SELECT uuid_generate_v4(), (SELECT id FROM o), + COALESCE((SELECT id FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1),(SELECT id FROM public.ml_products LIMIT 1)), + COALESCE((SELECT name FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1),'商品A'), + COALESCE((SELECT base_price FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1),12.50),1, + COALESCE((SELECT base_price FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1),12.50), NOW() + WHERE EXISTS (SELECT 1 FROM o) + RETURNING id +), t AS ( + INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) + SELECT (SELECT id FROM o), + ('{"contact":"门店A","phone":"13900000001","detail":"门店A"}')::jsonb, + ('{"contact":"张三","phone":"13811112222","detail":"测试地址 A"}')::jsonb, + 3.00, 1, NOW(), NOW() + WHERE EXISTS (SELECT 1 FROM o) + RETURNING id +) +SELECT 'PENDING-20260202-001' AS order_no, (SELECT id FROM o) AS order_id, (SELECT id FROM t) AS task_id; + +-- 订单 PENDING-20260202-002 +WITH o AS ( + INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, order_status, created_at, updated_at) + SELECT 'PENDING-20260202-002', + COALESCE((SELECT id FROM public.ak_users WHERE email='li.si@example.com' LIMIT 1),(SELECT id FROM public.ak_users LIMIT 1)), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 35.00, 4.00, 39.00, + ('{"contact":"李四","phone":"13822223333","detail":"测试地址 B"}')::jsonb, + 1, NOW(), NOW() + WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='PENDING-20260202-002') + RETURNING id +), it AS ( + INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) + SELECT uuid_generate_v4(), (SELECT id FROM o), + COALESCE((SELECT id FROM public.ml_products WHERE product_code='REAL-P-B-20260202' LIMIT 1),(SELECT id FROM public.ml_products LIMIT 1)), + COALESCE((SELECT name FROM public.ml_products WHERE product_code='REAL-P-B-20260202' LIMIT 1),'商品B'), + COALESCE((SELECT base_price FROM public.ml_products WHERE product_code='REAL-P-B-20260202' LIMIT 1),35.00),1, + COALESCE((SELECT base_price FROM public.ml_products WHERE product_code='REAL-P-B-20260202' LIMIT 1),35.00), NOW() + WHERE EXISTS (SELECT 1 FROM o) + RETURNING id +), t AS ( + INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) + SELECT (SELECT id FROM o), + ('{"contact":"门店B","phone":"13900000002","detail":"门店B"}')::jsonb, + ('{"contact":"李四","phone":"13822223333","detail":"测试地址 B"}')::jsonb, + 4.00, 1, NOW(), NOW() + WHERE EXISTS (SELECT 1 FROM o) + RETURNING id +) +SELECT 'PENDING-20260202-002' AS order_no, (SELECT id FROM o) AS order_id, (SELECT id FROM t) AS task_id; + +-- 订单 PENDING-20260202-003 +WITH o AS ( + INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, order_status, created_at, updated_at) + SELECT 'PENDING-20260202-003', + COALESCE((SELECT id FROM public.ak_users WHERE email='wang.wu@example.com' LIMIT 1),(SELECT id FROM public.ak_users LIMIT 1)), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 22.00, 3.50, 25.50, + ('{"contact":"王五","phone":"13833334444","detail":"测试地址 C"}')::jsonb, + 1, NOW(), NOW() + WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='PENDING-20260202-003') + RETURNING id +), it AS ( + INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) + SELECT uuid_generate_v4(), (SELECT id FROM o), + COALESCE((SELECT id FROM public.ml_products WHERE product_code='REAL-P-C-20260202' LIMIT 1),(SELECT id FROM public.ml_products LIMIT 1)), + COALESCE((SELECT name FROM public.ml_products WHERE product_code='REAL-P-C-20260202' LIMIT 1),'商品C'), + COALESCE((SELECT base_price FROM public.ml_products WHERE product_code='REAL-P-C-20260202' LIMIT 1),22.00),1, + COALESCE((SELECT base_price FROM public.ml_products WHERE product_code='REAL-P-C-20260202' LIMIT 1),22.00), NOW() + WHERE EXISTS (SELECT 1 FROM o) + RETURNING id +), t AS ( + INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) + SELECT (SELECT id FROM o), + ('{"contact":"门店C","phone":"13900000003","detail":"门店C"}')::jsonb, + ('{"contact":"王五","phone":"13833334444","detail":"测试地址 C"}')::jsonb, + 3.50, 1, NOW(), NOW() + WHERE EXISTS (SELECT 1 FROM o) + RETURNING id +) +SELECT 'PENDING-20260202-003' AS order_no, (SELECT id FROM o) AS order_id, (SELECT id FROM t) AS task_id; + +-- 最终:列出新建或已存在的 pending 订单 +SELECT order_no, order_id, task_id FROM ( + VALUES + ('PENDING-20260202-001',(SELECT id FROM public.ml_orders WHERE order_no='PENDING-20260202-001' LIMIT 1),(SELECT id FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='PENDING-20260202-001' LIMIT 1)), + ('PENDING-20260202-002',(SELECT id FROM public.ml_orders WHERE order_no='PENDING-20260202-002' LIMIT 1),(SELECT id FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='PENDING-20260202-002' LIMIT 1)), + ('PENDING-20260202-003',(SELECT id FROM public.ml_orders WHERE order_no='PENDING-20260202-003' LIMIT 1),(SELECT id FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='PENDING-20260202-003' LIMIT 1)) +) AS t(order_no, order_id, task_id); diff --git a/pages/mall/delivery/db/create_test_orders.sql b/pages/mall/delivery/db/create_test_orders.sql new file mode 100644 index 00000000..700e9250 --- /dev/null +++ b/pages/mall/delivery/db/create_test_orders.sql @@ -0,0 +1,213 @@ +-- create_test_orders.sql +-- 幂等的测试订单生成脚本: +-- 1) 确保必需的 ak_users, ml_categories, ml_products, ml_product_skus 存在 +-- 2) 插入 3 个订单(含 order_items)并为每个订单创建 ml_delivery_tasks +-- 3) 适用于 complete_mall_database.sql 所建表(在 Supabase SQL Editor 中以 postgres 角色运行) + +BEGIN; + +-- 1. 确保测试用户存在(若不存在则插入简化记录) +-- 使用 WHERE NOT EXISTS 保证幂等 +INSERT INTO public.ak_users(id, auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at) +SELECT uuid_generate_v4(), uuid_generate_v4(), '系统管理员', 'admin', 'admin@mall.com', '13800138000', NULL, 'active', 'script', NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email = 'admin@mall.com'); + +INSERT INTO public.ak_users(id, auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at) +SELECT uuid_generate_v4(), uuid_generate_v4(), '数码专营店', 'merchant', 'merchant1@mall.com', '13800138001', NULL, 'active', 'script', NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email = 'merchant1@mall.com'); + +INSERT INTO public.ak_users(id, auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at) +SELECT uuid_generate_v4(), uuid_generate_v4(), '时尚小铺', 'merchant', 'merchant2@mall.com', '13800138002', NULL, 'active', 'script', NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email = 'merchant2@mall.com'); + +INSERT INTO public.ak_users(id, auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at) +SELECT uuid_generate_v4(), uuid_generate_v4(), '张小明', 'customer', 'customer1@mall.com', '13800138101', NULL, 'active', 'script', NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email = 'customer1@mall.com'); + +INSERT INTO public.ak_users(id, auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at) +SELECT uuid_generate_v4(), uuid_generate_v4(), '李小红', 'customer', 'customer2@mall.com', '13800138102', NULL, 'active', 'script', NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email = 'customer2@mall.com'); + +INSERT INTO public.ak_users(id, auth_id, username, role, email, phone, avatar_url, status, registration_source, created_at, updated_at) +SELECT uuid_generate_v4(), uuid_generate_v4(), '快递小哥1', 'delivery', 'driver1@mall.com', '13800138201', NULL, 'active', 'script', NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email = 'driver1@mall.com'); + +-- 2. 确保至少有一个分类存在 +INSERT INTO public.ml_categories (id, name, slug, level, path, created_at, updated_at) +SELECT uuid_generate_v4(), '默认分类', 'default', 1, ARRAY['默认分类'], NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_categories); + +-- 3. 为每个商家确保至少有一个商品和 SKU +-- 3.1 Helper: 若商家没有商品则插入一个最小商品 +WITH merchant1 AS ( + SELECT id AS merchant_id FROM public.ak_users WHERE email = 'merchant1@mall.com' LIMIT 1 +), merchant2 AS ( + SELECT id AS merchant_id FROM public.ak_users WHERE email = 'merchant2@mall.com' LIMIT 1 +), default_cat AS ( + SELECT id AS category_id FROM public.ml_categories LIMIT 1 +) +-- 插入商品(商家1) +INSERT INTO public.ml_products (id, merchant_id, category_id, product_code, name, base_price, total_stock, available_stock, created_at, updated_at) +SELECT uuid_generate_v4(), m.merchant_id, d.category_id, 'P-M1-001', '示例商品 - 商家1', 199.00, 50, 50, NOW(), NOW() +FROM merchant1 m, default_cat d +WHERE NOT EXISTS ( + SELECT 1 FROM public.ml_products p WHERE p.merchant_id = m.merchant_id LIMIT 1 +); + +-- 插入商品(商家2) +INSERT INTO public.ml_products (id, merchant_id, category_id, product_code, name, base_price, total_stock, available_stock, created_at, updated_at) +SELECT uuid_generate_v4(), + (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com' LIMIT 1), + (SELECT id FROM public.ml_categories LIMIT 1), + 'P-M2-001', '示例商品 - 商家2', 89.00, 80, 80, NOW(), NOW() +WHERE NOT EXISTS ( + SELECT 1 FROM public.ml_products p WHERE p.merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com') LIMIT 1 +); + +-- 3.2 插入 SKU(如果没有) +WITH p1 AS ( + SELECT id AS product_id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant1@mall.com') LIMIT 1 +), p2 AS ( + SELECT id AS product_id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com') LIMIT 1 +) +INSERT INTO public.ml_product_skus (id, product_id, sku_code, price, stock, created_at, updated_at) +SELECT uuid_generate_v4(), p.product_id, 'SKU-M1-001', 199.00, 50, NOW(), NOW() FROM p1 p +WHERE NOT EXISTS (SELECT 1 FROM public.ml_product_skus s WHERE s.product_id = p.product_id LIMIT 1); + +-- 插入商家2 的 SKU(使用内联子查询,确保幂等且避免 CTE 范围问题) +INSERT INTO public.ml_product_skus (id, product_id, sku_code, price, stock, created_at, updated_at) +SELECT uuid_generate_v4(), p.product_id, 'SKU-M2-001', 89.00, 80, NOW(), NOW() +FROM ( + SELECT id AS product_id + FROM public.ml_products + WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com' LIMIT 1) + LIMIT 1 +) p +WHERE p.product_id IS NOT NULL + AND NOT EXISTS (SELECT 1 FROM public.ml_product_skus s WHERE s.product_id = p.product_id LIMIT 1); + +-- 4. 插入 3 个订单:两个不同商家各一单 + 一个多商品订单 +-- 订单 1: customer1 从 merchant1 购买 1 件 +WITH +buyer AS (SELECT id AS user_id FROM public.ak_users WHERE email = 'customer1@mall.com' LIMIT 1), +merchant AS (SELECT id AS merchant_id FROM public.ak_users WHERE email = 'merchant1@mall.com' LIMIT 1), +prod AS (SELECT id AS product_id FROM public.ml_products WHERE merchant_id = (SELECT merchant_id FROM merchant) LIMIT 1), +sku AS (SELECT id AS sku_id, price FROM public.ml_product_skus WHERE product_id = (SELECT product_id FROM prod) LIMIT 1), +ins_order AS ( + INSERT INTO public.ml_orders (id, order_no, user_id, merchant_id, product_amount, discount_amount, shipping_fee, total_amount, paid_amount, shipping_address, order_status, payment_status, shipping_status, created_at, updated_at) + SELECT uuid_generate_v4(), public.generate_order_no(), b.user_id, m.merchant_id, s.price, 0, 10.00, s.price + 10.00, 0, + jsonb_build_object('receiver_name','王小明','receiver_phone','13800138003','province','北京市','city','朝阳区','district','望京街道','address_detail','望京SOHO T1座 1201室'), + 1, 1, 1, NOW(), NOW() + FROM buyer b, merchant m, sku s + RETURNING id +) +INSERT INTO public.ml_order_items (id, order_id, product_id, sku_id, product_name, sku_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), o.id, p.product_id, s.sku_id, '示例商品 - 商家1', '默认SKU', s.price, 1, s.price * 1, NOW() +FROM ins_order o, prod p, sku s; + +-- 创建配送任务 for 订单1 +INSERT INTO public.ml_delivery_tasks (id, order_id, driver_id, pickup_address, delivery_address, distance, estimated_time, delivery_fee, status, assigned_at, created_at, updated_at) +SELECT uuid_generate_v4(), o.id, (SELECT id FROM public.ml_delivery_drivers WHERE user_id = (SELECT id FROM public.ak_users WHERE email = 'driver1@mall.com') LIMIT 1), + jsonb_build_object('address','商家取货点','phone','010-00000001'), + jsonb_build_object('receiver_name','王小明','receiver_phone','13800138003','address_detail','望京SOHO T1座 1201室'), + 3.5, 20, 5.00, 1, NOW(), NOW(), NOW() +FROM (SELECT id FROM public.ml_orders WHERE id = (SELECT id FROM public.ml_orders ORDER BY created_at DESC LIMIT 1) LIMIT 1) o +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks t WHERE t.order_id = o.id); + +-- 订单 2: customer2 从 merchant2 购买 2 件 +WITH +buyer2 AS (SELECT id AS user_id FROM public.ak_users WHERE email = 'customer2@mall.com' LIMIT 1), +merchantB AS (SELECT id AS merchant_id FROM public.ak_users WHERE email = 'merchant2@mall.com' LIMIT 1), +prodB AS (SELECT id AS product_id FROM public.ml_products WHERE merchant_id = (SELECT merchant_id FROM merchantB) LIMIT 1), +skuB AS (SELECT id AS sku_id, price FROM public.ml_product_skus WHERE product_id = (SELECT product_id FROM prodB) LIMIT 1), +ins_order2 AS ( + INSERT INTO public.ml_orders (id, order_no, user_id, merchant_id, product_amount, discount_amount, shipping_fee, total_amount, paid_amount, shipping_address, order_status, payment_status, shipping_status, created_at, updated_at) + SELECT uuid_generate_v4(), public.generate_order_no(), b.user_id, m.merchant_id, s.price * 2, 0, 8.00, s.price * 2 + 8.00, 0, + jsonb_build_object('receiver_name','李小红','receiver_phone','13800138004','province','北京市','city','海淀区','district','中关村街道','address_detail','中关村大街1号 科技大厦'), + 1, 1, 1, NOW(), NOW() + FROM buyer2 b, merchantB m, skuB s + RETURNING id +) +INSERT INTO public.ml_order_items (id, order_id, product_id, sku_id, product_name, sku_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), o.id, p.product_id, s.sku_id, '示例商品 - 商家2', '默认SKU', s.price, 2, s.price * 2, NOW() +FROM ins_order2 o, prodB p, skuB s; + +-- 创建配送任务 for 订单2 +INSERT INTO public.ml_delivery_tasks (id, order_id, driver_id, pickup_address, delivery_address, distance, estimated_time, delivery_fee, status, assigned_at, created_at, updated_at) +SELECT uuid_generate_v4(), o.id, (SELECT id FROM public.ml_delivery_drivers WHERE user_id = (SELECT id FROM public.ak_users WHERE email = 'driver1@mall.com') LIMIT 1), + jsonb_build_object('address','商家取货点','phone','010-00000002'), + jsonb_build_object('receiver_name','李小红','receiver_phone','13800138004','address_detail','中关村大街1号 科技大厦'), + 6.0, 35, 6.50, 1, NOW(), NOW(), NOW() +FROM (SELECT id FROM public.ml_orders WHERE created_at = (SELECT MAX(created_at) FROM public.ml_orders) LIMIT 1) o +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks t WHERE t.order_id = o.id); + +-- 订单 3: customer1 购买商家1 的商品 + 商家2 的商品(跨店多商品示例,示意用) +-- 备注:实际业务可能不允许跨商家单一订单,这里仅作为测试多商品记录演示(如果系统不允许,请忽略) +WITH +buyer3 AS (SELECT id AS user_id FROM public.ak_users WHERE email = 'customer1@mall.com' LIMIT 1), +m1 AS (SELECT id AS merchant1_id FROM public.ak_users WHERE email = 'merchant1@mall.com' LIMIT 1), +m2 AS (SELECT id AS merchant2_id FROM public.ak_users WHERE email = 'merchant2@mall.com' LIMIT 1), +prod1 AS (SELECT id AS product1_id FROM public.ml_products WHERE merchant_id = (SELECT merchant1_id FROM m1) LIMIT 1), +sku1 AS (SELECT id AS sku1_id, price FROM public.ml_product_skus WHERE product_id = (SELECT product1_id FROM prod1) LIMIT 1), +prod2 AS (SELECT id AS product2_id FROM public.ml_products WHERE merchant_id = (SELECT merchant2_id FROM m2) LIMIT 1), +sku2 AS (SELECT id AS sku2_id, price FROM public.ml_product_skus WHERE product_id = (SELECT product2_id FROM prod2) LIMIT 1), +ins_order3 AS ( + INSERT INTO public.ml_orders (id, order_no, user_id, merchant_id, product_amount, discount_amount, shipping_fee, total_amount, paid_amount, shipping_address, order_status, payment_status, shipping_status, created_at, updated_at) + SELECT uuid_generate_v4(), public.generate_order_no(), b.user_id, (SELECT merchant1_id FROM m1), + COALESCE(s1.price,0) + COALESCE(s2.price,0), 0, 12.00, COALESCE(s1.price,0)+COALESCE(s2.price,0)+12.00, 0, + jsonb_build_object('receiver_name','王小明','receiver_phone','13800138003','province','北京市','city','朝阳区','district','望京街道','address_detail','望京SOHO T1座 1201室'), + 1,1,1, NOW(), NOW() + FROM buyer3 b LEFT JOIN sku1 s1 ON TRUE LEFT JOIN sku2 s2 ON TRUE + RETURNING id +) +INSERT INTO public.ml_order_items (id, order_id, product_id, sku_id, product_name, sku_name, price, quantity, total_amount, created_at) +SELECT + uuid_generate_v4(), + o.id, + (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant1@mall.com') LIMIT 1) AS product_id, + (SELECT id FROM public.ml_product_skus WHERE product_id = (SELECT id FROM pu SELECT id, email, username, role, auth_id FROM public.ak_users WHERE email = '123@123.com';blic.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant1@mall.com') LIMIT 1) LIMIT 1) AS sku_id, + '示例商品 - 商家1', + '默认SKU', + COALESCE((SELECT price FROM public.ml_product_skus WHERE product_id = (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant1@mall.com') LIMIT 1) LIMIT 1),0) AS price, + 1, + COALESCE((SELECT price FROM public.ml_product_skus WHERE product_id = (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant1@mall.com') LIMIT 1) LIMIT 1),0) AS total_amount, + NOW() +FROM ( + SELECT id FROM public.ml_orders WHERE created_at = (SELECT MAX(created_at) FROM public.ml_orders) LIMIT 1 +) o +WHERE (SELECT id FROM public.ml_product_skus WHERE product_id = (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant1@mall.com') LIMIT 1) LIMIT 1) IS NOT NULL +ON CONFLICT DO NOTHING; + +INSERT INTO public.ml_order_items (id, order_id, product_id, sku_id, product_name, sku_name, price, quantity, total_amount, created_at) +SELECT + uuid_generate_v4(), + o.id, + (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com') LIMIT 1) AS product_id, + (SELECT id FROM public.ml_product_skus WHERE product_id = (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com') LIMIT 1) LIMIT 1) AS sku_id, + '示例商品 - 商家2', + '默认SKU', + COALESCE((SELECT price FROM public.ml_product_skus WHERE product_id = (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com') LIMIT 1) LIMIT 1),0) AS price, + 1, + COALESCE((SELECT price FROM public.ml_product_skus WHERE product_id = (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com') LIMIT 1) LIMIT 1),0) AS total_amount, + NOW() +FROM ( + SELECT id FROM public.ml_orders WHERE created_at = (SELECT MAX(created_at) FROM public.ml_orders) LIMIT 1 +) o +WHERE (SELECT id FROM public.ml_product_skus WHERE product_id = (SELECT id FROM public.ml_products WHERE merchant_id = (SELECT id FROM public.ak_users WHERE email = 'merchant2@mall.com') LIMIT 1) LIMIT 1) IS NOT NULL +ON CONFLICT DO NOTHING; + +-- 为订单3 创建配送任务(若存在) +INSERT INTO public.ml_delivery_tasks (id, order_id, driver_id, pickup_address, delivery_address, distance, estimated_time, delivery_fee, status, assigned_at, created_at, updated_at) +SELECT uuid_generate_v4(), o.id, (SELECT id FROM public.ml_delivery_drivers WHERE user_id = (SELECT id FROM public.ak_users WHERE email = 'driver1@mall.com') LIMIT 1), + jsonb_build_object('address','商家取货点','phone','010-00000003'), + jsonb_build_object('receiver_name','王小明','receiver_phone','13800138003','address_detail','望京SOHO T1座 1201室'), + 5.0, 30, 7.00, 1, NOW(), NOW(), NOW() +FROM (SELECT id FROM public.ml_orders WHERE created_at = (SELECT MAX(created_at) FROM public.ml_orders) LIMIT 1) o +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks t WHERE t.order_id = o.id); + +COMMIT; + +-- 执行完成后请在 Supabase SQL Editor 中确认插入结果: +-- SELECT * FROM public.ml_orders ORDER BY created_at DESC LIMIT 10; +-- SELECT * FROM public.ml_order_items ORDER BY created_at DESC LIMIT 20; +-- SELECT * FROM public.ml_delivery_tasks ORDER BY created_at DESC LIMIT 10; diff --git a/pages/mall/delivery/db/realistic_mock_data.sql b/pages/mall/delivery/db/realistic_mock_data.sql new file mode 100644 index 00000000..f4ccae12 --- /dev/null +++ b/pages/mall/delivery/db/realistic_mock_data.sql @@ -0,0 +1,408 @@ +-- realistic_mock_data.sql +-- 幂等脚本:在 dev 环境创建更真实的测试数据 +-- 使用说明:在 Supabase SQL Editor 中选择 Role = postgres,整体执行此文件。 + +-- 运行前确保至少存在一个 auth 用户,否则后续插入会违背 FK +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM auth.users) THEN + RAISE EXCEPTION 'No auth.users found. Create at least one auth user in Supabase auth or sign up once, then re-run this script.'; + END IF; +END$$; +-- 1) 确保存在一个测试分类 +INSERT INTO public.ml_categories (id, cid, name, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_categories_cid_seq'::regclass), '测试分类-配送端', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_categories WHERE name = '测试分类-配送端'); + +-- 2) 创建或复用商家(优先按 email 匹配,否则按任意 auth.user) +INSERT INTO public.ak_users (id, auth_id, email, username, created_at) +SELECT uuid_generate_v4(), + COALESCE((SELECT id FROM auth.users WHERE email='merchant.real@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)), + 'merchant.real@example.com','real_merchant', NOW() +WHERE NOT EXISTS ( + SELECT 1 FROM public.ak_users WHERE email='merchant.real@example.com' OR auth_id = COALESCE((SELECT id FROM auth.users WHERE email='merchant.real@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)) +); + +-- 3) 三个真实感顾客(按 email 或存在的 auth.users id 复用) +INSERT INTO public.ak_users (id, auth_id, email, username, created_at) +SELECT uuid_generate_v4(), COALESCE((SELECT id FROM auth.users WHERE email='zhang.san@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)), 'zhang.san@example.com','张三', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email='zhang.san@example.com' OR auth_id = COALESCE((SELECT id FROM auth.users WHERE email='zhang.san@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1))); + +INSERT INTO public.ak_users (id, auth_id, email, username, created_at) +SELECT uuid_generate_v4(), COALESCE((SELECT id FROM auth.users WHERE email='li.si@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)), 'li.si@example.com','李四', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email='li.si@example.com' OR auth_id = COALESCE((SELECT id FROM auth.users WHERE email='li.si@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1))); + +INSERT INTO public.ak_users (id, auth_id, email, username, created_at) +SELECT uuid_generate_v4(), COALESCE((SELECT id FROM auth.users WHERE email='wang.wu@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)), 'wang.wu@example.com','王五', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email='wang.wu@example.com' OR auth_id = COALESCE((SELECT id FROM auth.users WHERE email='wang.wu@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1))); + +-- 4) 五个商品(使用上面分类与商家) +INSERT INTO public.ml_products (id, cid, merchant_id, category_id, product_code, name, base_price, total_stock, main_image_url, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_products_cid_seq'::regclass), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + (SELECT id FROM public.ml_categories WHERE name='测试分类-配送端' LIMIT 1), + 'REAL-P-A-20260202','鲜榨橙汁 500ml',12.50,200,'https://cdn.example.com/orange.jpg', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_products WHERE product_code='REAL-P-A-20260202'); + +INSERT INTO public.ml_products (id, cid, merchant_id, category_id, product_code, name, base_price, total_stock, main_image_url, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_products_cid_seq'::regclass), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + (SELECT id FROM public.ml_categories WHERE name='测试分类-配送端' LIMIT 1), + 'REAL-P-B-20260202','经典牛肉饼 200g',35.00,120,'https://cdn.example.com/beef.jpg', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_products WHERE product_code='REAL-P-B-20260202'); + +INSERT INTO public.ml_products (id, cid, merchant_id, category_id, product_code, name, base_price, total_stock, main_image_url, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_products_cid_seq'::regclass), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + (SELECT id FROM public.ml_categories WHERE name='测试分类-配送端' LIMIT 1), + 'REAL-P-C-20260202','手工三明治',22.00,80,'https://cdn.example.com/sandwich.jpg', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_products WHERE product_code='REAL-P-C-20260202'); + +INSERT INTO public.ml_products (id, cid, merchant_id, category_id, product_code, name, base_price, total_stock, main_image_url, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_products_cid_seq'::regclass), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + (SELECT id FROM public.ml_categories WHERE name='测试分类-配送端' LIMIT 1), + 'REAL-P-D-20260202','每日现磨咖啡',18.00,150,'https://cdn.example.com/coffee.jpg', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_products WHERE product_code='REAL-P-D-20260202'); + +-- 5) 创建若干订单与配送任务(status = 1, driver_id = NULL) +-- 订单 1(示例已更新:order_no / phone / address) +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT 'TEST-DELIV-20260202-001', + COALESCE( + (SELECT id FROM public.ak_users WHERE email='zhang.san@example.com' LIMIT 1), + (SELECT id FROM public.ak_users WHERE auth_id=(SELECT id FROM auth.users WHERE email='zhang.san@example.com' LIMIT 1) LIMIT 1), + (SELECT id FROM public.ak_users LIMIT 1) + ), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 12.50,3.00,15.50, + ('{"contact":"张三","phone":"13890001111","province":"北京市","city":"北京市","district":"朝阳区","street":"望京街道","detail":"望京SOHO 1号楼"}')::jsonb, + NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-001'); + +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-001' LIMIT 1), (SELECT id FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1), '鲜榨橙汁 500ml',12.50,1,12.50,NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id=o.id WHERE o.order_no='TEST-DELIV-20260202-001'); + +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-001' LIMIT 1), + ('{"contact":"门店A","phone":"13990001111","detail":"门店A 地址"}')::jsonb, + ('{"contact":"张三","phone":"13890001111","detail":"望京SOHO 1号楼"}')::jsonb, + 3.00,1,NOW(),NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='TEST-DELIV-20260202-001'); + +-- 订单 2(示例已更新) +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT 'TEST-DELIV-20260202-002', + COALESCE( + (SELECT id FROM public.ak_users WHERE email='li.si@example.com' LIMIT 1), + (SELECT id FROM public.ak_users WHERE auth_id=(SELECT id FROM auth.users WHERE email='li.si@example.com' LIMIT 1) LIMIT 1), + (SELECT id FROM public.ak_users LIMIT 1) + ), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 35.00,4.00,39.00, + ('{"contact":"李四","phone":"13890002222","province":"上海市","city":"上海市","district":"静安区","street":"南京西路","detail":"静安寺附近"}')::jsonb, + NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-002'); + +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-002' LIMIT 1), (SELECT id FROM public.ml_products WHERE product_code='REAL-P-B-20260202' LIMIT 1), '经典牛肉饼 200g',35.00,1,35.00,NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id=o.id WHERE o.order_no='TEST-DELIV-20260202-002'); + +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-002' LIMIT 1), + ('{"contact":"门店B","phone":"13990002222","detail":"门店B 地址"}')::jsonb, + ('{"contact":"李四","phone":"13890002222","detail":"静安寺附近"}')::jsonb, + 4.00,1,NOW(),NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='TEST-DELIV-20260202-002'); + +-- 订单 3(示例已更新) +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT 'TEST-DELIV-20260202-003', + COALESCE( + (SELECT id FROM public.ak_users WHERE email='wang.wu@example.com' LIMIT 1), + (SELECT id FROM public.ak_users WHERE auth_id=(SELECT id FROM auth.users WHERE email='wang.wu@example.com' LIMIT 1) LIMIT 1), + (SELECT id FROM public.ak_users LIMIT 1) + ), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 22.00,3.50,25.50, + ('{"contact":"王五","phone":"13890003333","province":"广东省","city":"广州市","district":"天河区","street":"体育西路","detail":"天河城附近"}')::jsonb, + NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-003'); + +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-003' LIMIT 1), (SELECT id FROM public.ml_products WHERE product_code='REAL-P-C-20260202' LIMIT 1), '手工三明治',22.00,1,22.00,NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id=o.id WHERE o.order_no='TEST-DELIV-20260202-003'); + +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-003' LIMIT 1), + ('{"contact":"门店C","phone":"13990003333","detail":"门店C 地址"}')::jsonb, + ('{"contact":"王五","phone":"13890003333","detail":"天河城附近"}')::jsonb, + 3.50,1,NOW(),NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='TEST-DELIV-20260202-003'); + +-- 订单 4(示例已更新) +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT 'TEST-DELIV-20260202-004', + COALESCE( + (SELECT id FROM public.ak_users WHERE email='zhang.san@example.com' LIMIT 1), + (SELECT id FROM public.ak_users WHERE auth_id=(SELECT id FROM auth.users WHERE email='zhang.san@example.com' LIMIT 1) LIMIT 1), + (SELECT id FROM public.ak_users LIMIT 1) + ), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 18.00,3.00,21.00, + ('{"contact":"张三","phone":"13890001111","province":"上海市","city":"上海市","district":"浦东新区","street":"世纪大道","detail":"世纪汇 10 号"}')::jsonb, + NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-004'); + +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-004' LIMIT 1), (SELECT id FROM public.ml_products WHERE product_code='REAL-P-D-20260202' LIMIT 1), '每日现磨咖啡',18.00,1,18.00,NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id=o.id WHERE o.order_no='TEST-DELIV-20260202-004'); + +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-004' LIMIT 1), + ('{"contact":"门店D","phone":"13990004444","detail":"门店D 地址"}')::jsonb, + ('{"contact":"张三","phone":"13890001111","detail":"世纪汇 10 号"}')::jsonb, + 3.00,1,NOW(),NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='TEST-DELIV-20260202-004'); + +-- 最终返回已创建或已存在的关键 id,便于验证 +SELECT + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1) AS merchant_id, + (SELECT id FROM public.ak_users WHERE email='zhang.san@example.com' LIMIT 1) AS custA_id, + (SELECT id FROM public.ak_users WHERE email='li.si@example.com' LIMIT 1) AS custB_id, + (SELECT id FROM public.ak_users WHERE email='wang.wu@example.com' LIMIT 1) AS custC_id, + (SELECT id FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1) AS productA_id, + (SELECT id FROM public.ml_products WHERE product_code='REAL-P-B-20260202' LIMIT 1) AS productB_id, + (SELECT id FROM public.ml_products WHERE product_code='REAL-P-C-20260202' LIMIT 1) AS productC_id, + (SELECT id FROM public.ml_products WHERE product_code='REAL-P-D-20260202' LIMIT 1) AS productD_id, + (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-001' LIMIT 1) AS order1_id, + (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-002' LIMIT 1) AS order2_id, + (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-003' LIMIT 1) AS order3_id, + (SELECT id FROM public.ml_orders WHERE order_no='TEST-DELIV-20260202-004' LIMIT 1) AS order4_id; + +-- 6) 批量生成 20 个“待接取”订单(幂等) +-- 订单号格式:PENDING-20260202-001 .. PENDING-20260202-020 +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT t.order_no, t.user_id, t.merchant_id, t.product_amount, t.shipping_fee, t.total_amount, t.shipping_address, NOW(), NOW() +FROM ( + SELECT format('PENDING-20260202-%s', lpad(i::text,3,'0')) AS order_no, + COALESCE( + CASE (i % 3) + WHEN 1 THEN (SELECT id FROM public.ak_users WHERE email='zhang.san@example.com' LIMIT 1) + WHEN 2 THEN (SELECT id FROM public.ak_users WHERE email='li.si@example.com' LIMIT 1) + ELSE (SELECT id FROM public.ak_users WHERE email='wang.wu@example.com' LIMIT 1) + END, + (SELECT id FROM public.ak_users LIMIT 1) + ) AS user_id, + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1) AS merchant_id, + (SELECT base_price FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1) AS product_amount, + 3.00 AS shipping_fee, + (SELECT base_price FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1) + 3.00 AS total_amount, + jsonb_build_object('contact', CASE WHEN (i % 3)=1 THEN '张三' WHEN (i % 3)=2 THEN '李四' ELSE '王五' END, 'phone', '138900' || lpad(i::text,5,'0'), 'detail', '自动生成地址 ' || i) AS shipping_address + FROM generate_series(1,20) AS s(i) +) AS t +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders o WHERE o.order_no = t.order_no); + +-- 生成对应的 order_items(若不存在) +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), o.id, p.id, p.name, p.base_price, 1, p.base_price, NOW() +FROM public.ml_orders o +JOIN public.ml_products p ON p.product_code = 'REAL-P-A-20260202' +WHERE o.order_no LIKE 'PENDING-20260202-%' + AND NOT EXISTS (SELECT 1 FROM public.ml_order_items oi WHERE oi.order_id = o.id); + +-- 生成对应的 delivery_tasks(status = 1) +WITH no AS ( + SELECT id, order_no, shipping_address, ROW_NUMBER() OVER (ORDER BY id) AS rn + FROM public.ml_orders WHERE order_no LIKE 'PENDING-20260202-%' +) +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT no.id, + jsonb_build_object('contact','自动门店','phone', '13900' || lpad(no.rn::text,4,'0'),'detail','自动门店地址')::jsonb, + no.shipping_address, + 3.00,1,NOW(),NOW() +FROM no +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt WHERE dt.order_id = no.id); +-- realistic_mock_data.sql +-- 幂等脚本:在 dev 环境创建更真实的测试数据 +-- 使用说明:在 Supabase SQL Editor 中选择 Role = postgres,整体执行此文件。 + +-- 运行前确保至少存在一个 auth 用户,否则后续插入会违背 FK +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM auth.users) THEN + RAISE EXCEPTION 'No auth.users found. Create at least one auth user in Supabase auth or sign up once, then re-run this script.'; + END IF; +END$$; +-- 1) 确保存在一个测试分类 +INSERT INTO public.ml_categories (id, cid, name, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_categories_cid_seq'::regclass), '测试分类-配送端', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_categories WHERE name = '测试分类-配送端'); + +-- 2) 创建或复用商家(优先按 email 匹配,否则按任意 auth.user) +INSERT INTO public.ak_users (id, auth_id, email, username, created_at) +SELECT uuid_generate_v4(), + COALESCE((SELECT id FROM auth.users WHERE email='merchant.real@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)), + 'merchant.real@example.com','real_merchant', NOW() +WHERE NOT EXISTS ( + SELECT 1 FROM public.ak_users WHERE email='merchant.real@example.com' OR auth_id = COALESCE((SELECT id FROM auth.users WHERE email='merchant.real@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)) +); + +-- 3) 三个真实感顾客(按 email 或存在的 auth.users id 复用) +INSERT INTO public.ak_users (id, auth_id, email, username, created_at) +SELECT uuid_generate_v4(), COALESCE((SELECT id FROM auth.users WHERE email='zhang.san@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)), 'zhang.san@example.com','张三', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email='zhang.san@example.com' OR auth_id = COALESCE((SELECT id FROM auth.users WHERE email='zhang.san@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1))); + +INSERT INTO public.ak_users (id, auth_id, email, username, created_at) +SELECT uuid_generate_v4(), COALESCE((SELECT id FROM auth.users WHERE email='li.si@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)), 'li.si@example.com','李四', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email='li.si@example.com' OR auth_id = COALESCE((SELECT id FROM auth.users WHERE email='li.si@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1))); + +INSERT INTO public.ak_users (id, auth_id, email, username, created_at) +SELECT uuid_generate_v4(), COALESCE((SELECT id FROM auth.users WHERE email='wang.wu@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1)), 'wang.wu@example.com','王五', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ak_users WHERE email='wang.wu@example.com' OR auth_id = COALESCE((SELECT id FROM auth.users WHERE email='wang.wu@example.com' LIMIT 1),(SELECT id FROM auth.users LIMIT 1))); + +-- 4) 五个商品(使用上面分类与商家) +INSERT INTO public.ml_products (id, cid, merchant_id, category_id, product_code, name, base_price, total_stock, main_image_url, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_products_cid_seq'::regclass), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + (SELECT id FROM public.ml_categories WHERE name='测试分类-配送端' LIMIT 1), + 'REAL-P-A-20260202','鲜榨橙汁 500ml',12.50,200,'https://cdn.example.com/orange.jpg', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_products WHERE product_code='REAL-P-A-20260202'); + +INSERT INTO public.ml_products (id, cid, merchant_id, category_id, product_code, name, base_price, total_stock, main_image_url, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_products_cid_seq'::regclass), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + (SELECT id FROM public.ml_categories WHERE name='测试分类-配送端' LIMIT 1), + 'REAL-P-B-20260202','经典牛肉饼 200g',35.00,120,'https://cdn.example.com/beef.jpg', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_products WHERE product_code='REAL-P-B-20260202'); + +INSERT INTO public.ml_products (id, cid, merchant_id, category_id, product_code, name, base_price, total_stock, main_image_url, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_products_cid_seq'::regclass), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + (SELECT id FROM public.ml_categories WHERE name='测试分类-配送端' LIMIT 1), + 'REAL-P-C-20260202','手工三明治',22.00,80,'https://cdn.example.com/sandwich.jpg', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_products WHERE product_code='REAL-P-C-20260202'); + +INSERT INTO public.ml_products (id, cid, merchant_id, category_id, product_code, name, base_price, total_stock, main_image_url, created_at) +SELECT uuid_generate_v4(), nextval('public.ml_products_cid_seq'::regclass), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + (SELECT id FROM public.ml_categories WHERE name='测试分类-配送端' LIMIT 1), + 'REAL-P-D-20260202','每日现磨咖啡',18.00,150,'https://cdn.example.com/coffee.jpg', NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_products WHERE product_code='REAL-P-D-20260202'); + +-- 5) 创建若干订单与配送任务(status = 1, driver_id = NULL) +-- 订单 1 +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT 'REAL-ORD-20260202-001', + COALESCE( + (SELECT id FROM public.ak_users WHERE email='zhang.san@example.com' LIMIT 1), + (SELECT id FROM public.ak_users WHERE auth_id=(SELECT id FROM auth.users WHERE email='zhang.san@example.com' LIMIT 1) LIMIT 1), + (SELECT id FROM public.ak_users LIMIT 1) + ), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 12.50,3.00,15.50, + ('{"contact":"张三","phone":"13811112222","province":"北京市","city":"北京市","district":"朝阳区","street":"望京街道","detail":"望京SOHO 1号楼"}')::jsonb, + NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-001'); + +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-001' LIMIT 1), (SELECT id FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1), '鲜榨橙汁 500ml',12.50,1,12.50,NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id=o.id WHERE o.order_no='REAL-ORD-20260202-001'); + +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-001' LIMIT 1), + ('{"contact":"门店A","phone":"13920001111","detail":"门店A 地址"}')::jsonb, + ('{"contact":"张三","phone":"13811112222","detail":"望京SOHO 1号楼"}')::jsonb, + 3.00,1,NOW(),NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='REAL-ORD-20260202-001'); + +-- 订单 2 +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT 'REAL-ORD-20260202-002', + COALESCE( + (SELECT id FROM public.ak_users WHERE email='li.si@example.com' LIMIT 1), + (SELECT id FROM public.ak_users WHERE auth_id=(SELECT id FROM auth.users WHERE email='li.si@example.com' LIMIT 1) LIMIT 1), + (SELECT id FROM public.ak_users LIMIT 1) + ), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 35.00,4.00,39.00, + ('{"contact":"李四","phone":"13822223333","province":"上海市","city":"上海市","district":"静安区","street":"南京西路","detail":"静安寺附近"}')::jsonb, + NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-002'); + +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-002' LIMIT 1), (SELECT id FROM public.ml_products WHERE product_code='REAL-P-B-20260202' LIMIT 1), '经典牛肉饼 200g',35.00,1,35.00,NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id=o.id WHERE o.order_no='REAL-ORD-20260202-002'); + +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-002' LIMIT 1), + ('{"contact":"门店B","phone":"13920002222","detail":"门店B 地址"}')::jsonb, + ('{"contact":"李四","phone":"13822223333","detail":"静安寺附近"}')::jsonb, + 4.00,1,NOW(),NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='REAL-ORD-20260202-002'); + +-- 订单 3 +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT 'REAL-ORD-20260202-003', + COALESCE( + (SELECT id FROM public.ak_users WHERE email='wang.wu@example.com' LIMIT 1), + (SELECT id FROM public.ak_users WHERE auth_id=(SELECT id FROM auth.users WHERE email='wang.wu@example.com' LIMIT 1) LIMIT 1), + (SELECT id FROM public.ak_users LIMIT 1) + ), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 22.00,3.50,25.50, + ('{"contact":"王五","phone":"13833334444","province":"广东省","city":"广州市","district":"天河区","street":"体育西路","detail":"天河城附近"}')::jsonb, + NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-003'); + +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-003' LIMIT 1), (SELECT id FROM public.ml_products WHERE product_code='REAL-P-C-20260202' LIMIT 1), '手工三明治',22.00,1,22.00,NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id=o.id WHERE o.order_no='REAL-ORD-20260202-003'); + +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-003' LIMIT 1), + ('{"contact":"门店C","phone":"13920003333","detail":"门店C 地址"}')::jsonb, + ('{"contact":"王五","phone":"13833334444","detail":"天河城附近"}')::jsonb, + 3.50,1,NOW(),NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='REAL-ORD-20260202-003'); + +-- 订单 4 +INSERT INTO public.ml_orders (order_no, user_id, merchant_id, product_amount, shipping_fee, total_amount, shipping_address, created_at, updated_at) +SELECT 'REAL-ORD-20260202-004', + COALESCE( + (SELECT id FROM public.ak_users WHERE email='zhang.san@example.com' LIMIT 1), + (SELECT id FROM public.ak_users WHERE auth_id=(SELECT id FROM auth.users WHERE email='zhang.san@example.com' LIMIT 1) LIMIT 1), + (SELECT id FROM public.ak_users LIMIT 1) + ), + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1), + 18.00,3.00,21.00, + ('{"contact":"张三","phone":"13811112222","province":"上海市","city":"上海市","district":"浦东新区","street":"世纪大道","detail":"世纪汇 10 号"}')::jsonb, + NOW(), NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-004'); + +INSERT INTO public.ml_order_items (id, order_id, product_id, product_name, price, quantity, total_amount, created_at) +SELECT uuid_generate_v4(), (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-004' LIMIT 1), (SELECT id FROM public.ml_products WHERE product_code='REAL-P-D-20260202' LIMIT 1), '每日现磨咖啡',18.00,1,18.00,NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id=o.id WHERE o.order_no='REAL-ORD-20260202-004'); + +INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) +SELECT (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-004' LIMIT 1), + ('{"contact":"门店D","phone":"13920004444","detail":"门店D 地址"}')::jsonb, + ('{"contact":"张三","phone":"13811112222","detail":"世纪汇 10 号"}')::jsonb, + 3.00,1,NOW(),NOW() +WHERE NOT EXISTS (SELECT 1 FROM public.ml_delivery_tasks dt JOIN public.ml_orders o ON dt.order_id=o.id WHERE o.order_no='REAL-ORD-20260202-004'); + +-- 最终返回已创建或已存在的关键 id,便于验证 +SELECT + (SELECT id FROM public.ak_users WHERE email='merchant.real@example.com' LIMIT 1) AS merchant_id, + (SELECT id FROM public.ak_users WHERE email='zhang.san@example.com' LIMIT 1) AS custA_id, + (SELECT id FROM public.ak_users WHERE email='li.si@example.com' LIMIT 1) AS custB_id, + (SELECT id FROM public.ak_users WHERE email='wang.wu@example.com' LIMIT 1) AS custC_id, + (SELECT id FROM public.ml_products WHERE product_code='REAL-P-A-20260202' LIMIT 1) AS productA_id, + (SELECT id FROM public.ml_products WHERE product_code='REAL-P-B-20260202' LIMIT 1) AS productB_id, + (SELECT id FROM public.ml_products WHERE product_code='REAL-P-C-20260202' LIMIT 1) AS productC_id, + (SELECT id FROM public.ml_products WHERE product_code='REAL-P-D-20260202' LIMIT 1) AS productD_id, + (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-001' LIMIT 1) AS order1_id, + (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-002' LIMIT 1) AS order2_id, + (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-003' LIMIT 1) AS order3_id, + (SELECT id FROM public.ml_orders WHERE order_no='REAL-ORD-20260202-004' LIMIT 1) AS order4_id;