اذهب إلى المحتوى

السؤال

نشر

مرحبا، في تطبيقات مشهورة مثل تطبيق Uber، يقوم ال system بإسناد الراكب إلى أقرب سائق، ثم إذا رفض السائق أو مر وقت معين، يقوم ال system بإسناد الراكب إلى سائق آخر، كيف يمكن عمل هذا الشيء باستخدام laravel framework ؟

Recommended Posts

  • 0
نشر

يمكنك الاستعانة بمفهوم جدولة المهام Task scheduling و طوابير الانتظار Queue لتنفيذ او جدولة مهمة اسناد الراكب الى السائق المستهدف والتحقق من قبول ذلك. فيكون منطق العملية مشابها لـ:

  • عند تقديم طلب من طرف الراكب او العميل يتم اضافة مهمة اسناد الراكب للسائق الى طابور انتظار
  • يتم مباشرة التحقق من تنفيذ او قبول المهمة عن طريق ارفاق ما يسمى بخيار تواتر frequency option للمهمة المجدولة، اذ يتم التحقق من ما ان تمت المهمة المقصودة كل مدة n من الزمن.
  • في حالة عدم قبول اسناد المهمة خلال المدة n يتم اعادة الاسناد الى سائق آخر وهكذا.

بالطبع فإن هذا هو المنطق العام للعملية. يمكنك التوسع في الفكرة أكثر.

جدولة المهام (Task scheduling) في Laravel

  • 0
نشر
بتاريخ 4 ساعات قال Adnane Kadri:

يمكنك الاستعانة بمفهوم جدولة المهام Task scheduling و طوابير الانتظار Queue لتنفيذ او جدولة مهمة اسناد الراكب الى السائق المستهدف والتحقق من قبول ذلك. فيكون منطق العملية مشابها لـ:

  • عند تقديم طلب من طرف الراكب او العميل يتم اضافة مهمة اسناد الراكب للسائق الى طابور انتظار
  • يتم مباشرة التحقق من تنفيذ او قبول المهمة عن طريق ارفاق ما يسمى بخيار تواتر frequency option للمهمة المجدولة، اذ يتم التحقق من ما ان تمت المهمة المقصودة كل مدة n من الزمن.
  • في حالة عدم قبول اسناد المهمة خلال المدة n يتم اعادة الاسناد الى سائق آخر وهكذا.

بالطبع فإن هذا هو المنطق العام للعملية. يمكنك التوسع في الفكرة أكثر.

جدولة المهام (Task scheduling) في Laravel

شكرا كتير، لكن الفكرة للأسف غير واضحة بشكل كامل عندما نأتي للناحية التقنية
ممكن مصادر أكثر عن الموضوع، حتى ما أغلبك، أو يا ريت لو فيه كود لهذه العملية بحيث أقدر أفهم العملية من خلال الكود

  • 0
نشر
بتاريخ 1 دقيقة مضت قال Mohammed Abu Yousef:

شكرا كتير، لكن الفكرة للأسف غير واضحة بشكل كامل عندما نأتي للناحية التقنية
ممكن مصادر أكثر عن الموضوع، حتى ما أغلبك، أو يا ريت لو فيه كود لهذه العملية بحيث أقدر أفهم العملية من خلال الكود

أظن أن معرفة بسيطة بجزئيتي جدولة المهام وطوابير الانتظار في لارافيل سيكون كافيا لتصور شيفرة كاملة عن العملية الموضحة اعلاه.

  • 0
نشر
بتاريخ 15 دقائق مضت قال Adnane Kadri:

أظن أن معرفة بسيطة بجزئيتي جدولة المهام وطوابير الانتظار في لارافيل سيكون كافيا لتصور شيفرة كاملة عن العملية الموضحة اعلاه.

للأسف انا دارس الموضوعين، ومن أكثر من مصدر، لكن مش قادر أتمكن أرسم تحليل صحيح لل life cycle الخاصة بشيء مثل هيك

  • 0
نشر
بتاريخ 2 دقائق مضت قال Mohammed Abu Yousef:

للأسف انا دارس الموضوعين، ومن أكثر من مصدر، لكن مش قادر أتمكن أرسم تحليل صحيح لل life cycle الخاصة بشيء مثل هيك

هل قمت بكتابة اي شيفرات او بانشاء اي مهام يمكن توجيهها للطريقة الموصوفة؟

  • 0
نشر
بتاريخ 1 دقيقة مضت قال Adnane Kadri:

هل قمت بكتابة اي شيفرات او بانشاء اي مهام يمكن توجيهها للطريقة الموصوفة؟

حاولت ولم ينجح للأسف، لو عندي تحليل لنظام بسيط يشمل الفكرة فقط ( يكون حققت المطلوب )

  • 1
نشر
بتاريخ 29 دقائق مضت قال Mohammed Abu Yousef:

حاولت ولم ينجح للأسف، لو عندي تحليل لنظام بسيط يشمل الفكرة فقط ( يكون حققت المطلوب )

كتطبيق عملي للوصف السابق يمكنك القيام بالتالي:

  • عند تقديم طلب من طرف الراكب او العميل يتم االتالي.

    <?php 
    
    
    ... 
    
    class RideController extends controller {
    
       /**
        * حجز رحلة
        *
        * @return void
       */
       public function book(){
         // انشاء رحلة جديدة وسائق معين
         $ride = Ride::create([ 'user_id' => auth()->id() , 'driver_id' => 'RANDOM_DRIVER_ID']);
         
         // انشاءرحلة مجدولة
         ScheduledRide::create([ 'ride_id' => $ride->id ]);
         
         // تنبيه السائق عن رحلة جديدة
         event(new NotifyDriverByRideEvent($scheduledRides->ride));
       }
    
    }

    لاحظ وجود انموذج بيانات Ride يعبر عن الرحلة التي قام المستخدم بحجزها. في ذات الوقت تم انشاء رحلة مجدولة تعبر عن مهمة جدولة الرحلة. ويتم تمثيل ذلك بانموذج ببيانات آخر هو ScheduledRide

  • سنحتاج الآن جعل هاته الرحلات المجدولة مهام يتم تحميلها بشكل ديناميكي من طرف المجدول. ليمكن التحقق مثلا من ما ان كانت الرحلة قبلت من السائق خلال الخمس دقائق الماضية او هي معلقة.
    بملف app/Console/Kernel.php سنحتاج عرض كامل الرحلات المعلقة او المجدولة والتحقق مثلا من ما ان قام السائق بقبول الرحلة أو لا:

    /**
         * Define the application's command schedule.
         *
         * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
         * @return void
         */
        protected function schedule(Schedule $schedule)
        {
            /* جلب كاملة الرحلات المجدولة */
            $scheduledRides = ScheduledRide::all();
            
            // المرور على كامل الرحلات المجدولة
            foreach ($scheduledRides as $scheduledRide) {
                $schedule->call(function() use($scheduledRide) {
                      // التحقق من ما ان قبلت الرحلة من طرف السائق
                      if($scheduledRide->ride->is_approved_by_driver){
                          // ان كانت الرحلة قد قبلت لن نحتاج ان تكون الرحلة مجدولة او معلقة فهي تامة
                          $scheduledRide->delete();
                      }else{ // اما في غير ذلك 
                          
                          // سنعدل الرحلة التي تمثل الرحلة المجدولة هاته ونسندها لسائق جديد
                          $scheduledRide->ride->update(['driver_id' => 'NEW_DRIVER_ID']);
                          
                          // وبالطبع ننبه السائق الجديد ايضا
                          event(new NotifyDriverByRideEvent($scheduledRide->ride));
                          
                          // .. ولما لا اخبار السائق السابق بان الرحلة قد فاتته
                          // او استعمال ذلك في حساب معدل ادائه في التطبيق
                      }
    
                })->everyTenMinutes(); // ضع اي خيار تواتر يوافق حاجتك او حاجة العملاء
            }
        }

    طبعا الفكرة تحتاج تنظيما وتنظيفا اكثر، ولكن ستتجه بشكل او بآخر نحو ذات المفاهيم.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...