השלמה של משימות

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

  • סגירת משימה: סגירת משימה של משלוח משנה את הסטטוס שלה ל-CLOSED ומציינת שהמשימה הזו כבר לא פעילה.

  • הגדרת התוצאה של המשימה: אחרי שסוגרים משימה, צריך להגדיר את התוצאה שלה כ-SUCCEEDED או כ-FAILED כדי לסיים אותה. זהו שלב חשוב בהשלמת המשימה, כדי להציג את תוצאת המסירה ב'שיתוף התהליך' ולוודא שהחיוב על שירות Fleet Engine תקין.

סגירת משימה

אתם יכולים לסגור משימה בדרכים הבאות:

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

אחרי שסוגרים משימה, אי אפשר לפתוח אותה מחדש.

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

שדות של משימות לסגירת משימות

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

שדה חובה ערך
state State.CLOSED

סגירת משימה ישירות

בדוגמאות הבאות מוסבר איך להגדיר משימה ללא הקצאה למצב סגור, ב-gRPC או באמצעות קריאה לבקשה של HTTP REST אל UpdateTask.

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

REST

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

  • ‎<id> הוא מזהה ייחודי של המשימה.
  • כותרת הבקשה חייבת לכלול את השדה Authorization עם הערך Bearer <token>, כאשר <token> הוא אסימון שהונפק על ידי השרת בהתאם להנחיות שמפורטות במאמרים תפקידים בחשבון שירות ואסימוני אינטרנט מסוג JSON.
  • צריך לכלול ישות Task בגוף הבקשה

דוגמה לפקודה 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 +"%Y-%m-%dT%H:%M:%SZ")"
 }
 EOM

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

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

פרטי התוצאה של המשימה

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

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

אפשר להשתמש באחת מהגישות הבאות כדי להגדיר את task_outcome_location ואת task_outcome_time:

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

‏Fleet Engine מונע את העדכונים הבאים שקשורים לתוצאות של משימות:

  • לא ניתן לשנות את התוצאה של משימה אחרי שהיא מוגדרת ל-SUCCEEDED או ל-FAILED.
  • אי אפשר להגדיר מיקום או זמן להשגת תוצאה של משימה ללא הגדרת תוצאה.

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

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

שדה חובה ערך
taskOutcome Outcome.SUCCEEDED או Outcome.FAILED

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

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

בדוגמה הבאה מוצגת המחשה לשימוש בספריית Java gRPC ובקריאה ל-HTTP‏ REST אל UpdateTask כדי להגדיר את תוצאת המשימה כ-SUCCEEDED ולהגדיר את המיקום שבו המשימה הושלמה.

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

REST

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

  • ‎<id> הוא מזהה ייחודי של המשימה.
  • כותרת הבקשה חייבת לכלול את השדה Authorization עם הערך Bearer <token>, כאשר <token> הוא אסימון שהונפק על ידי השרת בהתאם להנחיות שמפורטות במאמרים תפקידים בחשבון שירות ואסימוני אינטרנט מסוג JSON.
  • גוף הבקשה חייב לכלול ישות Task.
 # 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 +"%Y-%m-%dT%H:%M:%SZ")",
   "taskOutcomeLocation": {
     "point": {
       "latitude": -6.195139,
       "longitude": 106.820826
     }
   }
 }
 EOM

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