From 3a986b0b7c09d06c9d5a6dd09b50963eb010a474 Mon Sep 17 00:00:00 2001 From: viktot14-ai Date: Wed, 9 Sep 2026 20:50:30 +0300 Subject: [PATCH] =?UTF-8?q?B21:=20=D0=BF=D0=BB=D0=B0=D0=BD=20=D0=BC=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D0=B8=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B0?= =?UTF-8?q?=20(=D0=BC=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=80=D0=B5=D1=81=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D1=83?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Требование Виктора: несколько одновременных поисков, много пользователей (каждое ЦОУ = аккаунты), КОНТУР подключается к каждому поиску. За основу — админка РВС (RBAC + сессии + аудит, паттерн проверен в проде). План: search_operations (надстройка над cases, не дубль SEARCH_OPERATION КОНТУРа) + cou_units (справочник ЦОУ с иерархией) + RBAC 4 роли + гео-скоуп (отличие от РВС) + дашборд активных поисков + contour_operation_id для B20. Этапы E1 RBAC-ядро → E2 скоуп/аудит → E3 операции → E4 КОНТУР → E5 B17-ингестия. Границы и критерии приёмки внутри. СТАТУС: план на ревью, не код. --- vector_tasks.md | 121 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/vector_tasks.md b/vector_tasks.md index 87fd0a1..29a11ca 100644 --- a/vector_tasks.md +++ b/vector_tasks.md @@ -952,3 +952,124 @@ sed -i 's/sar_mchs/vector_mchs/g; s#/root/sar-mchs#/root/vector#g' DEPLOY.md | Отдельный проект | B19 «Контур» (ATAK+Meshtastic, полевая система) | отдельный репо/спецификация | **Рекомендуемый порядок:** B14 (чистый движок) → B15 (слои данных) → **B20 (контракт Вектор↔Контур)** → B16 (GIS) и B17 (Field Data) параллельно → B18 (итеративность + queue). B12 (ISRID) разблокируется внешне (правовой статус) и подключается как источник априорных к B18. B19 «Контур» — отдельный проект (свой репо); со стороны Вектора: B17+B18+B20. Коэффициенты (B1) — под ревью человека на каждом шаге. + +--- + +## B21 — Мультипоиск и многопользовательский доступ (масштаб на республику) + +> Статус: ПЛАН на ревью Виктора. Основа — паттерн админки РВС +> (rbac-admin-schema-pattern: RBAC + сессии + аудит) и домен КОНТУРа +> (SEARCH_OPERATION + OPERATION_MEMBERSHIP). Написан 2026-09-09. + +### 1. Контекст и требование + +ВЕКТОР как программное средство на всю республику МЧС: + +- **Несколько поисков одновременно** — сегодня API работает с произвольным + case_id, но UI предполагает «текущий поиск»: дашборд, карта, анализ + привязаны к одному кейсу без понятия «операция». +- **Много пользователей** — каждое ЦОУ (областное/районное) = аккаунты; + республиканский штаб видит все поиски, ЦОУ — свои. +- **КОНТУР подключается к каждому поиску** — outbound-контракт B20 + операционно: зоны по конкретной операции, не «в абстракт». + +Основа: админка РВС (RBAC 4 роли × 9 прав, server-side sessions, +audit 90 дней, password policy) — паттерн проверен в проде РВС. + +### 2. Модель данных (новые таблицы + алиасы) + +**2.1 Поисковая операция (мультипоиск)** + +``` +search_operations: + id uuid PK + title text -- «Поиск: Иванов П., Минский р-н» + case_id fk → cases -- карточка (матмодель живёт в cases) + status enum(planned, active, paused, completed, archived) + cou_id fk → cou_units -- ответственное ЦОУ + contour_operation_id uuid null -- заполняется при первой отправке зон в КОНТУР + created_by fk → users + created_at / updated_at / closed_at +``` + +Решение по «case vs operation»: НЕ дублируем SEARCH_OPERATION из КОНТУРа — +`cases` остаётся карточкой+расчётом (B15-слои на месте), `search_operations` +— надстройка со статусом/владением/участниками. КОНТУР-маппинг: поле +`contour_operation_id`, заполняется при первой отправке зон. + +**2.2 Пользователи и ЦОУ (RBAC по образцу РВС)** + +``` +cou_units: -- справочник ЦОУ + id uuid PK, name, region (область), kind (oblast|raion|resp), parent_id null + +users (расширение существующей): + + cou_id fk → cou_units, null -- принадлежность ЦОУ (admin=null) + + position text + + status enum(active, locked, disabled) + + failed_login_count, locked_until, must_change_password + + created_by, created_at, updated_at + +roles / user_roles / role_permissions / permissions -- как в РВС +sessions (server-side, token, ip, ua, expires_at, idle_timeout) +auth_events (login/logout/lockout, indexed DESC) +audit_events + audit_changes (field-level old→new, immutable, retention 90d) +security_settings (password policy, lockout, timeouts) +``` + +Роли (стартовые, is_system): +- `admin` — республиканский штаб: все права, все операции +- `coordinator` — областное ЦОУ: все поиски своей области, управление + пользователями своих райЦОУ +- `operator` — районное ЦОУ: свои поиски (create/update) +- `observer` — только просмотр (старшие смены, аналитика) + +**2.2.1 Скоуп данных (отличие от РВС)** + +К функциональным правам РВС добавляется **географический скоуп**: какие +поиски видны. Фильтр по `cou_id ∈ {своё ЦОУ + подчинённые}` (дерево +cou_units); admin — без фильтра. Тот же скоуп в cases/analyze/water. + +### 3. Мультипоиск в UI + +- **Дашборд «Активные поиски»** (главная после логина): карточки активных + операций (title, ЦОУ, elapsed, статус), фильтры по статусу/области, + счётчики. Клик → рабочее пространство операции (`/op/{id}/…`). +- **Создание поиска** = CaseForm + шаг «операция» (title, ЦОУ — по умолчанию + ЦОУ создателя). +- **Завершение**: статус completed + поля исхода (переезд из cases). + +### 4. КОНТУР-интеграция (мультипоиск) + +- Импорт зон готов на КОНТУРе (этап 9): operation_id задаётся параметром + импорта; ВЕКТОР хранит contour_operation_id и передаёт при отправке. +- Отправка зон: кнопка/авто при новой версии модели → POST /api/v1/vector/zones. +- Обратный поток: GET /api/v1/vector/areas-checked — «проверенные квадраты» + на карте ВЕКТОРа. +- Межсервисный токен — в secrets, не в репо. + +### 5. Этапы внедрения + +| # | Этап | Состав | Зависимости | +|---|------|--------|-------------| +| E1 | RBAC-ядро | cou_units, расширение users, роли/права, сессии, auth-журнал, seed; логин по пользователям, /me, смена пароля | паттерн РВС | +| E2 | Скоуп и аудит | гео-скоуп в эндпоинтах, audit_events, security_settings, админ-панель пользователей (как РВС) | E1 | +| E3 | Операции | search_operations + статусная машина, дашборд активных поисков, переключение | E1 | +| E4 | КОНТУР-мультипоиск | contour_operation_id, отправка зон, areas-checked на карте | E3 | +| E5 | B17 (лёгкий) | ингестия field_observations от КОНТУРа (tracks/areas_checked) | E4 | + +### 6. Границы (НЕ делать сейчас) + +- Саморегистрация ЦОУ — аккаунты создаёт админ/координатор. +- SSO/ActiveDirectory — после пилота. +- B18/B19 — отдельные задачи. +- WebSockets для списка поисков — polling на старте. + +### 7. Критерии приёмки (сводно) + +- Два одновременных активных поиска у двух ЦОУ: республиканский админ видит + оба, райЦОУ — только свой; переключение без потери контекста. +- Вход через server-side сессии; аудит фиксирует входы и админ-действия, + ретенция 90 дней. +- Зоны операции уезжают в КОНТУР и видны в штаб-панели CT130:8080 под своим + operation_id; вторая операция не смешивается.