Skip to content

Интеграторская консоль: обзор и маршрут просмотра

Обновлено: 18.05.2026 (K-ADM2 — переход на widget-based UI без сырого JSON/YAML в основном интерфейсе). Статус: wave K-ADM2 Slices 1-3 закрыты codex-ревью, Slices 4-6 задеплоены и ожидают финальный codex re-review (см. §6). Развёрнуто на dev.antroute.pro. Это уже не «пилотный YAML-конфигуратор», а виджетный интерфейс под целевого пользователя — интегратора, который не должен видеть raw технические форматы в основном UI. Адресат: интегратор-владелец конфигурации (Андрей или замещающий технолог), технолог-заказчик.

Описывает интеграторскую консоль AntRoute — место, куда заходит человек, отвечающий за заведение конкретного предприятия. С K-ADM2 интерфейс полностью на виджетах: список организаций, конструктор меню, визуальный preview под ролью, версии конфигурации с восстановлением, импорт Excel.

1. Что это и зачем

AntRoute — одна сборка для всех заказчиков. Под конкретное предприятие настройки (меню, экраны, вкладки, столбцы, словари) живут в DSL-конфигурации, к которой интегратор не обращается напрямую как к файлу. Вместо этого интеграторская консоль даёт:

  • Dashboard — карточки всех организаций с реальными счётчиками (изделия / РМ / материалы / операции / спецификации / кооперации);
  • Карточка организации — статус, последний импорт, активная версия DSL, действия (импорт, превью, меню, экраны, доступы, версии);
  • Конструктор меню — виджетный редактор секций и пунктов с выпадающим списком разрешённых экранов;
  • Превью под ролью — визуальный макет боковой панели и рабочего экрана для выбранной роли в выбранной организации;
  • Версии — список карточек предыдущих публикаций с кнопкой «Восстановить» (forward-publish, не destructive);
  • Импорт Excel — мастер из 5 шагов под канонический шаблон Кочарина с разбивкой по 7 организациям.

Цель: интегратор ведёт DSL без переразвёртывания кода, без правки YAML, без видения raw UUID и run_id в основном интерфейсе.

2. Доступ и роли

КтоЛогинЧто видит в консоли
Глобальный superuser с активным IntegratorAssignment (is_global=true)vladimirВсе 17 организаций на Dashboard
Scoped integrator (грант на список организаций)koc-vsp-integratorТолько разрешённые карточки (демо — одна KOC-4505016987)
Superuser без IntegratorAssignmentБаннер «Нет integrator-доступа», действия скрыты
Admin/диспетчер предприятияkoc-{numCode}-adminРаздел не доступен — RouteGuard ведёт его на обычный дашборд
Технолог / Мастер / Операторпроизводственные ролиКонсоль скрыта целиком

Доступ к консоли — только под integrator-грантом (superuser + IntegratorAssignment). Это сознательный выбор: правка конфигурации и импорт данных — admin-level действия.

3. Что реально на экранах

3.1. Dashboard — список организаций

Адрес — /v/admin/integrator-tools. Карточки 17 организаций отсортированы по числу изделий (по убыванию) с tie-break по коду организации. Каждая карточка показывает:

  • статус (Действует / Триал / Приостановлено / Неактивно);
  • 6 счётчиков (Изделия / Рабочие места / Материалы / Операции / Спецификации / Кооперации);
  • кнопку «Импорт Excel» (ссылка на shared platform-wide мастер).

Dashboard — глобальный режим под vladimir

Под scoped пользователем (koc-vsp-integrator) Dashboard показывает только разрешённые карточки с пояснительным баннером:

Dashboard — scoped integrator видит одну организацию

Под superuser без грантов — единый баннер «Нет integrator-доступа», без раскрытия каких-либо организаций (без leakage):

Dashboard — no-grant 403 banner

3.2. Карточка организации

Адрес — /v/admin/integrator-tools/:orgCode. Клик по любой карточке Dashboard либо прямой переход по коду организации. Содержит:

  • заголовок и статус организации;
  • блок «Наполненность данными» с теми же 6 счётчиками крупным шрифтом;
  • «Последний импорт» (дата / тип / статус — без UUID);
  • «Активная DSL-конфигурация» (номер версии / дата публикации / автор);
  • блок «Действия»: Импорт Excel · Превью под ролью · Меню роли · Экраны · Роли и доступ · Версии конфига.

Per-org overview — KOC-4505016987 (ВСП)

Для триал-организации статус-бейдж жёлтый:

Per-org overview — триал статус

Для организации без импортов и DSL — пустые состояния «Импорта ещё не было» и «Конфигурация ещё не создана»:

Per-org overview — DEMO без импорта и DSL

Если organization не в скоупе текущего integrator-гранта — generic banner «Организация не найдена или недоступна» (тот же текст что для несуществующих org — анти-leak):

Per-org overview — не в скоупе

Действия «Экраны» и «Роли и доступ» пока заглушки (информационный toast «появится в следующих фазах K-ADM2»). Остальные четыре действия (Импорт Excel, Превью, Меню, Версии) — рабочие routes.

3.3. Конструктор меню

Адрес — /v/admin/integrator-tools/:orgCode/menu. Виджетный редактор без YAML/JSON:

  • секции — карточки с заголовком (id + русское название в Input), кнопки «↑/↓» для перестановки, «Пункт» (Add Item) и «Удалить»;
  • пункты внутри секций — пары screen → русское название, плюс «↑/↓» и «Удалить»;
  • «Добавить секцию» — модальное окно с двумя полями (latin id, русское название);
  • «Добавить пункт» — модальное окно с Select разрешённых экранов (allowed_screens из effective_json.screens) и полем подписи;
  • «Сохранить» — отправляет PATCH /api/v1/integrator/orgs/<org_id>/menu/ с заголовком If-Match, на успех показывает toast «Меню сохранено. Версия N» и обновляет ETag;
  • «Отменить изменения» — возвращает draft к серверному состоянию;
  • 412 → жёлтый banner «Кто-то изменил конфигурацию параллельно. Обновите страницу.»

Menu Builder — загрузка существующего меню

«Добавить секцию» открывает модальное окно с виджетной формой (а не raw JSON-редактор):

Menu Builder — Add Section modal

Сохранение переименованной секции:

Menu Builder — rename + save

Откат изменений:

Menu Builder — revert restores server state

Добавление пункта (Select разрешённых экранов):

Menu Builder — Add Item modal с Select

Сервер хранит каждую публикацию как TenantConfigVersion с YAML snapshot, обновляет tc.published_yaml/draft_yaml/published_at. AuditLog payload_summary.diff фиксирует added_sections / removed_sections / total_sections / total_items.

3.4. Превью под ролью

Адрес — /v/admin/integrator-tools/:orgCode/preview. Визуальный макет: слева — карточка-эмулятор боковой панели, справа — макет рабочего экрана.

  • Select роли с шестью вариантами (Технолог / Диспетчер / Конструктор / Поставщик / ОТК / Суперпользователь);
  • по умолчанию — Технолог. При смене роли секции пересчитываются: если у роли в DSL есть свой menu, показываем его; иначе fallback на глобальное menu.sections;
  • секции без пунктов — «Без пунктов»;
  • информационный alert на каждой странице — «Это структурное превью, бизнес-данные не подтягиваются».

Preview — visual layout под Технологом

Смена роли на «Диспетчер»:

Preview — переключение на «Диспетчер»

В этой версии нет ни YAML дампа, ни JSON-сниппетов, ни таблиц routes (всё это было в K-ADM1 viewer):

Preview — рабочий экран без raw технических артефактов

3.5. Версии конфигурации

Адрес — /v/admin/integrator-tools/:orgCode/versions. Список карточек предыдущих публикаций, новейшие сверху.

  • каждая карточка — номер версии, дата, автор (display name / username), note;
  • активная версия помечена зелёным бейджом «Текущая», её кнопка «Восстановить» disabled;
  • «Восстановить» открывает confirm-модалку, при подтверждении: запрашивает свежий ETag со /integrator/tenant-config/<org_id>/status/, шлёт POST /rollback/ с version_number, note, If-Match. Бэкенд использует forward-publish — старая версия не теряется, создаётся новая запись с содержимым выбранной;
  • успех → toast «Версия N восстановлена», список обновляется.

Versions — список карточек с «Текущая» на активной

Restore-confirm:

Versions — confirm dialog «Восстановить версию X?»

3.6. Импорт Excel (Slice 6 polish)

Адрес — /v/admin/integrator-tools/imports/kocharin. Мастер из 5 шагов под канонический шаблон Кочарина (см. отдельный документ Импорт Excel). На финальном шаге успешного применения «Подробности» развёрнуты только за кнопкой «Подробнее (для разработчика)» — обычный пользователь не видит JSON-дамп, но при необходимости (например, для отладки) разработчик/integrator может его раскрыть.

Это не «скрыть JSON», а «не показывать его как primary surface». Тот же принцип везде в K-ADM2: raw технические форматы прячутся за дисклоузерами или вовсе отсутствуют, виджеты ведут пользователя.

4. Что отложено

Заглушки в карточке организации (информационный toast «появится в следующих фазах»):

  • Редактор экранов (C5) — drag-drop layout виджетов внутри одного screen, выбор виджет-варианта (tabbed-card / crud-list / dashboard-grid), привязка к классификаторам;
  • Матрица доступа (C6) — таблица ролей × секции/пункты/экраны с галочками «видит / редактирует».

Обе фазы предполагают тот же widget-first принцип: никаких YAML, только визуальные таблицы и формы. Появятся в следующих волнах K-ADM2.

5. Контракт «no JSON/YAML/CodeMirror в primary UI»

Это инвариант K-ADM2, прописанный в гейте codex-ревью и автоматических проверках walkthrough'ов:

  • grep гейтfrontend/src/features/integrator/v2/** не содержит JSON.stringify, <pre, CodeMirror, yaml в primary surface;
  • DOM гейт walkthrough — Playwright проверяет на каждой странице: pre count = 0, .cm-editor count = 0, body innerText не содержит YAML/JSON/raw UUID-паттерн;
  • vitest гейтscreen.queryByTestId('apply-summary-json') либо отсутствует, либо находится внутри неоткрытого Collapse.

Это снимает прежнее замечание (K-ADM1 показывал YAML-редактор и таблицы routes с UUID в адресе) и приводит интерфейс к виджетному виду.

6. Источники истины

  • Backend mutationantroute_backend/screens/views_integrator_menu.py (GET/PATCH menu), views_integrator.py (publish/rollback/versions), views_integrator_summary.py (Dashboard).
  • Frontend pagesfrontend/src/features/integrator/v2/*.tsx.
  • Walkthrough evidencedocs/sprint_2026_may/active/K-ADM2-evidence/sliceN/summary.json (по каждой фазе overall_pass=true с machine_assertions).
  • Code review trail — K-ADM2 Iter1–Iter4 (methodology), Slice 1 Iter5+Iter6, Slice 2 Iter2, Slice 3 Iter2 — все ACCEPTED codex; Slice 4-6 ожидают финальный codex re-review.

AntRoute MES — управление блуждающими узкими местами