feat(admin): merge stash changes into comclib-analytics (order/finance/product + rpc sql)
This commit is contained in:
68
docs/sql/30_rpc/order/rpc_admin_cashier_order_list_v1.sql
Normal file
68
docs/sql/30_rpc/order/rpc_admin_cashier_order_list_v1.sql
Normal file
@@ -0,0 +1,68 @@
|
||||
-- =====================================================================================
|
||||
-- Admin 订单功能 - 收银台订单列表分页查询 RPC
|
||||
-- 位置:docs/sql/30_rpc/order/
|
||||
-- 对象类型:RPC 函数(SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_cashier_order_list(
|
||||
p_page INTEGER DEFAULT 1,
|
||||
p_page_size INTEGER DEFAULT 15,
|
||||
p_search_order_no TEXT DEFAULT NULL,
|
||||
p_search_username TEXT DEFAULT NULL
|
||||
)
|
||||
RETURNS JSONB
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_offset INTEGER;
|
||||
v_total BIGINT;
|
||||
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;
|
||||
|
||||
v_offset := (p_page - 1) * p_page_size;
|
||||
|
||||
-- 2. 总数:仅已支付订单
|
||||
SELECT COUNT(*) INTO v_total
|
||||
FROM public.ml_orders o
|
||||
LEFT JOIN public.ak_users u ON o.user_id = u.id
|
||||
WHERE o.paid_at IS NOT NULL
|
||||
AND (p_search_order_no IS NULL OR o.order_no ILIKE '%' || p_search_order_no || '%')
|
||||
AND (p_search_username IS NULL OR u.username ILIKE '%' || p_search_username || '%');
|
||||
|
||||
-- 3. 明细
|
||||
SELECT jsonb_agg(t) INTO v_items
|
||||
FROM (
|
||||
SELECT
|
||||
o.id,
|
||||
o.order_no,
|
||||
o.total_amount,
|
||||
o.discount_amount,
|
||||
o.paid_at,
|
||||
u.username as customer_name,
|
||||
u.phone as customer_phone
|
||||
FROM public.ml_orders o
|
||||
LEFT JOIN public.ak_users u ON o.user_id = u.id
|
||||
WHERE o.paid_at IS NOT NULL
|
||||
AND (p_search_order_no IS NULL OR o.order_no ILIKE '%' || p_search_order_no || '%')
|
||||
AND (p_search_username IS NULL OR u.username ILIKE '%' || p_search_username || '%')
|
||||
ORDER BY o.paid_at DESC
|
||||
LIMIT p_page_size
|
||||
OFFSET v_offset
|
||||
) t;
|
||||
|
||||
RETURN jsonb_build_object(
|
||||
'total', v_total,
|
||||
'items', COALESCE(v_items, '[]'::jsonb)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
87
docs/sql/30_rpc/order/rpc_admin_refund_order_list_v1.sql
Normal file
87
docs/sql/30_rpc/order/rpc_admin_refund_order_list_v1.sql
Normal file
@@ -0,0 +1,87 @@
|
||||
-- =====================================================================================
|
||||
-- Admin 订单功能 - 售后退款列表分页查询 RPC
|
||||
-- 位置:docs/sql/30_rpc/order/
|
||||
-- 对象类型:RPC 函数(SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_refund_order_list(
|
||||
p_page INTEGER DEFAULT 1,
|
||||
p_page_size INTEGER DEFAULT 15,
|
||||
p_refund_status INTEGER DEFAULT NULL,
|
||||
p_search TEXT DEFAULT NULL
|
||||
)
|
||||
RETURNS JSONB
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_offset INTEGER;
|
||||
v_total BIGINT;
|
||||
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;
|
||||
|
||||
v_offset := (p_page - 1) * p_page_size;
|
||||
|
||||
-- 2. 获取总数
|
||||
SELECT COUNT(*) INTO v_total
|
||||
FROM public.ml_refund_orders ro
|
||||
WHERE (p_refund_status IS NULL OR ro.refund_status = p_refund_status)
|
||||
AND (p_search IS NULL OR (
|
||||
ro.refund_no ILIKE '%' || p_search || '%' OR
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ml_orders o
|
||||
WHERE o.id = ro.order_id AND o.order_no ILIKE '%' || p_search || '%'
|
||||
)
|
||||
));
|
||||
|
||||
-- 3. 获取明细数据
|
||||
SELECT jsonb_agg(t) INTO v_items
|
||||
FROM (
|
||||
SELECT
|
||||
ro.id,
|
||||
ro.refund_no,
|
||||
ro.refund_amount,
|
||||
ro.refund_status,
|
||||
ro.refund_reason,
|
||||
ro.applied_at,
|
||||
o.order_no,
|
||||
o.order_status,
|
||||
u.username as customer_name,
|
||||
u.phone as customer_phone,
|
||||
(
|
||||
SELECT jsonb_build_object(
|
||||
'product_name', oi.product_name,
|
||||
'image_url', oi.image_url
|
||||
)
|
||||
FROM public.ml_order_items oi
|
||||
WHERE oi.order_id = ro.order_id
|
||||
LIMIT 1
|
||||
) as product_summary
|
||||
FROM public.ml_refund_orders ro
|
||||
LEFT JOIN public.ml_orders o ON ro.order_id = o.id
|
||||
LEFT JOIN public.ak_users u ON ro.user_id = u.id
|
||||
WHERE (p_refund_status IS NULL OR ro.refund_status = p_refund_status)
|
||||
AND (p_search IS NULL OR (
|
||||
ro.refund_no ILIKE '%' || p_search || '%' OR
|
||||
o.order_no ILIKE '%' || p_search || '%'
|
||||
))
|
||||
ORDER BY ro.applied_at DESC
|
||||
LIMIT p_page_size
|
||||
OFFSET v_offset
|
||||
) t;
|
||||
|
||||
RETURN jsonb_build_object(
|
||||
'total', v_total,
|
||||
'items', COALESCE(v_items, '[]'::jsonb)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
80
docs/sql/30_rpc/order/rpc_admin_write_off_record_list_v1.sql
Normal file
80
docs/sql/30_rpc/order/rpc_admin_write_off_record_list_v1.sql
Normal file
@@ -0,0 +1,80 @@
|
||||
-- =====================================================================================
|
||||
-- Admin 订单功能 - 核销记录列表分页查询 RPC
|
||||
-- 位置:docs/sql/30_rpc/order/
|
||||
-- 对象类型:RPC 函数(SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_write_off_record_list(
|
||||
p_page INTEGER DEFAULT 1,
|
||||
p_page_size INTEGER DEFAULT 15,
|
||||
p_search TEXT DEFAULT NULL,
|
||||
p_verified_only BOOLEAN DEFAULT TRUE
|
||||
)
|
||||
RETURNS JSONB
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_offset INTEGER;
|
||||
v_total BIGINT;
|
||||
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;
|
||||
|
||||
v_offset := (p_page - 1) * p_page_size;
|
||||
|
||||
-- 2. 获取总数(核销订单类型 = 3)
|
||||
SELECT COUNT(*) INTO v_total
|
||||
FROM public.ml_orders o
|
||||
WHERE o.order_type = 3
|
||||
AND (p_verified_only = FALSE OR o.verified_at IS NOT NULL)
|
||||
AND (p_search IS NULL OR o.order_no ILIKE '%' || p_search || '%');
|
||||
|
||||
-- 3. 获取明细
|
||||
SELECT jsonb_agg(t) INTO v_items
|
||||
FROM (
|
||||
SELECT
|
||||
o.id,
|
||||
o.order_no,
|
||||
o.total_amount,
|
||||
o.payment_status,
|
||||
o.order_status,
|
||||
o.created_at,
|
||||
o.verified_at,
|
||||
buyer.username as customer_name,
|
||||
buyer.phone as customer_phone,
|
||||
verifier.username as verifier_name,
|
||||
(
|
||||
SELECT jsonb_build_object(
|
||||
'product_name', oi.product_name,
|
||||
'image_url', oi.image_url
|
||||
)
|
||||
FROM public.ml_order_items oi
|
||||
WHERE oi.order_id = o.id
|
||||
LIMIT 1
|
||||
) as product_summary
|
||||
FROM public.ml_orders o
|
||||
LEFT JOIN public.ak_users buyer ON o.user_id = buyer.id
|
||||
LEFT JOIN public.ak_users verifier ON o.verifier_id = verifier.id
|
||||
WHERE o.order_type = 3
|
||||
AND (p_verified_only = FALSE OR o.verified_at IS NOT NULL)
|
||||
AND (p_search IS NULL OR o.order_no ILIKE '%' || p_search || '%')
|
||||
ORDER BY o.verified_at DESC NULLS LAST, o.created_at DESC
|
||||
LIMIT p_page_size
|
||||
OFFSET v_offset
|
||||
) t;
|
||||
|
||||
RETURN jsonb_build_object(
|
||||
'total', v_total,
|
||||
'items', COALESCE(v_items, '[]'::jsonb)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
Reference in New Issue
Block a user