К нам обратились с идеей создать сервис доставки продуктов ресторанного качества напрямую от поставщиков. Вместе мы прошли путь от первых продуктовых гипотез и набросков к рабочей бизнес-модели, которая обслуживается комплексом сложных инженерных решений.
Идея
Клиент намеревался создать сервис складского учета продуктов питания, который автоматизирует процессы формирования заказов, их отгрузки, приемки и логистики. Все это происходит с помощью технологичных сборочных линий с фиксацией результата на каждом этапе: от получения сборщиком заказа в системе, через отметки о сборке каждой единицы с фиксации веса, до укладки в транспортировочный контейнер и отправки заказчику. С другой стороны, это сервис-каталог доставки для заведений общественного питания, где они могут приобретать необходимую им продукцию таким образом чтобы поставки были регулярными и в надлежащем качестве. Для этого им предлагаются специальные интерфейсы заказа и приемки. Вся система в целом обеспечивает консистентный, уникальный опыт простоты обслуживания заказов на каждом этапе.
Как работали склады до автоматизации?
В начале дня на складе менеджеры по закупкам формировали заказы. В этот момент определялся их состав исходя из поступивших ранее звонков и сообщений от клиентов, в которых они просили привезти все необходимое. Каждую позицию менеджерам необходимо было добавить в базу данных 1С. В дальнейшем она являлась источником правды обо том, что, когда и кому нужно привести.
Далее для сборки заказов необходимо помечать готовые к отправке позиции, специальными этикетками. Их печатали по многу выгружая данные из 1С и вырезая ножницами. Таких этикеток могло быть до одной тысячи в день. Также менеджерам нужно было подготовить отчеты на подпись для директора и бумаги для водителей с информацией о з аказах.
Вся эта работа происходила днем и к вечеру формировалось все необходимое для сборки заказов, которые нужно отвезти клиентам следующим утром. Бывает такое, что на складе нет нужных товаров, тогда в дело вступают докупщики, которые срочно отправляются искать недостающие позиции.
Далее в дело вступали курьеры, которым вручали список адресов и какие продукты им нужно отгрузить. Им нужно было сообразить такой маршрут чтобы успеть к каждому вовремя учитывая время на приемку заказов каждым клиентом, которая часто шла не по плану.
Разумеется все это происходит в суматохе, люди допускают ошибки при формировании и сборке заказов, указав или не то количество свежих авокадо или отгрузив 60 килограмм картофеля не тому клиенту.
Решение
Программный комплекс состоит из двух модулей: обслуживание заказов и логистика. В данный момент они функционируют следующим образом.
Обслуживание заказов
В процессах обслуживания заказов задействованы три категории специалистов:
- Менеджеры
- Сборщики
- Закупщики
Мене джеры формируют, верифицируют и назначают в доставку заказы в специальном веб-приложении.
У сборщиков есть мобильное приложение в котором отображается информация о том, что и в каком количестве ему нужно собрать. Достаточно найти на складе продукт, отнести его на весы, получить напечатанную этикетку и отметить как позицию как собранную.
У закупщиков, отвечающих за срочные поставки продуктов тоже есть свое приложение, где они сразу видят информацию о том, что сборщик столкнулся с нехваткой товара. Так к концу смены сборщиков у них сразу есть вся необходимая информация.
Связь базы данных, приложений, принтеров и весов — ключевая часть автоматизации. Когда продукт найден на складе приложение сообщает на какие весы его нести. Некоторые могут взвешивать десятки килограмм, а некоторые только пару. На месте сборщик кладет товар на весы и жмет кнопку «Зафиксировать». В этот момент принтер печатает уникальную этикетку со всеми данными о заказе, а камера фотографирует продукт на весах и отправляет полученные данные на сервер. После приложение сообщает сборщику в какой контейнер отнести эту позицию.
Логистика
Обслуживают:
- Менеджеры
- Курьеры
- Клиенты
У менеджеров есть карта, на которой видны адреса всех клиентов ожидающих сегодня поставки. Им нужно спланировать в каком порядке каждому курьеру объехать клиентов учитывая время в пути от одной точки до другой, сколько времени он проведет на разгрузке и особенности маршрута. Все расчеты система осуществляет на лету. План можно сделать в вручную или автоматически, как подскажет система на основе данных о прошлых доставках.
Чтобы менеджеру было проще, в интерфейсе предусмотрены специальные фильтры, где можно выбрать конкретного курьера, дату, заказы и их статусы. Отдельно отмечаются новые заказы на которые никто еще не назначен. Когда происходят задержки здесь можно поменять адреса местами или добавить новые. В этом случае маршрут перестраивается автоматически, а клиенты получают уведомления.
В режиме реального времени на карте видно как двигаются курьеры, нет ли у них проблем. К примеру, когда клиент принимает заказы в приложении, каждую отдельную позицию он может принять полностью, частично или отказаться. Все это он отмечает в приложении сам или просит курьера, у которого также есть возможность вносить такую информацию. По завершении приемки есть возможность оставить оценку и комментарий.
Курьеры могут обманывать своего нанимателя выполняя заказы на стороне или просто бездействовать выключая телефон с запущенным приложением. Чтобы предупредить такое поведение, кроме геолокации также отправляются данные о статусе заряда, уровне приема мобильной сети и состоянии телефона. Это не зависит от того запущено приложение или нет. Так можно отделить технические проблемы у водителя от обмана.
Что под капотом?
На складе есть сервер, где развернут 1С и роутеры Mikrotik один из которых подключен с помощью Wireguard по зашифрованному каналу к серверами в Яндекс Облаке. Таким образом мы можем связать базу данных, весы, камеры, принтеры и приложения в одну сеть, где данные обрабатываются быстро и безопасно. Посмотрим на компоненты ближе.
Весы
У весов есть сетевые карты и собственный бинарный протокол по которому они общаются. Как только весы подключены, к ним можно на определенный порт и запросить данные. При установленном соединении они пересылают данные в реальном времени 50 раз в секунду. Так в приложении сборщик видит точные данные и может их фиксировать.
Принтеры
Также как и весы, у принтеров есть сетевая карта и собственный бинарный протокол. У них очень ограниченный API и они могут рисовать только базовые фигуры, коды и текст. Кроме тог о принтер не может обработать два запроса одновременно и зависает. Также через некоторое время без получения запросов он уходит в сон и перестает быть доступным в сети.
Чтобы решить эти проблемы мы научили наш сервис работы с устройствами отправлять запросы к принтерам время от времени и ставить новые запросы в очередь, чтобы они отправлялись по одному.
Вместе с этим, периодически запрашивая у весов статус чтоб они не засыпали мы знаем не случилось ли с ними что-то нехорошее. Вроде залитой соком сетевой карты. А еще у нас есть алгоритм, который преобразует любую картинку в BPM в понятный принтеру формат из доступных ему элементарных фигур.
Мобильные приложения
Для экономии ресурсов на разработку мы сделали одно кросс-платформенное приложение для всех участников процесса. У каждого был свой логин, под которым согласно роли отображался интерфейс для сборщика с перечнем заказов и товаров них с фиксацией веса и факта сборки, докупщика со списком товаров для покупки, и курьера. Здесь самое интересное. Дело в том, что телефон водителя должен в реальном времени отправлять следующие данн ые:
- Координаты
- Уровень заряда аккумулятора
- Статус активности модуля GPS/ГЛОНАСС
- Идентификатор устройства
В том числе когда приложение свернуто или закрыто. Также желательно не расплавить и не взорвать от нагрузки смартфон в салоне или кармане водителя.
А еще не сильно разряжать аккумулятор. Для этого мы сделали специальную задачу внутри телефона, который устанавливается вместе с приложением в Android State. Она запускается раз в секунду и выполняет минимальный алгоритм по сбору и отправке данных.
Чтобы настроить эту логику нашим инженерам пришлось выехать в поля с телефонами и ноутбуками корректируя алгоритм на реальных данных. Так удалось добиться нужной плавности и точности.
Синхронизация
За нее отвечает специальный сервис на NodeJS и отдельная база данных, где есть данные необходимые для подключения ко всем устройствам. Этот сервис поднимает соединения, получает данные, обрабатывает их и кладет в Redis, откуда их быстро могут забирать клиенты. Так может обрабатываться до 10к запросов в секунду.
Интеграция с 1С
Для этой платформы мы написали специальный обработчик, который запускается раз в секунду и получает данные от сервера приложений о событиях произошедших с товарами, например заказ или отгрузка.
Так после заказа до появления данных в 1С проходит не более 2х секунд.