Диспетчер

{{ mapCounters.waiting }}
Ожидают
{{ mapCounters.inProgress }}
В работе
{{ mapCounters.online }}
Онлайн
{{ mapCounters.gpsStale }}
GPS устарел
🔵 Курьер (Своб.) 🟠 Курьер (Занят) 🏠 Ресторан 📍 Точка доставки

Все заказы

АКТИВНЫЕ ЗАВЕРШЕНЫ ВСЕ
#{{ order.orderDetails.uniqNum }} {{ orderRiskLabel(order) }} {{ getOrderStatusLabel(order.status) }}
🏬 {{ order.orderDetails.cafeName }}
🍳 Готовность на кухне: {{ new Date(order.readyAt).toLocaleTimeString('ru-RU', {hour: '2-digit', minute:'2-digit'}) }}
👤 {{ order.orderDetails.customerFullName }}
{{ formatDateTime(order.createdAt) }}
📡 Оповещено: {{ order.notifiedCouriersCount }}
Ждет {{ getPendingMinutes(order.placedAt || order.createdAt) }} мин.

Персонал

{{ c.name }} 🟢 🔴 ↗ профиль
{{ c.phone }} | {{ c.city }}
В работе: {{c.activeOrderIds.length}} зак. | Сделано за сегодня: {{ c.completedToday || 0 }}
Обновлено: {{ formatRelativeTime(c.location.lastUpdated) }}
Вместимость: {{ c.maxConcurrentOrders || 3 }} | Транспорт: {{ c.vehicleType || 'bike' }} | Лимит батча: {{ c.maxBatchSize || 3 }}

Смены Курьеров

Назначить смену

Запланированные смены

🚴 {{ shift.courierName }}
С: {{ new Date(shift.startTime).toLocaleString('ru-RU') }}
До: {{ new Date(shift.endTime).toLocaleString('ru-RU') }}
{{ shift.price }} ₽
Нет активных смен

Рестораны

Укажите, сколько в среднем минут ресторан готовит заказ. Это поможет диспетчеру не отправлять курьеров слишком рано.
{{ cafe.name }}
ID: {{ cafe.cafeId }}
Prep default (мин)
Среднее время приготовления (мин) — используется по умолчанию
Prep p50 (мин)
Медианное (50-й перцентиль) время приготовления
Prep p90 (мин)
90-й перцентиль: 90% заказов готовы быстрее
Приоритет
Приоритет ресторана при диспетчеризации (1–10, выше = важнее)
Буфер забора (мин)
Доп. время между готовностью и прибытием курьера (мин)
Батчинг
Разрешить объединение нескольких заказов в один рейс
Обучение модели
Обучено: {{ { high: 'Высокое', medium: 'Среднее', low: 'Низкое' }[cafe.learning_status.confidence] || cafe.learning_status.confidence }}
{{ cafe.learning_status.total_samples || 0 }} заказов | {{ cafe.learning_status.hours_covered || 0 }} ч. охвата
Последнее обновление: {{ formatTimeAgo(cafe.learning_status.last_updated_at) }}
Рестораны появятся здесь после первых заказов

Аналитика

{{ formattedAnalyticsDate }}
Динамика
Заказы
{{ periodCompare.current.total }} {{ formatDelta(periodCompare.deltas.total) }}
было {{ periodCompare.previous.total }}
Завершено
{{ periodCompare.current.completed }} {{ formatDelta(periodCompare.deltas.completed) }}
было {{ periodCompare.previous.completed }}
Выручка
{{ formatMoney(periodCompare.current.revenue) }} {{ formatDelta(periodCompare.deltas.revenue) }}
было {{ formatMoney(periodCompare.previous.revenue) }}
Ср. время
{{ periodCompare.current.avgDeliveryMin ?? '—' }} мин {{ formatDelta(periodCompare.deltas.avgDeliveryMin) }}
было {{ periodCompare.previous.avgDeliveryMin ?? '—' }} мин
Загрузка...
Сумма заказов
{{ adminStats.global.revenueToday.toLocaleString() }} ₽
Зараб. Курьеров
{{ adminStats.global.deliveryToday.toLocaleString() }} ₽
Всего заказов
{{ adminStats.global.totalOrdersToday }}
Актв. Курьеров
{{ adminStats.global.activeCouriers }}
Ср. время доставки
{{ adminStats.global.avgDeliveryTime }} мин

Заказы по часам

Статусы заказов

Топ Ресторанов

Нет данных
  • {{ rest._id || 'Неизвестно' }} — {{ rest.count }} зак.

Drilldown

Всего заказов {{ analyticsDrilldown.metrics.totalOrders || 0 }}
Активные {{ analyticsDrilldown.metrics.activeOrders || 0 }}
Завершены {{ analyticsDrilldown.metrics.finishedOrders || 0 }}
Отменены {{ analyticsDrilldown.metrics.canceledOrders || 0 }}

Кастомная статистика

Начало:
Конец:
Курьер:
Выполнено заказов: {{ adminCustomResult.count }}
Заработано: {{ adminCustomResult.earnings }} ₽
Список заказов
#{{ order.orderDetails.uniqNum }} +{{ order.orderDetails.deliveryPrice }} ₽
✅ {{ formatDateTime(order.finishedAt) }}
🏪 {{ order.orderDetails.cafeName }}
Заказов нет.

PDF Отчет по ресторану

Быстрый выбор:
Неделя
Месяц
Всё время
Начало:
Конец:
Ресторан:

Формируем отчет...

Бот скоро пришлет файл в чат 📄

Финансы (Месяц)

Чистая прибыль
{{ finStats.financials.netProfit.toLocaleString() }} ₽
(Доход - Расходы)

Детализация

💰 Выручка (10%): {{ finStats.financials.totalRevenue.toLocaleString() }} ₽
📉 Фикс. расходы: -{{ finStats.financials.fixedCosts.toLocaleString() }} ₽
🚴 Доплаты курьерам: -{{ finStats.financials.courierSubsidies.toLocaleString() }} ₽
Итого Расходы: {{ finStats.financials.totalExpenses.toLocaleString() }} ₽

Точка безубыточности

Чтобы выйти в плюс сегодня, нужно заказов:
{{ finStats.analytics.neededOrdersPerDay }}
(Текущий темп: {{ finStats.analytics.currentOrdersPerDay }} в день)
ℹ️ Расчет: (Фикс + Доплаты) / Ср.Доход с заказа ({{ finStats.analytics.avgRevenuePerOrder }}₽)

Структура расходов

Загрузка...

Настройки

Admin token

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

Ценообразование доставки

Базовая стоимость доставки (₽)
Фиксированная стоимость доставки независимо от расстояния
Бесплатные километры (км)
Радиус от ресторана, за который доп. плата не берется
Стоимость за 1 км сверх бесплатных (₽)
Доп. плата за каждый км сверх бесплатного радиуса

Правила диспетчеризации

Размер волны (dispatchWaveSize)
Макс. число курьеров, оповещаемых за одну волну диспетчеризации
Макс. батч (maxBatchSize)
Максимальное число заказов в одном попутном рейсе
Макс. удлинение маршрута (мин)
На сколько минут допустимо удлинить маршрут при батчинге
Макс. задержка SLA существующего заказа (мин)
Предел задержки уже назначенного заказа при добавлении попутного
Макс. время еды в пути (мин)
Максимальное допустимое время от забора еды до доставки клиенту
GPS устарел через (сек)
Через сколько секунд без обновления GPS считается устаревшим
Cooldown уведомлений (сек)
Минимальный интервал между повторными уведомлениями одному курьеру
Cooldown повтора (сек)
Пауза перед повторной попыткой назначить нераспределённый заказ

Параметры курьеров

Макс. одновременных заказов
Сколько активных заказов курьер может вести параллельно
Предупреждение до смены (мин)
За сколько минут до начала смены бот напомнит курьеру
Длительность перерыва (мин)
Стандартная длина перерыва (курьер уходит с радара)
Вместимость по умолчанию
Количество сумок/слотов у курьера (используется если не задано вручную)

Финансы и часовой пояс

Часовой пояс
Напр.: Europe/Moscow. Влияет на отчеты и аналитику
Комиссия (доля, 0.1 = 10%)
Процент от суммы заказа, зачисляемый как выручка сервиса
Гарантия курьера (₽/смена)
Минимальный гарантированный заработок за смену (если не выполнил — доплачиваем)
Аренда сервера (₽/мес)
Ежемесячные расходы на хостинг и инфраструктуру
Бухгалтерия (₽/мес)
Затраты на бухгалтерское сопровождение
Карты / OSRM (₽/мес)
Платежи за картографический сервис и маршрутизацию
Страховка (₽/мес)
Страхование ответственности и грузов

Уведомления

Шаблон предложения курьеру
Текст уведомления при предложении нового заказа
Шаблон назначения курьеру
Текст при жёстком назначении заказа курьеру
Шаблон сводки диспетчера
Шаблон итоговой сводки смены для диспетчера

Пользователи

Период
Сортировка
С
По
Загрузка...
👥
Нет данных за выбранный период
{{ u.customerFullName || maskPhone(u.phone) }} Постоянный
{{ maskPhone(u.phone) }}
{{ u.orderCount }} заказов
Выручка: {{ (u.totalRevenue || 0).toLocaleString('ru-RU') }} ₽
Чек: {{ u.avgOrderValue ? Math.round(u.avgOrderValue).toLocaleString('ru-RU') + ' ₽' : '—' }}
Последний: {{ formatUserLastOrder(u.lastOrderAt, u.daysSinceLast) }}
Первый заказ: {{ u.firstOrderAt ? formatDateTime(u.firstOrderAt).slice(0,10) : '—' }} | {{ u.cityKeys.join(', ') }}
Любимые рестораны: {{ c.name || c.cafeId }} ×{{ c.count }}
Часы заказов: {{ formatHourBucket(h.hour) }} ×{{ h.count }}
Дни недели: {{ formatWeekday(w.weekday) }} ×{{ w.count }}
Показано {{ usersList.length }} из {{ usersPagination.total }}

Прогноз

Расчёт прогноза...
📊
Недостаточно данных
Прогноз появится после 28 дней работы сервиса.
Ожидаемое число заказов
{{ day.expected !== null ? day.expected : '?' }}
{{ forecastDayOfWeek(day.date) }}
{{ forecastShortDate(day.date) }}
{{ forecastShortDate(forecastData[forecastActiveDay].date) }} — по часам
0:006:0012:0018:0023:00
Почасовой прогноз недоступен для этого дня
Прогноз строится по последним 4 одинаковым дням недели + тренд за 14 дней. Минимум 28 дней истории. Обновлён: {{ formatDateTime(forecastGeneratedAt) }}.

SLA-инбокс

Загрузка...
Алёртов нет — всё в порядке.
{{ alert.message }}
{{ alert.orderId }} {{ alert.courierName }} {{ alert.cafe }} {{ alert.ageMin }} мин +{{ alert.overdueMin }} мин {{ Math.round(alert.ageSec/60) }} мин
Обновлено: {{ formatDateTime(slaGeneratedAt) }}

Производительность

CSV
Загрузка...
Нет данных за выбранный период.
{{ idx + 1 }}. {{ row.name }}
Принятие {{ row.acceptanceRate != null ? Math.round(row.acceptanceRate*100) + '%' : '—' }} В срок {{ row.onTimeRate != null ? Math.round(row.onTimeRate*100) + '%' : '—' }}
Завершил {{ row.completed }} · отмен {{ row.canceled }} · отказов {{ row.refused }}
{{ row[perfSortBy === 'earnings' ? 'earnings' : perfSortBy === 'canceled' ? 'canceled' : 'completed'] }}
~{{ row.avgDeliveryMin }} мин

Журнал действий

CSV
Загрузка...
Журнал пуст.
{{ formatDateTime(item.createdAt) }} · {{ item.statusCode }}
{{ item.action }}
{{ item.actor?.role || 'unknown' }}#{{ item.actor.userId }} · {{ item.resource.type }}/{{ item.resource.id }}
{{ JSON.stringify(item.payload, null, 2) }}

Спрос / Дефицит

Загрузка...
Меньше Больше
{{ (h-1) }}
Период: {{ formatDate(heatmapData.range.from) }} – {{ formatDate(heatmapData.range.to) }} · Всего заказов: {{ heatmapData.totals.demand.sum }} · Часов курьеров: {{ heatmapData.totals.supply.sum.toFixed(0) }}

Cash flow

Загрузка...
7 дней (прогноз)
{{ formatMoney(cashflow.summary.next7Net) }}
14 дней (прогноз)
{{ formatMoney(cashflow.summary.next14Net) }}

Прогноз по дням

{{ d.date.slice(5) }}

Откуда минус (среднее за 14 дн)

Комиссия от заказов (вход)
+{{ formatMoney(cashflow.drilldown.avgDailyCommissionIncome) }}
Выплаты курьерам
−{{ formatMoney(cashflow.drilldown.avgDailyCourierPayout) }}
Цена смен
−{{ formatMoney(cashflow.drilldown.avgDailyShiftPay) }}
Постоянные расходы (в день)
−{{ formatMoney(cashflow.drilldown.dailyFixedCostsAllocation) }}
Net в день
{{ formatMoney(cashflow.drilldown.avgDailyCommissionIncome - cashflow.drilldown.avgDailyCourierPayout - cashflow.drilldown.avgDailyShiftPay - cashflow.drilldown.dailyFixedCostsAllocation) }}
Прогноз построен на основе средних за последние 14 дней. Не учитывает сезонность и манипуляции с тарифами.
Чат с {{ chatCourierName || ('курьер ' + chatCourierId) }}
Пока нет сообщений. Напишите курьеру — оно придёт ему в Telegram, ответ вернётся сюда.
Загрузка...
{{ m.text }}
{{ formatDateTime(m.createdAt) }}{{ m.fromRole === 'dispatcher' && m.deliveredAt ? ' • доставлено' : '' }}
Переназначить заказ #{{ reassignOrderId }}
Расчёт рекомендаций...
Нет подходящих курьеров.
{{ c.name }} текущий
ETA до кафе: {{ c.etaToPickupMin }} мин · +{{ c.addedRouteMin }} мин к маршруту · {{ c.distanceKm }} км
Активных заказов: {{ c.activeOrdersCount }}
Admin token
Значение переменной COURIER_ADMIN_TOKEN из .env бэкенда.
Не путать с ADMIN_TOKEN (это JWT для основного API).
Сохраним в браузере на этом устройстве.
{{ tokenInputError }}
Введите минимум 2 символа.
Ищу...
Ничего не найдено.

Батчинг

Не удалось загрузить статистику
{{ batchError }}

Ключевые метрики

Динамика заказов

Нет данных для графика

Топ-кафе по батчингу

Нет данных по кафе

Новые заказы

{{ orders.length }} доступно
{{ banner.text }}
💤

Нет заказов

В вашем городе пока тишина.

{{ order.orderDetails.cafeName }}
+{{ order.orderDetails.deliveryPrice }} ₽
{{ badge }}
🏬
{{ order.orderDetails.cafeAddress.fullAddress }}
Забрать
👤
{{ order.orderDetails.address.fullAddress }}
Доставить
Посмотреть детали

В работе

{{ activeOrders.length }} шт.
{{ banner.text }}
🚀

Пусто

У вас нет активных заказов.

{{ order.orderDetails.cafeName }}
{{ getOrderStatusLabel(order.status) }}
+{{ order.orderDetails.deliveryPrice }} ₽
🏬
{{ order.orderDetails.cafeAddress.fullAddress }}
👤
{{ order.orderDetails.address.fullAddress }}

Профиль

{{ banner.text }}
🚴‍♂️

{{ courierName || 'Курьер' }}

{{ courierPhone || '+7...' }}

Текущая смена
До {{ new Date(shiftState.activeShift.endTime).toLocaleString('ru-RU') }}

Статистика

{{ stats.dayStats.earnings }} ₽
За сегодня
{{ stats.dayStats.count }}
Заказов сегодня
{{ stats.monthStats.earnings }} ₽
За месяц
{{ stats.monthStats.count }}
Заказов за месяц

☕ Вы на перерыве

{{ breakTimeLeft }}

Моя статистика (МСК)

Начало:
Конец:
Выполнено заказов: {{ courierCustomResult.count }}
Заработано: {{ courierCustomResult.earnings }} ₽