將員工指派為輪值班,以解決指定SolveShiftSchedulingRequest
的固定班表問題排程偏好設定最大化,並盡量避免違反排程限制的情況。
HTTP 要求
POST https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling
這個網址使用 gRPC 轉碼語法。
要求主體
要求主體的資料會採用以下結構:
JSON 表示法 |
---|
{ "requestId": string, "solveParameters": { object ( |
欄位 | |
---|---|
requestId |
問題或請求 ID。 |
solveParameters |
用於控制問題單解的參數。 |
employees[] |
所有可預約的員工均可安排時間。 |
shifts[] |
所有轉變,都組成時間表。 |
coverageRequirements[] |
在整個規劃期間的涵蓋範圍需求。這指明在時間範圍或輪班 ID 清單上,各職位或具備技能的員工人數。所有保固要求都必須以時間範圍或班表 ID 清單指定 (但不能同時指定兩者)。如果提供,各地區承載規定的時間範圍 (如有指定) 不得重疊。以上各項限制的預設優先順序等級為 |
roleIds[] |
工作團隊的所有可能角色清單。每位員工都必須至少指派一個角色,才能進行輪班。角色指的是換班期間的具體指派工作 (例如登記的護士、高管主廚、服務人員等)。員工獲派職務時,也會同時獲派單一特定角色。 |
skillIds[] |
列出所有職員可能具備的技能。「技能」是指員工與特定指派工作無關的額外資格認證 (例如認證、口說語言等)。這份清單可以留空。獲派職務的員工必須充分滿足該輪班所需的所有技能。 |
locationIds[] |
列出時間表中這些排班的所有可能地點。這份清單可以留空。指定不同地點是很實用的做法。舉例來說,護理師經理想為醫院的不同單位安排多名護理師,或是想為多間飯店安排員工預約時,再指定不同地點。 |
budgetRequirements[] |
因應時段設定問題的預算規格。這些要求的預設優先順序等級為 |
assignmentsHint[] |
將指派作業移做時間安排問題 (又稱為解決方案提示)。如果作業與無法指派的位班或排程要求相牴觸,系統會忽略作業提示。 |
回應主體
對工作團隊排程 API 的回應。對於每個回應,如果傳回的 solutionStatus
為 NOT_SOLVED_DEADLINE_EXCEEDED
或 INFEASIBLE
,shiftAssignments
就會留空。如果傳回的 solutionStatus
是 OPTIMAL
或 FEASIBLE
,系統會在 shiftAssignments
中傳回有效的位移指派值。下列屬性對於有效的位班指派會保留:
- 每個員工 ID 都會包含在要求中所指定的員工名單中。
- 指派給員工的每個角色 ID 都位於指定員工的角色 ID 中。
- 每個平移 ID 都包含在要求中提供的轉變組合中。
- 每個輪班 ID 不是指定員工的不可指派的輪班 ID。
- 員工永遠不會被指派到兩個重疊的輪班。
- 根據指定的排程,系統未違反任何優先等級為
PRIORITY_MANDATORY
的限製或要求。
如果成功,回應主體會含有以下結構的資料:
JSON 表示法 |
---|
{ "requestId": string, "solutionStatus": enum ( |
欄位 | |
---|---|
requestId |
與此回應相關聯的要求 ID。 |
solutionStatus |
傳回的解決方案狀態。如果解決方案不是「FEASIBLE」或「OPTIMAL」,這個原型中的其他欄位可能為空白。如果狀態為「NOT_SOLVED_DEADLINE_EXCEEDED」,表示在沒有找出可行的解決方案或判斷可行的解決方案的情況下,達到的時間限制。如果無法同時滿足優先等級 MANDATORY 的限制,就可能無法處理要求。 |
shiftAssignments[] |
所有指派作業的清單。每個 |
statusMessage |
如果 |
SolveParameters
用於控制排班排程問題單解的參數。
JSON 表示法 |
---|
{ "timeLimit": string } |
欄位 | |
---|---|
timeLimit |
解題工具應在問題上花費的時間上限。如果未設定,預設為 1 分鐘。 這個值並非硬性上限,且不會計入通訊負荷。解決問題的預期延遲時間可能會稍微超過這個值。 持續時間以秒為單位,最多 9 個小數位數,結尾為「 |
員工
要排定工作團隊的員工。
JSON 表示法 |
---|
{ "id": string, "roleIds": [ string ], "skillIds": [ string ], "shiftPreferences": [ { object ( |
欄位 | |
---|---|
id |
指派給這位員工的專屬 ID。 |
roleIds[] |
這位員工可執行的角色 ID。至少須指定一個角色。員工被指派值時,也會同時指派給此清單中的一個角色。在排程期間,系統可能會將員工指派給不同角色。 |
skillIds[] |
這位員工擁有的技能 ID。這份清單可以留空。指派職務給員工時,員工會在指派輪班期間運用這裡列出的所有技能,滿足相關技能要求。 |
shiftPreferences[] |
此員工的輪班偏好。此處指定的輪班代表了員工在表定期間要指派的位班。 |
schedulingConstraints[] |
這位員工的排程限制清單。這些限制的預設優先順序等級為 |
resourceConstraints[] |
未在 |
shiftRequests[] |
員工的輪班要求清單。您可以為員工指派或非指派到特定輪班。凡是要為員工安排固定時段指派的工作,都能以 |
hourlyContract |
指明員工按時每小時收費的合約。 |
ShiftPreference
特定偏移 ID 的數值偏好設定。
JSON 表示法 |
---|
{ "shiftId": string, "preference": integer } |
欄位 | |
---|---|
shiftId |
指定偏好設定的 Shift ID。 |
preference |
較高的偏好值表示更理想的偏移值。 |
SchedulingConstraint
特定員工的具體排程限制。指定的限制只會在指定的間隔 [startDateTime,
endDateTime)
期間套用。
JSON 表示法 |
---|
{ "priority": enum ( |
欄位 | |
---|---|
priority |
這個排程限制的優先等級。所有排程限制的預設優先順序為 |
startDateTime |
套用這項排程限制的開始時間 (含)。 |
endDateTime |
這項排程限制生效時的結束時間 (不含)。 |
聯集欄位 type 。指定的限制類型。每項限制都只會在上方指定的時間範圍內套用。type 只能是下列其中一項: |
|
minimumMinutes |
員工至少能工作幾分鐘。如果員工獲派的輪班時間與時間範圍重疊 (完全或部分),則該位移與時間範圍重疊的分鐘數會納入計算。 |
maximumMinutes |
員工在時間範圍內可工作的分鐘數上限。如果員工獲派的輪班時間與時間範圍重疊 (完全或部分),則該位移與時間範圍重疊的分鐘數會納入計算。 |
minimumConsecutiveWorkDays |
至少員工可以連續工作的天數。如果員工被分配在當天開始的輪班,就會在特定日期進行工作。這段期間內指派給員工的任何輪班都會計入這項數據。 |
maximumConsecutiveWorkDays |
員工可連續工作的天數上限。如果員工被分配在當天開始的輪班,就會在特定日期進行工作。這段期間內指派給員工的任何輪班都會計入這項數據。 |
minimumShiftCount |
員工可進行的輪班次數下限。任何與職員完全重疊的輪班,都會計入這個次數。 |
maximumShiftCount |
員工可進行的輪班次數上限。任何與職員完全重疊的輪班,都會計入這個次數。 |
minimumRestMinutes |
兩次輪班後,員工必須至少停留幾分鐘的時間,才能分配到其他輪班。這項限制適用於 [ |
優先順序
員工時間表或防護需求方面的限制優先等級。包括 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 |
班表使用的資源量。例如,如果此限制適用於某位員工在特定週可工作的時間下限和上限,則此地圖將包含當週發生的變動,以及每個輪班的時間 (以小時為單位)。 這個物件中包含 |
minimumResourceUsage |
要滿足資源限制的最低資源用量。 |
maximumResourceUsage |
滿足資源限制的資源用量上限。 |
ShiftRequest
將員工的要求分配或未指派給特定輪班。
JSON 表示法 |
---|
{ "priority": enum ( |
欄位 | |
---|---|
priority |
此排程要求的優先等級。所有排程要求的預設優先順序為 |
shiftIds[] |
排程要求的轉移 ID。 |
type |
要求類型,例如是否指派要求給這組位移。 |
WorkStatus
員工是否正常運作。
列舉 | |
---|---|
WORK_STATUS_UNSPECIFIED |
工作狀態不明。 |
STATUS_WORK |
工作員工的狀態。 |
STATUS_NOT_WORK |
代表非工作員工的狀態。 |
HourlyContract
指定基本每小時費率、匯率差異和加時係數,以判斷員工的薪酬。請注意,不同地點的法規可能需要分別計算加班報酬。解題工具可估算進場補償,藉此降低總成本或達到預算的金額 (請參閱 BudgetRequirement
)。而非用來計算薪資的工具。
JSON 表示法 |
---|
{
"baseHourlyRate": number,
"hourlyRateShiftDifferentials": {
string: number,
...
},
"overtimePeriods": [
{
object ( |
欄位 | |
---|---|
baseHourlyRate |
非加班時數的補償。如果員工適用多種費率,則會根據這個基本每小時費率計算費率差異。此外,如果有多個費率,基本每小時費率應為這些費率的最低值。 |
hourlyRateShiftDifferentials |
根據 這個物件中包含 |
overtimePeriods[] |
所有必須計算超時期間的清單。這些時段不得重疊。 |
OvertimePeriod
固定且定期 (通常為 168 小時或連續 24 小時的 7 個訂閱週期) 週期,用於決定加班薪酬金額。每個週期都有加時係數 (例如1.5) 以相對於 baseHourlyRate
,且視為一般 (非加班) 工作的時數限制。任何與 startDateTime
(含) 和 endDateTime
(不含) 時間範圍重疊的位移,都會計入指定時間範圍內的總時數。如果只有重疊的時段,系統只會計算重疊的時段。
JSON 表示法 |
---|
{ "overtimeMultiplier": number, "startDateTime": { object ( |
欄位 | |
---|---|
overtimeMultiplier |
計算長期每小時費率的乘數 (必須大於或等於 1.0)。每小時加班費用通常會以 |
startDateTime |
延長賽的開始時間。如果這次的位移時間重疊,這類位移的總時數就會從 |
endDateTime |
延長賽的結束時間。如果這次的位移時間重疊,這類調節時間的時數就會計入 |
maximumRegularHours |
以一般 (非加班) 費率支付的工作時數上限。數量必須為正數。 |
Shift
班表是指員工在一段固定的期間內工作。
JSON 表示法 |
---|
{ "id": string, "locationId": string, "startDateTime": { object ( |
欄位 | |
---|---|
id |
指派給這個變動的專屬 ID。 |
locationId |
這項變動生效的地區 ID。這個參數可以留空。 |
startDateTime |
變動的開始時間 (含頭尾)。 |
endDateTime |
變動的結束時間 (不含)。解題工具目前僅允許長度小於 24 小時的位移。 |
breakRules[] |
在轉移期間發生的破壞規則清單。執行這項轉變的員工每 |
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 ( |
欄位 | |
---|---|
earliestStartTime |
廣告插播的最早開始時間 (含)。只能設定 |
latestStartTime |
廣告插播的最晚開始時間 (含)。只能設定 |
durationMinutes |
廣告插播的持續時間,以分鐘為單位。 |
ruleIncrementMinutes |
[選用] 這項廣告插播規則可考慮的所有廣告插播時間,以分鐘為單位遞增。如果沒有設定,預設值為 |
CoverageRequirement
防護需求會指定特定時間範圍內和地點,為一組角色和/或技能要求員工人數。特定位置的 DateTime 間隔不得重疊。或者,您也可以提供班表 ID 清單,而非時間範圍和地點。只有可獲派特定角色 (或具備特定技能) 的員工能滿足這項條件。
就特定職務和/或技能而言,在時間範圍內至少有 targetEmployeeCount
名員工 (或各個 shiftIds
輪班) 時,都必須符合涵蓋範圍規定。相比之下,如果時間範圍內任何時間點 (或shiftIds
的變動) 內的員工人數少於 targetEmployeeCount
名,就屬於違反保固範圍的規定。比 targetEmployeeCount
更多的在職員工仍能滿足這項需求,但解題工具將員工配置的過量降到最低。
JSON 表示法 |
---|
{ "startDateTime": { object ( |
欄位 | |
---|---|
startDateTime |
涵蓋範圍規定的開始時間 (含)。如果設定, |
endDateTime |
涵蓋範圍規定的結束時間 (不含)。如果設定, |
locationId |
員工所需地點。 |
shiftIds[] |
在設定之後,角色和技能要求會分別套用至這份清單中的每個輪班 ID。如果 shiftIds 並非空白,則 |
roleRequirements[] |
指定時間範圍內指派給指定角色的員工人數。每個角色 ID 最多只能有一個 |
skillRequirements[] |
指定時間內獲派負責任職的指定技能的員工人數。每個技能 ID 最多只能有一個 |
RoleRequirement
指定時間範圍內指派給指定角色的員工人數。
JSON 表示法 |
---|
{
"roleId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
欄位 | |
---|---|
roleId |
要求的角色 ID。 |
targetEmployeeCount |
指定時間範圍內指派給該角色的員工人數。 |
priority |
這項要求限制的優先等級。所有資源限制的預設優先順序為 |
SkillRequirement
在指定時間範圍內具備特定技能的員工所需人數。
JSON 表示法 |
---|
{
"skillId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
欄位 | |
---|---|
skillId |
要求技能 ID。 |
targetEmployeeCount |
指定時間內有多少員工具備特定技能。 |
priority |
這項要求限制的優先等級。所有資源限制的預設優先順序為 |
BudgetRequirement
指定時間間隔的預算需求。
JSON 表示法 |
---|
{ "totalBudget": number, "startDateTime": { object ( |
欄位 | |
---|---|
totalBudget |
指定間隔的總預算。如果優先順序為 如果未設定 |
startDateTime |
套用這筆預算的開始時間。如未指定開始時間,則會設為所有指定位移的最早開始時間。 |
endDateTime |
套用此預算時的結束時間。如未指定結束時間,則會設為所有指定位移的最晚結束時間。 |
priority |
在指定時間範圍內達到預算需求的優先等級。預設優先順序為 請注意,如果這個優先順序高於其他限制優先順序,且 |
ShiftAssignment
員工擔任輪班指派。
JSON 表示法 |
---|
{
"employeeId": string,
"shiftId": string,
"roleId": string,
"breaks": [
{
object ( |
欄位 | |
---|---|
employeeId |
指派的員工 ID。 |
shiftId |
指派給員工的班表 ID。 |
roleId |
員工為輪班指派的角色 ID。 |
breaks[] |
這份排班指派的間隔清單。 |
休息時間
員工在輪班期間中斷工作的時間範圍。
JSON 表示法 |
---|
{
"startDateTime": {
object ( |
欄位 | |
---|---|
startDateTime |
休息的開始時間。 |
durationMinutes |
廣告插播的持續時間,以分鐘為單位。 |
SolutionStatus
解題工具回應中提供的解決方案 (亦即時間表) 狀態。
列舉 | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
回應的狀態不明。 |
FEASIBLE |
系統回傳的時間表可行,但可能並未達到最佳設定。 |
OPTIMAL |
傳回的時間表是最佳設定。 |
INFEASIBLE |
指定的限制沒有可行的排程。如果無法滿足優先等級 PRIORITY_MANDATORY 的任一限制,解析器可能會傳回這個值。 |
NOT_SOLVED |
找不到任何排程。 |
NOT_SOLVED_DEADLINE_EXCEEDED |
在指定時間範圍內找不到任何排程。 |