吳 兵,王春華
(1.安徽工貿(mào)職業(yè)技術(shù)學(xué)院計(jì)算機(jī)系,安徽淮南 232001;2.山東省成武縣振興中學(xué),山東成武 274200)
?
自定義病歷模板在EMR中的實(shí)現(xiàn)*
吳 兵1,王春華2
(1.安徽工貿(mào)職業(yè)技術(shù)學(xué)院計(jì)算機(jī)系,安徽淮南 232001;2.山東省成武縣振興中學(xué),山東成武 274200)
醫(yī)院管理工作中電子病歷系統(tǒng)(EMR)的使用提高了醫(yī)院信息化工作的水平,但各大小類型不同醫(yī)院對(duì)于EMR中病歷格式規(guī)范不盡相同[1],因此病歷模板的定制增加了EMR開發(fā)工作的難度,提出一種基于用戶自定義病歷模板的應(yīng)用技術(shù),讓用戶在EMR軟件界面中通過拖拽控件、定義標(biāo)注圖形等實(shí)現(xiàn)自己需要的電子病歷模板.該應(yīng)用技術(shù)的實(shí)現(xiàn)提高了EMR系統(tǒng)的通用性.
病歷;EMR;自定義;模板
現(xiàn)階段EMR的病歷模板一般采用XML格式或者Word格式,不論采取何種格式,在EMR開發(fā)工作中,需要調(diào)研用戶醫(yī)院各個(gè)臨床醫(yī)療科室的病歷書寫規(guī)范,盡管國家衛(wèi)生部門對(duì)于病歷書寫有相關(guān)的一些規(guī)范指導(dǎo),但具體到每一家醫(yī)院,由于各個(gè)醫(yī)院大小類型,以及業(yè)務(wù)范圍不同,所使用的病歷樣式內(nèi)容也不盡相同,總是存在一些偏差[2].因此,EMR設(shè)計(jì)開發(fā)人員需要根據(jù)每種類型醫(yī)院的病歷格式,甚至每家不同醫(yī)院分別在軟件開發(fā)階段設(shè)計(jì)不同的模板.這種由軟件開發(fā)人員定制模板的方式不利于EMR軟件的維護(hù),降低了軟件的通用性.
在EMR系統(tǒng)中提供一個(gè)用戶可以隨意拖拽控件、標(biāo)注、圖形的UI界面,該界面分為包含“控件”,“標(biāo)注”,“圖形”等元素的工具箱區(qū)域和類似Word空白頁面的繪制區(qū)域.在繪制區(qū)域中用戶可通過鼠標(biāo)拖拽工具箱中的元素,以及添加相應(yīng)的文字說明,從而完成一份符合本院需求的病歷模板,根據(jù)病歷模板標(biāo)題結(jié)構(gòu)生成對(duì)應(yīng)的SQL數(shù)據(jù)庫表,病歷內(nèi)容存放在數(shù)據(jù)庫表中,最終EMR可根據(jù)此模板調(diào)取病歷內(nèi)容嵌入打印.以上基于用戶自定義的方式生成病歷模板,提高了EMR軟件的通用性,降低了軟件維護(hù)成本,既是應(yīng)用軟件也是一種工具軟件.
1.1 Net中可視化控件拖拽功能
在應(yīng)用程序中通過對(duì)控件的MouseEnter、MouseMove、MouseDown等來實(shí)現(xiàn)在WinForm窗體上控件的拖拽.其中主要經(jīng)過步驟,首先鼠標(biāo)移動(dòng)至窗體控件上左鍵點(diǎn)擊并按下時(shí)發(fā)生MouseDown事件,此時(shí)由事件參數(shù)MouseEventArgs返回控件所在窗體坐標(biāo)點(diǎn),其次拖拽移動(dòng)時(shí)發(fā)生MouseMove事件,在此事件中獲取控件新坐標(biāo)點(diǎn),最后賦值給控件新坐標(biāo)點(diǎn)[3].
1.2 SQL數(shù)據(jù)庫技術(shù)
微軟的SQL Server 從7.0到目前成熟的2008版本提供了關(guān)于應(yīng)用軟件數(shù)據(jù)管理強(qiáng)大的功能,原則上只要硬件條件允許,可以無限創(chuàng)建數(shù)據(jù)庫表[4].在前端程序語言中結(jié)合SQL結(jié)構(gòu)化查詢語言可以方便的對(duì)關(guān)系型數(shù)據(jù)進(jìn)行增、刪、改、查等操作.從病歷模板到相應(yīng)的數(shù)據(jù)庫表生成,必然要使用SQL結(jié)構(gòu)化查詢語言(CREATE TABLE),如:CREATE TABLE 表名稱(列名稱1 數(shù)據(jù)類型,列名稱2 數(shù)據(jù)類型,列名稱3 數(shù)據(jù)類型…….).
1.3 C#中Word類庫的使用
在程序中創(chuàng)建word文檔可以通過微軟提供的Microsoft Word X Object Library,其中X代表版本號(hào).在C#中Word對(duì)象模型包含五大對(duì)象,其中,Application 代表Microsoft Word應(yīng)用程序本身,Document 代表一個(gè)Word文檔,Selection 代表當(dāng)前選中的區(qū)域,Bookmarks 表示書簽,Range 代表一塊區(qū)域,與Selection類似,不過一般不可見.
每次編寫代碼時(shí),都應(yīng)從Application對(duì)象開始.在Word中處理某個(gè)特定文檔時(shí),這個(gè)文檔就稱為活動(dòng)文檔,并且可通過Application對(duì)象的ActiveDocument屬性引用.如下:
Word.Application wapp = new Microsoft.Office.Interop.Word.Application();wapp.Visible = true;
2 自定義病歷模板功能實(shí)現(xiàn)
2.1 病歷元素集合表
在VS2010開發(fā)環(huán)境中參照紙質(zhì)病歷采集病歷中的標(biāo)題、符號(hào)以及圖形,形成標(biāo)題集、符號(hào)集,對(duì)應(yīng)新建數(shù)據(jù)庫表為標(biāo)題表、符號(hào)表.標(biāo)題集中各標(biāo)題元素采用動(dòng)態(tài)生成Lable標(biāo)簽控件的方式,每個(gè)Lable控件Text屬性為對(duì)應(yīng)的標(biāo)題表中的Title_name字段內(nèi)容.符號(hào)集類似生成,所不同之處在于一些特殊符號(hào)無法在數(shù)據(jù)庫表中存儲(chǔ),因此在表中設(shè)置一字段Char_speci為特殊字符標(biāo)識(shí),如上標(biāo)字符#,則字段Char _name存儲(chǔ)內(nèi)容為“#”,對(duì)應(yīng)字段Char _speci內(nèi)容為“Superscript”代表上標(biāo),Superscript在程序Word對(duì)象當(dāng)中代表元素上標(biāo)屬性,在設(shè)置特殊字符Char _name與Char _speci應(yīng)遵循Word類庫中的語意.為保存標(biāo)題符號(hào)所在窗體的位置,以便在窗體加載時(shí)呈現(xiàn)設(shè)置好的自定義病歷模板樣式需要?jiǎng)?chuàng)建標(biāo)題符號(hào)位置表.主要生成三個(gè)表結(jié)構(gòu)見表1~3:
表1 標(biāo)題表
表2 符號(hào)表
表3 標(biāo)題符號(hào)位置表
2.2 自定義病歷窗體Form
窗體中在合適的位置設(shè)置可供用戶檢索選擇的標(biāo)題和符號(hào)集合,采用.Net提供的TextBox和ListView控件進(jìn)行檢索并展示,在TextBox控件的TextChanged事件中代碼:
private void txtTitle_TextChanged(object sender, EventArgs e)
{
string strSql = "select * from EMR_TitleTable where Title_name like′ %"+txtTitle.Text+ "%′ ";
DataSet dsTitle = SqlBaseClass.Query(strSql);
lvTitle.Items.Clear();
foreach (DataRow dr in dsTitle.Tables[0].Rows)
{
ListViewItem liv = new ListViewItem();
liv.SubItems[0].Text = dr["Title_id"].ToString();//標(biāo)題編碼
liv.SubItems.Add(dr["Title_name"].ToString());//標(biāo)題名稱
liv.SubItems.Add(dr["Title_font"].ToString());//字體
liv.SubItems.Add(dr["Title_size"].ToString());//大小
liv.SubItems.Add(dr["Title_info"].ToString());//標(biāo)題備注
lvTitle.Items.Add(liv);
}
}
標(biāo)題txtTitle控件檢索標(biāo)題元素并展示的效果圖,如圖1所示:
圖1 檢索效果圖
選擇列表中標(biāo)題確定后,則動(dòng)態(tài)生成Lable控件放置在窗體一側(cè),通過鼠標(biāo)左鍵點(diǎn)擊Lable控件進(jìn)行拖拽到合適位置,鼠標(biāo)MouseDown事件中返回的MouseEventArgs參數(shù)值,獲取標(biāo)題或者符號(hào)Lable在窗體中新坐標(biāo)位置,并在程序中設(shè)置變量保存新坐標(biāo)值和標(biāo)題符號(hào)元素在數(shù)據(jù)庫中表主鍵.主要代碼如下:
private Label CurrentSelctLable;//獲取當(dāng)前選中的Label,用于標(biāo)簽的拖拽功能
List
private void LableMouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{ movePoint = e.Location; CurrentSelctLable = (Label)sender; }
}
private void LableMouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{ CurrentSelctLable.Location = new Point(CurrentSelctLable.Location.X + e.X - movePoint.X, CurrentSelctLable.Location.Y + e.Y - movePoint.Y);
}
}
private void LabelClick(object sender, EventArgs e)
{
CurrentSelctLable = (Label)sender;
}
鼠標(biāo)雙擊ListView時(shí),動(dòng)態(tài)生成Label標(biāo)簽并加入List集合中,indexLable為當(dāng)前集合元素索引值.用戶經(jīng)過拖拽標(biāo)題或符合元素后,在窗體上形成類似word頁面效果,如圖2所示:
圖2 窗體頁面word效果
標(biāo)題右側(cè)陰影為內(nèi)容填寫控件,該控件也是動(dòng)態(tài)生成,通過用戶拖拽到合適位置的.
2.3 病歷窗體的保存及Word模板的生成
經(jīng)過用戶拖拽動(dòng)態(tài)生成的控件形成自定義病歷窗體后,需要把這些控件及控件相應(yīng)的窗體位置保存,在下一次打開該窗體或者打開編輯病歷內(nèi)容窗體時(shí)呈現(xiàn)出來.利用控件的Loaction屬性可獲取當(dāng)前標(biāo)題、符號(hào)以及內(nèi)容填寫控件在窗體中坐標(biāo)位置,標(biāo)題符號(hào)控件名稱、內(nèi)容控件名稱以及控件位置坐標(biāo)這三個(gè)重要屬性通過運(yùn)行程序代碼保存至數(shù)據(jù)庫標(biāo)題符號(hào)位置表中.初始化病歷模板窗體時(shí)可遍歷標(biāo)題符號(hào)位置表,獲取標(biāo)題符號(hào)編碼,在相應(yīng)表中的名稱和標(biāo)題字符控件位置字段內(nèi)容(TitleChar _loaction),利用字段TitleChar_type動(dòng)態(tài)生成標(biāo)題符號(hào)以及編輯內(nèi)容控件.
利用微軟提供的Word對(duì)象模型可在應(yīng)用程序編寫上實(shí)現(xiàn)對(duì)word文檔的創(chuàng)建、打開、讀寫等操作.基于醫(yī)院病歷的格式,在word中設(shè)置若干個(gè)表格,采用表格式填寫的方式.窗體上標(biāo)題符號(hào)元素可直接寫入新建word表格中,部分編輯內(nèi)容采用插入書簽的方式在word文檔中進(jìn)行標(biāo)注,word中各個(gè)標(biāo)題之間的距離可參照自定義窗體上各個(gè)標(biāo)題元素之間的距離按照合適的比例大小在word表格中用單元格進(jìn)行控制. 主要代碼如下:
Public void InsertText(string bookmark, string text) //插入一段文字,text為文字內(nèi)容
{
objectoStart =bookmark;
objectrange =wordDoc.Bookmarks.get_Item(refoStart).Range;
Paragraphwp =wordDoc.Content.Paragraphs.Add(refrange);
wp.Format.SpaceBefore= 6;
wp.Range.Text =text;
wp.Format.SpaceAfter =24;
wp.Range.InsertParagraphAfter();
wordDoc.Paragraphs.Last.Range.Text =" n";
}
利用.Net類庫提供的控件拖拽功能與Word二次開發(fā)技術(shù),并結(jié)合數(shù)據(jù)庫表存儲(chǔ)實(shí)現(xiàn)用戶自定義電子病歷模板的功能,一方面提供EMR軟件的通用性,另一方面也減少了軟件工作人員的維護(hù)工作量.比較現(xiàn)階段應(yīng)用較廣泛的EMR,采用用戶自定義的方式定制病歷模板,把病歷模板具體內(nèi)容由醫(yī)療專業(yè)人員完成,解決了以往病歷內(nèi)容一旦有所改動(dòng),那么軟件開發(fā)人員必須從底層修改程序代碼的問題,從而真正實(shí)現(xiàn)EMR軟件適用于不同級(jí)別、不同地區(qū)醫(yī)院.
[1]姚志洪,劉雷.中國醫(yī)療衛(wèi)生信息化進(jìn)展[M].上海交通大學(xué)出版社,2010.
[2]夏洪斌,蔡劍飛,陳金雄等.結(jié)構(gòu)化電子病歷系統(tǒng)應(yīng)用與體會(huì)[J].醫(yī)療衛(wèi)生裝備,2009.30(5):46-47.
[3]Ian Griffiths. Programming C# 5.0[M]. O′Reilly Media, Inc,USA.,2012.
[4]徐人鳳.SQLServer2005數(shù)據(jù)庫及應(yīng)用[M].高等教育出版社,2007.
[5]Christian nagel,jay glynn,MorganSkinner.C#高級(jí)編程(第九版)[M].清華大學(xué)出版社,2014.
Implementation of User-defined Medical Record Template in EMR
WU Bing1, WANG Chun-hua2
(1. Department of Computer Science, Anhui Industry &Trade Vocational Technical College, Huainan Anhui 232001, China;2. Zhenxing Middle School of Chengwu, Chengwu Shandong 274200, China)
The use of electronic medical record system (EMR) in hospital work management improves the level of hospital information work, but EMR format specifications are not the same in different types of hospitals. Therefore, the medical record template customization also increased the difficulty of the development of EMR. This paper presents an application technology based on user defined medical record template, which allows users to use the drag and drop control in the EMR software interface to define the graphics and other electronic medical records. Meanwhile, the application technology improves the generality of the EMR.
medical record;EMR;user-defined;template
1673-2103(2016)05-0063-05
2016-10-01
安徽省高等學(xué)校省級(jí)質(zhì)量工程項(xiàng)目(2015sjjd048)
吳兵(1973-),男,安徽淮南人,講師,碩士,研究方向:企業(yè)ERP.
TP311.5
A