mall数据库文件
This commit is contained in:
73
pages/mall/analytics/test/DELIVERY_ANALYSIS_RPCS.sql
Normal file
73
pages/mall/analytics/test/DELIVERY_ANALYSIS_RPCS.sql
Normal file
@@ -0,0 +1,73 @@
|
||||
-- ============================================
|
||||
-- 配送效率分析(按 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;
|
||||
Reference in New Issue
Block a user