Всем привет! Меня зовут Станислав Тюленев, я главный инженер по разработке в одной из продуктовых команд Домклик. В этой статье я расскажу, как мы в полтора раза увеличили возможное количество сделок в течение дня, с какими сложностями столкнулись и почему это повлияло на скорость расчёта слотов для записи.
Когда ипотечная сделка доходит до стадии записи клиента в офис, процесс может выглядеть так:
Сотрудник связывается с клиентом, уточняет все пожелания по месту и дате встречи
После ввода предпочтительного места, система предлагает список из 15 ближайших офисов
Система наглядно показывает, в какой день и в каком офисе есть периоды для записи (слоты), с группировкой по временным интервалам — до обеда и после обеда
При выборе конкретного офиса становятся видны все возможные слоты
Сотрудник выбирает подходящий слот и нажимает «Запись»

Рассмотрим, как была устроена система расчёта слотов раньше и какие изменения позволили достичь упомянутых в начале улучшений.
Исходный алгоритм
Раньше мы использовали простой механизм определения сложности сделки, который предполагал всего два варианта длительности встречи: 60 и 120 минут.
Разберём упрощённый расчёт слотов по сотруднику на простом примере. Предположим, выбрана длительность встречи 60 минут.
-
Для начала определяем две реперные точки:
Начало рабочего дня, округлённое до часа в большую сторону, или текущее время округлённое до часа в большую сторону
Конец рабочего дня, округлённый до часа в меньшую сторону
Рассчитываем первый слот, началом которого является первая точка, затем прибавляем длительность встречи, получаем конец периода
Рассчитываем следующий слот, где началом будет конец предыдущего периода
Повторяем третий шаг, пока конец очередного слота не станет меньше или равен концу рабочего дня
Просматриваем полученный список слотов и удаляем те, которые пересекаются с уже существующими активностями
Проделываем эти шаги для каждого сотрудника в офисе, ищем среди них повторяющиеся слоты. В результате получаем уникальный список свободных слотов в офисе на один день. Повторяем этот процесс для каждого дня и офиса.
Алгоритм простой и предсказуемый, так как исключена динамичность длины слота. Это позволяет с высокой вероятностью заполнять образовавшиеся окна между записанными встречами.
Результат: в среднем один сотрудник проводил по четыре сделки в день. Средняя продолжительность одной сделки превышала 90 минут.
Важно пояснить, что не все сотрудники работают восемь часов в день. Наша компания имеет большую разветвлённую сеть офисов, как крупных, так и небольших.

Реформа системы записи: СлотМенеджмент
Процесс оптимизации состоял из нескольких этапов и получил рабочее название «СлотМенеджмент», которое стало для нас нарицательным.
Этап 1: динамическая длительность сделки
Проблема: существующие длительности сделок (60 и 120 минут) часто превышали фактическое время их проведения.
Решение:
Разработали гибкую систему оценки сложности сделки
Определили критерии и описали наборы параметров сделки с соответствующей длительностью
Перенесли их в базу данных, предоставили бизнесу возможность изменять через REST API
Получили варианты от 20 до 120 минут с шагом в 10 минут (при меньшем шаге пришлось бы переписывать весь календарь, уже содержащий сетки, кратные 10, 30 и 60 минутам)
Этап 2: динамическое начало сделки
Проблема: существующий алгоритм нарезки слотов сработал корректно, но не сработали потребители его функциональности.
Обнаружились прописанные в коде фронтенда и бэкенда длительности активностей
Пришлось переписать всё под динамический расчёт и во все события добавить информацию об окончании встречи
Начальный алгоритм изменился незначительно, только длительность стала более гибкой.
Результат: после изменений в календаре стали появляться нежелательные пустые промежутки, в которые сложно запланировать встречи. Если раньше любое свободное окно от 60 минут гарантировало возможность новой записи, то в новом формате эта вероятность существенно снижалась, так как окна получались слишком маленькими.
Этап 3: забиваем календарь по полной
Идея: больше никаких слотов по предсказуемым сеткам. Нужно предлагать слоты, которые идут либо сразу после существующей активности, либо перед следующей. Мы назвали это up/down внутри сегментов: окна между активностями всегда остаются максимально большими.
Сегментом считается окно между реперными точками
Реперными точками являются начало и конец рабочего дня, начало и конец существующих активностей.

Изменяем алгоритм:
Рассчитываем сегменты на основе реперных точек
Рассчитываем up/down-слоты внутри каждого сегмента
Если сегмент по длине равен длительности активности, то слот будет один
Результат: минимизация возможных разрывов в течение дня, в которые невозможно записать ни одну сделку.
Этап 4: итоговый результат
После проведения пилота все гипотезы подтвердились. Средняя заполняемость календаря увеличилась на 30%: вместо четырёх-пяти сделок стали проводить шесть-семь встреч.
С технической частью возникли проблемы. Все алгоритмы писались в наивном стиле, и сразу после релиза время расчёта слотов увеличилось с 1 секунды до 6-7 секунд. Но чуть позже мы это исправили.
С этого момента логика расчёта слотов изменилась: появилось много факторов, которые нужно учитывать при выборе сегментов и расчёте слотов. Перечислю некоторые из них:
«Новички»: система характеристики сотрудников. Из-за неё длительность сделки в одном офисе может отличаться от сотрудника к сотруднику.
-
Подготовка: на иллюстрации с календарём вы могли увидеть два типа 10-минутных активностей — резервы для подготовки и сама подготовка (есть предварительно созданные резервы для того, чтобы можно было заранее подготовиться к сделке, и есть режимы записи с подготовкой и без неё).
При записи ищется любой свободный резерв в Т-3 (в течение трёх дней до записи). Если он отсутствует, то к расчёту слота добавляется 10 минут до самой сделки. Отсюда следует, что комбинаций (длительность слотов, наличие резервов, существующие активности динамической длины) становится настолько много, что их сложно предварительно рассчитать или закешировать.
Разные часовые пояса в выборке офисов: как правило, это пограничные офисы на стыке часовых поясов. Или же слишком большой радиус поиска офисов.
«Налог» на офис: аналогично системе характеристик сотрудников. Но в данном случае добавляется длительность для конкретного офиса.
Межрегиональная запись: запись одной стороны зависимо фильтруется существующей записью второй стороны.
Помимо этого, существуют также переносы сделок, различные типы табелей и десятки условий для определения возможных офисов. Но в это сейчас вдаваться не будем.
Заключение
«СлотМенеджмент» позволил оптимизировать использование времени сотрудников, обеспечив более гибкую и эффективную систему записи, несмотря на увеличение сложности вычислений.