Привет! Меня зовут Алексей Шихов, я руковожу командой разработчиков CarPrice в Кирове. Сейчас Carprice занимает второе место в России по продажам автомобилей на вторичном рынке, и почти все машины, выкупленные в Москве, проходят через один огромный центральный хаб, откуда их забирают покупатели (дилеры) или отправляют в регионы на автовозах. На складе всегда есть как минимум 700 автомобилей, которые не задерживаются там больше чем на пять дней. В этой статье я расскажу, как наша команда из дружных разработчиков и неравнодушной тестировщицы боролась с неизбежным для такого муравейника хаосом и победила его.
Центральный хаб CarPrice — это не просто охраняемая территория, куда мы сваливаем машины в ожидании, пока кто-нибудь за ними приедет. Все поступившие на склад авто проходят технический осмотр, по ним готовят документы и их самих приводят в порядок — заряжают аккумуляторы, доливают топливо, омывающую жидкость и т.п. А еще перед продажей организуют дополнительные осмотры для дилеров.
Дилеры приезжают непредсказуемо — поток был очень непостоянный. Сотрудники склада то бегали высунув языки от машины к машине, то «курили бамбук», не зная, чем себя занять. Бывало, что один дилер забирал сразу десяток автомобилей — это занимало целый день, от раннего утра до глубокой ночи.
Букинг-система
Чтобы упорядочить работу, мы создали простой универсальный сервис записи на услуги (он же букинг, он же электронная очередь). В нем получение автомобиля разделено на два шага — осмотр и выдача. Первый включает в себя подготовку к осмотру и сам осмотр автомобиля дилером в присутствии менеджера склада. Далее дилер оплачивает автомобиль и переходит к шагу выдачи, на котором подписываются документы и передаются ключи. Осмотр и выдача могут проходить в разные дни, некоторые дилеры записываются сразу на выдачу без осмотра, а некоторые осматривают один автомобиль несколько раз.
Сервис записи поначалу не представлял собой сложную систему, решал простые и понятные задачи — рассчитывал свободные слоты в зависимости от типа и продолжительности услуги (этапа), с учетом графика работы сотрудников склада.
Дилер заходит в личный кабинет, выбирает один из выигранных на аукционе автомобилей с конечного склада, тип услуги (осмотр или выдачу) и записывается на свободный слот.
Это можно сделать как с десктопа, так и через мобильное приложение. Если дилер по каким-то причинам не может записаться самостоятельно, его может записать персональный менеджер или сотрудник склада.
Такие схемы успешно работают во многих компаниях, и мы надеялись, что как только интегрируем сервис, все проблемы пропадут.
Проблемы не пропадают
Через некоторое время мы понимаем, что система на практике не работает. Причина в том, что большинство дилеров не очень пунктуальны: приезжают без предварительной записи, значительно позже или раньше назначенного времени, а иногда вообще в другой день. При этом записываются на выдачу, а приезжают на осмотр. Указывали осмотр одной машины, а требуют показать еще пять других. Некоторые дилеры хотят работать только с конкретным менеджером склада. При этом многие дилеры весьма эмоциональны и мириться с несостыковками не способны. При такой непредсказуемости сотрудники склада не понимают, кого из толпы разъяренных дилеров нужно брать в работу, какие авто готовить к осмотру. Мы подумали-подумали и решили внедрить новое решение.
Электронная очередь
Задумка была многообещающей. Менеджерам не нужно думать кого взять в работу, — нажал кнопку «следующий», и вперед. Дилеры понимают, как загружен склад, видят свою позицию в очереди и знают, сколько примерно ждать. По итогам мониторинга времени обслуживания можно динамически корректировать слоты, а в случае нарушения SLA — оповещать руководство. А на осмотр/выдачу можно записаться прямо с терминала на складе.
На бэкенде должна быть реализована вся логика работы приложений, включая распределение заданий между операторами. Составляющие фронта:
- Терминал с авторизацией по номеру телефона, записью на услуги, просмотром доступных авто, подключением платных услуг и выдачей талонов на запись
- Дашборд с визуализацией очереди и текущих талонов в работе
- Пульт оператора (менеджера склада)
С технической точки зрения, дилер, записываясь на осмотр авто в своем личном кабинете, делает запрос к сервису букинга на бэкенде, в ответ получая список возможных машин для записи, свободные дни и время. Помимо основного, система должна была обрабатывать другие, «жизненные» кейсы:
- Дилер записался, приехал/не приехал
- Дилер записался, приехал вовремя, уложился в слот 30 мин
- Дилер записался, приехал позже/раньше на 15, 40, 100 мин
- Дилер записывается/приехал на VIP-выдачу
- Дилер записался на слот в 30 мин — по факту получилось 10 мин/2 часа
- Дилер записался на осмотр, приехал, осмотрел, ушел оплатить, через 40 мин вернулся забрать машину
Было и несколько дополнительных требований:
- Гибкая настройка расписания сотрудников склада с указанием услуг, которые может оказывать каждый. И все это в условиях пересекающихся графиков работы сотрудников — у нас две смены, с 9 до 18 и с 13 до 22
- Быстрое подключение к системе новых складов
- Интеграция с другими сервисами — текущим букингом, авторизацией дилера и т.д.
- Легкое вертикальное и горизонтальное масштабирование
- Реалтайм-интерфейсы
Требования не казались заоблачными, так что погружаться в это с головой и набивать шишки не хотелось. Мы подумали, что электронная очередь — это уже хорошо разработанная тема, и решили найти подрядчика с готовым коробочным решением, знающего, как подойти к заданным бизнес-кейсам.
Разрабатываем сами
Поиск подрядчика ничего не дал. Большинство готовых решений имеют очень примитивный алгоритм. Талоны складываются в одну общую очередь или с разбивкой по категориям, а затем операторы поочередно талоны из очереди вытаскивают. Всё. Гибкой настройки нет, логики распределения талонов между операторами нет, еще и работает система обычно лишь в Windows. Про легкую интеграцию с внутренними сервисами я даже говорить не буду. При этом ценники у всех космические. Мы все-таки начали работать с одним подрядчиком, но из нужных функций у него было процентов десять, а все остальное пришлось бы долго пилить. Так что мы расстались и решили написать электронную очередь самостоятельно.
К этому моменту мы уже четко понимали свои потребности со всеми нюансами и сразу приступили к реализации. Бэкэнд сделали на основе уже ранее созданного сервиса букинга — с использованием Laravel, PHP 7, RabbitMQ, Percona, Websocket, и все в Docker. Весь фронт реализовали на вебсокетах, что позволило сделать реалтайм-интерфейсы.
Терминал собрали из металлического корпуса, в котором прячется iPad. Корпус защищает планшет от кражи и фиксирует его в нужном положении.
На планшете активирован гид-доступ и в полноэкранном браузере без элементов управления запущено стороннее приложение на Vue.js (SPA). Сначала дилер авторизуется в терминале по SMS (JWT). После авторизации он может посмотреть свои записи на осмотр/выдачу и получить талоны для них. Дилерам доступны VIP-услуги с блокировкой средств в личном кошельке.
Каждая запись на осмотр и выдачу заранее привязывается к конкретному менеджеру склада и, если возможно, автоматически группируется с другими записями этого же дилера. При привязке менеджера учитываются расписание и загруженность сотрудников, наличие у дилера других запланированных записей и прочие факторы.
При записи на встречу на счете дилера деньги блокируются, а при получении талона — возвращаются. Записи, по которым не был вовремя получен талон, автоматически отменяются, а со счета дилера списываются деньги за ложную запись. Из полученных талонов формируется очередь, которая распределяется между работающими менеджерами, с учетом времени записи и ожидания дилера, типа записи и пр.
Для VIP выделена отдельная очередь — дилер может взять талон на «прямо сейчас» и сразу пойти на встречу с менеджером, если нет очереди из таких же VIP. Услуга хоть и платная, но пользуется большим спросом у дилеров, которые приехали без записи или опоздали и не хотят ждать.
Другой компонент системы — дашборд — показывает, какой талон у какого оператора обслуживается. Кроме того, он выводит текущую очередь и голосом приглашает дилера проследовать к оператору. По факту это обычный телевизор с подключенным неттопом, на котором запущен полноэкранный браузер и открыто приложение Vue.js (SPA) с параметрами конкретного склада.
У оператора для работы есть пульт — ноутбук на рабочем месте.
На ноутбуке открыт интерфейс оператора, в котором он после авторизации может создавать, изменять и отменять записи, фиксировать результат обслуживания, передавать клиентов и откладывать работу с ними. С помощью этого интерфейса при наличии определенных прав можно настраивать расписание работы менеджеров и их возможные услуги.
Через этот же интерфейс на каждом складе в отдельности можно подробно настраивать SLA. Это позволяет легко масштабировать нашу электронную очередь на любое количество новых складов.
Разных настроек для SLA много, мы отслеживаем работу складов по многим показателям.
Новая система электронной очереди помогает разрулить разные непростые кейсы. Вот несколько для примера:
- Дилер записался на несколько авто, сильно опоздал и половина из них стали просрочены. Получается, что запись просрочена частично, так что дилер все равно видит ее в терминале и может получить по ней талон. Менеджер в пульте оператора видит, что часть услуг просрочена, может завершить работу с талоном без них, либо удалить часть активных и добавить вместо них просроченные услуги.
- Дилер приехал на осмотр и выдачу авто, но у машины обнаружились дефекты. Теперь дилеру нужна не выдача, а формирование претензии на возврат. В пульте оператора менеджер может сделать это одной кнопкой — изменить тип услуги с выдачи на претензию.
- Дилер приехал на осмотр одной машины, а хочет осмотреть другую. Менеджер в пульте оператора может в талоне заменить машину для осмотра.
Мониторинг SLA через Telegram
Если вы внимательно посмотрели на скриншоты настройки SLA выше, то видели там строчки, связанные с мессенджером. Раньше бывало, что сотрудники склада вместо работы уходили покурить на час, а их коллегам приходилось переключаться в авральный режим. Теперь, если сотрудник вышел на работу и не берет дилеров длительное время, руководству приходит уведомление такого вида:
Или вот такие предупреждения о дилерах:
Помимо менеджеров, работающих с дилерами, на складе есть техники, которые готовят машину к назначенному времени осмотра: откапывают из сугроба, заливают топливо, омывайку, заряжают аккумулятор, прогревают двигатель и перегоняют автомобиль с закрытой парковки. Отдельный канал помогает им узнавать об особенностях запуска двигателя и быстрее завершать подготовку. Вот несколько интересных сообщений:
Но вот этот вариант, пожалуй, самый оригинальный:
Итоги
С помощью новой электронной очереди мы победили хаос на складе, упростили жизнь дилерам и дали им ряд дополнительных услуг. Если перечислять бизнес-показатели, то время ожидания дилеров уменьшилось втрое, количество негативного фидбека — вчетверо, а склад при том же количестве сотрудников теперь может пропускать не 700, а 3000 машин в день. Пока мы наблюдаем за системой и в планах разве что поставить принтер, который будет печатать талоны на бумаге.
Сейчас мы ищем в наш московский офис QA-специалиста и бэкенд-разработчика. Будем рады вашим откликам!
Автор: Шихов Алексей