تعديل حالة المحطة

يفترض هذا المستند الإلمام بما يلي:

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

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

  • المسار: يستخدم تعداد STATE لـ VehicleStop ENROUTE من أجل للإشارة إلى أن المحطة هي التالية في قائمة برنامج رحلة المركبة. من منظور المهمة، يعني ذلك أي مهمة مرتبطة بالتوقف التالي في القائمة ليتم إكماله.
  • تم الوصول: يستخدم تعداد STATE لـ VehicleStop ARRIVED للإشارة إلى وصول المركبة إلى المحطة. من منظور المهمة، فهذا يعني أن أي مهمة مرتبطة بالتوقف عن العمل بنشاط.
  • مكتملة: يمكنك وضع علامة على محطة توقّف مكتملة من خلال إزالتها من قائمة والتوقف للمركبة. عند القيام بذلك، يضع Fleet Engine تلقائيًا علامة جميع المهام المرتبطة بها على أنها مغلقة. لمزيد من التفاصيل حول إغلاق المهام، يُرجى الاطّلاع على وضع اللمسات الأخيرة على المهام:

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

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

يجب أن يرسل النظام إشعارًا إلى Fleet Engine عندما تبدأ السيارة التنقّل إلى المحطة التالية. وهذا يحسن الوقت المقدر للوصول وحساب المسار.

حقول مطلوبة لإيقاف التحديثات

يتجاهل Fleet Engine جميع الحقول الأخرى في الكيان الخاص بالإشعار.

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

مثال على الطريق إلى الوقوف

توضح الأمثلة التالية كيفية إعلام Fleet Engine بأنّ إحدى المركبات في طريقه إلى محطته التالية، باستخدام مكتبة Java gRPC أو HTTP الاتصال REST بـ UpdateDeliveryVehicle، وتم وضع علامة "جديدة" على كل المحطات الأخرى.

gRPC

 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;
 }

راحة

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • &lt;id&gt; هو معرّف فريد للمهمة.
  • يجب أن يحتوي عنوان الطلب على الحقل Authorize (تفويض) مع القيمة الحامل <token>، حيث يتم إصدار <token> من خلال الخادم وفقًا للإرشادات الموضحة في أدوار حساب الخدمة رموز JSON المميّزة للويب
  • يجب أن يحتوي نص الطلب على كيان DeliveryVehicle:

مثال على الطلب 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

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

يجب إرسال إشعار إلى مجموعة المركبات عند وصول مركبة إلى محطة.

حقول مطلوبة لإيقاف التحديثات

يتجاهل Fleet Engine جميع الحقول الأخرى في الكيان الخاص بالإشعار.

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

مثال على الوصول إلى المحطة

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

gRPC

  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;
  }

راحة

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • &lt;id&gt; هو معرّف فريد للمهمة.
  • يجب أن يحتوي عنوان الطلب على الحقل Authorize (تفويض) مع القيمة الحامل <token>، حيث يتم إصدار <token> من خلال الخادم وفقًا للإرشادات الموضحة في أدوار حساب الخدمة رموز JSON المميّزة للويب
  • يجب أن يحتوي نص الطلب على كيان DeliveryVehicle:

مثال على الطلب 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 جميع الحقول الأخرى في الكيان الخاص بالإشعار.

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

إكمال مثال للمحطة

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

gRPC

  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;
  }

راحة

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`
  • &lt;id&gt; هو معرّف فريد للمهمة.
  • يجب أن يحتوي عنوان الطلب على الحقل Authorize (تفويض) مع القيمة الحامل <token>، حيث يتم إصدار <token> من خلال الخادم وفقًا للإرشادات الموضحة في أدوار حساب الخدمة رموز JSON المميّزة للويب
  • يجب أن يحتوي نص الطلب على كيان DeliveryVehicle:

مثال على الطلب 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

الخطوات التالية