Update: 2026-08-07 01:53:09
This commit is contained in:
+24
-2
@@ -365,7 +365,12 @@ function notifyPassengerOnRideServer($passenger_id, $payload) {
|
||||
// ============================================================================
|
||||
// دالة توزيع الطلب (Dispatch Function) - النسخة المصححة
|
||||
// ============================================================================
|
||||
function dispatchRideToDrivers($driversData, $rideId, $payloadTemplate, $startNameLoc, $encryptionHelper, $extraFcmData = []) {
|
||||
/**
|
||||
* $offerInfo — وسم العرض في الإسناد بالدفعات: ['exclusive', 5].
|
||||
* يُمرَّر فقط لصاحب السبق الحصري، ويُترك null في البثّ الحر فلا يتغيّر شيء.
|
||||
* الفهرسان 37 و38 يقرأهما OrderData.fromList في تطبيق السائق.
|
||||
*/
|
||||
function dispatchRideToDrivers($driversData, $rideId, $payloadTemplate, $startNameLoc, $encryptionHelper, $extraFcmData = [], $offerInfo = null) {
|
||||
$countDrivers = count($driversData);
|
||||
error_log("🚀 [DISPATCH_START] RideID: $rideId | Drivers Count: $countDrivers");
|
||||
|
||||
@@ -386,7 +391,19 @@ function dispatchRideToDrivers($driversData, $rideId, $payloadTemplate, $startNa
|
||||
// تجهيز البيانات الخاصة بالسائق
|
||||
$payloadForDriver = $payloadTemplate;
|
||||
$payloadForDriver[6] = (string)$driverId;
|
||||
$payloadForDriver[18] = (string)$driverId;
|
||||
$payloadForDriver[18] = (string)$driverId;
|
||||
|
||||
// وسم العرض للفهرسَين اللذين يقرأهما تطبيق السائق. الفهارس بينهما
|
||||
// قد تكون غير معرَّفة، فنملؤها بفراغ وإلا صارت القائمة متفرقة
|
||||
// (sparse) وخرجت من json_encode كخريطة لا كمصفوفة.
|
||||
if ($offerInfo !== null) {
|
||||
for ($i = count($payloadForDriver); $i < 37; $i++) {
|
||||
$payloadForDriver[$i] = '';
|
||||
}
|
||||
$payloadForDriver[37] = (string)$offerInfo[0];
|
||||
$payloadForDriver[38] = (string)$offerInfo[1];
|
||||
ksort($payloadForDriver);
|
||||
}
|
||||
|
||||
// 2. إرسال السوكيت
|
||||
sendSocketNotification($driverId, $rideId, $payloadForDriver, $socketUrl, $internalKey);
|
||||
@@ -400,6 +417,11 @@ function dispatchRideToDrivers($driversData, $rideId, $payloadTemplate, $startNa
|
||||
|
||||
// 🆕 Destination Match Indicator
|
||||
$title = "طلب جديد 🔔";
|
||||
if ($offerInfo !== null && $offerInfo[0] === 'exclusive') {
|
||||
$title = "⭐ طلب خاص لك";
|
||||
$fcmData['offer_type'] = 'exclusive';
|
||||
$fcmData['offer_expires_in'] = (string)$offerInfo[1];
|
||||
}
|
||||
if (!empty($driver['is_destination_match'])) {
|
||||
$title = "في طريقك! 📍";
|
||||
$fcmData['is_destination_match'] = "1";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* يرتّب المرشحين ويسلّمهم للسوكِت ليمنح الأفضلَ سبقاً حصرياً قصيراً.
|
||||
*
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user