- Focus screen renders versioned questionnaire items (iq: buttons): section chip, position (adaptive forms without "of N"), recall date, pause / help-now actions, optional skip, sleep-hours input, 0-10 scale anchors, RUS-AUDIT item 2 standard-drink table. - Paused / held-for-review questionnaires get their own screen. - Today: intake and diary tasks, review notice, therapy-day card on days 1/7/14. - Drug card /meds/:ref from data/meds/meds_reference.json (draft built from the Minzdrav guidelines: depression 2024, PTSD 2023) — expected effect, course, side effects, red flags; no doses shown. "Report a side effect" always available (med:side_effects:<ref>). - API: /instruments/catalog, /meds/reference; today gains questionnaire state, reference id, indication and therapy day; demo persona seeds the dashboard dose history. - INTAKE_DEMO=1 (demo clock only) opens the questionnaires on synthetic data without touching the clinical release gate in config/intake_runtime.yaml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
72 lines
6.2 KiB
Markdown
72 lines
6.2 KiB
Markdown
# Веб-приложение пациента
|
||
|
||
Ещё один канал к тому же движку диалога, что и Telegram-бот (ADR-004): согласие, онбординг, шкалы, чек-ины и
|
||
кризисный скрипт приходят из `app/dialog` через `/api/v1/dialog/{token}/...`. Бот продолжает работать параллельно.
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
make up # или: uv run uvicorn app.main:app --port 8000
|
||
cd web && npm install
|
||
npm run dev # http://localhost:5173 — /api проксируется на :8000
|
||
```
|
||
|
||
Интерфейс открывается на **:5173**; на :8000 работает только API (`/docs`).
|
||
|
||
## Вход
|
||
|
||
| Способ | Что происходит | API |
|
||
|---|---|---|
|
||
| ЕМИАС (демо) | одноразовый код от врача → токен пациента, привязка к врачу; или синтетический демо-пациент | `POST /auth/emias`, `POST /auth/emias/demo` |
|
||
| Анонимно | случайный токен, в identity-БД ничего не пишется, врач не привязан | `POST /auth/anonymous` |
|
||
|
||
Реальная авторизация ЕМИАС/ЕСИА подключается как `IdentityProvider` (`app/integrations/emias_mock.py`) без
|
||
изменений во фронтенде.
|
||
|
||
## Структура (под перенос в мобильное приложение)
|
||
|
||
```
|
||
src/theme/tokens.css цвета, шрифт, отступы — единственный источник; три цвета = три направления сервиса
|
||
src/content/ru.ts все тексты интерфейса (тексты диалога — в config/texts/, их отдаёт движок)
|
||
src/api/ типы-зеркала контрактов бэкенда и клиент
|
||
src/session/store.ts хранение сессии за интерфейсом: localStorage → Capacitor Preferences/Keychain
|
||
src/dialog/ общий разговор с движком (DialogContext) и выбор вида экрана по ответу движка (step.ts)
|
||
src/screens/ экраны по docs/mock: вход A1–A3, фокус-экран /flow (A4–A6, B, D, E1–E3, E5, G2–G4),
|
||
«Сегодня» C1/C2, «Лекарства» E4, «Врач» F, «Профиль» H, «Сообщения» I1
|
||
```
|
||
|
||
### Как устроены экраны
|
||
|
||
Логика сценариев живёт только в движке диалога. Экран `/flow` берёт последний ответ движка и рисует его
|
||
как отдельный экран мокапа: вопрос анкеты с прогрессом «Вопрос n из N», шкала 0–10, свободный текст,
|
||
напоминание о лекарстве, согласие, кризисный экран. Новый сценарий в движке появится в вебе без правок фронтенда.
|
||
|
||
Данные для «Сегодня» и «Лекарства» — `GET /api/v1/me/{token}/today` (дозы на сегодня, отметки за неделю,
|
||
следующий визит, время по демо-часам).
|
||
|
||
### Анкеты, дневник и модуль «Лекарства»
|
||
|
||
- **Анкеты этапа 1** (C-SSRS, PHQ-2/PHQ-9, фильтр травмы, TSQ, PCL-5, RUS-AUDIT-S/RUS-AUDIT) и **дневник этапа 2** —
|
||
тот же фокус-экран. Пункт распознаётся по кнопкам `iq:…`; чип раздела, «Вопрос n из N» (для адаптивных форм —
|
||
без «из N»), период, «Продолжить позже», «Мне нужна помощь сейчас», пропуск необязательных пунктов, ввод часов сна,
|
||
шкалы 0–10 с подписями концов, таблица стандартных порций для п. 2 RUS-AUDIT (из утверждённого бланка, без
|
||
калькулятора). Метаданные — `GET /api/v1/instruments/catalog`.
|
||
- Анкеты включаются только в демо: `INTAKE_DEMO=1` (вместе с `DEMO_CLOCK`). Клинический замок в
|
||
`config/intake_runtime.yaml` не трогается. Пока нет подписанной политики маршрутизации и формы C-SSRS «с последнего
|
||
контакта», завершённый опрос и дневник уходят на оценку специалиста — UI показывает это отдельным экраном.
|
||
- **Карточка препарата** `/meds/:ref` — справочник `data/meds/meds_reference.json` (собирается
|
||
`scripts/build_meds_reference.py` по КР Минздрава: депрессия 2024, ПТСР 2023): когда ждать эффекта (с днём лечения),
|
||
сколько принимать, что может беспокоить, когда срочно к врачу, «не прекращать самостоятельно». Дозы не показываются.
|
||
Черновик — вычитывает психиатр. `GET /api/v1/meds/reference`.
|
||
- «Сообщить о побочном эффекте» доступно всегда (`med:side_effects:<доза или дата>`), карточка «День N лечения» на
|
||
«Сегодня» — в 1-й, 7-й и 14-й день.
|
||
|
||
Мобильная версия: mobile-first вёрстка, safe-area, hash-роутинг и относительные пути сборки — `dist/` оборачивается
|
||
Capacitor без изменений (`VITE_API_BASE` = абсолютный адрес API).
|
||
|
||
## Известные ограничения прототипа
|
||
|
||
- Токен пациента используется как учётные данные сессии; в проде — короткоживущие серверные сессии.
|
||
- Подбор кодов не ограничен по частоте.
|
||
- В демо нет сида кодов подключения: для показа используйте демо-пациента.
|