يفترض هذا المستند معرفة ما يلي:
- إنشاء مهام الشحن
- مقدمة حول المهام المُجدوَلة، والتي تغطي العلاقة بين المهام والمحطات والمركبات بالتفصيل
في سيناريو توصيل حقيقي، تسند المؤسسات مهام توصيل الشحنات إلى السائقين الذين يستخدمون مركبة لتوصيلها إلى المستلم في موقع جغرافي محدّد، مثل منزل أو غرفة توصيل في مجمّع مبانٍ. يمكنك تصميم هذا النموذج في Fleet Engine من خلال إنشاء مهمة وإصدار طلب تعديل لمركبة التوصيل، ما يؤدي إلى تعديل كيان المركبة من خلال قائمة بالمحطات التي يجب الانتقال إليها. يمكنك تعيين قائمة مهام لكل محطة لإكمالها في المحطة.
يمكنك تعديل مهام المركبة في أي وقت، ولكن عادةً ما يتم ذلك للأغراض التالية:
- جدولة المهام التي يجب أن تنفّذها المركبة يمكنك إجراء ذلك من خلال طلب تعديل يضيف محطة توقّف جديدة إلى المركبة، أو من خلال طلب تعديل يضيف مهمة جديدة إلى محطة توقّف حالية.
- تعديل ترتيب المهام الحالية المرتبطة بمحطة توقّف معيّنة للمركبة
- تغيير الموقع الجغرافي لإكمال المهمة تحدّد Fleet Engine تلقائيًا الموقع الجغرافي لإكمال المهمة على أنّه الموقع الجغرافي نفسه الذي توقّفت فيه المركبة والمرتبط بالمهمة. يمكنك تحديد مواقع جغرافية معيّنة للمهام الفردية إذا أردت ذلك. على سبيل المثال، قد تتوقف مركبة عند مجمّع كبير لتسليم عدد من الطرود، ويتم تخصيص غرفة تسليم بريد محددة لكل طرد.
- أغلِق أي مهام تم تعيينها سابقًا لاستبعادها من الترتيب المعدَّل. لمزيد من التفاصيل، يمكنك الاطّلاع على إنهاء المهام.
جدولة مهام التسليم أو تغييرها
يمكنك جدولة المهام المخصّصة لمركبة أو تغييرها من بيئة خادم أو باستخدام Driver SDK إذا أتحت للسائق إمكانية إدارة المهام باستخدام جهاز موثوق به. استخدِم طريقة واحدة فقط لتجنُّب حالات التزامن والحفاظ على مصدر واحد للحقيقة.
لتغيير شحنة من مركبة إلى أخرى، عليك إغلاق المهمة الأصلية وإعادة إنشائها قبل تعيينها إلى مركبة مختلفة. إذا عدّلت مركبة توصيل لتضمين مهمة سبق أن تم تعيينها لمركبة أخرى، سيظهر لك خطأ.
الحقول المطلوبة لتعديل المهام
يوضّح هذا القسم الحقول المطلوبة التي يجب ضبطها عند تعديل مهمة لمركبة. لم يتم توفير أي حقول اختيارية. يتجاهل Fleet Engine جميع الحقول الأخرى في العنصر عند إجراء التعديل.
حقل مطلوب | القيمة |
---|---|
remainingVehicleJourneySegments |
تمثّل هذه السمة قائمة بأجزاء رحلة المستخدم للمهام بالترتيب المطلوب تنفيذها. يتم تنفيذ المهمة الأولى في القائمة أولاً. |
remainingVehicleJourneySegments[i].stop |
تمثّل هذه السمة نقطة التوقف للمهمة i في القائمة. |
remainingVehicleJourneySegments[i].stop.plannedLocation |
تمثّل هذه السمة الموقع الجغرافي المخطّط للتوقف. |
remainingVehicleJourneySegments[i].stop.tasks |
قائمة بالمهام المطلوب تنفيذها عند توقّف المركبة هذا |
remainingVehicleJourneySegments[i].stop.state |
State.NEW |
مثال على إسناد المهام
توضّح الأمثلة التالية كيفية استخدام مكتبة Java gRPC وطلب HTTP REST إلى UpdateDeliveryVehicle
لإضافة مهمتَين جديدتَين للمركبة.
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> هو معرّف فريد لمركبة توصيل في أسطولك تنوي تعديل ترتيب المهام فيها. وهو المعرّف الذي حدّدته عند إنشاء المركبة.
يجب أن يحتوي عنوان الطلب على الحقل 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.7749,
"longitude": -122.084061
}
},
"tasks": [
{
"taskId": "${TASK1_ID}"
}
]
}
},
{
"stop": {
"state": "NEW",
"plannedLocation": {
"point": {
"latitude": 37.3382,
"longitude": 121.8863
}
},
"tasks": [
{
"taskId": "${TASK2_ID}"
}
]
}
}
]
}
EOM