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; вторая операция не смешивается.