С точки зрения пользователя процесс онлайн-покупки товаров от «ВкусВилла» выглядит просто – открываете приложение (самого «ВкусВилла» или партнеров по доставке и агрегаторов), выбираете необходимый товар, оплачиваете, ждете, получаете.
В этом посте мы немного поговорим о том, как работают кассы «ВкусВиллы» изнутри, как они участвуют в процессе онлайн-заказа и как связаны с остальной экосистемой магазина.
Изначально у нас было достаточно классическое программное решение для продаж в магазине с использованием различных кассовых аппаратов, которые есть у «ВкусВиллы», включая возможности продуктовой сети, в частности, систему лояльности.
Но из-за пандемии коронавируса магазинам пришлось оперативно добавлять онлайн-заказы и доставку товаров.
Соответственно, обработку и исполнение этих заказов нужно было каким-то образом интегрировать в существующую экосистему.
Мы модифицировали кассовый аппарат таким образом, чтобы он, помимо выполнения своих основных функций, стал еще и самостоятельным сборочным терминалом (ну разве что сам пока не собирает товар в упаковку) и смог принимать заказы, регистрировать товар на сборку, подтверждаем выполнение заказа и выдаем все необходимые чеки.
Во-первых, давайте поговорим об архитектуре нашего кассового решения.
С точки зрения взаимодействия решение имеет клиент-серверную архитектуру.
С точки зрения развертывания он ближе к десктопу, потому что.
обе части (клиентская и серверная) расположены локально, на каждой отдельной кассе.
Ядро написано на Java, а лицевая часть — на JavaScript (React).
PostgreSQL используется для хранения данных.
Если говорить об обвязке, то все, что касается оборудования, написано на Go, API — на Python. Клиент-серверная архитектура выбрана не случайно — такая реализация позволяет очень быстро и гибко модифицировать видимую покупателю часть кассового аппарата, сохраняя при этом основную логику «под капотом» неизменной.
За счет этого мы получаем более облегченные обновления с возможностью реализации собственного дизайна интерфейса.
Также мы можем иметь на кассе несколько графических интерфейсов одновременно и за несколько минут через настройку изменить отображаемый интерфейс, например, превратить кассу с кассиром в кассу самообслуживания.
Кроме того, такая архитектура позволяет (при удаленном размещении нашего кассового решения) подключаться с разных «клиентов» для совершения покупок, например, с планшетов курьеров.
В этом случае чек будет получен по месту нахождения серверной части и может быть отправлен покупателю по удаленным каналам связи.
Это можно использовать для организации небольших денежных ферм.
Стек технологий, который мы использовали при внедрении, позволил сделать кроссплатформенное решение.
И в большинстве случаев в качестве ОС используется Linux Ubuntu, что позволяет дополнительно сэкономить на лицензиях.
Также кассовый сервер имеет внутреннюю базу данных PostgreSQL, в которой хранится информация, необходимая для работы кассы в автономном режиме (о товарах, текущей смене, поступлениях за последний месяц и т.п.
).
Информация о продажах в режиме реального времени передается через интеграционные потоки во «ВкусВилл» для отслеживания остатков в магазине и отображения информации о поступлениях и остатках покупателям.
Адаптация кассового аппарата для работы с заказами
Чтобы понять масштаб изменений на кассе, необходимо рассмотреть процесс онлайн-заказа покупателя.Под процессом мы подразумеваем, по сути, путь заказа от момента оформления до его доставки покупателю.
Вот как это выглядит на схеме:
1. Размещение заказа покупателем
Содержимое заказа попадает на отдельный сервер «ВкусВилла», на котором изменена структура базы данных под запрос на доставку.
Когда заказ размещен, после того, как он попадает на сервер, его данные аккуратно помещаются в базу данных.
2. Отображение заказов на кассе Для отображения данных заказа на кассе реализован специальный режим отображения со скрытым доступом от покупателей.
Особенно это актуально для касс самообслуживания, потому что.
рядовой покупатель в магазине не должен иметь возможности вводить заказы и совершать с ними какие-либо действия.
При переходе в этот режим кассовый аппарат берет с сервера информацию о заказах и отображает ее продавцу.
В этом случае кассовый аппарат выступает в роли сервисного терминала на стороне магазина: он видит, какие заказы поступили от покупателей в этом магазине, приоритезацию этих заказов, периодически обновляет список заказов и отображает данные о них.
3. Печать чека сборки Когда комплектовщик выбирает конкретный заказ, умная касса распечатывает список в соответствии с расположением товара в этом магазине.
В таком списке все отмечено именно по месту отображения, с актуальным на момент печати списка количеством товара.
Такое решение позволяет максимально быстро собрать заказ в конкретном магазине, не мотаясь по отделам туда-сюда в поисках дополнительных вкусняшек.
4. Регистрация собранного товара После сборки корзины кассир-инкассатор возвращается к кассовому аппарату и сканирует штрих-код со сборочного чека.
После этого он корректирует позиции заказа в соответствии с собранным товаром и согласовывает это с покупателем.
Затем он прикрепляет к сканеру собственный бейдж — это решает сразу несколько проблем.
Во-первых, мы знаем, кто какой орден собирал.
Помните, как раньше на некоторых видах пищевой продукции можно было встретить клеймо ОТК и клеймо «Коллекционер Иванов П.
В.
».
Здесь есть нечто похожее, но в системе это видим только мы и можем повлиять на качество сборки конкретного сотрудника, если по обработанным им заказам возникает большое количество рекламаций.
Во-вторых, качество каждой сборки связано с системой мотивации сотрудников – это обеспечивает дополнительный контроль качества.
После подтверждения сборки касса возвращает на сервер статус заказа ГОТОВ, и наступает очередь курьеров.
Пеший курьер или таксист может увидеть заказы на этапе сборки и заранее забронировать их к доставке.
После перевода заказа в статус ГОТОВО, они могут принять этот заказ в работу.
Если покупатель решает забрать заказ сам, то на этом этапе он получает уведомление о том, что он готов.
5. Выдача заказа В зависимости от способа доставки заказ может быть доставлен курьером (пешком, на такси или одной из служб доставки) или непосредственно покупателю.
При заказе покупатель может выбрать один из вариантов оплаты – онлайн или оффлайн оплата (картой или наличными).
Варианты доставки и оплаты комбинируются по-разному, и здесь есть свои нюансы.
Например, вы не можете оформить доставку через Доставку и при этом выбрать офлайн-оплату, из-за особенностей взаиморасчетов с агрегаторами.
Если покупатель выбрал онлайн-оплату в мобильном приложении, то в момент оформления заказа (независимо от вида доставки) кассовый аппарат инициирует списание суммы итогового чека.
Перед оформлением заказа средства на карте блокируются на сумму заказа.
Нельзя сразу списать сумму корзины пользователя - некоторых товаров может не быть в наличии, а от некоторых товаров пользователь может отказаться сам.
Это именно те случаи, когда вы заказываете еду из ВкусВилл через приложение, а вам перезванивают и уточняют, что каких-то позиций не хватает, осталось всего 4 кефира, а по случаю личного праздника хотелось 7, а хлеб имеет срок годности через 2 дня закончится.
В таких случаях сборщик согласовывает все с покупателем, а затем оформляет заказ в соответствии с полученными данными.
А кассовый аппарат, видя расхождения между первоначальным заказом и окончательным, выдает предупреждение, и инкассатор должен для каждого товара указать причину – почему это произошло, и подтвердить результат. Только после этого сборка заказа считается завершенной.
Если в течение двух часов покупатель, организовавший самовывоз, не придет за заказом, заказ переходит в режим разборки.
И весь праздничный кефир отправляется обратно на полки магазинов.
Умные тележки
А еще у «ВкусВилла» есть такое понятие, как «умная тележка».Такая тележка позволяет пользователю собирать товары в магазине, сканируя их с помощью встроенного сканера, а затем, подъехав к кассе (самообслуживании или на кассе), быстро отображать список собранного.
на его экране.
В корзине имеется специальный планшет, на котором покупатель может быстро авторизоваться с помощью бонусной карты, если захочет использовать все возможности программы лояльности.
Принципу, по которому теперь тележки взаимодействуют с кассовым аппаратом, предшествовало несколько попыток, о которых мы поговорим ниже.
Но сначала расскажем, как в принципе происходит авторизация покупателя на кассе с помощью QR-кода.
- Покупатель подходит к кассе и нажимает «Сгенерировать код».
- Кассовый аппарат отправляет запрос на центральный сервер «ВкусВиллы» и сообщает свой уникальный номер и запрос на регистрацию нового QR-кода.
- Этот код регистрируется на сервере, и в таблице базы данных создается соответствующая запись о том, что в таком-то магазине создан такой-то QR-код.
- Покупатель видит сгенерированный QR-код на мониторе кассового аппарата и сканирует его с помощью мобильного приложения.
- Приложение (в котором пользователь уже авторизован) распознает число, заложенное в QR-коде, и отправляет запрос на сервер.
- На сервере запись с распознанным QR-кодом дополняется данными о покупателе из приложения.
- Касса все это время отслеживает эту таблицу на предмет изменений и появления новых данных.
Как только он их замечает, то выдаёт на монитор уведомление об успешной авторизации.
- При этом, если в течение 30 секунд кассовый аппарат не нашел в таблице информацию о покупателе, он выдает сообщение об ошибке авторизации.
Теперь мы расскажем непосредственно о реализованных нами вариантах интеграции тележек с кассовыми аппаратами.
1 попытка.
QR-коды Тележки оснащены встроенным сканером штрих-кода, который покупатели используют для сканирования товаров.
Тот же сканер было решено использовать для считывания QR-кода, выдаваемого кассовым аппаратом для авторизации покупателя.
В этом случае касса так же, как и покупатель, авторизует конкретную корзину, но в качестве информации о пользователе она подхватывает список покупок, которые уже добавлены в корзину.
И вроде бы все отлично.
Но проблема в том, что сам QR-код на мониторе кассы всегда отображается в одном и том же месте экрана.
Сканер на тележке статичный, встроен в корпус примерно на высоте 50 см от земли.
Но кассовые аппараты в магазинах находятся на разной высоте – высота прилавков на обычных кассах и размещение касс самообслуживания также могут отличаться.
Так что нормально прочитать код таким способом во всех магазинах сети не удалось - сканер не выносной, его специально сделали одним целым с тележкой.
И поднимать тележку вручную в попытке правильно прочитать код — тоже бездарная идея.
Поэтому мы решили попробовать вариант с RFID-метками.
2-я попытка.
RFID-метки К кассовому аппарату подключается считыватель RFID-меток.
Каждая корзина имеет свою бирку.
Когда покупатель подвозит тележку к определенной кассе, кассовый аппарат замечает метку и получает данные от этой тележки, отображая список покупок на экране.
Проблема здесь была в том, что все это тестировалось в условиях, близких к идеальным.
На самом деле, тележку к кассе могут поднести не очень плавно, особенно когда посетителей много.
Или в магазине кассовые аппараты могут быть немного ближе друг к другу, и пользователь должен подъехать к нужной кассе как можно ближе.
В условиях работы обычного магазина это работает с перебоями даже при средней нагрузке.
3-я попытка.
Авторизация с ручным вводом номера корзины Это был рабочий вариант. Тележка сканирует товар покупателя, эти данные сразу записываются на сервер (напомним, у тележки помимо сканера есть специальный планшет).
Каждая тележка также имеет уникальный номер, который хорошо виден покупателю; с этим бортовым номером он уже авторизован в системе.
Поэтому когда корзина передает на сервер данные о списке товаров, он передает и этот номер — например, номер корзины 33782 из такого-то магазина и список отсканированных товаров.
Далее покупатель идет на кассу и выбирает вариант загрузки товара из корзины, вводя только номер своей корзины.
И все, от кассы идет запрос на сервер, и там уже есть данные о списке товаров в корзине с этим номером.
Все это отображается на экране кассового аппарата.
Конечно, покупатель может ввести номер тележки какого-нибудь другого покупателя, стоящего рядом с ним в очереди, и получить список его товаров.
Это возможно, если речь идет о кассе самообслуживания – в случае с кассой это исключено.
О трудностях
Может показаться, что реализация кассового решения проста — модернизируйте базовую логику, поддержите API, и все как-то само заработает. Но все немного иначе.Во-первых, специфика разработки «ВкусВиллы» такова, что от базовой идеи до рабочей реализации проходит минимальное количество времени.
Во-вторых, почти каждый день у нас появляются новые запросы на модернизацию существующих функций и методов.
Например, на старте кассир иногда допускал ошибки в процессе сборки.
Что-то я упаковал не так, что-то меньше, что-то больше.
Как вы понимаете, на лояльность клиентов это влияет довольно сильно и всегда только в одну сторону.
Поэтому мы прописали на этом этапе дополнительные проверки, чтобы убедиться, что фактическое содержимое посылки в собранном заказе соответствует тому, что на самом деле хотел заказать покупатель.
Или подключение сторонних систем для заказа продукции.
У ребят там тоже свои требования — например, сумма заказа не должна содержать копеек.
В принципе это важно.
Поэтому мы сели и переписали всё на сторонние поставки, чтобы этих копеек не было в наших чеках.
Хотя, когда вы покупаете в магазине весовой товар по конкретной цене, это очень часто приводит к тем самым копейкам на чеке.
Но раз сторонняя доставка невозможна, значит, это невозможно.
Мы писали о сложностях интеграции систем «ВкусВилла» с другими компаниями.
в этом посте .
Потом добавили бонусы к оплате.
На кассе при покупке в магазине человек может воспользоваться бонусами по карте лояльности или промокодами.
С онлайн-заказами через приложение такого не было.
Значит что? Правильно, мы должны это сделать.
Если говорить не только о сложностях доставки, а о развитии в целом, то во всех магазинах «ВкусВиллы» очень разнообразное оборудование.
И нам с самого начала нужно было планировать так, чтобы можно было максимально просто запустить весь этот парк техники.
Обычно кассовое решение поставляется в комплексном виде: вот оборудование, а вот программное обеспечение для него.
Перед нами стояла задача создать программное обеспечение для оборудования, которое не указано в одном ключе: описание того, сколько памяти и сколько ядер на устройстве плавает из магазина в магазин, каждая модель имеет свои особенности.
Где-то моноблок от одного производителя, а где-то системный блок и сенсорный монитор от другого.
Планы развития
Одновременно мы готовимся к запуску нового поколения касс самообслуживания, оснащенных мультитач-экраном, 2D-сканером для распознавания штрих-кодов, стереодинамиками, микрофоном для аудиоприложений и голосовых сервисов, а также 3D-камера и другие системы помощи клиентам.Кстати, мы сейчас активно расширяем команду; все описанные кейсы, улучшения, производительность систем и интеграции - ее работа.
Мы планируем использовать самые свежие решения и идеи, добавлять новые возможности как в приложение для клиентов, так и во внутренние системы.
Здесь вы можете посмотреть полный список вакансий - hh.ru / наш сайт вакансий .
Буду рад ответить на ваши вопросы.
Теги: #электронная коммерция #it-инфраструктура #Хранение данных #qr-коды #Разработка для электронной коммерции #Управление продажами #RFID #кассовые аппараты #кассы самообслуживания #ВкусВилл #вкусвилл
-
Исландия
19 Oct, 24 -
Хабр. «Кусочек» Одного Дня
19 Oct, 24 -
Запись Балмера С Сайта Remix.ru
19 Oct, 24 -
Радио-Э №28
19 Oct, 24 -
Ваш Аудиогид. История Одного Стартапа
19 Oct, 24