# FHIR Ru. Интеграция с ИС лабораторных приборов ## Термины и определения | Термин | Определение | | -------- | -------- | | Групповой контейнер| Контейнер, имеющий идентификатор и содержащий ячейки, идентифицированные координатами (например, строка и колонка ячейки микропланшета или ячейка ротора), с субстратами ЛИ| | ИС| Информационная система| | ИСЛП | Информационная система управления лабораторными приборами| | Контейнер | Контейнер для проведения аппаратных лабораторных исследований| | ЛИ | Лабораторное исследование| | ЛИС | Лабораторная информационная система| | Одиночный контейнер| Контейнер, имеющий идентификатор и содержащий один субстрат ЛИ| | Субстрат ЛИ| Вещество для исследования: медицинский биологический материал, контроль, калибратор| ## Введение Существует необходимость интеграции ЛИС с ИС управления приборами, выполняющими лабораторные исследования (далее ИСЛП). Интеграция реализуется REST-сервисами с сообщениями на базе FHIR 4.0. Предполагается, что сервисы интеграции могут разворачиваться на одной или обеих сторонах взаимодействия. ЛИ может выполняться на перечне приборов. Выбор приборов для выполнения ЛИ: * может проходить на одной из сторон взаимодействия * может выполняться пользователем * может уточняться в ИСЛП. На выбор прибора влияют: * биоматериалы * заказанные тесты ЛИ * тесты, которые может выполнить прибор * локация прибора В групповом контейнере разные ячейки могут содержать заказы разных исследований с разным набором тестов. ЛИС отвечает за ведение справочников, значимых для ИСЛП (далее справочники). Существует необходимость периодической актуализации версий справочников в ИСЛП. ИСЛП использует справочники: * для настройки драйверов приборов * для уточнения выбора приборов заказа ## Контекст 1. ЛИС ведет справочники. 2. ЛИС передает в ИСЛП справочники. 3. ЛИС регистрирует заказ лабораторных исследований (далее ЛИ). 4. ЛИС проводит пробоподготовку биоматериалов для ЛИ в одиночные или групповые контейнеры. 5. ЛИС передает в ИСЛП заказы: 5.1. ЛИС передает в ИСЛП заказ ЛИ по одиночному контейнеру. 5.2. ЛИС передает в ИСЛП заказ по групповому контейнеру. 6. ЛИС передает в ИСЛП сообщение о выбраковке контейнера. 7. ИСЛП запрашивает в ЛИС заказ ЛИ по контейнеру, если заказа нет в ИСЛП. 8. ИСПЛ запрашивает в ЛИС регистрацию заказа ЛИ по контейнеру, если заказа нет в ЛИС. 9. ИСЛП передает в ЛИС результаты ЛИ по заказу. ## Участники интеграции Участниками интеграции являются ЛИС и ИСЛП. ## Варианты использования ![](https://i.imgur.com/BRW9pNC.jpg) ### Передать справочник Если ЛИС является инициатором взаимодействия и администратор ЛИС изменяет справочник, то ЛИС отправляет подтвержденные изменения справочника в ИСЛП. ### Получить справочники Администратор ИСЛП при первичной настройки ИСЛП и далее при необходимости инициирует получение из ЛИС перечня актуальных версий справочников. ИСПЛ по расписанию: * получает из ЛИС перечень актуальных версий справочников * получает из ЛИС актуальную версию по каждому справочнику из перечня. Предполагаемый перечень справочников: * Приборы * Драйверы * Тесты драйвера * Антибиотики драйвера * Бактерии драйвера * Биоматериалы драйвера * Перечислимые значения теста * Единицы измерения теста ### Получить справочник Администратор ИСЛП при необходимости инициирует получение из ЛИС актуальной версии справочника. ### Передать заказ ЛИ по одиночному контейнеру Если ЛИС является инициатором взаимодействия, то ЛИС передает в ИСЛП заказ по одиночному контейнеру в случае наступления событий: * Одиночный контейнер принят в ЛИС * В ЛИС образец забран в одиночный контейнер * В ЛИС образец аликвотирован в другие одиночные контейнеры * В ЛИС одиночный контейнер отправлен на прибор * В ЛИС одиночный контейнер выбран в работу * В ЛИС сделан дозаказ ЛИ по одиночному контейнеру. ИСЛП может уточнять перечень приборов для выполнения заказа. ### Передать заказ ЛИ по групповому контейнеру Если ЛИС является инициатором взаимодействия, то ЛИС передает в ИСЛП заказ по групповому контейнеру в случае наступления событий: * Групповой контейнер отправлен на прибор * Групповой контейнер отправлен в работу ИСЛП может уточнять перечень приборов для выполнения заказа. ### Передать выбраковку контейнера Если ЛИС является инициатором взаимодействия и контейнер выбракован в ЛИС, то ЛИС передает в ИСЛП выбраковку контейнера. ### Запросить заказ ЛИ по контейнеру Если ИСЛП получило от прибора запрос заказа по баркоду и не нашло его у себя, то ИСЛП запрашивает в ЛИС заказ по контейнеру. ### Запросить заказы ЛИ по приборам Если ИСЛП является инициатором взаимодействия, то ИСЛП по расписанию запрашивает в ЛИС все заказы по активным приборам. ### Запросить статус заказа ЛИ Если ИСЛП является инициатором взаимодействия, то ИСЛП по расписанию запрашивает в ЛИС статусы необработанных в ИСЛП заказов для получения информации о выбракованных контейнерах. ### Запросить результаты заказа ЛИ Если ЛИС является инициатором взаимодействия, то ЛИС по расписанию запрашивает в ИСЛП результаты переданных, но не выполненных заказов. Сотрудник ЛИС при необходимости запрашивает в ИСЛП результаты переданного заказа. ### Передать результаты заказа ЛИ Если ИСЛП является инициатором взаимодействия и от прибора получены результаты по заказу, то ИСЛП передает в ЛИС результаты заказа. ### Передать заказ ЛИ по контейнеру Если ИСЛП получает от прибора результаты без предварительного заказа, то ИСЛП передает в ЛИС запрос на создание заказа. ## Варианты взаимодействия ### Вариант активной ЛИС ```mermaid sequenceDiagram participant ЛИС participant ИСЛП ЛИС->>ИСЛП: Передать справочник ЛИС->>ИСЛП: Передать заказ ЛИ по одиночному контейнеру ЛИС->>ИСЛП: Передать заказ ЛИ по групповому контейнеру ЛИС->>ИСЛП: Передать выбраковку контейнера ИСЛП->>ЛИС: Запросить заказ ЛИ по контейнеру ИСЛП->>ЛИС: Передать заказ ЛИ по контейнеру ЛИС->>ИСЛП: Запросить результаты заказа ЛИ ``` ### Вариант активной ИСЛП ```mermaid sequenceDiagram participant ИСЛП participant ЛИС ИСЛП->>ЛИС: Запросить справочники ИСЛП->>ЛИС: Запросить справочник ИСЛП->>ЛИС: Запросить заказы ЛИ по приборам ИСЛП->>ЛИС: Запросить заказ ЛИ по контейнеру ИСЛП->>ЛИС: Запросить статус заказа ЛИ ИСЛП->>ЛИС: Передать заказ ЛИ по контейнеру ИСЛП->>ЛИС: Передать результаты заказа ЛИ ``` ## Проекты операций сервиса ИСЛП ### Передать заказ ЛИ по одиночному контейнеру (sampleToWork) #### Запрос (вариант 1) ```mermaid classDiagram direction LR class Группа{ <<Group>> id* type = device actual = true } class ЗаголовокСообщения{ <<MessageHeader>> id* eventCoding source destination } class ЗаказОбразца{ <<Task>> id* intent = order status = requested authoredOn requester: ЛПУ for: Пациент } ЗаказОбразца -- Пациент ЗаказОбразца -- ЛПУ class ЗаказУслуги{ <<Task>> id* intent = instance-order status = requested partOf: ЗаказОбразца input focus: ЗапросУслуги } ЗаказУслуги --* ЗаказОбразца ЗаказУслуги -- ЗапросУслуги class ЗапросПрибора{ <<DeviceRequest>> id* intent codeReference: Прибор supportingInfo: Тест subject: Группа } ЗапросПрибора -- Прибор ЗапросПрибора *-- Тест ЗапросПрибора -- Группа class ЗапросУслуги{ <<ServiceRequest>> id* subject: Пациент intent = instance-order status = active supportingInfo: ЗапросПрибора specimen: Образец code } ЗапросУслуги -- Пациент ЗапросУслуги *-- ЗапросПрибора ЗапросУслуги *-- Образец class ЛПУ{ <<Organization>> id* identifier name } class Образец{ <<Specimen>> id* identifier collection container type } class Пакет{ <<Bundle>> type = transaction timestamp entry: РесурсПакета } Пакет *-- РесурсПакета class Пациент{ <<Patient>> id* identifier gender birthDate managingOrganization: Подразделение name } Пациент -- Подразделение class Подразделение{ <<Organization>> id* partOf: ЛПУ name } Подразделение -- ЛПУ class Прибор{ <<Device>> id* identifier deviceName } class Ресурс{ <<Resource>> resourceType } class РесурсПакета{ <<entry>> fullUrl resource: Ресурс } РесурсПакета -- Ресурс class Тест{ <<Observation>> id* status = registered code } ``` #### Запрос (вариант 2) ```mermaid classDiagram direction LR class Группа{ <<Group>> id* type = device actual = true } class ЗаголовокСообщения{ <<MessageHeader>> id* eventCoding source destination } class ЗапросПрибора{ <<DeviceRequest>> id* intent codeReference: Прибор supportingInfo: Тест subject: Группа } ЗапросПрибора -- Прибор ЗапросПрибора *-- Тест ЗапросПрибора -- Группа class ЗапросУслуги{ <<ServiceRequest>> id* subject: Пациент intent = order status = active supportingInfo: ЗапросПрибора specimen: Образец requester: ЛПУ code authoredOn } ЗапросУслуги -- Пациент ЗапросУслуги *-- ЗапросПрибора ЗапросУслуги *-- Образец ЗапросУслуги -- ЛПУ class ЛПУ{ <<Organization>> id* identifier name } class Образец{ <<Specimen>> id* identifier collection container type } class Пакет{ <<Bundle>> type = transaction timestamp entry: РесурсПакета } Пакет *-- РесурсПакета class Пациент{ <<Patient>> id* identifier gender birthDate managingOrganization: Подразделение name } Пациент -- Подразделение class Подразделение{ <<Organization>> id* partOf: ЛПУ name } Подразделение -- ЛПУ class Прибор{ <<Device>> id* identifier deviceName } class Ресурс{ <<Resource>> resourceType } class РесурсПакета{ <<entry>> fullUrl resource: Ресурс } РесурсПакета -- Ресурс class Тест{ <<Observation>> id* status = registered code } ``` ### Передать заказ по групповому контейнеру (putToWork) Не найден вариант без Task, т.к. не ясно, где хранить информацию о количестве строк, колонок, типе адресации ячеек постановки и адресах конкретных ячеек. #### Запрос ```mermaid classDiagram direction LR class Группа{ <<Group>> id* type = substance actual = true } class ЗаголовокСообщения{ <<MessageHeader>> id* eventCoding source destination } class ЗаказПостановки{ <<Task>> id* intent = order status = requested identifier authoredOn input for: ЗапросУслугиПостановки } ЗаказПостановки -- ЗапросУслугиПостановки class ЗаказУслуги{ <<Task>> id* intent = instance-order status = requested partOf: ЗаказПостановки identifier input requester: ЛПУ for: Пациент focus: ЗапросУслуги } ЗаказУслуги --* ЗаказПостановки ЗаказУслуги -- ЛПУ ЗаказУслуги -- Пациент ЗаказУслуги -- ЗапросУслуги class ЗапросПрибора{ <<DeviceRequest>> id* subject: Прибор intent = order codeReference: Прибор supportingInfo: Тест } ЗапросПрибора -- Прибор ЗапросПрибора *-- Тест class ЗапросУслуги{ <<ServiceRequest>> id* subject: Пациент intent = instance-order status = active specimen: Образец supportingInfo: Тест code } ЗапросУслуги -- Пациент ЗапросУслуги *-- Образец ЗапросУслуги *-- Тест class ЗапросУслугиПостановки{ <<ServiceRequest>> id* subject: Группа intent = order status = active supportingInfo: ЗапросПрибора identifier } ЗапросУслугиПостановки -- Группа ЗапросУслугиПостановки *-- ЗапросПрибора class ЛПУ{ <<Organization>> id* identifier name } class Образец{ <<Specimen>> id* identifier collection container type } class Пакет{ <<Bundle>> type = transaction timestamp entry: РесурсПакета } Пакет *-- РесурсПакета class Пациент{ <<Patient>> id* identifier gender birthDate managingOrganization: Подразделение name } Пациент -- Подразделение class Подразделение{ <<Organization>> id* partOf: ЛПУ name } Подразделение -- ЛПУ class Прибор{ <<Device>> id* identifier deviceName } class Ресурс{ <<Resource>> resourceType } class РесурсПакета{ <<entry>> fullUrl resource: Ресурс } РесурсПакета -- Ресурс class Тест{ <<Observation>> id* status = registered code } ```