Сервисы по продаже подержанных автомобилей обычно построены по одному принципу: «разместил объявление, позвонили, показал машину, продал». В таких проектах высокие технологии сконцентрированы, в основном, вокруг самого сайта. Но у нас всё иначе. Мы создали платформу, на которой любой желающий может продать автодилерам через аукционную систему свою подержанную машину (даже аварийную), с проверкой технического состояния нашими специалистами. Причём продать по рыночной цене уже через полчаса после выставления на аукцион. За кажущейся простотой описания скрывается сложная экосистема из самописных и сторонних программных продуктов, о которой мы хотим рассказать.
Всем привет! Меня зовут Илья Пятин. Я отвечаю за IT в компании CarPrice и сегодня хочу в общих чертах рассказать вам о внутренностях нашей платформы и из чего мы её делаем.
Наш рассказ будет следовать этой схеме, так что время от времени мы будем её повторять, чтобы вам не пришлось часто возвращаться в начало:
Приём автомобиля
Итак, человек хочет продать свой автомобиль. Он заходит на наш публичный сайт (есть закрытые части системы, про них далее), заполняет короткую форму и записывается на встречу в одном из наших филиалов (их у более 45 в 21 городе России).
Техническая справка
Видимый всем клиентский сайт на битриксе в текущей микросервисной архитектуре по факту является одним из «фронтов». Информация, вводимая владельцами автомобилей, передаётся во внутренние хранилища, систему аналитики, колл-центр, маркетинговые системы и так далее.
Также на публичном сайте доступен калькулятор, с помощью которого вы можете примерно оценить, сколько можно будет выручить за машину на аукционе CarPrice. Цены рассчитываются с помощью аналитического алгоритма на основании уже имеющейся у нас статистики продаж по конкретным маркам, моделям, техническому состоянию, спросу в различных регионах страны и так далее.
После ввода данные попадают в наш колл-центр. С владельцем машины созваниваются, уточняют дополнительную информацию и предупреждают, какие документы надо с собой взять.
Техническая справка
Колл-центр построен на платформе Oktell/MSSQL и работает в нашем приватном облаке. Он интегрирован с CSI — расширенной системой опроса пользователей, клиентской CRM и различными сервисами рассылок и уведомлений. Там же фиксируется первичная информация о владельце автомобиля, юридическом статусе машины и так далее.
Когда человек приезжает в выбранный филиал, его там встречает наш сотрудник — специалист по осмотру автомобилей. Он проверяет документы с помощью нашей внутренней системы под названием AutoCheck. Туда вносится информация из ПТС, СТС и паспорта, а AutoCheck проверяет информацию по всем доступным базам госслужб и собирает данные о различных запретах, ограничениях, штрафах и прочих юридических проблемах, которые могут возникнуть при продаже этой машины.
Если обнаруживаются проблемы, то мы сообщаем о них владельцу машины и объясняем, как их можно решить. Если речь идёт только о неоплаченных штрафах, то мы можем оплатить их за него. Если всё в порядке, то наш коллега — инспектор — с помощью разработанного нами мобильного приложения, которое мы так и называем «приложение Инспектора», заносит в базу всю информацию об автомобиле. Делается это по определенному алгоритму: он выбирает марку, модель, год выпуска, делает фотографии кузова, салона, указывает повреждения, комплектацию и так далее. Алгоритм осмотра одинаков для всех легковых автомобилей.
Когда инспектор заканчивает осмотр, он нажимает в приложении кнопку «Ок», и вся информация уходит по сети в нашу онлайн-платформу.
Основные фичи приложения:
- С сервера загружается универсальный сценарий, который влияет на последовательность действий инспектора, осматривающего автомобиль.
- При осмотре приложение может работать полностью в offline-режиме, поскольку наши сотрудники работают в очень разных условиях, иногда и на территории клиента.
- Проверка ограничений на регистрационные и прочие действия через ГИБДД, ФССП, Автокод и т. д.
- Встроенная система умного сжатия и многопоточной передачи фото- и видео- в облачное хранилище.
- Собственная компьютерная диагностика через сканер OBD-2.
- Работа с мобильными принтерами.
- Электронный указатель повреждений автомобиля.
Техническая справка
Архитектура приложения построена по шаблону MVVM с использованием RxJava, Dagger, Retrofit 2, Realm, Amazon SDK и так далее.
Выставление на продажу
Когда инспектор закончил работу, собранные им данные превращаются в лот на аукционе: агрегируются и выводятся в удобочитаемом виде. А дилеры, которым может быть интересна эта машина, получают уведомление. Кстати, за уведомление дилеров частично отвечает нейросеть, анализирующая их поведение и прошлые покупки.
По факту дилеры не видят сам автомобиль. Им доступна лишь карточка в аукционной системе, с результатом осмотра и фотографиями, сделанными нашим инспектором. В это время автомобиль находится в одном из наших офисов.
Ещё одно пояснение: когда результаты осмотра попадают в нашу систему, то, чтобы не вываливать дилерам сотни пунктов, выполняется агрегация данных и приведение к балльной системе — машина получает «звёзды». Всего четыре критерия, по каждому из которых может быть до 5 звёзд:
- кузов
- техническое состояние
- салон
- сопутствующие факторы
Почему мы решили ввести «звёзды»? Дело в том, что чек-лист инспекторского приложения состоит из более чем 1000 пунктов. Каждому пункту присвоен свой вес. К тому же список регулярно пересматривается: что-то добавляется, что-то убирается. Поэтому «звёзды» жизненно необходимы, чтобы дилеры могли быстро получить представление о состоянии автомобиля, а также чтобы сформулировать гарантийную политику на этот авто.
После того как карточка поступает в аукционную систему, владелец авто ждёт 30 минут. Он может на отдельном телевизоре — дашборде — в реальном времени наблюдать все текущие торги, видит, как дилеры делают ставки на его автомобиль, из каких они городов, сколько времени осталось до конца аукциона. Большинство наблюдают за торгами с большим азартом. Если время почти закончилось и пришла новая ставка, то платформа продлевает аукцион ещё на некоторое время. И такие продления могут происходить несколько раз, чтобы владелец смог выгоднее продать свой автомобиль, если на него есть спрос.
Техническая справка
Дашборд — это SPA на Vue.js и push-уведомлениях. По сути это страница, которая получает частичную информацию обо всех ставках и в компактной форме выводит данные из текущих аукционов по тому филиалу, в котором находится клиент.
Основная часть платформы написана на PHP, но ряд самых критичных к скорости и нагрузке компонентов мы сделали на Golang: приём ставок, роботы, торгующиеся за дилера и так далее. Система отправки уведомлений — один из очень важных для нас компонентов — реализована на Slanger. Это open source система уведомлений на базе протокола от Pusher с промежуточным хранилищем в Redis.
Из аукционной платформы данные отправляются в логистическую, статистическую и маркетинговую системы (используется, в том числе, для A/B-тестирования). Для отдела продаж создан отдельный интерфейс на пушах для наблюдения за ходом аукционов.
Дилеры и аукцион
Дилеры могут зайти в аукцион либо через браузер, либо через мобильное приложение. Многие из них не сидят в офисе, а постоянно ездят на встречи, смотрят автомобили, поэтому приложение для них более актуально. Если же компания крупная, то она, наоборот, часто выделяет отдельного сотрудника, который сидит и целенаправленно покупает на CarPrice машины, удовлетворяющие определённым, ему озвученным критериям.
Выбрав карточку интересующего автомобиля, дилер может полистать фотографии, посмотреть комплектацию, оценить повреждения:
В карточке, сделанной на связке React+Redux, отображается таймер, показывающий, сколько осталось до конца торгов по этому лоту, и можно сделать ставку. Если вы участвовали в онлайн-аукционах, например, на eBay, то можете хорошо представить, как в последние секунды разгорается борьба между дилерами за «лакомые» автомобили.
К слову, мы реализовали на Go сервис «автоставок» для дилеров. По сути это роботы, которым можно сказать: «Торгуйся за эту машину вплоть до такой суммы», и пойти смотреть другие лоты. Как только ваша ставка будет перебита, бот автоматически сделает ставку выше.
Дилеру нужно не просто победить в аукционе, ему нужно предложить такую цену, за которую владелец согласится продать свою машину. Ведь если кто-то из дилеров выиграет торги с самым высоким предложением, но оно не устроит владельца, тот может просто отказаться и уехать. Кстати, для владельца авто вся процедура оценки машины и её выставления на аукцион полностью бесплатна вне зависимости от его конечного решения.
Но и дилер находится в выгодном положении: он пока ничего не заплатил, но при этом получает товар с нашей технической экспертизой, с качественными фотографиями, отсутствием необходимости куда-то ехать и с кем-то общаться. К слову, сейчас мы внедряем алгоритм, который автоматически определяет уровень качества фотографии, которую сделал инспектор при осмотре принимаемых автомобилей, чтобы сообщить ему о необходимости переснять её, если снимок получился «не очень».
Основные фичи дилерского приложения:
- Возможность где угодно участвовать в торгах.
- Список ожидаемых аукционов, позволяет спланировать время дилеров.
- Внутренние и push-уведомления о новых аукционах.
- Встроенная оплата участия.
- Отображение всех повреждений, которые были указаны при осмотре автомобиля на интерактивной карте.
Склады и логистика
Допустим, кто-то из дилеров в жаркой схватке одержал победу, выиграл торги, и предложенная сумма устроила владельца автомобиля. В этом случае мы сразу отдаём ему всю сумму, оформляем документы, и счастливый, теперь уже бывший владелец уезжает праздновать сделку.
Автомобиль временно оказывается у нас — мы за него уже заплатили и теперь хотим отдать победителю. К примеру, на текущий момент мы владеем более чем 1000 автомобилей. Естественно, такой географически распределённый автопарк с постоянной «текучкой» требует строгого учёта. Мы не нашли подходящего стороннего решения и написали собственную складскую систему, с которой работают все филиалы. Она же позволяет отслеживать все перемещаемые между филиалами автомобили, планировать фрахт автовозов и так далее.
Техническая справка
Это собственный сервис на Laravel/MySQL/Vue с кучей внешних интеграций.
QA
Итак, дилер выиграл аукцион по какому-то лоту, и автомобиль прибыл на склад соответствующего города. Здесь он проходит процедуру осмотра — QA, всем вам известный quality assurance. Только в данном случае речь не о проверке новой фичи в продукте, а о повторной оценке состояния автомобиля. Достаточно ли точно была проведена оценка при приёмке? Нет ли каких-то упущенных дефектов?
У сотрудников QA тоже есть своё мобильное приложение с чек-листом, в которое подгружаются результаты первого приёмочного осмотра. Поскольку машины осматриваются не в тепличных условиях с Wi-Fi-подключением, а на складах-стоянках, причём нередко «вдали от цивилизации», то мы адаптировали приложение для работы в условиях низкого уровня связи. Это в городах-миллионниках хорошее покрытие LTE или 4G, да и то не во всех. А в городах поменьше, да ещё и на окраинах, и Edge может быть редкостью. Перед осмотром сотрудник подгружает в офисе данные по машинам, которые будет осматривать — а это до 500 Мб данных и фотографий по каждому автомобилю, и идёт в поля. Там он вносит в информацию корректировки, и когда появляется связь, выполняется автоматическая синхронизация с платформой.
Основные фичи QA-приложения:
- Планирование рабочего дня сотрудников склада.
- Актуальный список дилеров, желающих забрать свои автомобили.
- Актуальный список автомобилей на складе.
- Осмотр автомобиля по загруженному ранее акту осмотра с дилером.
- Фиксация неучтенных повреждений.
- Запуск внутренних бизнес-процессов.
Техническая справка
Приложение сделано на MVP с Retrofit 2, EventBus, Realm, Amazon SDK, JobQuery и так далее.
Выдача автомобилей дилерам
У каждого дилера есть личный кабинет с системой онлайн-бронирования. В нём можно записаться отдельно на осмотр и на выдачу автомобилей.
Почему отдельно? Дилеры — это бизнесмены. Прежде чем заплатить, они хотят сначала посмотреть товар, убедиться, что он соответствует описанию из карточки лота. Ведь автомобили — вещь не дешёвая, риски довольно высоки. Дилер осматривает автомобиль вместе с нашим сотрудником, а результаты осмотра фиксируются в приложении QA. Если дилер не имеет претензий, то система документооборота выставляет ему счёт на оплату. После этого он оплачивает его и может записаться на выдачу, чтобы забрать своё приобретение.
На этом наша основная бизнес-цепочка завершается.
Техническая справка
Система документооборота — это отдельный модуль для «1С: Битрикс». Она генерирует пакеты документов по каждой сделке с учётом всевозможных условий.
Длительный аукцион
Бывает так, что на аукцион приехал автомобиль, который по каким-то причинам в течение получаса не привлёк внимание дилеров или за него предложена слишком низкая сумма, и мы понимаем, что владелец на неё не согласится. Но при этом мы знаем, что в нашей клиентской базе есть те, кого автомобиль может заинтересовать, или кто готов будет предложить за него больше, просто сейчас они не смогли участвовать. В таком случае мы зовём нашего «внутреннего дилера», просим его взять риски на себя и выкупаем автомобиль, предложив владельцу бОльшую сумму, чем дилеры. После оформления документов мы выставляем машину на так называемый длительный аукцион, не имеющий ограничения в 30 минут. К слову, многие дилеры предпочитают именно такие лоты, потому что здесь не нужно торопиться, можно спокойно оценить автомобиль, приехать на стоянку, посмотреть, подумать.
Откуда мы знаем, сколько нужно предложить владельцу? Почему мы считаем, что автомобиль у нас потом выкупят? За это отвечают наши специалисты, ориентируясь на аналитическую систему, которая просматривает историю торгов по похожим автомобилям, анализирует спрос и клиентскую базу и на основании множества критериев выбирает дилеров, которые пока не увидели данный лот, но могут проявить к нему интерес. Сегодня в нашей клиентской базе около 30 000 дилеров, и далеко не все из них пользуются смартфонами и компьютерами: немало тех, кто до сих пор ходит с кнопочными телефонами. Регулярно их обзванивать, рассказывая об интересных лотах — не хватит никаких колл-центров. Тем не менее, это успешные бизнесмены, которым можно регулярно отправлять дайджесты с потенциально интересными для них лотами из длительного аукциона.
Также мы внедрили автоматическую рекомендательную систему. Нейросеть анализирует все лоты, а не только те, по которым нет ставок или предложено слишком мало. Это позволяет адресно вызывать на аукцион именно тех дилеров, которым наиболее интересна конкретная машина.
Техническая справка
Нейросеть была сначала смоделирована в MATLAB, а затем портирована на Tensorflow, есть места на NumPy. Всё это работает в виде отдельного микросервиса, который собирает информацию о конкретных лотах и выбирает из базы дилеров тех, кому эти лоты могут быть интересны. Она анализирует прошлое поведение дилеров: кто, когда и какие лоты смотрел, за какие машины торговался, победил или не победил, сколько сейчас машин куплено, ждут ли какие-то счета оплаты.
На основании многих сотен критериев, описывающих автомобиль, нейросеть выделяет те машины, которые могут быть интересны конкретному дилеру. Более того, основываясь на истории поведения дилеров, неройсеть может выделить предпочтения, которые сам дилер для себя не сформулировал. Например, она может догадаться о том, что дилер не интересуется машинами, у которых больше двух владельцев по ПТС или салон не из кожи. А другой дилер часто смотрит праворульные «японки», их ему надо показывать в первую очередь.
Подводя итог вышесказанному: длительные аукционы помогают предложить владельцу автомобиля справедливую цену, а потом найти дилера, который готов заплатить за неё достойную сумму.
Зачем всё это дилерам?
Возможно у вас давно возник вопрос, а зачем дилерам покупать подержанные машины, конкурируя друг с другом на аукционе и повышая цену? Всё очень просто: мы лишь проводим техническую оценку автомобилей, но не проводим никаких технических работ. Всем этим потом занимаются дилеры: ремонтируют, заменяют, чистят, красят, рихтуют. В общем, увеличивают ценность авто и готовят его к тому, чтобы оно обрело нового владельца, а затем — продают с наценкой. Таким образом, с нашей помощью они экономят на этапе подбора и покупки.
Другие разработки
Уже выпущен личный онлайн-кабинет для владельцев автомобилей на React/Redux. Когда человек решает продать машину и регистрируется в CarPrice, то в его личном кабинете появляется полезная информация о том, какие документы нужно подготовить, как проверить наличие неоплаченных штрафов, как лучше подготовить машину к продаже, как доехать до ближайшего офиса CarPrice и многое другое.
Результаты работы всех систем агрегируются в систему BI для последующей глубокой аналитики. По мере роста компании аналитика начинает играть всё более важную роль в самых разных бизнес-процессах и принятии решений, поэтому сейчас у нас есть целый отдел, посвящённый анализу собственных данных.
Технологии
Стек основных технологий, используемых в CarPrice, выглядит так:
Помимо вышеупомянутых приложений и систем мы создали немало других IT-продуктов, а также интегрировали сторонние решения, которые помогают нам быстрее разрабатывать: Huginn, Zapier, Exponea.
Весь обмен данными между сервисами и системами выполняется напрямую через внутренние API, защищённые jwt-токенами. Все ключевые сервисы работают на очередях RabbitMQ.
Нагрузку на сервисы регулируют nginx-балансировщики, и, конечно, все ключевые системы защищены антиDDoS-зонтиком.
У нас много интересного, и мы планируем потихоньку рассказывать об используемых решениях. Будет классно, если в комментариях вы отметите, о чём стоит рассказать в первую очередь.
Спасибо!
Автор: nswbit