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 לדרישות המיומנות. פרטים נוספים זמינים ב-enum Priority.

roleIds[]

string

רשימה של כל התפקידים האפשריים ברחבי כוח העבודה. לכל עובד צריך להיות לפחות תפקיד אחד שאפשר להקצות לו למשמרת. 'תפקיד' מתייחס למטלה ספציפית במהלך משמרת (כלומר, אחות רשומה, שף בכיר, מלצרית וכו'). כשעובדים מקבלים משמרת, הם מקבלים גם תפקיד ספציפי אחד.

skillIds[]

string

רשימה של כל המיומנויות האפשריות בקרב העובדים. 'מיומנות' מתייחסת להסמכות נוספות שעשויות להיות לעובד, שאינן קשורות לעבודה ספציפית שניתן להקצות (למשל: הסמכות, שפות מדוברות וכו'). הרשימה יכולה להיות ריקה. כשעובדים מקבלים משמרת, עליהם להשלים את כל המיומנויות שנדרשות לאותה משמרת.

locationIds[]

string

רשימה של כל המיקומים האפשריים לקבוצת השינויים בלוח הזמנים. הרשימה יכולה להיות ריקה. ציון מיקומים שונים יכול להיות שימושי כאשר, למשל, מנהל אחות רוצה להזמין אחים רבים ביחידות שונות של בית חולים, או, למשל, מנהל מלון רוצה להזמין עובדים למספר מלונות.

budgetRequirements[]

object (BudgetRequirement)

מפרט התקציב לבעיה בתזמון. רמת העדיפות שמוגדרת כברירת מחדל לכל אחת מהדרישות האלה היא PRIORITY_LOW. פרטים נוספים זמינים ב-enum Priority.

assignmentsHint[]

object (ShiftAssignment)

מעבירים מטלות לשימוש כפתרון טנטטיבי (שנקרא גם רמז לפתרון) לבעיית התזמון. אם המטלה סותרת שינוי שלא ניתן להקצאה או בקשה לתזמון, המערכת מתעלמת מרמזים של מטלות.

גוף התשובה

תשובה לממשק ה-API של תזמון כוח העבודה. בכל תגובה, השדה shiftAssignments יהיה ריק אם solutionStatus שהוחזר הוא NOT_SOLVED_DEADLINE_EXCEEDED או INFEASIBLE. אם הערך של solutionStatus שהוחזר הוא OPTIMAL או FEASIBLE, תוחזר משימת משמרות חוקית ב-shiftAssignments. כדי להקצות משמרת חוקית, צריכים להתקיים התנאים הבאים:

  1. כל מזהה עובד נכלל בקבוצת העובדים שצוינה בבקשה.
  2. כל מזהה תפקיד שמוקצה לעובד כלול בקבוצה של מזהי התפקידים של העובד הנתון.
  3. כל מזהה שינוי נכלל בקבוצת השינויים שמופיעה בבקשה.
  4. כל מזהה משמרת הוא לא אחד מהמזהים של העובד הנתון שלא ניתן להקצות להם.
  5. עובד אף פעם לא יוקצה לשתי משמרות חופפות.
  6. בלוח הזמנים הנתון, אף אחת מהמגבלות או הבקשות ברמת העדיפות PRIORITY_MANDATORY לא מפירה.

אם הפעולה בוצעה ללא שגיאות, גוף התגובה יכיל נתונים במבנה הבא:

ייצוג JSON
{
  "requestId": string,
  "solutionStatus": enum (SolutionStatus),
  "shiftAssignments": [
    {
      object (ShiftAssignment)
    }
  ],
  "statusMessage": string
}
שדות
requestId

string

מזהה הבקשה שאליה משויכת התשובה הזו.

solutionStatus

enum (SolutionStatus)

הסטטוס של הפתרון שהוחזר. אם הפתרון הוא לא FEASIBLE או OPTIMAL, יכול להיות ששדות אחרים ב-Proto יהיו ריקים. אם הסטטוס הוא 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. פרטים נוספים זמינים ב-enum Priority.

resourceConstraints[]

object (ResourceConstraint)

אם יש מגבלות תזמון נוספות שלא צוינו ב-schedulingConstraints, אפשר להוסיף כאן אל resourceConstraints. ResourceConstraint הוא ייצוג מופשט יותר של הגבלת המשאבים של העובד. רמת העדיפות שמוגדרת כברירת מחדל לכל אחת מהמגבלות האלה היא PRIORITY_MEDIUM. פרטים נוספים זמינים ב-enum Priority.

shiftRequests[]

object (ShiftRequest)

רשימת בקשות למשמרת עבור העובד. הבקשה יכולה להיות מצב שבו עובד יוקצה או לא יוקצה למשמרות ספציפיות. אפשר לייצג מטלות עם תזמון קבוע של העובד באמצעות ShiftRequest עם עדיפות PRIORITY_MANDATORY. מזהה משמרת יכול להופיע בבקשה אחת לתזמון לכל היותר עבור העובד הזה. רמת העדיפות שמוגדרת כברירת מחדל לכל אחת מהבקשות האלה היא PRIORITY_LOW. פרטים נוספים זמינים ב-enum 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].

עדיפות

רמת העדיפות של כל מגבלה על לוח הזמנים של העובד או הדרישות לגבי הכיסוי. למשל: SchedulingConstraint, ResourceConstraint, ShiftRequest ו-CoverageRequirement. מכיוון שיכולות להיות אילוצים מתנגשים, לא תמיד אפשר לעמוד בכל האילוץ. לכן, לכל סוג של אילוץ יש עדיפות (שנקבעת על ידי המשתמש או ברירת מחדל) כדי ליידע את הפתרון לגבי החשיבות היחסית של כל המגבלות שהוגדרו ללוח זמנים מלא.

טיפוסים בני מנייה (enum)
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)

כמות המשאבים שנעשה בהם שימוש ב-Shift. לדוגמה, אם המגבלה הזו חלה על מספר השעות המינימלי והמקסימלי שעובד עובד בשבוע מסוים, המפה הזו תכלול את השינויים שהתרחשו באותו שבוע ואת משך כל משמרת בשעות.

אובייקט שמכיל רשימה של "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

האם העובד עובד או לא.

טיפוסים בני מנייה (enum)
WORK_STATUS_UNSPECIFIED סטטוס העבודה לא ידוע.
STATUS_WORK סטטוס שמייצג עובד עבודה.
STATUS_NOT_WORK סטטוס שמייצג עובד שאינו עובד.

HourlyContract

מציינת תעריף בסיס לשעת, הפרשי שערים ומכפילי זמן מסך כדי לקבוע את התגמול לעובד. חשוב לשים לב לתקנות במקומות שונים עשויה להיות דרישה לחישוב שונה של פיצוי על תוספת זמן. הפיצוי מעריך את התגמול על תוספת זמן כדי למזער עלות proxy ששולטת בעלות הכוללת או לעמוד בתקציב (ראו 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:10], [10:10], [10:10],

ייצוג 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). לעומת זאת, הפרה של דרישת הכיסוי היא אם בשלב כלשהו בחלון הזמן (או בכל אחת מהשינויים בshiftIds), יש פחות מ-targetEmployeeCount עובדים שעובדים בחלון הזמן. יותר עובדים עובדים בהשוואה ל-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

סטטוס הפתרון (כלומר, לוח זמנים) שסופק בתגובה של פותר.

טיפוסים בני מנייה (enum)
SOLUTION_STATUS_UNSPECIFIED סטטוס התגובה לא צוין.
FEASIBLE לוח הזמנים שמוחזר זמין, אבל יכול להיות שהוא לא אופטימלי.
OPTIMAL לוח הזמנים שמוחזר הוא אופטימלי.
INFEASIBLE אין לוח זמנים מעשי למגבלות הנתונות. הפותר יכול להחזיר את הערך הזה אם לא ניתן לעמוד באחת מקבוצות המשנה של המגבלות ברמת העדיפות PRIORITY_MANDATORY.
NOT_SOLVED לא נמצא לוח זמנים.
NOT_SOLVED_DEADLINE_EXCEEDED לא נמצא לוח זמנים במסגרת מגבלת הזמן שהוגדרה.