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 для требований к навыкам. Дополнительные сведения см. в перечислении Priority .

roleIds[]

string

Список всех возможных ролей среди сотрудников. У каждого сотрудника должна быть хотя бы одна роль, которую ему можно назначить на смену. Роль относится к конкретному рабочему заданию в течение смены (например, дипломированная медсестра, шеф-повар, официант и т. д.). Когда сотрудника назначают на смену, ему также назначается одна конкретная роль.

skillIds[]

string

Список всех возможных навыков среди сотрудников. Навык означает любую дополнительную квалификацию, которую может иметь сотрудник, не относящуюся к конкретной назначаемой работе (например, сертификаты, знание языков и т. д.). Этот список может быть пустым. Когда сотрудника назначают на смену, он должен обладать всеми навыками, необходимыми для этой смены.

locationIds[]

string

Список всех возможных мест набора смен в графике. Этот список может быть пустым. Указание разных местоположений может быть полезно, например, когда менеджер медсестры хочет запланировать работу нескольких медсестер в разных отделениях больницы или, например, менеджер отеля хочет запланировать сотрудников в нескольких отелях.

budgetRequirements[]

object ( BudgetRequirement )

Спецификация бюджета для задачи планирования. Уровень приоритета по умолчанию для каждого из этих требований — PRIORITY_LOW . Дополнительные сведения см. в перечислении 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 )

Статус возвращенного решения. Если решение не является ВОЗМОЖНЫМ или ОПТИМАЛЬНЫМ, другие поля в этом прототипе могут быть пустыми. Если статус NOT_SOLVED_DEADLINE_EXCEEDED, ограничение по времени было достигнуто без нахождения возможного решения или определения его существования. Запросы могут быть невыполнимыми, если ограничения уровня приоритета ОБЯЗАТЕЛЬНО не могут быть удовлетворены.

shiftAssignments[]

object ( ShiftAssignment )

Список всех заданий. Каждый ShiftAssignment указывает сотрудника, смену, к которой он назначен, и роль, которую ему поручено выполнять в этой смене.

statusMessage

string

Если solutionStatus не является оптимальным, это поле может содержать дополнительную информацию о решателе.

РешитьПараметры

Параметры, управляющие единственным решением задачи планирования смен.

JSON-представление
{
  "timeLimit": string
}
Поля
timeLimit

string ( Duration format)

Максимальное время, которое решатель должен потратить на решение задачи. Если не установлено, по умолчанию 1 минута.

Это значение не является жестким пределом и не учитывает накладные расходы на связь. Ожидаемая задержка решения проблемы может немного превышать это значение.

Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « 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 . Дополнительные сведения см. в перечислении Priority .

resourceConstraints[]

object ( ResourceConstraint )

Любые дополнительные ограничения планирования, не указанные в schedulingConstraints могут быть добавлены сюда в resourceConstraints . ResourceConstraint — это более абстрактное представление ограничения ресурсов для сотрудника. Уровень приоритета по умолчанию для каждого из этих ограничений — PRIORITY_MEDIUM . Дополнительные сведения см. в перечислении Priority .

shiftRequests[]

object ( ShiftRequest )

Список заявок на смену для сотрудника. Запрос может заключаться в назначении или не назначении сотрудника на определенные смены. Любые фиксированные назначения планирования для сотрудника могут быть представлены с помощью ShiftRequest с приоритетом PRIORITY_MANDATORY . Идентификатор смены может появиться не более чем в одном запросе на планирование для этого сотрудника. Уровень приоритета по умолчанию для каждого из этих запросов — PRIORITY_LOW . Дополнительные сведения см. в перечислении Priority .

hourlyContract

object ( HourlyContract )

Контракт, в котором указаны регулярные и сверхурочные почасовые ставки для сотрудника.

Сдвиг предпочтений

Числовое предпочтение для определенного идентификатора смены.

JSON-представление
{
  "shiftId": string,
  "preference": integer
}
Поля
shiftId

string

Идентификатор смены, для которой указано предпочтение.

preference

integer

Более высокие значения предпочтения означают более желательный сдвиг.

Ограничение планирования

Конкретное ограничение планирования для конкретного сотрудника. Указанное ограничение применяется только в течение заданного интервала [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 . Поскольку могут существовать противоречивые ограничения, не всегда возможно удовлетворить каждое ограничение. Таким образом, каждый тип ограничения имеет приоритет (задаваемый пользователем или значение по умолчанию), который информирует решатель об относительной важности всех ограничений, заданных для полного расписания.

Перечисления
PRIORITY_UNSPECIFIED Неизвестный уровень приоритета.
PRIORITY_LOW Самый низкий уровень приоритета. Ограничения с этим приоритетом менее важны, чем другие ограничения. Они в первую очередь рассматриваются на предмет нарушения, если невозможно найти осуществимое решение.
PRIORITY_MEDIUM Уровень приоритета средний. Ограничения с этим приоритетом более важны, чем ограничения с приоритетом PRIORITY_LOW , но менее важны, чем ограничения с приоритетом PRIORITY_HIGH . Если допустимое решение не может быть найдено после ослабления всех ограничений с приоритетом PRIORITY_LOW , то следующими на предмет нарушения считаются ограничения с приоритетом PRIORITY_MEDIUM .
PRIORITY_HIGH Самый высокий уровень приоритета. Ограничения с этим уровнем приоритета являются наиболее важными. Их нарушение следует рассматривать в последнюю очередь, если допустимое решение не может быть найдено после ослабления ограничений более низких уровней приоритета.
PRIORITY_MANDATORY Уровень приоритета, который представляет собой то, что не может быть нарушено решателем. Если решатель возвращает SolutionStatus.INFEASIBLE , это может быть связано со слишком большим количеством ограничений PRIORITY_MANDATORY .

РесурсОграничение

Общее ограничение, ограничивающее количество определенного «ресурса», используемого сотрудником. Это абстрактная версия более конкретного 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

Идентификаторы смены запроса на планирование.

type

enum ( WorkStatus )

Тип запроса, например, может ли запрос быть назначен или не назначен набору смен.

Рабочий статус

Независимо от того, работает сотрудник или нет.

Перечисления
WORK_STATUS_UNSPECIFIED Неизвестный статус работы.
STATUS_WORK Статус, представляющий работающего сотрудника.
STATUS_NOT_WORK Статус, представляющий неработающего сотрудника.

Почасовой контракт

Указывает базовую почасовую ставку, разницу в ставках и множители сверхурочной работы для определения компенсации сотруднику. Обратите внимание, что правила в разных местах могут требовать разных расчетов компенсации за сверхурочную работу. Решающая программа аппроксимирует компенсацию за сверхурочную работу, чтобы либо минимизировать приблизительную общую стоимость, либо уложиться в бюджет (см. 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 )

Список всех периодов, для которых необходимо рассчитать сверхурочную работу. Эти периоды не должны пересекаться.

Сверхурочная работаПериод

Фиксированный и регулярно повторяющийся период (обычно 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

Максимальное количество рабочих часов, оплачиваемых по обычной ставке (без сверхурочной работы). Эта величина должна быть положительной.

Сдвиг

Смена определяет фиксированный временной интервал, в течение которого сотрудники могут работать.

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:50], [10:40, 11:10], [11:00, 11:30].

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 .

Требование к покрытию

Требование покрытия определяет количество сотрудников, необходимых для выполнения набора ролей и/или навыков в течение определенного периода времени и в данном месте. Интервалы DateTime в определенном месте не могут перекрываться. Альтернативно, вместо временного окна и местоположения может быть предоставлен список идентификаторов смен. Этому требованию могут соответствовать только сотрудники, которым может быть назначена конкретная роль (или которые обладают определенными навыками).

Для данной роли и/или навыка требование покрытия выполняется, когда по крайней мере количество сотрудников 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

Если этот параметр установлен, требования к роли и навыкам применяются индивидуально к каждому идентификатору смены в этом списке. ЕслиshiftIds непусты, то startDateTime , endDateTime и locationId должны быть пустыми.

roleRequirements[]

object ( RoleRequirement )

Требуемое количество сотрудников, которые будут назначены на указанные роли в течение временного окна. Для каждого идентификатора роли должно быть указано не более одного role_requirement . Уровень приоритета по умолчанию для каждого из требований — PRIORITY_MANDATORY . Эти ограничения нарушаются, если в любой момент временного окна указанным ролям назначено меньшее количество сотрудников, чем targetEmployeeCount .

skillRequirements[]

object ( SkillRequirement )

Требуемое количество сотрудников с указанными навыками, назначенных на смены в течение временного окна. Для каждого идентификатора навыка должно быть указано не более одного skill_requirement . Уровень приоритета по умолчанию для каждого из требований — PRIORITY_LOW . Эти ограничения нарушаются, если количество сотрудников, обладающих заданными навыками, в любой момент временного окна меньше, чем targetEmployeeCount .

РольТребование

Требуемое количество сотрудников, которые будут назначены на указанную роль в течение временного окна.

JSON-представление
{
  "roleId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
Поля
roleId

string

Идентификатор роли для требования.

targetEmployeeCount

integer

Желаемое количество сотрудников, назначенных на эту роль в течение временного окна.

priority

enum ( Priority )

Уровень приоритета для этого ограничения требования. Приоритет по умолчанию для всех ограничений ресурсов — PRIORITY_MANDATORY .

Требование к навыку

Необходимое количество сотрудников, работающих в течение определенного временного окна и обладающих указанными навыками.

JSON-представление
{
  "skillId": string,
  "targetEmployeeCount": integer,
  "priority": enum (Priority)
}
Поля
skillId

string

Идентификатор навыка для требования.

targetEmployeeCount

integer

Желаемое количество сотрудников с заданной квалификацией, работающих в течение определенного временного окна.

priority

enum ( Priority )

Уровень приоритета для этого ограничения требования. Приоритет по умолчанию для всех ограничений ресурсов — PRIORITY_LOW .

Требование к бюджету

Бюджетные требования на заданный интервал.

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 является жестким, то результирующее расписание может существенно нарушать как ограничения сотрудников, так и требования к покрытию.

Назначение смены

Сотрудник, которому предстоит сменить роль.

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

Продолжительность перерыва в минутах.

Статус решения

Статус решения (т. е. расписания) указывается в ответе решателя.

Перечисления
SOLUTION_STATUS_UNSPECIFIED Неопределенный статус ответа.
FEASIBLE Возвращенное расписание возможно, но может быть неоптимальным.
OPTIMAL Возвращенный график является оптимальным.
INFEASIBLE Для данных ограничений не существует приемлемого расписания. Решающая программа может вернуть это значение, если какое-либо подмножество ограничений с уровнем приоритета PRIORITY_MANDATORY не может быть удовлетворено.
NOT_SOLVED Расписание не найдено.
NOT_SOLVED_DEADLINE_EXCEEDED В указанный срок расписание не найдено.