Uber like решения для грузоперевозки зерна
Задача
Этот сервис объединяет в себе сразу несколько типов пользователей. С одной стороны это владельцы зерна или зернотрейдеры. Их интерес заключается в том, чтобы доставить груз от элеватора, после уборки урожая, к терминалу или порту, где этот груз отправится дальше по направлению. Особенностью процесса перевозки есть то, что груз может быть очень объемный (тысячи тонн), для этого необходимо иметь в наличии много грузовых машин. Также груз не может лежать вечно на складе, его нужно успеть вовремя забрать.
До появления этого сервиса, владельцы груза, которые не владеют личным автопарком вынуждены решать эту проблему самостоятельно, искать подрядчиков, зачастую нескольких, так как один редко может справиться с большим объемом перевозки за нужное время.
Выгоды для владельцев груза
Собственно, этот сервис был создан с целью облегчить и систематизировать поиск перевозчиков и минимизировать объем бюрократических процедур для организации перевозки. Для владельца груза сервис выглядит как UBER-like приложение. В самом простом варианте достаточно выбрать, откуда везти груз, куда его везти, указать дату погрузки и тип сельскохозяйственной культуры.
Всей остальной бизнес-логикой сервис займется сам: выставлением заявки на разбор; закрытием заявки, повышением цены; мониторингом перевозки груза; прохождением заявки через все статусы, заложенные в бизнес-процессах.
Выгоды для грузоперевозчиков
С обратной стороны процесса перевозки выступает владелец автотранспорта. Это компании или частные лица, которые владеют либо огромным парком грузовых автомобилей, либо же всего несколькими машинами. Редко когда один владелец транспорта в состоянии полностью закрыть заявку собственными силами. Причины тому могут быть самые разные: короткие сроки, большие объемы грузов, занятость автомобилей на текущий момент. Отсюда и еще одна характеристика сервиса — он помогает выполнять перевозчикам небольшие грузоперевозки в рамках одной большой заявки одного заказчика.
Владелец груза не выбирает конкретного перевозчика, так как его это не особо интересует. Он попросту публикует заявку и ожидает ее выполнения в срок. Перевозчику достаточно иметь в наличии свободный грузовик и откликнуться на заявку. В случае, если заявка была разобрана полность, все владельцы транспорта приступают к ее выполнению.
Роль водителей грузовиков в системе
Еще одна роль, которая есть в системе — это водитель. Водители закрепляются за определенными машинами определенных владельцев транспорта. У водителя задача простая, он должен выполнить заявку: погрузиться на точке погрузки, перевезти груз к точке выгрузки, выгрузиться и на этом его работа завершена. Для управления процессом перевозки со стороны водителя есть мобильное приложение, с помощью которого водитель изменяет текущие этапы выполнения заявки и обменивается информацией со службой поддержки в случае непредвиденных обстоятельств. Кроме того, для мониторинга движения транспорта на каждый грузовик устанавливается GPS-датчик, который периодически отправляет координаты на наш геоинформационный сервис (GIS), где эти координаты обрабатываются и анализируются на наличие разных ситуаций: въезд-выезд из геозон, отклонение от маршрута, пропадание сигнала, простой.
В этом бизнес-процессе также присутствуют представители терминалов. Это люди, которые работают в портах и хотят получать информацию о транспорте, который движется к ним на разгрузку.
Архитектура и компоненты системы
Работы над проектом начались с изучения предметной области и описания всех бизнес-проблем в письменном виде и на диаграммах. Параллельно разрабатывалась серверная архитектура и подбирались необходимые технологии. Поскольку мы являемся опытными программистами на PHP-фреймворке Symfony, мы выбрали его для реализации бизнес-логики сервиса. Нашу систему мы разбили на несколько составных компонентов, которые разрабатывались раздельно.
- API — сердце системы, где проходят все транзакции;
- Frontend — клиентский веб-интерфейс, на котором пользователи регистрируются и управляют заявками из личного кабинета;
- Backend — веб-интерфейс для администраторов, чтоб управлять и мониторить системой;
- GIS — геоинформационный сервис, в его работу входит обработка координат от транспортных средств и передача разных бизнес-событий на API;
- Мобильное приложение для водителя — для управления процессом перевозки груза;
- Мобильное приложение для владельцев груза и перевозчиков — повторяет функционал веб-приложение в виде родного приложения на Android и iOS. На данный момент находится в процессе разработки.
Внешние сервисы
В данной системе используется несколько внешних сервисов. Например, Wialon, который изначально рассматривался исключительно как внешний GIS. Его планировалось тесно интегрировать с нашей системой и выполнять все необходимые для проекта задачи. Но для того, чтобы сделать сервис более независимым от внешних факторов, мы своими силами реализовали все необходимые нам функции GIS. Это позволило более гибко контролировать внутрисистемные процессы. Wialon остался только в качестве ретранслятора GPS-сигнала, которому поступают данные с датчиков автомобиля и затем ретранслируются нам по TCP-протоколу. Для получения и обработки низкоуровневых данных был написан дешифровщик протокола GPS-трекера на языке Python. В качестве хранилища объемных данных о треках машин мы использовали MongoDB.
В этом проекте многие задачи пришлось вынести в асинхронные фоновые процессы. Для этого мы использовали сервер очередей RabbitMQ. Туда мы отправляем такие задачи, как рассылки нотификаций участникам системы по разным каналам, обработка событий при движении транспорта, коммуникация между сервисами API и GIS, и многое другое.
Также мы подключили к этому проекту сервис Firebase Cloud Messaging для отправки пуш-нотификаций на разные платформы и Infobip для отправки SMS. Еще были подключены API таких сервисов, как Seldon и Центральный Банк для получения информации о зарегистрированных юридических лицах, чтобы упростить процесс регистрации пользователей. Для прорисовки маршрутов и генерации статических карт мы используем Google Maps API.
В интерфейсе администратора есть возможность управлять настройками системы, например:
- редактировать различные справочники: марки и модели автотранспорта, точки погрузки и выгрузки;
- верифицировать пользователей;
- управлять заявками;
- устанавливать тарифы на перевозку в разных регионах;
- просматривать статистику;
- редактировать тексты писем и нотификаций;
- управлять каналами рассылки нотификаций под каждый тип пользователя и событие.
В нашем проекте реализована интеграция с “1С Бухгалтерией” для ведения документооборота и составления накладных. Интеграцией занималась московская команда программистов со стороны заказчика.
Общее количество разработчиков, которые на разных этапах принимали участие в разработке проекта с нашей стороны, превышает два десятка человек. Из них 9 бекенд-разработчиков, 2 фронтенд-разработчика, 3 android-разработчика, 2 ios-разработчика, 2 тестировщика, 2 менеджера и 1 devops. Также в процессе разработки мы много и по делу общались с представителями заказчика: дизайнерами, техническими специалистами и специалистам предметной области.
Адаптация к изменениям бизнес-логики
Во время разработки проекта несколько раз менялись требования и бизнес-логика по причине того, что заказчик подбирал более удачную бизнес-модель в зависимости от потребностей рынка. Например, одним из таких пунктов был разбор заявки со стороны перевозчика. Так как у элеваторов есть физический лимит на количество тонн, которое они могут разгрузить за день, а объем груза в заявке может значительно превышать этот лимит, было добавлено такое понятие, как лот.
Заявка делится на лоты равной или неравной величины. Один лот, по сути, представляет собой один день и то количество тонн, которое способен отдать элеватор. Далее перевозчики уже оперируют частями лота: если лот размером 300 тонн, то перевозчик может взять из него, например, только 20-25 тонн в зависимости от грузоподъемности машины. Часть лота — это рейс, который выполняет один водитель в ходе выполнения заявки. Благодаря итеративности разработки функционала мы справились с адаптацией этих изменений.
За процессом выполнения рейса может следить как владелец груза, чей груз перевозят, так и владелец автотранспорта, чей водитель выполняет перевозку. Это отображается на карте в онлайн-режиме.
В данном проекте используется достаточное количество сложных элементов интерфейса. Чтобы упростить работу с ними, нашими фронтенд-разработчиками были написаны несколько компонентов на Vue.js + RxJS. Например, карта для отображения движения транспорта, асинхронные поля ввода и своя собственная реализация элемента Select.
Для реализации поиска адресов была использована библиотека RxJs, с помощью которой мы можем фильтровать поток ввода данных от пользователя и оптимизировать количество запросов к серверу. В результате пользователь получил живой поиск, а бизнес быстрое и качественное решение, которое легко поддерживать в будущем.
Планы на будущее
По замыслам заказчиков проекта, после окончания разработки этот веб-сервис должен покрывать все бизнес-процессы между разными участниками системы. В будущем также планируется ввести новые роли в системе: представитель фермерского хозяйства (аналог представителя терминала, только на точках погрузки), разные типы менеджеров в рамках ролей владельца транспорта и владельца груза, личный кабинет для фискальных служб. Планируется расширить функционал личных кабинетов пользователей. На данном же этапе мы реализовали MVP, тот базовый функционал, который позволил сервису вовремя запуститься, заявить о себе на рынке и начать получать первых пользователей, регистрировать в системе машины и водителей, просчитывать и создавать первые заявки.
Команда проекта:
- Владимир Сутовский
Руководитель проекта
- Руслан Х.
Front-end разработчик
- Андрей Сягровский
Front-end разработчик
- Андрей Л.
Front-end разработчик
- Сергей Железняк
Руководитель Back-end команды
- Артем Г.
Руководитель Back-end команды
- Михаил Вильшанский
Back-end разработчик
- Саша Л. Литвин
Back-end разработчик
- Женя Жолкевский
Back-end разработчик
- Юрий Сваток
Back-end разработчик
- Сергей Веретило
Back-end разработчик
- Макс Логвиненко
Back-end разработчик
- Александр
Руководитель мобильной команды
- Антон Б.
Android разработчик
- Александр К.
Android разработчик
- Виктор
iOS разработчик
- Евгений
DevOps
- Миша
QA-менеджер
- Игорь Гарбузюк
Руководитель проекта
- Светлана Болгар
Проектный менеджер
Другие наши проекты
Сервис BenzinPreis24
Сервис для эффективного поиска заправок в Швейцарии
MeinFernbus приложения
Разработка мобильного приложения для крупнейшего пассажироперевозчика Германии
Airfarm
Мобильные приложения для фермеров, Германия