Привет, Хабр! Меня зовут Алексей Шихов, я руковожу командой разработчиков 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-специалиста и бэкенд-разработчика. Будем рады вашим откликам!

Комментарии (12)


  1. JC_IIB
    15.05.2018 11:34

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


    1. tangro
      15.05.2018 12:10

      Пауза, видимо, в 2 секунды нужна.


      1. TimsTims
        15.05.2018 16:47

        Это всё противоугонные системы? То есть будущий владелец каждый раз такую магию должен будет проводить?


        1. vozhd99
          15.05.2018 19:10
          +1

          Угу, видел такое, видел. Более того, что это занятно глючит иногда. :) Даже на новый авто не ставил сигналку, так как иммобилайзер ещё никто не смог взломать, машина никому не интересна на рынке угона.


        1. ilumiel
          15.05.2018 20:05
          +1

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


        1. Ztare
          15.05.2018 20:05
          +1

          Так он как ему удобно перекодирует, любо демонтирует полностью. Код же уже получается много народу знает


        1. DjoBlack
          15.05.2018 20:05
          +1

          Думаю, что да. Как и любая более простая с условным «двойным закрытием заднего левого окна». В любом случае к таким манипуляциям привыкаешь очень быстро и делаешь все на автомате. Неудобно только объяснять, если за руль часто садится кто-то другой. А вот при угоне может реально помочь, человек вряд ли в спешке будет разбираться что именно нужно сделать, потому что вариантов может быть штук 100.


          1. vozhd99
            15.05.2018 22:14

            Это только от школьников поможет. Профи имеют свой пучок проводов нужных. И их эти «хитрости» мало интересуют, так как не ищут их, а обходят своим крабом. :)


        1. roscomtheend
          16.05.2018 09:08

          На некоторых машинах лет 20 назад бывали такие сигнализации (единственные). От честных людей. Во-первых комбинаций там ограничпенное количество, а во-вторых подсмотреть её не так и сложно (пульт под ветровым стеклом). Другое дело что нормальная сигнализация стоила дороже той машины и такая вполне была достаточна. Здесь, смотрю, такое не только на угоняемом TLC, но и на Сонате3… Их ещё угоняют?


  1. mvngr
    15.05.2018 20:05
    +3

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


    1. vozhd99
      15.05.2018 22:23

      На ком-то же нужно зарабатывать. :) Думаю, что это «детские болезни», которые решат в будущем.


    1. Shihov Автор
      16.05.2018 18:20

      Кейс теоретически возможный, но на практике мы с таким не сталкивались.
      Опоздав, дилер может записаться бесплатно прямо на складе на свободный слот (если такой есть).
      Например: была запись на 12:00, опоздал на 15 минут, есть свободный слот на 17:00. Берем талон в терминале, обозначив свое присутствие на складе. И если есть свободные менеджеры, его возьмут в работу прямо сейчас. Деньги за опоздание возвращены не будут, это да.

      Доступных слотов всегда чуть меньше, чем могут обслужить менеджеры. Например, есть менеджеры, к которым могут записаться только VIP клиенты, но эти менеджеры могут брать в работу обычные слоты, если нет приоритетных VIP'ов.
      А еще время услуг разное, и это тоже добавляет гибкость.