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

74 lines
2.3 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================
-- 配送效率分析(按 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;