feat(admin): complete integration of auth, delivery, and system infrastructure modules
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
-- RPC: rpc_admin_delete_delivery_staff
|
||||
-- 管理端删除配送员
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_delivery_staff(
|
||||
p_id UUID
|
||||
)
|
||||
RETURNS BOOLEAN
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除
|
||||
DELETE FROM public.ml_delivery_staff WHERE id = p_id;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 授权
|
||||
REVOKE ALL ON FUNCTION public.rpc_admin_delete_delivery_staff(UUID) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION public.rpc_admin_delete_delivery_staff(UUID) TO authenticated;
|
||||
@@ -0,0 +1,33 @@
|
||||
-- RPC: rpc_admin_delete_delivery_station
|
||||
-- 管理端删除提货点/核销点
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_delivery_station(
|
||||
p_id UUID
|
||||
)
|
||||
RETURNS BOOLEAN
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除
|
||||
DELETE FROM public.ml_delivery_stations WHERE id = p_id;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 授权
|
||||
REVOKE ALL ON FUNCTION public.rpc_admin_delete_delivery_station(UUID) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION public.rpc_admin_delete_delivery_station(UUID) TO authenticated;
|
||||
@@ -0,0 +1,58 @@
|
||||
-- RPC: rpc_admin_get_delivery_staff_list
|
||||
-- 管理端获取配送员分页列表
|
||||
-- 支持按姓名或手机号搜索
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_get_delivery_staff_list(
|
||||
p_search TEXT DEFAULT NULL,
|
||||
p_status SMALLINT DEFAULT NULL,
|
||||
p_page INTEGER DEFAULT 1,
|
||||
p_page_size INTEGER DEFAULT 20
|
||||
)
|
||||
RETURNS JSONB
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_offset INTEGER := (p_page - 1) * p_page_size;
|
||||
v_total BIGINT;
|
||||
v_items JSONB;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 获取总数
|
||||
SELECT COUNT(*) INTO v_total
|
||||
FROM public.ml_delivery_staff
|
||||
WHERE (p_status IS NULL OR status = p_status)
|
||||
AND (p_search IS NULL OR p_search = '' OR nickname ILIKE '%' || p_search || '%' OR phone ILIKE '%' || p_search || '%');
|
||||
|
||||
-- 3. 获取明细
|
||||
SELECT jsonb_agg(t) INTO v_items
|
||||
FROM (
|
||||
SELECT
|
||||
id, uid, nickname, avatar, phone, status, is_active,
|
||||
created_at, updated_at
|
||||
FROM public.ml_delivery_staff
|
||||
WHERE (p_status IS NULL OR status = p_status)
|
||||
AND (p_search IS NULL OR p_search = '' OR nickname ILIKE '%' || p_search || '%' OR phone ILIKE '%' || p_search || '%')
|
||||
ORDER BY created_at DESC
|
||||
LIMIT p_page_size OFFSET v_offset
|
||||
) t;
|
||||
|
||||
-- 4. 返回结果
|
||||
RETURN jsonb_build_object(
|
||||
'total', v_total,
|
||||
'items', COALESCE(v_items, '[]'::jsonb)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 授权
|
||||
REVOKE ALL ON FUNCTION public.rpc_admin_get_delivery_staff_list(TEXT, SMALLINT, INTEGER, INTEGER) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION public.rpc_admin_get_delivery_staff_list(TEXT, SMALLINT, INTEGER, INTEGER) TO authenticated;
|
||||
@@ -0,0 +1,65 @@
|
||||
-- RPC: rpc_admin_get_delivery_station_list
|
||||
-- 管理端获取提货点/核销点分页列表
|
||||
-- 支持按名称、地址或手机号搜索
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_get_delivery_station_list(
|
||||
p_search TEXT DEFAULT NULL,
|
||||
p_status SMALLINT DEFAULT NULL,
|
||||
p_page INTEGER DEFAULT 1,
|
||||
p_page_size INTEGER DEFAULT 20
|
||||
)
|
||||
RETURNS JSONB
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_offset INTEGER := (p_page - 1) * p_page_size;
|
||||
v_total BIGINT;
|
||||
v_items JSONB;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 获取总数
|
||||
SELECT COUNT(*) INTO v_total
|
||||
FROM public.ml_delivery_stations
|
||||
WHERE (p_status IS NULL OR status = p_status)
|
||||
AND (p_search IS NULL OR p_search = ''
|
||||
OR name ILIKE '%' || p_search || '%'
|
||||
OR address ILIKE '%' || p_search || '%'
|
||||
OR phone ILIKE '%' || p_search || '%');
|
||||
|
||||
-- 3. 获取明细
|
||||
SELECT jsonb_agg(t) INTO v_items
|
||||
FROM (
|
||||
SELECT
|
||||
id, name, phone, address, image,
|
||||
lng, lat, status, sort_order, business_hours,
|
||||
created_at, updated_at
|
||||
FROM public.ml_delivery_stations
|
||||
WHERE (p_status IS NULL OR status = p_status)
|
||||
AND (p_search IS NULL OR p_search = ''
|
||||
OR name ILIKE '%' || p_search || '%'
|
||||
OR address ILIKE '%' || p_search || '%'
|
||||
OR phone ILIKE '%' || p_search || '%')
|
||||
ORDER BY sort_order ASC, created_at DESC
|
||||
LIMIT p_page_size OFFSET v_offset
|
||||
) t;
|
||||
|
||||
-- 4. 返回结果
|
||||
RETURN jsonb_build_object(
|
||||
'total', v_total,
|
||||
'items', COALESCE(v_items, '[]'::jsonb)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 授权
|
||||
REVOKE ALL ON FUNCTION public.rpc_admin_get_delivery_station_list(TEXT, SMALLINT, INTEGER, INTEGER) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION public.rpc_admin_get_delivery_station_list(TEXT, SMALLINT, INTEGER, INTEGER) TO authenticated;
|
||||
@@ -0,0 +1,61 @@
|
||||
-- RPC: rpc_admin_save_delivery_staff
|
||||
-- 管理端新增或更新配送员信息
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_save_delivery_staff(
|
||||
p_id UUID DEFAULT NULL,
|
||||
p_nickname TEXT DEFAULT NULL,
|
||||
p_avatar TEXT DEFAULT NULL,
|
||||
p_phone TEXT DEFAULT NULL,
|
||||
p_status SMALLINT DEFAULT 1
|
||||
)
|
||||
RETURNS UUID
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 参数校验
|
||||
IF p_nickname IS NULL OR p_phone IS NULL THEN
|
||||
RAISE EXCEPTION 'Missing required fields: nickname or phone';
|
||||
END IF;
|
||||
|
||||
-- 3. 新增或更新
|
||||
IF p_id IS NULL THEN
|
||||
INSERT INTO public.ml_delivery_staff (
|
||||
nickname, avatar, phone, status
|
||||
) VALUES (
|
||||
p_nickname, p_avatar, p_phone, p_status
|
||||
) RETURNING id INTO v_id;
|
||||
ELSE
|
||||
UPDATE public.ml_delivery_staff
|
||||
SET
|
||||
nickname = COALESCE(p_nickname, nickname),
|
||||
avatar = COALESCE(p_avatar, avatar),
|
||||
phone = COALESCE(p_phone, phone),
|
||||
status = COALESCE(p_status, status),
|
||||
updated_at = now()
|
||||
WHERE id = p_id
|
||||
RETURNING id INTO v_id;
|
||||
|
||||
IF v_id IS NULL THEN
|
||||
RAISE EXCEPTION 'Delivery staff not found';
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
RETURN v_id;
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 授权
|
||||
REVOKE ALL ON FUNCTION public.rpc_admin_save_delivery_staff(UUID, TEXT, TEXT, TEXT, SMALLINT) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION public.rpc_admin_save_delivery_staff(UUID, TEXT, TEXT, TEXT, SMALLINT) TO authenticated;
|
||||
@@ -0,0 +1,71 @@
|
||||
-- RPC: rpc_admin_save_delivery_station
|
||||
-- 管理端新增或更新提货点/核销点信息
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_save_delivery_station(
|
||||
p_id UUID DEFAULT NULL,
|
||||
p_name TEXT DEFAULT NULL,
|
||||
p_phone TEXT DEFAULT NULL,
|
||||
p_address TEXT DEFAULT NULL,
|
||||
p_image TEXT DEFAULT NULL,
|
||||
p_lng NUMERIC DEFAULT NULL,
|
||||
p_lat NUMERIC DEFAULT NULL,
|
||||
p_status SMALLINT DEFAULT 1,
|
||||
p_sort_order INTEGER DEFAULT 0,
|
||||
p_business_hours JSONB DEFAULT NULL
|
||||
)
|
||||
RETURNS UUID
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 参数校验
|
||||
IF p_name IS NULL OR p_phone IS NULL OR p_address IS NULL THEN
|
||||
RAISE EXCEPTION 'Missing required fields: name, phone or address';
|
||||
END IF;
|
||||
|
||||
-- 3. 新增或更新
|
||||
IF p_id IS NULL THEN
|
||||
INSERT INTO public.ml_delivery_stations (
|
||||
name, phone, address, image, lng, lat, status, sort_order, business_hours
|
||||
) VALUES (
|
||||
p_name, p_phone, p_address, p_image, p_lng, p_lat, p_status, p_sort_order, p_business_hours
|
||||
) RETURNING id INTO v_id;
|
||||
ELSE
|
||||
UPDATE public.ml_delivery_stations
|
||||
SET
|
||||
name = COALESCE(p_name, name),
|
||||
phone = COALESCE(p_phone, phone),
|
||||
address = COALESCE(p_address, address),
|
||||
image = COALESCE(p_image, image),
|
||||
lng = COALESCE(p_lng, lng),
|
||||
lat = COALESCE(p_lat, lat),
|
||||
status = COALESCE(p_status, status),
|
||||
sort_order = COALESCE(p_sort_order, sort_order),
|
||||
business_hours = COALESCE(p_business_hours, business_hours),
|
||||
updated_at = now()
|
||||
WHERE id = p_id
|
||||
RETURNING id INTO v_id;
|
||||
|
||||
IF v_id IS NULL THEN
|
||||
RAISE EXCEPTION 'Station not found';
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
RETURN v_id;
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 授权
|
||||
REVOKE ALL ON FUNCTION public.rpc_admin_save_delivery_station(UUID, TEXT, TEXT, TEXT, TEXT, NUMERIC, NUMERIC, SMALLINT, INTEGER, JSONB) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION public.rpc_admin_save_delivery_station(UUID, TEXT, TEXT, TEXT, TEXT, NUMERIC, NUMERIC, SMALLINT, INTEGER, JSONB) TO authenticated;
|
||||
Reference in New Issue
Block a user