74 lines
2.3 KiB
PL/PgSQL
74 lines
2.3 KiB
PL/PgSQL
-- ============================================
|
||
-- 配送效率分析(按 assigned_at 统计周期,接单 -> 送达)
|
||
-- 依赖表:ml_delivery_tasks, ml_delivery_drivers
|
||
-- ============================================
|
||
|
||
-- 1) 每日趋势:平均时效/平均配送费/总配送费/完成单量
|
||
CREATE OR REPLACE FUNCTION public.rpc_delivery_efficiency_daily(
|
||
p_start TIMESTAMPTZ,
|
||
p_end TIMESTAMPTZ
|
||
)
|
||
RETURNS TABLE (
|
||
day DATE,
|
||
completed_orders INTEGER,
|
||
avg_delivery_minutes NUMERIC,
|
||
total_fee NUMERIC,
|
||
avg_fee NUMERIC
|
||
)
|
||
LANGUAGE sql
|
||
SECURITY DEFINER
|
||
SET search_path = public
|
||
AS $$
|
||
SELECT
|
||
DATE(t.assigned_at) AS day,
|
||
COUNT(*)::INTEGER AS completed_orders,
|
||
AVG(EXTRACT(EPOCH FROM (t.delivered_at - t.assigned_at)) / 60.0) AS avg_delivery_minutes,
|
||
COALESCE(SUM(t.delivery_fee), 0) AS total_fee,
|
||
AVG(t.delivery_fee) AS avg_fee
|
||
FROM public.ml_delivery_tasks t
|
||
WHERE t.status = 5
|
||
AND t.assigned_at >= p_start
|
||
AND t.assigned_at < p_end
|
||
AND t.delivered_at IS NOT NULL
|
||
GROUP BY DATE(t.assigned_at)
|
||
ORDER BY day;
|
||
$$;
|
||
|
||
-- 2) Top N 配送员:按完成单量排序
|
||
CREATE OR REPLACE FUNCTION public.rpc_delivery_efficiency_top_drivers(
|
||
p_start TIMESTAMPTZ,
|
||
p_end TIMESTAMPTZ,
|
||
p_limit INTEGER DEFAULT 10
|
||
)
|
||
RETURNS TABLE (
|
||
driver_id UUID,
|
||
driver_name TEXT,
|
||
orders INTEGER,
|
||
rating_avg NUMERIC
|
||
)
|
||
LANGUAGE sql
|
||
SECURITY DEFINER
|
||
SET search_path = public
|
||
AS $$
|
||
SELECT
|
||
d.id AS driver_id,
|
||
CAST(d.real_name AS TEXT) AS driver_name,
|
||
COUNT(*)::INTEGER AS orders,
|
||
COALESCE(d.rating_avg, 0) AS rating_avg
|
||
FROM public.ml_delivery_tasks t
|
||
JOIN public.ml_delivery_drivers d ON d.id = t.driver_id
|
||
WHERE t.status = 5
|
||
AND t.assigned_at >= p_start
|
||
AND t.assigned_at < p_end
|
||
AND t.delivered_at IS NOT NULL
|
||
GROUP BY d.id, d.real_name, d.rating_avg
|
||
ORDER BY orders DESC
|
||
LIMIT p_limit;
|
||
$$;
|
||
|
||
-- 建议:只允许 authenticated 调用(按你现有 analytics 的做法)
|
||
REVOKE ALL ON FUNCTION public.rpc_delivery_efficiency_daily(TIMESTAMPTZ, TIMESTAMPTZ) FROM PUBLIC;
|
||
REVOKE ALL ON FUNCTION public.rpc_delivery_efficiency_top_drivers(TIMESTAMPTZ, TIMESTAMPTZ, INTEGER) FROM PUBLIC;
|
||
GRANT EXECUTE ON FUNCTION public.rpc_delivery_efficiency_daily(TIMESTAMPTZ, TIMESTAMPTZ) TO authenticated;
|
||
GRANT EXECUTE ON FUNCTION public.rpc_delivery_efficiency_top_drivers(TIMESTAMPTZ, TIMESTAMPTZ, INTEGER) TO authenticated;
|