إصلاح أخطاء شاشة الكباتن من تحديث الذكاء الاصطناعي
استرجاع شبكة أمان موقع السائق (انحدارة من الالتزام ab3be7e2):
- كان شرط "Smart Mode" يتخطّى _startDriverLocationPollingWithTimer كلياً إذا
جاء القبول من السوكيت. قبل إصلاح ترتيب الاتصال كان السوكيت يخسر دائماً
فالـ polling يعمل ويحمل الموقع؛ وبعد أن صار يفوز تعطّلت شبكة الأمان.
- وصول حدث القبول لا يعني أن تدفّق المواقع يعمل: التدفّق له شرط مستقل —
تطبيق السائق يحقن passenger_id في update_location فقط إذا كان rideStatus
نشطاً و BoxName.passengerID مكتوباً، وهو لا يُكتب إلا بعد فتح صفحة خريطة
السائق (map_driver_controller.dart:2444).
- الآن الـ polling يعمل دائماً، و handleDriverLocationUpdate يوقفه تلقائياً
بعد 3 تحديثات ناجحة من السوكيت — وهذا المنطق كان موجوداً أصلاً وهو التصميم
المقصود. السوكيت يبقى المسار السريع بلا فقدان شبكة الأمان.
عدم تعطيل إنشاء الرحلة بانتظار سوكيت غير قابل للوصول:
- ensureConnectedBeforeRide كانت تنتظر 4 ثوانٍ قبل كل طلب. سوكيتات
Workerman تستمع نصّاً صريحاً على 2020/3030 بينما التطبيقان يستخدمان
https:// عليها (nginx لا يمرّرها — انظر docker/nginx/default.conf)، فمصافحة
TLS ضد منفذ غير TLS تتجمّد حتى المهلة ⇒ 4 ثوانٍ مهدورة في كل رحلة.
- المهلة صارت 2ث، وأُضيف cooldown دقيقتين: بعد فشل قريب لا ننتظر إطلاقاً بل
نحاول الاتصال في الخلفية ونكمل الطلب فوراً.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b76eccb763
commit
6fec88251c
@@ -3917,13 +3917,20 @@ class RideLifecycleController extends GetxController {
|
||||
|
||||
PipService.enablePip();
|
||||
|
||||
if (source == "Socket" && mapSocket.isSocketConnected) {
|
||||
Log.print(
|
||||
"🧠 Smart Mode: Socket accepted ride. Skipping polling, relying on WebSocket.");
|
||||
} else {
|
||||
Log.print("🔄 Fallback Mode: $source accepted ride. Starting polling.");
|
||||
_startDriverLocationPollingWithTimer();
|
||||
}
|
||||
// ⚠️ لا نثق بالسوكيت قبل أن **يُثبت** أنه يوصّل المواقع فعلاً.
|
||||
// كان هنا شرط "Smart Mode" يتخطّى الـ polling كلياً إذا جاء القبول من
|
||||
// السوكيت — وهو خطأ: وصول حدث القبول لا يعني أن تدفّق المواقع يعمل.
|
||||
// تدفّق المواقع له شرط مستقل تماماً: تطبيق السائق يحقن passenger_id في
|
||||
// update_location فقط إذا كان rideStatus نشطاً و BoxName.passengerID
|
||||
// مكتوباً — وهو لا يُكتب إلا بعد فتح صفحة خريطة السائق. فبين القبول وفتح
|
||||
// الصفحة لا يوجّه driver_socket أي موقع، وبلا polling لا يظهر الماركر أبداً.
|
||||
//
|
||||
// نشغّل الـ polling دائماً، و handleDriverLocationUpdate يوقفه تلقائياً
|
||||
// بعد 3 تحديثات ناجحة من السوكيت (المنطق موجود هناك أصلاً). هكذا يبقى
|
||||
// السوكيت هو المسار السريع بلا أن نفقد شبكة الأمان.
|
||||
Log.print("🔄 Starting driver-location polling (source: $source). "
|
||||
"Socket will take over and stop it once it proves delivery.");
|
||||
_startDriverLocationPollingWithTimer();
|
||||
}
|
||||
|
||||
void _fillDriverDataLocally(Map<String, dynamic> data) {
|
||||
|
||||
Reference in New Issue
Block a user