Method: scheduling.solveShiftScheduling

將員工指派為輪值班,以解決指定SolveShiftSchedulingRequest的固定班表問題排程偏好設定最大化,並盡量避免違反排程限制的情況。

HTTP 要求

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

這個網址使用 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

問題或請求 ID。

solveParameters

object (SolveParameters)

用於控制問題單解的參數。

employees[]

object (Employee)

所有可預約的員工均可安排時間。

shifts[]

object (Shift)

所有轉變,都組成時間表。

coverageRequirements[]

object (CoverageRequirement)

在整個規劃期間的涵蓋範圍需求。這指明在時間範圍或輪班 ID 清單上,各職位或具備技能的員工人數。所有保固要求都必須以時間範圍或班表 ID 清單指定 (但不能同時指定兩者)。如果提供,各地區承載規定的時間範圍 (如有指定) 不得重疊。以上各項限制的預設優先順序等級為 PRIORITY_MANDATORY,適用於角色要求,技能要求的預設優先順序為 PRIORITY_LOW。詳情請參閱 Priority 列舉。

roleIds[]

string

工作團隊的所有可能角色清單。每位員工都必須至少指派一個角色,才能進行輪班。角色指的是換班期間的具體指派工作 (例如登記的護士、高管主廚、服務人員等)。員工獲派職務時,也會同時獲派單一特定角色。

skillIds[]

string

列出所有職員可能具備的技能。「技能」是指員工與特定指派工作無關的額外資格認證 (例如認證、口說語言等)。這份清單可以留空。獲派職務的員工必須充分滿足該輪班所需的所有技能。

locationIds[]

string

列出時間表中這些排班的所有可能地點。這份清單可以留空。指定不同地點是很實用的做法。舉例來說,護理師經理想為醫院的不同單位安排多名護理師,或是想為多間飯店安排員工預約時,再指定不同地點。

budgetRequirements[]

object (BudgetRequirement)

因應時段設定問題的預算規格。這些要求的預設優先順序等級為 PRIORITY_LOW。詳情請參閱 Priority 列舉。

assignmentsHint[]

object (ShiftAssignment)

將指派作業移做時間安排問題 (又稱為解決方案提示)。如果作業與無法指派的位班或排程要求相牴觸,系統會忽略作業提示。

回應主體

對工作團隊排程 API 的回應。對於每個回應,如果傳回的 solutionStatusNOT_SOLVED_DEADLINE_EXCEEDEDINFEASIBLEshiftAssignments 就會留空。如果傳回的 solutionStatusOPTIMALFEASIBLE,系統會在 shiftAssignments 中傳回有效的位移指派值。下列屬性對於有效的位班指派會保留:

  1. 每個員工 ID 都會包含在要求中所指定的員工名單中。
  2. 指派給員工的每個角色 ID 都位於指定員工的角色 ID 中。
  3. 每個平移 ID 都包含在要求中提供的轉變組合中。
  4. 每個輪班 ID 不是指定員工的不可指派的輪班 ID。
  5. 員工永遠不會被指派到兩個重疊的輪班。
  6. 根據指定的排程,系統未違反任何優先等級為 PRIORITY_MANDATORY 的限製或要求。

如果成功,回應主體會含有以下結構的資料:

JSON 表示法
{
  "requestId": string,
  "solutionStatus": enum (SolutionStatus),
  "shiftAssignments": [
    {
      object (ShiftAssignment)
    }
  ],
  "statusMessage": string
}
欄位
requestId

string

與此回應相關聯的要求 ID。

solutionStatus

enum (SolutionStatus)

傳回的解決方案狀態。如果解決方案不是「FEASIBLE」或「OPTIMAL」,這個原型中的其他欄位可能為空白。如果狀態為「NOT_SOLVED_DEADLINE_EXCEEDED」,表示在沒有找出可行的解決方案或判斷可行的解決方案的情況下,達到的時間限制。如果無法同時滿足優先等級 MANDATORY 的限制,就可能無法處理要求。

shiftAssignments[]

object (ShiftAssignment)

所有指派作業的清單。每個ShiftAssignment都會指定一位員工、指派的輪班,以及為該輪班指派的角色。

statusMessage

string

如果 solutionStatus 不是最佳選項,這個欄位會包含解題工具的額外資訊。

SolveParameters

用於控制排班排程問題單解的參數。

JSON 表示法
{
  "timeLimit": string
}
欄位
timeLimit

string (Duration format)

解題工具應在問題上花費的時間上限。如果未設定,預設為 1 分鐘。

這個值並非硬性上限,且不會計入通訊負荷。解決問題的預期延遲時間可能會稍微超過這個值。

持續時間以秒為單位,最多 9 個小數位數,結尾為「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

指派給這位員工的專屬 ID。

roleIds[]

string

這位員工可執行的角色 ID。至少須指定一個角色。員工被指派值時,也會同時指派給此清單中的一個角色。在排程期間,系統可能會將員工指派給不同角色。

skillIds[]

string

這位員工擁有的技能 ID。這份清單可以留空。指派職務給員工時,員工會在指派輪班期間運用這裡列出的所有技能,滿足相關技能要求。

shiftPreferences[]

object (ShiftPreference)

此員工的輪班偏好。此處指定的輪班代表了員工在表定期間要指派的位班。shiftPreferences 中指定的偏移 ID 不得重複。解析器會盡可能提高所有符合 shiftPreferencesShiftPreference.preference 值總和。

schedulingConstraints[]

object (SchedulingConstraint)

這位員工的排程限制清單。這些限制的預設優先順序等級為 PRIORITY_MEDIUM。詳情請參閱 Priority 列舉。

resourceConstraints[]

object (ResourceConstraint)

未在 schedulingConstraints 中指定的其他排程限制可在此新增至 resourceConstraintsResourceConstraint 是限制員工資源的更抽象表示法。這些限制的預設優先順序等級為 PRIORITY_MEDIUM。詳情請參閱 Priority 列舉。

shiftRequests[]

object (ShiftRequest)

員工的輪班要求清單。您可以為員工指派或非指派到特定輪班。凡是要為員工安排固定時段指派的工作,都能以 ShiftRequest 表示,優先順序為 PRIORITY_MANDATORY。這位員工最多只會顯示一個輪班 ID。這些要求的預設優先等級為 PRIORITY_LOW。詳情請參閱 Priority 列舉。

hourlyContract

object (HourlyContract)

指明員工按時每小時收費的合約。

ShiftPreference

特定偏移 ID 的數值偏好設定。

JSON 表示法
{
  "shiftId": string,
  "preference": integer
}
欄位
shiftId

string

指定偏好設定的 Shift ID。

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

兩次輪班後,員工必須至少停留幾分鐘的時間,才能分配到其他輪班。這項限制適用於 [startDateTimeendDateTime] 中完整涵蓋的每組輪班。

優先順序

員工時間表或防護需求方面的限制優先等級。包括 SchedulingConstraintResourceConstraintShiftRequestCoverageRequirement。可能會發生衝突,因此並非每次都能滿足每項限制。因此,每種限制條件都有其優先順序 (由使用者或預設規則指定),向解答者說明所有指定至完整時間表的限制的相對重要性。

列舉
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

排程要求的轉移 ID。

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 小時的 7 個訂閱週期) 週期,用於決定加班薪酬金額。每個週期都有加時係數 (例如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

指派給這個變動的專屬 ID。

locationId

string

這項變動生效的地區 ID。這個參數可以留空。

startDateTime

object (DateTime)

變動的開始時間 (含頭尾)。

endDateTime

object (DateTime)

變動的結束時間 (不含)。解題工具目前僅允許長度小於 24 小時的位移。

breakRules[]

object (BreakRule)

在轉移期間發生的破壞規則清單。執行這項轉變的員工每break_rule會選擇休息時間,期間他們並未涵蓋所履行角色的需求。每個 BreakRule 時間範圍都必須完整涵蓋在這項調整時間範圍內。

BreakRule

決定廣告插播時間點和廣告插播時間點的規則。所有可能的廣告插播清單都會以 ruleIncrementMinutes 為單位遞增。舉例來說,如果休息規則是從 10:00 到 11:00 開始的 30 分鐘休息時間,而規則增量是 20 分鐘,則視為的中斷點清單為:[10:00, 10:30]、[10:20、10:50]、[10:40]、1.1:10]0、1:10

JSON 表示法
{
  "earliestStartTime": {
    object (DateTime)
  },
  "latestStartTime": {
    object (DateTime)
  },
  "durationMinutes": integer,
  "ruleIncrementMinutes": integer
}
欄位
earliestStartTime

object (DateTime)

廣告插播的最早開始時間 (含)。只能設定 hoursminutes

latestStartTime

object (DateTime)

廣告插播的最晚開始時間 (含)。只能設定 hoursminutes

durationMinutes

integer

廣告插播的持續時間,以分鐘為單位。

ruleIncrementMinutes

integer

[選用] 這項廣告插播規則可考慮的所有廣告插播時間,以分鐘為單位遞增。如果沒有設定,預設值為 durationMinutes

CoverageRequirement

防護需求會指定特定時間範圍內和地點,為一組角色和/或技能要求員工人數。特定位置的 DateTime 間隔不得重疊。或者,您也可以提供班表 ID 清單,而非時間範圍和地點。只有可獲派特定角色 (或具備特定技能) 的員工能滿足這項條件。

就特定職務和/或技能而言,在時間範圍內至少有 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

在設定之後,角色和技能要求會分別套用至這份清單中的每個輪班 ID。如果 shiftIds 並非空白,則 startDateTimeendDateTimelocationId 必須留空。

roleRequirements[]

object (RoleRequirement)

指定時間範圍內指派給指定角色的員工人數。每個角色 ID 最多只能有一個 role_requirement。每個要求的預設優先順序等級為 PRIORITY_MANDATORY。如果在時間範圍內,指派給指定角色的員工少於 targetEmployeeCount 位,即違反這些限制。

skillRequirements[]

object (SkillRequirement)

指定時間內獲派負責任職的指定技能的員工人數。每個技能 ID 最多只能有一個 skill_requirement。每個要求的預設優先順序等級為 PRIORITY_LOW。在指定時間範圍內,任何時候具備特定技能的員工少於 targetEmployeeCount 位員工,即違反這些限制。

RoleRequirement

指定時間範圍內指派給指定角色的員工人數。

JSON 表示法
{
  "roleId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
欄位
roleId

string

要求的角色 ID。

targetEmployeeCount

integer

指定時間範圍內指派給該角色的員工人數。

priority

enum (Priority)

這項要求限制的優先等級。所有資源限制的預設優先順序為 PRIORITY_MANDATORY

SkillRequirement

在指定時間範圍內具備特定技能的員工所需人數。

JSON 表示法
{
  "skillId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
欄位
skillId

string

要求技能 ID。

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,盡可能降低時間表的總費用。舉例來說,如果預算的 priorityPRIORITY_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

指派的員工 ID。

shiftId

string

指派給員工的班表 ID。

roleId

string

員工為輪班指派的角色 ID。

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 在指定時間範圍內找不到任何排程。