Aktualizowanie zadań pojazdu dostawczego

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

W rzeczywistym scenariuszu dostawy firmy przypisują kierowcom zadania związane z dostawą przesyłek, którzy następnie używają pojazdu, aby dostarczyć je odbiorcy w zaplanowanym miejscu, np. w miejscu zamieszkania lub w pomieszczeniu dostawczym w kompleksie budynków. Możesz to odzwierciedlić w Fleet Engine, tworząc zadanie i wysyłając żądanie aktualizacji pojazdu dostawczego, które następnie aktualizuje encję pojazdu, dodając listę przystanków do pokonania. Do każdego przystanku przypisujesz listę zadań, które mają zostać wykonane na tym przystanku.

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

  • Planuj zadania, które pojazd ma wykonać. Możesz to zrobić, wysyłając prośbę o aktualizację, która dodaje nowy przystanek do pojazdu, lub prośbę o aktualizację, która dodaje nowe zadanie do istniejącego przystanku.
  • Zaktualizować kolejność istniejących zadań powiązanych z danym przystankiem pojazdu.
  • Zmień lokalizację, w której zadanie ma zostać wykonane. Domyślnie Fleet Engine oznacza lokalizację ukończenia 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ę przy dużym kompleksie, aby dostarczyć kilka paczek, z których każda jest przypisana do konkretnego pomieszczenia pocztowego.
  • Zamknij wszystkie wcześniej przypisane zadania, aby nie uwzględniać ich w zaktualizowanej kolejności. Więcej informacji znajdziesz w sekcji Finalizowanie zadań.

Planowanie i modyfikowanie zadań związanych z dostawą

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

Aby przenieść przesyłkę z jednego pojazdu do innego, 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.

Wymagane pola do aktualizowania zadań

W tej sekcji opisano pola, które należy ustawić podczas aktualizowania zadania dla pojazdu. Nie podano żadnych pól opcjonalnych. Silnik floty ignoruje wszystkie pozostałe pola w encji podczas aktualizacji.

Pole wymaganeWartość
remainingVehicleJourneySegments Lista segmentów ścieżki 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 Planowana 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 gRPC w języku Java i wywołania HTTP REST do 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 we flocie, dla którego chcesz zaktualizować kolejność zadań. Jest to identyfikator podany podczas tworzenia pojazdu.

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

  • Treść żądania musi zawierać element DeliveryVehicle

Przykładowe polecenie 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?