feat(admin): full integration of order, product, and finance modules with real RPC data streams
This commit is contained in:
@@ -48,7 +48,7 @@ BEGIN
|
||||
'refund_amount', refund_amount
|
||||
) INTO v_stats FROM stats;
|
||||
|
||||
RETURN v_stats;
|
||||
RETURN v_stats;
|
||||
END;
|
||||
$$;
|
||||
|
||||
@@ -86,17 +86,29 @@ BEGIN
|
||||
p.main_image_url as image,
|
||||
COALESCE(p.view_count, 0) as views,
|
||||
(SELECT COUNT(DISTINCT user_id) FROM public.ml_browse_history bh WHERE bh.product_id = p.id AND bh.created_at BETWEEN p_start_time AND p_end_time) as visitors,
|
||||
(SELECT COALESCE(SUM(quantity), 0) FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id = o.id
|
||||
WHERE oi.product_id = p.id AND o.created_at BETWEEN p_start_time AND p_end_time AND o.order_status NOT IN (1, 5)) as sales,
|
||||
(SELECT COALESCE(SUM(quantity), 0) FROM public.ml_shopping_cart sc WHERE sc.product_id = p.id AND sc.created_at BETWEEN p_start_time AND p_end_time) as cart_count,
|
||||
(SELECT COUNT(DISTINCT o.id) FROM public.ml_orders o JOIN public.ml_order_items oi ON o.id = oi.order_id
|
||||
WHERE oi.product_id = p.id AND o.created_at BETWEEN p_start_time AND p_end_time) as order_count,
|
||||
(SELECT COALESCE(SUM(oi.quantity), 0) FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id = o.id
|
||||
WHERE oi.product_id = p.id AND o.created_at BETWEEN p_start_time AND p_end_time AND o.order_status NOT IN (1, 5)) as pay_count,
|
||||
(SELECT COALESCE(SUM(oi.total_amount), 0) FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id = o.id
|
||||
WHERE oi.product_id = p.id AND o.created_at BETWEEN p_start_time AND p_end_time AND o.order_status NOT IN (1, 5)) as amount
|
||||
WHERE oi.product_id = p.id AND o.created_at BETWEEN p_start_time AND p_end_time AND o.order_status NOT IN (1, 5)) as pay_amount,
|
||||
(SELECT COUNT(*) FROM public.ml_user_favorites f WHERE f.target_id = p.id AND f.target_type = 1 AND f.created_at BETWEEN p_start_time AND p_end_time) as fav_count
|
||||
FROM public.ml_products p
|
||||
WHERE p.status != 4
|
||||
ORDER BY
|
||||
CASE WHEN p_sort_by = 'views' THEN 4
|
||||
WHEN p_sort_by = 'sales' THEN 6
|
||||
WHEN p_sort_by = 'amount' THEN 7
|
||||
ELSE 6 END DESC
|
||||
CASE
|
||||
WHEN p_sort_by = 'views' THEN COALESCE(p.view_count, 0)
|
||||
WHEN p_sort_by = 'sales' THEN (
|
||||
SELECT COALESCE(SUM(oi.quantity), 0) FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id = o.id
|
||||
WHERE oi.product_id = p.id AND o.created_at BETWEEN p_start_time AND p_end_time AND o.order_status NOT IN (1, 5)
|
||||
)
|
||||
WHEN p_sort_by = 'amount' THEN (
|
||||
SELECT COALESCE(SUM(oi.total_amount), 0) FROM public.ml_order_items oi JOIN public.ml_orders o ON oi.order_id = o.id
|
||||
WHERE oi.product_id = p.id AND o.created_at BETWEEN p_start_time AND p_end_time AND o.order_status NOT IN (1, 5)
|
||||
)
|
||||
ELSE COALESCE(p.view_count, 0)
|
||||
END DESC
|
||||
LIMIT p_limit
|
||||
) t;
|
||||
|
||||
|
||||
38
docs/sql/30_rpc/product/rpc_admin_product_count_stats_v1.sql
Normal file
38
docs/sql/30_rpc/product/rpc_admin_product_count_stats_v1.sql
Normal file
@@ -0,0 +1,38 @@
|
||||
-- =====================================================================================
|
||||
-- Admin 商品管理 - 商品状态汇总统计 RPC
|
||||
-- 位置:docs/sql/30_rpc/product/
|
||||
-- 对象类型:RPC 函数(SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:统计出售中、仓库中、草稿箱、回收站各状态的商品数量
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_product_count_stats()
|
||||
RETURNS JSONB
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_result JSONB;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 统计各状态数量
|
||||
-- status 定义:1:上架(出售中), 2:下架(仓库中), 3:草稿, 4:逻辑删除(回收站)
|
||||
SELECT jsonb_build_object(
|
||||
'selling', COUNT(*) FILTER (WHERE status = 1),
|
||||
'warehouse', COUNT(*) FILTER (WHERE status = 2),
|
||||
'draft', COUNT(*) FILTER (WHERE status = 3),
|
||||
'recycle', COUNT(*) FILTER (WHERE status = 4)
|
||||
) INTO v_result
|
||||
FROM public.ml_products;
|
||||
|
||||
RETURN v_result;
|
||||
END;
|
||||
$$;
|
||||
44
docs/sql/30_rpc/product/rpc_admin_product_trend_v1.sql
Normal file
44
docs/sql/30_rpc/product/rpc_admin_product_trend_v1.sql
Normal file
@@ -0,0 +1,44 @@
|
||||
-- =====================================================================================
|
||||
-- Admin 商品统计 - 营业趋势统计 RPC
|
||||
-- 位置:docs/sql/30_rpc/product/
|
||||
-- 对象类型:RPC 函数(SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:按天聚合指定时间范围内的商品浏览量、访客量、支付金额及退款金额
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_product_trend(
|
||||
p_start_time TIMESTAMP WITH TIME ZONE,
|
||||
p_end_time TIMESTAMP WITH TIME ZONE
|
||||
)
|
||||
RETURNS JSONB
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_items JSONB;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 按日聚合统计
|
||||
SELECT jsonb_agg(t) INTO v_items
|
||||
FROM (
|
||||
SELECT
|
||||
to_char(date_trunc('day', gs.day), 'YYYY-MM-DD') AS date_group,
|
||||
(SELECT COUNT(*) FROM public.ml_browse_history bh WHERE date_trunc('day', bh.created_at) = gs.day) as views,
|
||||
(SELECT COUNT(DISTINCT user_id) FROM public.ml_browse_history bh WHERE date_trunc('day', bh.created_at) = gs.day) as visitors,
|
||||
(SELECT COALESCE(SUM(total_amount), 0) FROM public.ml_orders o WHERE date_trunc('day', o.created_at) = gs.day AND o.order_status NOT IN (1, 5)) as pay_amount,
|
||||
(SELECT COALESCE(SUM(total_amount), 0) FROM public.ml_orders o WHERE date_trunc('day', o.created_at) = gs.day AND o.order_status = 7) as refund_amount
|
||||
FROM generate_series(date_trunc('day', p_start_time), date_trunc('day', p_end_time), '1 day'::interval) gs(day)
|
||||
ORDER BY gs.day ASC
|
||||
) t;
|
||||
|
||||
RETURN COALESCE(v_items, '[]'::jsonb);
|
||||
END;
|
||||
$$;
|
||||
Reference in New Issue
Block a user