合并分支
This commit is contained in:
104
pages/mall/delivery/db/create_pending_orders.sql
Normal file
104
pages/mall/delivery/db/create_pending_orders.sql
Normal file
@@ -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);
|
||||
213
pages/mall/delivery/db/create_test_orders.sql
Normal file
213
pages/mall/delivery/db/create_test_orders.sql
Normal file
@@ -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;
|
||||
408
pages/mall/delivery/db/realistic_mock_data.sql
Normal file
408
pages/mall/delivery/db/realistic_mock_data.sql
Normal file
@@ -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;
|
||||
190
pages/mall/delivery/delivery.md
Normal file
190
pages/mall/delivery/delivery.md
Normal file
@@ -0,0 +1,190 @@
|
||||
|
||||
---
|
||||
|
||||
# 🚚 配送端模块项目结构说明(`/pages/mall/delivery/`)
|
||||
|
||||
> 本模块为配送员使用的移动端应用核心功能区,涵盖个人中心、任务管理、收入统计、车辆管理等核心功能。
|
||||
|
||||
---
|
||||
|
||||
## 📁 目录结构概览
|
||||
|
||||
```
|
||||
delivery/
|
||||
├── index.uvue # 配送端首页(工作台)
|
||||
├── profile.uvue # 个人中心
|
||||
├── profile-edit.uvue # 编辑个人信息
|
||||
├── settings.uvue # 设置页面
|
||||
├── tasks.uvue # 配送任务列表(按状态筛选)
|
||||
├── task-detail.uvue # 单个任务详情页
|
||||
├── order-history.uvue # 历史订单列表
|
||||
├── order-detail.uvue # 订单详情页(从历史或当前跳转)
|
||||
├── earnings.uvue # 收入明细
|
||||
├── ratings.uvue # 评价记录
|
||||
├── vehicle.uvue # 车辆管理主页
|
||||
├── vehicle-add.uvue # 添加车辆
|
||||
├── vehicle-edit.uvue # 编辑车辆信息
|
||||
└── index.uvue # 首页(与上面重复?应统一命名)
|
||||
```
|
||||
|
||||
> 💡 注:`index.uvue` 出现两次,建议保留一个作为首页入口,另一个可重命名为 `dashboard.uvue` 或 `home.uvue`
|
||||
|
||||
---
|
||||
|
||||
## 🧭 各页面功能说明
|
||||
|
||||
### 1. `index.uvue` —— **配送端首页 / 工作台**
|
||||
- ✅ 核心入口页面
|
||||
- 📍 展示当前任务、今日数据、快捷操作入口
|
||||
- 🔄 可跳转到“个人中心”、“任务列表”、“收入明细”等
|
||||
|
||||
---
|
||||
|
||||
### 2. `profile.uvue` —— **个人中心**
|
||||
- 👤 显示配送员基本信息(头像、姓名、评分、总单数)
|
||||
- 📊 展示今日配送数据(完成单数、收入、里程、准时率)
|
||||
- 📈 收入统计图表(最近7天)
|
||||
- 🚗 功能菜单:收入明细、车辆管理、评价记录、帮助中心、意见反馈
|
||||
|
||||
---
|
||||
|
||||
### 3. `profile-edit.uvue` —— **编辑个人信息**
|
||||
- 🖋️ 修改头像、姓名、身份证号、驾驶证、车辆信息、服务区域等
|
||||
- 📱 界面包含表单输入 + 保存按钮
|
||||
- ⬅️ 左上角返回按钮(箭头+文字垂直排列)
|
||||
- 💾 数据本地模拟或调用API更新
|
||||
|
||||
---
|
||||
|
||||
### 4. `settings.uvue` —— **设置页面**
|
||||
- ⚙️ 通用设置项(如通知、隐私、退出登录等)
|
||||
- 🔐 安全相关设置(修改密码、绑定手机等)
|
||||
- 📲 通常由 `profile.uvue` 中的“⚙️”图标进入
|
||||
|
||||
---
|
||||
|
||||
### 5. `tasks.uvue` —— **配送任务列表**
|
||||
- 📋 按状态分类展示任务:
|
||||
- 全部任务
|
||||
- 待接单
|
||||
- 配送中
|
||||
- 已完成
|
||||
- 🚀 点击任一任务 → 跳转至 `task-detail.uvue`
|
||||
- 📈 页面顶部有“工作状态”切换开关(工作中/休息中)
|
||||
|
||||
---
|
||||
|
||||
### 6. `task-detail.uvue` —— **任务详情页**
|
||||
- 📍 显示取货地址、送达地址、距离、预计时间
|
||||
- 📞 “联系客户”按钮
|
||||
- 📝 查看任务详情(可选)
|
||||
- ✅ 适用于“当前任务”或“待接单”的操作场景
|
||||
|
||||
---
|
||||
|
||||
### 7. `order-history.uvue` —— **历史订单列表**
|
||||
- 📜 展示已完成、已接受、配送中的历史订单
|
||||
- 📌 包含订单号、状态、取送货地址、配送费、距离、时间
|
||||
- 🔍 点击“查看详情” → 跳转至 `order-detail.uvue`,并携带参数 `?from=history`
|
||||
- 📅 支持查看“已完成”的订单(仅显示“联系客服”按钮)
|
||||
|
||||
---
|
||||
|
||||
### 8. `order-detail.uvue` —— **订单详情页(多来源)**
|
||||
- 🔄 从 `tasks.uvue` 或 `order-history.uvue` 进入
|
||||
- 🎯 **关键逻辑**:
|
||||
- 若来自历史订单(`from=history`)且状态为“已完成” → 只显示“联系客服”
|
||||
- 若来自历史订单且状态为“进行中” → 显示“接受/拒绝/导航/完成”等操作按钮
|
||||
- 若非历史来源 → 显示完整操作按钮
|
||||
- 📞 包含联系顾客、联系商家、联系客服三个联系方式
|
||||
|
||||
---
|
||||
|
||||
### 9. `earnings.uvue` —— **收入明细**
|
||||
- 💰 展示总收入、用户打赏、商家打赏、总订单数
|
||||
- 📊 按订单聚合的收入数据列表
|
||||
- 📈 图表展示最近7天收入趋势
|
||||
- ➕ 加载更多按钮
|
||||
|
||||
---
|
||||
|
||||
### 10. `ratings.uvue` —— **评价记录**
|
||||
- ⭐ 展示用户对配送员的评价
|
||||
- 📝 包含评分、评价内容、订单号、时间
|
||||
- 📊 统计平均分、好评率等
|
||||
|
||||
---
|
||||
|
||||
### 11. `vehicle.uvue` —— **车辆管理主页**
|
||||
- 🚗 列出当前绑定的所有车辆
|
||||
- ➕ “添加车辆”按钮
|
||||
- 🖋️ 点击车辆 → 跳转至 `vehicle-edit.uvue`
|
||||
- 🗑️ 支持删除、设为主用车等操作
|
||||
|
||||
---
|
||||
|
||||
### 12. `vehicle-add.uvue` —— **添加车辆**
|
||||
- 📝 表单填写:车牌号、车型、行驶证照片、车辆类型等
|
||||
- ✅ 提交后绑定到当前账户
|
||||
- ⬅️ 返回车辆管理页
|
||||
|
||||
---
|
||||
|
||||
### 13. `vehicle-edit.uvue` —— **编辑车辆信息**
|
||||
- 🖋️ 修改已有车辆信息(车牌、车型、照片等)
|
||||
- 📸 支持重新上传行驶证照片
|
||||
- ✅ 保存后更新车辆信息
|
||||
|
||||
---
|
||||
|
||||
## 🔄 页面跳转关系图(简化版)
|
||||
|
||||
```
|
||||
index.uvue
|
||||
│
|
||||
├──→ profile.uvue → profile-edit.uvue
|
||||
│
|
||||
├──→ tasks.uvue → task-detail.uvue
|
||||
│
|
||||
├──→ order-history.uvue → order-detail.uvue (from=history)
|
||||
│
|
||||
├──→ earnings.uvue
|
||||
│
|
||||
├──→ ratings.uvue
|
||||
│
|
||||
└──→ vehicle.uvue → vehicle-add.uvue / vehicle-edit.uvue
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 设计原则
|
||||
|
||||
- ✅ **一致性**:所有页面使用相同导航栏样式(左上角返回按钮 + 居中标题)
|
||||
- ✅ **响应式**:适配 H5、APP、小程序等平台
|
||||
- ✅ **状态驱动**:根据订单状态动态显示不同操作按钮
|
||||
- ✅ **用户体验优先**:历史订单跳转后只显示必要操作,避免冗余按钮
|
||||
|
||||
---
|
||||
|
||||
## 📌 建议优化点
|
||||
|
||||
| 问题 | 建议 |
|
||||
|------|------|
|
||||
| `index.uvue` 重复 | 重命名为 `dashboard.uvue` 或 `home.uvue` |
|
||||
| 页面间参数传递 | 使用 `uni.navigateTo({ url: '?param=value' })` 并在 `onLoad` 中接收 |
|
||||
| UTS 语法兼容性 | 如遇问题,可临时改用标准 TS 语法调试 |
|
||||
|
||||
---
|
||||
|
||||
## ✅ 总结
|
||||
|
||||
这个 `delivery` 模块是一个完整的配送员工作系统,涵盖了:
|
||||
|
||||
- **个人管理**(资料、设置)
|
||||
- **任务处理**(接单、配送、完成)
|
||||
- **数据统计**(收入、评价、历史)
|
||||
- **车辆管理**
|
||||
|
||||
结构清晰、功能完整,适合用于实际配送平台开发。
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user