Настройка маршрутизации пациентов в МИС сводится к созданию правил, триггеров и интеграций, которые автоматически направляют пациента по нужному пути: от регистратуры до профильного специалиста или госпитализации. Вы определяете критерии тяжести, связываете их с расписанием врачей и коечным фондом, а система берет на себя логистику. Это руководство дает готовые конфигурации и архитектурные схемы, которые можно адаптировать под конкретную медицинскую информационную систему.
Разберем полный цикл: от проектирования архитектуры до отказоустойчивого продакшен-развертывания. Вы получите примеры правил на JSON, шаблоны вебхуков для интеграции с регистратурой и приемным отделением, методику тестирования и список критичных метрик для мониторинга.
Архитектура маршрутизации пациентов в МИС
Типовая архитектура маршрутизации включает четыре слоя: источники данных, движок правил, исполнительные системы и слой интеграций. Пациент поступает через регистратуру или приемное отделение, данные фиксируются в МИС, движок правил обрабатывает их и выдает решение: к какому врачу направить, в какое отделение госпитализировать, какой приоритет назначить.
Поток данных выглядит так: регистратор создает запись → модуль маршрутизации получает событие → Rule Engine вычисляет приоритет и направление → результат передается в расписание врачей или систему учета коек. Параллельно уведомления уходят в приемное отделение и пациенту.
Компоненты системы маршрутизации
База данных пациентов хранит демографические данные, историю обращений, диагнозы. Движок правил (Rule Engine) - это ядро системы, которое принимает решения на основе заложенной логики. API-слой обеспечивает интеграцию с внешними сервисами: расписанием врачей, лабораторными системами, системами учета коечного фонда. Интерфейсы регистратуры и приемного отделения служат точками ввода данных и отображения результатов маршрутизации.
Взаимодействие компонентов синхронно-асинхронное. Регистратура отправляет REST-запрос к API маршрутизации, Rule Engine синхронно возвращает решение. Параллельно вебхуки рассылают асинхронные уведомления в смежные системы. Такая схема позволяет не блокировать интерфейс регистратора на время выполнения сложных правил.
Роли администратора и DevOps в настройке маршрутизации
Администратор МИС отвечает за бизнес-логику: создает справочники симптомов и специализаций, настраивает правила приоритизации, определяет критерии экстренной госпитализации. Он работает в интерфейсе МИС или правит конфигурационные файлы правил.
DevOps-инженер обеспечивает инфраструктуру: развертывает микросервис маршрутизации в Kubernetes, настраивает CI/CD-пайплайн для обновления правил без простоя, поднимает мониторинг и алертинг. Зона ответственности DevOps - отказоустойчивость, производительность и безопасность API-слоя. При внедрении оба специалиста работают в связке: администратор готовит правила, DevOps упаковывает их в контейнеры и выкатывает в прод.
Пример простого flow: пациент поступает в приемное отделение с жалобами на боль в груди. Регистратор вносит симптомы в МИС. Система определяет тяжесть по шкале NEWS, присваивает красный приоритет и направляет пациента к дежурному кардиологу, одновременно резервируя койку в реанимации.
Настройка приоритизации пациентов по тяжести состояния
Приоритизация - первый этап маршрутизации. Система должна мгновенно отделить критических пациентов от тех, кто может подождать. Для этого формализуем медицинские критерии в технические правила, которые движок обрабатывает за миллисекунды.
Определение критериев тяжести и шкал оценки
Шкалы NEWS (National Early Warning Score) и MEWS (Modified Early Warning Score) - стандартный инструмент оценки тяжести. Они учитывают частоту дыхания, сатурацию кислорода, температуру, систолическое давление, пульс, уровень сознания. Каждый параметр получает балл от 0 до 3, сумма определяет приоритет:
- 0-4 балла: зеленый приоритет, плановая помощь
- 5-6 баллов: желтый приоритет, срочный осмотр в течение 30 минут
- 7+ баллов: красный приоритет, немедленная реакция
Для интеграции шкалы в МИС создайте справочник симптомов с весовыми коэффициентами. Пример структуры данных:
{
"symptoms": [
{"id": "resp_rate_high", "name": "ЧДД > 25", "weight": 3},
{"id": "spo2_low", "name": "SpO2 < 92%", "weight": 3},
{"id": "sbp_low", "name": "САД < 90", "weight": 2},
{"id": "temp_high", "name": "Температура > 38.5", "weight": 1}
]
}
Создание правил и триггеров в МИС
Правило приоритизации - это условие, которое срабатывает при поступлении пациента. Триггером выступает событие создания новой записи в приемном отделении. Настройте его так, чтобы система автоматически вычисляла сумму баллов и назначала приоритет.
Пример конфигурации правила на YAML для Rule Engine:
rule: emergency_priority
trigger:
event: patient_admission
source: emergency_department
conditions:
- field: symptoms
operator: includes_any
value: [resp_rate_high, spo2_low, sbp_low]
actions:
- set_priority: red
- notify:
target: resuscitation_team
channel: push_notification
- reserve_bed:
department: icu
duration_minutes: 120
Условие includes_any проверяет наличие хотя бы одного критического симптома. При срабатывании система выставляет красный приоритет, отправляет push-уведомление реанимационной бригаде и резервирует койку в реанимации на два часа. Если ни одно условие не выполнено, движок переходит к следующему правилу - вычислению суммы баллов по шкале NEWS и назначению желтого или зеленого приоритета.
Маршрутизация к профильным специалистам
После определения приоритета система направляет пациента к врачу нужного профиля. Автоматизация этого этапа сокращает время ручного распределения и исключает ошибки: пациент с острым коронарным синдромом не попадет к неврологу.
Настройка справочников специалистов и их компетенций
Справочник специалистов должен содержать ФИО врача, специализацию, доступные слоты времени и текущую загрузку. Структура данных:
{
"doctor_id": "cardio_01",
"full_name": "Иванов Сергей Петрович",
"specializations": ["cardiology", "emergency_care"],
"schedule": {
"monday": ["08:00-16:00"],
"tuesday": ["08:00-16:00"]
},
"current_load": 3,
"max_load": 8
}
Поле specializations - массив, один врач может иметь несколько компетенций. current_load обновляется в реальном времени при каждом назначении. Это позволяет движку правил выбирать наименее загруженного специалиста нужного профиля.
Правила назначения врача в зависимости от симптомов
Свяжите справочник симптомов со справочником специализаций через таблицу соответствий. Правило маршрутизации проверяет диагноз или набор симптомов и возвращает специализацию, затем ищет доступного врача с этой специализацией и минимальной загрузкой.
Пример правила:
rule: cardiac_routing
trigger:
event: priority_assigned
priority: red
conditions:
- field: primary_complaint
operator: equals
value: chest_pain
- field: ecg_result
operator: equals
value: st_elevation
actions:
- assign_specialization: cardiology
- select_doctor:
strategy: least_loaded
specialization: cardiology
- update_schedule:
doctor: "{{selected_doctor}}"
slot: immediate
Стратегия least_loaded выбирает кардиолога с минимальной текущей загрузкой. Если все кардиологи заняты, правило может расширить поиск на врачей со смежной специализацией или отправить уведомление старшему врачу смены.
Настройка экстренной и плановой госпитализации
Госпитализация бывает экстренной и плановой. Разница в скорости реакции и наборе проверок. Экстренная требует немедленного резервирования койки и оповещения отделения, плановая - проверки доступности мест и предварительной записи.
Триггеры для экстренной госпитализации
Триггер экстренной госпитализации срабатывает при красном приоритете и определенных диагнозах. Система должна за секунды найти свободную койку в реанимации или профильном отделении, зарезервировать ее и оповестить дежурную бригаду.
Пример конфигурации с проверкой коечного фонда:
rule: emergency_hospitalization
trigger:
event: priority_assigned
priority: red
conditions:
- field: diagnosis_code
operator: in_list
value: [I21, I22, I63]
actions:
- query_bed_availability:
department: icu
min_beds: 1
- reserve_bed:
bed_id: "{{available_bed}}"
patient_id: "{{patient.id}}"
- notify:
targets: [icu_head_nurse, duty_doctor]
message: "Экстренная госпитализация. Пациент: {{patient.name}}. Диагноз: {{diagnosis}}"
- create_transfer_order:
from: emergency_department
to: icu
priority: immediate
Действие query_bed_availability обращается к API системы учета коечного фонда. Если свободных мест нет, правило переходит к плану Б: поиск койки в смежном отделении или отправка запроса на перевод в другую больницу. Интеграция с коечным фондом критична - без нее автоматизация экстренной госпитализации невозможна.
Автоматизация плановой госпитализации
Плановая госпитализация запускается по направлению врача. Система проверяет расписание отделения, наличие свободных коек на запланированную дату и отправляет уведомление пациенту. Триггером выступает событие создания направления с типом «плановая госпитализация».
Алгоритм действий:
- Получить дату плановой госпитализации из направления
- Запросить коечный фонд отделения на эту дату
- Если места есть - зарезервировать койку и отправить SMS пациенту
- Если мест нет - предложить ближайшие доступные даты
Для SMS-уведомлений используйте API шлюза, интегрированный с МИС. Шаблон сообщения: «Иванов И.И., плановая госпитализация в отделение кардиологии подтверждена на 25.07.2026. Явка к 9:00 в приемное отделение».
Интеграция МИС с регистратурой и приемным отделением
Бесшовный обмен данными между подсистемами исключает двойной ввод и ошибки ручного переноса. Регистратура создает запись, приемное отделение видит ее мгновенно. Изменение статуса пациента в одном модуле отражается во всех остальных.
Настройка API и вебхуков для обмена данными
Основной протокол обмена - REST API с JSON-телами запросов. Для событий в реальном времени используйте вебхуки: МИС отправляет POST-запрос на URL смежной системы при каждом значимом событии.
Пример конфигурации вебхука для передачи данных из регистратуры в модуль маршрутизации:
{
"webhook": {
"name": "registration_to_routing",
"url": "https://mis-api.example.com/routing/patient",
"method": "POST",
"headers": {
"Authorization": "Bearer {{api_token}}",
"Content-Type": "application/json"
},
"payload": {
"patient_id": "{{patient.id}}",
"full_name": "{{patient.name}}",
"symptoms": "{{patient.symptoms}}",
"source": "registration_desk"
},
"retry_policy": {
"max_attempts": 3,
"backoff_seconds": [5, 15, 60]
}
}
}
Политика повторных попыток с экспоненциальной задержкой защищает от временных сбоев сети. После трех неудачных попыток событие попадает в dead-letter очередь для ручного разбора.
Синхронизация статусов и уведомлений
Двусторонняя синхронизация гарантирует, что изменение статуса пациента в приемном отделении отразится в регистратуре и наоборот. Настройте вебхуки в обе стороны:
- Регистратура → МИС: создание записи, изменение данных пациента
- МИС → Регистратура: результат маршрутизации, назначенный врач
- Приемное отделение → МИС: факт поступления, изменение статуса госпитализации
- МИС → Приемное отделение: уведомление о маршрутизации, резервирование койки
Для согласованности данных используйте механизм оптимистичной блокировки с версионированием записей. Каждая сущность имеет поле version, которое инкрементируется при изменении. Если вебхук приходит с устаревшей версией, система отклоняет его и логирует конфликт.
Тестирование и отладка системы маршрутизации
Ошибка в правилах маршрутизации может стоить пациенту жизни. Тестирование должно покрывать все сценарии: от штатных до граничных, когда система работает на пределе нагрузки или часть компонентов недоступна.
Юнит-тестирование правил маршрутизации
Каждое правило тестируйте изолированно. Подавайте на вход фиксированный набор данных и проверяйте, что выход соответствует ожидаемому. Используйте тестовый фреймворк, который умеет загружать конфигурации правил и прогонять их на тестовых сценариях.
Пример тестового сценария на Python:
def test_red_priority_rule():
patient = Patient(
symptoms=["chest_pain", "spo2_low"],
ecg_result="st_elevation"
)
result = rule_engine.evaluate("emergency_priority", patient)
assert result.priority == "red"
assert "resuscitation_team" in result.notifications
assert result.reserved_bed.department == "icu"
Создайте минимум три сценария на каждое правило: позитивный (правило срабатывает), негативный (правило не срабатывает, когда не должно), граничный (входные данные на границе условий).
Мониторинг и алертинг в production
Логируйте каждый этап маршрутизации: получение события, вычисление правил, результат, время выполнения. Настройте дашборд в Grafana с метриками:
- Количество маршрутизаций в минуту по приоритетам
- P95 времени выполнения правил
- Количество ошибок маршрутизации
- Процент пациентов, направленных к врачу в течение целевого времени
Алерты настройте в Telegram или Slack. Критичные триггеры: рост ошибок выше порога, превышение времени выполнения правил, отсутствие событий маршрутизации (значит, интеграция с регистратурой отвалилась). Пример алерта для Prometheus:
- alert: RoutingErrorRateHigh
expr: rate(routing_errors_total[5m]) > 0.01
for: 2m
labels:
severity: critical
annotations:
summary: "Ошибки маршрутизации превысили 1%"
Обеспечение отказоустойчивости и безопасности
Медицинская система не имеет права на простой. Отказ модуля маршрутизации парализует работу приемного отделения. Защита данных пациентов регулируется законодательством, и утечка персональных данных влечет серьезные последствия.
Резервирование и аварийное восстановление
Разверните модуль маршрутизации в кластере Kubernetes с минимум тремя репликами. Настройте горизонтальное автомасштабирование по CPU и количеству запросов. Балансировщик нагрузки распределяет трафик между репликами, при падении одной pod'ы трафик переключается на оставшиеся.
Базу данных правил реплицируйте master-slave с автоматическим фейловером. Резервное копирование конфигураций правил выполняйте ежедневно, храните последние семь копий. Протестируйте восстановление из бэкапа: разверните чистый инстанс, загрузите конфигурации, прогоните тестовые сценарии. Время восстановления не должно превышать 15 минут.
Контроль доступа и аудит изменений
Разграничьте роли: администратор МИС редактирует правила, DevOps управляет инфраструктурой, врачи только просматривают результаты маршрутизации. Используйте RBAC на уровне API: каждый запрос проверяет роль пользователя и разрешенные действия.
Все изменения правил логируйте с привязкой к пользователю и временной меткой. Журнал аудита должен фиксировать: кто изменил правило, старое значение, новое значение, время изменения. Храните журнал в защищенном от редактирования хранилище. Это нужно для расследования инцидентов и соответствия требованиям регуляторов.
Для дополнительной защиты передавайте данные пациентов по HTTPS с взаимной TLS-аутентификацией между сервисами. API-ключи ротируйте раз в 90 дней. Не храните персональные данные в логах - маскируйте или хешируйте их перед записью.
Настройка маршрутизации пациентов - это непрерывный процесс. Правила требуют корректировки при изменении структуры отделений, появлении новых врачей, обновлении медицинских протоколов. Заложите в CI/CD-пайплайн возможность быстрого обновления конфигураций правил без перезапуска сервиса. Используйте feature flags для тестирования новых правил на части трафика перед полным развертыванием.
Если вы проектируете микросервисную архитектуру маршрутизации, обратите внимание на руководство по маршрутизации пациентов в телемедицине - там разобраны паттерны отказоустойчивости и готовые примеры API-интеграций. Для планирования внедрения системы в существующую инфраструктуру пригодится фреймворк управления рисками IT-миграции с шаблонами RACI и реестром рисков. Развернуть отказоустойчивый кластер для модуля маршрутизации можно на облачной инфраструктуре Timeweb Cloud, которая предоставляет Kubernetes и управляемые базы данных.