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

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

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

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

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

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

הרכב בדרך לתחנה

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

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

מערכת 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;
 }

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": "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.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`
  • ‎<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": "NEW",
         "plannedLocation": {
           "point": {
             "latitude": 37.3382,
             "longitude": 121.8863
           }
         },
         "tasks": [
           {
             "taskId": "${TASK2_ID}"
           }
         ]
       }
     }
   ]
 }
 EOM

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