تفترض هذه المستندات الإلمام بما يلي:
- إنشاء مهام الشحنات
- مقدّمة عن المهام المجدوَلة، التي تتناول بالتفصيل العلاقة بين المهام والمحطات والمركبات
كما هو موضّح في المهام المجدوَلة في أساسيات Fleet Engine، يمكنك إنشاء مهام وربطها بمحطة مركبة كطريقة لتمثيل العلاقة الواقعية بين المهمة والموقع الجغرافي الذي يُتوقَّع أن تتوقف فيه المركبة ليتمكّن السائق من إكمال المهمة.
بعد ذلك، يمكنك إدارة تقدّم المهام طوال مراحل النشاط من خلال إرسال تعديلات إلى Fleet Engine ليتمكّن من إجراء أفضل عمليات التوجيه وتعديل الحالات على طول مسار المهمة. إحدى الطرق الرئيسية التي يمكنك اتّباعها هي تعديل محطة المركبة عندما تقترب المركبة من المحطة وتصل إليها وتغادرها. يتيح ذلك إعداد التقارير والتحليلات حول تقدّم المهام لكل من مشغّلي الأساطيل والمستخدمين النهائيين. في ما يلي تعديلات الحالة هذه:
- في الطريق: يستخدم التعداد
STATEلـVehicleStopالقيمةENROUTEللإشارة إلى أنّ المحطة هي التالية في قائمة مسار المركبة. من منظور المهمة، يعني ذلك أنّ أي مهمة مرتبطة بالمحطة هي التالية في القائمة التي يجب إكمالها. - وصلت: يستخدم التعداد
STATEلـVehicleStopالقيمةARRIVEDللإشارة إلى أنّ المركبة وصلت إلى المحطة. من منظور المهمة، يعني ذلك أنّ أي مهمة مرتبطة بالمحطة يتم العمل عليها حاليًا. - مكتملة: يمكنك وضع علامة على المحطة على أنّها مكتملة من خلال إزالتها من قائمة المحطات للمركبة. عند إجراء ذلك، يضع Fleet Engine تلقائيًا علامة "مغلقة" على جميع المهام المرتبطة. لمزيد من التفاصيل حول إغلاق المهام، يُرجى الاطّلاع على إنهاء المهام.
يصف هذا المستند كيفية تعديل حالة المحطة باستخدام طرق من جهة الخادم. يمكنك أيضًا إجراء ذلك من تطبيق السائق إذا منحت السائق إمكانية إدارة المهام باستخدام جهاز موثوق به. استخدِم طريقة واحدة فقط لتجنُّب حالات التنافس والحفاظ على مصدر واحد للبيانات الصحيحة.
المركبة في طريقها إلى المحطة
على نظامك إرسال إشعار إلى Fleet Engine عندما تبدأ المركبة في الانتقال إلى المحطة التالية. يؤدي ذلك إلى تحسين تقديرات وقت الوصول وحسابات المسارات.
الحقول المطلوبة لتعديلات المحطة
يتجاهل Fleet Engine جميع الحقول الأخرى في الكيان للإشعار.
| الحقل | القيمة |
|---|---|
remainingVehicleJourneySegments
|
قائمة بنقاط توقّف المركبة المتبقية مع وضع علامة على حالاتها على أنّها State.NEW |
مثال على "في الطريق إلى المحطة"
توضّح الأمثلة التالية كيفية إرسال إشعار إلى Fleet Engine بأنّ مركبة في طريقها إلى محطتها التالية، باستخدام مكتبة Java gRPC أو طلب HTTP
REST إلى UpdateDeliveryVehicle.يتم وضع علامة "جديدة" على جميع المحطات الأخرى.
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;
}
راحة
PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
- <id> هو معرّف فريد للمهمة.
- يجب أن يحتوي عنوان الطلب على حقل Authorization بالقيمة Bearer <token>، حيث يُصدر خادمك <token> وفقًا للإرشادات الموضّحة في أدوار حسابات الخدمة و الرموز المميّزة الخاصة بالويب JSON.
- يجب أن يحتوي نص الطلب على كيان
DeliveryVehicle:
مثال على أمر 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": "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
وصول المركبة إلى المحطة
يجب إرسال إشعار إلى Fleet Engine عندما تصل المركبة إلى محطة.
الحقول المطلوبة لتعديلات المحطة
يتجاهل Fleet Engine جميع الحقول الأخرى في الكيان للإشعار.
| الحقل | القيمة |
|---|---|
remainingVehicleJourneySegments
|
قائمة بنقاط توقّف المركبة المتبقية مع وضع علامة على حالاتها على أنّها State.NEW |
مثال على "الوصول إلى المحطة"
توضّح الأمثلة التالية كيفية إرسال إشعار إلى Fleet Engine بأنّ مركبة وصلت
إلى المحطة، باستخدام إمّا مكتبة Java gRPC أو طلب HTTP REST إلى
UpdateDeliveryVehicle. يتم وضع علامة "جديدة" على جميع المحطات الأخرى.
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;
}
راحة
`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
- <id> هو معرّف فريد للمهمة.
- يجب أن يحتوي عنوان الطلب على حقل Authorization بالقيمة Bearer <token>، حيث يُصدر خادمك <token> وفقًا للإرشادات الموضّحة في أدوار حسابات الخدمة و الرموز المميّزة الخاصة بالويب JSON.
- يجب أن يحتوي نص الطلب على كيان
DeliveryVehicle:
مثال على أمر 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": "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
إكمال المركبة لمحطة
يجب إرسال إشعار إلى Fleet Engine عندما تكمل المركبة محطة. يؤدي ذلك إلى ضبط حالة "مغلقة" على جميع المهام المرتبطة بالمحطة.
الحقول المطلوبة لتعديلات المحطة
يتجاهل Fleet Engine جميع الحقول الأخرى في الكيان للإشعار.
| الحقل | القيمة |
|---|---|
remainingVehicleJourneySegments |
قائمة بنقاط توقّف المركبة المتبقية مع وضع علامة على حالاتها على أنّها State.NEW يجب وضع علامة على الحالة الأولى في القائمة على أنّها State.ENROUTE. |
مثال على إكمال محطة
توضّح الأمثلة التالية كيفية إرسال إشعار إلى Fleet Engine بأنّ مركبة وصلت
إلى المحطة، باستخدام إمّا مكتبة Java gRPC أو طلب HTTP REST إلى
UpdateDeliveryVehicle. يتم وضع علامة "جديدة" على جميع المحطات الأخرى.
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;
}
راحة
PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`
- <id> هو معرّف فريد للمهمة.
- يجب أن يحتوي عنوان الطلب على حقل Authorization بالقيمة Bearer <token>، حيث يُصدر خادمك <token> وفقًا للإرشادات الموضّحة في أدوار حسابات الخدمة و الرموز المميّزة الخاصة بالويب JSON.
- يجب أن يحتوي نص الطلب على كيان
DeliveryVehicle:
مثال على أمر 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.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM