Файл 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>