- Cấu trúc cơ bản của một thông điệp HL7
Mỗi một thông điệp HL7 là một bản tin text được cấu trúc theo các segment thông tin. Mỗi segment gồm có trường thông tin được phân tách bởi một kí tự đặc biệt (thường dùng là |). Tùy thuộc vào mỗi loại thông điệp khác nhau mà số lượng các segment và thông tin được sử dụng có thể khác nhau.
Bảng 3.1: Các segment thông tin của một thông điệp HL7
STT Mã Name Ý nghĩa sử dụng
1 MSH Message Header Thông tin header của bản tin 2 SFT Software Segment Thông tin về phần mềm 3 EVN Event Type Thông tin về sự kiện 4 PID Patient
Identification
Thông tin về bệnh nhân
5 PD1 Patient Additional Demographic
STT Mã Name Ý nghĩa sử dụng
6 ROL Role Thông tin về người vài trò với bệnh nhân 7 MRG Merge patient
information segment
Hợp nhất thông tin bệnh nhân
8 NK1 Next of Kin / Associated Parties
Thông tin về thân nhân bệnh nhân trong xã hội
9 PV1 Patient Visit Thông tin về đợt điều trị (patient visit) 10 PV2 Patient Visit -
Additional Information
Thêm thông tin về đợt điều trị
11 DB1 Disability Thông tin về khuyết tật 12 OBR Observation
request
Thông tin về yêu cầu xét nghiệm
13 OBX Observation/Result Thông tin về kết quả xét nghiệm 14 AL1 Patient Allergy
Information
Thông tin về dị ứng
15 DG1 Diagnosis Thông tin chẩn đoán 16 DRG Diagnosis Related
Group
Thông tin về chẩn đoán nhóm liên quan.
17 GT1 Guarantor Thông tin về người bảo lãnh trả viện phí.
18 ACC Accident Thông tin vụ tai nạn mà bệnh nhân đã tham gia. 19 UB1 UB82 Thông tin dữ liệu cần thiết về bệnh nhân để hoàn
thành luật UB82
20 UB2 UB92 Thông tin dữ liệu cần thiết về bệnh nhân để hoàn thành luật UB92
21 PDA Patient Death and Autopsy
Thông tin về khám nghiệm tử thi khi bệnh nhân chết.
STT Mã Name Ý nghĩa sử dụng
22 IAM Patient Adverse Reaction
Information
Thông tin về bệnh nhân phản ứng bất lợi về nó.
23 NPU Bed Status Update Thông tin trạng thái giường ngủ cập nhật 24 IN1 Insurance Thông tin về bảo hiểm
25 IN2 Insurance additional information segment
Bổ sung thông tin bảo hiểm
26 IN3 Insurance additional information, certification segment
Bổ sung thông tin bảo hiểm, có chứng nhận
27 FT1 Financial transaction segment
Thông tin giao dịch tài chính
28 PR1 Procedures segment
Thông tin về phẫu thuật/thủ thuật
MSH là segment quan trọng nhất của mỗi bản tin. Nó được dùng để xác định cấu trúc của bản tin theo từng kiểu bản tin được áp dụng. Qua MSH ta có thể xác định được đầy đủ các thông tin về nơi gửi, nơi nhận, ý nghĩa sử dụng của thông điệp trong một tiến trình giao dịch cụ thể của hai hệ thống thông tin.
Bảng 3.2: Các trường thông tin trong MSH SEQ DT OPT ELEMENT NAME Ý nghĩa sử dụng
1 ST R Field Separator Kí tự phân tách |
SEQ DT OPT ELEMENT NAME Ý nghĩa sử dụng
3 HD O Sending Application Ứng dụng gửi thông điệp 4 HD O Sending Facility Nơi gửi thông điệp 5 HD O Receiving Application Ứng dụng nhận 6 HD O Receiving Facility Nơi nhận
7 TS O Date/Time Of Message Thời gian tạo bản tin
8 ST O Security Bảo mật
9 CM R Message Type Loại bản tin
10 ST R Message Control ID Mã điều khiển bản tin
11 PT R Processing ID Mã tiến trình
12 ID R Version ID Phiên bản
13 NM O Sequence Number Chuỗi nhiều sự kiện 14 ST O Continuation Pointer Điểm tiếp tục
15 ID O Accept Acknowledgment Type Kiểu xác nhận chấp nhận 16 ID O Application Acknowledgment Type Kiểu xác nhận loại ứng dụng
17 ID O Country Code Mã nước
18 ID O Character Set Bộ kí tự mã hóa
19 CE O Principal Language Of Message
Ngôn ngữ sử dụng của bản tin
Trong trường hợp thông điệp chứa thông tin liên quan đến một bệnh nhân, segment PID và PV1 cần được sử dụng để tóm tắt các thông tin chính về bệnh nhân cũng như đợt thăm khám. Cụ thể như sau:
Bảng 3.3: Các trường thông tin cơ bản về bệnh nhân (PID) SEQ DT OPT ELEMENT NAME Ý nghĩa sử dụng
1 SI O Set ID - Patient ID Thiết lập ID
SEQ DT OPT ELEMENT NAME Ý nghĩa sử dụng
3 CX R Patient ID (Internal ID) ID bệnh nhân(ID bên trong) 4 CX O Alternate Patient ID – PID ID khác của bệnh nhân
5 XPN R Patient Name Tên bệnh nhân
6 XPN O Mother’s Maiden Name Tên mẹ bệnh nhân
7 TS O Date/Time of Birth Ngày sinh
8 IS O Sex Giới tính
9 XPN O Patient Alias Bí danh
10 IS O Race Chủng tộc, tổ tiên
11 XAD O Patient Address Địa chỉ bệnh nhân
Bảng 3.4: Các trường thông tin về đợt điều trị tại bệnh viện (PV1) SEQ DT OPT ELEMENT
NAME Ý nghĩa sử dụng 1 SI O Set ID - PV1 Thiết lập ID 2 IS R Patient Class
Phân loại bệnh nhân: Điều trị nội trú, ngoại trú…
3 PL O Assigned
Patient Location
Nơi phòng khám bệnh nhân cần xét nghiệm
4 IS O Admission
Type
Loại bệnh nhân nhập viện: Tai nạn, khẩn cấp, thuyền xuyên,lao động
5 CX O Preadmit
Number
Số tài khoản của bệnh nhân trước khi được nhập viện
6 PL O Prior Patient Location
Nơi trước khi bệnh nhân đến
7 XCN O Attending Doctor
SEQ DT OPT ELEMENT NAME Ý nghĩa sử dụng 8 XCN O Referring Doctor Bác sỹ chuyển đến 9 XCN O Consulting Doctor Bác sỹ cố vấn 10 IS O Hospital Service Dịch vụ bệnh viện 11 PL O Temporary Location
Nơi ở tạm thời của bệnh nhân
12 IS O Preadmit
Test Indicator
Chỉ số kiểm tra trước khi được nhập viện
13 IS O Readmission Indicator
Chỉ số bệnh nhân được nhận trở lại
14 IS O Admit
Source
Nguồn nhận vào
15 IS O Ambulatory
Status
Trạng thái khuyết tật vĩnh viến hay tạm thời
16 IS O VIP Indicator Chỉ số VIP 17 XCN O Admitting Doctor Bác sĩ nhận hồ sơ
18 IS O Patient Type Loại bệnh nhân
19 CX O Visit
Number
Số đợt điều trị
20 CM O Financial Class
SEQ DT OPT ELEMENT
NAME Ý nghĩa sử dụng
21 IS O Charge
Price Indicator
Chỉ số giá phí chi trả của bệnh nhân
22 IS O Courtesy Code Mã ưu đãi 23 IS O Credit Rating Thẻ tín dụng 24 IS O Contract Code Mã hợp đồng 25 DT O Contract Effective Date Hợp đồng hiệu lực ngày 26 NM O Contract Amount Số tiền hợp đồng 27 NM O Contract Period Thời gian hợp đồng 28 IS O Interest Code Mã quan tâm 29 IS O Transfer to Bad Debt Code
Mã chuyển sang nợ xấu
30 DT O Transfer to Bad Debt Date
Ngày chuyển sang nợ xấu
31 IS O Bad Debt
Agency
SEQ DT OPT ELEMENT NAME Ý nghĩa sử dụng Code 32 NM O Bad Debt Transfer Amount
Số tiền chuyển sang nợ xấu
33 NM O Bad Debt
Recovery Amount
Số tiền có thể đòi lại từ bên bảo lãnh
34 IS O Delete
Account Indicator
Chỉ số xóa tài khoản
35 DT O Delete
Account Date
Ngày xóa tài khoản
36 IS O Discharge Disposition Sắp xếp bệnh nhân khi kết thúc khám 37 CM O Discharged to Location Nơi bệnh nhân kết thúc khám
38 IS O Diet Type Loại chế độ ăn kiêng 39 IS O Servicing
Facility
Bệnh nhân sử dụng dịch vụ gì
40 IS B Bed Status Trạng thái giường của bệnh nhân
41 IS O Account
Status
Trạng thái tài khoản của bệnh nhân
42 PL O Pending
Location
Nơi bệnh nhân gửi
SEQ DT OPT ELEMENT NAME Ý nghĩa sử dụng Temporary Location 44 TS O Admit Date/Time
Thời gian vào viện
45 TS O Discharge Date/Time
Thời gian ra viện
Thông điệp để trả lời là loại ACK với các segment MSA và ERR được sử dụng như sau.
Bảng 3.5: Các trường thông tin MSA
SEQ DT OPT ELEMENT NAME Ý nghĩa sử dụng
1 ID R Acknowledgment Code Mã trả lời
2 ST R Message Control ID Mã kiểm soát thông điệp
3 ST O Text Message Thông báo đính kèm
4 NM O Expected Sequence
Number
Số trao đổi tiếp theo
5 ID B Delayed Acknowledgment Type
Kiểu phản hồi trễ
6 CE O Error Condition Tình trạng lỗi
Bảng 3.6: Các trường thông tin ERR SEQ DT OPT ELEMENT
NAME Ý nghĩa sử dụng
1 ELD O Error Code and
Location
Vị trí lỗi và mã lỗi của một Segment trong một Message trao đổi khác
SEQ DT OPT ELEMENT
NAME Ý nghĩa sử dụng
2 ERL O Error
Location
Vị trí lỗi trong một Message trao đổi bị đánh giá là bị lỗi hay có cảnh báo
3 CWE O HL7 Error
Code
Mã lỗi truyền thông do HL7 đưa ra
4 ID O Severity Cấp độ lỗi 5 CWE O Application
Error Code
Mã lỗi ứng dụng (Do người dùng tự định nghĩa)
6 ST O Application
Error Parameter
Các thông số Mã lỗi ứng dụng đi kèm (Do người dùng tự định nghĩa)
7 TX O Diagnostic
Information
Thông tin hỗ trợ đánh giá lỗi
8 TX O User
Message
Thông điệp gửi tới người dùng
3.7.2. Quy trình trao đổi thông tin trong hệ thống HL7 ENGINE
- Trao đổi dữ liệu HSBA dạng CDA
Bệnh viện gửi HL7 Engine
TT HL7 Engine BV MDM MDM ACK1 ACK2 ACK2
Quá trình trao đổi HSBA giữa các ứng dụng trong hệ thống HL7 ENGINE được triển khai bằng cách sử dụng 3 thông điệp HL7 như minh họa trong Hình 3.7.
- MDM là thông điệp dùng để gửi toàn bộ HSBA bao gồm các tệp CDA và các tệp đính kèm theo định dạng MIME. Trường MSH của thông điệp phải được điền thông tin của bệnh viện gửi và bệnh viện nhận HSBA. Thông điệp này được ứng dụng gửi (HL7 ENGINE Bệnh viện) chuyển qua để rồi sau đó chuyển tiếp đến ứng dụng đích.
- ACK1 là thông điệp trả lời của ứng dụng về ứng dụng gửi HSBA để thông báo kết quả phân tích và thực hiện chuyển tiếp MDM đến ứng dụng đích. Các lỗi mà có thể trả về bao gồm các lí do như cấu trúc thông điệp không hợp lệ, bệnh viện đích không tồn tại,…
- ACK2 là thông điệp trả lời của ứng dụng đích trả về cho ứng dụng gửi để thông báo kết quả nhận HSBA. ACK2 được thực hiện chuyển tiếp qua HL7 Engine. Một HSBA chỉ được coi là đã đến đích khi ứng dụng gửi nhận được ACK2 từ ứng dụng đích.
- Trao đổi dữ liệu danh mục
Hình 3.8: Quy trình trao đổi dữ liệu danh mục
Quá trình trao đổi dữ liệu danh mục giữa ứng dụng HL7 ENGINE Bệnh viện và ứng dụng HL7 ENGINE được thực hiện theo 2 pha. Tại pha thứ nhất HL7 ENGINE Bệnh viện thực hiện truy vấn thông tin metadata về tất cả các bộ dữ liệu danh mục dùng chung đang được sử dụng trong thực tế. Căn cứ vào thông tin metadata nhận được ứng dụng HL7 ENGINE Bệnh viện có thể biết được sự thay đổi của các phiên bản được cập nhật mới nhất. Tại pha 2, HL7 ENGINE Bệnh viện thực hiện truy vấn và cập nhật lại dữ liệu của các bộ dữ liệu danh mục được nhận biết là có sự thay đổi sau phân tích ở pha 1. Bảng dưới đây mô tả cấu trúc thông tin của các câu truy vấn và trả lời cho hai giai đoạn.
Bảng 3.7: Cấu trúc thông tin của thông điệp truy vấn và trả lời Pha Query
Name
Table
Name TBR
1 Metadata AllDataset Danh sách các dataset với các thông tin gồm mã danh mục, phiên bản sử dụng, ngày cập nhật cuối cùng,…
2 Dataset <OID code>
Cấu trúc dữ liệu bảng danh mục tương ứng với <OID code>
- Trao đổi báo cáo thống kê và các văn bản
Quy trình trao đổi báo cáo thống kê và các văn bản được thi hành bằng cách
HL7 Engine Bệnh viện HL7 Engine TT
VQQ Metadata
TBR Metadata VQQ Data
sử dụng các thông điệp HL7 kiểu MDM và ACK giống như quy trình gửi nhận HSBA. Các báo cáo thống kê được gửi một chiều từ HL7 ENGINE Bệnh viện lên HL7 ENGINE . Ngược lại các văn bản có thể gửi 2 chiều, đồng thời có thể gửi từ bệnh viện này sang bệnh viện khác thông qua HL7 Engine. Để phân biệt loại dữ liệu được gửi nhận trong thông điệp MDM, kiểu tài liệu trong segment TXA được sử dụng theo như quy định dưới đây.
Bảng 3.8: Các loại tài liệu trao đổi qua hệ thống HL7 ENGINE
STT Loại tài liệu
TXA Document
Type
Dạng tài liệu đính kèm theo
1 Hồ sơ bệnh án CDA CDA/XML và tài liệu kèm theo dạng pdf, image,…
2 Báo cáo thống kê
SDMX- HD
File nén zip chứa toàn bộ cấu trúc SDMX
3 Văn bản điều hành
DOC Các dạng file văn bản thông dụng doc, xls, pdf,…
3.9. Cài đặt Module sinh bản tin HL7
- Sử dụng bộ công cụ HAPI: - Download Bộ công cụ tại địa chỉ http://hl7api.sourceforge.net/
Bước 1: Tải các file từ Website
Bước 2: Giải nén, lưu vào một thư mục
Bước 3: Mở một project mới trong NETBEAN Bước 4: Tạo thư viện cho Project
Bước 5: Khai báo sử dụng các thư viện của HAPI
- Cài đặt: Mã Code Ghi chú package javaapplication6; import ca.uhn.hl7v2.model.v26.message.ADT_A01; import ca.uhn.hl7v2.model.v26.segment.EVN; import ca.uhn.hl7v2.model.v26.segment.MSH; import ca.uhn.hl7v2.model.v26.segment.PID; import ca.uhn.hl7v2.parser.Parser; import ca.uhn.hl7v2.parser.PipeParser; import java.util.Calendar; import java.util.Date; //--- EVN evn = adt.getEVN();
evn.getEventTypeCode().setValue("A0101"); Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); int datetoday = cal.get(Calendar.DATE); int hour = cal.get(Calendar.HOUR); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND);
evn.getRecordedDateTime().setDateMinutePrecision(year, month, datetoday, hour, minute);
evn.getEvn4_EventReasonCode().setValue("U"); evn.getEventOccurred().setDateMinutePrecision(year, month, datetoday, hour, minute);
evn.getEventFacility().getHd1_NamespaceID().setValue(); evn.getEventFacility().getUniversalID().setValue(universalID );
evn.getEventFacility().getUniversalIDType().setValue(univer salIDType);
Populate the PID Segment patient's Data String ID_BN="AA12325";
String MA_BN="BN1234"; PID pid = adt.getPID();
pid.getSetIDPID().setValue(ID_BN); pid.getPatientID().getCx1_IDNumber().setValue(MA_BN); pid.getPatientID().getCx6_AssigningFacility().getHd1_Name spaceID().setValue(Depart); pid.getPatientID().getCx10_AssigningAgencyOrDepartment( ).getCwe2_Text().setValue(hospitalName); pid.getPatientName(0).getFamilyName().getSurname().setV alue(familyName); pid.getPatientName(0).getGivenName().setValue(givenNam e); pid.getDateTimeOfBirth().setValue(dateOfBirth); pid.getAdministrativeSex().setValue(sex); pid.getPatientAddress(0).getStreetAddress().getStreetName ().setValue(homeAddress); pid.getPatientAddress(0).getStateOrProvince().setValue("Th
anh pho Thai nguyen"); pid.getPhoneNumberHome(0).getAreaCityCode().setValue( phone); pid.getPhoneNumberHome(0).getLocalNumber().setValue( mobile); pid.getMaritalStatus().getCwe2_Text().setValue("S"); pid.getPatientAccountNumber().getCx1_IDNumber().setVal ue("218-443-5678"); pid.getBirthPlace().setValue("Bac Thai"); Parser parser = new PipeParser();
String encodedMessage = parser.encode(adt);
System.out.println("Printing ER7 Encoded Message:"); String str = encodedMessage.replace("\r", "\r\n"); System.out.println(str); System.out.println(str); catch (Exception e) { e.printStackTrace(); }
3.9.3. Thuật toán trích rút thông tin từ bản tin HL7 phía người nhận.
Giải thuật được thực hiện qua các bước sau, để trích rút dữ liệu trong bản tin HL7:
Bước 1: Loại bỏ các ký tự phân tách đoạn, ký tự phân tách trường, ký tự ngăn cách thành phần, ký tự lặp, ký tự ngăn tách thành phần con.
Bước 2: Xử lý các gia trị mặc định, theo quy ước đối với thông tin của các trường có dữ liệu không đầy đủ.
Bước 3: Xử lý các giá trị của các thành phần con, thành phần lặp.
Bước 4: Căn cứ vào thự hạng vị trí (Position) của trường dữ liệu trích rút thông tin từ bản tin.
3.10. Giao thức trao đổi thông tin giữa người gửi và người nhận
Giao thức Lower Layer Protocol (LLP) được dùng riêng trong việc gửi và nhận bản tin HL7 giữa máy chủ và một máy trạm. Ưu điểm của phương pháp là giao thực đơn giản, dễ cài đặt và người dũng có thể làm chủ được các thông số kỹ thuật. Bên cạnh đó, hiện nay với sự phát triển vượt bậc của công nghệ Java và mã nguồn mở thì các kỹ sư lập trình có thể dễ dàng tham khảo và sử dụng lại mã nguồn của giao thức này.
Để làm chủ được giao thức, chúng tôi đã nghiên cứu chi tiết các nội dung sau: Khi truyền dữ liệu bản tin HL7, dữ liệu sẽ được đóng gói thành từng block, theo định dạng. Mỗi một block dữ liệu được đóng trong cặp < SB> dddd< EB> < CR>.
Mỗi <SB> được mã hóa bằng 1 byte ứng với mã ASCII <0x0B>
<dddđ>: dữ liệu được mã hóa theo dạng từng byte, ngữ nghĩa từng ký tự ứng với mã ký tự trong bảng mã ASCII.
<EN>: Đánh dấu kết thúc một block, được mã hóa bằng 1 byte ứng với mã ASCII (0x1C)
<CR> 1 byte mã Carriage Return <0x0D>.
Module cài đặt giao thức LLP
package server4his; import java.io.*; import java.net.*; /**
*
* @author Ngo The Hoang */
public class Client { Socket cSk = null; PrintWriter out = null; BufferedReader in = null;
String st1;