Update: 2026-07-04 18:43:56
This commit is contained in:
+103
-107
@@ -29,10 +29,10 @@ try {
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// 2. طلب الـ IDs والمواقع من سيرفر اللوكيشن (Redis API)
|
||||
// 2. طلب بيانات السائقين من سيرفر اللوكيشن (Redis API)
|
||||
// — يرجع cache hits لو موجودة، وإلا يرجع IDs فقط
|
||||
// ==========================================
|
||||
$locationServerUrl = getenv('LOCATION_API_URL');
|
||||
// تأكد من المسار الصحيح للمفتاح على السيرفر الرئيسي
|
||||
$INTERNAL_KEY = trim(file_get_contents(getenv('INTERNAL_SOCKET_KEY_PATH')));
|
||||
|
||||
$ch = curl_init();
|
||||
@@ -41,7 +41,7 @@ try {
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
|
||||
'lat' => $lat,
|
||||
'lng' => $lng,
|
||||
'radius' => 5, // 5 كم كافية للعرض
|
||||
'radius' => 5,
|
||||
'limit' => 50
|
||||
]));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
@@ -65,119 +65,115 @@ try {
|
||||
exit;
|
||||
}
|
||||
|
||||
// تجهيز خريطة لدمج البيانات لاحقاً (ID => RedisData)
|
||||
$driversMap = [];
|
||||
$driverIds = [];
|
||||
// تقسيم: cache hits → نستخدمها فوراً، cache misses → نحتاج MySQL
|
||||
$final_result = [];
|
||||
$mysqlIds = [];
|
||||
$driversMap = [];
|
||||
$serverNow = date('Y-m-d H:i:s');
|
||||
|
||||
foreach ($redisDrivers as $d) {
|
||||
$driverIds[] = $d['id'];
|
||||
$driversMap[$d['id']] = $d;
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// 3. جلب التفاصيل الكاملة من MySQL (مثل الملف القديم تماماً)
|
||||
// ==========================================
|
||||
|
||||
// تجهيز الـ Placeholders
|
||||
$placeholders = implode(',', array_fill(0, count($driverIds), '?'));
|
||||
|
||||
// الاستعلام الشامل (نفس الحقول القديمة)
|
||||
$sql_drivers_info = "
|
||||
SELECT
|
||||
d.id AS driver_id,
|
||||
d.phone, d.email, d.birthdate, d.first_name, d.last_name, d.gender, d.maritalStatus,
|
||||
cr.make,
|
||||
cr.car_plate,
|
||||
cr.model,
|
||||
cr.color, cr.vin, cr.color_hex,
|
||||
cr.year,
|
||||
cr.vehicle_category_id,
|
||||
dt.token,
|
||||
COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver
|
||||
FROM driver d
|
||||
LEFT JOIN CarRegistration cr ON cr.driverID = d.id
|
||||
LEFT JOIN driverToken dt ON dt.captain_id = d.id
|
||||
LEFT JOIN (
|
||||
SELECT driver_id, AVG(rating) AS ratingDriver
|
||||
FROM ratingDriver
|
||||
GROUP BY driver_id
|
||||
) rdAvg ON rdAvg.driver_id = d.id
|
||||
WHERE d.id IN ($placeholders)
|
||||
AND COALESCE(cr.year, 0) > 2000
|
||||
-- AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%')
|
||||
";
|
||||
|
||||
$stmt = $con->prepare($sql_drivers_info);
|
||||
$stmt->execute($driverIds);
|
||||
$drivers_db = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
if (empty($drivers_db)) {
|
||||
jsonSuccess([], "No matching drivers in DB");
|
||||
exit;
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// 4. معالجة البيانات، الدمج، وفك التشفير
|
||||
// ==========================================
|
||||
|
||||
$final_result = [];
|
||||
$serverNow = date('Y-m-d H:i:s');
|
||||
$fieldsToDecrypt = ['phone','email','gender','birthdate','first_name','last_name','token','car_plate','vin'];
|
||||
|
||||
// الهاش الخاص بالإناث (لتحديد النوع لاحقاً إذا لزم الأمر)
|
||||
// $femaleHash = 'bQ6yWJ2EVXKZooHdGclvmFiDlZCM8UYeO+ILFjDUvpQ=';
|
||||
|
||||
foreach ($drivers_db as $row) {
|
||||
$did = $row['driver_id'];
|
||||
|
||||
// دمج بيانات الموقع الحية من الريدز (أهم خطوة)
|
||||
if (isset($driversMap[$did])) {
|
||||
$redisInfo = $driversMap[$did];
|
||||
$row['latitude'] = $redisInfo['lat'];
|
||||
$row['longitude'] = $redisInfo['lng'];
|
||||
$row['heading'] = $redisInfo['heading'];
|
||||
$row['speed'] = $redisInfo['speed'];
|
||||
// $row['distance'] = $redisInfo['distance']; // إذا أردت إضافتها
|
||||
if (!empty($d['cached']) && !empty($d['first_name'])) {
|
||||
// ✅ Cache hit — بيانات السائق كاملة من Redis, نستخدمها مباشرة
|
||||
$d['serverNow'] = $serverNow;
|
||||
$final_result[] = $d;
|
||||
} else {
|
||||
// حالة نادرة: السائق موجود في الاستعلام ولكن ليس في مصفوفة الريدز (لا يجب أن تحدث)
|
||||
continue;
|
||||
// ❌ Cache miss — نحتاج نجيب البيانات من MySQL
|
||||
$mysqlIds[] = $d['id'];
|
||||
$driversMap[$d['id']] = $d;
|
||||
}
|
||||
}
|
||||
|
||||
$row['serverNow'] = $serverNow;
|
||||
|
||||
// فك التشفير (Decrypt)
|
||||
foreach ($fieldsToDecrypt as $field) {
|
||||
if (isset($row[$field]) && $row[$field] !== null && $row[$field] !== '') {
|
||||
try {
|
||||
$row[$field] = $encryptionHelper->decryptData($row[$field]);
|
||||
} catch (Exception $e) {
|
||||
$row[$field] = null;
|
||||
// ==========================================
|
||||
// 3. فقط للسائقين اللي ما فيهم Cache: MySQL
|
||||
// ==========================================
|
||||
if (!empty($mysqlIds)) {
|
||||
$placeholders = implode(',', array_fill(0, count($mysqlIds), '?'));
|
||||
|
||||
$sql_drivers_info = "
|
||||
SELECT
|
||||
d.id AS driver_id,
|
||||
d.phone, d.email, d.birthdate, d.first_name, d.last_name, d.gender, d.maritalStatus,
|
||||
cr.make, cr.car_plate, cr.model, cr.color, cr.vin, cr.color_hex, cr.year, cr.vehicle_category_id,
|
||||
dt.token,
|
||||
COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver
|
||||
FROM driver d
|
||||
LEFT JOIN CarRegistration cr ON cr.driverID = d.id
|
||||
LEFT JOIN driverToken dt ON dt.captain_id = d.id
|
||||
LEFT JOIN (
|
||||
SELECT driver_id, AVG(rating) AS ratingDriver FROM ratingDriver GROUP BY driver_id
|
||||
) rdAvg ON rdAvg.driver_id = d.id
|
||||
WHERE d.id IN ($placeholders)
|
||||
AND COALESCE(cr.year, 0) > 2000
|
||||
";
|
||||
|
||||
$stmt = $con->prepare($sql_drivers_info);
|
||||
$stmt->execute($mysqlIds);
|
||||
$drivers_db = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
$fieldsToDecrypt = ['phone','email','gender','birthdate','first_name','last_name','token','car_plate','vin'];
|
||||
|
||||
foreach ($drivers_db as $row) {
|
||||
$did = $row['driver_id'];
|
||||
|
||||
if (isset($driversMap[$did])) {
|
||||
$redisInfo = $driversMap[$did];
|
||||
$row['latitude'] = $redisInfo['latitude'] ?? $redisInfo['lat'] ?? '';
|
||||
$row['longitude'] = $redisInfo['longitude'] ?? $redisInfo['lng'] ?? '';
|
||||
$row['heading'] = $redisInfo['heading'] ?? '0';
|
||||
$row['speed'] = $redisInfo['speed'] ?? '0';
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
$row['serverNow'] = $serverNow;
|
||||
|
||||
foreach ($fieldsToDecrypt as $field) {
|
||||
if (isset($row[$field]) && $row[$field] !== null && $row[$field] !== '') {
|
||||
try {
|
||||
$row[$field] = $encryptionHelper->decryptData($row[$field]);
|
||||
} catch (Exception $e) {
|
||||
$row[$field] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($row['birthdate'])) {
|
||||
try {
|
||||
$birthdate = new DateTime($row['birthdate']);
|
||||
$today = new DateTime();
|
||||
$row['age'] = $today->diff($birthdate)->y;
|
||||
} catch (Exception $e) { $row['age'] = null; }
|
||||
} else {
|
||||
$row['age'] = null;
|
||||
}
|
||||
|
||||
$final_result[] = $row;
|
||||
|
||||
// 🆕 Fill driver:public cache for next time (async, fire-and-forget)
|
||||
sendToLocationServer('cache_driver_public', [
|
||||
'driver_id' => $did,
|
||||
'data' => json_encode([
|
||||
'first_name' => $row['first_name'] ?? '',
|
||||
'last_name' => $row['last_name'] ?? '',
|
||||
'gender' => $row['gender'] ?? '',
|
||||
'make' => $row['make'] ?? '',
|
||||
'model' => $row['model'] ?? '',
|
||||
'color' => $row['color'] ?? '',
|
||||
'color_hex' => $row['color_hex'] ?? '',
|
||||
'year' => $row['year'] ?? '',
|
||||
'car_plate' => $row['car_plate'] ?? '',
|
||||
'ratingDriver'=> $row['ratingDriver'] ?? '0',
|
||||
'latitude' => $row['latitude'] ?? '',
|
||||
'longitude' => $row['longitude'] ?? '',
|
||||
'heading' => $row['heading'] ?? '0',
|
||||
'speed' => $row['speed'] ?? '0',
|
||||
'updated_at' => time()
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
// حساب العمر
|
||||
if (!empty($row['birthdate'])) {
|
||||
try {
|
||||
$birthdate = new DateTime($row['birthdate']);
|
||||
$today = new DateTime();
|
||||
$row['age'] = $today->diff($birthdate)->y;
|
||||
} catch (Exception $e) { $row['age'] = null; }
|
||||
} else {
|
||||
$row['age'] = null;
|
||||
}
|
||||
|
||||
// إضافة نوع السيارة البسيط (اختياري، إذا كان التطبيق يعتمد عليه)
|
||||
/*
|
||||
$type = 'car';
|
||||
if ($row['vehicle_category_id'] == 2) $type = 'bike';
|
||||
elseif ($row['gender'] == 'female') $type = 'lady'; // بعد فك التشفير تكون female
|
||||
$row['type'] = $type;
|
||||
*/
|
||||
|
||||
$final_result[] = $row;
|
||||
}
|
||||
|
||||
// إرجاع النتيجة بنفس الهيكل القديم
|
||||
// إرجاع النتيجة
|
||||
jsonSuccess($final_result);
|
||||
|
||||
} catch (PDOException $e) {
|
||||
|
||||
Reference in New Issue
Block a user