LIS中的HL7如何解析?

  • LIS中的HL7如何解析?已关闭评论
  • 11 次浏览
  • A+
所属分类:.NET技术
摘要

HL7(Health Level Severn,健康信息交换第七层协议)组织是一家非盈利性质的国际性组织,主要从事卫生保健环境临床和管理电子数据交换的标准开发。HL7组织参考了国际标准组织ISO(International Standards Organization),采用开放式系统互联OSI (Open System Interconnection)的通信模式,将HL7纳为最高的一层,也就是应用层。
HL7标准可以应用于多种操作系统和硬件环境,也可以进行多应用系统间的文件和数据交换。它是医疗领域不同应用系统之间电子数据传输的协议,主要目的是要发展各型医疗信息系统间,如临床、检验、保险、管理及行政等各项电子资料交换的标准;主要应用在医疗保健领域,特别是在住院患者急需的医护设施领域内(如医院)进行及时的电子数据交换。
HL7标准实现的功能:
◆ 信息交换(Message interchange)
◆ 软件组织(Software components)
◆ 文档与记录架构(Document and record architecture)
◆ 医学逻辑(Medical Logic)

HL7(Health Level Severn,健康信息交换第七层协议)组织是一家非盈利性质的国际性组织,主要从事卫生保健环境临床和管理电子数据交换的标准开发。HL7组织参考了国际标准组织ISO(International Standards Organization),采用开放式系统互联OSI (Open System Interconnection)的通信模式,将HL7纳为最高的一层,也就是应用层。
HL7标准可以应用于多种操作系统和硬件环境,也可以进行多应用系统间的文件和数据交换。它是医疗领域不同应用系统之间电子数据传输的协议,主要目的是要发展各型医疗信息系统间,如临床、检验、保险、管理及行政等各项电子资料交换的标准;主要应用在医疗保健领域,特别是在住院患者急需的医护设施领域内(如医院)进行及时的电子数据交换。
HL7标准实现的功能:
◆ 信息交换(Message interchange)
◆ 软件组织(Software components)
◆ 文档与记录架构(Document and record architecture)
◆ 医学逻辑(Medical Logic)

C# 代码解析如下。

首先构造类如下:

private string hl7_msg_str; /// <summary> /// hl7的消息字符串 /// </summary> public string Hl7_msg_str {     get { return hl7_msg_str; }     set { setHl7_msg_str(value); } }  private void setHl7_msg_str(string str) {     hl7_msg_str = str;     hl7_protocol_msg = new HL7Lib.Base.Message(str); }

解析类:

  public override object decoder(object data)   {       string rlt = (string)data;        HL7_DD_Info hl7_dd_info = new HL7_DD_Info();       hl7_dd_info.Hl7_msg_str = rlt;        string HL7_msg_name = "";       List<ResultInfo> list = decoderData(out HL7_msg_name, hl7_dd_info, GlobalParams.devConfig.Devcode);        hl7_dd_info.List_result = list;       hl7_dd_info.HL7_msg_name = HL7_msg_name;        return hl7_dd_info;   }

decoderData方法定义不是永恒不变的,这里面需要你自己修改的,但大概如下:
 private List<ResultInfo> decoderData(out string hl7MesName, HL7_DD_Info hl7_dd_info, string devcode)  {      lock (this)      {          hl7MesName = "";          List<ResultInfo> list = new List<ResultInfo>();           try          {              List<Segment> segmentList = hl7_dd_info.Hl7_protocol_msg.Segments;              //string barcode = "000000000000";              string barcode = string.Empty;              string app_id = "0";              string chkdate = "";              string chktime = "";               hl7MesName = hl7_dd_info.getValue(segmentList, "MSH", "Message Control ID", 0);              barcode = hl7_dd_info.getValue(segmentList, "OBR", "Placer Order Number", 0);              app_id = hl7_dd_info.getValue(segmentList, "OBR", "Filler Order Number", 0);              app_id = this.updateId(app_id);                string datetime = hl7_dd_info.getValue(segmentList, "OBR", "Observation Date/Time", 0);                     if (!string.IsNullOrEmpty(datetime))                     {                         try                         {                             DateTime date = DateTime.ParseExact(datetime, "yyyyMMddHHmmss", null);                             chkdate = date.ToString(Constant.DATE_FORMAT_SHORT);                             chktime = date.ToString("HH:mm:ss");                         }                         catch (Exception e)                         {                             chkdate = DateTime.Now.ToString(Constant.DATE_FORMAT_SHORT);                             LogUtils.writeErrLog("解析日期失败,按当天处理");                         }                     }                    foreach (Segment segment in segmentList)//遍历消息段                    {                        string segmentName = segment.Name.ToUpper();                         switch (segmentName)                        {                            case "OBX":                                #region 消息在OBX时,取得具体检查项目结果                                if (string.IsNullOrEmpty(app_id) || segment.Fields.Count < 6)                                    continue;                                 string tag = segment.Fields[2].Components[0].Value;   //判断是项目 还是 图片编码                                ResultInfo ri = null;                                switch (tag)                                {                                    case "NM":                                        ri = new ResultInfo();                                        ri.DevCode = GlobalParams.devConfig.Devcode;                                        ri.Date = chkdate;                                        ri.Time = chktime;                                        ri.Id = app_id;                                        ri.Channel = segment.Fields[3].Components[0].Value;                                        ri.Val = segment.Fields[5].Components[0].Value; ;                                        ri.BarCode = barcode;                                        list.Add(ri);                                        break;                                    case "ED":                                        string base64str = segment.Fields[5].Components[3].Value.Replace("<CR>", "");                                        byte[] ImgBytes = Base64.GetDecoderBytes(base64str);//将图片的Base64格式转换成二进制格式                                              string ImgPath = Base64.BytesToImg(ImgBytes, chkdate, app_id, segment.Fields[3].Components[0].Value);//通过二进制转换成图片,并返回图片所在路径                                        if (string.IsNullOrEmpty(ImgPath))                                            continue;                                         ri = new ResultInfo();                                        ri.DevCode = GlobalParams.devConfig.Devcode;                                        ri.Date = chkdate;                                        ri.Time = chktime;                                        ri.Id = app_id;                                        ri.BarCode = barcode;                                        ri.Channel = segment.Fields[3].Components[0].Value; // channel                                        ri.Val = ImgPath;                                        ri.IsImage = true;                                        list.Add(ri);                                        break;                                     default:                                         break;                                 }                                 #endregion                                 break;                             default:                                 break;                         }                      }                 }                 catch (Exception e)                 {                 }                 return list;             }         }