עדכון של סטטוס העצירה

במסמך הזה אנחנו יוצאים מנקודת הנחה שאתם מכירים את הנושאים הבאים:

כמו שמצוין בקטע משימות מתוזמנות, Essentialt Engine Essentials, יוצרים משימות ומשייכים אותן לרכב משמשת לבניית מודלים של הקשר בעולם האמיתי בין המשימה המיקום שבו הרכב צפוי לעצור כדי שהנהג יוכל להשלים את התהליך את המשימה.

לאחר מכן, תוכלו לנהל את התקדמות המשימות במהלך מחזור החיים שלהן על ידי שליחת עדכונים ל-Fleet Engine, כדי שהוא יוכל לבצע את הניתוב ואת עדכוני הסטטוס בצורה הטובה ביותר לאורך כל תהליך הטיפול במשימה. אחת הדרכים העיקריות לעשות זאת היא לעדכן לעצור את הרכב כשהרכב מתקרב לעצירה, מגיע לתחנה ויוצא ממנה. כך ניתן לדווח ולנתח את התקדמות המשימה בשני החשבונות מפעילי כלל המכשירים ומשתמשי קצה. אלה עדכוני הסטטוס:

  • בדרך: הערך ENROUTE ב-enum‏ STATE של VehicleStop מציין שהעצירה הבאה ברשימה של מסלול הנסיעה של הרכב. מבחינת המשימה, המשמעות היא שכל משימה שמשויכת לתחנה היא הבאה ברשימה לביצוע.
  • Arrived: המאפיין STATE של VehicleStop משתמש ב-ARRIVED כדי לציין שהרכב הגיע לתחנה. מבחינת המשימה, המשמעות היא שכל משימה שמשויכת להפסקה עובדת באופן פעיל.
  • הושלמה: כדי לסמן עצירה כ'הושלמה', מסירים אותה מרשימת העצירות ברכב. כשעושים זאת, מערכת Fleet Engine מסמנת אוטומטית את כל המשימות המשויכות כסגורות. למידע נוסף על סגירת משימות, ראו סגירת משימות.

במסמך הזה מתואר איך סטטוס הפסקת העדכון באמצעות גישות בצד השרת. אפשר לעשות זאת גם מאפליקציית הנהג, אם נותנים לנהג אפשרות לנהל משימות באמצעות מכשיר מהימן. משתמשים בשיטה אחת בלבד כדי להימנע ממרוץ תהליכים ולשמור על מקור מהימן אחד.

הרכב בדרך לעצירה

המערכת אמורה לשלוח הודעה ל-Fleet Engine כשהרכב מתחיל לנווט לתחנה הבאה. כך ניתן לשפר את זמן ההגעה המשוער ואת חישובי המסלולים.

שדות חובה להפסקת העדכונים

מערכת Fleet Engine מתעלמת מכל שאר השדות של הישות בהתראה.

שדהערך
remainingVehicleJourneySegments רשימת העצירות הנותרות של כלי הרכב, כאשר המדינה (State) שלהן מסומנת כ-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;
 }

REST

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • ‎<id> הוא מזהה ייחודי של המשימה.
  • כותרת הבקשה חייבת להכיל שדה Authorization עם הערך נושא <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 כשרכב מגיע לעצירה.

שדות חובה להפסקת העדכונים

מערכת Fleet Engine מתעלמת מכל שאר השדות של הישות בהתראה.

שדהערך
remainingVehicleJourneySegments רשימת העצירות הנותרות של כלי הרכב, כאשר המדינה (State) שלהן מסומנת כ-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;
  }

REST

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • ‎<id> הוא מזהה ייחודי של המשימה.
  • כותרת הבקשה חייבת לכלול את השדה Authorization עם הערך Bearer <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;
  }

REST

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`
  • &lt;id&gt; הוא מזהה ייחודי של המשימה.
  • כותרת הבקשה חייבת לכלול את השדה Authorization עם הערך Bearer <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

המאמרים הבאים