עדכון המשימות של כלי הרכב

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

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

אפשר לעדכן את המשימות ברכב בכל שלב, אבל בדרך כלל עושים זאת למטרות הבאות:

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

תזמון או שינוי של משימות מסירה

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

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

שדות חובה לעדכון משימות

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

שדה חובהערך
remainingVehicleJourneySegments רשימה של קטעי התהליך של המשימות לפי הסדר שבו צריך לבצע אותן. המשימה הראשונה ברשימה מבוצעת קודם.
remainingVehicleJourneySegments[i].stop התחנה של המשימה i ברשימה.
remainingVehicleJourneySegments[i].stop.plannedLocation המיקום המתוכנן של התחנה.
remainingVehicleJourneySegments[i].stop.tasks רשימת המשימות שצריך לבצע בתחנת הרכב הזו.
remainingVehicleJourneySegments[i].stop.state State.NEW

דוגמה להקצאת משימות

בדוגמאות הבאות מוסבר איך להשתמש בספריית Java gRPC ובקריאה ל-HTTP‏ REST אל UpdateDeliveryVehicle כדי להוסיף שתי משימות חדשות לרכב.

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

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": "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

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