Dashboard
Модули веб-интерфейса CRM
React-приложение со светлой, тёмной и системной темой (следует настройкам ОС без перезагрузки), фиксированным боковым меню, live-обновлением данных и двухколоночной страницей входа (макет как у PyOrchestrator, свой фон).
Навигация
| Группа | Разделы |
|---|---|
| Главное | Обзор, Состояние (все посты, график, онлайн/оффлайн) |
| Объекты | Автомойки, Посты |
| Данные | MQTT |
| Карты | Скидочные, Сервисные, VIP, Инкассация |
| Аналитика | Статистика использования, Финансовая статистика, Архивирование |
| Справочники | Режимы работы, Валюты, Типы скидок (Admin) |
| Автоматизация | Информация, Telegram, MCP сервер, Резервные копии (Admin) |
| Система | Уведомления, Пользователи, Группы и права, Настройки, Логи (Admin) |
Разделы с пометкой admin доступны только Administrator (manage_users или view_logs в JWT).
Профиль — ссылка в шапке (/profile). Мастер настройки — /setup (при первом входе или ?restart=1).
Resources (сайдбар)
| Элемент | Описание |
|---|---|
| Dynamic API | Панель :8080, статус online/offline |
| PyOrchestrator | Панель :8090, статус через bridge health |
| Документация / GitHub | Внешние ссылки |
Подробнее о встроенных платформах: Встроенные сервисы.
Язык интерфейса (v1.1.13+)
| Элемент | Описание |
|---|---|
| Локали | English (по умолчанию), Русский |
| Переключатель | Шапка (флаги 🇺🇸/🇷🇺; одна иконка) и Настройки → Language |
| Область | Меню, статусы, сообщения, подписи таблиц, логи UI; данные пользователя не переводятся |
| Хранение | localStorage (wash_locale) |
Уведомления (v1.1.14)
На странице Уведомления и в виджете на Обзоре отображаются локализованные шаблоны по типу события (mqtt_credit, user_login, wash_created и др.), а не сырой текст из БД. Параметры (сумма, логин, имя объекта) извлекаются из старых записей. Метки severity и CSV-экспорт следуют выбранному языку интерфейса.
Live-режим
Оперативные данные обновляются автоматически (usePolling). В шапке — индикатор live-режима.
| Интервал | Страницы |
|---|---|
| 3 с | Текущее состояние постов, Посты, карточка поста |
| 5 с | Обзор |
| 10 с | Карты, финансы, использование, уведомления |
| 15 с | Автомойки, архив, бэкапы, валюты, типы скидок, логи, пользователи, группы, мастер настройки |
На странице Текущее состояние время режима тикает в реальном времени (LiveModeTimer).
Таблицы (DataTable)
Все основные таблицы CRM используют общий компонент DataTable с единой пагинацией.
Возможности
- поиск по текстовым полям;
- сортировку по клику на заголовок;
- фильтры (выпадающие списки);
- выбор видимых колонок (иконка настроек таблицы);
- пагинацию (см. ниже);
- массовые действия (экспорт CSV, удаление — где доступно).
Пагинация (v1.1.5+)
В подвале каждой таблицы:
| Элемент | Описание |
|---|---|
| На странице | Выпадающий список: 20 / 40 / 60 / 80 / 100 записей (по умолчанию 20) |
| Назад / Далее | Переход между страницами среди уже загруженных строк |
| Загрузить ещё (N записей) | Догрузка следующей порции из отфильтрованного набора (N = выбранный размер страницы) |
Подпись в подвале: N записей · стр. X из Y · загружено M — если есть ещё не показанные строки в текущем наборе данных.
При смене размера страницы, поиске или фильтрах счётчик сбрасывается на первую страницу.
Крупные журналы (двухуровневая загрузка)
На страницах с очень большим объёмом данных используется два уровня загрузки:
| Раздел | Загрузка с API | Пагинация в таблице |
|---|---|---|
MQTT (/mqtt) |
Кнопка над таблицей «Загрузить ещё (100 записей)» — следующая страница телеметрии с сервера | DataTable: 20–100 строк на страницу, Назад/Далее, Загрузить ещё |
| Карты | Аналогично, пачки по 100 с API | DataTable в подвале |
История состояний поста (/posts/:id) |
Телеметрия state/process подгружается порциями при фильтре по дате |
DataTable: не выводит тысячи строк сразу |
Виджет «Последние уведомления» на Обзоре — компактное превью (10 строк по умолчанию, значение 10 доступно в списке «На странице»).
Разделы подробно
Обзор (/)
KPI-карточки до инкассации: наличная / безналичная / общая выручка / сумма скидок / активные ошибки.
Суммы по финансам и использованию — сумма последних записей каждого поста (не всех исторических строк).
Графики (Recharts): статус постов, круговые диаграммы «Использование» (клиенты / сервис / VIP) и доли оплаты (наличные / безнал / скидки), выручка по датам, загруженность по датам (v1.1.15). Таблица последних уведомлений (кнопка «Удалить все» на полной странице уведомлений).
Автомойки (/washes)
Справочник объектов: название, описание, адрес, дата создания, облако. Колонка «Количество постов».
Посты (/posts)
Посты с привязкой к автомойке: статус онлайн/оффлайн, номер, название, серийный номер, MQTT-логин, объект. Каскадное удаление связанных данных.
В колонке действий — иконка ⚙ (настройки устройства) → страница поста. При создании/редактировании — логин и пароль MQTT для панели поста.
Онлайн — если lastMessageAt не старше 30 секунд (как на Обзоре).
Карточка поста (/posts/:id)
| Блок | Описание |
|---|---|
| Шапка | Статус онлайн/оффлайн, название, серийный номер |
| Описание поста | Название, адрес объекта, серийный номер, ТО, фичи |
| Настройки устройства | Цены режимов, команды MQTT, префикс dt_pref — см. MQTT |
| История состояний | Таблица телеметрии state/process с фильтром по датам; пагинация 20–100 строк, Загрузить ещё |
Якорь #device-settings прокручивает к блоку настроек устройства.
Текущее состояние (/states)
Все посты всех объектов. Колонка Статус (онлайн/оффлайн), фильтр по статусу.
Интерактивный график на всю ширину (Recharts): переключение метрик (время режима / баланс / бесплатная пауза), tooltip с деталями, brush при большом числе постов, live-обновление времени режима.
Таблица: адрес, номер поста, баланс, пауза, скидка, live-таймер режима, название режима, дата последнего сообщения.
Карты (/cards)
| Подраздел | cardType |
|---|---|
| Скидочные | regular |
| Сервисные | service |
| VIP | unlimited |
Журнал применений: каждое событие NFC (state/card с поста) создаёт новую строку. Активная сессия обновляется по данным state/process (баланс, скидка).
Тип скидки — номер 1–5 из справочника. Статусы: success, rejected. Инкассация (cardType: collection на устройстве) — уведомление в CRM, без строки в разделе карт.
Аналитика (/usage, /finance, /archive)
- Использование — до/после инкассации, категории regular/service/unlimited.
- Финансы — наличные, безнал, скидочные, выручка.
- Архивирование — политики по группам данных, журнал операций.
Система и автоматизация
| Раздел | Маршрут | Описание |
|---|---|---|
| Уведомления | /notifications |
CRM-уведомления, отметка прочитано; настройки каналов web/Telegram на Обзоре |
| Профиль | /profile |
Имя, email, смена пароля (ссылка в шапке) |
| Мастер настройки | /setup |
Первичная настройка CRM; повторный запуск /setup?restart=1 (Admin/Operator) |
| Пользователи | /users |
Учётные записи Dynamic API, Telegram user_id, назначение групп (Admin) |
| Группы и права | /groups |
RBAC-группы и матрица permissions (Admin) |
| Настройки | /settings |
MQTT, Telegram notify, обновление CRM, валюта по умолчанию, язык интерфейса |
| Логи | /logs |
Аудит Dynamic API (Admin) |
| Информация | /info-messages |
Новости и акции для информационного бота; статус «По расписанию» → «Опубликовано» после наступления времени (Admin) |
| Telegram | /telegram |
Боты PyOrchestrator: Управление / Сервисный / Информационный; QR-ссылка; массовые действия; шаблоны v3.2 / v2.2; stop-all (Admin, PyOrch) |
| MCP сервер | /mcp |
HTTP MCP Dynamic API и PyOrchestrator; таблица tools; конфиг Cursor (Admin) |
| Резервные копии | /backups |
MongoDB backup, ручной запуск, скачивание (Admin) |
| Режимы работы | /work-modes |
Справочник режимов 0–9 (Admin) |
| Валюты | /currency |
Справочник /api/crm/currencies (Admin) |
| Типы скидок | /discount-types |
Номера 1–5 и названия (Admin) |
Стабильность навигации (v1.1.12)
- повторная загрузка JS-чанков при сбое сети (
lazyPage); RouteErrorBoundaryвместо серого экрана;- таймаут polling 60 с; на Обзоре — сообщение об ошибке вместо бесконечного Loading.
Переключатели в шапке (v1.1.14)
- переключатель языка — одна иконка с флагом текущей локали (на всех экранах);
- Live/Static — одна иконка (радио / пауза) на всех экранах.
Страница входа (/login)
Двухколоночный layout (как PyOrchestrator): слева брендинг с SVG-фоном (волны/SCADA), справа форма. Переключатель темы в правом верхнем углу. Авто-refresh JWT; при истечении сессии — перенаправление на /login.
Роли пользователей
| Группа | Права в Dashboard |
|---|---|
| Administrator | Полный доступ + разделы Система (admin) |
| Operator | view, create, update — CRM без admin-разделов |
| Viewer | view — только просмотр |
| Service | Внутренний API-аккаунт (не для UI) |
Управление пользователями: Dashboard → Пользователи / Группы и права или Dynamic API Panel → Users / Groups.
Прокси Dashboard (nginx)
| Путь | Upstream |
|---|---|
/api/ |
dynamic-api:3001 |
/api/telegram-bots/ |
pyorch-bridge:3021 |
/api/crm/backup-files/ |
backup:3020 |
/api/crm/post-device/ |
message-processor:3022 (цены и команды поста) |
/api/mcp |
Dynamic API MCP (JWT) |
/api/pyorch-mcp/ |
PyOrchestrator MCP :8010 (если PyOrch включён) |
/pyorch/ |
pyorch-backend:8000 (если PyOrch включён) |
Демо-данные
./scripts/generate-demo-data.sh
./scripts/generate-demo-cards.sh
Сборка
cd dashboard && npm install && npm run dev # :5173
npm run build # dist/ → Docker
Технологии
React 18 · TypeScript · Vite · Tailwind · Lucide · Recharts · usePolling / LiveModeContext