Aktualizowanie zadań pojazdu dostawczego

W tym dokumencie zakładamy, że znasz te zagadnienia:

W rzeczywistym scenariuszu dostawy firmy przypisują kierowcom zadania dostawy, a kierowcy używają pojazdu, aby dostarczyć je do odbiorcy w zaplanowanej lokalizacji, np. w domu lub w pomieszczeniu dostaw w budynku. Modelujesz to w usłudze Fleet Engine, 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:

  • Zaplanuj zadania 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.
  • Zaktualizuj kolejność istniejących zadań powiązanych z danym przystankiem pojazdu.
  • Zmień lokalizację 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ń. Na przykład pojazd może zatrzymać się w dużym kompleksie, aby dostarczyć kilka paczek, z których każda jest przypisana do konkretnego pomieszczenia dostawy poczty.
  • Zamknij wszystkie wcześniej przypisane zadania , 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 zaplanować lub zmienić 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 1 metody, aby uniknąć sytuacji wyścigu i zachować jedno źródło wiarygodnych danych.

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 podajemy żadnych pól opcjonalnych. Usługa Fleet Engine ignoruje wszystkie inne pola w encji na potrzeby aktualizacji.

Pole wymaganeWartość
remainingVehicleJourneySegments Lista segmentów podróży dla zadań w kolejności, w jakiej powinny 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, który został 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 kont 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?