En este documento, se supone que conoces lo siguiente:
- Cómo crear tareas de envío
- Es una introducción a las tareas programadas, que abarca en detalle la relación entre las tareas, las paradas y los vehículos.
En una situación de entrega real, las empresas asignan tareas de envío de entrega a los conductores, que luego usan un vehículo para entregarlos al destinatario en una ubicación planificada, como una residencia o una sala de entregas 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 por recorrer. A cada parada, le asignas una lista de tareas que se deben completar en ella.
Puedes actualizar las tareas de los vehículos en cualquier momento, pero, por lo general, lo haces con los siguientes fines:
- Programa tareas para que se completen en un vehículo. 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.
- Actualiza el orden de las tareas existentes asociadas con una parada del vehículo determinada.
- Cambia la ubicación de la finalización de la tarea. De forma predeterminada, Fleet Engine marca la ubicación de finalización de la tarea como la misma que la parada del vehículo asociada con la tarea. Si lo prefieres, puedes especificar ubicaciones específicas para las tareas individuales. Por ejemplo, puedes hacer que un vehículo se detenga en un complejo grande para entregar varios paquetes, a cada uno de los cuales se le asignó una sala de entrega de correo específica.
- Cierra las tareas asignadas anteriormente para que no se incluyan en el orden actualizado. Consulta Cómo finalizar tareas para obtener más detalles.
Programa o cambia 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 un solo método para evitar condiciones de carrera y mantener una única 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 otro vehículo. Si actualizas un vehículo de reparto 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. El motor de flota ignora todos los demás campos de la entidad para la actualización.
Campo obligatorio | Valor |
---|---|
remainingVehicleJourneySegments |
Una lista de segmentos de recorrido para las tareas en el orden en que deben ejecutarse. La primera tarea de la lista se ejecuta primero. |
remainingVehicleJourneySegments[i].stop |
La parada de la tarea i en la lista. |
remainingVehicleJourneySegments[i].stop.plannedLocation |
La ubicación planificada de 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 de 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 de un vehículo de entrega de tu flota para el que deseas actualizar el pedido de 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 tu servidor emite <token>, según los lineamientos descritos en Funciones de cuentas de servicio y Tokens web de 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