Update: 2026-08-07 01:53:09

This commit is contained in:
Hamza-Ayed
2026-08-07 01:53:09 +03:00
parent 5b864e30df
commit 9830e5f649
7 changed files with 289 additions and 26 deletions
+24
View File
@@ -155,6 +155,30 @@ function dispatchReadSignals($redisLocation, array $driverIds): array
return $signals;
}
/**
* ‏أول مرشح في الطابور — أي صاحب السبق المتوقّع.
*
* ‏يُقرأ بلا إخراج (lIndex لا lPop): السوكِت هو من يسحب من الطابور، وسحبنا
* ‏منه هنا كان سيحرم الأول من عرضه.
*
* ⚠️ ‏قد يتخطّاه السوكِت إن كان غير متصل، فيصير السبق لغيره بينما وصل هذا
* ‏إشعار FCM. لا ضرر: تطبيقه سيجد الرحلة مأخوذة أو عامة، والسبق ينتهي
* ‏بعد ثوانٍ على أي حال.
*/
function dispatchHeadStartDriver($redisLocation, $rideId): ?string
{
if (!$redisLocation) {
return null;
}
try {
$first = $redisLocation->lIndex("ride:$rideId:dispatch_queue", 0);
return ($first === false || $first === null) ? null : (string) $first;
} catch (Throwable $e) {
error_log("[dispatch] تعذّرت قراءة صاحب السبق RideID=$rideId: " . $e->getMessage());
return null;
}
}
/**
* ‏يرتّب المرشحين ويسلّمهم للسوكِت ليمنح الأفضلَ سبقاً حصرياً قصيراً.
*
+22
View File
@@ -492,6 +492,28 @@ try {
if ($batchedStarted) {
notifySocketStartBatchedDispatch($insertedId);
// ‏السوكِت يوصل العرض لمن تطبيقه مفتوح فقط. بلا FCM، السائق
// ‏الأفضل ترتيباً وتطبيقه مغلق لا يعلم بسبقه إطلاقاً — فيضيع
// ‏السبق كله ويذهب للبثّ. نرسل له إشعاراً موازياً.
$headStartDriver = dispatchHeadStartDriver($redisLocation ?? null, $insertedId);
if ($headStartDriver !== null) {
$headDriverRow = null;
foreach ($driversData as $d) {
if ((string)($d['driver_id'] ?? '') === $headStartDriver) {
$headDriverRow = $d;
break;
}
}
if ($headDriverRow) {
dispatchRideToDrivers(
[$headDriverRow], $insertedId, $payload, $start_name_loc,
$encryptionHelper, $extraDispatchData,
['exclusive', dispatchHeadStartSeconds()]
);
}
}
error_log("[add_ride] RideID=$insertedId أُسند بالدفعات.");
} else {
error_log("[add_ride] تعذّر الإسناد بالدفعات RideID=$insertedId"