يفترض هذا المستند الإلمام بما يلي:
- إنشاء مهام الشحن
- مقدمة عن المهام المجدولة، التي تتناول العلاقة بين المهام ومحطات التوقف والمركبات بالتفصيل.
كما هو موضَّح في المهام المُجدوَلة في أساسيات 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> هو معرّف فريد للمهمة.
- يجب أن يحتوي عنوان الطلب على الحقل Authorize (تفويض) مع القيمة الحامل <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 جميع الحقول الأخرى في الكيان الخاص بالإشعار.
الحقل | القيمة |
---|---|
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> هو معرّف فريد للمهمة.
- يجب أن يحتوي عنوان الطلب على الحقل Authorize (تفويض) مع القيمة الحامل <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> هو معرّف فريد للمهمة.
- يجب أن يحتوي عنوان الطلب على الحقل Authorize (تفويض) مع القيمة الحامل <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