Food: single-source tracking, mode exclusivity, in-app navigation

This commit is contained in:
Hamza-Ayed
2026-08-04 02:41:54 +03:00
parent 788d3dcbe5
commit d695834d19
14 changed files with 607 additions and 83 deletions
+16 -1
View File
@@ -508,7 +508,22 @@ function foodFindNearbyCouriers(float $lat, float $lng, float $radiusKm = 5, int
$optedIn = $redis->sMembers('food:couriers:opted_in');
if (!$optedIn) return [];
return array_values(array_intersect($nearby, $optedIn));
$candidates = array_values(array_intersect($nearby, $optedIn));
if (!$candidates) return [];
// مهمة واحدة في الوقت الواحد: التطبيق يُعلن السائق مشغولاً في نظام الرحلات
// فور إسناد طلب له، فيخرج من geo:drivers:available وحده. لكن ذلك يعتمد على
// وصول تحديث موقع، فقد يتأخر ثوانٍ. هذا الفحص هو الضمانة القاطعة: لا يُعرض
// طلب ثانٍ على سائق يحمل طلباً نشطاً مهما تأخّر تحديث المجموعة.
$placeholders = implode(',', array_fill(0, count($candidates), '?'));
$busySt = Database::get('food')->prepare(
"SELECT DISTINCT courier_id FROM food_orders
WHERE courier_id IN ($placeholders) AND status IN ('courier_assigned','picked_up')"
);
$busySt->execute($candidates);
$busy = array_column($busySt->fetchAll(), 'courier_id');
return array_values(array_diff($candidates, $busy));
}
function foodOfferOrderToCourier(int $orderId, string $courierId): void