Method: scheduling.solveShiftScheduling

تحلّ مشكلة جدولة نوبات العمل الثابتة من SolveShiftSchedulingRequest المحدّدة من خلال تعيين موظفين للنوبات عمل على زيادة الإعدادات المفضّلة لجدولة نوبات العمل لدى الموظفين وتقليل مخالفات قيود الجدولة.

طلب HTTP

POST https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling

يستخدم عنوان URL بنية تحويل الترميز gRPC.

نص الطلب

يحتوي نص الطلب على بيانات بالبنية التالية:

تمثيل JSON
{
  "requestId": string,
  "solveParameters": {
    object (SolveParameters)
  },
  "employees": [
    {
      object (Employee)
    }
  ],
  "shifts": [
    {
      object (Shift)
    }
  ],
  "coverageRequirements": [
    {
      object (CoverageRequirement)
    }
  ],
  "roleIds": [
    string
  ],
  "skillIds": [
    string
  ],
  "locationIds": [
    string
  ],
  "budgetRequirements": [
    {
      object (BudgetRequirement)
    }
  ],
  "assignmentsHint": [
    {
      object (ShiftAssignment)
    }
  ]
}
الحقول
requestId

string

معرّف المشكلة أو الطلب

solveParameters

object (SolveParameters)

يشير ذلك المصطلح إلى معلَمات للتحكّم في حل واحد للمشكلة.

employees[]

object (Employee)

ستتم جدولة جميع الموظفين المتاحين.

shifts[]

object (Shift)

جميع الورديات لتشكيل الجدول الزمني.

coverageRequirements[]

object (CoverageRequirement)

متطلبات التغطية لأفق التخطيط بالكامل. تحدد هذه عدد الموظفين الذين يجب عليهم أداء كل دور، أو امتلاك مهارة، خلال فترة زمنية أو قائمة معرفات نوبات العمل. يجب تحديد جميع متطلبات التغطية باستخدام فترات زمنية أو بقائمة من معرّفات نوبات العمل (وليس كليهما). لا يمكن أن تتداخل الفترات الزمنية (إذا تم منحها) لمتطلبات التغطية لكل موقع جغرافي محدّد. مستوى الأولوية التلقائي لكلّ من هذه القيود هو PRIORITY_MANDATORY بالنسبة إلى متطلبات الدور وPRIORITY_LOW بالنسبة إلى متطلبات المهارات. اطّلِع على تعداد "Priority" لمزيد من التفاصيل.

roleIds[]

string

قائمة بجميع الأدوار المحتملة لمجال العمل. يجب أن يكون لكل موظف دور واحد على الأقل يمكن إسناده لنوبة عمل. يشير الدور إلى تكليف وظيفة معينة أثناء الوردية (مثل ممرض مسجل، وطاهٍ تنفيذي، ونادل، وما إلى ذلك). عندما يتم تعيين موظف في وردية، يتم تكليفه أيضًا بدور واحد محدد.

skillIds[]

string

قائمة بجميع المهارات الممكنة لمجال العمل. تشير المهارة إلى أي مؤهلات إضافية قد يمتلكها الموظف ولا تتعلق بوظيفة محددة قابلة للتعيين (مثل الشهادات واللغات المنطوقة وما إلى ذلك). وقد تكون هذه القائمة فارغة. عندما يتم تعيين موظف في وردية، يجب عليه تلبية جميع المهارات اللازمة لهذا الوردية.

locationIds[]

string

قائمة بجميع المواقع الجغرافية المحتمَلة لمجموعة الورديات في الجدول الزمني وقد تكون هذه القائمة فارغة. يمكن أن يكون تحديد مواقع جغرافية مختلفة مفيدًا عندما يريد، على سبيل المثال، مدير تمريض، جدولة العديد من الممرضات عبر وحدات مختلفة في مستشفى أو، على سبيل المثال، يريد مدير فندق جدولة الموظفين عبر فنادق متعددة.

budgetRequirements[]

object (BudgetRequirement)

مواصفات الميزانية لمشكلة الجدولة. مستوى الأولوية التلقائي لكل من هذه المتطلبات هو PRIORITY_LOW. اطّلِع على تعداد "Priority" لمزيد من التفاصيل.

assignmentsHint[]

object (ShiftAssignment)

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

نص الاستجابة

رد على واجهة برمجة تطبيقات جدولة القوى العاملة بالنسبة إلى كل استجابة، سيكون shiftAssignments فارغًا إذا كان solutionStatus المعروض هو NOT_SOLVED_DEADLINE_EXCEEDED أو INFEASIBLE. إذا كانت قيمة solutionStatus المعروضة هي OPTIMAL أو FEASIBLE، يتم عرض قيمة shift صالحة في shiftAssignments. بالنسبة إلى تخصيص shift صالح، تحتفظ السمات التالية بما يلي:

  1. يتم تضمين كل معرّف موظف في مجموعة الموظفين الواردة في الطلب.
  2. يتم تضمين كل رقم تعريف دور يتم تعيينه للموظف في مجموعة معرّفات الأدوار للموظف المحدّد.
  3. ويتم تضمين كل رقم تعريف وردية في مجموعة الورديات الواردة في الطلب.
  4. إنّ كل معرّف وردية ليس واحدًا من معرّفات نوبات العمل غير القابلة للتعيين للموظف المحدّد.
  5. لن يتم تعيين الموظف أبدًا لنوبتين متداخلتين.
  6. بالنسبة إلى الجدول الزمني المحدّد، لم تتم مخالفة أي من القيود أو الطلبات ذات مستوى الأولوية PRIORITY_MANDATORY.

إذا كانت الاستجابة ناجحة، سيحتوي نص الاستجابة على بيانات بالبنية التالية:

تمثيل JSON
{
  "requestId": string,
  "solutionStatus": enum (SolutionStatus),
  "shiftAssignments": [
    {
      object (ShiftAssignment)
    }
  ],
  "statusMessage": string
}
الحقول
requestId

string

رقم تعريف الطلب الذي يرتبط به هذا الرد.

solutionStatus

enum (SolutionStatus)

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

shiftAssignments[]

object (ShiftAssignment)

قائمة بجميع المهام يحدّد كل ShiftAssignment موظفًا ونوبات العمل التي تم تكليفه بها والدور الذي تم تكليفه بأدائه في تلك الوردية.

statusMessage

string

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

SolveParameters

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

تمثيل JSON
{
  "timeLimit": string
}
الحقول
timeLimit

string (Duration format)

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

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

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

الموظف

موظف من القوى العاملة لتحديد موعده

تمثيل JSON
{
  "id": string,
  "roleIds": [
    string
  ],
  "skillIds": [
    string
  ],
  "shiftPreferences": [
    {
      object (ShiftPreference)
    }
  ],
  "schedulingConstraints": [
    {
      object (SchedulingConstraint)
    }
  ],
  "resourceConstraints": [
    {
      object (ResourceConstraint)
    }
  ],
  "shiftRequests": [
    {
      object (ShiftRequest)
    }
  ],
  "hourlyContract": {
    object (HourlyContract)
  }
}
الحقول
id

string

المعرّف الفريد الذي تم تعيينه لهذا الموظف.

roleIds[]

string

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

skillIds[]

string

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

shiftPreferences[]

object (ShiftPreference)

تغيير تفضيلات هذا الموظف. تمثل التحولات المحددة هنا نوبات يفضل الموظف أن يتم تعيينه أثناء فترة الجدولة. يجب أن تكون أرقام تعريف shift المحدّدة في shiftPreferences فريدة. ستحاول أداة الحلّ زيادة مجموع قيم ShiftPreference.preference على مستوى shiftPreferences بالكامل.

schedulingConstraints[]

object (SchedulingConstraint)

قائمة بقيود الجدولة لهذا الموظف. مستوى الأولوية التلقائي لكلّ من هذه القيود هو PRIORITY_MEDIUM. اطّلِع على تعداد "Priority" لمزيد من التفاصيل.

resourceConstraints[]

object (ResourceConstraint)

يمكن إضافة أي قيود جدولة إضافية غير محدّدة في schedulingConstraints هنا إلى resourceConstraints. ResourceConstraint هو تمثيل تجريدي للحد من الموارد لدى الموظف. مستوى الأولوية التلقائي لكلّ من هذه القيود هو PRIORITY_MEDIUM. اطّلِع على تعداد "Priority" لمزيد من التفاصيل.

shiftRequests[]

object (ShiftRequest)

قائمة بطلبات نوبات العمل للموظف يمكن أن يكون الطلب لتعيين موظف أو عدم إسناده إلى نوبات محددة. يمكن تمثيل أي عمليات جدولة ثابتة للموظف باستخدام ShiftRequest مع الأولوية PRIORITY_MANDATORY. يمكن أن يظهر معرف وردية العمل في طلب جدولة واحد على الأكثر لهذا الموظف. إنّ مستوى الأولوية التلقائي لكل طلب من هذه الطلبات هو PRIORITY_LOW. اطّلِع على تعداد "Priority" لمزيد من التفاصيل.

hourlyContract

object (HourlyContract)

عقد يحدد الأسعار المنتظمة والخاصة بساعات العمل الإضافية للموظف.

ShiftPreference

تفضيل رقمي لمعرّف وردية معيّن.

تمثيل JSON
{
  "shiftId": string,
  "preference": integer
}
الحقول
shiftId

string

رقم تعريف Shift الذي تم تحديد التفضيل له.

preference

integer

تشير قيم التفضيلات الأكبر إلى تحوّل مرغوب فيه أكثر.

SchedulingConstraint

قيد جدولة محدد لموظف معين. يتم تطبيق القيد المحدّد فقط خلال الفاصل الزمني المحدَّد [startDateTime, endDateTime).

تمثيل JSON
{
  "priority": enum (Priority),
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },

  // Union field type can be only one of the following:
  "minimumMinutes": integer,
  "maximumMinutes": integer,
  "minimumConsecutiveWorkDays": integer,
  "maximumConsecutiveWorkDays": integer,
  "minimumShiftCount": integer,
  "maximumShiftCount": integer,
  "minimumRestMinutes": integer
  // End of list of possible types for union field type.
}
الحقول
priority

enum (Priority)

مستوى الأولوية لقيد الجدولة هذا. الأولوية التلقائية لجميع قيود الجدولة هي PRIORITY_MEDIUM.

startDateTime

object (DateTime)

وقت البدء الذي ينطبق فيه قيد الجدولة هذا (شامل).

endDateTime

object (DateTime)

وقت الانتهاء الذي ينطبق فيه قيد الجدولة هذا (حصري).

حقل الاتحاد type نوع القيد الذي يتم تحديده. لا يتم تطبيق كل قيد إلا خلال الفترة الزمنية المحدّدة أعلاه. يمكن أن يكون الحقل "type" واحدًا فقط مما يلي:
minimumMinutes

integer

الحد الأدنى لعدد الدقائق التي يمكن أن يعمل بها الموظف. إذا تم تعيين الموظف لنوبة عمل تتداخل (كليًا أو جزئيًا) مع الفترة الزمنية، يتم تضمين عدد الدقائق التي يتداخل فيها الوردية مع الفترة الزمنية.

maximumMinutes

integer

الحد الأقصى لعدد الدقائق التي يمكن للموظف العمل فيها خلال الفترة الزمنية. إذا تم تعيين الموظف لنوبة عمل تتداخل (كليًا أو جزئيًا) مع الفترة الزمنية، يتم تضمين عدد الدقائق التي يتداخل فيها الوردية مع الفترة الزمنية.

minimumConsecutiveWorkDays

integer

الحد الأدنى لعدد الأيام المتتالية التي يمكن للموظف العمل فيها. يعمل الموظف في يوم محدد إذا تم تكليفه بمناوبة تبدأ خلال ذلك اليوم. يتم تضمين أي مناوبة يتم تعيين الموظف لها ويبدأ في الفترة الزمنية في هذا العدد.

maximumConsecutiveWorkDays

integer

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

minimumShiftCount

integer

الحد الأدنى لعدد المناوبات التي يمكن للموظف العمل فيها. يتم تضمين أي مناوبة يتم تعيينها للموظف تتداخل تمامًا مع النافذة الزمنية في هذا العدد.

maximumShiftCount

integer

الحد الأقصى لعدد المناوبات التي يمكن للموظف العمل فيها. يتم تضمين أي مناوبة يتم تعيينها للموظف تتداخل تمامًا مع النافذة الزمنية في هذا العدد.

minimumRestMinutes

integer

الحد الأدنى لعدد الدقائق التي يجب أن يستريح فيها الموظف بعد نهاية نوبة عمل قبل تكليفه بمناوبة أخرى. ينطبق هذا القيد على كل نوبات عمل تم تضمينها بالكامل في [startDateTime وendDateTime].

Priority

مستوى الأولوية لأي قيد على جدول الموظف أو متطلبات التغطية. ويشمل ذلك SchedulingConstraint وResourceConstraint وShiftRequest وCoverageRequirement. نظرًا لأنه قد تكون هناك قيود متضاربة، فلا يمكن دائمًا تلبية جميع القيود. من هذا المنطلق، يكون لكل نوع من القيود أولوية (تمنحها المستخدم أو افتراضية) تخبر أداة الحلّ بالأهمية النسبية لجميع القيود الموضوعة لجدول زمني كامل.

عمليات التعداد
PRIORITY_UNSPECIFIED مستوى أولوية غير معروف.
PRIORITY_LOW المستوى الأدنى من الأولوية. القيود ذات هذه الأولوية أقل أهمية من القيود الأخرى. وهي أول من يتم اعتبارها مخالفة إذا تعذّر التوصل إلى حل ممكن.
PRIORITY_MEDIUM مستوى الأولوية متوسط. القيود ذات هذه الأولوية أكثر أهمية من القيود ذات الأولوية PRIORITY_LOW ولكنّها أقل أهمية من القيود ذات الأولوية PRIORITY_HIGH. إذا تعذّر العثور على حل عملي بعد تخفيف جميع القيود باستخدام أولوية PRIORITY_LOW، سيتم اعتبار أنّ القيود ذات أولوية PRIORITY_MEDIUM هي تلك القيود التالية للانتهاك.
PRIORITY_HIGH أعلى مستوى أولوية. القيود الأهم هي القيود ذات مستوى الأولوية هذا. وهي الأخيرة التي يتم أخذها في الاعتبار للانتهاك إذا تعذر العثور على حل عملي بعد تخفيف قيود مستويات الأولوية المنخفضة.
PRIORITY_MANDATORY يشير ذلك المصطلح إلى مستوى أولوية يمثّل شيئًا لا يمكن للأداة حلّ المشكلة محله. إذا كانت أداة الحلّ تعرض الخطأ SolutionStatus.INFEASIBLE، قد يرجع ذلك إلى عدد كبير جدًا من قيود PRIORITY_MANDATORY.

ResourceConstraint

قيد عام يحد من كمية "مورد" معين يستخدمه الموظف. هذا إصدار مجرد من SchedulingConstraint الأكثر تحديدًا ومرونة أكبر للمستخدم. يمكن استخدام هذه الرسالة بدلاً من ذلك لتحديد العديد من قيود الجدولة التي لا يمكن تحديدها في SchedulingConstraint.type.

تمثيل JSON
{
  "priority": enum (Priority),
  "resourceUsages": {
    string: number,
    ...
  },
  "minimumResourceUsage": number,
  "maximumResourceUsage": number
}
الحقول
priority

enum (Priority)

مستوى الأولوية لقيد الموارد هذا. الأولوية التلقائية لجميع قيود الموارد هي PRIORITY_MEDIUM.

resourceUsages

map (key: string, value: number)

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

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

minimumResourceUsage

number

الحد الأدنى لاستخدام الموارد للوفاء بقيد الموارد.

maximumResourceUsage

number

يتم استيفاء الحد الأقصى لاستخدام الموارد بسبب قيد على الموارد.

ShiftRequest

طلب الموظف لتعيينه أو عدم إسناده إلى نوبات محددة.

تمثيل JSON
{
  "priority": enum (Priority),
  "shiftIds": [
    string
  ],
  "type": enum (WorkStatus)
}
الحقول
priority

enum (Priority)

مستوى الأولوية لطلب الجدولة هذا. الأولوية التلقائية لجميع طلبات الجدولة هي PRIORITY_LOW.

shiftIds[]

string

معرّفات نوبات العمل لطلب الجدولة.

type

enum (WorkStatus)

نوع الطلب، مثلاً ما إذا تم تعيين الطلب لمجموعة الورديات أم لا.

WorkStatus

ما إذا كان الموظف يعمل أم لا.

عمليات التعداد
WORK_STATUS_UNSPECIFIED حالة العمل غير معروفة.
STATUS_WORK الحالة التي تمثل موظفًا يعمل.
STATUS_NOT_WORK الحالة التي تمثل موظفًا لا يعمل.

HourlyContract

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

تمثيل JSON
{
  "baseHourlyRate": number,
  "hourlyRateShiftDifferentials": {
    string: number,
    ...
  },
  "overtimePeriods": [
    {
      object (OvertimePeriod)
    }
  ]
}
الحقول
baseHourlyRate

number

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

hourlyRateShiftDifferentials

map (key: string, value: number)

الفرق في السعر بالساعة، يُدفَع بالإضافة إلى "baseHourlyRate" على سبيل المثال، إذا كان السعر الأساسي في الساعة هو 30 دولار أمريكي في الساعة، يتم دفع "shift_1" بسعر 40 دولار أمريكي في الساعة، ويتم دفع "shift_2" بسعر 45 دولار أمريكي في الساعة، يكون تمثيل أولي كما يلي: baseHourlyRate: 30 hourlyRateShiftDifferentials {key: "shift_1" value: 10} hourlyRateShiftDifferentials {key: "shift_2" value: 15}.

عنصر يحتوي على قائمة من أزواج "key": value. مثال: { "name": "wrench", "mass": "1.3kg", "count": "3" }

overtimePeriods[]

object (OvertimePeriod)

قائمة بجميع الفترات التي يجب حساب الوقت الإضافي خلالها. يجب ألا تتداخل هذه الفترات.

OvertimePeriod

فترة ثابتة ومتكررة بانتظام (عادةً 168 ساعة أو سبع فترات متتالية لمدة 24 ساعة) يتم استخدامها لتحديد مبلغ تعويض العمل الإضافي. لكل فترة مضاعف وقت إضافي (على سبيل المثال، 1.5) بالنسبة إلى baseHourlyRate والحدّ الأقصى لعدد ساعات العمل التي تُعتبر عملاً منتظمًا (غير عملي) يتم احتساب أي عملية تبديل تتداخل مع الفترة الزمنية startDateTime (شاملة) وendDateTime (حصرية) ضمن إجمالي عدد ساعات العمل خلال الفترة الزمنية. وإذا كان التداخل جزئيًا، سيتم احتساب الساعات المتداخلة فقط.

تمثيل JSON
{
  "overtimeMultiplier": number,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "maximumRegularHours": number
}
الحقول
overtimeMultiplier

number

المُضاعِف لحساب معدّل الوقت الإضافي بالساعة (يجب أن يكون أكبر من 1.0 أو يساويه) يتم عادةً احتساب السعر في الساعة الإضافية على أنّه baseHourlyRate * overtimeMultiplier. في حال تقديم أسعار متعدّدة من خلال "hourlyRateShiftDifferentials"، ستقر أداة الحلّ سعر العمل الإضافي بالساعة بمتوسط بسيط للأسعار السارية خلال الفترة الزمنية الإضافية. ملاحظة: قد تتطلّب اللوائح التنظيمية في أماكن مختلفة احتساب أجر العمل الإضافي بطريقة مختلفة. وتقرّب أداة الحلّ تعويض العمل الإضافي لتقليل التكلفة الإجمالية أو الوفاء بالميزانية، ولكنها ليست مخصَّصة لحساب الرواتب.

startDateTime

object (DateTime)

وقت البدء للفترة الإضافية. في حال تداخلت وردية هذا الوقت، يتم احتساب ساعات هذا التحوّل اعتبارًا من startDateTime.

endDateTime

object (DateTime)

وقت انتهاء الفترة الزمنية الإضافية إذا تداخلت وردية بيانات هذه المرة، يتم احتساب ساعات هذه الوردية بما يصل إلى endDateTime.

maximumRegularHours

number

الحد الأقصى لعدد ساعات العمل التي يتم دفعها مقابل معدل منتظم (وليس ساعات عمل إضافية). يجب أن تكون هذه الكمية موجبة.

Shift

تحدد وردية العمل فترة زمنية ثابتة يمكن للموظفين من خلالها العمل.

تمثيل JSON
{
  "id": string,
  "locationId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "breakRules": [
    {
      object (BreakRule)
    }
  ]
}
الحقول
id

string

المعرّف الفريد الذي تم تعيينه لهذا التحوّل.

locationId

string

رقم تعريف الموقع الجغرافي الذي يتم فيه عمل هذا التغيير. يمكن أن يكون هذا الحقل فارغًا.

startDateTime

object (DateTime)

وقت بدء التبديل (شامل).

endDateTime

object (DateTime)

وقت انتهاء وردية العمل (بشكل حصري). في الوقت الحالي، لا تتيح أداة الحلّ سوى نوبات العمل التي تقلّ مدتها عن 24 ساعة.

breakRules[]

object (BreakRule)

قائمة بقواعد الفواصل التي تحدث أثناء وردية. يتم تخصيص استراحة للموظفين الذين يجرون هذا الوردية استراحة لكل break_rule، بحيث لا يغطون خلالها الطلب على الدور الذي يؤدونه. يجب تضمين كل فترة زمنية BreakRule بشكل كامل خلال الفترة الزمنية لهذا الوردية.

BreakRule

يشير ذلك المصطلح إلى قاعدة تحدِّد متى يمكن أن يبدأ أحد الفواصل الإعلانية خلال وردية واحدة ومدتها. يتم تحديد قائمة بكل الفواصل المحتملة التي يمكن اعتبارها بزيادات ruleIncrementMinutes. على سبيل المثال، إذا كانت قاعدة الفاصل تصوّر فاصلاً مدته 30 دقيقة ويمكن أن تبدأ بين 10:00 و11:00، وكانت زيادة القاعدة 20 دقيقة، تكون قائمة الفواصل الإعلانية التي يتم اعتبارها هي: [10:00، 10:30]، [10:20، 10:50]، [10:10، 0:31،

تمثيل JSON
{
  "earliestStartTime": {
    object (DateTime)
  },
  "latestStartTime": {
    object (DateTime)
  },
  "durationMinutes": integer,
  "ruleIncrementMinutes": integer
}
الحقول
earliestStartTime

object (DateTime)

أقرب وقت لبدء الفاصل (شامل). يمكن ضبط hours وminutes فقط.

latestStartTime

object (DateTime)

تمثّل هذه السمة آخر وقت بدء للفاصل الإعلاني (شامل). يمكن ضبط hours وminutes فقط.

durationMinutes

integer

مدة الفاصل بالدقائق.

ruleIncrementMinutes

integer

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

CoverageRequirement

تحدّد متطلبات التغطية عدد الموظفين المطلوب لمجموعة من الأدوار و/أو المهارات خلال فترة زمنية معيّنة وفي موقع جغرافي معيّن. لا يمكن أن تتداخل الفواصل الزمنية للتاريخ والوقت في موقع جغرافي معين. بدلاً من ذلك، يمكن تقديم قائمة بمعرّفات نوبات العمل بدلاً من فترة زمنية وموقع جغرافي. يمكن فقط للموظفين الذين يمكن تعيينهم لدور محدد (أو يمتلكون مهارة معينة) تلبية هذا المطلب.

بالنسبة إلى دور و/أو مهارة معيّنة، يتم استيفاء متطلبات التغطية عندما يعمل عدد لا يقل عن targetEmployeeCount من الموظفين في كل لحظة خلال الفترة الزمنية (أو لكل مناوبة عمل في shiftIds). وفي المقابل، يتم مخالفة متطلبات التغطية في حال كان عدد الموظفين أقل من targetEmployeeCount خلال الفترة الزمنية المحددة (أو عند أي من الورديات في shiftIds). لا يزال عدد الموظفين العاملين أكثر من targetEmployeeCount يستوفي المتطلبات، ولكن يتم تقليل عدد الموظفين الزائدين بسبب أداة الحلّ.

تمثيل JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "locationId": string,
  "shiftIds": [
    string
  ],
  "roleRequirements": [
    {
      object (RoleRequirement)
    }
  ],
  "skillRequirements": [
    {
      object (SkillRequirement)
    }
  ]
}
الحقول
startDateTime

object (DateTime)

وقت بدء متطلبات التغطية (شاملةً). وفي حال ضبط السياسة، يجب أن يكون الحقل shiftIds فارغًا.

endDateTime

object (DateTime)

وقت انتهاء متطلبات التغطية (حصري). وفي حال ضبط السياسة، يجب أن يكون الحقل shiftIds فارغًا.

locationId

string

الموقع الذي يوجد فيه الموظفين. shiftIds ليس فارغًا، يجب أن يكون هذا الحقل فارغًا.

shiftIds[]

string

في حال ضبطها، يتم تطبيق متطلبات الدور والمهارة بشكل فردي على كل رقم تعريف وردية في هذه القائمة. إذا كانت معرّفات shift غير فارغة، يجب أن تكون startDateTime وendDateTime وlocationId فارغة.

roleRequirements[]

object (RoleRequirement)

العدد المطلوب من الموظفين المطلوب تكليفهم بالأدوار المحدّدة خلال الفترة الزمنية. يجب تقديم role_requirement واحد على الأكثر لكل رقم تعريف دور. إنّ مستوى الأولوية التلقائي لكل من المتطلبات هو PRIORITY_MANDATORY. يتم انتهاك هذه القيود إذا تم تعيين أقل من targetEmployeeCount من الموظفين للأدوار المحدّدة في أي وقت خلال الفترة الزمنية.

skillRequirements[]

object (SkillRequirement)

العدد المطلوب من الموظفين الذين يتمتعون بالمهارات المحددة التي تم تكليفهم بها خلال الفترة الزمنية المحددة. يجب تقديم سمة skill_requirement واحدة على الأكثر لكل رقم تعريف مهارة. إنّ مستوى الأولوية التلقائي لكل من المتطلبات هو PRIORITY_LOW. يتم انتهاك هذه القيود إذا كان عدد الموظفين أقل من targetEmployeeCount من الموظفين يمتلكون المهارات المحدّدة في أي وقت خلال الفترة الزمنية.

RoleRequirement

العدد المطلوب من الموظفين المطلوب إسناد الدور إليه خلال الفترة الزمنية.

تمثيل JSON
{
  "roleId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
الحقول
roleId

string

رقم تعريف الدور للمتطلبات.

targetEmployeeCount

integer

العدد المطلوب من الموظفين المكلفين بالدور خلال الفترة الزمنية.

priority

enum (Priority)

مستوى الأولوية لقيد المتطلبات هذا. الأولوية التلقائية لجميع قيود الموارد هي PRIORITY_MANDATORY.

SkillRequirement

العدد المطلوب من الموظفين الذين يعملون خلال الفترة الزمنية ويتمتعون بالمهارة المحددة.

تمثيل JSON
{
  "skillId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
الحقول
skillId

string

رقم تعريف المهارة للمتطلبات.

targetEmployeeCount

integer

العدد المطلوب من الموظفين ذوي المهارة المحددة الذين يعملون خلال الفترة الزمنية.

priority

enum (Priority)

مستوى الأولوية لقيد المتطلبات هذا. الأولوية التلقائية لجميع قيود الموارد هي PRIORITY_LOW.

BudgetRequirement

متطلبات الميزانية لفترة زمنية معيّنة

تمثيل JSON
{
  "totalBudget": number,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "priority": enum (Priority)
}
الحقول
totalBudget

number

إجمالي الميزانية للفاصل الزمني المحدَّد. يجب منح ميزانية إجمالية إذا كانت الأولوية هي PRIORITY_MANDATORY.

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

startDateTime

object (DateTime)

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

endDateTime

object (DateTime)

وقت الانتهاء عند تطبيق هذه الميزانية. وإذا لم يتم تحديد وقت الانتهاء، يتم ضبطه ليكون آخر وقت انتهاء لجميع الورديات المحدّدة.

priority

enum (Priority)

مستوى الأولوية لاستيفاء متطلبات الميزانية خلال الفترة الزمنية المحدّدة. الأولوية التلقائية هي PRIORITY_LOW. وفي حال ضبط الأولوية على PRIORITY_MANDATORY، يجب ضبط totalBudget.

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

ShiftAssignment

موظف لتغيير إسناد الدور.

تمثيل JSON
{
  "employeeId": string,
  "shiftId": string,
  "roleId": string,
  "breaks": [
    {
      object (Break)
    }
  ]
}
الحقول
employeeId

string

رقم تعريف الموظف الذي يتم تعيينه.

shiftId

string

تم تعيين رقم تعريف نوبات العمل للموظف.

roleId

string

معرّف الدور الذي تم تعيين الموظف له في الوردية.

breaks[]

object (Break)

قائمة الفواصل الإعلانية لمهمة الوردية هذه.

استراحة

الفترة الزمنية التي يقاطع فيها موظف عمله أثناء المناوبة.

تمثيل JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "durationMinutes": integer
}
الحقول
startDateTime

object (DateTime)

تمثّل هذه السمة وقت بدء الاستراحة.

durationMinutes

integer

مدة الفاصل بالدقائق.

SolutionStatus

حالة الحلّ (أيّ جدول زمني) التي يتم تقديمها كردّ على أداة الحلّ.

عمليات التعداد
SOLUTION_STATUS_UNSPECIFIED حالة الردّ غير محدّدة.
FEASIBLE الجدول الزمني الذي يتم إرجاعه قابل للتنفيذ، لكنه قد لا يكون هو الأمثل.
OPTIMAL الجدول الزمني الذي يتم إرجاعه هو الأمثل.
INFEASIBLE لا يوجد جدول زمني ممكن للقيود المحددة. قد تعرض أداة الحلّ هذه القيمة إذا تعذّر استيفاء أي مجموعة فرعية من القيود ذات مستوى الأولوية PRIORITY_MANDATORY.
NOT_SOLVED لم يتم العثور على أي جدول زمني.
NOT_SOLVED_DEADLINE_EXCEEDED لم يتم العثور على أي جدول زمني خلال الفترة الزمنية المحدّدة.