---
# System prepended metadata

title: FHIR Ru. Интеграция с ИС лабораторных приборов

---

# 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
	}

```




