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