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)

تبديل الإعدادات المفضّلة لهذا الموظف تمثل الورديات المحددة هنا الورديات التي يفضل الموظف أن يتم التكليف بها خلال مهلة الجدولة. يجب أن تكون أرقام تعريف الورديات المحدّدة في 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

أرقام تعريف Shift لطلب الجدولة.

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 دولارًا أمريكيًا في الساعة، وبالتالي يكون تمثيل Proto هو: 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.30]، [10:10، 11].

تمثيل 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

وفي حال ضبطها، سيتم تطبيق متطلبات الدور والمهارة بشكلٍ فردي على كل رقم تعريف نوبة عمل في هذه القائمة. إذا كانت قيم shiftId غير فارغة، يجب أن تكون 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 لم يتم العثور على أي جدول زمني خلال الحد الزمني المحدد.