跑通consumer下单之后派单给delivery2
This commit is contained in:
11
docs/sql/10_schema/homecare/homecare_foundation_v1.sql
Normal file
11
docs/sql/10_schema/homecare/homecare_foundation_v1.sql
Normal file
@@ -0,0 +1,11 @@
|
||||
-- =====================================================================================
|
||||
-- Schema: homecare foundation
|
||||
-- Version: v1
|
||||
-- Purpose: 为 ec_service_requests / ec_care_tasks / ec_care_records / hc_* 新链补齐最小结构、索引与基础 RLS。
|
||||
-- Coverage:
|
||||
-- 1. consumer 下单与自动派单字段
|
||||
-- 2. consumer 验收 / 退回整改 / 评价字段
|
||||
-- 3. delivery 执行记录、异常、证据、事件字段
|
||||
-- =====================================================================================
|
||||
|
||||
-- 执行稿见:mall_sql/migrations/20260526_homecare_foundation_v1.sql
|
||||
@@ -11,7 +11,6 @@ ALTER TABLE public.ml_delivery_stations ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 清理旧策略
|
||||
DROP POLICY IF EXISTS delivery_staff_self_select ON public.ml_delivery_staff;
|
||||
DROP POLICY IF EXISTS delivery_staff_assignable_select ON public.ml_delivery_staff;
|
||||
DROP POLICY IF EXISTS delivery_staff_self_update ON public.ml_delivery_staff;
|
||||
DROP POLICY IF EXISTS delivery_stations_select_active ON public.ml_delivery_stations;
|
||||
|
||||
@@ -30,20 +29,7 @@ CREATE POLICY delivery_staff_self_select
|
||||
)
|
||||
);
|
||||
|
||||
-- 2. 已登录用户仅可读取可派单的在线服务人员,用于自动派单
|
||||
CREATE POLICY delivery_staff_assignable_select
|
||||
ON public.ml_delivery_staff
|
||||
FOR SELECT
|
||||
TO authenticated
|
||||
USING (
|
||||
deleted_at IS NULL
|
||||
AND status = 1
|
||||
AND COALESCE(is_active, true) = true
|
||||
AND online_status = 'online'
|
||||
AND uid IS NOT NULL
|
||||
);
|
||||
|
||||
-- 3. 执行人员本人可更新自己的在线状态等自有档案字段
|
||||
-- 2. 执行人员本人可更新自己的在线状态等自有档案字段
|
||||
CREATE POLICY delivery_staff_self_update
|
||||
ON public.ml_delivery_staff
|
||||
FOR UPDATE
|
||||
@@ -67,11 +53,12 @@ CREATE POLICY delivery_staff_self_update
|
||||
)
|
||||
);
|
||||
|
||||
-- 4. 提货点/机构对前台保持只读,仅返回启用且未删除数据
|
||||
-- 3. 提货点/机构对前台保持只读,仅返回启用且未删除数据
|
||||
CREATE POLICY delivery_stations_select_active
|
||||
ON public.ml_delivery_stations
|
||||
FOR SELECT
|
||||
TO anon, authenticated
|
||||
USING (status = 1 AND deleted_at IS NULL);
|
||||
|
||||
-- 4. 派单候选人读取统一走 SECURITY DEFINER RPC,不再开放公开可派单列表 RLS
|
||||
-- 5. 其余直连写操作默认不开放,管理端统一走 SECURITY DEFINER RPC
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_delivery_* homecare actions
|
||||
-- Version: v1
|
||||
-- Purpose: 为 delivery 页面当前 api/delivery.uts 已固定的 rpc_delivery_* 契约补齐 SQL 端实现。
|
||||
-- Notes:
|
||||
-- 1. 优先兼容 ec/hc 新链,检测不到表或执行失败时回退 hss 旧链。
|
||||
-- 2. 返回 JSON 结构直接对齐 delivery/types/delivery.uts。
|
||||
-- 3. message_list 与 record_list 采用最小可用实现,避免前端继续落入 fallback。
|
||||
-- =====================================================================================
|
||||
|
||||
-- 迁移正文见同批文件:mall_sql/migrations/20260526_delivery_homecare_rpc_v1.sql
|
||||
@@ -0,0 +1,54 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_homecare_dispatch_candidate
|
||||
-- Version: v1
|
||||
-- Purpose: 为居家上门服务返回单个可派单候选人,替代公开可派单人员 RLS。
|
||||
-- Security: SECURITY DEFINER + 固定 search_path
|
||||
-- Depends: public.ak_users, public.ml_delivery_staff
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_homecare_dispatch_candidate(
|
||||
p_service_code TEXT DEFAULT NULL,
|
||||
p_station_id UUID DEFAULT NULL
|
||||
)
|
||||
RETURNS JSONB
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_candidate JSONB;
|
||||
BEGIN
|
||||
IF auth.uid() IS NULL OR NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM public.ak_users u
|
||||
WHERE u.auth_id = auth.uid()
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
SELECT jsonb_build_object(
|
||||
'id', s.id,
|
||||
'uid', s.uid,
|
||||
'station_id', s.station_id,
|
||||
'status', s.status,
|
||||
'online_status', s.online_status,
|
||||
'updated_at', s.updated_at,
|
||||
'created_at', s.created_at
|
||||
)
|
||||
INTO v_candidate
|
||||
FROM public.ml_delivery_staff s
|
||||
WHERE s.deleted_at IS NULL
|
||||
AND s.status = 1
|
||||
AND COALESCE(s.is_active, TRUE) = TRUE
|
||||
AND s.online_status = 'online'
|
||||
AND s.uid IS NOT NULL
|
||||
AND (p_station_id IS NULL OR s.station_id = p_station_id)
|
||||
ORDER BY COALESCE(s.updated_at, s.created_at) DESC, s.created_at DESC
|
||||
LIMIT 1;
|
||||
|
||||
RETURN v_candidate;
|
||||
END;
|
||||
$$;
|
||||
|
||||
REVOKE ALL ON FUNCTION public.rpc_homecare_dispatch_candidate(TEXT, UUID) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION public.rpc_homecare_dispatch_candidate(TEXT, UUID) TO authenticated;
|
||||
Reference in New Issue
Block a user