RUEN
Обсудить проект

Продукт студии

LogiTMS

Система управления перевозками: заявки, сборка рейсов, подбор машины и водителя, живая карта и отдельный экран для водителя.

экранов
14
таблиц данных
16
ключей от картографии
0
Панель LogiTMS с демонстрационным набором данных

Рабочее место диспетчера небольшого транспортного или курьерского парка: приём заявок, сборка рейсов, подбор автомобиля и водителя, оптимизация порядка точек, живая карта, экран водителя, документы и аналитика. Работает в браузере и как настольное приложение под Windows.

Порядок точек считается в два прохода — и с жёстким условием

Сначала ближайший сосед, потом попарные перестановки. Но над обоими проходами стоит ограничение, без которого оптимизация превращается в ловушку: забор груза всегда раньше его доставки. Маршрут, где машина сначала приезжает выгружать, короче — и бесполезен.

Диспетчеру показывается не слово «оптимально», а сколько километров и минут это сэкономило против исходного порядка. Разница принципиальная: во втором случае человек видит цену решения и может с ним не согласиться.

Подбор машины объясняет отказ по-человечески

«Подобрать автомобиль» оценивает весь парк под конкретную заявку и показывает пятёрку лучших вариантов. Но важнее то, что происходит при неудачном назначении.

Бизнес-правила возвращают не код ошибки, а причину: превышена грузоподъёмность, не хватает объёма, машина на сервисе, водитель офлайн или уже в рейсе, завершённую заявку отменять нельзя. Диспетчер не гадает, почему система не дала назначить, — он читает, что именно не сходится.

Экран водителя — отдельное приложение в том же коде

У водителя своя страница без сайдбара и панелей: «Начать рейс» → «Прибыл» → «Подтвердить доставку» или «Загрузка завершена» → «Завершить рейс». Рядом — позвонить и открыть маршрут в карте телефона.

Подтверждение доставки собирает то, что потом спрашивают в спорах: подпись пальцем на холсте, фотографии, ФИО получателя, комментарий и координаты в момент подтверждения.

Карта без единого ключа

Leaflet и тайлы OpenStreetMap — ни одного API-ключа, ни одного платного лимита. Свои маркеры для забора, доставки, промежуточных точек, машины и проблемных мест, поворот значка машины по курсу, линии маршрутов, фильтры «все / в пути / свободные / проблемы».

Геокодинг адресов — Nominatim с собственным кэшом в базе и запасным списком: пропала сеть — приложение продолжает работать, а не встаёт на вводе адреса.

Экраны обновляются сами, без опроса сервера

Внутри — типизированная шина доменных событий: «заявка создана», «рейс начат», «машина сдвинулась». Хук подписки перезагружает только те экраны, которых изменение касается, а не всё подряд по таймеру.

Отсюда и симулятор движения: каждые три с половиной секунды он двигает машины активных рейсов к следующей точке, отмечает прибытие и освобождает машину — а карта и таблицы обновляются сами, потому что слушают те же события, что будут слушать при настоящем GPS.

Локальное хранилище, написанное так, будто за ним сервер

Данные лежат в браузере: шестнадцать таблиц в IndexedDB со своими индексами. Но приложение написано не как «локальная программа».

Доступ к данным идёт только через репозитории, чьи сигнатуры повторяют будущие адреса REST. Запись сначала попадает в локальное хранилище, потом в очередь на отправку, и очередь переживает перезагрузку страницы. Подключение настоящего сервера — это замена одного слоя, а не переписывание интерфейса.

Три провайдера, которые меняются по одному

Геокодинг, построение маршрута и слежение за машинами вынесены за интерфейсы. Сегодня за ними стоят локальные реализации: расстояние считается по прямой с поправкой, позиции машин даёт симулятор.

Это осознанная граница, а не заглушка на скорую руку. Подключение внешнего маршрутизатора или настоящего GPS — замена одного класса: интерфейс уже описан, экраны не меняются.

Настольная версия

Electron с изоляцией контекста и песочницей, без доступа к системным модулям из страницы, с русифицированным меню и автообновлением. Диспетчеру не нужно держать вкладку в браузере, а приложение обновляется само.

На снимке — демонстрационный набор данных, а не работа реального парка.

TypeScript · React 18 · Vite · Tailwind CSS · IndexedDB · Leaflet · Recharts · PocketBase · Electron