ShipmentModel

يحتوي نموذج الشحنة على مجموعة من الشحنات التي يجب تنفيذها بواسطة مجموعة من المركبات، مع تقليل التكلفة الإجمالية إلى أدنى حدّ، وهي مجموع ما يلي:

  • تكلفة توجيه المركبات (مجموع التكلفة لكل إجمالي الوقت والتكلفة لكل وقت السفر والتكلفة الثابتة على جميع المركبات)
  • عقوبات الشحن غير المُنفَّذة.
  • تكلفة المدة العالمية للشحنات
تمثيل JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
الحقول
shipments[]

object (Shipment)

مجموعة الشحنات التي يجب تنفيذها في النموذج

vehicles[]

object (Vehicle)

مجموعة من المركبات التي يمكن استخدامها لإجراء الزيارات

globalStartTime

string (Timestamp format)

وقت البدء والانتهاء العام للنموذج: لا يمكن اعتبار الوقت خارج هذا النطاق صالحًا.

يجب أن تكون الفترة الزمنية للنموذج أقل من سنة، أي يجب أن تكون الفترة الزمنية بين globalEndTime وglobalStartTime ضمن 31536000 ثانية لكل منهما.

عند استخدام حقول cost_per_*hour، قد تحتاج إلى ضبط هذه النافذة على فاصل زمني أصغر لتحسين الأداء (على سبيل المثال، في حال وضع نموذج ليوم واحد، يجب ضبط الحدود الزمنية العالمية على ذلك اليوم). في حال عدم ضبطها، يتم استخدام 00:00:00 بالتوقيت العالمي المنسق، 1 كانون الثاني (يناير) 1970 (أي الثواني: 0، النانو ثانية: 0) كقيمة تلقائية.

طابع زمني بتنسيق RFC3339 UTC "Zulu"، بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

globalEndTime

string (Timestamp format)

في حال عدم ضبط القيمة، يتم استخدام 00:00:00 بالتوقيت العالمي المنسق، 1 كانون الثاني (يناير) 1971 (أي الثواني: 31536000، النانو ثانية: 0) كقيمة تلقائية.

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

globalDurationCostPerHour

number

"المدة العالمية" للخطة الإجمالية هي الفرق بين أقرب وقت بدء فعّال وآخر وقت انتهاء فعلي لجميع المركبات. ويمكن للمستخدمين تحديد تكلفة في الساعة لهذه الكمية لمحاولة تحسين الأداء من أجل إكمال أقرب مهمة مثلاً. يجب أن تكون هذه التكلفة بالوحدة نفسها المستخدَمة في Shipment.penalty_cost.

durationDistanceMatrices[]

object (DurationDistanceMatrix)

تُحدِّد مصفوفات المدة والمسافة المستخدَمة في النموذج. إذا كان هذا الحقل فارغًا، سيتم استخدام "خرائط Google" أو المسافات الجيوديسية بدلاً من ذلك، استنادًا إلى قيمة الحقل useGeodesicDistances. وإذا لم يكن فارغًا، لا يمكن أن يكون useGeodesicDistances صحيحًا ولا يمكن أن يكون durationDistanceMatrixSrcTags أو durationDistanceMatrixDstTags فارغَين.

أمثلة على استخدام هذه الكلمة في جملة:

  • يوجد موقعان: locA وlocB.
  • مركبة واحدة تبدأ مسارها عند locA وتنتهي عند locA.
  • طلب زيارة لاستلام واحد في الموقع الجغرافي
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • هناك ثلاثة مواقع: locA وlocB وlocC.
  • مركبة واحدة تبدأ مسارها من الموقع الجغرافي "أ" وتنتهي به في الموقع الجغرافي "ب"، باستخدام مصفوفة "سريع".
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام مصفوفة "بطيء".
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام مصفوفة "fast".
  • طلب زيارة لاستلام واحد في locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

علامات تحدّد مصادر مصفوفتَي المدة والمسافة: durationDistanceMatrices(i).rows(j) تحدّد المدّات والمسافات من الزيارات التي تحمل العلامة durationDistanceMatrixSrcTags(j) إلى الزيارات الأخرى في المصفوفة i.

تتوافق العلامات مع VisitRequest.tags أو Vehicle.start_tags. يجب أن يتطابق VisitRequest أو Vehicle مع علامة واحدة بالضبط في هذا الحقل. يُرجى العِلم أنّ علامات المصدر والوجهة والمصفّحة في Vehicle قد تكون متطابقة، وبالمثل قد تكون علامات المصدر والوجهة في VisitRequest متطابقة. يجب أن تكون جميع العلامات مختلفة ولا يمكن أن تكون سلاسل فارغة. إذا لم يكن هذا الحقل فارغًا، يجب ألا يكون الحقل durationDistanceMatrices فارغًا.

durationDistanceMatrixDstTags[]

string

العلامات التي تحدّد وجهات مصفوفتَي المدة والمسافة؛ durationDistanceMatrices(i).rows(j).durations(k) (resp. تحدِّد durationDistanceMatrices(i).rows(j).meters(k)) مدة التنقّل (أو المسافة) من الزيارات التي تحمل العلامة durationDistanceMatrixSrcTags(j) إلى الزيارات التي تحمل العلامة durationDistanceMatrixDstTags(k) في المصفوفة i.

تتطابق العلامات مع VisitRequest.tags أو Vehicle.start_tags. يجب أن يتطابق VisitRequest أو Vehicle مع علامة واحدة بالضبط في هذا الحقل. يُرجى العِلم أنّ علامات المصدر والوجهة والمصفوفة في Vehicle قد تكون متطابقة، وبالمثل، قد تكون علامتا المصدر والوجهة متماثلتان.VisitRequest يجب أن تكون جميع العلامات مختلفة ولا يمكن أن تكون سلاسل فارغة. إذا لم يكن هذا الحقل فارغًا، يجب ألا يكون الحقل durationDistanceMatrices فارغًا.

transitionAttributes[]

object (TransitionAttributes)

تمت إضافة سمات النقل إلى النموذج.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

مجموعات أنواع الشحن غير المتوافقة (راجِع ShipmentTypeIncompatibility)

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

مجموعات متطلبات shipmentType (راجِع ShipmentTypeRequirement)

precedenceRules[]

object (PrecedenceRule)

مجموعة من قواعد الأسبقية التي يجب فرضها في النموذج

maxActiveVehicles

integer

تفرض قيودًا على الحد الأقصى لعدد المركبات النشطة. تكون المركبة نشطة إذا كان مسارها ينقل شحنة واحدة على الأقل. ويمكن استخدام ذلك للحد من عدد المسارات في حالة وجود سائقين أقل من المركبات في حالة وجود أسطول من المركبات غير متجانس. سيختار التحسين بعد ذلك أفضل مجموعة فرعية من المركبات لاستخدامها. يجب أن تكون موجبة بالتأكيد.

الشحن

شحن سلعة واحدة من عملية استلام إلى عملية تسليم ليتم اعتبار الشحنة منفّذة، يجب أن يزور أي مركبة فريدة أحد مواقع الاستلام الخاصة بها (وتقليل السعة الاحتياطية وفقًا لذلك)، ثم زيارة أحد مواقع التسليم في وقت لاحق (وبالتالي إعادة زيادة السعة الاحتياطية وفقًا لذلك).

تمثيل JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
الحقول
displayName

string

تشير هذه السمة إلى الاسم المعروض للشحن الذي يحدّده المستخدم. يمكن أن يصل طوله إلى 63 حرفًا وقد يستخدم أحرف UTF-8.

pickups[]

object (VisitRequest)

مجموعة بدائل الاستلام المرتبطة بالشحن في حال عدم تحديد قيمة السمة، لن تحتاج المركبة إلى زيارة الموقع الجغرافي المرتبط بعمليات التسليم.

deliveries[]

object (VisitRequest)

مجموعة من بدائل التسليم المرتبطة بالشحنة في حال عدم تحديده، لن تحتاج المركبة إلا إلى زيارة الموقع الجغرافي حيث سيتم الاستلام.

loadDemands

map (key: string, value: object (Load))

متطلبات تحميل الشحنة (مثل الوزن والحجم وعدد المنصات وما إلى ذلك) يجب أن تكون المفاتيح في الخريطة عبارة عن معرّفات تصف نوع التحميل المقابل، ومن الأفضل أن تشمل أيضًا الوحدات. على سبيل المثال: "weight_kg" و"volume_gallons" و"pallet_count" وما إلى ذلك. إذا لم يظهر مفتاح معيّن في الخريطة، يتم اعتبار الحمولة المقابلة فارغة.

allowedVehicleIndices[]

integer

مجموعة المركبات التي يمكنها تنفيذ هذه الشحنة وإذا كانت فارغة، قد تتمكّن جميع المركبات من أدائها. يتم عرض المركبات حسب فهرسها في قائمة ShipmentModel vehicles.

costsPerVehicle[]

number

تُستخدَم لتحديد التكلفة المتكبّدة عند تسليم هذه الشحنة بواسطة كل مركبة. في حال تحديدها، يجب أن تتضمّن أيًا مما يلي:

  • عدد العناصر نفسه في costsPerVehicleIndices يتوافق costsPerVehicle[i] مع المركبة costsPerVehicleIndices[i] من الطراز.
  • نفس عدد العناصر الموجودة في المركبات في النموذج. يتوافق العنصر i مع المركبة رقم i من الطراز.

ويجب أن تكون هذه التكاليف في الوحدة نفسها مثل penaltyCost وألا تكون سالبة. اترك هذا الحقل فارغًا، إذا لم يكن هناك مثل هذه التكاليف.

costsPerVehicleIndices[]

integer

مؤشرات المركبات التي تنطبق عليها السمة costsPerVehicle إذا لم يكن فارغًا، يجب أن يحتوي على عدد العناصر نفسه في costsPerVehicle. لا يمكن تحديد فهرس المركبات أكثر من مرة. إذا تم استبعاد مركبة من costsPerVehicleIndices، تكون تكلفتها صفرًا.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

تحدّد هذه السمة الحد الأقصى لوقت الانتقال المطلق مقارنةً بأقصر مسار بدءًا من استلام الطلب إلى التسليم. في حال تحديده، يجب أن يكون موجبًا، ويجب أن تحتوي الشحنة على عملية استلام وتسليم واحدة على الأقل.

على سبيل المثال، يجب ألا تكون أقصر وقت ممكن للانتقال مباشرةً من خيار الاستلام المحدّد إلى خيار التسليم المحدَّد. بعد ذلك، يفرض ضبط pickupToDeliveryAbsoluteDetourLimit ما يلي:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

في حال تحديد الحدود النسبية والمطلقة على الشحنة نفسها، يتم استخدام الحدّ الأكثر تقييدًا لكل زوج من المنتجات لاستلام الطلب أو توصيله. اعتبارًا من تشرين الأول (أكتوبر) 2017، لا تتوفّر الالتفافات إلا عندما لا تعتمد مدد التنقّل على المركبات.

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "s"، مثال: "3.5s"

pickupToDeliveryTimeLimit

string (Duration format)

تحدّد المدة القصوى للمدة من بداية الاستلام إلى بداية تسليم الشحنة. وفي حال تحديدها، يجب أن تكون قيمة غير سالبة، وأن تحتوي الشحنة على استلام الطلبات وتوصيلها على الأقل. ولا تعتمد هذه الطريقة على البدائل التي يتم اختيارها لاستلام الطلبات وتوصيلها، ولا تعتمد على سرعة المركبة. ويمكن تحديد ذلك إلى جانب قيود الانحراف القصوى: سيراعي الحلّ كلا المواصفات.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

shipmentType

string

سلسلة غير فارغة تحدّد "نوعًا" لهذه الشحنة يمكن استخدام هذه الميزة لتحديد حالات عدم التوافق أو المتطلبات بين shipment_types (راجِع shipmentTypeIncompatibilities وshipmentTypeRequirements في ShipmentModel).

يختلف عن visitTypes الذي يتم تحديده لزيارة واحدة: تتشارك جميع عمليات الاستلام/التسليم التي تنتمي إلى الشحنة نفسها shipmentType نفسه.

label

string

تُحدِّد تصنيفًا لهذه الشحنة. يتم تسجيل هذا التصنيف في الردّ في shipmentLabel من ShipmentRoute.Visit المقابل.

ignore

boolean

إذا كانت القيمة صحيحة، تخطّ هذه الشحنة، ولكن لا تطبِّق penaltyCost.

يؤدي تجاهل الشحنة إلى حدوث خطأ في عملية التحقّق عند توفّر أي shipmentTypeRequirements في النموذج.

يُسمح بتجاهل شحنة يتم تنفيذها في injectedFirstSolutionRoutes أو injectedSolutionConstraint، ويزيل الحلّ زيارات الاستلام/التسليم ذات الصلة من المسار الذي يتم تنفيذه. precedenceRules التي تشير إلى الشحنات التي تم تجاهلها

penaltyCost

number

وفي حال عدم اكتمال الشحنة، تُضاف هذه العقوبة إلى التكلفة الإجمالية للمسارات. تُعتبر الشحنة مكتملة إذا تم زيارة أحد خيارات الاستلام والتسليم. يمكن التعبير عن التكلفة بنفس الوحدة المستخدمة في جميع الحقول الأخرى المتعلقة بالتكلفة في النموذج ويجب أن تكون موجبة.

مهم: إذا لم يتم تحديد هذه العقوبة، فستُعتبر لانهائية، أي يجب أن تكتمل عملية الشحن.

pickupToDeliveryRelativeDetourLimit

number

تُحدِّد الحد الأقصى للوقت النسبي للمسار غير المباشر مقارنةً بالمسار الأقصر من نقطة الاستلام إلى نقطة التسليم. وفي حال تحديدها، يجب أن تكون قيمة غير سالبة، وأن تحتوي الشحنة على استلام الطلبات وتوصيلها على الأقل.

على سبيل المثال، لنفترض أنّ t هو أقصر وقت يستغرقه الانتقال من خيار استلام الطلب المحدّد مباشرةً إلى خيار التسليم المحدّد. بعد ذلك، يفرض الإعداد pickupToDeliveryRelativeDetourLimit ما يلي:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

في حال تحديد الحدود النسبية والمطلقة في الشحنة نفسها، يتم استخدام الحد الأكثر تقييدًا لكل زوج من عمليات الاستلام/التسليم المحتملة. اعتبارًا من تشرين الأول (أكتوبر) 2017، لا تتوفّر الالتفافات إلا عندما لا تعتمد مدد التنقّل على المركبات.

VisitRequest

طلب زيارة يمكن إجراؤها بواسطة مركبة: لها موقع جغرافي (أو موقعان، راجِع المعلومات أدناه)، وأوقات افتتاح وإغلاق ممثّلة بنوافذ زمنية، ومدة الخدمة (الوقت الذي تقضيه المركبة بعد وصولها لجمع السلع أو تسليمها).

تمثيل JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string
}
الحقول
arrivalLocation

object (LatLng)

الموقع الجغرافي الذي تصل إليه المركبة عند تنفيذ هذا VisitRequest. إذا كان نموذج الشحن يتضمّن مصفوفات المسافة حسب المدة، يجب عدم تحديد arrivalLocation.

arrivalWaypoint

object (Waypoint)

نقطة الطريق التي تصل إليها المركبة عند إجراء VisitRequest إذا كان نموذج الشحن يحتوي على مصفوفات مسافة طولية، يجب عدم تحديد السمة arrivalWaypoint.

departureLocation

object (LatLng)

الموقع الجغرافي الذي تغادر منه المركبة بعد إكمال هذا VisitRequest. يمكن حذفه إذا كان مطابقًا لـ arrivalLocation. إذا كان نموذج الشحن يحتوي على مصفوفات مسافة طولية، يجب عدم تحديد السمة departureLocation.

departureWaypoint

object (Waypoint)

تمثّل هذه السمة نقطة الطريق التي تغادر فيها المركبة بعد إكمال VisitRequest. يمكن حذفه إذا كان مطابقًا لـ arrivalWaypoint. إذا كان نموذج الشحن يحتوي على مصفوفات مسافة طولية، يجب عدم تحديد السمة departureWaypoint.

tags[]

string

تحدِّد العلامات المرفقة بطلب الزيارة. لا يُسمح باستخدام سلاسل فارغة أو مكرّرة.

timeWindows[]

object (TimeWindow)

الفترات الزمنية التي تفرض قيودًا على وقت الوصول في الزيارة يُرجى العِلم أنّه قد تغادر المركبة خارج فترة وقت الوصول، أي أنّ وقت الوصول + المدة لا يجب أن يكونا ضمن فترة زمنية. يمكن أن يؤدي ذلك إلى "وقت الانتظار" إذا وصلت المركبة قبل TimeWindow.start_time.

يعني عدم توفّر TimeWindow أنّه يمكن للمركبة إجراء هذه الزيارة في أي وقت.

يجب أن تكون الفترات الزمنية منفصلة، بمعنى ألا تتداخل أي فترة زمنية مع نافذة أخرى أو تكون بجانبها، ويجب أن تكون بترتيب متزايد.

لا يمكن ضبط costPerHourAfterSoftEndTime وsoftEndTime إلا في حال تحديد فترة زمنية واحدة.

duration

string (Duration format)

مدة الزيارة، أي الوقت الذي تقضيه بالمركبة بين الوصول والمغادرة (ستتم إضافتها إلى وقت الانتظار المحتمل، ويمكنك الاطّلاع على timeWindows)

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "s"، مثال: "3.5s"

cost

number

تكلفة خدمة طلب الزيارة هذا على مسار المركبة يمكن استخدام هذه الطريقة لدفع تكاليف مختلفة لكلّ عملية استلام أو تسليم بديلة لشحنة. يجب أن تكون هذه التكلفة بالوحدة نفسها المستخدَمة في Shipment.penalty_cost، ويجب ألا تكون سالبة.

loadDemands

map (key: string, value: object (Load))

تحميل متطلبات طلب الزيارة هذا هذا الأمر تمامًا مثل حقل Shipment.load_demands، إلا أنّه ينطبق على حقل VisitRequest هذا فقط بدلاً من تطبيق Shipment بالكامل. تتمّ إضافة الطلبات المدرَجة هنا إلى الطلبات المدرَجة في Shipment.load_demands.

visitTypes[]

string

تحدِّد أنواع الزيارة. ويمكن استخدام هذا الوقت لتحديد الوقت الإضافي المطلوب لمركبة لإكمال هذه الزيارة (راجِع Vehicle.extra_visit_duration_for_visit_type).

يمكن أن يظهر النوع مرّة واحدة فقط.

label

string

تُحدِّد تصنيفًا لهذا VisitRequest. تم الإبلاغ عن هذا التصنيف في الرد على أنّه visitLabel في ShipmentRoute.Visit المقابل.

LatLng

عنصر يمثّل زوجًا من خطوط العرض/خطوط الطول ويتم التعبير عن ذلك في صورة زوج من الزوجين لتمثيل درجات الطول والعرض والدرجات. يجب أن يتوافق هذا العنصر مع معيار WGS84 ما لم يُذكر خلاف ذلك. يجب أن تكون القيم ضمن النطاقات العادية.

تمثيل JSON
{
  "latitude": number,
  "longitude": number
}
الحقول
latitude

number

خط العرض بالدرجات يجب أن يكون ضمن النطاق [-90.0, +90.0].

longitude

number

خط الطول بالدرجات. يجب أن يكون في النطاق [ -180.0، +180.0].

النقطة الوسيطة

تُغلِّف نقطة طريق. تشير نقاط الطرق إلى مواقع وصول ومغادرة طلبات الزيارات، ومواقع بدء المركبات ونهايتها.

تمثيل JSON
{
  "sideOfRoad": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
الحقول
sideOfRoad

boolean

اختياريّ. يشير إلى أنّ الموقع الجغرافي لنقطة المرور هذه مخصّص لمنح الأولوية للمركبة للتوقف على جانب معيّن من الطريق. عند ضبط هذه القيمة، سيمرّ المسار عبر الموقع الجغرافي لكي تتمكّن المركبة من التوقف على جانب الطريق الذي يميل إليه الموقع الجغرافي من مركز الطريق. لا يعمل هذا الخيار مع وضع السفر "المشي".

حقل الربط location_type الطرق المختلفة لتمثيل الموقع الجغرافي. يمكن أن يكون location_type واحدًا فقط مما يلي:
location

object (Location)

نقطة يتم تحديدها باستخدام الإحداثيات الجغرافية، بما في ذلك عنوان اختياري.

placeId

string

رقم تعريف مكان نقطة الاهتمام المرتبط بالنقطة الوسيطة.

الموقع الجغرافي

يتم تضمين موقع جغرافي (نقطة جغرافية وعنوان اختياري).

تمثيل JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
الحقول
latLng

object (LatLng)

الإحداثيات الجغرافية لنقطة الطريق

heading

integer

عنوان البوصلة المرتبط باتجاه تدفق حركة المرور. تُستخدَم هذه القيمة لتحديد جانب الطريق الذي سيتم استخدامه لعمليات الاستلام والإرجاع. يمكن أن تتراوح قيم الاتجاه بين 0 و360، حيث يحدد الصفر اتجاهًا شماليًا تمامًا، ويحدد 90 اتجاهًا شرقيًا تمامًا، وما إلى ذلك.

TimeWindow

تفرض الفترات الزمنية قيودًا على وقت الحدث، مثل وقت الوصول في إحدى الزيارات، أو وقت بدء مركبة معيّنة وانتهائها.

تفرض حدود الفترة الزمنية الثابتة، startTime وendTime، أقرب وقت وآخر وقت للحدث، على النحو التالي: startTime <= event_time <= endTime. يُعرب عن الحد الأدنى لفترة زمنية مبدئية، softStartTime، عن تفضيله لوقوع الحدث في softStartTime أو بعده من خلال تحمُّل تكلفة متناسبة مع المدة التي تسبق softStartTime بوقت وقوع الحدث. يُعرِّف الحد الأقصى لفترة زمنية مبدئية، softEndTime، عن تفضيله لوقوع الحدث في softEndTime أو قبله من خلال تحمُّل تكلفة متناسبة مع المدة بعد softEndTime وقوع الحدث. يجب أن تقع الحدود الزمنية startTime وendTime وsoftStartTime وsoftEndTime ضمن الحدود الزمنية العالمية (يمكنك الاطّلاع على ShipmentModel.global_start_time وShipmentModel.global_end_time) ويجب الالتزام بما يلي:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
تمثيل JSON
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
الحقول
startTime

string (Timestamp format)

وقت بدء الفترة الزمنية الثابتة إذا لم يتم تحديدها، سيتم ضبطها على ShipmentModel.global_start_time.

طابع زمني بتنسيق RFC3339 UTC "Zulu"، بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z".

endTime

string (Timestamp format)

وقت انتهاء نافذة الوقت الصعب. أمّا في حال عدم تحديده، فسيتم ضبطه على ShipmentModel.global_end_time.

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z".

softStartTime

string (Timestamp format)

تمثّل هذه السمة وقت البدء البسيط للإطار الزمني.

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

softEndTime

string (Timestamp format)

وقت الانتهاء البسيط للنافذة الزمنية.

طابع زمني بتنسيق RFC3339 UTC "Zulu"، بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z".

costPerHourBeforeSoftStartTime

number

تكلفة لكل ساعة تُضاف إلى التكاليف الأخرى في النموذج إذا حدث الحدث قبل softStartTime، ويتم احتسابها على النحو التالي:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

ويجب أن تكون هذه التكلفة موجبة، ولا يمكن ضبط الحقل إلا في حال ضبط سمة softStartTime.

costPerHourAfterSoftEndTime

number

تكلفة في الساعة مضافة إلى التكاليف الأخرى في النموذج إذا وقع الحدث بعد softEndTime، ويتم احتسابها على النحو التالي:

   max(0, t.seconds - softEndTime.seconds)
                    * costPerHourAfterSoftEndTime / 3600,
t being the time of the event.

ويجب أن تكون هذه التكلفة موجبة، ولا يمكن ضبط الحقل إلا في حال ضبط السمة softEndTime.

مركبة

نماذج مركبة تواجه مشكلة في الشحن سيؤدي حلّ مشكلة الشحن إلى إنشاء مسار لهذه المركبة يبدأ من startLocation وينتهي في endLocation. المسار هو تسلسل من الزيارات (راجِع ShipmentRoute).

تمثيل JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
الحقول
displayName

string

الاسم المعروض للمركبة الذي حدّده المستخدم ويمكن أن يصل طوله إلى 63 حرفًا، ويمكن أن يستخدم أحرف UTF-8.

travelMode

enum (TravelMode)

وضع التنقّل الذي يؤثر في الطرق التي يمكن للمركبة استخدامها وسرعتها يمكنك أيضًا الاطّلاع على travelDurationMultiple.

routeModifiers

object (RouteModifiers)

يشير ذلك المصطلح إلى مجموعة من الشروط التي يجب استيفاؤها والتي تؤثر في طريقة احتساب المسارات للمركبة المحدّدة.

startLocation

object (LatLng)

الموقع الجغرافي الذي تبدأ فيه المركبة قبل استلام أي شحنات إذا لم يتم تحديده، تبدأ المركبة في أول عملية استلام. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد startLocation.

startWaypoint

object (Waypoint)

نقطة طريق تمثّل موقعًا جغرافيًا تبدأ منه المركبة قبل استلام أي شحنات. إذا لم يتم تحديد startWaypoint أو startLocation، ستبدأ المركبة عند أول عملية نقل. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد startWaypoint.

endLocation

object (LatLng)

الموقع الجغرافي الذي تنتهي فيه المركبة بعد إكمال آخر VisitRequest في حال عدم تحديد قيمة ShipmentRoute للمركبة، سيتم إيقافها فورًا عند إكمال آخر VisitRequest لها. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد السمة endLocation.

endWaypoint

object (Waypoint)

نقطة طريق تمثّل موقعًا جغرافيًا تنتهي فيه المركبة بعد إكمال آخر VisitRequest. إذا لم يتم تحديد endWaypoint أو endLocation، ستنتهي ShipmentRoute للمركبة فورًا عند إكمال آخر VisitRequest لها. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد السمة endWaypoint.

startTags[]

string

تُحدِّد العلامات المرفقة ببداية مسار المركبة.

لا يُسمح باستخدام سلاسل فارغة أو مكرّرة.

endTags[]

string

تحدّد العلامات المرفقة بنهاية مسار المركبة.

لا يُسمح بالسلاسل الفارغة أو المكرّرة.

startTimeWindows[]

object (TimeWindow)

الفترات الزمنية التي قد تغادر خلالها المركبة موقع البدء. ويجب أن تكون ضمن الحدود الزمنية العامة (راجِع حقول ShipmentModel.global_*). في حال عدم تحديدها، لا يكون هناك أي قيود باستثناء هذه الحدود الزمنية الشاملة.

يجب أن تكون الفترات الزمنية التي تنتمي إلى الحقل المتكرّر نفسه منفصلة، أي لا يمكن أن تتداخل أي فترة زمنية مع حقل آخر أو تكون مجاورة له، ويجب أن تكون مرتَّبة حسب التسلسل الزمني.

لا يمكن ضبط costPerHourAfterSoftEndTime وsoftEndTime إلا في حال تحديد فترة زمنية واحدة.

endTimeWindows[]

object (TimeWindow)

الفترات الزمنية التي قد تصل خلالها المركبة إلى موقعها النهائي ويجب أن تكون ضمن الحدود الزمنية العالمية (راجِع ShipmentModel.global_* حقل). في حال عدم تحديد هذه الحدود، ليس هناك أي قيود أخرى غير تلك الحدود الزمنية العالمية.

يجب أن تكون الفترات الزمنية التي تنتمي إلى الحقل المتكرّر نفسه منفصلة، أي لا يمكن أن تتداخل أي فترة زمنية مع حقل آخر أو تكون مجاورة له، ويجب أن تكون مرتَّبة حسب التسلسل الزمني.

لا يمكن ضبط costPerHourAfterSoftEndTime وsoftEndTime إلا إذا كانت هناك فترة زمنية واحدة.

unloadingPolicy

enum (UnloadingPolicy)

يتم فرض سياسة إلغاء التحميل على المركبة.

loadLimits

map (key: string, value: object (LoadLimit))

السعة للمركبة (مثل الوزن والحجم وعدد المنصّات النقّالة) المفاتيح في الخريطة هي معرّفات لنوع الحمولة، بما يتوافق مع مفاتيح حقل Shipment.load_demands. إذا كان مفتاح معين غير موجود في هذه الخريطة، فسيتم اعتبار السعة المقابلة غير محدودة.

costPerHour

number

تكاليف المركبات: تُجمع جميع التكاليف ويجب أن تكون بالوحدة نفسها المستخدَمة في Shipment.penalty_cost.

التكلفة لكل ساعة من مسار المركبة ويتم تطبيق هذه التكلفة على إجمالي الوقت الذي يقطعه المسار، وتشمل مدة الرحلة ومدّة الانتظار ووقت الزيارة. قد يؤدي استخدام costPerHour بدلاً من costPerTraveledHour فقط إلى زيادة وقت الاستجابة.

costPerTraveledHour

number

التكلفة لكل ساعة من مسار المركبة لا تُطبَّق هذه التكلفة إلا على مدة التنقّل التي يستغرقها المسار (أي المدة المُسجَّلة في ShipmentRoute.transitions)، وتستبعد وقت الانتظار ووقت الزيارة.

costPerKilometer

number

التكلفة لكل كيلومتر من مسار المركبة. يتم تطبيق هذه التكلفة على المسافة المبلّغ عنها في ShipmentRoute.transitions ولا تنطبق على أي مسافة تم قطعها ضمنيًا من arrivalLocation إلى departureLocation لمسافة VisitRequest واحدة.

fixedCost

number

يتم تطبيق تكلفة ثابتة إذا تم استخدام هذه المركبة لمعالجة شحنة.

usedIfRouteIsEmpty

boolean

ينطبق هذا الحقل على المركبات فقط عندما لا يوفّر مسارها أي شحنات. يشير ذلك إلى ما إذا كان يجب اعتبار المركبة مستعملة أم لا في هذه الحالة.

إذا كانت الحالة صحيحة، تنتقل المركبة من موقع بدايتها إلى موقعها النهائي حتى لو لم تكن تخدم أي شحنات، كما يتم أخذ تكاليف الوقت والمسافة الناتجة من بدايتها إلى موقعها النهائي في الاعتبار.

بخلاف ذلك، لن تتنقّل هذه المركبة من نقطة الانطلاق إلى موقعها الجغرافي النهائي، ولم يتم تحديد موعد لأي breakRule أو تأخير (ابتداءً من TransitionAttributes) في هذه المركبة. في هذه الحالة، لا يحتوي ShipmentRoute للمركبة على أي معلومات باستثناء فهرس المركبة وتصنيفها.

routeDurationLimit

object (DurationLimit)

يتم تطبيق هذا الحدّ على إجمالي مدة مسار المركبة. في رحلة OptimizeToursResponse معيّنة، تكون مدة المسار للمركبة هي الفرق بين vehicleEndTime وvehicleStartTime.

travelDurationLimit

object (DurationLimit)

الحدّ المفروض على مدة التنقّل في مسار المركبة في OptimizeToursResponse، تكون مدة انتقال المسار هي مجموع كل transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

الحدّ الذي يتم تطبيقه على إجمالي مسافة مسار المركبة في OptimizeToursResponse، تكون مسافة المسار هي مجموع كل transitions.travel_distance_meters لها.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

تحدِّد خريطة من سلاسل visitTypes إلى المدّات. المدة هي الوقت بالإضافة إلى VisitRequest.duration الذي يجب أخذه في الزيارات التي تتضمّن visitTypes المحدّد. تؤدي مدّة الزيارة الإضافية هذه إلى إضافة تكلفة في حال تحديد costPerHour. لا يمكن أن تكون المفاتيح (مثل visitTypes) سلاسل فارغة.

إذا كان طلب الزيارة عدة أنواع، ستتم إضافة مدة لكل نوع في الخريطة.

breakRule

object (BreakRule)

يصف جدول الراحة الذي سيتم فرضه على هذه المركبة. إذا كانت هذه القيمة فارغة، لن يتم ضبط أي فترات استراحة لهذه المركبة.

label

string

تُحدِّد تصنيفًا لهذه المركبة. يتم تسجيل هذا التصنيف في الردّ على أنّه vehicleLabel للعنصر ShipmentRoute المقابل.

ignore

boolean

إذا كانت القيمة صحيحة، يجب أن تكون usedIfRouteIsEmpty خطأ، وستظل هذه المركبة غير مستخدَمة.

إذا تم تنفيذ عملية شحن بواسطة مركبة تم تجاهلها في injectedFirstSolutionRoutes، يتم تخطّيها في الحلّ الأول، ولكن يمكن تنفيذها في الاستجابة.

إذا تم تسليم الشحنة من خلال مركبة تم تجاهلها في injectedSolutionConstraint وإذا كانت هناك قيود مفروضة على بقاء أي عملية شحن أو توصيل ذات صلة على المركبة (أي عدم تخفيضها إلى المستوى RELAX_ALL_AFTER_THRESHOLD)، يتم تخطّيها في الاستجابة. إذا كانت الشحنة تحتوي على حقل allowedVehicleIndices غير فارغ وتم تجاهل كل المركبات المسموح بها، سيتم تخطّيها في الردّ.

travelDurationMultiple

number

تُحدِّد هذه السمة عاملاً مضاعِفًا يمكن استخدامه لزيادة أو تقليل أوقات التنقّل لهذه المركبة. على سبيل المثال، يعني ضبط ذلك على 2.0 أن هذه المركبة أبطأ ولديها مدة تنقّل ضعف الوقت اللازم للمركبات العادية. ولا تؤثر هذه القيمة المتعددة في مُدد الزيارات. ويؤثر ذلك في التكلفة في حال تحديد costPerHour أو costPerTraveledHour. يجب أن يكون هذا النطاق في النطاق [0.001، 1000.0]. وفي حال ترك هذه السياسة بدون ضبط، تكون قيمة المركبة عادية، وتعتبر قيمة المضاعفة 1.0.

تحذير: سيتم تقريب أوقات التنقّل إلى أقرب ثانية بعد تطبيق هذا المُضاعِف ولكن قبل إجراء أي عمليات رقمية، وبالتالي قد يؤدي المُضاعِف الصغير إلى فقدان الدقة.

يُرجى الاطّلاع أيضًا على extraVisitDurationForVisitType أدناه.

TravelMode

وسائل النقل التي يمكن للمركبات استخدامها

يجب أن تكون هذه الإعدادات مجموعة فرعية من أوضاع التنقّل في واجهة برمجة التطبيقات "الطرق المفضّلة" في "منصّة خرائط Google"، راجِع: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

عمليات التعداد
TRAVEL_MODE_UNSPECIFIED وضع سفر غير محدّد، ما يعادل DRIVING
DRIVING وضع التنقّل المرتبط باتجاهات القيادة (سيارة، وما إلى ذلك)
WALKING وضع السفر المناسب لاتجاهات المشي

RouteModifiers

يشير هذا المصطلح إلى مجموعة من الشروط الاختيارية التي يجب استيفاؤها عند حساب مسارات المركبات. وهذا يشبه RouteModifiers في واجهة برمجة التطبيقات المفضَّلة في "منصة خرائط Google" . اطّلِع على: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

تمثيل JSON
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
الحقول
avoidTolls

boolean

لتحديد ما إذا كنت تريد تجنُّب الطرق ذات الرسوم في الحالات المعقولة سيتم تفضيل المسارات التي لا تحتوي على طرق برسوم عبور. لا ينطبق إلا على وسائل النقل الآلية.

avoidHighways

boolean

تحدِّد هذه السياسة ما إذا كان يجب تجنّب الطرق السريعة حيثما كان ذلك معقولاً. وسيتم منح الأولوية للمسارات التي لا تحتوي على طرق سريعة. لا يسري هذا الإعداد إلا على أوضاع السفر المزوّدة بمحرّك كهربائي.

avoidFerries

boolean

تحدِّد هذه السياسة ما إذا كان يجب تجنّب العبّارات حيثما كان ذلك معقولاً. سيتم منح الأولوية للمسارات التي لا تتضمّن السفر عبر العبّارات. لا ينطبق إلا على وسائل النقل الآلية.

avoidIndoor

boolean

اختياريّ. تحدِّد ما إذا كان يجب تجنُّب التنقّل داخل المباني حيثما أمكن. سيتم منح التفضيل للمسارات التي لا تحتوي على تنقل داخلي. ينطبق هذا الإعداد على وضع السفر WALKING فقط.

UnloadingPolicy

سياسة حول كيفية تفريغ حمولة المركبة ولا يسري هذا العرض إلا على الشحنات التي تشمل استلام الطلبات وتوصيلها.

يمكن شحن البضائع الأخرى في أي مكان على المسار بغض النظر عن unloadingPolicy.

عمليات التعداد
UNLOADING_POLICY_UNSPECIFIED إنّ سياسة التفريغ غير محدّدة، ويجب أن تتمّ عمليات التسليم بعد استلام المنتجات مباشرةً.
LAST_IN_FIRST_OUT يجب أن تتم عمليات التسليم بترتيب عكسي لعمليات الاستلام.
FIRST_IN_FIRST_OUT يجب أن تتم عمليات التسليم بالترتيب نفسه الذي تم به استلام الطلبات.

LoadLimit

تُحدِّد الحد الأقصى للحمولة التي يمكن أن تحملها المركبة، مثلاً "يمكن أن تحمل هذه الشاحنة ما يصل إلى 3500 كيلوغرام فقط". يمكنك الاطّلاع على loadLimits.

تمثيل JSON
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
الحقول
softMaxLoad

string (int64 format)

حد أدنى بسيط للتحميل. يمكنك الاطّلاع على costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

إذا تجاوز الحمولة softMaxLoad على مسار هذه المركبة، سيتم تطبيق عقوبة التكلفة التالية (مرة واحدة فقط لكل مركبة): (الحمولة - softMaxLoad) * costPerUnitAboveSoftMax. تُجمع جميع التكاليف ويجب أن تكون بالوحدة نفسها المستخدَمة في Shipment.penalty_cost.

startLoadInterval

object (Interval)

الفاصل الزمني المقبول لتحميل المركبة في بداية المسار

endLoadInterval

object (Interval)

الفاصل الزمني المقبول لتحميل المركبة في نهاية المسار

maxLoad

string (int64 format)

الحد الأقصى المسموح به لحجم التحميل.

costPerKilometer

object (LoadCost)

تكلفة نقل وحدة حمولة واحدة لأكثر من كيلومتر واحد لهذه المركبة يمكن استخدام ذلك كوكيل لاستهلاك الوقود: إذا كان الحمولة وزنًا (بالنيوتن)، فإن قيمة "الحمولة*كيلومتر" لها بُعد الطاقة.

costPerTraveledHour

object (LoadCost)

تكلفة السفر بوحدة حمولة خلال ساعة واحدة لهذه المركبة

الفاصل

فاصل كميات التحميل المقبولة

تمثيل JSON
{
  "min": string,
  "max": string
}
الحقول
min

string (int64 format)

الحد الأدنى للحمل المقبول يجب أن تكون القيمة أكبر من أو تساوي 0. في حال تحديدهما، يجب أن تكون قيمة minmax.

max

string (int64 format)

الحد الأقصى للحمل المقبول يجب أن تكون القيمة أكبر من أو تساوي 0. في حال عدم تحديد الحد الأقصى للحمل، لا تفرض هذه الرسالة أي قيود عليه. في حال تحديدهما، يجب أن تكون قيمة minmax.

LoadCost

تكلفة نقل وحدة تحميل واحدة خلال Transition بالنسبة إلى تحميل معيّن، تكون التكلفة هي مجموع جزأين:

  • min(load, loadThreshold) * costPerUnitBelowThreshold
  • max(0, load - loadThreshold) * costPerUnitAboveThreshold

وبهذه التكلفة، تفضّل الحلول تقديم الطلبات العالية أولاً، أو ما يعادل ذلك من خلال استلام الطلبات العالية في وقت لاحق. على سبيل المثال، إذا كانت هناك مركبة تحتوي

load_limit {
  key: "weight"
  value {
    costPerKilometer {
      loadThreshold: 15
      costPerUnitBelowThreshold: 2.0
      costPerUnitAboveThreshold: 10.0
    }
  }
}

ومسارها هو start,pickup,pickup,delivery,delivery,end مع الانتقالات:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

تكون التكلفة المتكبّدة لهذا LoadCost هي (cost_below * load_below * kilometers + cost_above * load_above * kms).

  • الانتقال 0: 0.0
  • الانتقال 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 2: 2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • الانتقال 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 4: 0.0

وبالتالي، فإنّ LoadCost على طول المسار هو 120.0.

ومع ذلك، إذا كان المسار هو start,pickup,delivery,pickup,delivery,end مع الانتقالات:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

فإن التكلفة التي تتكبدها LoadCost هي

  • transition 0: 0.0
  • الانتقال 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • transition 2: 0.0
  • الانتقال 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 4: 0.0

في هذه الحالة، تكون قيمة LoadCost على طول المسار 40.0.

LoadCost تزيد من تكلفة الحلول التي تتضمّن انتقالات ذات حمولة ثقيلة.

تمثيل JSON
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
الحقول
loadThreshold

string (int64 format)

مقدار الحمولة التي تتجاوزها تكلفة نقل وحدة الحمولة من costPerUnitBelowThreshold إلى costPerUnitAboveThreshold يجب أن تكون القيمة أكبر من أو تساوي 0.

costPerUnitBelowThreshold

number

تكلفة نقل وحدة من الحمل لكل وحدة تتراوح بين 0 والحدّ الأقصى يجب أن تكون قيمة محدودة، وأكبر من أو تساوي 0.

costPerUnitAboveThreshold

number

تكلفة نقل وحدة من الحمولة لكل وحدة تتجاوز الحدّ الأدنى في الحالة الخاصة التي يكون فيها الحدّ الأدنى = 0، تكون هذه تكلفة ثابتة لكل وحدة. يجب أن تكون قيمة محدودة وأكبر من أو تساوي 0.

DurationLimit

حدّ يحدّد الحدّ الأقصى لمدة مسار مركبة يمكن أن يكون صلبًا أو ناعمًا.

عند تحديد حقل حدّ أدنى، يجب تعريف كلّ من الحدّ الأقصى البسيط والتكلفة المرتبطة به معًا.

تمثيل JSON
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
الحقول
maxDuration

string (Duration format)

حد صارم يقيد المدة لتكون maxDuration على الأكثر.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

softMaxDuration

string (Duration format)

الحدّ المقبول هو حدّ لا يفرض الحدّ الأقصى لمدة الرحلة، ولكن عند مخالفته، يتسبب في تحمّل المسار تكلفة. تضاف هذه التكلفة إلى التكاليف الأخرى المحدّدة في النموذج، باستخدام الوحدة نفسها.

يجب أن تكون softMaxDuration غير سالبة في حال تحديدها. إذا تمّ أيضًا تحديد maxDuration، يجب أن تكون softMaxDuration أقل من maxDuration.

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "s"، مثال: "3.5s"

quadraticSoftMaxDuration

string (Duration format)

الحدّ المقبول هو حدّ لا يفرض الحدّ الأقصى لمدة الرحلة، ولكن عند انتهاكه، يتسبب في تحمّل المسار تكلفةً تتناسب طرديًا مع المدة. تضيف هذه التكلفة إلى التكاليف الأخرى المحددة في النموذج بالوحدة نفسها.

يجب أن تكون quadraticSoftMaxDuration غير سالبة في حال تحديدها. إذا تم تحديد maxDuration أيضًا، يجب أن يكون quadraticSoftMaxDuration أقل من maxDuration، ويجب ألا يكون الفرق أكبر من يوم واحد:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "s"، مثال: "3.5s"

costPerHourAfterSoftMax

number

تكلفة الساعة المفروضة في حال انتهاك الحدّ الأدنى الذي يبلغ softMaxDuration. وتكون التكلفة الإضافية 0 إذا كانت المدة أقل من الحد الأدنى، وإلّا تعتمد التكلفة على المدة على النحو التالي:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

يجب أن تكون التكلفة غير سالبة.

costPerSquareHourAfterQuadraticSoftMax

number

التكلفة لكل ساعة مربّعة يتم تكبدها في حال مخالفة الحدّ الأدنى الذي يبلغ quadraticSoftMaxDuration

تكون التكلفة الإضافية 0 إذا كانت المدة أقل من الحدّ الأدنى، وإلا تعتمد التكلفة على المدة على النحو التالي:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

يجب أن تكون التكلفة قيمة غير سالبة.

DistanceLimit

حد يحدد أقصى مسافة يمكن قطعها. يمكن أن يكون صلبًا أو لينًا.

إذا تم تحديد حدّ أدنى، يجب تحديد كلّ من softMaxMeters وcostPerKilometerAboveSoftMax وعدم استخدام قيم غير سالبة.

تمثيل JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
الحقول
maxMeters

string (int64 format)

حدّ ثابت يفرض ألا تتجاوز المسافة maxMeters يجب أن يكون الحد قيمة غير سالبة.

softMaxMeters

string (int64 format)

عند تطبيق حدّ أدنى للمسافة، لا يفرض الحدّ الأقصى المسموح به للمسافة المقطوعة، ولكن عند مخالفة السياسة، نفرض تكلفة إضافية مقابل تكاليف أخرى محدّدة في النموذج بالوحدة نفسها.

إذا تم تحديد softMaxMeters، يجب أن يكون أقل من maxMeters ويجب ألا يكون سالبًا.

costPerKilometerBelowSoftMax

number

التكلفة المتكبّدة لكل كيلومتر، والتي تزيد حتى softMaxMeters، باستخدام الصيغة:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

لا تتوفّر هذه التكلفة بعملة routeDistanceLimit.

costPerKilometerAboveSoftMax

number

التكلفة لكل كيلومتر يتم تكبده إذا كانت المسافة تزيد عن الحد الأقصى softMaxMeters التكلفة الإضافية هي 0 إذا كانت المسافة أقل من الحد، وبخلاف ذلك، فإن المعادلة المستخدمة لحساب التكلفة هي التالية:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

يجب أن تكون التكلفة قيمة غير سالبة.

BreakRule

قواعد لإنشاء فواصل زمنية لمركبة (مثل فواصل الغداء) الفاصل هو فترة زمنية متصلة تظل خلالها المركبة في وضع السكون في موقعها الحالي ولا يمكنها إجراء أي زيارة. قد يحدث استراحة:

  • أثناء السفر بين زيارتين (ويشمل ذلك الوقت قبل الزيارة أو بعدها مباشرة، ولكن ليس في منتصف الزيارة)، وفي هذه الحالة، يمتد وقت النقل المقابل بين الزيارات
  • أو قبل بدء تشغيل المركبة (قد لا يتم تشغيل المركبة في منتصف فترة الراحة)، وفي هذه الحالة لا يؤثر ذلك في وقت بدء تشغيل المركبة.
  • أو بعد انتهاء المركبة (كما هو الحال، مع وقت انتهاء المركبة).
تمثيل JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
الحقول
breakRequests[]

object (BreakRequest)

تسلسل الفواصل اطّلِع على رسالة "BreakRequest".

frequencyConstraints[]

object (FrequencyConstraint)

قد تنطبق عدة FrequencyConstraint. ويجب أن تستوفي جميعها معايير BreakRequest لهذا BreakRule. يمكنك الاطّلاع على FrequencyConstraint.

BreakRequest

يجب معرفة تسلسل الفواصل (أي عددها وترتيبها) التي تنطبق على كل مركبة مسبقًا. وتحدِّد قيم BreakRequest المتكرّرة هذا التسلسل بالترتيب الذي يجب أن تحدث به. قد تتداخل الفترات الزمنية (earliestStartTime / latestStartTime)، ولكن يجب أن تكون متوافقة مع الطلب (تم وضع علامة في هذا المربّع).

تمثيل JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
الحقول
earliestStartTime

string (Timestamp format)

مطلوب. الحدّ الأدنى (شاملاً) لبداية الاستراحة

يجب أن يكون طابعًا زمنيًا بالتنسيق RFC3339 UTC "Zulu"‎ وبدقة تصل إلى نانوثانية وما يصل إلى تسعة أرقام كسور. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

latestStartTime

string (Timestamp format)

مطلوب. الحدّ الأقصى (شاملاً) لبداية الاستراحة

طابع زمني بتنسيق RFC3339 UTC "Zulu"، بدقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z".

minDuration

string (Duration format)

مطلوب. تمثّل هذه السمة الحد الأدنى لمدة الفاصل. يجب أن تكون موجبة.

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "s"، مثال: "3.5s"

قيد_التردد

يمكن فرض قيود إضافية على معدّل تكرار الفواصل الزمنية المحدّدة أعلاه ومدتها، وذلك من خلال فرض حدّ أدنى لمعدّل تكرار الفواصل الزمنية، مثل "يجب أن يكون هناك فاصل زمني لمدة ساعة واحدة على الأقل كل 12 ساعة". بافتراض أنّه يمكن تفسير ذلك على أنّه "خلال أي فترة زمنية متحركة تبلغ 12 ساعة، يجب أن يكون هناك استراحة واحدة على الأقل لمدة ساعة واحدة على الأقل"، سيتم ترجمة هذا المثال إلى FrequencyConstraint التالي:

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

سيراعي توقيت الفواصل في الحلّ ومدّتها جميع هذه القيود، بالإضافة إلى الفترات الزمنية والحد الأدنى للمدد المحدَّدة في السمة BreakRequest.

في الممارسة العملية، يمكن أن ينطبق FrequencyConstraint على الفواصل غير المتتالية. على سبيل المثال، يراعي الجدول الزمني التالي مثال "ساعة واحدة كل 12 ساعة":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
تمثيل JSON
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
الحقول
minBreakDuration

string (Duration format)

مطلوب. الحد الأدنى لمدة الفاصل الإعلاني لهذا القيد غير سالب اطّلِع على وصف FrequencyConstraint.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

maxInterBreakDuration

string (Duration format)

مطلوب. أقصى مدى مسموح به لأي فاصل زمني في المسار لا يتضمن استراحة جزئية على الأقل لمدة duration >= minBreakDuration. يجب أن تكون موجبة.

المدة بالثواني مع ما يصل إلى تسعة أرقام كسور، وتنتهي بـ "s". مثال: "3.5s".

DurationDistanceMatrix

تحدّد هذه السياسة مصفوفة المدّة والمسافة من المواقع الجغرافية لبدء زيارة المركبات والمواقع الجغرافية للمركبات والمواقع الجغرافية للمركبات والزيارة.

تمثيل JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
الحقول
rows[]

object (Row)

تُستخدَم لتحديد صفوف مصفوفة المدة والمسافة. يجب أن يحتوي على عدد عناصر يساوي ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

علامة تحدّد المركبات التي تنطبق عليها مصفوفة المدة والمسافة هذه إذا كان هذا الحقل فارغًا، ينطبق ذلك على جميع المركبات، ولا يمكن أن تتوفّر سوى مصفوفة واحدة.

يجب أن تتطابق جميع مرات بدء مركبة مع مصفوفة واحدة بالضبط، أي يجب أن يتطابق حقل واحد بالضبط من حقول startTags مع vehicleStartTag في إحدى المصفوفة (وهذه المصفوفة فقط).

يجب أن يكون لكل المصفوفات vehicleStartTag مختلف.

الصف

تحدّد صفًا من مصفوفة المدة والمسافة.

تمثيل JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
الحقول
durations[]

string (Duration format)

قيم المدة لصف معيّن يجب أن يحتوي على عدد العناصر نفسه مثل ShipmentModel.duration_distance_matrix_dst_tags.

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "s"، مثال: "3.5s"

meters[]

number

قيم المسافة لصف معيّن إذا لم تكن أي تكاليف أو قيود تشير إلى المسافات في النموذج، يمكن ترك هذا الحقل فارغًا، وإلا يجب أن يحتوي على عدد عناصر يساوي durations.

TransitionAttributes

تُحدِّد سمات الانتقالات بين زيارتَين متتاليتَين على أحد المسارات. قد يتم تطبيق العديد من TransitionAttributes على عملية النقل نفسها: في هذه الحالة، تتراكم كل التكاليف الإضافية ويتم تطبيق القيد أو الحد الأكثر صرامة (مع اتّباع دلالات "AND" الطبيعية).

تمثيل JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
الحقول
srcTag

string

علامات تحدّد مجموعة التحولات (src->dst) التي تنطبق عليها هذه السمات

تتطابق زيارة مصدر أو بدء مركبة إذا كان حقل VisitRequest.tags أو Vehicle.start_tags يتضمّن srcTag أو لا يتضمّن excludedSrcTag (حسب الحقل من هذين الحقلين غير الفارغ).

excludedSrcTag

string

يمكنك الاطّلاع على srcTag. يجب ألا يكون حقل واحد فقط من srcTag وexcludedSrcTag فارغًا.

dstTag

string

تتطابق زيارة الوجهة أو نهاية المركبة إذا كان الحقل VisitRequest.tags أو Vehicle.end_tags يحتوي على dstTag أو لا يحتوي على excludedDstTag (حسب الحقل من هذين الحقلين غير الفارغ).

excludedDstTag

string

يمكنك الاطّلاع على dstTag. يجب ألا يكون حقل واحد فقط من dstTag وexcludedDstTag فارغًا.

cost

number

تُستخدَم لتحديد تكلفة تنفيذ عملية النقل هذه. ويكون هذا في نفس الوحدة مثل جميع التكاليف الأخرى في النموذج ويجب ألا يكون سالبًا. ويتم تطبيقه على جميع التكاليف الحالية الأخرى.

costPerKilometer

number

تحدّد التكلفة لكل كيلومتر المطبّقة على المسافة التي تم قطعها أثناء إجراء هذا الانتقال. ويضيف ما يصل إلى أي Vehicle.cost_per_kilometer محدّد في المركبات.

distanceLimit

object (DistanceLimit)

تحدّد هذه السمة حدًا أقصى للمسافة التي يتم قطعها أثناء تنفيذ هذا الانتقال.

اعتبارًا من 2021/6، ستتم إتاحة الحدود القصوى المسموح بها فقط.

delay

string (Duration format)

تُحدِّد هذه السمة تأخّرًا يحدث عند تنفيذ هذا الانتقال.

يحدث هذا التأخير دائمًا بعد إنهاء زيارة المصدر وقبل بدء زيارة الوجهة.

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "s"، مثال: "3.5s"

ShipmentTypeIncompatibility

تُحدِّد حالات عدم التوافق بين الشحنات استنادًا إلى shipmentType. يتم تقييد ظهور الشحنات غير المتوافقة على المسار نفسه استنادًا إلى وضع عدم التوافق.

تمثيل JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
الحقول
types[]

string

قائمة بالأنواع غير المتوافقة. هناك شحنتان تتضمّنان shipment_types مختلفة من بين الشحنات المُدرَجة غير متوافقة.

incompatibilityMode

enum (IncompatibilityMode)

الوضع الذي تم تطبيقه على عدم التوافق

IncompatibilityMode

الأوضاع التي تحدّد كيفية تقييد ظهور الشحنات غير المتوافقة على المسار نفسه

عمليات التعداد
INCOMPATIBILITY_MODE_UNSPECIFIED وضع عدم التوافق غير محدّد يجب عدم استخدام هذه القيمة مطلقًا.
NOT_PERFORMED_BY_SAME_VEHICLE في هذا الوضع، لا يمكن مطلقًا أن تشترك شحنتان من أنواع غير متوافقة في المركبة نفسها.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

في عمليتَي شحن بأنواع غير متوافقة مع وضع عدم التوافق "NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY":

  • في حال كان كلاهما لاستلام الطلبات فقط (بدون إمكانية تسليم الطرد) أو لاستلام الطلبات فقط (بدون خدمة استلام الطلبات)، لا يمكن لهما مشاركة المركبة نفسها على الإطلاق.
  • في حال تم تسليم إحدى الشحنات والأخرى للاستلام، يمكن أن تتشارك الشحنتان المركبة نفسها إذا تم تسليم الشحنة السابقة قبل استلام الشحنة الثانية.

ShipmentTypeRequirement

تُحدِّد المتطلبات بين الشحنات استنادًا إلى shipmentType. يتم تحديد تفاصيل المتطلّب حسب وضع المتطلّب.

تمثيل JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
الحقول
requiredShipmentTypeAlternatives[]

string

تتضمّن هذه السمة قائمة بأنواع الشحن البديلة المطلوبة بموجب سياسة "dependentShipmentTypes".

dependentShipmentTypes[]

string

يجب الانتقال إلى المسار نفسه للاطّلاع على كل الشحنات من النوع requiredShipmentTypeAlternatives في الحقل dependentShipmentTypes.

ملاحظة: لا يُسمَح باستخدام سلاسل المتطلبات التي تعتمد عليها shipmentType على نفسها.

requirementMode

enum (RequirementMode)

تم تطبيق الوضع على الشرط.

RequirementMode

الأوضاع التي تحدد مظهر الشحنات التابعة على المسار.

عمليات التعداد
REQUIREMENT_MODE_UNSPECIFIED وضع المتطلبات غير محدَّد. يجب عدم استخدام هذه القيمة مطلقًا.
PERFORMED_BY_SAME_VEHICLE في هذا الوضع، يجب أن تتشارك جميع الشحنات "التابعة" المركبة نفسها مع شحنة واحدة على الأقل من الشحنات "المطلوبة".
IN_SAME_VEHICLE_AT_PICKUP_TIME

في الوضع "IN_SAME_VEHICLE_AT_PICKUP_TIME"، يجب أن يكون لكل الشحنات "التابعة" شحنة واحدة "مطلوبة" على الأقل في وقت استلامها.

لذلك، يجب أن يتضمّن استلام الشحنة "التابع" أيًا مما يلي:

  • شحنة "مطلوبة" يتم تسليمها فقط على مسار الشحن بعد
  • يجب أن يتم تسليم الشحنة "المطلوبة" على مسار الرحلة قبل إتمامها، وإذا تم تسليم الشحنة "المطلوبة"، يجب أن يتم التسليم بعد استلام الشحنة "الموثوقة".
IN_SAME_VEHICLE_AT_DELIVERY_TIME كما هو الحال من قبل، باستثناء أنّ الشحنات "التابعة" يجب أن تتضمّن شحنة "مطلوب" على مركبتها في وقت تسليمها.

PrecedenceRule

قاعدة الأولوية بين حدثَين (كلّ حدث هو استلام الشحنة أو تسليمها): يجب أن يبدأ الحدث "الثاني" على الأقل بعد offsetDuration من بدء الحدث "الأول".

يمكن أن تشير عدة أولويات إلى الأحداث نفسها (أو ذات الصلة)، على سبيل المثال: "يتم استلام الطلب (ب) بعد تسليم الطلب (أ)" و"يتم استلام الطلب (ج) بعد استلام الطلب (ب)".

بالإضافة إلى ذلك، لا تسري الأولويات إلا عند تنفيذ كلتا الشحنتَين ويتم تجاهلها بخلاف ذلك.

تمثيل JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
الحقول
firstIsDelivery

boolean

يشير إلى ما إذا كان الحدث "الأول" هو عملية تسليم.

secondIsDelivery

boolean

يشير إلى ما إذا كان الحدث "الثاني" هو عملية تسليم.

offsetDuration

string (Duration format)

الفاصل الزمني بين الحدث "الأول" والحدث "الثاني". يمكن أن تكون سالبة.

مدة بالثواني تضم تسعة أرقام كسور كحد أقصى وتنتهي بـ "s"، مثال: "3.5s"

firstIndex

integer

فهرس الشحن للحدث "الأول". يجب تحديد هذا الحقل.

secondIndex

integer

فهرس الشحن للحدث "الثاني". يجب تحديد هذا الحقل.