[dashboard][C] Дашборд врача: список «красных зон», карточка, алерты в реальном времени, «Подключить пациента» #16

Closed
opened 2026-10-03 14:38:56 +03:00 by Eleboba · 0 comments
Owner

Описание

SPEC §11 + идея №2 (docs/product/00_ideas.md): врач видит, кто в риске прерывания терапии. Streamlit, только через API (app/api/schemas.py); до готовности #12 ручки отдают фикстуры — работать сразу.

Желаемый результат

  • Список пациентов: 🔴 → 🟡 → 🟢 (ADR-006), PHQ-9/PCL-5, тренд, приверженность 7 дн., день терапии, последнее событие, индекс риска прерывания.
  • Карточка: графики шкал, настроения и сна (plotly), календарь доз, лента алертов с ack, план безопасности, саммари.
  • Новый 🔴 без перезагрузки (автообновление 2–3 с) + тост.
  • «Подключить пациента»: препарат, доза, расписание, дата визита, модули → код + QR.

Зона и владение файлами

Lane C (дашборд) — владеет: dashboard/**, tests/test_dashboard*.py.

Замороженные контракты (менять только отдельным мелким PR с пингом всех): app/core/types.py, app/dialog/contracts.py, app/api/schemas.py, app/integrations/base.py, app/services/contracts.py, app/main.py, app/config.py, config/modules.yaml, config/rules.yaml, config/scales/*, pyproject.toml/uv.lock, docker-compose.yml, Makefile.


Лог выполнения

2026-10-04

2026-10-04

Что сделано

  • Дашборд врача на Streamlit (st.navigation): dashboard/app.py сам находит страницы в dashboard/pages/*.py (номер в имени — порядок, 1* → раздел «Кабинет врача», остальные → «Демо»; опционально NAV_ICON / NAV_SECTION / NAV_TITLE / NAV_URL в файле). Страницам #17 достаточно добавить файл.
  • «Пациенты» (pages/1_Пациенты.py): шапка «Кабинет д-ра Смирновой Е. А.», KPI (всего / 🔴 / 🟡 / высокий риск прерывания), фильтр по статусу и поиск, строки 🔴→🟡→⚪→🟢 (внутри цвета — по индексу риска): модули, препарат, день терапии, PHQ-9/PCL-5 со стрелкой тренда, полоса приверженности за 7 дн., бейдж риска прерывания с факторами в подсказке, последнее событие, число алертов.
  • Карточка (?patient=<token>): статус, риск, визит; плитки шкал с дельтой; plotly: PHQ-9 и PCL-5 с полосами тяжести из config/scales (внеплановые — ромб), настроение/сон/алкоголь (small multiples, без двойной оси); календарь доз (heat-strip ✓/–/✕); лента алертов с «Подтвердить» (POST ack); план безопасности; саммари с дисклеймером «решения принимает врач».
  • Живые алерты: st.fragment(run_every=2.5 с) опрашивает /doctors/{id}/alerts, новый алерт → st.toast, открытые острые — пульсирующий красный баннер над всеми страницами с переходом в карточку. Полный rerun при новом алерте — только на страницах врача (демо-консоль не прерывается).
  • «Подключить пациента» (pages/1b_Подключить_пациента.py): форма (имя, год, пол, синтетический СНИЛС с контрольной суммой, препарат/доза, время, указания, визит, модули, согласие) + кнопка «Заполнить демо-данными (Андрей)» → код, QR, ссылка.
  • dashboard/api_client.py: тонкий httpx-клиент поверх замороженных схем, таймауты 3 с, ошибки → баннер «API недоступен». DOCTOR_ID (по умолчанию doc-smirnova).
  • Тема: палитра ADR-006 (dashboard/theme.py), Inter через .streamlit/config.toml (офлайн — системный шрифт).

Результат

  • 39 новых тестов (tests/test_dashboard_*.py): клиент (ошибки/таймауты/404/битый ответ), чистые хелперы (сортировка, стрелки, бейдж риска, календарь доз, СНИЛС, склонения), графики, автопоиск страниц, AppTest-смоук списка, карточки, ack, подключения, баннера и тоста нового алерта. make lint test зелёные.
  • Проверено вживую против API с реальными данными #12.

Заметки/решения

  • dashboard/app.py убирает dashboard/ из sys.path: иначе файл app.py перекрывает пакет app (нужен для схем).
  • Если API отдаёт относительный deep_link (/console?code=…), QR строится от DASHBOARD_PUBLIC_URL (по умолчанию http://localhost:8501).
  • Подтверждения алертов в рамках сессии сразу отображаются локально, не дожидаясь следующего опроса.
## Описание SPEC §11 + идея №2 (`docs/product/00_ideas.md`): врач видит, кто в риске прерывания терапии. Streamlit, только через API (`app/api/schemas.py`); до готовности #12 ручки отдают фикстуры — работать сразу. ## Желаемый результат - Список пациентов: 🔴 → 🟡 → 🟢 (ADR-006), PHQ-9/PCL-5, тренд, приверженность 7 дн., день терапии, последнее событие, индекс риска прерывания. - Карточка: графики шкал, настроения и сна (plotly), календарь доз, лента алертов с ack, план безопасности, саммари. - Новый 🔴 без перезагрузки (автообновление 2–3 с) + тост. - «Подключить пациента»: препарат, доза, расписание, дата визита, модули → код + QR. ## Зона и владение файлами **Lane C (дашборд)** — владеет: `dashboard/**`, `tests/test_dashboard*.py`. **Замороженные контракты** (менять только отдельным мелким PR с пингом всех): `app/core/types.py`, `app/dialog/contracts.py`, `app/api/schemas.py`, `app/integrations/base.py`, `app/services/contracts.py`, `app/main.py`, `app/config.py`, `config/modules.yaml`, `config/rules.yaml`, `config/scales/*`, `pyproject.toml`/`uv.lock`, `docker-compose.yml`, `Makefile`. --- ## Лог выполнения ### 2026-10-04 ### 2026-10-04 **Что сделано** - Дашборд врача на Streamlit (`st.navigation`): `dashboard/app.py` сам находит страницы в `dashboard/pages/*.py` (номер в имени — порядок, `1*` → раздел «Кабинет врача», остальные → «Демо»; опционально `NAV_ICON` / `NAV_SECTION` / `NAV_TITLE` / `NAV_URL` в файле). Страницам #17 достаточно добавить файл. - «Пациенты» (`pages/1_Пациенты.py`): шапка «Кабинет д-ра Смирновой Е. А.», KPI (всего / 🔴 / 🟡 / высокий риск прерывания), фильтр по статусу и поиск, строки 🔴→🟡→⚪→🟢 (внутри цвета — по индексу риска): модули, препарат, день терапии, PHQ-9/PCL-5 со стрелкой тренда, полоса приверженности за 7 дн., бейдж риска прерывания с факторами в подсказке, последнее событие, число алертов. - Карточка (`?patient=<token>`): статус, риск, визит; плитки шкал с дельтой; plotly: PHQ-9 и PCL-5 с полосами тяжести из `config/scales` (внеплановые — ромб), настроение/сон/алкоголь (small multiples, без двойной оси); календарь доз (heat-strip ✓/–/✕); лента алертов с «Подтвердить» (POST ack); план безопасности; саммари с дисклеймером «решения принимает врач». - Живые алерты: `st.fragment(run_every=2.5 с)` опрашивает `/doctors/{id}/alerts`, новый алерт → `st.toast`, открытые острые — пульсирующий красный баннер над всеми страницами с переходом в карточку. Полный rerun при новом алерте — только на страницах врача (демо-консоль не прерывается). - «Подключить пациента» (`pages/1b_Подключить_пациента.py`): форма (имя, год, пол, синтетический СНИЛС с контрольной суммой, препарат/доза, время, указания, визит, модули, согласие) + кнопка «Заполнить демо-данными (Андрей)» → код, QR, ссылка. - `dashboard/api_client.py`: тонкий httpx-клиент поверх замороженных схем, таймауты 3 с, ошибки → баннер «API недоступен». `DOCTOR_ID` (по умолчанию `doc-smirnova`). - Тема: палитра ADR-006 (`dashboard/theme.py`), Inter через `.streamlit/config.toml` (офлайн — системный шрифт). **Результат** - 39 новых тестов (`tests/test_dashboard_*.py`): клиент (ошибки/таймауты/404/битый ответ), чистые хелперы (сортировка, стрелки, бейдж риска, календарь доз, СНИЛС, склонения), графики, автопоиск страниц, AppTest-смоук списка, карточки, ack, подключения, баннера и тоста нового алерта. `make lint test` зелёные. - Проверено вживую против API с реальными данными #12. **Заметки/решения** - `dashboard/app.py` убирает `dashboard/` из `sys.path`: иначе файл `app.py` перекрывает пакет `app` (нужен для схем). - Если API отдаёт относительный `deep_link` (`/console?code=…`), QR строится от `DASHBOARD_PUBLIC_URL` (по умолчанию `http://localhost:8501`). - Подтверждения алертов в рамках сессии сразу отображаются локально, не дожидаясь следующего опроса.
Eleboba added this to the Этап 1 · Ветераны СВО milestone 2026-10-03 14:38:56 +03:00
Eleboba added the P0featuredashboardsize/2 labels 2026-10-03 14:38:56 +03:00
Eleboba changed title from [dashboard] Дашборд врача: список с цветами, карточка, алерты в реальном времени, «Подключить пациента» to [dashboard][C] Дашборд врача: список «красных зон», карточка, алерты в реальном времени, «Подключить пациента» 2026-10-03 15:16:40 +03:00
Eleboba added the lane/Cstage/veterans labels 2026-10-03 15:16:41 +03:00
Eleboba self-assigned this 2026-10-04 12:23:07 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#16