Este documento pressupõe que você tenha familiaridade com o seguinte:
- Criar tarefas de envio
- Introdução às Tarefas programadas, que aborda em detalhes a relação entre tarefas, paradas e veículos.
Conforme declarado em Tarefas programadas no Fleet Engine Essentials, você cria tarefas e as associa a uma parada de veículo como uma forma de modelar a associação real entre a tarefa e o local em que o veículo deve parar para que o motorista possa concluir a tarefa.
Depois, você gerencia o progresso das tarefas ao longo do ciclo de vida delas enviando atualizações para o Fleet Engine para que ele possa executar melhor as atualizações de roteamento e status ao longo da jornada da tarefa. Uma maneira importante de fazer isso é atualizar a parada do veículo quando ele se aproxima, chega e sai dela. Isso permite relatórios e análises sobre o progresso da tarefa para operadores de frota e usuários finais. Estas atualizações de status são as seguintes:
- En route: o tipo enumerado
STATE
deVehicleStop
usaENROUTE
para indicar que a parada é a próxima na lista do itinerário do veículo. Do ponto de vista da tarefa, isso significa que qualquer tarefa associada à parada é a próxima da lista a ser concluída. - Arrived: o tipo enumerado
STATE
deVehicleStop
usaARRIVED
para indicar que o veículo chegou à parada. Do ponto de vista da tarefa, isso significa que qualquer tarefa associada à parada está sendo trabalhada ativamente. - Concluída: você marca uma parada como concluída removendo-a da lista de paradas do veículo. Ao fazer isso, o Fleet Engine marca automaticamente todas as tarefas associadas como ENCERRADA. Para mais detalhes sobre o fechamento de tarefas, consulte Finalizar tarefas.
Este documento descreve como atualizar o status de parada usando abordagens do lado do servidor. Você também pode fazer isso no app do motorista, se permitir que ele gerencie tarefas usando um dispositivo confiável. Use apenas um método para evitar condições de disputa e manter uma única fonte da verdade.
O veículo está a caminho da parada
Seu sistema precisa notificar o Fleet Engine quando o veículo iniciar a navegação até a próxima parada. Isso melhora os cálculos de HEC e rota.
Campos obrigatórios para atualizações de paradas
O Fleet Engine ignora todos os outros campos na entidade para a notificação.
Campo | Valor |
---|---|
remainingVehicleJourneySegments
|
Lista das paradas restantes do veículo com os estados marcados como State.NEW. |
Exemplo de rota para parar
Os exemplos a seguir mostram como notificar o Fleet Engine de que um veículo está a caminho da próxima parada usando a biblioteca Java gRPC ou uma chamada REST HTTP para UpdateDeliveryVehicle
.Todas as outras paradas são marcadas como novas.
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> é um identificador exclusivo da tarefa.
- O cabeçalho da solicitação precisa conter um campo Autorização com o valor Bearer <token>, em que <token> é emitido pelo servidor de acordo com as diretrizes descritas em Papéis da conta de serviço e Tokens JSON Web.
- O corpo da solicitação precisa conter uma entidade
DeliveryVehicle
:
Comando curl
de exemplo:
# 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
O veículo chega à parada
O Fleet Engine precisa ser notificado quando um veículo chega a uma parada.
Campos obrigatórios para atualizações de paradas
O Fleet Engine ignora todos os outros campos na entidade para a notificação.
Campo | Valor |
---|---|
remainingVehicleJourneySegments
|
Lista das paradas restantes do veículo com os estados marcados como State.NEW. |
Exemplo de chegada à parada
Os exemplos a seguir mostram como notificar o Fleet Engine de que um veículo chegou
à parada usando a biblioteca Java gRPC ou uma chamada HTTP REST para
UpdateDeliveryVehicle
. Todas as outras paradas são marcadas como novas.
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> é um identificador exclusivo da tarefa.
- O cabeçalho da solicitação precisa conter um campo Autorização com o valor Bearer <token>, em que <token> é emitido pelo servidor de acordo com as diretrizes descritas em Papéis da conta de serviço e Tokens JSON Web.
- O corpo da solicitação precisa conter uma entidade
DeliveryVehicle
:
Comando curl
de exemplo:
# 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
O veículo faz uma parada
O Fleet Engine precisa ser notificado quando um veículo conclui uma parada. Isso faz com que todas as tarefas associadas à parada sejam definidas como FECHADAS.
Campos obrigatórios para atualizações de paradas
O Fleet Engine ignora todos os outros campos na entidade para a notificação.
Campo | Valor |
---|---|
remainingVehicleJourneySegments |
Lista das paradas restantes do veículo com os estados marcados como State.NEW. O estado da primeira parada na lista precisa estar marcado como State.ENROUTE. |
Conclui um exemplo de parada
Os exemplos a seguir mostram como notificar o Fleet Engine de que um veículo chegou
à parada usando a biblioteca Java gRPC ou uma chamada HTTP REST para
UpdateDeliveryVehicle
. Todas as outras paradas são marcadas como novas.
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> é um identificador exclusivo da tarefa.
- O cabeçalho da solicitação precisa conter um campo Autorização com o valor Bearer <token>, em que <token> é emitido pelo servidor de acordo com as diretrizes descritas em Papéis da conta de serviço e Tokens JSON Web.
- O corpo da solicitação precisa conter uma entidade
DeliveryVehicle
:
Comando curl
de exemplo:
# 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