بدء استخدام Fleet Engine لتتبّع الشحن

صمِّم أنشطة أسطولك من أجل المرحلة الأولى والأخيرة من عمليات التسليم باستخدام واجهة برمجة التطبيقات Fleet Engine Deliveries API. يمكنك استخدام واجهة برمجة التطبيقات هذه باستخدام Driver SDK لنظامي التشغيل Android وiOS، أو مباشرةً باستخدام طلبات HTTP REST أو gRPC.

عملية الإعداد الأوّلية

يمكنك ضبط واجهة برمجة التطبيقات Fleet Engine Deliveries API في Google Cloud Console.

  • للحصول على معلومات حول الخطوات التي يجب اتخاذها داخل وحدة التحكّم وكيفية إنشاء رمز JSON المميّز للويب للتفويض، يُرجى الاطّلاع على المصادقة والتفويض.

  • للحصول على تفاصيل عن استخدام وحدة التحكّم، راجِع مستندات Google Cloud Console.

التحقّق من صحة الإعداد

بعد إنشاء حسابات الخدمة، تأكَّد من اكتمال عملية الإعداد ويمكنك إنشاء مركبة توصيل. يضمن التحقق من الإعداد على الفور أن تكون قد عالجت مشكلات التفويض الشائعة التي يمكن أن تنشأ عند إعداد مشروعك. هناك طريقتان للتحقق من الإعداد:

مكتبات العملاء

لتقديم تجربة أفضل للمطوّرين بدلاً من gRPC أو REST الأوّليين، استخدِم مكتبات العملاء بعدة لغات برمجة شائعة. للحصول على تعليمات حول كيفية الحصول على مكتبات العملاء لتطبيق الخادم، يُرجى الاطّلاع على مكتبات العميل.

تفترض أمثلة Java في هذه الوثائق أنك على دراية بـ gRPC.

هياكل البيانات

تستخدم Fleet Engine Deliveries API هيكلي بيانات لوضع نماذج لاستلام الشحنات وتسليمها:

  • مركبة التسليم المُستخدَمة لنقل الشحنة
  • مهام استلام الشحنة والتسليم.

ويمكنك أيضًا استخدام المهام لوضع نماذج استراحة السائق ومحطات التوقف المجدولة على مدار اليوم.

مركبات توصيل الطلبات

تنقل مركبات التسليم الشحنات من المستودع إلى موقع التسليم، ومن موقع الاستلام إلى المستودع. في بعض الحالات، قد تقوم أيضًا بنقل شحنة مباشرة من موقع الاستلام إلى موقع التسليم.

استخدِم Driver SDK لإنشاء عنصر DeliveryVehicle في Fleet Engine وإرسال آخر المعلومات حول الموقع الجغرافي لتتبُّع الشحن والأسطول.

المهام

بالنسبة للإجراءات التي تتخذها مركبة خلال النهار، يمكنك تعيين المهام وفقًا لنوع الإجراء:

  • بالنسبة إلى عمليات الاستلام والتسليم، حدِّد مهام الشحن.
  • بالنسبة إلى الأوقات التي لا يكون فيها السائقون متاحين، مثل فترات الاستراحة المطلوبة، عليك تعيين مهام عدم التوفّر.
  • بالنسبة إلى المهام غير التوجيهية في صناديق التحميل أو المواقع الجغرافية للعملاء، يمكنك تحديد مهام الإيقاف المُجدوَلة.

يجب أن يكون لكل مهمة تُعيِّنها معرّف مهمة فريد، ولكن يمكن أن تتشارك المهام رقم تعريف التتبّع نفسه. عندما يحسب Fleet Engine نوافذ الوقت المقدّر للوصول لكل مهمة، فإنه يستخدم جميع المهام والترتيب الذي تمت جدولته لإجراء التقديرات. لمزيد من المعلومات حول معرّفات المهام، يُرجى الاطّلاع على إرشادات معرّف المهام.

لإنشاء مهام في Fleet Engine، استخدِم ميزة "إدارة المهام" في حزمة تطوير البرامج (SDK) لبرنامج التشغيل.

مهام الشحن

أنشئ مهام شحن لكل من استلام وتسليم الشحنة، وتضمين المعلومات التالية:

  • الموقع الجغرافي لاستلام الطلب أو التسليم.
  • رقم تعريف أو رقم تتبُّع
  • وقت الثبات لحساب وقت إضافي لإكمال المهمة أو البحث عن موقف سيارات أو المشي إلى موقع التسليم.
  • معرّف مهمة فريد يُرجى الاطّلاع على إرشادات معرّف المهمة.

لمزيد من المعلومات، يُرجى الاطّلاع على المواضيع التالية:

Android

iOS

مهام عدم التوفّر

تشمل مهام عدم التوفّر الفترات الزمنية التي لا تكون فيها المركبة متاحة لاستلام الطلب أو تسليمه، مثل فترات الراحة لإعادة شحن المركبة أو فترات استراحة السائق.

أنشئ مهمة عدم التوفّر باستخدام المعلومات التالية:

  • تمثّل هذه السمة مدة الفاصل الإعلاني.
  • يمكنك اختيار موقع الفاصل الإعلاني. لا يتعين عليك تحديد موقع محدد، ولكن إجراء ذلك يوفر فترات أكثر دقة للوقت المقدّر للوصول طوال اليوم.

لمزيد من المعلومات، يُرجى الاطّلاع على المواضيع التالية:

Android

iOS

مهام المحطات المجدوَلة

قم بإنشاء مهام توقف مجدولة لوضع نموذج للمحطات التي تحتاج مركبة التوصيل إلى القيام بها. على سبيل المثال، يمكنك إنشاء مهمة إيقاف مجدولة لمحطة جمع مجدوَلة يوميًا في موقع محدّد، مستقلاً عن عمليات التسليم الأخرى أو عمليات الاستلام الأخرى في الموقع الجغرافي نفسه. ويمكنك أيضًا إنشاء مهام مجدولة للتوقف في المجموعات من صناديق التحميل أو وضع نماذج لعمليات نقل مركبات التغذية أو التوقّف في مراكز الصيانة ونقاط الخدمة.

لمزيد من المعلومات، يُرجى الاطّلاع على المواضيع التالية:

Android

iOS

إرشادات معرّف المهمة

عند إنشاء معرّفات المهام، اتّبِع إرشادات المحتوى والتنسيق التالية:

  • إنشاء معرّفات مهام فريدة
  • لا تكشف عن أي معلومات لتحديد الهوية الشخصية (PII) أو لا تمسح البيانات النصية.
  • استخدِم سلاسل Unicode صالحة.
  • استخدِم 64 حرفًا أو أقل.
  • لا تضمِّن أيًا من أحرف ASCII التالية: "/" أو ":" أو "\" أو "?" أو "#".
  • يجب الضبط وفقًا لنموذج تسوية Unicode C.

فيما يلي بعض الأمثلة على معرفات المهام الجيدة:

  • 566c33d9-2a31-4b6a-9cd4-80ba1a0c643b
  • e4708eabcfa39bf2767c9546c9273f747b4626e8cc44e9630d50f6d129013d38
  • NTA1YTliYWNkYmViMTI0ZmMzMWFmOWY2NzNkM2Jk

يعرض الجدول التالي أمثلة لمعرّفات المهام غير المتوافقة:

معرّفات المهام غير المتوافقة السبب
8/31/2019-20:48-46.70746,-130.10807,-85.17909,61.33680 يخالف هذا المحتوى معلومات تحديد الهوية الشخصية ومتطلبات الأحرف: الفواصل والنقاط والنقطتين والشرطات المائلة.
JohnDoe-577b484da26f-Cupertino-SantaCruz تنتهك متطلبات معلومات تحديد الهوية الشخصية.
4R0oXLToF"112 Summer Dr. East Hartford, CT06118"577b484da26f8a يخالف معلومات تحديد الهوية الشخصية ومتطلبات الأحرف: المسافات البيضاء والفواصل وعلامات الاقتباس. يتجاوز 64 حرفًا.

مزيد من الموارد

للاطلاع على الحقول المحددة المضمنة في كل بنية بيانات، يمكنك الاطّلاع على المستندات المرجعية لواجهة برمجة التطبيقات الخاصة بـ DeliveryVehicle (gRPC وREST) وTask (gRPC وREST).

عمر مركبة

يمثّل العنصر DeliveryVehicle مركبة توصيل من الميل الأول أو الأخير. يمكنك إنشاء كائن DeliveryVehicle باستخدام:

  • رقم تعريف المشروع على Google Cloud الذي يحتوي على حساب الخدمة المستخدم لاستدعاء واجهات برمجة تطبيقات Fleet Engine
  • رقم تعريف مركبة يملكه العميل

استخدِم أرقام تعريف مركبات فريدة لكل مركبة. لا تعيد استخدام معرف المركبة ما لم تكن هناك مهام نشطة للمركبة الأصلية.

يحذف Fleet Engine تلقائيًا DeliveryVehicle عناصر لم يتم تعديلها باستخدام UpdateDeliveryVehicle بعد سبعة أيام. لمعرفة ما إذا كانت هناك مركبة موجودة:

  1. أريد الاتصال بالرقم UpdateDeliveryVehicle.
  2. إذا ظهر لك خطأ NOT_FOUND، يُرجى الاتصال بالرقم CreateDeliveryVehicle لإعادة إنشاء المركبة. إذا أرجعت المكالمة مركبة، ستظل متاحة للتحديث.

أنواع المركبات

يحتوي الكيان VehicleType على الحقل الاختياري VehicleType، الذي يحتوي على تعداد Category يمكنك تحديده على النحو التالي: AUTO أو TWO_WHEELER أو BICYCLE أو PEDESTRIAN. وإذا لم يتم ضبط الحقل، سيتم ضبطه تلقائيًا على AUTO.

تستخدم جميع مسارات التوجيه للمركبات RouteTravelMode المقابل لنوع المركبة.

سمات المركبات

يحتوي الكيان DeliveryVehicle على حقل متكرّر للسمة DeliveryVehicleAttribute. تتضمّن واجهة برمجة التطبيقات ListDeliveryVehicles حقلاً filter يتيح حصر كيانات DeliveryVehicle المعروضة بتلك التي لها السمات المحدّدة. لا يؤثر DeliveryVehicleAttribute في سلوك توجيه Fleet Engine.

لا تُدرِج معلومات تحديد الهوية الشخصية (PII) أو معلومات حسّاسة في السمات لأنّ هذا الحقل قد يظهر للمستخدمين.

مدة عمل المهمة

يمكنك إنشاء المهام وتحديثها والاستعلام عنها في Fleet Engine باستخدام واجهة Deliveries API gRPC أو REST.

يحتوي الكائن Task على حقل حالة لتتبع تقدمه خلال دورة حياته. تنتقل القيم من OPEN إلى CLOSED. يتم إنشاء مهام جديدة في الحالة OPEN، مما يشير إلى أنه:

  • لم يتم بعد تعيين المهمة لمركبة تسليم.
  • لم تجتَز مركبة التسليم بعد محطة المركبة المخصّصة للمهمة.

إرشادات المهام

يمكنك تعيين مهمة لمركبة فقط عندما تكون في حالة "مفتوح".

يمكنك إلغاء مهمة من خلال إزالتها من قائمة محطات توقّف المركبة، ما يؤدي إلى ضبط حالة المهمة على "مغلقة" تلقائيًا.

عندما تكمل مركبة المهمة إيقاف مركبة المهمة:

  1. عدِّل حقل نتائج المهمة إلى "SUCCEEDED" أو "تعذّر الإجراء".

  2. حدِّد الطابع الزمني للحدث.

    بعد ذلك، تشير مكتبة "تتبُّع شحن JavaScript" إلى نتيجة المهمة ويتم ضبط حالة المهمة على "مغلقة" تلقائيًا. لمزيد من المعلومات، يُرجى الاطّلاع على تتبُّع الشحن باستخدام مكتبة "تتبُّع الشحن" في JavaScript.

كما هو الحال مع المركبات، يحذف Fleet Engine المهام التي لم يتم تحديثها بعد سبعة أيام، وإذا حاولت إنشاء مهمة بمعرّف موجود بالفعل، فسيعرض خطأ.

ملاحظة: لا يتيح Fleet Engine حذف مهمة بشكل صريح. تحذف الخدمة المهام تلقائيًا بعد سبعة أيام بدون تحديثات. إذا كنت تريد الاحتفاظ ببيانات المهمة لأكثر من سبعة أيام، فيجب عليك تنفيذ هذه الإمكانية بنفسك.

سمات المهام

يحتوي الكيان Task على حقل متكرّر للسمة TaskAttribute، والذي يمكن أن يحتوي على قيمة من أحد الأنواع الثلاثة: السلسلة والرقم والقيمة المنطقية. تشمل واجهة برمجة التطبيقات ListTasks الحقل filter الذي يمكنه حصر كيانات Task المعروضة بتلك التي تحتوي على السمات المحدّدة. لا تؤثر سمات المهام على سلوك توجيه Fleet Engine.

لا تضمِّن معلومات تحديد الهوية الشخصية (PII) أو معلومات أخرى حساسة في السمات، لأنّ هذه السمات قد تكون مرئية للمستخدمين.

إدارة دورة حياة المهمة والمركبة

تذكير: يعمل النظام الداخلي كمصدر موثوق للبيانات التي تدعمها واجهة برمجة التطبيقات Fleet Engine Deliveries API نيابةً عنك.

لإدارة دورات حياة المركبات والمهام في نظامك، استخدم واجهة برمجة التطبيقات Fleet Engine Deliveries API لإنشاء وتحديث وتتبُّع مركباتك والمهام المرتبطة بها.

وفي الوقت نفسه، يتواصل تطبيق السائق مباشرةً مع فريق Fleet Engine لتعديل معلومات الموقع الجغرافي والمسار للجهاز. يتيح هذا النموذج لشركة Fleet Engine إدارة الموقع في الوقت الفعلي بكفاءة. فهي ترسل الموقع مباشرةً إلى مكتبة التتبع، التي يمكنك استخدامها بعد ذلك لإطلاع المستهلكين على حالة طلباتهم.

على سبيل المثال، لنفترض أن لديك السيناريو التالي:

  • سائق يقترب من محطة توصيل يرسل تطبيق برنامج التشغيل موقعه إلى Fleet Engine.
  • يرسل Fleet Engine موقع الجهاز إلى مكتبة التتبع، التي يستخدمها تطبيق المستهلك لتنبيه المستهلك بقرب الطرد.
  • بعد أن يكمل السائق عملية الشحن، ينقر على زر "تم تسليم الشحنة" في تطبيق السائق.
  • يرسل الإجراء "تم تسليم الشحنة" المعلومات إلى نظام الخلفية الذي ينفذ الخطوات اللازمة للتحقّق من صحة النشاط التجاري والتحقق منها.
  • يؤكد النظام المهمة على أنها SUCCEEDED ويحدِّث Fleet Engine باستخدام واجهة برمجة تطبيقات التسليم.

يوضِّح الرسم البياني التالي هذه العمليات على المستوى العام. كما أنه يعرض العلاقة القياسية بين نظامك والعميل وFleet Engine.

استخدام Deliveries API

إدارة الرموز المميّزة للعميل

إنّ تحديثات الموقع الجغرافي التي تنشأ من تطبيق برنامج التشغيل ويتم إرسالها مباشرةً إلى Fleet Engine وتتطلب رموزًا مميّزة للتفويض. إليك النهج الموصى به للتعامل مع التحديثات من العميل إلى Fleet Engine:

  1. يمكنك إنشاء الرمز المميّز باستخدام دور حساب خدمة مستخدم برنامج التشغيل غير الموثوق به لخدمة تسليم محرّكات البحث Fleet Engine.

  2. زوِّد تطبيق السائق برمز مميّز للنطاق. يتيح له هذا النطاق فقط تحديث موقع الجهاز في Fleet Engine.

يضمن هذا النهج أن تلتزم الطلبات الناشئة من الأجهزة الجوّالة، التي تُعتبر بيئات منخفضة الثقة، بمبدأ الحد الأدنى من الأذونات المميّزة.

الأدوار الأخرى لحساب الخدمة

بدلاً من ذلك، إذا أردت منح تطبيقات السائقين الإذن بإجراء تحديثات مباشرة من Fleet Engine غير تلك التي تقتصر على دور "السائق غير الموثوق به"، يمكنك مثلاً استخدام دور "سائق موثوق به" لإجراء تعديلات على مهام معيّنة. للحصول على معلومات حول نموذج يستخدم دور "سائق موثوق به"، يمكنك الاطّلاع على طراز السائق الموثوق به.

لمزيد من المعلومات عن استخدامات أدوار السائقين الموثوق بهم وغير الموثوق بها، يُرجى الاطّلاع على إعداد مشروع Cloud.

وضع نموذج ليوم عمل

يصف الجدول التالي كيف يمكن أن يبدو يوم العمل للسائقين عند الميل الأول أو الأخير في شركة توصيل وخدمات لوجستية. قد تختلف شركتك في التفاصيل، ولكن يمكنك أن ترى كيف يمكنك تصميم يوم عمل.

الوقتالنشاطوضع النماذج
خلال 24 ساعة من بداية اليوم ويقوم المرسِل بتعيين الشحنات لمركبات التسليم أو مسارات التسليم. يمكنك إنشاء مهام لعمليات تسليم الشحنات واستلام الطلبات وفترات الاستراحة وغيرها في Fleet Engine مسبقًا. على سبيل المثال، يمكنك إنشاء مهمة استلام الشحن أو مهمة تسليم الشحن أو عدم توفّر مجدوَل أو محطة توقّف مجدولة.

يمكنك إسناد المهام إلى مركبة بعد الانتهاء من مجموعة حزم التسليم وترتيب تسليمها.
بداية اليوم يبدأ السائق بيوم في المستودع من خلال تسجيل الدخول إلى تطبيق Driver. إعداد Delivery Driver API: أنشئ مركبة التسليم في Fleet Engine حسب الحاجة.
يقوم السائق بتحميل الشحنات على مركبة التسليم، وفحص الشحنات. إذا لم يتم إنشاء مهام تسليم الشحن مسبقًا، يمكنك إنشاء مهام تسليم الشحن في وقت الفحص.
يؤكد السائق ترتيب المهام التي سيتم تنفيذها. إذا لم يتم إنشاؤها مسبقًا، يمكنك إنشاء مهام لاستلام الشحن، وعدم توفّر مجدول، ومحطات توقّف مجدوَلة.
يغادر السائق المستودع ويلتزم بالعدد التالي من المهام المطلوب إنجازها. أسند جميع المهام أو مجموعة فرعية من المهام إلى المركبة من خلال الالتزام بترتيب إكمالها.
يسلم السائق شحنة. بعد الوصول إلى محطة التسليم، يمكنك تنفيذ الإجراءات المتعلّقة بوصول مركبة إلى محطة. بعد تسليم الشحنة، أغلِق مهمة التسليم ويمكنك اختياريًا الاطّلاع على حالة شحنة المتجر والمعلومات الوصفية الأخرى. بعد إكمال جميع المهام في المحطة وقبل بدء القيادة إلى المحطة التالية، عليك تنفيذ إجراءات مرتبطة بإكمال المركبة إلى محطة توقّف والمركبة في طريقها إلى المحطة التالية.
يلتقي السائق بمركبة يتم تقديم التغذية لنقل شحنات إضافية إلى مركبة التسليم. يجب تصميم نقطة التقاء نقطة التقاء للنقل بين مركبات الخلاصة ومركبات التسليم على أنّها محطة مجدوَلة.

بعد نقل الشحنات وفحصها، يمكنك إنشاء مهام تسليم إذا لم يسبق لك إنشاؤها. بعد ذلك، يمكنك تعديل ترتيب إكمال المهام من خلال إسناد المهام إلى مركبة وتعديل ترتيب المهام.
يتلقّى السائق إشعارًا بطلب استلام الطلب. بعد قبول طلب الاستلام، يمكنك إنشاء مهمة استلام الشحنة. بعد ذلك، يمكنك تعديل ترتيب تنفيذ المهام من خلال إسناد المهام إلى مركبة وتعديل ترتيب المهام.
ظهرًا السائق يأخذ استراحة الغداء. إذا كان الموقع الجغرافي مرتبطًا بمهمة عدم التوفّر، يمكنك التعامل معه كأي مهمة أخرى. تنفيذ الإجراءات المتعلّقة بوصول مركبة إلى محطة وإكمال مركبة لمحطة ومركبة تسير في طريقها إلى المحطة التالية

بخلاف ذلك، ليس عليك اتّخاذ أي إجراء آخر حتى نهاية الفاصل. يمكنك إزالة المهمة من خلال تأكيد المهام التالية والمتبقية وتعديل ترتيب المهام.
يستلم السائق شحنة. يتم تصميم هذا تمامًا مثل محطة توصيل. تنفيذ إجراءات ذات صلة بوصول مركبة إلى محطة وإغلاق مهمة وتخزين حالة الشحن وغيرها من المعلومات الوصفية إذا أردت ذلك بعد إكمال جميع المهام في المحطة وقبل بدء القيادة إلى المحطة التالية، عليك تنفيذ الإجراءات المتعلّقة بإكمال مركبة إلى محطة والمركبة في طريقها إلى المحطة التالية. ملاحظة: لضمان صحة الفوترة، يجب أن يكون هناك مهمة تسليم مناسبة لكل طلبات استلام الطلب. إذا كان سيتم تسليم استلام الطلب إلى موقع جغرافي آخر على المسار نفسه للسائق في ذلك اليوم، ننصحك بإعداد مهمة التسليم هذه كأي مهمة تسليم أخرى على المسار. إذا كان السائق يعيد استلام الطلب إلى المستودع، ننصحك بإنشاء مهمة تسليم في وجهة المستودع.
يحدد السائق محطة مجدولة لاستلام الشحنات من صندوق تسليم المنتجات. يتم تصميم هذه المنصة تمامًا مثل أي محطة أخرى لاستلام الطلبات. تنفيذ إجراءات ذات صلة بوصول مركبة إلى محطة وإغلاق مهمة بعد إكمال جميع المهام عند المحطة والبدء بالقيادة إلى المحطة التالية، عليك تنفيذ الإجراءات المتعلّقة بإكمال مركبة إلى محطة والمركبة في طريقها إلى المحطة التالية.
يتلقّى السائق إشعارًا بتحويل شحنة إلى موقع جغرافي بديل. اضبط حالة مهمة تسليم الشحنة الأصلية على "مكتملة" وأنشئ مهمة تسليم شحنة جديدة لموقع التسليم الجديد. لمزيد من المعلومات، اطّلِع على المقالة إعادة توجيه شحنة.
حاول السائق تسليم طرد ولكنه لم يتمكّن من تسليمه. يتم تنفيذ ذلك بشكل مشابه لمحطة تسليم ناجحة، ويتم وضع علامة اكتمال على مهمة التسليم. تنفيذ الإجراءات المتعلّقة بوصول مركبة إلى محطة بعد عدم تسليم الشحنة، أغلِق المهمة ويمكنك اختياريًا الاطّلاع على حالة شحنة المتجر والمعلومات الوصفية الأخرى. بعد إكمال جميع المهام في المحطة وقبل بدء القيادة إلى المحطة التالية، عليك تنفيذ الإجراءات المتعلّقة بإكمال مركبة إلى محطة والمركبة في طريقها إلى المحطة التالية.
تم إبلاغ السائق بحجز شحنة (عدم تسليمها). بعد تلقّي الإشعار وتأكيده، اضبط حالة المهمة على "مكتملة".
تم إرسال إشعار إلى السائق بتسليم شحنة معيّنة في المرة التالية، ما يؤدي إلى تغيير طلب التسليم المُلتزم به. تعديل ترتيب المهام
يختار السائق تسليم شحنة خارج الطلب. تعديل ترتيب المهام ثم المتابعة كالمعتاد.
يُسلِّم السائق عدة شحنات إلى موقع واحد. يتم وضع نموذج مشابه لمحطة تسليم شحنة واحدة. بعد الوصول إلى المحطة، يمكنك تنفيذ الإجراءات المتعلّقة بوصول مركبة إلى محطة. بعد تسليم كل شحنة، أغلِق كل مهمة واختَر حالة شحنة المتجر وغيرها من المعلومات الوصفية إذا أردت ذلك. بعد إكمال جميع المهام في المحطة وقبل بدء القيادة إلى المحطة التالية، عليك تنفيذ الإجراءات المتعلّقة بإكمال مركبة إلى محطة والمركبة في طريقها إلى المحطة التالية.
نهاية اليوم يعود السائق إلى المستودع. إذا عاد السائق إلى المستودع وتم استلام شحنات خلال مساره، عليك أيضًا إنشاء كل حزمة وإغلاقها كمهمة تسليم لضمان صحة معلومات الفوترة. يمكنك إجراء ذلك من خلال تصميم نموذج للمستودع مثل أي محطة تسليم أخرى. إذا لم يكن المستودع يُستخدم كمحطة تسليم، يمكنك اختياريًا إنشاء نموذج للمستودع كمحطة مجدولة. ويتيح وضع نماذج للمحطة للسائقين إمكانية الاطّلاع على المسار المؤدي إلى المستودع وتوفير إمكانية الاطّلاع على الوقت المقدَّر لوصولهم.

آلية عمل تعديلات الموقع الجغرافي

للحصول على أفضل أداء باستخدام Fleet Engine، يمكنك تزويده بمجموعة من المعلومات التي تحتاج إليها حول الموقع الجغرافي للمركبة. استخدِم إحدى الطريقتَين التاليتَين لتقديم هذه التعديلات:

  1. استخدم Driver SDK - Android و iOS -- الخيار الأبسط.
  2. استخدِم رمزًا مخصصًا، وهو مفيد إذا كان يتم ترحيل المواقع الجغرافية من خلال الخلفية أو إذا كنت تستخدم أجهزة أخرى غير Android أو iOS.

بغض النظر عن كيفية تعديل الموقع الجغرافي للمركبة، تكون الخلفية مسؤولة عن تحديث Fleet Engine عندما تكون مركبة التسليم في طريقها إلى محطة (بما في ذلك المستودع) وعندما تصل إلى محطة. لا يكتشف Fleet Engine هذه الأحداث تلقائيًا.

محطات توقّف المركبات ومواقع التسليم

توقف المركبة هو المكان الذي تكمل فيه مركبة التوصيل مهمة الشحن أو بعض المهام الأخرى. فهي إما نقطة وصول مثل رصيف تحميل أو موقع قطعت الطريق.

موقع التسليم هو الموقع الذي يتم فيه تسليم الشحنة أو استلامها. قد يتطلب الوصول من وإلى موقع التسليم بعض المشي من محطة المركبة.

على سبيل المثال، عندما يقوم سائق بتسليم شحنة إلى متجر في مركز تسوق، تتوقف مركبة التوصيل في موقف السيارات بالمركز التجاري بالقرب أقرب مدخل للمتجر. هذه هي محطة المركبة. ثم يسير السائق من محطة المركبات إلى الموقع داخل مركز التسوق حيث يقع المتجر. هذا هو الموقع الجغرافي للتسليم.

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

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

استخدام حِزم تطوير البرامج (SDK) للأجهزة الجوّالة

قبل إجراء أي طلبات لحزمة تطوير البرامج (SDK) لبرنامج التشغيل، تأكَّد من إعدادها.

إعداد Delivery Driver API

قبل إعداد واجهة برمجة التطبيقات Delivery Driver API في حزمة تطوير البرامج (SDK) لبرنامج التشغيل، تأكَّد من إعداد حزمة تطوير البرامج (SDK) للتنقل. بعد ذلك، عليك إعداد Delivery Driver API كما هو موضّح في المثال التالي:

static final String PROVIDER_ID = "provider-1234";
static final String VEHICLE_ID = "vehicle-8241890";

NavigationApi.getNavigator(
   this, // Activity.
   new NavigatorListener() {
     @Override
     public void onNavigatorReady(Navigator navigator) {
       DeliveryDriverApi.createInstance(DriverContext.builder(getApplication())
         .setNavigator(navigator)
         .setProviderId(PROVIDER_ID)
         .setVehicleId(VEHICLE_ID)
         .setAuthTokenFactory((context) -> "JWT") // AuthTokenFactory returns JWT for call context.
         .setRoadSnappedLocationProvider(NavigationApi.getRoadSnappedLocationProvider(getApplication()))
         .setNavigationTransactionRecorder(NavigationApi.getNavigationTransactionRecorder(getApplication()))
         .setStatusListener((statusLevel,statusCode,statusMsg) -> // Optional, surfaces polling errors.
             Log.d("TAG", String.format("New status update. %s, %s, %s", statusLevel, statusCode, statusMsg)))
         .build));
     }
     @Override
     public void onError(int errorCode) {
       Log.e("TAG", String.format("Error loading Navigator instance: %s", errorCode));
     }
   });

حالات الاستخدام

يصف هذا القسم كيفية استخدام Deliveries API لوضع نماذج لحالات الاستخدام الشائعة.

المعرّفات الفريدة للكيانات

إنّ تنسيق وقيمة معرّفات الكيانات الفريدة المستخدَمة في طلبات REST غير معتمة بالنسبة إلى Fleet Engine. تجنَّب استخدام أرقام تعريف تتم إضافتها تلقائيًا، وتأكّد من أنّ المعرّف لا يحتوي على أيّ معلومات تحدّد الهوية الشخصية (PII)، مثل رقم هاتف السائق.

إنشاء مركبة

يمكنك إنشاء مركبة إما من حزمة تطوير البرامج (SDK) الخاصة ببرنامج التشغيل أو من بيئة خادم باستخدام gRPC أو REST.

gRPC

لإنشاء مركبة جديدة، عليك إجراء طلب CreateDeliveryVehicle بحساب Fleet Engine. استخدِم الكائن CreateDeliveryVehicleRequest لتحديد سمات مركبة التسليم الجديدة. يُرجى العلم أنّه سيتم تجاهل أي قيمة محدّدة للحقل Name وفقًا لإرشادات واجهة برمجة التطبيقات للمعرّفات المحددة من قِبل المستخدم. يجب استخدام الحقل DeliveryVehicleId لضبط رقم تعريف المركبة.

عند إنشاء DeliveryVehicle، يمكنك تحديد الحقول التالية بشكل اختياري:

  • السمات
  • LastLocation
  • النوع

ولا تضبط أي حقول أخرى. في حال إجراء ذلك، سيعرض Fleet Engine رسالة خطأ لأنّ هذه الحقول إما للقراءة فقط أو يمكن تعديلها فقط من خلال استدعاء UpdateDeliveryVehicle.

لإنشاء مركبة بدون ضبط أي حقول اختيارية، يمكنك ترك الحقل DeliveryVehicle بدون ضبط في CreateDeliveryVehicleRequest.

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لإنشاء مركبة:

    static final String PROJECT_ID = "my-delivery-co-gcp-project";
    static final String VEHICLE_ID = "vehicle-8241890"; // Avoid auto-incrementing IDs.

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Vehicle settings
    String parent = "providers/" + PROJECT_ID;
    DeliveryVehicle vehicle = DeliveryVehicle.newBuilder()
      .addAttributes(DeliveryVehicleAttribute.newBuilder()
        .setKey("route_number").setValue("1"))  // Opaque to the Fleet Engine
      .build();

    // Vehicle request
    CreateDeliveryVehicleRequest createVehicleRequest =
      CreateDeliveryVehicleRequest.newBuilder()  // No need for the header
          .setParent(parent)
          .setDeliveryVehicleId(VEHICLE_ID)     // Vehicle ID assigned by the Provider
          .setDeliveryVehicle(vehicle)
          .build();

    // Error handling
    // If Fleet Engine does not have vehicle with that ID and the credentials of the
    // requestor pass, the service creates the vehicle successfully.

    try {
      DeliveryVehicle createdVehicle =
        deliveryService.createDeliveryVehicle(createVehicleRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case ALREADY_EXISTS:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

راحة

لإنشاء مركبة من بيئة خادم، يمكنك إجراء استدعاء HTTP REST إلى CreateDeliveryVehicle:

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles?deliveryVehicleId=<id>

<id> هو معرّف فريد لمركبة توصيل في أسطولك.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يمثل نص POST كيان DeliveryVehicle المطلوب إنشاؤه. يمكنك تحديد الحقول الاختيارية التالية:

  • attributes
  • lastLocation
  • كتابة

مثال على الطلب curl:

# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
  "attributes": [{"key": "model", "value": "sedan"}],
  "lastLocation": {"location": {"latitude": 12.1, "longitude": 14.5}}
}
EOM

يتجاهل Fleet Engine الحقل name للكيان DeliveryVehicle وفقًا لإرشادات واجهة برمجة التطبيقات للأرقام التعريفية المحدّدة من قِبل المستخدم. ولا تضبط أي حقول أخرى. في حال إجراء ذلك، سيعرض Fleet Engine رسالة خطأ لأنّ هذه الحقول إما للقراءة فقط أو يمكن تعديلها فقط من خلال استدعاء UpdateDeliveryVehicle.

لإنشاء مركبة بدون ضبط أي حقول، اترك نص طلب POST فارغًا. بعد ذلك، تستخرج المركبة التي تم إنشاؤها حديثًا رقم تعريف المركبة من المَعلمة deliveryVehicleId في عنوان URL لصفحة POST.

مثال على الطلب curl:

# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}"

إنشاء مهمة استلام الشحنة

يمكنك إنشاء مهمة استلام الشحن إما من حزمة تطوير البرامج (SDK) لبرنامج التشغيل" أو من بيئة خادم باستخدام gRPC أو REST.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لإنشاء مهمة استلام شحنة:

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.PICKUP)
  .setState(Task.State.OPEN)
  .setTrackingId("my-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
  .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
  .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have a task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لإنشاء مهمة استلام الشحن من بيئة خادم، يمكنك إجراء استدعاء HTTP REST إلى CreateTask:

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id> هو معرّف فريد للمهمة. يجب ألا يكون رقم تتبع الشحنة إذا لم يكن لديك معرِّفات مهام في نظامك، يمكنك إنشاء معرِّف فريد عام (UUID).

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان Task:

  • الحقول المطلوبة:

    الحقلالقيمة
    كتابة Type.PICKUP
    state State.OPEN
    trackingId الرقم أو المعرّف الذي تستخدمه لتتبُّع شحنة
    plannedLocation تمثّل هذه السمة الموقع الجغرافي الذي تكتمل فيه المهمة، وهو في هذه الحالة موقع استلام الشحنة.
    taskDuration الوقت المتوقّع بالثواني الذي يستغرقه استلام الشحنة في الموقع الجغرافي للاستلام.

  • الحقول الاختيارية:

    الحقلالقيمة
    targetTimeWindow الفترة الزمنية التي يجب أن تكتمل خلالها المهمة. ولا يؤثر ذلك في سلوك التوجيه.
    attributes قائمة بسمات "Task" المخصّصة يجب أن يكون لكل سمة مفتاح فريد.

ويتم تجاهل جميع الحقول الأخرى في العنصر للإنشاء. يطرح Fleet Engine استثناءً إذا كان الطلب يتضمّن علامة deliveryVehicleId مخصّصة. يمكنك تعيين المهام باستخدام UpdateDeliveryVehicleRequest. لمزيد من المعلومات، يُرجى الاطّلاع على تعيين المهام لمركبة وUpdateDeliveryVehicleRequest.

مثال على الطلب curl:

# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "PICKUP",
  "state": "OPEN",
  "trackingId": "${TRACKING_ID}",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "90s",
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

إنشاء مهمة تسليم شحنة

أنشِئ مهمة تسليم الشحن إما من حزمة تطوير البرامج (SDK) لبرنامج التشغيل أو من بيئة خادم باستخدام gRPC أو REST.

gRPC

يوضّح المثال التالي كيفية استخدام مكتبة Java gRPC لإنشاء مهمة تسليم الشحن:

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.DELIVERY)
  .setState(Task.State.OPEN)
  .setTrackingId("my-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
  .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
  .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لإنشاء مهمة تسليم شحنة من بيئة خادم باستخدام gRPC أو REST، يمكنك طلب HTTP REST إلى CreateTask:

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id> هو معرّف فريد للمهمة. يجب ألا يكون رقم تتبع الشحنة إذا لم يكن لديك معرِّفات مهام في نظامك، يمكنك إنشاء معرِّف فريد عام (UUID).

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان Task:

  • الحقول المطلوبة:

    الحقلالقيمة
    كتابة Type.DELIVERY
    state State.OPEN
    trackingId الرقم أو المعرّف الذي تستخدمه لتتبُّع شحنة
    plannedLocation تمثّل هذه السمة الموقع الجغرافي الذي تكتمل فيه المهمة، وهو في هذه الحالة موقع تسليم هذه الشحنة.
    taskDuration الوقت المتوقّع بالثواني الذي يستغرقه تسليم الشحنة في موقع التسليم.

  • الحقول الاختيارية:

    الحقلالقيمة
    targetTimeWindow الفترة الزمنية التي يجب أن تكتمل خلالها المهمة. ولا يؤثر ذلك في سلوك التوجيه.
    attributes قائمة بسمات "Task" المخصّصة يجب أن يكون لكل سمة مفتاح فريد.

ويتم تجاهل جميع الحقول الأخرى في العنصر للإنشاء. يطرح Fleet Engine استثناءً إذا كان الطلب يتضمن قيمة deliveryVehicleId مخصصة. يمكنك تعيين المهام باستخدام UpdateDeliveryVehicleRequest. لمزيد من المعلومات، يُرجى الاطّلاع على تعيين المهام لمركبة وUpdateDeliveryVehicleRequest.

مثال على الطلب curl:

# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "DELIVERY",
  "state": "OPEN",
  "trackingId": "${TRACKING_ID}",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "90s",
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

إنشاء مهام مُجمّعة

يمكنك إنشاء مجموعة من المهام من بيئة خادم باستخدام gRPC أو REST.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لإنشاء مهمتين، إحداهما للتسليم والأخرى للاستلام في الموقع الجغرافي نفسه:

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Delivery Task settings
Task deliveryTask = Task.newBuilder()
  .setType(Task.Type.DELIVERY)
  .setState(Task.State.OPEN)
  .setTrackingId("delivery-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Delivery Task request
CreateTaskRequest createDeliveryTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header or parent fields
      .setTaskId("task-8312508")  // Task ID assigned by the Provider
      .setTask(deliveryTask)      // Initial state
      .build();

// Pickup Task settings
Task pickupTask = Task.newBuilder()
  .setType(Task.Type.PICKUP)
  .setState(Task.State.OPEN)
  .setTrackingId("pickup-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Pickup Task request
CreateTaskRequest createPickupTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header or parent fields
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(pickupTask)        // Initial state
      .build();

// Batch Create Tasks settings
String parent = "providers/" + PROJECT_ID;

// Batch Create Tasks request
BatchCreateTasksRequest batchCreateTasksRequest =
  BatchCreateTasksRequest.newBuilder()
      .setParent(parent)
      .addRequests(createDeliveryTaskRequest)
      .addRequests(createPickupTaskRequest)
      .build();

// Error handling
// If Fleet Engine does not have any task(s) with these task ID(s) and the
// credentials of the requestor pass, the service creates the task(s)
// successfully.

try {
  BatchCreateTasksResponse createdTasks = deliveryService.batchCreateTasks(
    batchCreateTasksRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لإنشاء مهمة تسليم واستلام من بيئة خادم، يمكنك إجراء طلب HTTP REST إلى BatchCreateTasks:

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks:batchCreate

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة Bearer <token>، حيث يكون <token> عبارة عن رمز مميّز صادر عن مصنع رموز مميّزة من Fleet Engine.

يجب أن يحتوي نص الطلب على كيان BatchCreateTasksRequest:

  • الحقول المطلوبة:

    الحقلالقيمة
    طلبات مصفوفة<CreateTasksRequest>

  • الحقول الاختيارية:

    الحقلالقيمة
    header "deliveryyRequestHeader"

يجب أن يجتاز كل عنصر CreateTasksRequest في requests قواعد التحقق نفسها كطلب CreateTask، باستثناء أنّ الحقلَين parent وheader اختياريان. وفي حال ضبطها، يجب أن تكون متطابقة مع الحقول الخاصة بها في المستوى الأعلى من BatchCreateTasksRequest. اطّلِع على إنشاء مهمة لاستلام الشحنة وإنشاء مهمة تسليم شحنة للاطّلاع على قواعد تحقُّق محدَّدة لكلّ منها.

لمزيد من المعلومات، يمكنك الاطّلاع على المستندات المرجعية لواجهة برمجة التطبيقات الخاصة بـ BatchCreateTasks (gRPC وREST).

مثال على الطلب curl:

# Set $JWT, $PROJECT_ID, $DELIVERY_TRACKING_ID, $DELIVERY_TASK_ID,
# $PICKUP_TRACKING_ID, and $PICKUP_TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks:batchCreate" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "requests" : [
    {
      "taskId": "${DELIVERY_TASK_ID}",
      "task" : {
        "type": "DELIVERY",
        "state": "OPEN",
        "trackingId": "${DELIVERY_TRACKING_ID}",
        "plannedLocation": {
          "point": {
              "latitude": -6.195139,
              "longitude": 106.820826
          }
        },
        "taskDuration": "90s"
      }
    },
    {
      "taskId": "${PICKUP_TASK_ID}",
      "task" : {
        "type": "PICKUP",
        "state": "OPEN",
        "trackingId": "${PICKUP_TRACKING_ID}",
        "plannedLocation": {
          "point": {
              "latitude": -6.195139,
              "longitude": 106.820826
          }
        },
        "taskDuration": "90s"
      }
    }
  ]
}
EOM

عدم التوفّر المجدوَل

يمكنك إنشاء مهمة تشير إلى عدم التوفّر (على سبيل المثال، لحالات استراحة السائق أو إعادة شحن المركبات) إما من حزمة تطوير البرامج (SDK) للسائق، أو من بيئة خادم باستخدام gRPC أو REST. يجب ألا تتضمن مهمة عدم التوفّر المجدولة معرّف تتبع. يمكنك تحديد موقع جغرافي بشكل اختياري.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لإنشاء مهمة عدم التوفّر:

    static final String PROJECT_ID = "my-delivery-co-gcp-project";

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Task settings
    String parent = "providers/" + PROJECT_ID;
    Task task = Task.newBuilder()
      .setType(Task.Type.UNAVAILABLE)
      .setState(Task.State.OPEN)
      .setTaskDuration(
        Duration.newBuilder().setSeconds(60 * 60))  // 1hr break
      .build();

    // Task request
    CreateTaskRequest createTaskRequest =
      CreateTaskRequest.newBuilder()  // No need for the header
          .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
          .setTaskId("task-8241890")  // Task ID assigned by the Provider
          .setTask(task)              // Initial state
          .build();

    // Error handling
    // If Fleet Engine does not have task with that ID and the credentials of the
    // requestor pass, the service creates the task successfully.

    try {
      Task createdTask = deliveryService.createTask(createTaskRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case ALREADY_EXISTS:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

راحة

لإنشاء مهمة عدم التوفّر من بيئة خادم، يمكنك إجراء استدعاء HTTP REST إلى CreateTask:

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id> هو معرّف فريد للمهمة. إذا لم تكن لديك معرّفات مهام في نظامك، قد تنشئ معرّفًا فريدًا عالميًا (UUID).

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان Task:

  • الحقول المطلوبة:

    الحقلالقيمة
    كتابة Type.UNAVAILABLE
    state State.OPEN
    taskDuration مدة الفاصل الإعلاني بالثواني.

  • الحقول الاختيارية:

    الحقلالقيمة
    plannedLocation موقع الفاصل إذا كان يجب التقاطه في موقع محدد.

ويتم تجاهل جميع الحقول الأخرى في العنصر للإنشاء. يطرح Fleet Engine استثناءً إذا كان الطلب يتضمن قيمة deliveryVehicleId مخصصة. يمكنك تعيين المهام باستخدام UpdateDeliveryVehicleRequest. لمزيد من المعلومات، يُرجى الاطّلاع على تعيين المهام لمركبة وUpdateDeliveryVehicleRequest.

مثال على الطلب curl:

    # Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
    curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "type": "UNAVAILABLE",
      "state": "OPEN",
      "plannedLocation": {
         "point": {
            "latitude": -6.195139,
            "longitude": 106.820826
         }
      },
      "taskDuration": "300s"
    }
    EOM

محطّات توقّف مجدولة

يمكنك إنشاء مهمة إيقاف مجدوَلة إما من حزمة تطوير البرامج (SDK) لبرنامج التشغيل، أو من بيئة خادم باستخدام gRPC أو REST. قد لا تتضمن مهمة الإيقاف المجدولة معرّف تتبع.

gRPC

يوضّح المثال التالي كيفية استخدام مكتبة Java gRPC لإنشاء مهمة إيقاف مجدولة:

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.SCHEDULED_STOP)
  .setState(Task.State.OPEN)
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTrip(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لإنشاء مهمة إيقاف مجدوَلة من بيئة خادم، يمكنك إجراء استدعاء HTTP REST إلى CreateTask:

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id> هو معرّف فريد للمهمة. إذا لم يكن لديك معرِّفات مهام في نظامك، يمكنك إنشاء معرِّف فريد عام (UUID).

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان Task:

  • الحقول المطلوبة:

    الحقلالقيمة
    كتابة Type.SCHEDULED_STOP
    state State.OPEN
    plannedLocation موقع المحطة.
    taskDuration المدة المتوقعة للمحطة بالثواني.

  • الحقول الاختيارية:

    • لا ينطبق

ويتم تجاهل جميع الحقول الأخرى في العنصر للإنشاء. يطرح Fleet Engine استثناءً إذا كان الطلب يتضمن قيمة deliveryVehicleId مخصصة. يمكنك تعيين المهام باستخدام UpdateDeliveryVehicleRequest. لمزيد من المعلومات، يُرجى الاطّلاع على تعيين المهام لمركبة وUpdateDeliveryVehicleRequest.

مثال على الطلب curl:

    # Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
    curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "type": "SCHEDULED_STOP",
      "state": "OPEN",
      "plannedLocation": {
         "point": {
            "latitude": -6.195139,
            "longitude": 106.820826
         }
      },
      "taskDuration": "600s"
    }
    EOM

تحديد الفترة الزمنية المستهدفة

نافذة الوقت المستهدف هي TimeWindow التي يجب إنجاز المهمة خلالها. على سبيل المثال، إذا أبلغت مستلمي التسليم عن فترة وقت تسليم، يمكنك استخدام الفترة الزمنية المستهدَفة للمهمة لتسجيل هذه الفترة الزمنية وإنشاء تنبيهات أو تحليل أداء ما بعد الرحلة باستخدام الحقل.

تتكون فترة الوقت المستهدف من وقت البدء ووقت الانتهاء ويمكن ضبطها على أي نوع مهمة. ولا تؤثر الفترة الزمنية المستهدفة في سلوك التوجيه.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لضبط نافذة وقت المهمة:

    static final String PROJECT_ID = "my-delivery-co-gcp-project";
    static final String TASK_ID = "task-8241890";

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Task settings
    String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
    Task task = Task.newBuilder()
      .setName(taskName)
      .setTargetTimeWindow(
        TimeWindow.newBuilder()
          .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
          .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
      .build();

    // Task request
    UpdateTaskRequest updateTaskRequest =
      UpdateTaskRequest.newBuilder()  // No need for the header
          .setTask(task)
          .setUpdateMask(FieldMask.newBuilder().addPaths("targetTimeWindow"))
          .build();

    try {
      Task updatedTask = deliveryService.updateTask(updateTaskRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case NOT_FOUND:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

راحة

لضبط نافذة وقت مهمة باستخدام HTTP، يمكنك طلب UpdateTask على النحو التالي:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=targetTimeWindow`

<id> هو معرّف فريد للمهمة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان Task:

  • الحقول المطلوبة:

    الحقلالقيمة
    targetTimeWindow الفترة الزمنية التي يجب أن تكتمل خلالها المهمة. لا يؤثر هذا الإعداد في سلوك التوجيه.

  • الحقول الاختيارية:

    • لا ينطبق

ويتم تجاهل جميع الحقول الأخرى في العنصر لإجراء التحديث.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=targetTimeWindow" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

ضبط إعداد مستوى رؤية تتبع المهام

يمكن التحكّم في ظهور البيانات في مكتبة "تتبُّع الشحن" وتلك البيانات التي تم إرجاعها من مكالمة إلى GetTaskTrackingInfo على أساس كل مهمة من خلال ضبط TaskTrackingViewConfig على المهمة. لمزيد من المعلومات، يُرجى الاطّلاع على مهام المركبات النشطة. يمكن القيام بذلك عند إنشاء المهمة أو تحديثها. في ما يلي مثال على تعديل المهمة بهذه الإعدادات:

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لتعيين تهيئة عرض تتبع المهام:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTaskTrackingViewConfig(
    TaskTrackingViewConfig.newBuilder()
      .setRoutePolylinePointsVisibility(
        VisibilityOption.newBuilder().setRemainingStopCountThreshold(3))
      .setEstimatedArrivalTimeVisibility(
        VisibilityOption.newBuilder().remainingDrivingDistanceMetersThreshold(5000))
      .setRemainingStopCountVisibility(
        VisibilityOption.newBuilder().setNever(true)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("taskTrackingViewConfig"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
      case NOT_FOUND:
        break;
      case PERMISSION_DENIED:
        break;
  }
  return;
}

راحة

لضبط نافذة إعداد عرض تتبُّع المهام باستخدام HTTP، يمكنك طلب UpdateTask:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskTrackingViewConfig`

<id> هو معرّف فريد للمهمة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان Task:

  • الحقول المطلوبة:

    الحقلالقيمة
    taskTrackingViewConfig تهيئة تتبع المهام التي تحدد عناصر البيانات التي تكون مرئية للمستخدمين النهائيين تحت أي ظروف.

  • الحقول الاختيارية:

    • لا ينطبق

ويتم تجاهل جميع الحقول الأخرى في العنصر لإجراء التحديث.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskTrackingViewConfig" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "taskTrackingViewConfig": {
    "routePolylinePointsVisibility": {
      "remainingStopCountThreshold": 3
    },
    "estimatedArrivalTimeVisibility": {
      "remainingDrivingDistanceMetersThreshold": 5000
    },
    "remainingStopCountVisibility": {
      "never": true
    }
  }
}
EOM

تعيين المهام لمركبة

يمكنك تعيين المهام لمركبة توصيل عن طريق تحديث طلب المهمة للمركبة. يتم تحديد طلب المهمة للمركبة من خلال قائمة محطات التوقف لمركبة التسليم، ويمكنك تعيين مهمة واحدة أو أكثر لكل محطة مركبة. لمعرفة التفاصيل، يُرجى الاطّلاع على تعديل ترتيب المهام.

لتغيير شحنة من مركبة إلى أخرى، أغلق المهمة الأصلية ثم أعِد إنشائها قبل تخصيص المركبة الجديدة لها. إذا قمت بتحديث مهمة طلب مهمة تم تعيينها بالفعل لمركبة مختلفة، فستحصل على خطأ.

تعديل ترتيب المهام

يمكنك تعديل ترتيب تنفيذ المهام المخصّصة للمركبة من خلال إما حزمة تطوير البرامج (SDK) الخاصة بالسائق أو من بيئة الخادم. لا تستخدم كلتا الطريقتين لتجنب شروط السباق والحفاظ على مصدر واحد للحقيقة.

عند تحديث ترتيب المهام لمركبة، يحدث أيضًا ما يلي:

  • يعيّن المهام الجديدة في المركبة.
  • يغلق أي مهام تم تعيينها سابقًا للمركبة، ولكنها ليست في الطلب المحدث.

لتغيير شحنة من مركبة إلى أخرى، أغلِق المهمة الأصلية ثم أعِد إنشائها قبل تخصيص المركبة الجديدة لها. إذا قمت بتحديث مهمة طلب مهمة تم تعيينها بالفعل لمركبة مختلفة، فستحصل على خطأ.

يمكنك تعديل ترتيب المهام في أي وقت.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لتعديل ترتيب المهام للمركبة:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
static final String TASK1_ID = "task-756390";
static final String TASK2_ID = "task-849263";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
    .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 1st stop
       .setStop(VehicleStop.newBuilder()
           .setPlannedLocation(LocationInfo.newBuilder()
               .setPoint(LatLng.newBuilder()
                   .setLatitude(37.7749)
                   .setLongitude(122.4194)))
           .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
           .setState(VehicleStop.State.NEW)))
    .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 2nd stop
       .setStop(VehicleStop.newBuilder()
           .setPlannedLocation(LocationInfo.newBuilder()
               .setPoint(LatLng.newBuilder()
                   .setLatitude(37.3382)
                   .setLongitude(121.8863)))
           .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
           .setState(VehicleStop.State.NEW)))
    .build();

// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryRequest =
  UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
      .setName(vehicleName)
      .setDeliveryVehicle(deliveryVehicle)
      .setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
      .build();

try {
  DeliveryVehicle updatedDeliveryVehicle =
      deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لتعديل ترتيب المهام لمركبة من بيئة خادم، يمكنك إجراء استدعاء HTTP REST إلى UpdateDeliveryVehicle:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id> هو معرّف فريد لمركبة توصيل في أسطولك تنوي تعديل ترتيب المهام لها. إنه المعرف الذي حددته عند إنشاء المركبة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان DeliveryVehicle:

  • الحقول المطلوبة:

    الحقلالقيمة
    remainingVehicleJourneySegments قائمة بأجزاء الرحلة للمهام بالترتيب الذي يجب تنفيذها فيه. يتم تنفيذ المهمة الأولى في القائمة أولاً.
    باقيVehicleJourneySegments[i].stop محطة المهمة i في القائمة.
    باقيVehicleJourneySegments[i].stop.plannedLocation الموقع الجغرافي المُخطَّط له للمحطة.
    باقيVehicleJourneySegments[i].stop.tasks قائمة بالمهام التي سيتم تنفيذها في محطة المركبة هذه
    remainingVehicleJourneySegments[i].stop.state State.NEW

  • الحقول الاختيارية:

    • لا ينطبق

ويتم تجاهل جميع الحقول الأخرى في العنصر لإجراء التحديث.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "remainingVehicleJourneySegments": [
    {
      "stop": {
        "state": "NEW",
        "plannedLocation": {
          "point": {
            "latitude": 37.7749,
            "longitude": -122.084061
          }
        },
        "tasks": [
          {
            "taskId": "${TASK1_ID}"
          }
        ]
      }
    },
    {
      "stop": {
        "state": "NEW",
        "plannedLocation": {
          "point": {
            "latitude": 37.3382,
            "longitude": 121.8863
          }
        },
        "tasks": [
          {
            "taskId": "${TASK2_ID}"
          }
        ]
      }
    }
  ]
}
EOM

مركبة في طريقها إلى المحطة التالية

يجب إرسال إشعار إلى Fleet Engine عند مغادرة مركبة من المحطة أو عند بدء التنقّل. يمكنك إشعار Fleet Engine إما من خلال حزمة تطوير البرامج (SDK) لبرنامج التشغيل، أو من بيئة خادم باستخدام gRPC أو REST. لا تستخدم كلتا الطريقتين لتجنب شروط العِرق والحفاظ على مصدر واحد للحقيقة.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لإعلام Fleet Engine بأنّ مركبة تتجه إلى محطتها التالية.

    static final String PROJECT_ID = "my-delivery-co-gcp-project";
    static final String VEHICLE_ID = "vehicle-8241890";

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Vehicle settings
    DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
        // Next stop marked as ENROUTE
        .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 1st stop
           .setStop(VehicleStop.newBuilder()
               .setPlannedLocation(LocationInfo.newBuilder()
                   .setPoint(LatLng.newBuilder()
                       .setLatitude(37.7749)
                       .setLongitude(122.4194)))
               .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
               .setState(VehicleStop.State.ENROUTE)))
        // All other stops marked as NEW
        .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 2nd stop
           .setStop(VehicleStop.newBuilder()
               .setPlannedLocation(LocationInfo.newBuilder()
                   .setPoint(LatLng.newBuilder()
                       .setLatitude(37.3382)
                       .setLongitude(121.8863)))
               .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
               .setState(VehicleStop.State.NEW)))
        .build();

    // DeliveryVehicle request
    UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
      UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
          .setName(vehicleName)
          .setDeliveryVehicle(deliveryVehicle)
          .setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
          .build();

    try {
      DeliveryVehicle updatedDeliveryVehicle =
          deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case NOT_FOUND:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

راحة

لإعلام Fleet Engine بأنّ مركبة تسير في طريقها إلى محطتها التالية من بيئة خادم، يمكنك إجراء طلب HTTP REST إلى UpdateDeliveryVehicle:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id> هو معرّف فريد لمركبة التسليم في أسطولك والتي تنوي تعديل ترتيب المهام لها. إنه المعرف الذي حددته عند إنشاء المركبة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان DeliveryVehicle:

  • الحقل المطلوب:

    الحقلالقيمة
    remainingVehicleJourneySegments قائمة المحطات المتبقية للمركبات مع وضع علامة State.NEW على ولاياتها يجب وضع علامة State.ENROUTE على المحطة الأولى في القائمة.

  • الحقول الاختيارية:

    • لا ينطبق

ويتم تجاهل جميع الحقول الأخرى في العنصر.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "remainingVehicleJourneySegments": [
    {
      "stop": {
        "state": "ENROUTE",
        "plannedLocation": {
          "point": {
            "latitude": 37.7749,
            "longitude": -122.084061
          }
        },
        "tasks": [
          {
            "taskId": "${TASK1_ID}"
          }
        ]
      }
    },
    {
      "stop": {
        "state": "NEW",
        "plannedLocation": {
          "point": {
            "latitude": 37.3382,
            "longitude": 121.8863
          }
        },
        "tasks": [
          {
            "taskId": "${TASK2_ID}"
          }
        ]
      }
    }
  ]
}
EOM

تعديل الموقع الجغرافي للمركبة

إذا لم تكن تستخدم "حزمة تطوير البرامج (SDK) للسائق" لتعديل الموقع الجغرافي للمركبة، يمكنك إجراء اتصال مباشر بخدمة Fleet Engine مع الموقع الجغرافي للمركبة. بالنسبة إلى أي مركبة نشطة، يتوقع Fleet Engine تحديث الموقع مرة واحدة على الأقل كل دقيقة ومرة واحدة كل 5 ثوانٍ على الأكثر.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لتعديل موقع المركبة في Fleet Engine:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle myDeliveryVehicle = DeliveryVehicle.newBuilder()
    .setLastLocation(DeliveryVehicleLocation.newBuilder()
        .setSupplementalLocation(LatLng.newBuilder()
            .setLatitude(37.3382)
            .setLongitude(121.8863))
        .setSupplementalLocationTime(now())
        .setSupplementalLocationSensor(DeliveryVehicleLocationSensor.CUSTOMER_SUPPLIED_LOCATION)
        .setSupplementalLocationAccuracy(DoubleValue.of(15.0)))  // Optional
    .build();

// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
  UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
      .setName(vehicleName)
      .setDeliveryVehicle(myDeliveryVehicle)
      .setUpdateMask(FieldMask.newBuilder()
          .addPaths("last_location"))
      .build();

try {
  DeliveryVehicle updatedDeliveryVehicle =
      deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لتعديل الموقع الجغرافي للمركبة في Fleet Engine باستخدام HTTP REST، يمكنك إجراء مكالمة مع UpdateDeliveryVehicle:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=last_location`

<id> هو معرّف فريد لمركبة التسليم في أسطولك أو الذي تنوي تعديل الموقع الجغرافي له. إنه المعرف الذي حددته عند إنشاء المركبة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان DeliveryVehicle:

  • الحقل المطلوب:

    الحقلالقيمة
    lastLocation.supplementalLocation الموقع الجغرافي للمركبة
    lastLocation.supplementalLocationTime آخر طابع زمني معروف للمركبة في هذا الموقع الجغرافي
    lastLocation.supplementalLocationSensor يجب ملء هذا الحقل بـ CUSTOMER_SUPPLIED_LOCATION.

  • الحقول الاختيارية:

    الحقلالقيمة
    lastLocation.supplementalLocationAccuracy دقة الموقع الجغرافي الذي تم تقديمه، بالمتر

مثال على الطلب curl:

# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "lastLocation": {
    "supplementalLocation": {"latitude": 12.1, "longitude": 14.5},
    "supplementalLocationTime": "$(date -u --iso-8601=seconds)",
    "supplementalLocationSensor": "CUSTOMER_SUPPLIED_LOCATION",
    "supplementalLocationAccuracy": 15
  }
}
EOM

وصول مركبة إلى محطة

يجب إرسال إشعار إلى مجموعة المركبات عند وصول مركبة إلى محطة. يمكنك إشعار Fleet Engine إما من حزمة تطوير البرامج (SDK) لبرنامج التشغيل أو من بيئة خادم باستخدام gRPC أو REST. لا تستخدم كلتا الطريقتين لتجنب شروط العِرق والحفاظ على مصدر واحد للحقيقة.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لإعلام Fleet Engine بوصول مركبة إلى محطة:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
    // Marking the arrival at stop.
    .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
       .setStop(VehicleStop.newBuilder()
           .setPlannedLocation(LocationInfo.newBuilder()
               .setPoint(LatLng.newBuilder()
                   .setLatitude(37.7749)
                   .setLongitude(122.4194)))
           .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
           .setState(VehicleStop.State.ARRIVED)))
    // All other remaining stops marked as NEW.
    .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 2nd stop
       .setStop(VehicleStop.newBuilder()
           .setPlannedLocation(LocationInfo.newBuilder()
               .setPoint(LatLng.newBuilder()
                   .setLatitude(37.3382)
                   .setLongitude(121.8863)))
           .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
           .setState(VehicleStop.State.NEW))) // Remaining stops must be NEW.
    .build();

// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
  UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
      .setName(vehicleName)
      .setDeliveryVehicle(deliveryVehicle)
      .setUpdateMask(FieldMask.newBuilder()
          .addPaths("remaining_vehicle_journey_segments"))
      .build();

try {
  DeliveryVehicle updatedDeliveryVehicle =
      deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لإعلام Fleet Engine بوصول مركبة في محطة من بيئة الخادم، يمكنك إجراء استدعاء HTTP REST إلى UpdateDeliveryVehicle:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id> هو معرّف فريد لمركبة التسليم في أسطولك والتي تنوي تعديل ترتيب المهام لها. إنه المعرف الذي حددته عند إنشاء المركبة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان DeliveryVehicle:

  • الحقول المطلوبة:

    الحقلالقيمة
    remainingVehicleJourneySegments المحطة التي وصلت إليها بالحالة State.ARRIVED متبوعة بقائمة بمحطات التوقف المتبقية مع وضع علامة State.NEW على هذه المحطة.

  • الحقول الاختيارية:

    • لا ينطبق

ويتم تجاهل جميع الحقول الأخرى في العنصر لإجراء التحديث.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
# environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "remainingVehicleJourneySegments": [
    {
      "stop": {
        "state": "ARRIVED",
        "plannedLocation": {
          "point": {
            "latitude": 37.7749,
            "longitude": -122.084061
          }
        },
        "tasks": [
          {
            "taskId": "${TASK1_ID}"
          }
        ]
      }
    },
    {
      "stop": {
        "state": "NEW",
        "plannedLocation": {
          "point": {
            "latitude": 37.3382,
            "longitude": 121.8863
          }
        },
        "tasks": [
          {
            "taskId": "${TASK2_ID}"
          }
        ]
      }
    }
  ]
}
EOM

تكمل مركبة محطة

يجب إرسال إشعار إلى فريق Fleet Engine عند اكتمال توقّف أي مركبة. ويتسبب ذلك في ضبط جميع المهام المرتبطة بالمحطة على حالة "مغلق". يمكنك إبلاغ Fleet Engine إما من حزمة تطوير البرامج (SDK) لبرنامج التشغيل، أو من بيئة خادم باستخدام gRPC أو REST. لا تستخدِم كلتا الطريقتين لتجنُّب ظروف السباق وللحفاظ على مصدر واحد للحقيقة.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لإعلام Fleet Engine باكتمال إحدى محطات التوقف.

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
    // This stop has been completed and is commented out to indicate it
    // should be removed from the list of vehicle journey segments.
    // .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
    //    .setStop(VehicleStop.newBuilder()
    //        .setPlannedLocation(LocationInfo.newBuilder()
    //            .setPoint(LatLng.newBuilder()
    //                .setLatitude(37.7749)
    //                .setLongitude(122.4194)))
    //        .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
    //        .setState(VehicleStop.State.ARRIVED)))
    // All other remaining stops marked as NEW.
    // The next stop could be marked as ENROUTE if the vehicle has begun
    // its journey to the next stop.
    .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // Next stop
       .setStop(VehicleStop.newBuilder()
           .setPlannedLocation(LocationInfo.newBuilder()
               .setPoint(LatLng.newBuilder()
                   .setLatitude(37.3382)
                   .setLongitude(121.8863)))
           .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
           .setState(VehicleStop.State.NEW)))
    .build();

// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
  UpdateDeliveryVehicleRequest.newBuilder()  // no need for the header
      .setName(vehicleName)
      .setDeliveryVehicle(deliveryVehicle)
      .setUpdateMask(FieldMask.newBuilder()
          .addPaths("remaining_vehicle_journey_segments"))
      .build();

try {
  DeliveryVehicle updatedDeliveryVehicle =
      deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لإعلام Fleet Engine باكتمال عملية الإيقاف من بيئة الخادم، يمكنك إجراء استدعاء HTTP REST إلى UpdateDeliveryVehicle:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`

<id> هو معرّف فريد لمركبة التسليم في أسطولك والتي تنوي تعديل ترتيب المهام لها. إنه المعرف الذي حددته عند إنشاء المركبة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان DeliveryVehicle:

  • الحقول المطلوبة:

    الحقلالقيمة
    remaining_vehicle_journey_segments يجب ألا تظهر المحطة التي أكملتها بعد الآن في قائمة محطات المركبات المتبقية.

  • الحقول الاختيارية:

    • لا ينطبق

ويتم تجاهل جميع الحقول الأخرى في العنصر لإجراء التحديث.

مثال على الطلب curl:

    # Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
    # environment
    curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "remainingVehicleJourneySegments": [
        {
          "stop": {
            "state": "NEW",
            "plannedLocation": {
              "point": {
                "latitude": 37.3382,
                "longitude": 121.8863
              }
            },
            "tasks": [
              {
                "taskId": "${TASK2_ID}"
              }
            ]
          }
        }
      ]
    }
    EOM

تعديل مهمة

معظم حقول المهام غير قابلة للتغيير. ومع ذلك، يمكنك تعديل الحالة ونتيجة المهمة ووقت نتيجة المهمة وموقع نتيجة المهمة والسمات من خلال تحديث كيان المهمة مباشرةً. على سبيل المثال، في الحالات التي لا يتم فيها تعيين مهمة لمركبة، يمكنك إغلاق المهمة عن طريق تحديث الحالة مباشرةً.

gRPC

هذا مثال على تعديل مهمة من خلال gRPC.

راحة

هذا مثال على تعديل مهمة من خلال REST.

إغلاق مهمة

لإغلاق مهمة تم تعيينها لمركبة، يمكنك إما إبلاغ Fleet Engine بأن المركبة قد أكملت المحطة التي تتم فيها المهمة أو إزالتها من قائمة محطات التوقف. ولإجراء ذلك، يمكنك ضبط قائمة محطات التوقف المتبقية للمركبة كما هو الحال عند تعديل ترتيب المهام الخاصة بمركبة.

إذا لم يتم تعيين مهمة للمركبة بعد ويجب إغلاقها، يمكنك تعديل المهمة إلى حالة "مغلقة". ومع ذلك، لا يمكنك إعادة فتح مهمة تم إغلاقها.

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

gRPC

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setState(Task.State.CLOSED) // You can only directly CLOSE a
  .build();                    // task that is NOT assigned to a vehicle.

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("state"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لوضع علامة "مغلقة" من بيئة خادم على مهمة، عليك إجراء استدعاء HTTP REST إلى UpdateTask:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=state`

<id> هو معرّف فريد للمهمة.

يجب أن يحتوي عنوان الطلب على الحقل Authorize (تفويض) مع القيمة Bearer <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من شركة مصنّعة للرموز المميّزة Fleet Engine.

عليك تضمين كيان Task في نص الطلب:

  • الحقول المطلوبة:

    الحقلالقيمة
    state State.CLOSED

  • الحقول الاختيارية:

    الحقلالقيمة
    taskOutcome Result.SUCCEEDED أو Result.تعذّر
    taskOutcomeTime الوقت الذي تم فيه اكتمال المهمة.
    taskOutcomeLocation الموقع الذي اكتملت فيه المهمة. تضبط Fleet Engine هذا الخيار تلقائيًا على آخر موقع جغرافي للمركبة ما لم يحلّ محلّه مزوّد الخدمة يدويًا.

ويتم تجاهل جميع الحقول الأخرى في العنصر لإجراء التحديث.

مثال على الطلب curl:

    # Set JWT, PROJECT_ID, and TASK_ID in the local environment
    curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=state,taskOutcome,taskOutcomeTime" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "state": "CLOSED",
      "taskOutcome": "SUCCEEDED",
      "taskOutcomeTime": "$(date -u --iso-8601=seconds)"
    }
    EOM

تحديد نتيجة المهمة وموقع النتيجة

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

يمكن ضبط نتائج المهام في الحالة "مغلقة" على "SUCCEEDED" أو "تعذّر الإجراء". يتقاضى Fleet Engine مهام التسليم فقط بالحالة "SUCCEEDED".

عند وضع علامة على نتيجة مهمة، يملأ Fleet Engine تلقائيًا موقع نتائج المهمة بآخر موقع معروف للمركبة. يمكنك تجاوز هذا السلوك.

gRPC

لديك خيار تعيين موقع نتيجة المهمة عند تعيين النتيجة. يؤدي ضبط الموقع إلى منع Fleet Engine من ضبطه على الوضع التلقائي لآخر موقع للمركبة. يمكنك أيضًا استبدال موقع نتيجة المهمة الذي تم تعيينه ضمن Fleet Engine في وقت لاحق. لا يستبدل Fleet Engine أبدًا موقع نتيجة المهمة الذي تقدمه. لا يمكنك تعيين موقع نتيجة مهمة لمهمة لم يتم تعيين نتيجة مهمة لها. يمكنك تعيين كل من نتيجة المهمة وموقع نتيجة المهمة داخل نفس الطلب.

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لتحديد نتيجة المهمة على SUCCEEDED وتحديد موقع إنجاز المهمة:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTaskOutcome(TaskOutcome.SUCCEEDED)
  .setTaskOutcomeTime(now())
  .setTaskOutcomeLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("task_outcome", "task_outcome_time", "task_outcome_location"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لوضع علامة على مهمة باعتبارها مكتملة من بيئة خادم، يمكنك إجراء استدعاء HTTP REST إلى UpdateTask:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation`

<id> هو معرّف فريد للمهمة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يحتوي نص الطلب على كيان Task:

  • الحقول المطلوبة:

    الحقلالقيمة
    taskOutcome Result.SUCCEEDED أو Result.تعذّر

  • الحقول الاختيارية:

    الحقلالقيمة
    taskOutcomeLocation الموقع الذي اكتملت فيه المهمة. إذا لم يتم تعيينها، فإن Fleet Engine يضبط هذا الإعداد الافتراضي على آخر موقع للمركبة.
    taskOutcomeTime الطابع الزمني لوقت اكتمال المهمة.

ويتم تجاهل جميع الحقول الأخرى في العنصر لإجراء التحديث.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "taskOutcome": "SUCCEEDED",
  "taskOutcomeTime": "$(date -u --iso-8601=seconds)",
  "taskOutcomeLocation": {
    "point": {
      "latitude": -6.195139,
      "longitude": 106.820826
    }
  }
}
EOM

إعادة توجيه شحنة

بعد إنشاء مهمة شحن، لا يمكن تغيير الموقع المخطط لها. لإعادة توجيه الشحنة، أغلق مهمة الشحن دون تحديد نتيجة، ثم أنشئ مهمة جديدة بالموقع المخطط المحدث. بعد إنشاء المهمة الجديدة، اضبط المهمة على نفس المركبة. لمزيد من المعلومات، يُرجى الاطّلاع على إغلاق مهمة الشحن وتعيين المهمة.

استخدام مركبات تقديم التغذية ومركبات التسليم

إذا كنت تستخدم مركبات التغذية لنقل الشحنات إلى مركبات التسليم على مدار اليوم، فقم بوضع نموذج لنقل الشحنات كمهمة توقف مجدولة لمركبة التسليم. لضمان تتبع الموقع بدقة، قم فقط بتعيين مهمة تسليم الشحنة لشحنة يتم نقلها بعد تحميلها على مركبة التسليم. لمزيد من المعلومات، يُرجى الاطّلاع على المحطة المُجدوَلة.

حالة شحن المتجر ومعلومات وصفية أخرى

عند اكتمال مهمة الشحن، يتم تسجيل حالة المهمة ونتائجها في المهمة. ومع ذلك، قد ترغب في تحديث معلومات تعريفية أخرى خاصة بالشحنة. لتخزين معلومات وصفية أخرى يمكنك الرجوع إليها خارج خدمة Fleet Engine، استخدِم track_id المرتبط بالمهمة كمفتاح في جدول خارجي.

لمزيد من المعلومات، يُرجى الاطِّلاع على مدة مهمة.

البحث عن مركبة

يمكنك البحث عن مركبة إما من خلال حزمة تطوير البرامج (SDK) الخاصة ببرنامج التشغيل، أو من بيئة خادم باستخدام gRPC أو REST.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC للبحث عن مركبة:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle request
String name = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
GetDeliveryVehicleRequest getVehicleRequest = GetDeliveryVehicleRequest.newBuilder()  // No need for the header
    .setName(name)
    .build();

try {
  DeliveryVehicle vehicle = deliveryService.getDeliveryVehicle(getVehicleRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

للبحث عن مركبة من بيئة الخادم، يمكنك إجراء استدعاء HTTP REST إلى GetVehicle:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<vehicleId>`

<id> هو معرّف فريد للمهمة.

<vehicleId> هو رقم تعريف المركبة المطلوب البحث عنها.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يكون نص الطلب فارغًا.

إذا اكتملت عملية البحث بنجاح، يعني ذلك أنّ نص الاستجابة يحتوي على كيان للمركبة.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}"

البحث عن مهمة

يمكنك البحث عن مهمة من بيئة خادم باستخدام gRPC أو REST. لا تدعم حزمة Driver SDK البحث عن مهمة.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC للبحث عن مهمة:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8597549";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task request
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
GetTaskRequest getTaskRequest = GetTaskRequest.newBuilder()  // No need for the header
    .setName(taskName)
    .build();

try {
  Task task = deliveryService.getTask(getTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

للبحث عن مهمة من بيئة خادم، يمكنك إجراء استدعاء HTTP REST إلى GetTask:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<taskId>`

<id> هو معرّف فريد للمهمة.

<taskId> هو رقم تعريف المهمة المطلوب البحث عنها.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

يجب أن يكون نص الطلب فارغًا.

إذا كان البحث ناجحًا، سيحتوي نص الاستجابة على كيان مهمة.

مثال على الطلب curl:

    # Set JWT, PROJECT_ID, and TASK_ID in the local environment
    curl -H "Authorization: Bearer ${JWT}" \
      "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}"

البحث عن معلومات مهمة الشحن باستخدام رقم تعريف التتبّع

يمكنك البحث عن معلومات مهمة الشحن بالطرق التالية، لكل منها غرض منفصل:

  • بواسطة معرّف مهمة: يستخدمه مستخدمون مثل مشغّلي الأسطول الذين يمكنهم الوصول إلى العرض الكامل لبيانات المهمة.
  • بواسطة رقم تعريف تتبّع: يستخدمه برنامج العميل لتقديم معلومات محدودة إلى المستخدم النهائي، مثل الوقت الذي من المتوقّع فيه استلام طرد في منزله.

يناقش هذا القسم البحث عن معلومات المهمة باستخدام رقم تعريف التتبع. إذا كنت تريد البحث عن مهمة حسب معرّف المهمة، انتقِل إلى البحث عن مهمة.

للبحث عن المعلومات من خلال رقم تعريف التتبّع، يمكنك استخدام أيّ مما يلي:

متطلبات البحث

  • أن معلومات الشحن التي يقدمها رقم تعريف التتبُّع متوافقة مع قواعد إذن الوصول المذكورة في التحكّم في ظهور المواقع الجغرافية التي يتم تتبّعها.

  • استخدِم Fleet Engine للبحث عن معلومات الشحن من خلال رقم تعريف التتبُّع. لا توفّر حزمة تطوير البرامج (SDK) لبرنامج التشغيل عمليات البحث عن المعلومات من خلال رقم تعريف التتبّع. للقيام بذلك باستخدام FleetEngine، يمكنك استخدام إما بيئة خادم أو متصفح.

  • استخدِم أضيق رمز مميّز ممكن للحدّ من المخاطر الأمنية. على سبيل المثال، إذا كنت تستخدم الرمز المميز للمستهلك للتسليم، فإن أي طلبات بيانات من واجهة برمجة التطبيقات Fleet Engine Deliveries API لا تعرض سوى المعلومات ذات الصلة بذلك المستخدم النهائي، مثل جهة الشحن أو مستلم الشحنة. ويتم إخفاء جميع المعلومات الأخرى في الردود. للحصول على مزيد من المعلومات حول الرموز المميّزة، يمكنك الاطّلاع على إنشاء رمز JSON المميّز للويب (JWT) للتفويض.

عمليات البحث باستخدام Java باستخدام gRPC

يوضّح المثال التالي كيفية استخدام مكتبة Java gRPC للبحث عن معلومات حول مهمة شحن من خلال رقم تعريف التتبُّع الخاص بها.

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
GetTaskTrackingInfoRequest getTaskTrackingInfoRequest = GetTaskTrackingInfoRequest.newBuilder()  // No need for the header
    .setParent(parent)
    .setTrackingId(TRACKING_ID)
    .build();

try {
  TaskTrackingInfo taskTrackingInfo = deliveryService.getTaskTrackingInfo(getTaskTrackingInfoRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

عمليات البحث باستخدام HTTP

للبحث عن مهمة شحن من متصفّح، يمكنك إجراء استدعاء HTTP REST إلى GetTaskTrackingInfo:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/taskTrackingInfo/<tracking_id>`

<tracking_id> هو رقم تعريف التتبع المرتبط بالمهمة.

يجب أن يحتوي عنوان الطلب على الحقل تصريح مع القيمة Bearer <token>، حيث يكون <token> هو رمز مميّز صادر عن مصنع رموز مميّزة من Fleet Engine.

إذا كان البحث ناجحًا، سيحتوي نص الاستجابة على كيان taskTrackingInfo.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, and TRACKING_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/taskTrackingInfo/${TRACKING_ID}"

سرد المهام

يمكنك إدراج المهام من بيئة خادم أو متصفّح. لا تدعم حزمة تطوير البرامج (SDK) لبرنامج التشغيل قائمة المهام.

تتطلب مهام القوائم وصولاً واسع النطاق إلى المهام. مهام القوائم مخصصة فقط للمستخدمين الموثوق بهم. استخدام قارئ مجموعة التسليم أو الرموز المميزة لمصادقة المستخدمين المميزين عند تقديم طلبات مهام القوائم.

تم إخفاء الحقول التالية في المهام المدرَجة:

  • VehicleStop.planned_location
  • VehicleStop.state
  • VehicleStop.TaskInfo.taskId

يمكن تصفية المهام المدرجة حسب معظم خصائص المهام. لمعرفة بنية طلب البحث للفلتر، راجِع AIP-160. توضح القائمة التالية خصائص المهام الصالحة التي يمكنك استخدامها للتصفية:

  • attributes
  • delivery_vehicle_id
  • state
  • planned_location
  • task_duration
  • task_outcome
  • task_outcome_location
  • task_outcome_location_source
  • task_outcome_time
  • tracking_id
  • كتابة

استخدم تنسيقات الحقول التالية بناءً على اقتراحات تحسين واجهة برمجة تطبيقات Google:

نوع الحقل التنسيق مثال
الطابع الزمني RFC-3339 task_outcome_time = 2022-03-01T11:30:00-08:00
المدة عدد الثواني متبوعًا بـ s task_duration = 120s
التعداد سلسلة state = CLOSED AND type = PICKUP
الموقع الجغرافي point.latitude وpoint.longitude planned_location.point.latitude > 36.1 AND planned_location.point.longitude < -122.0

راجِع AIP-160 للحصول على قائمة كاملة بعوامل تشغيل طلبات البحث لفلاتر الفلترة.

وإذا لم يتم تحديد طلب بحث للفلتر، سيتم سرد جميع المهام.

يتم تقسيم قوائم المهام إلى صفحات. يمكن تحديد حجم الصفحة في طلبات مهام القائمة. إذا تم تحديد حجم الصفحة، فإن عدد المهام المعروضة لا يزيد عن الحجم المحدد للصفحة. إذا لم يكن هناك حجم للصفحة، يتم استخدام قيمة افتراضية معقولة. إذا تجاوز حجم الصفحة المطلوب حد أقصى داخليًا، سيتم استخدام الحد الأقصى الداخلي.

يمكن أن تتضمن قائمة المهام رمزًا مميزًا لقراءة الصفحة التالية من النتائج. استخدِم الرمز المميّز للصفحة مع طلب مطابق للطلب السابق لاسترداد الصفحة التالية من المهام. عندما يكون الرمز المميز للصفحة المعروضة فارغًا، لا يكون هناك المزيد من المهام للاسترجاع.

gRPC

يوضح المثال التالي كيفية استخدام مكتبة Java gRPC لسرد مهام deliveryVehicleId وسمة مهمة. يمكن أن يكون الرد الناجح فارغًا. تشير الاستجابة الفارغة إلى أنه لا توجد مهام مرتبطة بـ deliveryVehicleId المقدم.

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
ListTasksRequest listTasksRequest = ListTasksRequest.newBuilder()  // No need for the header
    .setParent(parent)
    .setFilter("delivery_vehicle_id = 123 AND attributes.foo = true")
    .build();

try {
  ListTasksResponse listTasksResponse = deliveryService.listTasks(listTasksRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

راحة

لإدراج المهام من المتصفّح، يمكنك إجراء استدعاء HTTP REST إلى ListTasks:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks`

لتطبيق فلتر على المهام المُدرجة، يمكنك تضمين معلمة عنوان URL "الفلتر" مع قيمة طلب فلتر إلغاء عنوان URL.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

إذا كان البحث ناجحًا، سيحتوي نص الاستجابة على بيانات بالبنية التالية:

    // JSON representation
    {
      "tasks": [
        {
          object (Task)
        }
      ],
      "nextPageToken": string,
      "totalSize": integer
    }

يمكن أن يظل الرد الناجح فارغًا. تشير الاستجابة الفارغة إلى أنه لم يتم العثور على مهام تفي بمعايير التصفية المحددة.

مثال على الطلب curl:

    # Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
    curl -H "Authorization: Bearer ${JWT}" \
      "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?filter=state%20%3D%20OPEN%20AND%20delivery_vehicle_id%20%3D%20${VEHICLE_ID}"

إدراج مركبات التسليم

يمكنك إدراج مركبات التسليم من بيئة خادم أو متصفّح. لا تتيح "حزمة تطوير البرامج (SDK) للسائق" إدراج بيانات مركبات التسليم.

تتطلب مركبات تسليم البيانات وصولاً واسع النطاق إلى مركبات التسليم ومخصصة للمستخدمين الموثوق بهم فقط. استخدام قارئ أسطول التسليم أو الرموز المميّزة للتحقق من المستخدم المميّز للتسليم عند تقديم طلبات مركبات تسليم القوائم

تم إخفاء الحقول التالية في مركبات التسليم المدرَجة بسبب تأثيرها في حجم الاستجابة:

  • CurrentRouteSegment
  • RemainingVehicleJourneySegments

يمكنك فلترة مركبات التسليم حسب السمة attributes. على سبيل المثال، لطلب بحث عن سمة تحتوي على المفتاح my_key والقيمة my_value، استخدِم attributes.my_key = my_value. للاستعلام عن سمات متعددة، يمكنك ضم طلبات البحث باستخدام عاملَي التشغيل AND وOR المنطقيين كما في attributes.key1 = value1 AND attributes.key2 = value2. راجِع AIP-160 للحصول على وصف كامل لبنية طلب البحث للفلاتر.

يمكنك فلترة مركبات التسليم المدرَجة حسب الموقع الجغرافي باستخدام مَعلمة الطلب viewport. تحدِّد مَعلمة طلب viewport إطارات العرض باستخدام إحداثيي حدود: زوج إحداثيي خط العرض وخط الطول high (الشمال الشرقي) وlow (الجنوب الغربي). يتم رفض الطلبات إذا كانت تحتوي على خط عرض مرتفع أقل جغرافيًا من خط عرض منخفض.

يتم تقسيم قوائم مركبات التسليم إلى صفحات تلقائيًا باستخدام حجم صفحة معقول. إذا حدّدت حجم صفحة، سيعرض الطلب عدد المركبات المحدّد في الحدّ أو أقل فقط. إذا تجاوز حجم الصفحة المطلوب قيمة قصوى داخلية، يتم استخدام الحد الأقصى الداخلي. الحجمان الافتراضي والحد الأقصى للصفحة هو 100 مركبة.

يمكن أن تتضمن قائمة مركبات التوصيل رمزًا مميزًا لقراءة الصفحة التالية من النتائج. لا يتوفر رمز الصفحة إلّا في الاستجابة عند توفّر المزيد من صفحات مركبات التسليم للاسترجاع. لاسترداد الصفحة التالية من المهام، استخدِم الرمز المميّز للصفحة مع طلب مطابق للطلب السابق.

gRPC

يوضّح المثال التالي كيفية استخدام مكتبة Java gRPC لإدراج مركبات التسليم في منطقة معيّنة باستخدام سمة معيّنة. يمكن أن تكون الاستجابة الناجحة فارغة. وعندما يحدث ذلك، فهذا يعني أنه ليست هناك مركبات تحمل هذه السمة المحددة في إطار العرض المحدد.

static final String PROJECT_ID = "my-delivery-co-gcp-project";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
ListDeliveryVehiclesRequest listDeliveryVehiclesRequest =
  ListDeliveryVehiclesRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setViewport(
            Viewport.newBuilder()
              .setHigh(LatLng.newBuilder()
                  .setLatitude(37.45)
                  .setLongitude(-122.06)
                  .build())
              .setLow(LatLng.newBuilder()
                  .setLatitude(37.41)
                  .setLongitude(-122.11)
                  .build())
      .setFilter("attributes.my_key = my_value")
      .build();

try {
  ListDeliveryVehiclesResponse listDeliveryVehiclesResponse =
      deliveryService.listDeliveryVehicles(listDeliveryVehiclesRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
      case NOT_FOUND:
          break;

      case PERMISSION_DENIED:
          break;
  }
  return;
}

راحة

لإدراج المهام من المتصفّح، يمكنك إجراء استدعاء HTTP REST إلى ListDeliveryVehicles:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles`

لتطبيق فلتر على المهام المُدرجة، يمكنك تضمين معلمة عنوان URL "الفلتر" مع قيمة طلب البحث الذي تم إلغاءه عبر عنوان URL.

يجب أن يحتوي عنوان الطلب على الحقل تصريح بقيمة الحامل <token>، حيث يكون <token> رمزًا مميّزًا صادرًا من مصنع رموز مميّزة Fleet Engine.

إذا كان البحث ناجحًا، سيحتوي نص الاستجابة على بيانات بالبنية التالية:

// JSON representation
{
  "deliveryVehicles": [
    {
      object (DeliveryVehicle)
    }
  ],
  "nextPageToken": string,
  "totalSize": integer
}

يمكن أن يظل الرد الناجح فارغًا. عند حدوث ذلك، يعني ذلك أنّه لم يتم العثور على مركبات توصيل تستوفي طلب البحث المحدّد وإطار العرض.

مثال على الطلب curl:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?filter=attributes.my_key%20%3D%20my_value%20&viewport.high.latitude=37.45&viewport.high.longitude=-122.06&viewport.low.latitude=37.41&viewport.low.longitude=-122.11"

تتبُّع الشحن

لديك خياران لاستخدام واجهة برمجة التطبيقات Fleet Engine Deliveries API لتفعيل تتبّع الشحن:

  • المفضّل: استخدِم مكتبة "تتبُّع شحن JavaScript". تتيح لك المكتبة تصور موقع المركبات والمواقع محل الاهتمام التي تم تتبعها في Fleet Engine. فهو يحتوي على مكون خريطة JavaScript يمثل بديلًا لعنصر google.maps.Map قياسي، ومكونات بيانات للاتصال بـ Fleet Engine. يتيح لك هذا المكون تقديم تجربة تتبع الشحنات المتحركة وقابلة للتخصيص من تطبيق الويب أو تطبيق الهاتف المحمول.

  • يمكنك تنفيذ ميزة تتبُّع الشحنات الخاصة بك على واجهة Fleet Engine Deliveries API.

يكمن السر في البحث عن مهام الشحن من خلال رقم تعريف التتبّع.

إذا كنت تستخدم دور مستهلك في خدمة التسليم، فإنّ أي طلبات من واجهة برمجة التطبيقات Fleet Engine Deliveries API تعرض المعلومات ذات الصلة بجهة الشحن أو المستلِم فقط. يتم إخفاء جميع المعلومات الأخرى في الردود. أنت مسئول عن مصادقة المستخدمين النهائيين. علاوة على ذلك، تتم تصفية معلومات الموقع بناءً على المهمة التي يتم تنفيذها بالفعل. أثناء مهمة عدم التوافر، لا تتم مشاركة معلومات الموقع مع المستخدم النهائي.

التسجيل

يمكنك ضبط Fleet Engine لإرسال سجلات RPC إلى Cloud Logging. لمزيد من المعلومات، يُرجى الاطّلاع على التسجيل.

أدوار الأذونات والرموز المميزة

كما هو موضّح في مقالة إدارة دورة حياة المركبات والمهام وملاحظات التفويض لحالات الاستخدام الفردية، يتطلّب إجراء الطلبات إلى Fleet Engine المصادقة باستخدام رموز JSON المميّزة للويب التي تم توقيعها باستخدام بيانات اعتماد حساب الخدمة. وقد يكون لحسابات الخدمة المستخدمة لإصدار هذه الرموز المميزة دور واحد أو أكثر، وكل دور يمنح مجموعة مختلفة من الأذونات.

للحصول على مزيد من المعلومات، يُرجى الاطّلاع على المصادقة والتفويض.

تحديد المشاكل الشائعة وحلّها

راجِع الأقسام التالية للحصول على مساعدة إذا واجهت أي مشاكل.

المرونة

لا يُعتبر Fleet Engine مصدرًا للحقيقة. أنت مسؤول عن استعادة حالة نظامك، إذا لزم الأمر، بدون الاعتماد على Fleet Engine.

حالة مفقودة في Fleet Engine

عند العمل مع Fleet Engine، يجب تنفيذ برامج العملاء حتى يتعافى النظام في حال حدوث عطل. على سبيل المثال، عندما يحاول Fleet Engine تحديث مركبة، قد تظهر رسالة خطأ للإشارة إلى أنّ المركبة غير موجودة. وعلى العميل بعد ذلك إعادة إنشاء المركبة في الحالة الجديدة. على الرغم من أن هذه المشكلة نادرًا ما تحدث، تأكد من أن نظامك مرن بدرجة كافية للتعامل معها.

في سيناريو الفشل الكارثي على Fleet Engine، قد تحتاج إلى إعادة إنشاء معظم أو كل المركبات والمهام. إذا أصبح معدّل الإنشاء مرتفعًا جدًا، قد يتعذّر تنفيذ بعض الطلبات مرة أخرى بسبب مشاكل متعلّقة بالحصة، لأنّ عمليات التحقّق من الحصص مُطبّقة لتجنُّب هجمات حجب الخدمة (DOS). في هذه الحالة، قم بإبطاء معدل إعادة الترفيه باستخدام استراتيجية تراجع للمحاولات.

حالة "فقدان الجهاز" في تطبيق السائق

إذا تعطّل تطبيق برنامج التشغيل، يجب على التطبيق إعادة إنشاء الحالة الحالية داخل حزمة تطوير البرامج (SDK) لبرنامج التشغيل. يجب أن يحاول التطبيق إعادة إنشاء المهام لضمان وجودها واستعادة حالاتها الحالية. يجب أيضًا على التطبيق إعادة إنشاء قائمة محطات التوقف لـ Driver SDK وإعدادها بشكل صريح.

الأسئلة الشائعة

ماذا لو توقف السائق عن مهمة غير مرتبة؟

في هذه الحالة، قم أولاً بتحديث ترتيب المهام ثم المتابعة كالمعتاد، مع وضع علامة على الوصول عند المحطة وإكمال المهمة وغيرها من التفاصيل. إذا لم تقم بذلك، فقد يصبح النظام غير متسق، وقد تصبح الوقت المقدر للوصول غير صحيح، وقد يتم الإبلاغ عن أخطاء غير متوقعة.