Aktualizowanie zadań pojazdu dostawczego

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

W rzeczywistym scenariuszu dostawy firmy przypisują zadania związane z dostawą do kierowców, którzy następnie dostarczają przesyłki do odbiorcy w zaplanowanym miejscu, takim jak mieszkanie lub pokój dostaw w kompleksie budynków. W Fleet Engine możesz to zamodelować, tworząc zadanie i wysyłając prośbę o zaktualizowanie pojazdu dostawczego, która następnie aktualizuje element pojazdu o listę przystanków do przejazdu. Każdy przystanek przypisujesz listę zadań do wykonania w danym miejscu.

Zadania związane z pojazdem możesz aktualizować w dowolnym momencie, ale zwykle robisz to w jednym z tych celów:

  • Zaplanuj zadania do wykonania przez pojazd. Możesz to zrobić za pomocą prośby o aktualizację, która dodaje nowy przystanek do pojazdu, lub za pomocą prośby o aktualizację, która dodaje nowe zadanie do istniejącego przystanku.
  • Zmieniać 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ń. Możesz na przykład mieć przystanek pojazdu w dużym kompleksie, w ramach którego dostarczasz pewną liczbę przesyłek, z których każda ma przypisany określony punkt dostarczania poczty.
  • Zamknij wcześniej przypisane zadania, aby nie uwzględnić ich w zaktualizowanej kolejności. Więcej informacji znajdziesz w artykule Kończenie zadań.

Planowanie i zmienianie zadań dostarczania

Zadania przypisane do pojazdu możesz planować lub zmieniać w środowisku serwera lub za pomocą pakietu Driver SDK, jeśli udostępnisz kierowcy możliwość zarządzania zadaniami za pomocą zaufanego urządzenia. Używaj tylko jednej metody, aby uniknąć sytuacji wyścigowych i utrzymać jedno źródło prawdy.

Aby zmienić dostawę z jednego pojazdu na inny, zamknij pierwotne zadanie i utwórz je ponownie, zanim przypiszesz je do innego. Jeśli zaktualizujesz pojazd dostawczy tak, aby zawierał zadanie, które jest już przypisane do innego pojazdu, pojawi się błąd.

Pola wymagane do aktualizowania zadań

W tej sekcji znajdziesz informacje o polach, które należy ustawić podczas aktualizowania zadania dotyczącego pojazdu. Nie podano żadnych pól opcjonalnych. Fleet Engine ignoruje wszystkie pozostałe pola w jednostce podczas aktualizacji.

Pole wymaganeWartość
remainingVehicleJourneySegments Lista segmentów ścieżki dla zadań w kolejności ich wykonania. Najpierw wykonywane jest pierwsze zadanie na liście.
remainingVehicleJourneySegments[i].stop Zatrzymanie 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ń

W przykładach poniżej pokazujemy, jak używać biblioteki gRPC Java i wywołania REST dla UpdateDeliveryVehicle, aby dodać 2 nowe zadania dotyczące 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`
  • &lt;id&gt; to unikalny identyfikator pojazdu dostawcy w Twojej flocie, w przypadku którego chcesz zaktualizować kolejność zadań. Jest to identyfikator podany przez Ciebie podczas tworzenia pojazdu.

  • Nagłówek żądania musi zawierać pole Authorization o wartości Bearer <token>, gdzie <token> jest wydawany przez serwer zgodnie z wytycznymi opisanymi w artykule Role na kontach 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?