# FHIR Ru. Интеграция с ИС лабораторных приборов
## Термины и определения
| Термин | Определение |
| -------- | -------- |
| Групповой контейнер| Контейнер, имеющий идентификатор и содержащий ячейки, идентифицированные координатами (например, строка и колонка ячейки микропланшета или ячейка ротора), с субстратами ЛИ|
| ИС| Информационная система|
| ИСЛП | Информационная система управления лабораторными приборами|
| Контейнер | Контейнер для проведения аппаратных лабораторных исследований|
| ЛИ | Лабораторное исследование|
| ЛИС | Лабораторная информационная система|
| Одиночный контейнер| Контейнер, имеющий идентификатор и содержащий один субстрат ЛИ|
| Субстрат ЛИ| Вещество для исследования: медицинский биологический материал, контроль, калибратор|
## Введение
Существует необходимость интеграции ЛИС с ИС управления приборами, выполняющими лабораторные исследования (далее ИСЛП).
Интеграция реализуется REST-сервисами с сообщениями на базе FHIR 4.0.
Предполагается, что сервисы интеграции могут разворачиваться на одной или обеих сторонах взаимодействия.
ЛИ может выполняться на перечне приборов.
Выбор приборов для выполнения ЛИ:
* может проходить на одной из сторон взаимодействия
* может выполняться пользователем
* может уточняться в ИСЛП.
На выбор прибора влияют:
* биоматериалы
* заказанные тесты ЛИ
* тесты, которые может выполнить прибор
* локация прибора
В групповом контейнере разные ячейки могут содержать заказы разных исследований с разным набором тестов.
ЛИС отвечает за ведение справочников, значимых для ИСЛП (далее справочники).
Существует необходимость периодической актуализации версий справочников в ИСЛП.
ИСЛП использует справочники:
* для настройки драйверов приборов
* для уточнения выбора приборов заказа
## Контекст
1. ЛИС ведет справочники.
2. ЛИС передает в ИСЛП справочники.
3. ЛИС регистрирует заказ лабораторных исследований (далее ЛИ).
4. ЛИС проводит пробоподготовку биоматериалов для ЛИ в одиночные или групповые контейнеры.
5. ЛИС передает в ИСЛП заказы:
5.1. ЛИС передает в ИСЛП заказ ЛИ по одиночному контейнеру.
5.2. ЛИС передает в ИСЛП заказ по групповому контейнеру.
6. ЛИС передает в ИСЛП сообщение о выбраковке контейнера.
7. ИСЛП запрашивает в ЛИС заказ ЛИ по контейнеру, если заказа нет в ИСЛП.
8. ИСПЛ запрашивает в ЛИС регистрацию заказа ЛИ по контейнеру, если заказа нет в ЛИС.
9. ИСЛП передает в ЛИС результаты ЛИ по заказу.
## Участники интеграции
Участниками интеграции являются ЛИС и ИСЛП.
## Варианты использования

### Передать справочник
Если ЛИС является инициатором взаимодействия и администратор ЛИС изменяет справочник, то ЛИС отправляет подтвержденные изменения справочника в ИСЛП.
### Получить справочники
Администратор ИСЛП при первичной настройки ИСЛП и далее при необходимости инициирует получение из ЛИС перечня актуальных версий справочников.
ИСПЛ по расписанию:
* получает из ЛИС перечень актуальных версий справочников
* получает из ЛИС актуальную версию по каждому справочнику из перечня.
Предполагаемый перечень справочников:
* Приборы
* Драйверы
* Тесты драйвера
* Антибиотики драйвера
* Бактерии драйвера
* Биоматериалы драйвера
* Перечислимые значения теста
* Единицы измерения теста
### Получить справочник
Администратор ИСЛП при необходимости инициирует получение из ЛИС актуальной версии справочника.
### Передать заказ ЛИ по одиночному контейнеру
Если ЛИС является инициатором взаимодействия, то ЛИС передает в ИСЛП заказ по одиночному контейнеру в случае наступления событий:
* Одиночный контейнер принят в ЛИС
* В ЛИС образец забран в одиночный контейнер
* В ЛИС образец аликвотирован в другие одиночные контейнеры
* В ЛИС одиночный контейнер отправлен на прибор
* В ЛИС одиночный контейнер выбран в работу
* В ЛИС сделан дозаказ ЛИ по одиночному контейнеру.
ИСЛП может уточнять перечень приборов для выполнения заказа.
### Передать заказ ЛИ по групповому контейнеру
Если ЛИС является инициатором взаимодействия, то ЛИС передает в ИСЛП заказ по групповому контейнеру в случае наступления событий:
* Групповой контейнер отправлен на прибор
* Групповой контейнер отправлен в работу
ИСЛП может уточнять перечень приборов для выполнения заказа.
### Передать выбраковку контейнера
Если ЛИС является инициатором взаимодействия и контейнер выбракован в ЛИС, то ЛИС передает в ИСЛП выбраковку контейнера.
### Запросить заказ ЛИ по контейнеру
Если ИСЛП получило от прибора запрос заказа по баркоду и не нашло его у себя, то ИСЛП запрашивает в ЛИС заказ по контейнеру.
### Запросить заказы ЛИ по приборам
Если ИСЛП является инициатором взаимодействия, то ИСЛП по расписанию запрашивает в ЛИС все заказы по активным приборам.
### Запросить статус заказа ЛИ
Если ИСЛП является инициатором взаимодействия, то ИСЛП по расписанию запрашивает в ЛИС статусы необработанных в ИСЛП заказов для получения информации о выбракованных контейнерах.
### Запросить результаты заказа ЛИ
Если ЛИС является инициатором взаимодействия, то ЛИС по расписанию запрашивает в ИСЛП результаты переданных, но не выполненных заказов.
Сотрудник ЛИС при необходимости запрашивает в ИСЛП результаты переданного заказа.
### Передать результаты заказа ЛИ
Если ИСЛП является инициатором взаимодействия и от прибора получены результаты по заказу, то ИСЛП передает в ЛИС результаты заказа.
### Передать заказ ЛИ по контейнеру
Если ИСЛП получает от прибора результаты без предварительного заказа, то ИСЛП передает в ЛИС запрос на создание заказа.
## Варианты взаимодействия
### Вариант активной ЛИС
```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
}
```