彭德勇,肖飛,黃正東,宋莉莉
廣州軍區(qū)武漢總醫(yī)院 信息科,湖北 武漢 430070
目前,我院門診收費系統(tǒng)包括醫(yī)保、自費等多個收費系統(tǒng),各系統(tǒng)并行運行,工作時操作人員必須進行系統(tǒng)切換,才能實現(xiàn)不同的收費功能,大大影響了工作效率[1]。各套程序在提取某一數(shù)據(jù)時的提取方式可能不一樣,從而導致提取的數(shù)據(jù)結果不一致;另外,如果數(shù)據(jù)提取方式發(fā)生變化需對程序進行改造,即各套程序都需要改造。所以,沒有一個統(tǒng)一的標準以及代碼的復用性低會帶來很多問題,且有些問題很難發(fā)現(xiàn),解決起來還很困難,另外對程序的維護也會很困難。針對這些問題,本文提出了基于Web Service的醫(yī)院門診多個收費系統(tǒng)集成解決方案。
Web Service是一種構建應用程序的普遍模型,可以在任何支持網(wǎng)絡通信的操作系統(tǒng)中實施運行;Web Service是一種新的Web應用程序分支,是自包含、自描述的模塊化應用,可以發(fā)布、定位、Web調用;Web Service是一個應用組件,它邏輯性地為其他應用程序提供數(shù)據(jù)與服務,各應用程序通過網(wǎng)絡協(xié)議和規(guī)定的一些標準數(shù)據(jù)格式(Http、XML、Soap)來訪問Web Service,通過Web Service內部執(zhí)行得到所需結果。Web Service可以執(zhí)行從簡單的請求到復雜商務處理的任何功能,一旦部署以后,其他Web Service應用程序可以發(fā)現(xiàn)并調用它部署的服務[2-5]。
Web Service 是一個創(chuàng)建可互操作的分布式應用程序的新平臺,其目標在于實現(xiàn)跨平臺的可互操作性,它是完全基于XML、XSD 等獨立于平臺、獨立于軟件供應商的標準。Web Service 標準本身是建立在進一步標準,如HTTP和XML 的基礎之上的,通過使用這些被廣泛接受的技術,Web Service 不依賴于任何專有的系統(tǒng)或廠商,這樣就能在任何平臺上使用任何語言開發(fā)對Web Service的支持,如.NET、Java、Perl等。本文用.NET開發(fā)對Web Service的支持,并通過PowerBuider9.0的SOAP協(xié)議調用Web Service來實現(xiàn)醫(yī)院各收費系統(tǒng)的集成。
將醫(yī)保收費功能集成到地方收費程序中,收費操作在同一個窗口完成。系統(tǒng)會根據(jù)患者的費別進行判斷從而進入不同的處理流程。系統(tǒng)體系結構分為四個層次,包括Web Service層、醫(yī)保功能層、業(yè)務處理層和程序調用層;采用三層調用模式,醫(yī)保功能層調用Web Service層、業(yè)務處理層調用醫(yī)保功能層、程序調用業(yè)務處理層。其中業(yè)務處理層和醫(yī)保功能層在程序中進行單獨封裝。這樣一來,系統(tǒng)的集成性高,保證了低耦合性,在程序的移植和二次開發(fā)中更加方便快捷,系統(tǒng)體系結構,見圖1。
圖1 三層調用模式
打開Visual Studio,新建一個ASP.NET WEB服務應用程序項目,按默認情況,Web Service 放在Servicel.asmx中,類代碼放在Service1.asmx.cs 中。首先,對醫(yī)保相關動態(tài)鏈接庫(DLL)進行引用,調用外部函數(shù)。以實現(xiàn)連接醫(yī)保前置機功能為例,代碼如下:
(1)外部函數(shù)引用醫(yī)保接口提供的動態(tài)庫,聲明該動態(tài)庫提供的函數(shù),供程序調用。
[DllImport("hnbridge.dll")]
private static extern long Initialize(string svrIP, long svrPort,int SndBufSize, int RecvBufSize);
注:在調用DLL前,初始化調用環(huán)境變量。整個調用工程只需調用該函數(shù)一次即可。
[DllImport("hnbridge.dll")]
private static extern long CreateInstace();
注:創(chuàng)建一個功能調用實例。在進行一個新的功能調用前必須執(zhí)行該操作,以取得調用的處理句柄。返回的句柄將成為其他功能調用的入口參數(shù)。
[DllImport("hnbridge.dll")]
private static extern long SetParam(long pDataHandle, String paramName, String paramValue);
注:提供功能調用的參數(shù)組,如功能號以及其他功能的調用參數(shù)。
[DllImport("hnbridge.dll")]
private static extern long Run(long pDataHandle);
注:運行調用實例。pDataHandle:功能調用的處理句柄,由接口函數(shù)CreateInstace()創(chuàng)建。
[DllImport("hnbridge.dll")]
private static extern long DestroyInstance(long pDataHandle);
注:釋放功能函數(shù)調用句柄。
[DllImport("hnbridge.dll")]
private static extern long GetSysMessage(long pDataHandle,ref String Message1, uint nMaxMessage);
注:獲取詳細的系統(tǒng)信息。通過該函數(shù)可以獲取功能調用的返回信息;如果系統(tǒng)發(fā)生異常,則返回最后一次錯誤的出錯信息。
(2) 定義 Web Service方法。
[WebMethod(Description = "連接醫(yī)保前置機")]
//定義的Web Service
public long ConnectToYbServer(string fn, string yybh, string userid, string pwd, string jbr, string jbrq, string ClientType, string computer, string ip, string mac, string ybip,long port, ref string errMsg)
{
//聲明變量
long rnt,handle;
int sndBufSize = 16384;
int recvBufSize = 16384;
string fhz=string.Empty, msg=string.Empty;
//調用醫(yī)保接口函數(shù)進行初始化,連接醫(yī)保前置機
rnt = Initialize(ybip, port, sndBufSize, recvBufSize);
if (rnt <= 0) { return rnt; }//如果初始化失敗,函數(shù)返回handle = CreateInstace();//創(chuàng)建調用實例
rnt = SetParam(handle, "FN", fn); //設置功能號
rnt = SetParam(handle, "YYBH", yybh);//醫(yī)院編號
rnt = SetParam(handle, "USERID", userid);//醫(yī)院HIS登錄用戶
rnt = SetParam(handle, "PWD", pwd);//醫(yī)院HIS登錄密碼
rnt = SetParam(handle, "JBR", jbr);//經辦人
rnt = SetParam(handle, "JBRQ", jbrq);//經辦日期
rnt = SetParam(handle, "CLIENTTYPE", "HIS");//客戶端類型
rnt = SetParam(handle, "COMPUTER", computer);// 醫(yī)院HIS登錄計算機名
rnt = SetParam(handle, "IP", ip);//醫(yī)院HIS登錄計算機IP地址
rnt = SetParam(handle, "MAC", mac);//醫(yī)院HIS登錄計算機MAC地址
rnt = Run(handle); //運行該調用實例,向服務器發(fā)送請求并接收響應
if (rnt != 1)//如果實例運行不成功
{
GetSysMessage(handle, ref errMsg, 1024); //取詳細信息
DestroyInstance(handle); ///釋放調用實例
return rnt;//函數(shù)返回
}
//獲取返回的單項數(shù)據(jù)
rnt = GetParam(handle, "FHZ", ref fhz, 1024);//返回值
rnt = GetParam(handle, "MSG", ref msg, 1024);//返回信息
if (fhz != "1")//如果返回值不為’1’
{
errMsg = "連接醫(yī)保前置機服務器失敗!" + msg;//設置返回信息
DestroyInstance(handle);//釋放調用實例
return -1;//函數(shù)返回
}
rnt = DestroyInstance(handle); ///釋放調用實例
if (rnt != 1)//如果釋放調用實例失敗
{
errMsg = "HNHISBridge釋放調用實例操作異常!";//設置返回信息
return rnt;//函數(shù)返回
}
return rnt;//函數(shù)返回
}
將此WebService發(fā)布成IIS方式供門診收費程序調用。
使用PowerBuilder編程工具創(chuàng)建Web Service Proxy Wizard項目,程序在調用Web Service前必須引用一個pbwsclient90.pbd文件。所有醫(yī)保功能封裝在一個用戶對象中,如u_ybinterface對象,該對象中連接醫(yī)保前置機的函數(shù)名為uf_connect_yb,此函數(shù)調用Web Service接口代碼如下:
我院門診收費系統(tǒng)集成后,大大減輕了收費員工作量,同時也降低了收費的差錯率;解決了集成前數(shù)據(jù)不一致的問題,使數(shù)據(jù)的來源更加可靠,程序維護起來更加方便。對新引入的業(yè)務系統(tǒng)能夠通過這種方式,使用已經開發(fā)的Web Services接口實現(xiàn)與醫(yī)院信息系統(tǒng)(HIS)連接[6-7]。
本文主要介紹Web Service技術體系以及實現(xiàn)我院門診收費系統(tǒng)集成解決方案,針對我院多個門診收費系統(tǒng)各自為政的弊端,結合Web Service的特點和要求,構建了一種動態(tài)的、可控的、統(tǒng)一的全面集成化框架模式。該集成模式突破了傳統(tǒng)的集成方案在應用范圍等多方面的限制,提供了松藕合的遠程調用方式,完全屏蔽了不同軟件平臺之間的差異,不需要對現(xiàn)有系統(tǒng)做大的改動就可以實現(xiàn)集成的高可用性和高擴展性,拓展了現(xiàn)有系統(tǒng)之間的互操作能力。此技術對醫(yī)院信息系統(tǒng)集成提供了一種新的思路。
[1]夏慧,熊俊芬,張帆."軍衛(wèi)1號"工程與武漢地方醫(yī)療保險系統(tǒng)的對接[J].醫(yī)學信息,2003,9(16):497-498.
[2]柴曉路.Web Services技術架構[M].北京:電子工業(yè)出版社,2003.
[3]端妮,郭文明,張雪林.基于Web service的遠程放射系統(tǒng)集成模型研究[J].南方醫(yī)科大學學報,2007,27(8):1203-1205.
[4]譚顯東,李存斌,樊建平,等.基于Web Services的電力營銷管理信息系統(tǒng)框架研究[J].計算機工程與設計,2008,(7):1820-1823.
[5]W3C.Web Service Architecture [EB/OL].(2004-02-11)[2014-03-01].http://www.w3c.org/TR/ws-arch.
[6]劉芳.分布式醫(yī)療信息系統(tǒng)互聯(lián)技術[J].中國醫(yī)療設備,2012,27(5):108-110.
[7]余浩,保鵬飛.HIS系統(tǒng)Web Services接口設計與實現(xiàn)[J].中國醫(yī)療設備, 2011,26(4):43-45.