Files
medical-mall/pages/mall/analytics/test/02_insert_delivery_test_data.sql
2026-01-30 16:17:13 +08:00

73 lines
2.6 KiB
SQL

-- =============================================
-- 配送效率分析 - 测试数据插入脚本
-- 说明:
-- - 用于生成配送员 + 近 30 天配送任务(已送达),便于配送效率分析页面展示趋势与排行。
-- - 可重复执行:配送员按 real_name 唯一键去重;任务默认会持续累加。
-- - 如需每次重置数据,请取消 TRUNCATE 注释。
-- =============================================
-- For a clean test, you can uncomment these lines to clear old data.
-- TRUNCATE public.ml_delivery_tasks, public.ml_delivery_drivers RESTART IDENTITY;
-- 1) Insert a pool of drivers.
-- ON CONFLICT ensures this is safe to run multiple times.
INSERT INTO public.ml_delivery_drivers (real_name, work_status, rating_avg, rating_count)
VALUES
('张配送', 1, 4.8, 32),
('李骑手', 1, 4.5, 20),
('王师傅', 2, 4.9, 150),
('赵快递', 3, 4.7, 88),
('刘哥', 1, 4.6, 54),
('新人小陈', 1, 3.9, 12)
ON CONFLICT (real_name) DO NOTHING;
-- 2) Generate tasks for the last 30 days.
DO $$
DECLARE
driver_ids UUID[];
d_id UUID;
i INT;
j INT;
num_tasks INT;
assigned_time TIMESTAMPTZ;
delivery_duration INT; -- in minutes
BEGIN
-- Get all driver IDs into an array
SELECT array_agg(id) INTO driver_ids FROM public.ml_delivery_drivers;
IF array_length(driver_ids, 1) IS NULL THEN
RAISE NOTICE 'No drivers found, skipping task generation.';
RETURN;
END IF;
-- Loop for the last 30 days
FOR i IN 0..29 LOOP
-- Create a random number of tasks for each day
num_tasks := floor(random() * 10 + 5)::INT; -- 5 to 14 tasks per day
FOR j IN 1..num_tasks LOOP
-- Pick a random driver
d_id := driver_ids[floor(random() * array_length(driver_ids, 1) + 1)];
-- Generate a random time within the day (from 8am to 10pm)
assigned_time := (NOW() - (i || ' days')::INTERVAL)::date
+ '8 hours'::interval
+ (floor(random() * 14 * 60) || ' minutes')::interval;
-- Generate random delivery duration (10 to 50 minutes)
delivery_duration := floor(random() * 41 + 10);
INSERT INTO public.ml_delivery_tasks (order_id, driver_id, status, assigned_at, delivered_at, delivery_fee)
VALUES (
gen_random_uuid(), -- Generate a unique order_id for each task
d_id,
5, -- Status 'Delivered'
assigned_time,
assigned_time + (delivery_duration || ' minutes')::INTERVAL,
floor(random() * 8 + 3) -- Fee between 3 and 10
);
END LOOP;
END LOOP;
END;
$$;