Files
medical-mall/mall_sql/diagnostics/dispatch_failure_diagnosis.sql

102 lines
2.9 KiB
SQL

-- ============================================================================
-- 派单失败诊断脚本
-- 执行时间: 2026-06-10
-- 目的: 诊断为什么派单返回 ALL_ELIGIBLE_STAFF_BUSY
-- ============================================================================
-- 1. 查看问题订单的详细信息
SELECT
id,
order_no,
status,
payment_status,
dispatch_status,
dispatch_error_code,
dispatch_error_message,
service_lat,
service_lng,
dispatch_station_id,
required_qualification_code,
scheduled_start_at,
scheduled_end_at,
appointment_time,
address_snapshot_json->>'latitude' as address_lat,
address_snapshot_json->>'longitude' as address_lng,
created_at
FROM public.hss_service_orders
WHERE id = 'so-1781054320183-35441'
AND deleted_at IS NULL;
-- 2. 查看所有在线服务人员
SELECT
id,
status,
is_active,
online_status,
uid,
station_id,
current_lat,
current_lng,
dispatch_radius_km,
last_dispatched_at
FROM public.ml_delivery_staff
WHERE deleted_at IS NULL
AND status = 1
AND COALESCE(is_active, TRUE) = TRUE
ORDER BY id;
-- 3. 查看服务人员的活跃派单记录(关键:哪些人员在忙)
SELECT
sa.id as assignment_id,
sa.staff_id,
sa.order_id,
sa.status as assignment_status,
sa.assigned_at,
so.status as order_status,
so.appointment_time,
so.scheduled_start_at,
so.scheduled_end_at
FROM public.hss_service_assignments sa
JOIN public.hss_service_orders so ON so.id = sa.order_id
WHERE sa.deleted_at IS NULL
AND sa.status IN ('assigned', 'accepted', 'departed', 'arrived', 'serving', 'in_service')
ORDER BY sa.assigned_at DESC
LIMIT 20;
-- 4. 查看是否有服务人员在任何活跃任务中
SELECT
s.id as staff_id,
s.online_status,
COUNT(DISTINCT sa.id) as active_assignment_count
FROM public.ml_delivery_staff s
LEFT JOIN public.hss_service_assignments sa
ON sa.staff_id::TEXT = s.id::TEXT
AND sa.deleted_at IS NULL
AND sa.status IN ('assigned', 'accepted', 'departed', 'arrived', 'serving', 'in_service')
WHERE s.deleted_at IS NULL
AND s.status = 1
AND COALESCE(s.is_active, TRUE) = TRUE
AND s.online_status = 'online'
GROUP BY s.id, s.online_status
ORDER BY active_assignment_count DESC;
-- 5. 修复建议:如果订单有地址经纬度,更新到订单主表
UPDATE public.hss_service_orders
SET
service_lat = (address_snapshot_json->>'latitude')::FLOAT,
service_lng = (address_snapshot_json->>'longitude')::FLOAT,
updated_at = clock_timestamp()
WHERE id = 'so-1781054320183-35441'
AND (service_lat IS NULL OR service_lng IS NULL)
AND address_snapshot_json->>'latitude' != '';
-- 6. 更新后验证
SELECT
id,
service_lat,
service_lng,
address_snapshot_json->>'latitude' as address_lat,
address_snapshot_json->>'longitude' as address_lng
FROM public.hss_service_orders
WHERE id = 'so-1781054320183-35441';