Method: scheduling.solveShiftScheduling

Rozwiązanie problemu z planowaniem stałych zmian z podanego zakresu SolveShiftSchedulingRequest przez przypisanie pracowników do zmian w taki sposób, że pracownicy preferencje planowania są zmaksymalizowane, a naruszenia ograniczeń związane z planowaniem są zminimalizowane.

Żądanie HTTP

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

Adres URL używa składni transkodowania gRPC.

Treść żądania

Treść żądania zawiera dane o następującej strukturze:

Zapis 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)
    }
  ]
}
Pola
requestId

string

Identyfikator problemu lub prośby.

solveParameters

object (SolveParameters)

Parametry do sterowania pojedynczym rozwiązaniem zadania.

employees[]

object (Employee)

Zaplanowanie wszystkich dostępnych pracowników.

shifts[]

object (Shift)

Wszystkie zmiany tworzące harmonogram.

coverageRequirements[]

object (CoverageRequirement)

Wymagania dotyczące ochrony dla całego horyzontu planowania. Określają one liczbę pracowników, którzy muszą wykonywać poszczególne role lub posiadać określone umiejętności w określonym przedziale czasu lub na liście identyfikatorów zmian. Wszystkie wymagania dotyczące zakresu ochrony muszą być określone za pomocą przedziałów czasowych lub listy identyfikatorów zmian (ale nie obie). Przedziały czasu (jeśli są podane) dotyczące wymagań związanych z zasięgiem nie mogą się pokrywać w przypadku danej lokalizacji. Domyślny priorytet każdego z tych ograniczeń to PRIORITY_MANDATORY w przypadku wymagań roli i PRIORITY_LOW w przypadku wymagań dotyczących umiejętności. Więcej informacji znajdziesz w danych wyliczeniowych Priority.

roleIds[]

string

Lista wszystkich możliwych ról na rynku pracy. Każdy pracownik musi mieć co najmniej 1 rolę, którą można mu przypisać na potrzeby zmiany. Rola oznacza konkretne zadanie wykonywane podczas zmiany (np.dyplomowana pielęgniarka, szef kuchni, kelner itp.). Gdy pracownik zostanie przydzielony na zmianę, otrzymuje też 1 konkretną rolę.

skillIds[]

string

Lista wszystkich umiejętności dostępnych na rynku pracy. Umiejętność odnosi się do wszelkich dodatkowych kwalifikacji pracowników (np.certyfikatów, używanych języków itp.), które nie są związane z przydzielonym stanowiskiem. Ta lista może być pusta. Gdy pracownik zostanie przydzielony na zmianę, musi spełnić wszystkie umiejętności potrzebne na tej zmianie.

locationIds[]

string

Lista wszystkich możliwych lokalizacji dla zbioru zmian w harmonogramie. Ta lista może być pusta. Określenie różnych lokalizacji może być przydatne, gdy na przykład kierowniczka pielęgniarki chce zaplanować pracę wielu pielęgniarek w różnych placówkach w szpitalu, a menedżer hotelu chce zaplanować pracę w kilku hotelach.

budgetRequirements[]

object (BudgetRequirement)

Specyfikacja budżetu, w którym wystąpił problem z planowaniem. Domyślny poziom priorytetu każdego z tych wymagań to PRIORITY_LOW. Więcej informacji znajdziesz w danych wyliczeniowych Priority.

assignmentsHint[]

object (ShiftAssignment)

Przenoszenie przypisań, które mają być wstępnym rozwiązaniem problemu planowania (tzw. wskazówka). Wskazówki dotyczące przypisań są ignorowane, jeśli przypisanie jest sprzeczne z zmianą, której nie można przypisać, lub z żądaniem planowania.

Treść odpowiedzi

Odpowiedź na interfejs API harmonogramu pracowników. W przypadku każdej odpowiedzi pole shiftAssignments będzie puste, jeśli zwrócona dyrektywa solutionStatus ma wartość NOT_SOLVED_DEADLINE_EXCEEDED lub INFEASIBLE. Jeśli zwrócona wartość solutionStatus ma wartość OPTIMAL lub FEASIBLE, prawidłowe przypisanie przesunięcia jest zwracane w funkcji shiftAssignments. Aby zapewnić prawidłowe przypisanie zmiany, obowiązują te właściwości:

  1. Każdy identyfikator pracownika jest zawarty w zbiorze pracowników podanym w żądaniu.
  2. Każdy identyfikator roli przypisany do pracownika jest zawarty w zestawie identyfikatorów ról danego pracownika.
  3. Każdy identyfikator przesunięcia jest zawarty w zestawie korekt podanych w żądaniu.
  4. Każdy identyfikator zmiany nie jest jednym z identyfikatorów zmian dla danego pracownika, których nie można przypisać.
  5. Pracownik nigdy nie zostanie przypisany na 2 pokrywające się zmiany.
  6. W przypadku danego harmonogramu nie narusza to żadnych ograniczeń ani żądań o priorytecie PRIORITY_MANDATORY.

W przypadku powodzenia treść żądania zawiera dane o następującej strukturze:

Zapis JSON
{
  "requestId": string,
  "solutionStatus": enum (SolutionStatus),
  "shiftAssignments": [
    {
      object (ShiftAssignment)
    }
  ],
  "statusMessage": string
}
Pola
requestId

string

Identyfikator żądania, z którym jest powiązana ta odpowiedź.

solutionStatus

enum (SolutionStatus)

Stan zwróconego rozwiązania. Jeśli rozwiązanie nie jest wykonalne ani OPTYMALIZOWANE, inne pola tego protokołu mogą być puste. Stan NOT_SOLVED_DEADLINE_EXCEEDED oznacza, że limit czasu został osiągnięty bez znalezienia możliwego rozwiązania lub ustalenia, czy istnieje możliwe rozwiązanie. Żądania mogą być niewykonalne, jeśli nie można spełnić ograniczeń poziomu priorytetu OBOWIĄZKOWE.

shiftAssignments[]

object (ShiftAssignment)

Lista wszystkich projektów. Każdy element ShiftAssignment określa pracownika, zakres zmiany, do którego jest przypisany, oraz rolę, do której ma zostać przypisany.

statusMessage

string

Jeśli pole solutionStatus nie jest optymalne, to pole może zawierać dodatkowe informacje o rozwiązaniach.

SolveParameters

Parametry sterujące jednym rozwiązaniem problemu z planowaniem zmian.

Zapis JSON
{
  "timeLimit": string
}
Pola
timeLimit

string (Duration format)

Maksymalny czas, który musi poświęcić na rozwiązanie problemu. Jeśli nie zostanie skonfigurowana, domyślna wartość to 1 minuta.

Ta wartość nie jest sztywnym ograniczeniem i nie uwzględnia nakładów związanych z komunikacją. Przewidywany czas oczekiwania na rozwiązanie problemu może nieznacznie przekroczyć tę wartość.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

Pracownik

Pracownik, który ma zostać zaplanowany.

Zapis JSON
{
  "id": string,
  "roleIds": [
    string
  ],
  "skillIds": [
    string
  ],
  "shiftPreferences": [
    {
      object (ShiftPreference)
    }
  ],
  "schedulingConstraints": [
    {
      object (SchedulingConstraint)
    }
  ],
  "resourceConstraints": [
    {
      object (ResourceConstraint)
    }
  ],
  "shiftRequests": [
    {
      object (ShiftRequest)
    }
  ],
  "hourlyContract": {
    object (HourlyContract)
  }
}
Pola
id

string

Unikalny identyfikator przypisany do tego pracownika.

roleIds[]

string

Identyfikatory ról, które może wykonywać ten pracownik. Musisz określić co najmniej 1 rolę. Gdy pracownik zostanie przypisany na daną zmianę, otrzyma również 1 rolę z tej listy. Pracownik może mieć przypisaną różne role w określonym czasie.

skillIds[]

string

Identyfikatory umiejętności posiadane przez tego pracownika. Ta lista może być pusta. Gdy pracownik zostanie przydzielony na zmianę, wykorzystuje wymienione tutaj umiejętności, aby spełnić wymagania umiejętności w trakcie planowanej zmiany.

shiftPreferences[]

object (ShiftPreference)

Zmień ustawienia tego pracownika. Podane tu zmiany reprezentują zmiany, na które pracownik chciałby zostać przypisany w okresie planowania. Identyfikatory zmian określone w polu shiftPreferences muszą być unikalne. Rozwiązanie spróbuje zmaksymalizować sumę wartości parametru ShiftPreference.preference we wszystkich spełnionych żądaniach (shiftPreferences).

schedulingConstraints[]

object (SchedulingConstraint)

Lista ograniczeń planowania dla tego pracownika. Domyślny poziom priorytetu każdego z tych ograniczeń to PRIORITY_MEDIUM. Więcej informacji znajdziesz w danych wyliczeniowych Priority.

resourceConstraints[]

object (ResourceConstraint)

Wszelkie dodatkowe ograniczenia harmonogramu, które nie są określone w zasadzie schedulingConstraints, można dodać tutaj do elementu resourceConstraints. ResourceConstraint to bardziej abstrakcyjna reprezentacja ograniczania zasobów pracownika. Domyślny poziom priorytetu każdego z tych ograniczeń to PRIORITY_MEDIUM. Więcej informacji znajdziesz w danych wyliczeniowych Priority.

shiftRequests[]

object (ShiftRequest)

Lista próśb o zmianę wysłanych przez pracownika. Możesz poprosić o przypisanie pracownika lub zrezygnować z określenia poszczególnych zmian. Każde stałe przypisanie harmonogramu pracownika może być oznaczone etykietą ShiftRequest z priorytetem PRIORITY_MANDATORY. Identyfikator zmiany może występować w maksymalnie 1 prośbie o ustalenie harmonogramu dla tego pracownika. Domyślny poziom priorytetu każdego z tych żądań to PRIORITY_LOW. Więcej informacji znajdziesz w danych wyliczeniowych Priority.

hourlyContract

object (HourlyContract)

Umowa, która określa stałe i nadgodzinne stawki godzinowe dla pracownika.

ShiftPreference

Preferencja numeryczna określonego identyfikatora przesunięcia.

Zapis JSON
{
  "shiftId": string,
  "preference": integer
}
Pola
shiftId

string

Identyfikator przesunięcia, dla którego określono preferencje.

preference

integer

Większe wartości preferencji oznaczają bardziej pożądaną zmianę.

SchedulingConstraint

Ograniczenie harmonogramu dla konkretnego pracownika. Określone ograniczenie jest stosowane tylko podczas określonego interwału [startDateTime, endDateTime).

Zapis 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.
}
Pola
priority

enum (Priority)

Poziom priorytetu dla tego ograniczenia harmonogramu. Domyślny priorytet wszystkich ograniczeń planowania to PRIORITY_MEDIUM.

startDateTime

object (DateTime)

Godzina rozpoczęcia, w którym obowiązuje to ograniczenie harmonogramu (włącznie).

endDateTime

object (DateTime)

Godzina zakończenia, w której ma zastosowanie to ograniczenie harmonogramu (z wyłączeniem).

Pole sumy type. Określany typ ograniczenia. Każde ograniczenie jest stosowane tylko w przedziale czasu określonym powyżej. type może mieć tylko jedną z tych wartości:
minimumMinutes

integer

Minimalna liczba minut, jaką pracownik może pracować. Jeśli pracownik został przypisany do zmiany, która (w całości lub częściowo) pokrywa się z przedziałem czasowym, ta liczba jest wliczana do liczby minut.

maximumMinutes

integer

Maksymalna liczba minut, które pracownik może pracować w danym przedziale czasu. Jeśli pracownik został przypisany do zmiany, która (w całości lub częściowo) pokrywa się z przedziałem czasowym, ta liczba jest wliczana do liczby minut.

minimumConsecutiveWorkDays

integer

Minimalna liczba kolejnych dni, przez które pracownik może pracować. Pracownik pracuje w konkretnym dniu, jeśli został przydzielony do zmiany, która rozpoczyna się w tym dniu. Ta liczba uwzględnia każdą zmianę, do której przypisany jest pracownik, która rozpoczyna się w danym przedziale czasu.

maximumConsecutiveWorkDays

integer

Maksymalna liczba kolejnych dni, przez które pracownik może pracować. Pracownik pracuje w konkretnym dniu, jeśli został przydzielony do zmiany, która rozpoczyna się w tym dniu. Ta liczba uwzględnia każdą zmianę, do której przypisany jest pracownik, która rozpoczyna się w danym przedziale czasu.

minimumShiftCount

integer

Minimalna liczba zmian, które pracownik może pracować. Ta liczba uwzględnia każdą zmianę, do której przydzielony pracownik został przypisany, i która w pełni pokrywa się z tym przedziałem czasu.

maximumShiftCount

integer

Maksymalna liczba zmian, które pracownik może pracować. Ta liczba uwzględnia każdą zmianę, do której przydzielony pracownik został przypisany, i która w pełni pokrywa się z tym przedziałem czasu.

minimumRestMinutes

integer

Minimalna liczba minut, przez które pracownik musi odpocząć po zakończeniu jednej zmiany, zanim zostanie przypisany do kolejnej. To ograniczenie dotyczy każdej pary zmian, które są w pełni uwzględnione w metodach [startDateTime, endDateTime].

Priorytet

Poziom priorytetu dowolnego ograniczenia wynikającego z grafiku pracownika lub wymagań dotyczących zakresu ochrony. Są to między innymi SchedulingConstraint, ResourceConstraint, ShiftRequest i CoverageRequirement. Ze względu na sprzeczne ograniczenia nie zawsze można spełnić wszystkie wymagania. W związku z tym każdy typ ograniczenia ma priorytet (nadany przez użytkownika lub domyślny), który informuje program do rozwiązywania problemów o względnym znaczeniu wszystkich ograniczeń nadanych do pełnego harmonogramu.

Wartości w polu enum
PRIORITY_UNSPECIFIED Nieznany poziom priorytetu.
PRIORITY_LOW Najniższy priorytet. Ograniczenia z tym priorytetem są mniej ważne niż pozostałe. Są to pierwsi, którzy są uznawani za naruszające zasady, gdy nie można znaleźć wykonalnego rozwiązania.
PRIORITY_MEDIUM Średni priorytet. Ograniczenia z tym priorytetem są ważniejsze niż ograniczenia o priorytecie PRIORITY_LOW, ale mniej ważne niż te o priorytecie PRIORITY_HIGH. Jeśli po złagodzeniu wszystkich ograniczeń o priorytecie PRIORITY_LOW nie można znaleźć realnego rozwiązania, w następnej kolejności pod kątem naruszenia są sprawdzane ograniczenia o priorytecie PRIORITY_MEDIUM.
PRIORITY_HIGH Najwyższy priorytet. Ograniczenia związane z tym poziomem priorytetu są najważniejsze. Jeśli po złagodzeniu ograniczeń o niższym priorytecie nie uda się znaleźć wykonalnego rozwiązania, są one uważane za ostatni wniosek.
PRIORITY_MANDATORY Poziom priorytetu reprezentujący coś, którego program do rozwiązania nie może naruszyć. Jeśli rozwiązanie do rozwiązania zwraca wartość SolutionStatus.INFEASIBLE, może to być spowodowane zbyt wieloma ograniczeniami PRIORITY_MANDATORY.

ResourceConstraint

Ogólne ograniczenie, które ogranicza ilość danego „zasobu” używane przez pracownika. Jest to abstrakcyjna wersja bardziej szczegółowego atrybutu SchedulingConstraint, która jest bardziej elastyczna dla użytkownika. Za pomocą tej wiadomości można zamiast tego określić wiele ograniczeń harmonogramu, których nie można określić w tabeli SchedulingConstraint.type.

Zapis JSON
{
  "priority": enum (Priority),
  "resourceUsages": {
    string: number,
    ...
  },
  "minimumResourceUsage": number,
  "maximumResourceUsage": number
}
Pola
priority

enum (Priority)

Poziom priorytetu tego ograniczenia zasobów. Domyślny priorytet wszystkich ograniczeń zasobów to PRIORITY_MEDIUM.

resourceUsages

map (key: string, value: number)

Ilość zasobów używanych przez zmiany. Jeśli na przykład to ograniczenie dotyczy minimalnej i maksymalnej liczby godzin przepracowanych przez pracownika w danym tygodniu, mapa będzie zawierać zmiany, które miały miejsce w tym tygodniu, oraz długość każdej z nich w godzinach.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

minimumResourceUsage

number

Minimalne wykorzystanie zasobów, które ma zostać spełnione.

maximumResourceUsage

number

Maksymalne wykorzystanie zasobów dla ograniczenia zasobów do spełnienia.

ShiftRequest

Prośba pracownika o przypisanie lub nieprzypisanie do określonych zmian.

Zapis JSON
{
  "priority": enum (Priority),
  "shiftIds": [
    string
  ],
  "type": enum (WorkStatus)
}
Pola
priority

enum (Priority)

Poziom priorytetu tego żądania planowania. Domyślny priorytet wszystkich żądań planowania to PRIORITY_LOW.

shiftIds[]

string

Identyfikatory zmian w żądaniu dotyczącym harmonogramu.

type

enum (WorkStatus)

Typ żądania, na przykład czy jest ono przypisane do zestawu zmian czy nie.

WorkStatus

Informacja o tym, czy pracownik pracuje, czy nie.

Wartości w polu enum
WORK_STATUS_UNSPECIFIED Nieznany stan zadania.
STATUS_WORK Stan przedstawiający pracownika.
STATUS_NOT_WORK Stan oznaczający niepracującego pracownika.

HourlyContract

Określa podstawową stawkę godzinową, różnice stawek i mnożniki nadgodzin w celu określenia wynagrodzenia dla pracownika. Pamiętaj, że przepisy obowiązujące w różnych miejscach mogą wymagać innego obliczenia wynagrodzenia za nadgodziny. Rozwiązanie określa w przybliżeniu kompensację w czasie, aby minimalizować procentowy całkowity koszt lub osiągnąć budżet (patrz BudgetRequirement). Nie jest to narzędzie do obliczania listy płac.

Zapis JSON
{
  "baseHourlyRate": number,
  "hourlyRateShiftDifferentials": {
    string: number,
    ...
  },
  "overtimePeriods": [
    {
      object (OvertimePeriod)
    }
  ]
}
Pola
baseHourlyRate

number

Wynagrodzenie za pracę poza godzinami pracy. Jeśli pracowników ma zastosowanie wiele stawek, różnice stawek są stosowane względem tej podstawowej stawki godzinowej. Jeśli istnieje wiele stawek, podstawowa stawka godzinowa powinna być wartością minimalną z nich.

hourlyRateShiftDifferentials

map (key: string, value: number)

Różnica stawek godzinowych, płatna dodatkowo: baseHourlyRate. Jeśli na przykład podstawowa stawka godzinowa wynosi 30 zł/godz., „shift_1” jest wypłacana według stawki 40 USD/godz. oraz „shift_2”, stawka wynosi 45 USD/godz., wówczas format proto wygląda tak: baseHourlyRate: 30 hourlyRateShiftDifferentials {key: "shift_1" value: 10} hourlyRateShiftDifferentials {key: "shift_2" value: 15}.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

overtimePeriods[]

object (OvertimePeriod)

Lista wszystkich okresów, dla których należy obliczyć nadgodziny. Te okresy nie mogą się nakładać.

OvertimePeriod

Stały i regularnie cykliczny okres (zwykle 168 godzin lub 7 kolejnych okresów 24-godzinnych), który służy do określenia wynagrodzenia za nadgodziny. Każdy okres ma swój mnożnik (np. 1,5) w stosunku do baseHourlyRate oraz limitu liczby godzin, które są uważane za zwykłą pracę (bez dodatkowych godzin). Każda zmiana, która pokrywa się z przedziałami czasu startDateTime (włącznie) i endDateTime (wyłącznie) jest wliczana do łącznej liczby przepracowanych godzin w tym okresie. Jeśli częściowo się pokrywają, zliczane są tylko pokrywające się godziny.

Zapis JSON
{
  "overtimeMultiplier": number,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "maximumRegularHours": number
}
Pola
overtimeMultiplier

number

Mnożnik służący do obliczania stawki godzinowej (musi być większa lub równa 1,0). Stawka godzinowa jest zwykle obliczana według wzoru: baseHourlyRate * overtimeMultiplier. Jeśli w polu hourlyRateShiftDifferentials podano kilka współczynników, rozwiązanie to szacuje współczynnik godzinowy w czasie za pomocą prostej średniej wartości, które miały zastosowanie w danym okresie. Uwaga: przepisy obowiązujące w różnych krajach mogą wymagać innego obliczenia wynagrodzenia za czas pracy. Rozwiązanie określa w przybliżeniu wynagrodzenia w czasie, aby zminimalizować całkowite koszty łączne lub osiągnąć budżet. Nie jest jednak narzędziem do obliczania wynagrodzenia.

startDateTime

object (DateTime)

Godzina rozpoczęcia okresu w dogrywce. Jeśli zmiana pokrywa się w tym czasie, jej godziny są liczone od startDateTime.

endDateTime

object (DateTime)

Godzina zakończenia w dogrywce. Jeśli w tym czasie ta zmiana obejmuje czas, jego godziny są liczone maksymalnie do endDateTime.

maximumRegularHours

number

Maksymalna liczba godzin pracy, które są wypłacane według standardowej stawki (poza nadgodzinami). Ta ilość musi być dodatnia.

Shift

Zmiana określa przedział czasu, w którym pracownicy mogą pracować.

Zapis JSON
{
  "id": string,
  "locationId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "breakRules": [
    {
      object (BreakRule)
    }
  ]
}
Pola
id

string

Unikalny identyfikator przypisany do tej zmiany.

locationId

string

Identyfikator lokalizacji, w której została przeprowadzona ta zmiana. To pole może być puste.

startDateTime

object (DateTime)

Godzina rozpoczęcia zmiany (włącznie).

endDateTime

object (DateTime)

Godzina zakończenia zmiany (bez jej uwzględnienia). Obecnie rozwiązanie dopuszcza tylko zmiany trwające mniej niż 24 godziny.

breakRules[]

object (BreakRule)

Lista reguł przerw, które występują podczas zmiany. Pracownicy na tej zmianie otrzymują break_rule przerwy, podczas której nie zaspokajają zapotrzebowania na funkcję, którą pełnią. Każde okno czasowe BreakRule musi być w pełni uwzględnione w przedziale czasowym tej zmiany.

BreakRule

Reguła określająca, kiedy przerwa może się rozpocząć w ramach zmiany i jak długo trwa. Lista wszystkich możliwych przerw, które zostaną uwzględnione, jest określana w przyrostach co ruleIncrementMinutes. Jeśli na przykład reguła przerwy modeluje 30-minutową przerwę, która może zaczynać się od 10:00 do 11:00, a przyrost reguły wynosi 20 minut, lista branych pod uwagę przerw to: [10:00, 10:30], [10:20, 10:50], [10:40], 11.

Zapis JSON
{
  "earliestStartTime": {
    object (DateTime)
  },
  "latestStartTime": {
    object (DateTime)
  },
  "durationMinutes": integer,
  "ruleIncrementMinutes": integer
}
Pola
earliestStartTime

object (DateTime)

Najwcześniejszy czas rozpoczęcia przerwy (włącznie). Można ustawić tylko hours i minutes.

latestStartTime

object (DateTime)

Ostatni czas rozpoczęcia przerwy (włącznie). Można ustawić tylko hours i minutes.

durationMinutes

integer

Czas trwania przerwy w minutach.

ruleIncrementMinutes

integer

[Opcjonalnie] Zwiększenie czasu w minutach w przypadku wszystkich przerw, których może dotyczyć ta reguła przerwy. Jeśli nie jest skonfigurowana, domyślna wartość to durationMinutes.

CoverageRequirement

Wymaganie dotyczące zakresu ochrony określa liczbę pracowników wymaganych na danych stanowiskach lub umiejętności w określonym przedziale czasu i lokalizacji. Przedziały typu data i godzina w konkretnej lokalizacji nie mogą się nakładać. Zamiast przedziału czasu i lokalizacji możesz też podać listę identyfikatorów zmian. Tylko pracownicy, do których można przypisać daną funkcję (lub którzy mają określone umiejętności), mogą spełnić to wymaganie.

W przypadku danej roli lub umiejętności wymaganie ochrony jest spełnione, gdy w danym momencie w danym okresie (lub na każdą zmianę w shiftIds) pracuje co najmniej targetEmployeeCount osób. Z kolei wymóg dotyczący zakresu ochrony jest naruszany, jeśli w dowolnym momencie w danym przedziale czasu (lub dowolnej zmianie w wyniku shiftIds) liczba pracowników pracujących w danym okresie jest mniejsza niż targetEmployeeCount. Więcej pracowników niż targetEmployeeCount nadal spełnia ten wymóg, ale liczba pracowników ogranicza liczbę osób, które je rozwiązały.

Zapis JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "locationId": string,
  "shiftIds": [
    string
  ],
  "roleRequirements": [
    {
      object (RoleRequirement)
    }
  ],
  "skillRequirements": [
    {
      object (SkillRequirement)
    }
  ]
}
Pola
startDateTime

object (DateTime)

Godzina rozpoczęcia wymagania dotyczącego ochrony (włącznie). Jeśli jest ustawione, pole shiftIds musi być puste.

endDateTime

object (DateTime)

Godzina zakończenia wymogu ubezpieczenia (z wyłączeniem). Jeśli jest ustawione, pole shiftIds musi być puste.

locationId

string

Lokalizacja, w której pracownicy są potrzebni. Pole shiftIds nie jest puste. To pole musi być puste.

shiftIds[]

string

Jeśli wymagania dotyczące roli i umiejętności są skonfigurowane, są stosowane indywidualnie do każdego identyfikatora zmiany na tej liście. Jeśli identyfikatory shiftId nie są puste, pola startDateTime, endDateTime i locationId muszą być puste.

roleRequirements[]

object (RoleRequirement)

Wymagana liczba pracowników, którzy zostaną przypisani do określonych ról w danym przedziale czasu. Dla każdego identyfikatora roli należy podać maksymalnie 1 role_requirement. Domyślny poziom priorytetu każdego z wymagań to PRIORITY_MANDATORY. Te ograniczenia są naruszane, jeśli w dowolnym momencie w danym okresie przypisano mniej niż targetEmployeeCount liczbę pracowników do określonych ról.

skillRequirements[]

object (SkillRequirement)

Wymagana liczba pracowników o określonych umiejętnościach, które są przypisane do zmian w danym przedziale czasu. Dla każdego identyfikatora umiejętności należy podać maksymalnie 1 skill_requirement. Domyślny poziom priorytetu każdego z wymagań to PRIORITY_LOW. Te ograniczenia są naruszane, jeśli w dowolnym momencie w danym okresie nauki posiadało mniej niż targetEmployeeCount pracowników.

RoleRequirement

Wymagana liczba pracowników, którzy zostaną przypisani do określonej roli w danym okresie.

Zapis JSON
{
  "roleId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
Pola
roleId

string

Identyfikator roli dla wymagania.

targetEmployeeCount

integer

Oczekiwana liczba pracowników przypisanych do danej roli w przedziale czasu.

priority

enum (Priority)

Poziom priorytetu tego ograniczenia wymaganego. Domyślny priorytet wszystkich ograniczeń zasobów to PRIORITY_MANDATORY.

SkillRequirement

Wymagana liczba pracowników, którzy pracują w danym okresie i posiadają określone umiejętności.

Zapis JSON
{
  "skillId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
Pola
skillId

string

Identyfikator umiejętności, który spełnia wymagania.

targetEmployeeCount

integer

Pożądana liczba pracowników o określonych umiejętnościach pracujących w danym okresie.

priority

enum (Priority)

Poziom priorytetu tego ograniczenia wymaganego. Domyślny priorytet wszystkich ograniczeń zasobów to PRIORITY_LOW.

BudgetRequirement

Wymagania dotyczące budżetu w danym przedziale czasu.

Zapis JSON
{
  "totalBudget": number,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "priority": enum (Priority)
}
Pola
totalBudget

number

Łączny budżet w danym przedziale czasu. Jeśli priorytet wynosi PRIORITY_MANDATORY, należy podać łączny budżet.

Jeśli zasada totalBudget nie jest skonfigurowana, łączny koszt harmonogramu jest zminimalizowany zgodnie z określoną wartością priority. Jeśli na przykład wartość priority budżetu wynosi PRIORITY_MEDIUM, rozwiązanie zminimalizuje koszty przed ograniczeniem wszelkich naruszeń ograniczeń o priorytecie PRIORITY_LOW.

startDateTime

object (DateTime)

Godzina rozpoczęcia obowiązywania tego budżetu. Jeśli godzina rozpoczęcia nie zostanie określona, jest ustawiona na najwcześniejszą godzinę rozpoczęcia wszystkich danych zmian.

endDateTime

object (DateTime)

Godzina zakończenia obowiązywania tego budżetu. Jeśli nie podasz godziny zakończenia, zostanie ustawiona najpóźniejsza godzina zakończenia wszystkich zmian.

priority

enum (Priority)

Poziom priorytetu spełnienia wymagań dotyczących budżetu w określonym przedziale czasu. Domyślny priorytet to PRIORITY_LOW. Jeśli priorytet jest ustawiony na PRIORITY_MANDATORY, musisz ustawić totalBudget.

Pamiętaj, że jeśli ten priorytet jest wyższy niż inne priorytety ograniczeń, a zasada totalBudget jest ograniczona, wynikowy harmonogram może znacznie naruszać zarówno ograniczenia pracowników, jak i wymagania związane z zasięgiem.

ShiftAssignment

Pracownik na potrzeby zmiany roli.

Zapis JSON
{
  "employeeId": string,
  "shiftId": string,
  "roleId": string,
  "breaks": [
    {
      object (Break)
    }
  ]
}
Pola
employeeId

string

Przypisywany identyfikator pracownika.

shiftId

string

Identyfikator zmiany przypisany do pracownika.

roleId

string

Identyfikator roli, do której przypisany jest pracownik na potrzeby tej zmiany.

breaks[]

object (Break)

Lista przerw w ramach tego przypisania zmiany.

Przerwa

Przedział czasu, w którym pracownik przerywa pracę podczas zmiany.

Zapis JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "durationMinutes": integer
}
Pola
startDateTime

object (DateTime)

Czas rozpoczęcia przerwy.

durationMinutes

integer

Czas trwania przerwy w minutach.

SolutionStatus

Stan rozwiązania (tj. harmonogramu) podany w odpowiedzi rozwiązania.

Wartości w polu enum
SOLUTION_STATUS_UNSPECIFIED Nieokreślony stan odpowiedzi.
FEASIBLE Zwrócony harmonogram jest wykonalny, ale może nie być optymalny.
OPTIMAL Zwrócony harmonogram jest optymalny.
INFEASIBLE Dla podanych ograniczeń nie ma możliwego harmonogramu. Rozwiązanie może zwrócić tę wartość, jeśli nie można spełnić dowolnego podzbioru ograniczeń o priorytecie PRIORITY_MANDATORY.
NOT_SOLVED Nie znaleziono harmonogramu.
NOT_SOLVED_DEADLINE_EXCEEDED Nie znaleziono harmonogramu w podanym limicie czasu.