Логистика: рейсы, маршруты и автоматический разнос стоимости на товары
Рейс в AIERP — это собственная перевозка компании с привязкой к шаблону повторяющегося маршрута, машиной, водителем, тем, кто подтвердил рейс, плановой датой, стоимостью рейса, попутным грузом (его закупочной стоимостью, объёмом и весом) и одним из пяти статусов: запланирован, подтверждён, в пути, завершён, отменён. Маршрут — упорядоченный список точек с типом «загрузка» или «разгрузка», привязкой к городу и складу, плановым и фактическим временем прибытия. Заявки на товары привязываются к точкам рейса с пометкой «вручную» или «автоматически»; одна заявка может стоять в рейсе и на загрузке, и на разгрузке, но не дважды в одном типе. Система сама привязывает заявки в статусах «заказано» и «подготовлено у поставщика» к точкам загрузки рейса, если склад-отправитель совпадает с точкой, а дата готовности не позже даты рейса. После любого изменения состава или стоимости рейса себестоимость каждого товара пересчитывается с учётом доли стоимости рейса — пропорционально закупочной цене, с поправкой на попутный груз.
Что получает бизнес от модуля
Шаблоны повторяющихся маршрутов
Шаблон маршрута хранит название, описание и правило повторения. Система автоматически раскладывает шаблон на конкретные рейсы по календарю. Точки шаблона указываются в нужном порядке. Один шаблон «Москва — Краснодар по понедельникам и четвергам» — и рейсы создаются на месяцы вперёд автоматически.
Автоматическая привязка заявок к рейсу
Система сканирует заявки в статусах «заказано» и «подготовлено у поставщика» с датой готовности не позже даты рейса, у которых склад-отправитель совпадает с точкой загрузки рейса. Привязывает их к рейсу с пометкой «привязано автоматически». Защита от двойной привязки: заявки, уже стоящие на загрузке в других рейсах, не подхватываются.
Разнос стоимости на товары
Пересчёт себестоимости товара: базовая закупочная цена плюс сумма долей всех рейсов на единицу. Доля рейса распределяется пропорционально закупочной цене с учётом попутного груза: чем больше попутного груза в рейсе, тем меньшая доля стоимости приходится на товары заявок. Не «средняя по больнице», а реальная.
Финансовая аналитика рейса
Система считает по рейсу: выручка, закупочная стоимость, стоимость рейса, доля стоимости рейса на товары, валовая маржа, чистая прибыль, рентабельность в процентах. Подсветка статусов: прибыльный, низкая маржа (меньше 5%), высокая маржа (15% и выше), убыточный (чистая прибыль ниже нуля). Видно, окупился ли конкретный рейс.
Прогноз загрузки на разгрузке
По каждой точке разгрузки система показывает, какие товары ожидаются: активные заявки с этим магазином-получателем в 9 промежуточных статусах от «запрошено у поставщика» до «в маршрутном листе водителя». По каждой точке — итоги: количество позиций, общий объём, вес, закупочная и продажная стоимости. Можно заранее увидеть, поместится ли всё в машину.
Подбор машины по объёму
Система суммирует объём всех выбранных позиций рейса (объём единицы × количество) и возвращает 5 ближайших по объёму активных машин из парка (с объёмом не меньше требуемого, отсортированные по возрастанию). Не «универсальная Газель» — конкретные машины из вашего парка, подходящие под загрузку.
Жёсткие переходы статусов
Матрица допустимых переходов: «запланирован» — в «подтверждён» или «отменён», «подтверждён» — в «в пути» или «отменён», «в пути» — в «завершён» или «отменён», «завершён» — никуда (конечный), «отменён» — только обратно в «запланирован». Перенос даты возможен только пока рейс «запланирован» и не в прошлое. Удаление точки с заявками в пути блокируется проверкой.
Перенос заявки между рейсами
Безопасный перенос заявки из одного рейса в другой: проверка, что рейсы можно редактировать (не «завершён» и не «отменён»); для разгрузки заявка обязана быть в статусе «загружена в машину». Защита от двойной привязки даже при одновременных нажатиях кнопок. После — пересчёт себестоимости в обоих рейсах.
Автоматическая привязка после подтверждения заявки
Система ищет ближайший будущий запланированный рейс с подходящей точкой загрузки и привязывает к нему свежеподтверждённую заявку. Условия: статус «заказано» или «подготовлено у поставщика», заявка подтверждена, дата готовности не позже даты рейса, заявка ещё не привязана к рейсу как загрузка. Берётся первый подходящий по дате.
Что входит в Логистика
- 01
Карточка рейса: всё в одном месте
У рейса есть шаблон маршрута (если ехали по типовому пути) или собственное название, машина и водитель из вашего парка, тот, кто подтвердил рейс, плановая дата, стоимость, попутный груз с его закупочной стоимостью, объёмом и весом, статус и время подтверждения. Удалённые рейсы остаются в архиве — историю не теряем. Поиск идёт мгновенно по шаблону, машине, водителю, дате, статусу и времени подтверждения.
- 02
Точки маршрута: загрузки и разгрузки по порядку
У каждой точки рейса есть город, склад, порядковый номер остановки, тип «загрузка» или «разгрузка», плановое и фактическое время прибытия. Маршрут — упорядоченный список точек от первой загрузки до последней разгрузки. Если склада в городе нет — указывается только город (например, точка передачи у третьей стороны).
- 03
Связь рейса и заявок
У каждой связи заявки с рейсом отмечается, на загрузку или на разгрузку она поставлена, входит ли в текущий состав рейса и кто её привязал — система или человек. Одна и та же заявка может стоять в рейсе и на загрузке, и на разгрузке (сквозная доставка), но не дважды в одном типе — система не даст создать дубль.
- 04
Шаблоны с правилом повторения
У шаблона маршрута есть название, описание, правило повторения (по дням недели, числам месяца, любому календарю) и переключатель «активный». Точки шаблона хранятся в нужном порядке. Система раскладывает шаблон на конкретные рейсы в заданном периоде одной операцией. Отдельный анализ исторических загрузок подсказывает, какие маршруты повторяются у вас фактически — и предлагает оформить их как шаблоны.
- 05
5 статусов рейса
Запланирован, подтверждён, в пути, завершён, отменён — пять понятных стадий жизни рейса. Каждый статус подсвечен на дашборде своим цветом. Все расходы по рейсам автоматически попадают в финансовую статью «Грузоперевозки» — отдельной аналитики настраивать не нужно.
- 06
Жёсткие правила смены статуса
Из «запланирован» можно перейти в «подтверждён» или «отменён». Из «подтверждён» — в «в пути» или «отменён». Из «в пути» — в «завершён» или «отменён». «Завершён» — финальный статус. Из «отменён» можно вернуться только в «запланирован» (перепланирование). При попытке недопустимого перехода система сообщит, какой именно. При отмене рейса связи с заявками снимаются, а себестоимость товаров автоматически пересчитывается без доли этого рейса.
- 07
Как работает автопривязка заявок
Система берёт склады из точек загрузки рейса. Если точек загрузки нет — пропускает (чтобы случайно не очистить уже привязанные заявки). Затем убирает с загрузки те заявки, которые уже отменились или ещё не готовы. Подбирает кандидатов: заявки в статусах «заказано» или «подготовлено у поставщика», подтверждённые, с датой готовности не позже даты рейса, со складом-отправителем из точек загрузки, с положительным количеством, ещё не стоящие на загрузке в других рейсах. Привязывает их с пометкой «автоматически».
- 08
Безопасный перенос даты рейса
Перенести дату можно только пока рейс «запланирован» и только на сегодня или вперёд. Если рейс уже подтверждён, в пути или завершён — перенос блокируется с понятным сообщением: «Перенос даты возможен только для запланированных рейсов». Если дата в прошлом — «Нельзя перенести рейс на прошедшую дату». Если новая дата совпадает с текущей — никаких проверок не делается, изменение пропускается.
- 09
Защита от удаления нужной точки
При изменении маршрута нельзя удалить точку, по которой уже едут заявки «в пути». Система сравнивает прежний и новый состав маршрута, считает удаляемые точки и заявки, привязанные к ним. Если такие заявки есть — выводится сообщение с конкретным числом: «Невозможно удалить точку маршрута: по ней есть 4 заявки со статусом „в пути"».
- 10
Подбор машины под загрузку
Система складывает объём всех выбранных позиций рейса (объём единицы × количество) и подбирает 5 ближайших по объёму машин из вашего активного парка — таких, в которые загрузка точно влезет, отсортированных от самой компактной. Никаких «универсальная Газель» — только реально подходящие машины. Большую фуру ради пары коробок гонять не нужно.
- 11
Прогноз загрузки на разгрузке
По каждой точке разгрузки рейса видно, какие товары ожидаются: количество позиций, общий объём и вес, закупочная и продажная стоимость, развёрнутый список. Учитываются заявки в 9 промежуточных статусах — от «запрошено у поставщика» до «в маршрутном листе водителя», адресованные на этот магазин-получатель и ещё не доставленные. Если у товара нет собственных габаритов — берутся усреднённые по типу товара, с подсказкой «габариты взяты из категории».
- 12
Финансовая аналитика рейса
По выбранному составу рейса считаются выручка и закупочная стоимость товаров, стоимость самого рейса и её доли на товары и на попутный груз, валовая маржа и маржа в процентах, чистая прибыль (с вычетом доли стоимости рейса) и рентабельность, стоимость доставки на единицу. На карточке рейса сразу видно, прибыльный он, низкомаржинальный (меньше 5%), высокомаржинальный (15% и выше) или убыточный.
- 13
Пересчёт себестоимости с доставкой
При любом изменении состава рейса или его стоимости в фоне запускается пересчёт. Базовая себестоимость каждого товара — закупочная цена или цена прихода на склад. Для каждого активного рейса с ненулевой стоимостью система считает долю на товары (стоимость рейса × доля закупочной цены товаров в общей закупке с учётом попутного груза), затем распределяет её между товарами пропорционально их закупочной стоимости в рейсе. Сумма таких долей на единицу плюс базовая цена — это и есть себестоимость с доставкой.
- 14
Детальная разбивка себестоимости
По каждому товару заказа видно: базовая закупочная цена и её источник (заказ или приход на склад), список рейсов с датой, статусом, машиной, стоимостью рейса, попутным грузом, долей рейса на товары, прибавкой на единицу и накопительной себестоимостью после каждого рейса. Идеально для разбора «откуда взялась эта цифра» — каждое слагаемое прозрачно.
- 15
Сравнение с похожими рейсами
Для рейса по шаблону система находит похожие рейсы за последние 3 месяца (подтверждённые, в пути или завершённые) и показывает средние и предельные значения по стоимости, выручке, прибыли и количеству заявок. На карточке рейса сразу видно, насколько текущий рейс отличается от типовой картины — отклонения по стоимости или прибыли подсвечиваются.
- 16
Привязка к ближайшему рейсу
После подтверждения заявки или переноса даты её готовности система ищет ближайший подходящий запланированный рейс с точкой загрузки на нужном складе и сама привязывает к нему заявку. Есть и массовый пересборщик: одной операцией обновляет привязки во всех будущих запланированных рейсах — удобно после крупных импортов или сдвига сроков.
- 17
Экспорт документов рейса
Из карточки рейса одним кликом формируется путевой лист по всему рейсу, а по каждой точке разгрузки — УПД (универсальный передаточный документ). Файлы готовы в Excel и PDF, оформление — стандартное для бухгалтерии. Можно выдать водителю на руки или отправить контрагенту.
- 18
Расписание и календарь рейсов
Календарь рейсов с цветовой подсветкой по статусам, сводка за период, список рейсов на конкретный день, печатная версия, генерация рейсов из активных шаблонов на нужный период, синхронизация при изменении шаблонов. Всё, что нужно менеджеру логистики, — в одном модуле.
- 19
Быстрая работа списков логистики
Списки рейсов, карточки и подбор кандидатов на загрузку держатся в быстрой памяти. Любое изменение рейса автоматически сбрасывает кэш — пользователь всегда видит актуальную картину. Списки логистики и расписание открываются мгновенно даже при большом количестве рейсов.
Как это выглядит в системе
Частые вопросы
Это про last-mile курьеров и СДЭК?
Нет. Готовых интеграций с СДЭК, Boxberry, постаматами в текущей версии нет. Модуль ведёт собственные рейсы компании — машины из своего парка, водители-сотрудники, точки на собственных складах. Если нужен last-mile через партнёров — это отдельная задача, не обещаем функционал, которого нет.
Что такое точки загрузки и разгрузки?
У каждой точки маршрута есть тип: загрузка (там, где забираем груз — обычно склад поставщика) или разгрузка (там, где сдаём груз — обычно собственный склад-получатель или магазин). В одном рейсе может быть несколько загрузок и несколько разгрузок. Заявка попадает на загрузку, если её склад-отправитель совпадает с точкой, и на разгрузку, если адрес получателя совпадает с точкой.
Как именно заявки автоматически попадают в рейс?
Берутся заявки в статусах «заказано» и «подготовлено у поставщика» (ещё не в пути), с датой готовности не позже даты рейса, подтверждённые и не отклонённые, в активных заказах (не «Закрыт», «Новый», «Думает», «Отменен», «На отмене», «На отмену»), с положительным количеством, чей склад-отправитель есть среди точек загрузки рейса. Заявки, уже привязанные на загрузке к другим рейсам, не подхватываются. Подходящие — отмечаются пометкой «привязано автоматически» к точке загрузки.
А что если у заявки сменилась дата готовности?
При пересборке состава рейса система сначала снимает с загрузки те заявки, что находятся в статусах «заказано», «подготовлено у поставщика» или «отменено». То есть заявки, у которых ушёл срок или которые отменили, выпадают из рейса автоматически. Уже забранные (в пути, получено на склад и т. п.) остаются — они часть истории рейса и его себестоимости.
Что если у рейса нет точек загрузки?
Тогда автопересборка пропускает рейс — это защита: иначе алгоритм очистил бы привязки и оставил рейс пустым. Если рейс предназначен только для разгрузки (например, развоз с центрального склада) — заявки добавляются в него вручную в режиме «разгрузка».
Как заявка попадает на разгрузку?
Тип точки определяется автоматически: если склад-отправитель заявки совпадает с точкой загрузки — это загрузка; иначе если адрес получателя совпадает с точкой разгрузки — это разгрузка; иначе по умолчанию загрузка. Чтобы поставить заявку на разгрузку, она должна быть в статусе «загружена в машину» — иначе система выдаст сообщение: «Для доставки заявка должна быть в статусе „загружена в машину". Текущий статус: …».
Можно ли иметь одну заявку и на загрузке, и на разгрузке одного рейса?
Да. На уровне базы данных стоит защита от дублей по тройке «рейс — заявка — тип точки», поэтому для одной заявки в одном рейсе можно создать две связи: одна с типом «загрузка» (взяли у поставщика), вторая с типом «разгрузка» (привезли на склад). Это сквозная доставка одним рейсом — частая практика на коротких плечах.
Какие переходы статусов разрешены?
Из «запланирован» — в «подтверждён» или «отменён». Из «подтверждён» — в «в пути» или «отменён». Из «в пути» — в «завершён» или «отменён». «Завершён» — финальный статус. Из «отменён» — только обратно в «запланирован» (чтобы перепланировать). Прямой переход из «запланирован» в «в пути», из «подтверждён» обратно в «запланирован» и т. п. блокируется с сообщением «Невозможно перевести рейс из X в Y».
Можно ли перенести дату рейса?
Только если рейс в статусе «запланирован» и новая дата не в прошлом. Система проверяет это перед сохранением. Если рейс уже подтверждён, в пути или завершён — перенос блокируется: там уже назначены водитель, машина, заявки, экипаж готов выезжать. Если дата фактически не меняется — никаких проверок не делается, изменение пропускается.
Можно ли удалить точку маршрута?
Если по точке нет заявок «в пути» — да. Система сравнивает прежний и новый состав маршрута, считает удаляемые точки и заявки на них в статусе «в пути». Если такие есть — выводится сообщение с конкретным числом: «Невозможно удалить точку маршрута: по ней есть 4 заявки со статусом „в пути"».
Что такое попутный груз?
У рейса есть три поля попутного груза: его закупочная стоимость, объём и вес. Это то, что едет в этом рейсе, но не оформлено заявкой (например, личные вещи для другого магазина, расходники, оборудование). Попутный груз учитывается при разносе стоимости рейса на товары: чем больше «лишнего» груза — тем меньшая доля стоимости рейса приходится на товары заявок, и тем точнее себестоимость.
Как именно стоимость рейса попадает в себестоимость товара?
Для каждого товара заказа базовая цена — это цена прихода на склад (если товар уже принят) или закупочная цена из заказа. Для каждого активного рейса с ненулевой стоимостью считается доля на товары: стоимость рейса × (закупочная цена товаров заявок / (закупочная цена товаров + попутный груз)). Эта доля распределяется между товарами рейса пропорционально их закупочной стоимости в рейсе и делится на количество — получается прибавка на единицу. Сумма прибавок плюс базовая цена и есть себестоимость с доставкой.
Почему разнос пропорционален закупочной цене, а не объёму?
Решение проекта: распределять стоимость рейса пропорционально стоимости груза, а не его объёму или весу. Это соответствует логике «дорогой товар несёт больше логистики». Алгоритм единый для всех. На карточке товара заказа есть детальная разбивка, в которой видна каждая доля каждого рейса — всегда можно посмотреть, как именно стоимость разошлась.
Что показывает финансовая аналитика рейса?
По выбранному составу рейса считается выручка, закупочная стоимость товаров, стоимость самого рейса и её доли на товары и на попутный груз, валовая маржа (выручка минус закупка) и чистая прибыль (валовая маржа минус доля стоимости рейса на товары), рентабельность в процентах от выручки. Подсветка статуса: убыточный (чистая прибыль ниже нуля), низкомаржинальный (меньше 5%), высокомаржинальный (от 15%), прибыльный. На карточке рейса сразу видно, окупился ли он.
Как работает прогноз загрузки на разгрузке?
По каждой точке разгрузки система возвращает количество позиций, общий объём и вес, закупочную и продажную стоимость и список товаров. Учитываются активные заявки в 9 промежуточных статусах: «запрошено у поставщика», «заказано», «подготовлено у поставщика», «в пути», «получено на склад», «подготовлено на складе», «подготовлено в магазине», «загружено в машину», «в маршрутном листе водителя» — адресованные на этот магазин-получатель. Если у товара нет собственных габаритов — берутся усреднённые из типа товара, с пометкой об этом.
Что такое шаблоны маршрутов и зачем они нужны?
Шаблон — это повторяющийся маршрут (например, «Москва → Краснодар по понедельникам»). У шаблона есть правило повторения и точки в правильном порядке. Система раскладывает активные шаблоны на конкретные рейсы в нужном периоде. Это убирает рутину «создавать тот же рейс 4 раза в месяц вручную».
Можно ли сгенерировать шаблоны из истории?
Да. Отдельный анализ просматривает прошлые загрузки заявок и находит повторяющиеся пары «склад А → склад Б» с регулярной частотой. На основе найденных закономерностей можно одной операцией создать шаблоны маршрутов. Удобно для сетей, которые сначала возили вручную, а потом хотят формализовать постоянные маршруты.
Подбор машины — как работает?
Сначала складывается объём всех выбранных позиций рейса: объём единицы товара × количество. Затем берутся активные машины из вашего парка с объёмом не меньше требуемого, сортируются по возрастанию и возвращаются первые 5. На карточке видно требуемый объём и список рекомендованных машин «от самой компактной подходящей». Не «универсальная Газель» — конкретные машины из вашего парка.
Что происходит с расходами при отмене рейса?
При переводе рейса в «отменён» система сначала запоминает все товары, затронутые этим рейсом (до удаления связей — иначе список оказался бы пустым), потом удаляет связи с заявками и для каждого товара запускает пересчёт себестоимости. Отмена рейса корректно «откручивает» его долю расходов из себестоимости всех затронутых товаров — маржа в отчётах остаётся честной.
Куда списываются деньги по рейсу в финансах?
У рейса автоматически проставляется системная финансовая статья «Грузоперевозки» — все финансовые операции по рейсу попадают именно туда. На карточке рейса виден список платежей, привязанных к нему. При разборе банковской выписки система сама подсказывает рейсы по ИНН перевозчика — платёж можно привязать одним кликом.
Какие защиты от одновременных нажатий?
На уровне базы данных стоит защита от дублей по тройке «рейс — заявка — тип точки». Параллельные нажатия кнопок «добавить», «переместить», «выбрать» не создадут дублирующих связей: первая операция вставит запись, вторая увидит существующую. Тяжёлые операции (подтверждение рейса, пересборка состава, работа с грузом) выполняются единой транзакцией — при любой ошибке всё откатывается.
Что в быстрой памяти?
Списки рейсов, их карточки и подбор кандидатов на загрузку держатся в быстрой памяти. Любое изменение рейса автоматически сбрасывает кэш, чтобы пользователь всегда видел актуальную картину. Сводка по логистике и расписание открываются мгновенно даже при большом количестве рейсов.
Что экспортируется по рейсу?
Путевой лист (Excel или PDF) — со списком точек, грузом, расчётом стоимости. УПД по конкретной точке разгрузки — стандартный универсальный передаточный документ для получателя. Оба документа формируются за один клик из карточки рейса и доступны для скачивания.
Можно ли сравнить рейс с похожими?
Да. Для рейса по шаблону система находит похожие рейсы за последние 3 месяца (подтверждённые, в пути или завершённые) и показывает средние и предельные значения по стоимости, выручке, прибыли и количеству заявок. На карточке текущего рейса видно отклонение от средних — слишком дорогой рейс или подозрительно мало товара подсветится.
Что меняется на реальной сети
- Было
- Рейсы привязывались к заявкам вручную в Excel: «эта заявка едет с этим рейсом». Сменилась дата готовности — забывали переснять, заявка зависала вне рейсов. Один и тот же товар попадал в два рейса — в себестоимости получалась двойная стоимость доставки.
- Сделали
- Перенесли в модуль рейсов с шаблонами повторяющихся маршрутов. Система сама берёт заявки в статусах «заказано» и «подготовлено у поставщика» с подходящей датой готовности и складом-отправителем. Исключение дублей встроено: одна заявка не попадёт на загрузку в два рейса. После переноса даты готовности заявка автоматически ловится в следующий подходящий рейс.
- Стало
- Зависших заявок «вне рейсов» нет — следующий рейс с подходящим складом её подбирает. Двойного разноса стоимости нет — защита встроена в систему. Себестоимость пересчитывается на лету.
- Было
- Себестоимость товара включала только закупочную цену. Логистика учитывалась общей строкой в отчёте о прибылях и убытках и не «садилась» на конкретный товар. Не могли понять, какой товар реально маржинальный с учётом доставки, а какой убыточен — выясняли только постфактум.
- Сделали
- Включили автопересчёт себестоимости после создания и изменения каждого рейса. Себестоимость каждого товара стала равна базовой закупочной цене плюс сумма долей рейсов на единицу. Доли распределяются пропорционально закупочной стоимости с учётом попутного груза. На карточке товара есть детальная разбивка каждой доли.
- Стало
- Менеджер видит реальную себестоимость с учётом доставки до того, как товар уехал в магазин. Маржинальность считается корректно. Несколько товаров оказались нерентабельными на их обычном маршруте — пересчитали логистику, заменили поставщика.
- Было
- Каждую неделю менеджер логистики вручную создавал одни и те же 6 рейсов — копировал из прошлой недели в Excel. Точки, машины, водители повторялись, но генерировались вручную. На месяц — 4 часа рутины.
- Сделали
- Завели 6 шаблонов маршрутов с правилом повторения по дням недели. Расписание раскладывает шаблоны в конкретные рейсы на месяц вперёд одной операцией. Точки и приоритеты копируются из шаблона. Анализ исторических загрузок дополнительно подсказал ещё 2 регулярных маршрута, которые менеджер не замечал.
- Стало
- Рутина создания рейсов исчезла. Месяц рейсов формируется за один клик. Шаблоны можно отключить при сезонных изменениях без потери настроек.
- Было
- Знали, сколько товара уходит развозом по магазинам в общем, но не могли заранее увидеть, что точка получит на следующем рейсе. Машина на 12 кубов часто приезжала полупустой или, наоборот, не вмещала весь поток.
- Сделали
- Прогноз загрузки по каждой точке разгрузки за день до рейса показывает количество позиций, общий объём и вес. Учитываются активные заявки в девяти промежуточных статусах с этим магазином-получателем. Если объём на точке больше свободного места в машине — менеджер видит, что часть заказов лучше отправить следующим рейсом.
- Стало
- Машина едет с правильной загрузкой. Магазины не получают «слишком много в одном рейсе и потом ничего» — поток равномерный. Расчёт требуемого объёма и подбор машины помогают сменить транспорт, если стандартная не вмещается.
- Было
- Не было понятно, окупается ли конкретный рейс. Стоимость рейса списывалась в общие расходы, без привязки к выручке этого рейса. Подозревали, что один из маршрутов убыточен, но доказать не могли.
- Сделали
- Включили финансовую аналитику на карточке рейса: выручка (сумма «цена × количество» по выбранным позициям), валовая маржа, чистая прибыль с вычетом доли стоимости рейса на товары, рентабельность в процентах. Подсветка статуса: убыточный (прибыль ниже нуля), низкомаржинальный (меньше 5%), высокомаржинальный (15% и выше), прибыльный. Сравнение со средними по похожим рейсам за 3 месяца — рядом.
- Стало
- Один маршрут оказался стабильно низкомаржинальным (3,2% при среднем по сети 12%) — сократили его частоту, объединили с соседним. Высокомаржинальные рейсы запустили чаще. Видимость прибыли по каждому рейсу — на сводке.
- Было
- При попытке отменить рейс «задним числом» связи с заявками снимались, но себестоимость товаров оставалась «зависшей» с долей этого рейса. Себестоимость завышалась, маржа в отчётах казалась хуже реальной.
- Сделали
- При переводе рейса в «отменён» система сначала запоминает все товары, затронутые этим рейсом (до удаления связей — иначе список оказался бы пустым), затем убирает связи и для каждого товара запускает пересчёт себестоимости в фоне. Та же логика — при жёстком удалении рейса. За минуту-две очередь обрабатывает все пересчёты.
- Стало
- Отмена рейса корректно «откручивает» его долю из себестоимости всех товаров, которые в нём были. Маржа в отчётах честная. Есть отдельный механизм повторного пересчёта на случай ручных правок, которые не отлавливаются автоматически.
Как модуль помогает розничной сети
Логистика рейсов — как ERP управляет собственным транспортом
Модуль логистики в AIERP — это собственные рейсы компании: машины из своего парка, водители-сотрудники, точки на собственных складах или у поставщиков. Это не интеграция с внешними службами вроде СДЭК и не last-mile с курьерами для физлиц — это бэк-офис межскладской и оптовой логистики. У каждого рейса есть: ссылка на шаблон повторяющегося маршрута (или собственное название, если рейс разовый), машина и водитель из вашего парка, тот, кто подтвердил рейс, плановая дата, стоимость рейса для разноса на товары, попутный груз с его закупочной стоимостью, объёмом и весом, статус и время подтверждения. Удалённый рейс остаётся в архиве — мягкое удаление сохраняет историю.
Маршрут — упорядоченный список точек, у каждой есть город, склад, порядковый номер остановки, тип «загрузка» или «разгрузка», плановое и фактическое время прибытия. Связь рейса с заявками — отдельная запись, в которой указано, на загрузке или на разгрузке стоит заявка, входит ли она в текущий состав рейса и кто её привязал (система или человек). Защита от дублей по тройке «рейс — заявка — тип точки» позволяет одной заявке быть в одном рейсе и на загрузке, и на разгрузке — сквозная доставка одним рейсом.
Жизненный цикл рейса: 5 статусов и правила переходов
У рейса 5 статусов: «запланирован», «подтверждён», «в пути», «завершён», «отменён». Жёсткие правила переходов: из «запланирован» — в «подтверждён» или «отменён»; из «подтверждён» — в «в пути» или «отменён»; из «в пути» — в «завершён» или «отменён»; «завершён» — финальный; из «отменён» — только обратно в «запланирован» (чтобы перепланировать). При попытке недопустимого перехода система выводит сообщение «Невозможно перевести рейс из X в Y».
Подтверждение рейса — отдельная операция-фасад над переходом из «запланирован» в «подтверждён». Принимает машину, водителя, стоимость и точки маршрута. Делает три вещи разом: меняет статус, фиксирует время и того, кто подтвердил, пересоздаёт точки маршрута и пересобирает состав заявок под новые точки. Это закрывает классический сценарий: «менеджер логистики окончательно понял, какую машину взять и в какие точки заехать — нажал „подтвердить" и одной кнопкой зафиксировал всё».
Автоматическая привязка заявок к рейсу
Основной механизм автозаполнения рейса работает так. Сначала собираются склады из точек загрузки рейса. Если точек загрузки нет — пересборка пропускается (защита от случайной очистки уже привязанных). Дальше система убирает с загрузки заявки в статусах «заказано», «подготовлено у поставщика» и «отменено» — то есть ещё не забранные или уже снятые. Из общей очереди отсекаются заявки, уже стоящие на загрузке в других рейсах (одна и та же заявка не должна оказаться на заборе в двух местах одновременно). Среди оставшихся подбираются кандидаты: с датой готовности не позже даты рейса, в статусах «заказано» или «подготовлено у поставщика», подтверждённые, в активных заказах, со складом-отправителем из точек загрузки и положительным количеством.
Есть и точечный сценарий. После подтверждения заявки или переноса даты её готовности система ищет ближайший подходящий запланированный рейс (датой не раньше сегодня и не раньше даты готовности), у которого есть точка загрузки на нужном складе, и привязывает к нему заявку. Берётся первый рейс по календарю. Если такого нет — заявка остаётся «вне рейсов» до создания нового подходящего. Массовая пересборка одной операцией обновляет привязки во всех будущих запланированных рейсах с точками загрузки — используется после крупных импортов поставок или переноса сроков.
Разнос стоимости рейса на единицу товара
Пересчёт себестоимости — главная финансовая логика модуля. Для каждого товара заказа итоговая цена с доставкой считается так: базовая закупочная цена плюс сумма долей всех рейсов на единицу. За базовую берётся цена прихода на склад (если товар уже принят и она положительная), иначе закупочная цена из заказа. Для каждого активного рейса с ненулевой стоимостью считается доля на товары: стоимость рейса × (закупочная цена товаров заявок / (закупочная цена товаров + попутный груз)). Это доля стоимости рейса, приходящаяся на товары заявок (а не на попутный груз).
Дальше эта доля распределяется между товарами рейса пропорционально их закупочной стоимости в рейсе. Деление на количество товара даёт прибавку на единицу. После расчёта цена с доставкой обновляется. Пересчёт запускается в фоне при любом изменении состава или стоимости рейса, при подтверждении, отмене, жёстком удалении, перемещении заявки между рейсами. На карточке товара есть детальная разбивка: базовая цена и её источник, список рейсов с накопительной себестоимостью после каждого. Полностью прозрачный аудит «откуда взялась себестоимость с доставкой».
Шаблоны маршрутов и календарь рейсов
Шаблон маршрута описывает повторяющийся рейс: название, описание, правило повторения (по дням недели, числам месяца, любому расписанию) и переключатель «активный». Точки шаблона хранятся в нужном порядке. Расписание раскладывает активные шаблоны на конкретные рейсы в заданный период — например, формирует рейсы на месяц вперёд за одну операцию. Каждый созданный рейс наследует точки шаблона.
Отдельный анализ просматривает историю загрузок заявок и находит повторяющиеся пары «склад А → склад Б» с регулярной периодичностью и датами. Из найденных закономерностей одной операцией создаются шаблоны — менеджер не пишет их с нуля, система предлагает их на основе того, как сеть фактически работает. В расписании есть: календарь рейсов, сводка за период, рейсы на конкретный день, печатная версия, синхронизация при изменении шаблонов.
Финансовая аналитика и сравнение похожих рейсов
Финансовая аналитика на карточке рейса считает: закупочную стоимость товаров (сумма «закупочная цена × количество»), выручку (сумма «продажная цена × количество»), стоимость самого рейса и её доли на товары и на попутный груз, валовую маржу (выручка минус закупка) и маржу в процентах, чистую прибыль (валовая маржа минус доля стоимости рейса на товары) и рентабельность от выручки, стоимость доставки на единицу. Статус прибыльности подсвечивается одним из четырёх значений: убыточный (прибыль меньше нуля), низкомаржинальный (меньше 5%), высокомаржинальный (от 15%) и прибыльный. Рядом — человекочитаемое сообщение с конкретными цифрами убытка или маржи.
Для рейса по шаблону система находит похожие рейсы за последние 3 месяца (подтверждённые, в пути или завершённые) и показывает средние и предельные значения по стоимости, выручке, прибыли и количеству заявок. Это даёт контекст: текущий рейс — типовая картина или аномалия. Слишком дорогой рейс (стоимость выше средней на заданный процент) или подозрительно мало товара (количество ниже половины среднего) подсвечиваются менеджеру до подтверждения.
Защиты, фоновая обработка и быстрая работа списков
Защиты от одновременных нажатий: на уровне базы данных стоит правило уникальности по тройке «рейс — заявка — тип точки», а во всех точках добавления используется операция «найти или создать». Параллельные запросы при добавлении, перемещении, переключении заявок не создадут дублей: первый запрос вставит, второй увидит уже существующую связь. Тяжёлые операции (подтверждение рейса, пересборка состава, работа с грузом) выполняются единой транзакцией — при любой ошибке всё откатывается.
Пересчёт себестоимости с доставкой работает в фоновой очереди обработки. Он запускается при любом изменении состава рейса или его стоимости: создании, обновлении, удалении, восстановлении, смене статуса (особенно при отмене), а также при добавлении, удалении, перемещении заявки между рейсами и массовом снятии. Это позволяет интерфейсу отвечать мгновенно, а реальный пересчёт делается отдельно. Списки рейсов, карточки и подбор кандидатов на загрузку держатся в быстрой памяти; любое изменение автоматически сбрасывает кэш — пользователь всегда видит актуальные данные.
Готовы автоматизировать?
Покажем модуль на ваших данных и подключим за 1–2 недели.
