Aktualizowanie zadań pojazdu dostawczego

W tym dokumencie zakłada się, że znasz te zagadnienia:

W rzeczywistym scenariuszu dostawy firmy przypisują kierowcom zadania dostawy, którzy następnie używają pojazdu, aby dostarczyć je do odbiorcy w zaplanowanej lokalizacji, np. w domu lub w pomieszczeniu dostaw w kompleksie budynków. W usłudze Fleet Engine modelujesz to, tworząc zadanie i wysyłając żądanie aktualizacji pojazdu dostawczego, które następnie aktualizuje encję pojazdu o listę przystanków do pokonania. Do każdego przystanku przypisujesz listę zadań do wykonania.

Zadania pojazdu możesz aktualizować w dowolnym momencie, ale zwykle robisz to w tych celach:

  • Planowanie zadań do wykonania przez pojazd. Możesz to zrobić za pomocą żądania aktualizacji, które dodaje nowy przystanek do pojazdu, lub żądania aktualizacji, które dodaje nowe zadanie do istniejącego przystanku.
  • Aktualizowanie kolejności istniejących zadań powiązanych z danym przystankiem pojazdu.
  • Zmienianie lokalizacji wykonania zadania. Domyślnie usługa Fleet Engine oznacza lokalizację wykonania zadania jako tę samą lokalizację co przystanek pojazdu powiązany z zadaniem. Jeśli wolisz, możesz określić konkretne lokalizacje dla poszczególnych zadań. Możesz na przykład mieć przystanek pojazdu w dużym kompleksie, aby dostarczyć kilka paczek, z których każda jest przypisana do konkretnego pomieszczenia dostarczania poczty.
  • Zamykanie wcześniej przypisanych zadań , aby wykluczyć je z zaktualizowanej kolejności. Więcej informacji znajdziesz w artykule Finalizowanie zadań.

Planowanie lub zmienianie zadań dostawy

Zadania przypisane do pojazdu możesz planować lub zmieniać w środowisku serwera albo za pomocą pakietu Driver SDK, jeśli umożliwisz kierowcy zarządzanie zadaniami za pomocą zaufanego urządzenia. Używaj tylko jednej metody, aby uniknąć wyścigów i zachować jedno źródło informacji.

Aby przenieść przesyłkę z jednego pojazdu do drugiego, zamknij pierwotne zadanie i utwórz je ponownie, zanim przypiszesz je do innego pojazdu. Jeśli zaktualizujesz pojazd dostawczy, aby uwzględnić zadanie, które jest już przypisane do innego pojazdu, pojawi się błąd.

Pola wymagane do aktualizowania zadań

W tej sekcji opisujemy pola wymagane do ustawienia podczas aktualizowania zadania dla pojazdu. Nie podano żadnych pól opcjonalnych. Usługa Fleet Engine ignoruje wszystkie inne pola w encji aktualizacji.

Pole wymaganeWartość
remainingVehicleJourneySegments Lista segmentów podróży dla zadań w kolejności, w jakiej mają być wykonywane. Pierwsze zadanie na liście jest wykonywane jako pierwsze.
remainingVehicleJourneySegments[i].stop Przystanek dla zadania i na liście.
remainingVehicleJourneySegments[i].stop.plannedLocation Zaplanowana lokalizacja przystanku.
remainingVehicleJourneySegments[i].stop.tasks Lista zadań do wykonania na tym przystanku pojazdu.
remainingVehicleJourneySegments[i].stop.state State.NEW

Przykład przypisywania zadań

Poniższe przykłady pokazują, jak używać biblioteki Java gRPC i wywołania HTTP REST UpdateDeliveryVehicle, aby dodać 2 nowe zadania dla pojazdu.

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> to unikalny identyfikator pojazdu dostawczego w Twojej flocie dla którego chcesz zaktualizować kolejność zadań. Jest to identyfikator określony podczas tworzenia pojazdu.

  • Nagłówek żądania musi zawierać pole Authorization z wartością Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w sekcji Role konta usługi i tokeny JSON Web.

  • Treść żądania musi zawierać encję DeliveryVehicle.

Przykład polecenia 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

Co dalej?