قرار المالك 2026-07-27: باك إند سيرو PHP هو المعتمد، وتطبيقاته المجرّبة ميدانياً تحل محل إعادة البناء المؤرشفة. سيرو نفسه لم يُمسّ. الخريطة: backend · payment_server · loction_server · ride_server · passenger_server · docker · dashboard · stress_test → الجذر siro_rider → apps/rider siro_driver → apps/driver siro_admin → dashboards/admin siro_service → dashboards/service android_bot → apps/android_bot socialBot → apps/socialBot نُسخ المتعقَّب في git سيرو فقط عبر `git archive` (3,198 ملفاً / ~169 م.ب) لا `cp -r` — فاستُثنيت مخلفات البناء تلقائياً. بلا أي تعديل محتوى عمداً: كل ما يلي يصير فرقاً مقروءاً مقابل المصدر. لم يُستورد وسببه: siromove.com (الموقع التسويقي يبقى marketing/ في تريبز، سيرو فيه 8 ملفات) · docs و planning (تريبز له docs/ الخاص) · deploy.sh (ليس نشراً على سيرفر بل `git add . && git push origin --all` — فخّ في مستودع آخر) · transit_dashboard (بانتظار قرار مصير backend-transit و dashboards/transit-web). ⚠️ لا يبني بعد — ثلاثة نواقص متوقعة ومقصودة: 1. `.env` و `lib/env/env.g.dart` غير متعقَّبين في سيرو (أسرار لكل مستأجر): كل تطبيق فلاتر يحتاج .env خاصاً ثم توليد env.g.dart بـ build_runner. 2. إعدادات Firebase (9 ملفات google-services.json و GoogleService-Info.plist) يستبعدها .gitignore تريبز — ولكل مستأجر مشروع Firebase خاص أصلاً. 3. apps/driver في سيرو يشير إلى `../../Intaleq/packages/get` خارج المستودع → يجب ضمّ الحزم داخله أسوة بـ apps/rider. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
104 lines
3.1 KiB
PHP
104 lines
3.1 KiB
PHP
<?php
|
|
/**
|
|
* cron_generate_heatmap_cache.php
|
|
* يجمع بيانات الخريطة الحرارية ويخزنها في Redis
|
|
*/
|
|
|
|
require_once __DIR__ . '/../core/bootstrap.php';
|
|
require_once __DIR__ . '/../functions.php';
|
|
|
|
try {
|
|
$con = Database::get('main');
|
|
$redis = getRedisConnection();
|
|
} catch (Exception $e) {
|
|
die("Connection failed: " . $e->getMessage() . "\n");
|
|
}
|
|
|
|
echo "Starting Heatmap Cache Generation (Redis)...\n";
|
|
|
|
// مربعات المدن الكبرى لتمثيل الدول (لتجنب حساب المضلعات المعقدة)
|
|
// الأردن (عمان والزرقاء)
|
|
// سوريا (دمشق)
|
|
// مصر (القاهرة والإسكندرية)
|
|
// العراق (بغداد)
|
|
$cityBounds = [
|
|
'JO' => [ // Amman & Zarqa rough bounding box
|
|
'lat' => [31.80, 32.20],
|
|
'lng' => [35.80, 36.20]
|
|
],
|
|
'SY' => [ // Damascus
|
|
'lat' => [33.40, 33.60],
|
|
'lng' => [36.20, 36.40]
|
|
],
|
|
'EG' => [ // Cairo & Alexandria
|
|
'lat' => [29.80, 31.30],
|
|
'lng' => [29.80, 31.50]
|
|
],
|
|
'IQ' => [ // Baghdad
|
|
'lat' => [33.10, 33.50],
|
|
'lng' => [44.20, 44.60]
|
|
]
|
|
];
|
|
|
|
try {
|
|
$sql = "SELECT latitude, longitude, source, created_at
|
|
FROM passenger_opening_locations
|
|
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
|
|
ORDER BY created_at DESC
|
|
LIMIT 20000";
|
|
|
|
$stmt = $con->query($sql);
|
|
$locations = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
$stats = ['geofence' => 0, 'app_usage' => 0, 'silent_push' => 0];
|
|
|
|
// تقسيم البيانات حسب الدولة (لتسهيل قراءتها من الـ API)
|
|
$countryData = [
|
|
'JO' => [], 'SY' => [], 'EG' => [], 'IQ' => [], 'OTHER' => []
|
|
];
|
|
|
|
foreach ($locations as $loc) {
|
|
$lat = (float)$loc['latitude'];
|
|
$lng = (float)$loc['longitude'];
|
|
if ($lat == 0 || $lng == 0) continue;
|
|
|
|
$src = $loc['source'] ?? 'app_usage';
|
|
$date = substr($loc['created_at'], 0, 10);
|
|
|
|
$assignedCountry = 'OTHER';
|
|
// البحث عن المربع الذي يقع فيه الإحداثي
|
|
foreach ($cityBounds as $cc => $b) {
|
|
if ($lat >= $b['lat'][0] && $lat <= $b['lat'][1] &&
|
|
$lng >= $b['lng'][0] && $lng <= $b['lng'][1]) {
|
|
$assignedCountry = $cc;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (isset($stats[$src])) $stats[$src]++;
|
|
|
|
$countryData[$assignedCountry][] = [
|
|
'lat' => $lat,
|
|
'lng' => $lng,
|
|
'source' => $src,
|
|
'date' => $date
|
|
];
|
|
}
|
|
|
|
$redisData = [
|
|
'last_updated' => date('Y-m-d H:i:s'),
|
|
'total' => count($locations),
|
|
'stats' => $stats,
|
|
'data' => $countryData // مقسمة وجاهزة
|
|
];
|
|
|
|
$redis->set('siro:cache:heatmap:data', json_encode($redisData, JSON_UNESCAPED_UNICODE));
|
|
|
|
echo "Heatmap Cache Generated Successfully. Points: " . count($locations) . "\n";
|
|
|
|
} catch (Exception $e) {
|
|
error_log("Error generating heatmap cache: " . $e->getMessage());
|
|
echo "Error: " . $e->getMessage();
|
|
}
|
|
?>
|