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