Навигация:  МОДУЛЬ "ПРОТОКОЛ HL7" > НАСТРОЙКА СХЕМ ВХОДА И ВЫХОДА >

Настройка конфигурации входящих сообщений (HL7_IN.xml)

Предыдущая страницаВернуться в начало главыСледующая страница

Файл HL7_IN.xml. Настройка конфигурации входящих сообщений.

 

<?xml version="1.0" encoding="windows-1251"?>

<!— Кодировка самого файла HL7_IN.xml должна соответствовать указанной здесь кодировке-->

<hl7>

 <events>

         <!

         В данной секции перечисляются обрабатываемые входящие HL7 сообщения.

<code> – имя корневого элемента HL7 сообщения

<name> – используется только в этом файле настроек (для удобства названия секций) и его можно не задавать. Тогда <name> будет совпадать с <code>.

         -->

         <event desc = "изменение пациента">

                 <name>PATIENT</name>

                 <code>ADT_A08</code>

         </event>

         <event desc = "подтверждение сообщения">

                 <name>ACK</name>

                 <code>ACK</code>

         </event>

 </events>

 <sections>

         <!

         Секции описывают формат сообщения. Имя секции должно совпадать с описанными выше сообщениями (events). Также есть промежуточные секции (например, common), они используются в других секциях (через свойство <parent>) чтобы избежать настраивания для каждого сообщения одного и того же.                

         -->

         <COMMON>

                 <!

                 Описываем сегменты входящего сообщения: где какие данные

                 -->

                 <segments>

                         <MESSAGE_INFO>

                                 <!

                                 В фигурных скобках указываются имена полей, к которым потом можно обращаться в SQL-запросах.

                                 -->

                                 <MESSAGE_ID>{MESSAGE_ID}</MESSAGE_ID>

                                 <DATETIME>{CURRENT_DATE}</DATETIME>

                         </MESSAGE_INFO>

                 </segments>

         </COMMON>

         <PATIENT>

                 <parent>COMMON</parent>

                 <!

                 Если заполнено поле <answer_event>, то после выполнения всех sql-скриптов будет создана новая запись в таблице HL7_EVENTS. Это нужно для формирования ответного сообщения. Для записи в HL7_EVENTS используются следующие значения:

REC_TYPE = значение секции <answer_event>

ACTION_TYPE = значение секции <answer_action> - это поле в HL7_EVENTS использовать не обязательно

EXT_CODE1 = {EXT_CODE1}

EXT_CODE2 = {EXT_CODE2}

Последние два поля можно использовать для передачи каких-то параметров для ответного сообщения. Например, входящее сообщение – запрос по пациенту по СНИЛС. Тогда через {EXT_CODE1} можно передать СНИЛС, чтобы при обработке этой записи из HL7_EVENTS можно было найти пациента и отправить ответ.

                 -->

                 <answer_event>PATIENT_ACK</answer_event>

                 <segments>

                         <PATIENT_INFO>

                                 <GUID>{GUID}</GUID>

                                 <NOM>{NOM}</NOM>

                                 <PRENOM>{PRENOM}</PRENOM>

                                 <BIRTHDAY type="datetime">{BIRTHDAY}</BIRTHDAY>

                                 <SEX>{POL}</SEX>

                         </PATIENT_INFO>

                                 <!

                                 Если к секции привязан конкретный SQL-скрипт, то он будет выполнен столько раз, сколько раз повторяется данная секция.

                                 -->

                         <INSURANCE query="insurance">

                                 <ID>{EXT_CLINK_PATIENTS_ID}</ID>

                                 <PROGRAM_CODE>{PROGRAM_CODE}</PROGRAM_CODE>

                                 <CONTR_CODE>{CONTR_CODE}</CONTR_CODE>

                                 <!

                                 Для корректного формирования sql-скрипта надо указывать тип поля. Возможные зyачения: "boolean", "integer", "float", "datetime", в противном случае строка (для строковых значений указывать тип не обязательно).

                                 -->

                                 <START_DATE type="datetime">{START_DATE}</START_DATE>

                                 <END_DATE type="datetime">{END_DATE}</END_DATE>

                                 <ISDELETED type="boolean">{ISDELETED}</ISDELETED>

                                 <GUID>{CLINK_GUID}</GUID>

                         </INSURANCE>

                 </segments>

                 <queries>

                         <query>

                                 <order>1</order>

                                 <!

                                 Здесь тип именно EXEC, потому что в данном случае нужно не вернуть набор данных, а выполнить SQL-скрипт. Если есть хотя бы один SQL-скрипт типа EXEC, то все скрипты будут выполняться в рамках одной транзакции.

                                 -->

                                 <type>exec</type>

                                 <text>

declare @pid int

declare @ne_le datetime

declare @pol bit

declare @count_rec int

declare @ERRMSG varchar(1024)

 

set @pid = null

set @ne_le = :BIRTHDAY

set @pol = case when :POL = 'M' then 0

              when :POL = 'F' then 1

              else NULL

          end

 

set @count_rec = (select count(*) from patients where GUID = :GUID)

 

if @count_rec = 0

begin

 exec up_get_id 'PATIENTS', 1, @pid output

 insert patients (patients_id, GUID, NOM, PRENOM, NE_LE, POL)

                    values (@pid, :GUID, :NOM, :PRENOM, ne_le, @pol)

end

else

if @count_rec = 1

begin

 select @pid = patients_id from patients where GUID = :GUID

 update patients set

         NOM = :NOM, PRENOM = :PRENOM, NE_LE = @ne_le, POL = @pol

 where patients_id = @pid

end

else

begin

 set @ERRMSG = 'Некорректный входящий GUID пациента. GUID [' + :GUID + ']'

 raiserror 50000 @ERRMSG

 return

end

                                 </text>

                         </query>

                 </queries>

         </PATIENT>

                 

         <!

         Типичный пример обработки простого ответного сообщения (подтверждающего получение нашего сообщения). Соответствующая запись из HL7_EVENTS будет перенесена в HL7_EVENTS_LOG с указанием примечаний, которые пришли с этим ответом.

         -->

         <ACK>

                 <parent>COMMON</parent>

                 <segments>

                         <ACK_INFO>

                                 <MESSAGE_ID>{ACK_MESSAGE_ID}</MESSAGE_ID>

                                 <CODE>{ACK_CODE}</CODE>

                                 <COMMENT>{ACK_TEXT}</COMMENT>

                         </ACK_INFO>

                 </segments>

                 <queries>

                         <query>

                                 <order>1</order>

                                 <type>exec</type>

                                 <text>

insert HL7_EVENTS_LOG

 (HL7_EVENTS_ID, REC_ID, REC_TYPE, ACTION_TYPE, EXT_CODE, CREATION_DATE, SEND_COUNT, MESSAGE_ID, SUCCESS, COMMENT)

 select

         HL7_EVENTS_ID, REC_ID, REC_TYPE, ACTION_TYPE, EXT_CODE, CREATION_DATE, SEND_COUNT,

         :ACK_MESSAGE_ID, case when :ACK_CODE = 'AA' then 1 else 0 end, :ACK_TEXT

 from HL7_EVENTS where MESSAGE_ID = :ACK_MESSAGE_ID

                                 </text>

                         </query>

                         <query>

                                 <order>2</order>

                                 <type>exec</type>

                                 <text>

delete from HL7_EVENTS where MESSAGE_ID = :ACK_MESSAGE_ID

                                 </text>

                         </query>

                 </queries>

         </ACK>

 </sections>

</hl7>