01 · Контекст и задача
Таксопарк в небольшом городе работал по старинке: диспетчер принимает звонки, водители на рации, учёт в тетради. Агрегаторы заходят в регион и забирают до трети заработка комиссией. Владелец хотел своё — систему, которая делает всё то же, что агрегатор, но принадлежит парку.
Задача: полноценный таксосервис из четырёх частей. Пассажир заказывает поездку в приложении. Водитель принимает заказы и видит карту. Оператор управляет линией вручную, когда нужно. Владелец видит метрики, водителей, заказы и финансы. И всё это работает в реальном времени.




02 · Что было сложно
- Real-time на всех ролях сразу. Координаты водителей, появление заказа, его принятие, отказ, статус поездки — всё должно обновляться вживую у пассажира, водителя, оператора и в админке одновременно. Это построено на Socket.IO: одно событие расходится по всем подключённым ролям.
- Распределение заказов между водителями. Заказ нужно предложить подходящим водителям (по зоне подачи, тарифу, статусу), дать время принять, и если отказались — передать дальше. Система ведёт список отказавшихся, чтобы не предлагать заказ повторно. Это отдельный сервис распределения, а не просто «push всем».
- Тарифы и зоны. Стандарт и грузовое — разные цены и подсветка. Стоимость считается по адресу подачи и зоне города, а не по прямой линии. Грузовой заказ на 1080 ₽ и стандартный на 220 ₽ в одном списке должны визуально различаться, чтобы водитель не путался.
- Честные статусы. «Водитель онлайн» должно означать, что он реально на линии сейчас, а не «заходил два часа назад». Протухшие статусы — частая болячка таких систем. Сделали так, что статус отражает текущее состояние, а не последний known.
- Оператор как страховка. Не всё решает автоматика: бывает звонок от пожилого пассажира или сложный адрес. Оператор должен уметь создать заказ вручную, назначить водителя, поправить или отменить — поверх той же real-time системы.
Главное было не «сделать ещё один Uber», а собрать систему, которой парк сам управляет и в которой сам устанавливает правила — без чужой комиссии.
03 · Четыре системы
Приложение пассажира
Вход по номеру телефона (SMS), создание заказа с выбором точек на карте и расчётом стоимости до поездки, отслеживание машины в реальном времени. Простой интерфейс — заказать такси в три тапа.


Приложение водителя
Выход на линию одной кнопкой, лента доступных заказов с тарифом и ценой в каждой карточке, карта с пинами заказов, закрепление заказа за собой, экран заработка. Стандартные и грузовые заказы подсвечены по-разному. Автоназначение можно включить или принимать заказы вручную.



Операторская панель
Живая карта водителей и заказов, ручное создание и назначение. Оператор видит, кто на линии, какие заказы активны, может вмешаться: создать заказ за пассажира по звонку, назначить водителя, отменить. Статус заказа показывает его текущий этап.
Админ-панель
Полная картина парка для владельца: пользователи, водители (с модерацией новых), заказы, тарифы, зоны города, отзывы, эффективность. Дашборд показывает ключевые цифры — сколько пользователей, водителей онлайн, заказов и выручки.


04 · Результат
Таксопарк работает на своей системе без агрегатора. Пассажиры заказывают через приложение, водители принимают заказы в реальном времени, оператор подстраховывает на сложных случаях, владелец видит всю картину в админке. Более тысячи пользователей, свыше ста водителей, тысячи обработанных заказов.
Вся комиссия остаётся в парке — нет внешнего агрегатора, который забирает процент. Парк сам устанавливает тарифы, зоны и правила распределения.
05 · Что дальше
Система развивается: новые тарифы, доработка распределения заказов, аналитика эффективности водителей, улучшение карт. Архитектура из четырёх связанных через Socket.IO систем позволяет добавлять роли и сценарии, не ломая существующее.
Бэкенд (Node.js + MongoDB + Redis) и админка (React) развёрнуты в Docker, мобильные приложения собираются под iOS и Android из общей Flutter-кодовой базы. Новый функционал выкатывается на сервер, мобильные обновления — через сторы.