Свойства складов

Склад — это точка, в которой начинаются и могут заканчиваться все маршруты. Если у вас есть курьеры, которые должны стартовать не со склада, ознакомьтесь с инструкцией Старт автомобиля не со склада.

Для определения складов используется поле запроса depot/depots.

Идентификатор склада

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

Внимание

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

Дополнительно вы можете указать числовой или строковый идентификатор склада из вашей учетной системы в поле ref — этот идентификатор будет отображаться в полученном решении в разделе Планирование. Кроме того, вы можете указать название склада в поле title и описать склад в поле description — эти поля не будут отображаться в интерфейсе, но будут переданы в решении.

Координаты склада

Маршрутизация поддерживает определение местоположения склада в виде географических координат в системе WGS84, соответствующих точке адреса склада. Координаты указываются в поле point в виде пары значений: point.lat (широта) и point.lon (долгота).

Внимание

Координаты 0,0 не будут обработаны корректно и приведут к ошибке при запросе Маршрутизации.

При планировании через Excel можно указать только адрес склада в поле address, в этом случае будет выполнено геокодирование — определение координат по указанному адресу. Подробнее см. в разделе Карта.

Тип склада

По умолчанию все склады имеют тип depot. Но могут использоваться промежуточные площадки, на которых осуществляется перевалка, переконсолидация или догрузка товара. У таких складов поле type устанавливается в значение crossdock. Работа с такими складами описана в сценариях кросс-докинга.

Временное окно склада

Склад, определенный в запросе, должен иметь временное окно, задающее часы работы склада.

Для определения времени работы склада используется поле time_window.

Временное окно определяется в одном из следующих форматов:

  • 07:00:00 – 23:00:00 — временное окно начинается в 7 утра и заканчивается в 23 вечера текущего дня;

  • 2019-10-10T07:00:00+03:00/2019-10-10T23:00:00+03:00 — временное окно на конкретную дату и часовой пояс (читается как YYYY-MM-DDThh:mm:ss±hh:mm).

В зависимости от типа временного окна автомобили, которые должны закончить маршрут на складе, могут возвращаться строго до конца времени работы склада (жесткое временное окно) или нарушать данный лимит (мягкое временное окно). Подробнее функциональность описана в разделе Жесткие и мягкие окна.

Для управления жесткими временными окнами используется поле hard_window:

  • true — временное окно будет жестким.

  • false — временное окно будет мягким.

В случае определения мягкого временного окна можно дополнительно задать штрафы за его нарушение. Подробнее функциональность описана в разделе Штрафы за нарушение временного окна склада.

Чтобы ограничить допустимые нарушения основного окна, можно задать жесткое окно вокруг мягкого.

Примечание

Поля hard_time_window и hard_window являются взаимоисключающими.

Старт со склада также возможен до начала временного окна. Подробно этот кейс рассмотрен в разделе Гибкое время старта.

Примечание

При указании временного окна склада требуется учитывать кейсы, когда автомобилю необходимо возвращаться на склад. Если автомобиль не успевает вернуться на склад и окно склада жесткое, часть заказов может остаться недоставленной. Если есть сомнения, лучше указывать время работы склада на все время планирования и делать его гибким.

Несколько временных окон склада

При необходимости для склада можно указать несколько временных окон. Это используется в следующих ситуациях:

  • Есть перерыв в работе склада. Например, перерыв на обед.

  • Если курьер выполняет многодневный маршрут. Например, заказы нужно доставить в указанное время, но в один из дней доставки, а в работе склада есть перерыв, который может повлиять на загрузку заказов.

  • Если курьеру планируются заказы на несколько дней, и какие-то заказы можно забрать или доставить только в определенный день.

В поле time_windows указывается массив элементов. Каждый элемент этого массива содержит обязательное поле time_window. Заказы будут загружены на складе в одно из возможных окон, и в поле used_time_window ответа API будет содержаться информация об использованном временном окне.

Внимание

Окна time_window не должны пересекаться между собой. Например, недопустимо одновременно указывать окна с 9:00 до 12:00 и с 11:00 до 14:00.

Для каждого временного окна склада может быть задано дополнительное (внешнее) жесткое окно. Оно используется, чтобы ограничить допустимое время нарушения основного окна, и определяется с помощью параметра hard_time_window.

Пример

Курьер доставляет 10 заказов, часть из которых необходимо доставить в первой половине дня, а часть во второй. Склад работает с перерывом на обед с 13 до 14. Курьер доставляет часть заказов и возвращается на дозагрузку во время перерыва в работе склада. После окончания перерыва загружает и доставляет оставшиеся заказы.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Окна для загрузки, разгрузки и дозагрузки

Помимо временных окон, задающих часы работы, для склада можно задать дополнительные окна, ограничивающие отдельные операции:

  • time_windows_loading — окна загрузки — определяют время, когда курьер посещает склад первый раз за смену.
  • time_windows_unloading — окна разгрузки — определяют время, когда курьер посещает склад последний раз за смену.
  • time_windows_refilling — окна дозагрузки — определяют время, когда курьер приезжает на склад для дозагрузки. Это может быть основной склад или промежуточный.

Примечание

Если какое-то дополнительное окно не задано, для соответствующей операции используется общее временное окно склада.

Для склада может быть задано несколько дополнительных окон каждого вида. В этом случае они задаются с помощью массива time_windows.

Для дополнительного окна может быть указан один из параметров:

  • hard_window — определяет, каким является дополнительное окно: жестким или мягким (задается для всего массива дополнительных окон каждого типа).

    • При наличии жесткого дополнительного окна в маршрут могут добавляться ожидания, а при невозможности выполнить условия часть заказов может попасть в список нераспределенных.
    • При наличии мягкого дополнительного окна обязательно должен быть задан хотя бы один штраф, который будет начисляться при нарушении.
  • hard_time_window — задает жесткое временное окно вокруг мягкого (задается отдельно для каждого параметра time_window).

Пример

У склада есть общее временное окно 7:00–21:00. В дополнение к нему заданы окна:

  • на загрузку — жесткое окно 7:00–9:00;
  • на дозагрузку — мягкие окна 11:00–12:00 и 14:00–15:00;
  • на разгрузку — жесткое окно 17:00–20:00 вокруг мягкого 18:00–19:00.

У автомобиля присутствует ограничение по весу — максимум 200 кг. Поскольку все заказы тяжелее 100 кг, курьер каждый раз возвращается на склад для дозагрузки.

В этих условиях оптимальный маршрут построен следующим образом:

  • В первый раз за смену курьер загружает заказ 1 и укладывается в окно загрузки. После доставки заказа он возвращается на склад как раз к началу первого окна дозагрузки.
  • Во втором рейсе курьер забирает со склада заказ 2, отвозит его, снова возвращается на склад и ожидает 44 минуты начала второго окна дозагрузки.
  • В третьем рейсе курьер забирает со склада заказ 3, отвозит его и забирает заказ 4.
  • В конце смены курьер возвращается на склад, чтобы разгрузить заказ 4 — он опаздывает на 33 минуты относительно мягкого окна разгрузки, но укладывается в жесткое.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Включение и выключение опций кучности

Опция depot.use_in_proximity точечно отключает options.proximity_factor и options.global_proximity_factor, которые отвечают за кучность маршрутов.

По умолчанию depot.use_in_proximity = true, то есть опции кучности действуют на все склады. Подробнее см. в разделе Кучные маршруты.

Сервисное время на складе

Склад в Маршрутизации поддерживает определение общего сервисного времени, которое любой автомобиль или курьер должен провести на складе. Общее сервисное время на складе может использоваться, чтобы учитывать время на оформление документов для курьера или чтобы усреднить время на загрузку автомобиля:

  • depot.preliminary_service_duration_s — время перед началом каждого рейса до готовности заказа на складе;

  • depot.service_duration_s — время перед началом каждого рейса после готовности заказа на складе;

  • depot.load_service_duration_s — время на загрузку в автомобиль заказов типа delivery. Прибавляется ко времени обслуживания склада, если на нем загружается хотя бы один delivery заказ;

  • depot.unload_service_duration_s — время на выгрузку из автомобиля заказов типа pickup. Прибавляется ко времени обслуживания склада, если на нем выгружается хотя бы один pickup заказ;

  • depot.finish_service_duration_s — время перед завершением каждого рейса.

Если время готовности заказа не используется, то нет необходимости указывать preliminary_service_duration_s — достаточно указать service_duration_s как суммарное время.

Примечание

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

Пример 1

Зададим сервисное время в 10 минут в начале и в конце любого маршрута на складе, который начинает работу в 07:00.

В построенном маршруте время прибытия на первый заказ составит 07:28, при том что поездка до первого заказа занимает 18 минут. Таким образом, автомобиль провел на складе 10 минут перед началом поездки.

В конце маршрута время прибытия на склад составляет 07:53. К этому времени прибавляется 10 минут сервисного времени, что отражено в метрике общей длительности всего маршрута.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

В примере 3 заказа, и каждый заказ занимает 100% вместимости автомобиля, поэтому планируется 3 отдельных рейса. Видно, что время depot.service_duration_s и depot.finish_service_duration_s добавляется соответственно в начале и в конце каждого рейса.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 3

Заказ будет готов к отгрузке со склада в 08:00:00 (location.depot_ready_time). До готовности заказа необходимо выполнить предварительные операции на складе в течение 30 минут (depot.preliminary_service_duration_s). С момента готовности заказа на обслуживание будет затрачено 10 минут (depot.service_duration_s). Итого общее сервисное время — с 07:30:00 до 08:10:00.

Запрос API (JSON)Ответ APIОткрыть на карте

Гибкое время старта

По умолчанию курьеры начинают движение со склада сразу после его открытия (или начала смены курьера) и окончания загрузки заказов. При этом значение параметра depot.flexible_start_time указано false.

Если указать значение параметра true — старт со склада будет планироваться не с границы начала временного окна склада или смены курьера, а позже.

Пример 1

Смена курьера начинается в 09:00, склад начинает работать с 08:30. Параметр depot.flexible_start_time указан как false. При планировании будет учитываться, что любой полученный маршрут у этого курьера должен начинаться в 09:00, даже если окно первого заказа с 13:00 до 14:00, а курьеру со склада до заказа ехать всего 15 минут.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

Смена курьера начинается в 09:00, склад начинает работать с 08:30. Параметр depot.flexible_start_time указан как true. Если окно первого заказа будет с 13:00 до 14:00, а курьеру со склада до заказа ехать всего 15 минут, планировщик может спланировать курьеру выезд со склада не в 09:00, а позже (например, в 12:30), если не будут нарушены другие ограничения.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Доставка с одного из нескольких складов

Иногда товар находится на нескольких складах, и при планировании нужно выбрать, с какого склада выполнять доставку. Если известно, с каких складов должен отгружаться определенный заказ, используйте параметр location.depot_id. В значении параметра укажите массив из id этих складов.

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

Пример 1

Даны два автомобиля, два склада и три заказа.

Автомобили стартуют с определенных складов:

  • Первый автомобиль — со склада 1.

  • Второй автомобиль — со склада 2.

В результате планирования:

  1. Первый автомобиль обслуживает заказ 3 со склада 1.
  2. Второй автомобиль обслуживает заказы 1 и 2 со склада 2.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

То же, что в примере 1, но заказы привязаны к складам:

  • Заказ 1 — к складам 1 и 2.
  • Заказ 2 — к складу 1.
  • Заказ 3 — к складу 2.

В результате планирования:

  1. Первый автомобиль обслуживает заказы 1 и 2 со склада 1.
  2. Второй автомобиль обслуживает заказ 3 со склада 2 .

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пропускная способность склада

Пропускная способность склада зависит как от скорости погрузки заказов в автомобили, так и от скорости подготовки заказов к погрузке (например, расфасовки или упаковки). Часто процессы подготовки и погрузки заказов ведутся параллельно — пока подготовленные ранее заказы загружаются в автомобили, следующая партия заказов готовится к погрузке. При этом скорость подготовки и скорость погрузки заказов могут не совпадать (например, подготовка заказа занимает в среднем 5 минут, а погрузка — 1,5 минуты). Временные окна процессов подготовки и погрузки заказов также могут не совпадать (например, подготовка заказов начинается заранее).

Для склада можно задать пропускную способность отдельно по каждому из этих процессов.

Правильно указанная пропускная способность позволит спланировать реалистичное время выезда автомобилей со склада.

Скорость загрузки автомобилей на складе

Для ограничения скорости загрузки используется поле запроса depot.throughput. Можно задать одно из ограничений:

  • throughput.kg_per_hour — пропускная способность по погрузке в кг/час;

  • throughput.units_per_hour — пропускная способность по погрузке в единицах/час (паллеты, коробки, кеги);

  • throughput.vehicle_count — пропускная способность по погрузке в автомобилях. Параметр позволяет учитывать наличие у склада свободных мест для погрузки. У такого места может одновременно стоять только один автомобиль.

Пропускная способность склада может изменяться в зависимости от времени суток (например, если в часы пик работает больше погрузчиков). Для каждого временного интервала N нужно задать пару полей, которые определяют:

  • временное окно — throughput.kg_per_hour.N.time_window, throughput.units_per_hour.N.time_window или throughput.vehicle_count.N.time_window;
  • пропускную способность в этом временном окне — throughput.kg_per_hour.N.value, throughput.units_per_hour.N.value или throughput.vehicle_count.N.value.

При задании значений этих параметров следует учитывать ограничения:

  • Окна пропускной способности не должны пересекаться друг с другом.
  • Если окна пропускной способности в сумме не покрывают время работы склада, то в промежутках между окнами пропускная способность считается равной 0.
  • Окна пропускной способности могут выходить за границы времени работы склада, чтобы учитывать ситуации, когда автомобиль приезжает до начала работы или после завершения работы склада.

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

Если время погрузки не зависит от характеристик заказов, а определяется исключительно складом и автомобилем, используйте поле vehicle.depot_extra_service_duration_s. В поле необходимо указать время в секундах, которое понадобится для загрузки сверх времени обслуживания самого склада. Подробнее об этом параметре см. в разделе Сервисное время погрузки на складе.

Внимание

Чтобы при планировании учесть пропускную способность склада:

При нарушении пропускной способности склада по погрузке начисляются штрафы:

  • depot.penalty.throughput.fixed — за каждый случай нарушения;

  • depot.penalty.throughput.kg — за каждый килограмм превышения относительно ограничения throughput.kg_per_hour;

  • depot.penalty.throughput.unit — за каждую грузовую единицу превышения относительно ограничения throughput.units_per_hour;

  • depot.penalty.throughput.vehicle — за нарушение количества автомобилей при загрузке или разгрузке.

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

При раннем приезде или опоздании автомобиля на склад начисляются штрафы и за нарушение временного окна склада, и за превышение количества автомобилей при загрузке или разгрузке depot.penalty.throughput.vehicle. Чтобы избежать двойного штрафования, задайте окна пропускной способности так, чтобы они выходили за границы времени работы склада и учитывали возможные ранние приезды и опоздания автомобилей.

Пример 1

В примере 20 заказов. Суммарное количество грузовых единиц — 1170. Сервисное время на складе — 1 час. Ограничение пропускной способности не задано, поэтому в решении все курьеры стартуют примерно в одно время с расчетом на то, что все заказы можно загрузить одновременно.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 2

То же, что и в примере 1, но для склада задано ограничение для одновременной загрузки автомобилей при помощи параметра throughput.vehicle_count = 3. Тогда на складе одновременно загружаются не более 3 автомобилей: сначала автомобили 2, 3 и 4, а после автомобиль 1.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 3

То же, что и в примере 1, но для склада задано ограничение для одновременной загрузки автомобилей при помощи параметра throughput.vehicle_count. При этом в разные промежутки времени пропускная способность склада разная:

  • 06:00 — 07:30 — 2 автомобиля;

  • 07:30 — 22:00 — 1 автомобиль.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Пример 4

То же, что и в примере 1, но у склада добавлено ограничение пропускной способности по погрузке — throughput.units_per_hour = 300, т.е. за час можно загрузить лишь 300 единиц. Это позволило реалистично распределить загрузку заказов. Теперь курьеры прибывают на склад, дождавшись окончания загрузки предыдущего курьера.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Скорость подготовки заказов к погрузке

Для ограничения скорости подготовки заказов к погрузке используется поле depot.package_throughput. Можно задать одно из ограничений:

  • package_throughput.kg_per_hour — пропускная способность по подготовке к погрузке в кг/час;

  • package_throughput.units_per_hour — максимальное количество грузовых единиц, которое можно подготовить к погрузке на складе за один час.

Пропускная способность по подготовке к погрузке может изменяться в зависимости от времени суток (например, если в часы пик на упаковке и фасовке занято больше сотрудников склада). Для каждого временного интервала N нужно задать пару полей, которые определяют:

  • временное окно — package_throughput.kg_per_hour.N.time_window или package_throughput.units_per_hour.N.time_window;
  • пропускную способность в этом временном окне — package_throughput.kg_per_hour.N.value или package_throughput.units_per_hour.N.value.

При задании значений этих параметров следует учитывать ограничения:

  • Окна пропускной способности не должны пересекаться друг с другом.
  • Если окна пропускной способности в сумме не покрывают время работы склада, то в промежутках между окнами пропускная способность считается равной 0.
  • Окна пропускной способности могут выходить за границы времени работы склада, чтобы учитывать ситуации, когда автомобиль приезжает до начала работы или после завершения работы склада.

Если при планировании пропускная способность склада по подготовке к погрузке превышена, за это начисляются штрафы:

  • depot.penalty.package_throughput.fixed — за каждый случай нарушения;

  • depot.penalty.package_throughput.kg — за каждый килограмм превышения относительно ограничения package_throughput.kg_per_hour;

  • depot.penalty.package_throughput.unit — за каждую грузовую единицу превышения относительно ограничения package_throughput.unit_per_hour.

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

Пример 5

То же, что в примере 1, но задано ограничение пропускной способности по подготовке заказов к погрузке: с 6 до 10 часов утра на складе можно упаковать за час 180 единиц, а с 10  утра до 22 часов вечера — 120 единиц. За нарушение пропускной способности при подготовке заказов к погрузке назначен штраф penalty.package_throughput.unit = 100.

Чтобы своевременно отправить автомобили в рейс, ограничение пропускной способности склада по подготовке заказов к погрузке было нарушено, поэтому начислен штраф total_depot_penalty = 9500.

Пример ExcelЗапрос API (JSON)Ответ APIОткрыть на карте

Штрафы за нарушение временного окна склада

Данный штраф добавляется к общей стоимости маршрута, если автомобиль выезжает со склада раньше временного окна работы склада или возвращается на склад позже временного окна работы склада.

Примечание

Такое поведение возможно только в случае определения мягкого временного окна. Если нарушается жесткое окно, то заказ автоматически помечается как недоставленный и исключается из всех маршрутов.

Штраф за несвоевременный приезд на склад позволяет нарушать временное окно работы склада, если нет возможности загрузить заказы в автомобиль в рамках установленного временного окна.

Для управления своевременностью приезда на склад в Маршрутизации могут использоваться следующие объекты:

  • depot.penalty.early — устанавливает штраф за прибытие на склад раньше временного окна;

  • depot.penalty.late — устанавливает штраф за возвращение на склад позже временного окна;

  • depot.penalty.out_of_time — устанавливает единые штрафы как за раннее прибытие на склад, так и за позднее возвращение.

Если depot.penalty.early и depot.penalty.late не заданы, то используются значения из depot.penalty.out_of_time (то есть early и late работают как переопределение out_of_time).

Каждый объект состоит из двух полей:

  • fixed — фиксированный штраф за факт несвоевременного приезда на склад;

  • minute — штраф за каждую минуту несвоевременного приезда на склад.

Если в depot.penalty.early или depot.penalty.late задано только одно значение (fixed или minute), то второе берется из depot.penalty.out_of_time. Например, может быть задано только depot.penalty.late.fixed. Тогда при опоздании на склад в качестве штрафа за каждую минуту будет использоваться depot.penalty.out_of_time.minute.

Примечание

Вышеперечисленные поля имеют значения по умолчанию, которые рекомендуется использовать в качестве стартовых значений при определении пользовательских приоритетов приезда на склад.

При сомнениях свяжитесь с аналитиками Яндекс Маршрутизации для определения корректных коэффициентов.

Написать в службу поддержки