En este documento, se asume que conoces lo siguiente:
- Cómo crear tareas de envío
- La introducción a las tareas programadas, que cubre la relación entre tareas, paradas y vehículos en detalle.
Como se indica en Tareas programadas en la Fleet Engine Essentials, puedes crear tareas y asociarlas a un vehículo detenerse como una forma de modelar la asociación del mundo real entre la tarea y el ubicación donde se espera que se detenga el vehículo para que el conductor pueda la tarea.
A partir de ahí, administras el progreso de las tareas a lo largo de su ciclo de vida enviar actualizaciones a Fleet Engine para que pueda realizar el enrutamiento y el estado de la mejor manera actualizaciones a lo largo del recorrido de la tarea. Una forma clave de hacerlo es actualizar la parada del vehículo cuando este se acerque a la parada, llegue a ella y la abandone. Esto permite generar informes y análisis sobre el progreso de la tarea tanto de Operadores de flota y usuarios finales. Estas actualizaciones de estado son las siguientes:
- En camino: La enum
STATE
paraVehicleStop
usaENROUTE
para indicar que la parada es la siguiente en la lista del itinerario del vehículo Desde la perspectiva de la tarea, se refiere a cualquier tarea asociada con la parada. es el siguiente en la lista que se debe completar. - Llegado: La enum
STATE
paraVehicleStop
usaARRIVED
para indicar que el vehículo llegó a la parada. Desde la perspectiva de la tarea, significa que cualquier tarea asociada con la parada en la que se está trabajando activamente. - Completada: Marcas una parada como completada quitándola de la lista de paradas del vehículo. Cuando lo hagas, Fleet Engine marcará automáticamente todas las tareas asociadas como CLOSED. Para obtener más detalles sobre cómo cerrar tareas, consulta Finaliza las tareas.
En este documento, se describe cómo actualizar el estado de las detenciones mediante enfoques del servidor. Tú también puedes hacerlo desde tu app del conductor si permites que el conductor administrar tareas con un dispositivo de confianza. Usa solo un método para evitar carrera y mantener una única fuente de verdad.
El vehículo está en camino para detenerse
Tu sistema debe notificar a Fleet Engine cuando el vehículo comience a navegar hacia el en la siguiente parada. Esto mejora los cálculos de la hora de llegada estimada y la ruta.
Campos obligatorios para las actualizaciones de paradas
Fleet Engine ignora todos los demás campos de la entidad de la notificación.
Campo | Valor |
---|---|
remainingVehicleJourneySegments
|
Lista de paradas vehiculares restantes con sus estados marcados como State.NEW. |
Ejemplo de En camino a detenerse
En los siguientes ejemplos, se muestra cómo notificar a Fleet Engine que un vehículo está en peligro
enrutar a la siguiente parada con la biblioteca gRPC de Java o
Llamada REST a UpdateDeliveryVehicle
.Todas las demás paradas se marcan como nuevas.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Next stop marked as ENROUTE
.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.ENROUTE)))
// All other stops marked as 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 updateDeliveryVehicleRequest =
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 la tarea.
- El encabezado de la solicitud debe contener un campo Authorization con el valor Bearer <token>, donde tu servidor emite <token>. 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": "ENROUTE",
"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
El vehículo llega a la parada
Fleet Engine debe recibir una notificación cuando un vehículo llega a una parada.
Campos obligatorios para las actualizaciones de paradas
Fleet Engine ignora todos los demás campos de la entidad de la notificación.
Campo | Valor |
---|---|
remainingVehicleJourneySegments
|
Lista de paradas vehiculares restantes con sus estados marcados como State.NEW. |
Ejemplo de "Llega a una parada"
En los siguientes ejemplos, se muestra cómo notificar a Fleet Engine que llegó un vehículo
en la parada, con la biblioteca gRPC de Java o una llamada REST HTTP para
UpdateDeliveryVehicle
Todas las demás paradas se marcan como nuevas.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// Marking the arrival at stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
.setStop(VehicleStop.newBuilder()
.setPlannedLocation(LocationInfo.newBuilder()
.setPoint(LatLng.newBuilder()
.setLatitude(37.7749)
.setLongitude(122.4194)))
.addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
.setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as 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))) // Remaining stops must be NEW.
.build();
// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
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 la tarea.
- El encabezado de la solicitud debe contener un campo Authorization con el valor Bearer <token>, donde tu servidor emite <token>. 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": "ARRIVED",
"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
El vehículo completa una parada
Fleet Engine debe recibir una notificación cuando un vehículo finaliza una parada. Esto provoca todas las tareas asociadas con la parada se establecerán en el estado CLOSED.
Campos obligatorios para las actualizaciones de paradas
Fleet Engine ignora todos los demás campos de la entidad de la notificación.
Campo | Valor |
---|---|
remainingVehicleJourneySegments |
Lista de paradas vehiculares restantes con sus estados marcados como State.NEW. La primera parada de la lista debe tener su estado marcado como State.ENROUTE. |
Completa un ejemplo de parada.
En los siguientes ejemplos, se muestra cómo notificar a Fleet Engine que llegó un vehículo
en la parada, con la biblioteca gRPC de Java o una llamada REST HTTP para
UpdateDeliveryVehicle
Todas las demás paradas se marcan como nuevas.
gRPC
static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
DeliveryServiceBlockingStub deliveryService =
DeliveryServiceGrpc.newBlockingStub(channel);
// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
// This stop has been completed and is commented out to indicate it
// should be removed from the list of vehicle journey segments.
// .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
// .setStop(VehicleStop.newBuilder()
// .setPlannedLocation(LocationInfo.newBuilder()
// .setPoint(LatLng.newBuilder()
// .setLatitude(37.7749)
// .setLongitude(122.4194)))
// .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
// .setState(VehicleStop.State.ARRIVED)))
// All other remaining stops marked as NEW.
// The next stop could be marked as ENROUTE if the vehicle has begun
// its journey to the next stop.
.addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder() // Next 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 updateDeliveryVehicleRequest =
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=remaining_vehicle_journey_segments`
- <id> es un identificador único para la tarea.
- El encabezado de la solicitud debe contener un campo Authorization con el valor Bearer <token>, donde tu servidor emite <token>. 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.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM