Weźmy na przykład centrum obsługi, w którego przypadku chcesz generować zmiany, aby uwzględnić popyt na pracowników. Centrum obsługi działa przez całą dobę, a liczba wymaganych pracowników zmienia się z upływem czasu. Centrum obsługi zatrudnia zarówno pracowników zatrudnionych na pełny, jak i niepełny etat.
Pracownicy pełnoetatowi pracują na 9-godzinne zmiany, mają 1-godzinną przerwę po 4 lub 5 godzinach od rozpoczęcia zmiany i mogą rozpocząć pracę w dowolnym momencie między 5:00 a 12:00. Pracownicy w niepełnym wymiarze godzin pracują na 4-godzinnych zmianach z 15-minutową przerwą pod koniec drugiej godziny pracy i mogą rozpocząć swoją zmianę w dowolnej chwili. W obu przypadkach możliwe czasy rozpoczęcia zmiany są uwzględniane w odstępach 15-minutowych.
Centrum obsługi chce zaplanować wymagania dotyczące siły roboczej na najbliższe 2 dni, biorąc pod uwagę fakt, że powinno zatrudniać maksymalnie 20 pracowników pełnoetatowych i 40 pracowników w niepełnym wymiarze godzin.
Szablony zmian dla pracowników zatrudnionych na pełny i niepełny etat
Reguły, które określają prawidłowe zmiany, można przedstawić za pomocą szablonu przesunięcia. W szablonie zmiany pojęcie przerwy na reklamę może być reprezentowane za pomocą szablonu zdarzenia. Na przykład szablon zmiany w przypadku zmiany pracownika pełnoetatowego jest wyświetlany w taki sposób:
{
"id": "full-time",
"earliestStartTime": {
"hours": 5
},
"latestStartTime": {
"hours": 12
},
"durationMinutes": 540,
"startTimeIncrementMinutes": 15,
"eventTemplates": [
{
"id": "full-time-break",
"minimumMinutesAfterShiftStart": 240,
"maximumMinutesAfterShiftStart": 300,
"durationMinutes": 60,
"startTimeIncrementMinutes": 60
}
],
"maximumEmployeeCount": 20
}
Podobnie szablon zmiany w przypadku zmiany pracownika zatrudnionego w niepełnym wymiarze godzin jest przedstawiany w następujący sposób:
{
"id": "part-time",
"earliestStartTime": {},
"latestStartTime": {
"hours": 23,
"minutes": 59
},
"durationMinutes": 240,
"startTimeIncrementMinutes": 15,
"eventTemplates": [
{
"id": "part-time-break",
"minimumMinutesAfterShiftStart": 120,
"maximumMinutesAfterShiftStart": 120,
"durationMinutes": 15,
"startTimeIncrementMinutes": 0
}
],
"maximumEmployeeCount": 40
}
Zapotrzebowanie pracowników na przestrzeni czasu
Zapotrzebowanie na pracowników jest przedstawione za pomocą listy EmployeeDemand
, gdzie każdy z tych elementów charakteryzuje przedział czasu i liczbę pracowników. W tym przykładzie popyt w ciągu dwóch dni wynosi od 4 do 13 pracowników i jest przedstawiany w następujący sposób:
{
...
"employeeDemands": [
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 20
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 20,
"hours": 12
},
"employeeCount": 8
},
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 20,
"hours": 12
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 20,
"hours": 20
},
"employeeCount": 12
},
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 20,
"hours": 20
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 21,
"hours": 6
},
"employeeCount": 4
},
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 21,
"hours": 6
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 22,
"hours": 0
},
"employeeCount": 13
}
]
}
Przykład kompletnego żądania
{
"solverConfig": {
"timeLimit": "30s"
},
"shiftTemplates": [
{
"id": "full-time",
"earliestStartTime": {
"hours": 5
},
"latestStartTime": {
"hours": 12
},
"durationMinutes": 540,
"startTimeIncrementMinutes": 15,
"eventTemplates": [
{
"id": "full-time-break",
"minimumMinutesAfterShiftStart": 240,
"maximumMinutesAfterShiftStart": 300,
"durationMinutes": 60,
"startTimeIncrementMinutes": 60
}
],
"maximumEmployeeCount": 20
},
{
"id": "part-time",
"earliestStartTime": {},
"latestStartTime": {
"hours": 23,
"minutes": 59
},
"durationMinutes": 240,
"startTimeIncrementMinutes": 15,
"eventTemplates": [
{
"id": "part-time-break",
"minimumMinutesAfterShiftStart": 120,
"maximumMinutesAfterShiftStart": 120,
"durationMinutes": 15,
"startTimeIncrementMinutes": 0
}
],
"maximumEmployeeCount": 40
}
],
"employeeDemands": [
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 20
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 20,
"hours": 12
},
"employeeCount": 8
},
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 20,
"hours": 12
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 20,
"hours": 20
},
"employeeCount": 12
},
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 20,
"hours": 20
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 21,
"hours": 6
},
"employeeCount": 4
},
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 21,
"hours": 6
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 22,
"hours": 0
},
"employeeCount": 13
}
]
}
Przykładowa odpowiedź
Odpowiedź rozwiązania zawiera listę harmonogramów pracowników z odpowiadającą im liczbą wymaganych pracowników. Jeśli nie można dokładnie zaspokoić popytu, odpowiedź będzie też zawierać listę naruszeń w każdym odpowiednim przedziale czasu.
Na przykładzie poniżej widać jeden z wygenerowanych harmonogramów pracowników zatrudnionego w pełnym wymiarze godzin:
{
"solutionStatus": "SHIFT_GENERATION_SOLVED",
"employeeSchedules": [
{
"shiftTemplateId": "full-time",
"shifts": [
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 21,
"hours": 7,
"minutes": 30
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 21,
"hours": 16,
"minutes": 30
},
"events": [
{
"startDateTime": {
"year": 2024,
"month": 5,
"day": 21,
"hours": 12,
"minutes": 30
},
"endDateTime": {
"year": 2024,
"month": 5,
"day": 21,
"hours": 13,
"minutes": 30
},
"eventTemplateId": "full-time-break"
}
]
}
],
"employeeCount": 1
},
...
]
...
}