Aktualizowanie zadań pojazdu dostawczego

W tym dokumencie przyjęto założenie, że znasz te pojęcia:

W rzeczywistym scenariuszu dostawy firmy przydzielają zadania związane z dostawą kierowcom, którzy następnie używają pojazdu, aby dostarczyć przesyłkę do odbiorcy w zaplanowanym miejscu, np. w mieszkaniu lub w pomieszczeniu do odbioru przesyłek w kompleksie budynków. W Fleet Engine możesz to modelować, tworząc zadanie i wysyłając żądanie aktualizacji pojazdu dostawczego, które następnie aktualizuje jednostkę pojazdu o listę przystanków do odwiedzenia. Do każdego przystanku przypisujesz listę zadań do wykonania.

Zadania dotyczące 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.
  • Zaktualizuj kolejność istniejących zadań powiązanych z danym przystankiem pojazdu.
  • Zmień lokalizację ukończenia zadania. Domyślnie Fleet Engine oznacza lokalizację ukończenia zadania jako tę samą lokalizację co przystanek pojazdu powiązany z tym 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 przesyłek, z których każda jest przypisana do konkretnego pomieszczenia do odbioru poczty.
  • Zamknij wszystkie wcześniej przypisane zadania, aby wykluczyć je z zaktualizowanego porządku. Więcej informacji znajdziesz w sekcji Kończenie zadań.

Planowanie i zmiana zadań dostawy

Możesz zaplanować lub zmienić zadania przypisane do pojazdu w środowisku serwera lub za pomocą pakietu Driver SDK, jeśli umożliwiasz kierowcy zarządzanie zadaniami na zaufanym urządzeniu. Używaj tylko jednej metody, aby uniknąć warunków wyścigu i utrzymać jedno źródło 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, które należy ustawić podczas aktualizowania zadania dla pojazdu. Nie podano żadnych pól opcjonalnych. Fleet Engine ignoruje wszystkie pozostałe pola w obiekcie na potrzeby aktualizacji.

Pole wymaganeWartość
remainingVehicleJourneySegments Lista segmentów ścieżki 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.
remainingVehicleJourneySegments[i].stop.state State.NEW

Przykład przypisywania zadań

Poniższe przykłady pokazują, jak za pomocą biblioteki Java gRPC i wywołania HTTP REST UpdateDeliveryVehicle 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, w przypadku którego chcesz zaktualizować kolejność zadań. Jest to identyfikator, który został określony podczas tworzenia pojazdu.

  • Nagłówek żądania musi zawierać pole Authorization o wartości Bearer <token>, gdzie <token> jest tokenem wydanym przez Twój serwer zgodnie z wytycznymi opisanymi w sekcjach Role kont usługiTokeny 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?