Actualiza las tareas del vehículo de entrega

En este documento, se supone que tienes conocimientos sobre lo siguiente:

En una situación de entrega del mundo real, las empresas asignan tareas de envío a los conductores, quienes luego usan un vehículo para entregarlas al destinatario en una ubicación planificada, como una residencia o una sala de entrega en un complejo de edificios. Para modelar esto en Fleet Engine, crea una tarea y emite una solicitud de actualización del vehículo de entrega, que luego actualiza la entidad del vehículo con una lista de paradas para viajar. A cada parada, le asignas una lista de tareas que se deben completar en ella.

Puedes actualizar las tareas del vehículo en cualquier momento, pero, por lo general, lo haces para los siguientes propósitos:

  • Programar tareas para que un vehículo las complete. Puedes hacerlo con una solicitud de actualización que agregue una parada nueva al vehículo o con una solicitud de actualización que agregue una tarea nueva a una parada existente.
  • Actualizar el orden de las tareas existentes asociadas con una parada de vehículo determinada.
  • Cambiar la ubicación de finalización de la tarea. De forma predeterminada, Fleet Engine marca la ubicación de finalización de la tarea como la misma ubicación que la parada del vehículo asociada con la tarea. Si lo prefieres, puedes especificar ubicaciones específicas para tareas individuales. Por ejemplo, es posible que un vehículo se detenga en un complejo grande para entregar varios paquetes, cada uno de los cuales tiene asignada una sala de entrega de correo específica.
  • Cerrar las tareas asignadas anteriormente para dejarlas fuera del orden actualizado. Consulta Finalizar tareas para obtener más detalles.

Cómo programar o cambiar tareas de entrega

Puedes programar o cambiar las tareas asignadas a un vehículo desde un entorno de servidor o con el SDK de Driver si le proporcionas al conductor la capacidad de administrar tareas con un dispositivo de confianza. Usa solo un método para evitar condiciones de carrera y mantener una sola fuente de información.

Para cambiar un envío de un vehículo a otro, cierra la tarea original y vuelve a crearla antes de asignarla a un vehículo diferente. Si actualizas un vehículo de entrega para incluir una tarea que ya está asignada a un vehículo diferente, recibirás un error.

Campos obligatorios para actualizar tareas

En esta sección, se documentan los campos obligatorios que se deben configurar cuando se actualiza una tarea para un vehículo. No se proporcionan campos opcionales. Fleet Engine ignora todos los demás campos de la entidad para la actualización.

Campo obligatorioValor
remainingVehicleJourneySegments Una lista de segmentos de viaje para las tareas en el orden en que deben ejecutarse. La primera tarea de la lista se ejecuta primero.
remainingVehicleJourneySegments[i].stop La parada para la tarea i en la lista.
remainingVehicleJourneySegments[i].stop.plannedLocation La ubicación planificada para la parada.
remainingVehicleJourneySegments[i].stop.tasks Una lista de tareas que se deben realizar en esta parada del vehículo.
remainingVehicleJourneySegments[i].stop.state State.NEW

Ejemplo de asignación de tareas

En los siguientes ejemplos, se muestra cómo usar la biblioteca gRPC de Java y una llamada REST HTTP a UpdateDeliveryVehicle para agregar dos tareas nuevas para el vehículo.

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> es un identificador único para un vehículo de entrega en tu flota para el que deseas actualizar el orden de las tareas. Es el identificador que especificaste cuando creaste el vehículo.

  • El encabezado de la solicitud debe contener un campo Authorization con el valor Bearer <token>, en el que <token> lo emite tu servidor según los lineamientos descritos en Roles de cuentas de servicio y tokens web JSON.

  • El cuerpo de la solicitud debe contener una entidad DeliveryVehicle.

Comando curl de ejemplo:

  # 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

¿Qué sigue?