Перейти к содержанию

Жизненный цикл пациента

Два независимых конечных автомата: транспортный эпизод (только СМП) и обращение (оба потока). Разделение следует из ADR-5.

Транспортный эпизод

Живёт от запроса или направления до доставки либо отмены. Управляется сообщениями от вендора — система не меняет это состояние самостоятельно, кроме таймаутов.

stateDiagram-v2
  [*] --> requested: transport_request
  requested --> rejected: отказ в госпитализации
  requested --> notified: transport_notification
  [*] --> notified: transport_notification<br/>(без запроса)
  notified --> en_route: первый transport_health_status
  en_route --> en_route: transport_health_status
  notified --> delivered: transport_complete
  en_route --> delivered: transport_complete
  notified --> cancelled: transport_cancel
  en_route --> cancelled: transport_cancel
  delivered --> [*]
  cancelled --> [*]
  rejected --> [*]

  note right of en_route
    Детектор тишины:
    нет обновлений > N мин →
    пометка на пульте
    (состояние НЕ меняется)
  end note
Состояние Смысл Что видит оператор
requested Спросили о возможности принять, решение ещё не привело к направлению Строка в журнале запросов
rejected Отказано в госпитализации В журнале, с причиной
notified Пациента везут сюда Карточка на борде, машина на карте
en_route Идут обновления состояния Карточка с динамикой показателей
delivered Машина прибыла, эпизод завершён Карточка перемещается в «прибывшие»
cancelled Не будет доставлен Карточка снята, причина в журнале

Тишина не меняет состояние

Отсутствие обновлений — не событие вендора, а его отсутствие. Переводить эпизод в «потерян» автоматически нельзя: машина может ехать в зоне без связи. Система помечает карточку («нет обновлений 12 мин»), но состояние сохраняет — решение принимает оператор, позвонив в бригаду.

Обращение в приёмный покой

Центральный автомат. Общий для доставленных СМП и обратившихся самостоятельно.

stateDiagram-v2
  [*] --> open: доставка СМП / кнопка на терминале
  open --> triaged: сортировка выполнена
  triaged --> queued: поставлен в очередь с талоном
  queued --> in_registration: вызван на оформление
  in_registration --> registered: паспортная часть + ЭЦП
  registered --> closed: выбытие из приёмного отделения
  queued --> triaged: ПЕРЕСОРТИРОВКА<br/>(ухудшение состояния)
  open --> cancelled: ушёл, не дождавшись
  queued --> cancelled: ушёл, не дождавшись
  triaged --> closed: КРАСНЫЙ — минуя приёмник<br/>сразу в отделение
  closed --> [*]
  cancelled --> [*]
Состояние Таблица/поле Примечание
open appeals.opened_at ПДн ещё нет: patient_id IS NULL для самообращений
triaged triage_assessments Присвоен цвет и талон
queued triage_queue Ждёт вызова на оформление; работает норматив sla_deadline
in_registration appeal_events Вызван, идёт заполнение
registered appeals.registered_at Обращение создано, ушло в МИС
closed appeals.closed_at Выписка из приёмного отделения (FR-T-24)
cancelled closed_reason Ушёл самостоятельно, не дождавшись

Красный может закрыться, не проходя оформление

[ОП] Красный пациент «сразу проходит мимо приёмника в отделение». Оформление при этом не исчезает — оно происходит позже и в отделении, а не задерживает пациента в приёмнике. Автомат это допускает переходом triaged → closed; документы оформляются задним числом с сохранением фактических отсечек времени.

Реализация, требующая обязательного прохождения in_registration перед closed, физически задержит критического пациента ради формы. Это ровно тот случай, когда правильная модель данных спасает жизнь, а неправильная — стоит времени.

Пересортировка

Переход queued → triaged — не ошибка, а обязательное поведение: состояние пациента в очереди может ухудшиться.

flowchart LR
  A["queued<br/>жёлтый В34"] -->|"повторная оценка<br/>или сигнал монитора"| B["triaged<br/>красный К43"]
  B --> C["queued<br/>новый priority_rank"]
  C --> D["вызван раньше"]

Каждая пересортировка создаёт новую запись в triage_assessments — история сохраняется целиком (см. ERD). Талон при этом перевыпускается, а старый код помечается недействительным.

Слияние потоков

flowchart TB
  subgraph SMP["Поток СМП"]
    S1["transport_notification"] --> S2["en_route"] --> S3["transport_complete"]
    S3 --> S4["deliveries.delivered_at"]
    S4 --> S5["accepted_at<br/>подтверждение медработником"]
  end
  subgraph SELF["Поток самообращения"]
    F1["кнопка на терминале"] --> F2["анонимная запись"]
  end

  S5 --> A["appeals<br/>ОБЩАЯ СУЩНОСТЬ"]
  F2 --> A
  A --> T["сортировка"]
  T --> Q["очередь по цветам"]
  Q --> R["оформление"]
  R --> C["выбытие"]

  style A fill:#e8f0fe,stroke:#4285f4,stroke-width:3px

Различия после слияния:

Аспект СМП-пациент Самообращение
ПДн на входе Есть — из данных СМП Нет — анонимная очередь
Возможные цвета Красный или жёлтый (не зелёный, FR-T-18) Любой
Данные для сортировки Витальные показатели из ЭКВ Пол, температура, состояние, вес, дыхание
Форма оформления Предзаполнена (FR-T-19) Пустая
Связь с направлением notification_id заполнен NULL

Сквозные отсечки времени

Моменты, из которых считаются КПЭ паспорта:

flowchart LR
  T1["transport_started_at<br/>начало транспортировки"] --> T2["delivered_at<br/>прибытие по данным СМП"]
  T2 --> T3["accepted_at<br/>приём медработником"]
  T3 --> T4["opened_at<br/>обращение открыто"]
  T4 --> T5["assessed_at<br/>сортировка выполнена"]
  T5 --> T6["called_at<br/>вызов на оформление"]
  T6 --> T7["registered_at<br/>обращение оформлено"]
  T7 --> T8["closed_at<br/>выбытие"]
Интервал Метрика Кому важна
delivered_at → accepted_at Ожидание машины у приёмника Управление СМП: простой бригад
opened_at → assessed_at Скорость сортировки Приёмное отделение
assessed_at → called_at Ожидание в очереди по цветам КПЭ паспорта: время ожидания
called_at → registered_at Скорость оформления Эффект от автозаполнения (FR-T-19)
opened_at → closed_at Полное время в приёмнике Норматив выбытия (FR-T-21)
Число closed за час КПЭ паспорта: пациентов в час Приёмка результата

Определение КПЭ должно быть зафиксировано до внедрения

Какой именно из интервалов считается «средним временем ожидания оказания медицинской помощи», паспортом не определено. Разные трактовки дают разные числа при одинаковой работе. См. R-7 и «Соответствие таблиц».