医院门诊收费系统集成的实现
2014-02-06彭德勇肖飞黄正东宋莉莉
彭德勇,肖飞,黄正东,宋莉莉
广州军区武汉总医院 信息科,湖北 武汉 430070
目前,我院门诊收费系统包括医保、自费等多个收费系统,各系统并行运行,工作时操作人员必须进行系统切换,才能实现不同的收费功能,大大影响了工作效率[1]。各套程序在提取某一数据时的提取方式可能不一样,从而导致提取的数据结果不一致;另外,如果数据提取方式发生变化需对程序进行改造,即各套程序都需要改造。所以,没有一个统一的标准以及代码的复用性低会带来很多问题,且有些问题很难发现,解决起来还很困难,另外对程序的维护也会很困难。针对这些问题,本文提出了基于Web Service的医院门诊多个收费系统集成解决方案。
1 Web Service相关技术简介
Web Service是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;Web Service是一种新的Web应用程序分支,是自包含、自描述的模块化应用,可以发布、定位、Web调用;Web Service是一个应用组件,它逻辑性地为其他应用程序提供数据与服务,各应用程序通过网络协议和规定的一些标准数据格式(Http、XML、Soap)来访问Web Service,通过Web Service内部执行得到所需结果。Web Service可以执行从简单的请求到复杂商务处理的任何功能,一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务[2-5]。
Web Service 是一个创建可互操作的分布式应用程序的新平台,其目标在于实现跨平台的可互操作性,它是完全基于XML、XSD 等独立于平台、独立于软件供应商的标准。Web Service 标准本身是建立在进一步标准,如HTTP和XML 的基础之上的,通过使用这些被广泛接受的技术,Web Service 不依赖于任何专有的系统或厂商,这样就能在任何平台上使用任何语言开发对Web Service的支持,如.NET、Java、Perl等。本文用.NET开发对Web Service的支持,并通过PowerBuider9.0的SOAP协议调用Web Service来实现医院各收费系统的集成。
2 基于Web Service的医院门诊收费系统集成方案
2.1 系统体系结构
将医保收费功能集成到地方收费程序中,收费操作在同一个窗口完成。系统会根据患者的费别进行判断从而进入不同的处理流程。系统体系结构分为四个层次,包括Web Service层、医保功能层、业务处理层和程序调用层;采用三层调用模式,医保功能层调用Web Service层、业务处理层调用医保功能层、程序调用业务处理层。其中业务处理层和医保功能层在程序中进行单独封装。这样一来,系统的集成性高,保证了低耦合性,在程序的移植和二次开发中更加方便快捷,系统体系结构,见图1。
图1 三层调用模式
2.2 关键技术的实现
2.2.1 Web Service的创建
打开Visual Studio,新建一个ASP.NET WEB服务应用程序项目,按默认情况,Web Service 放在Servicel.asmx中,类代码放在Service1.asmx.cs 中。首先,对医保相关动态链接库(DLL)进行引用,调用外部函数。以实现连接医保前置机功能为例,代码如下:
(1)外部函数引用医保接口提供的动态库,声明该动态库提供的函数,供程序调用。
[DllImport("hnbridge.dll")]
private static extern long Initialize(string svrIP, long svrPort,int SndBufSize, int RecvBufSize);
注:在调用DLL前,初始化调用环境变量。整个调用工程只需调用该函数一次即可。
[DllImport("hnbridge.dll")]
private static extern long CreateInstace();
注:创建一个功能调用实例。在进行一个新的功能调用前必须执行该操作,以取得调用的处理句柄。返回的句柄将成为其他功能调用的入口参数。
[DllImport("hnbridge.dll")]
private static extern long SetParam(long pDataHandle, String paramName, String paramValue);
注:提供功能调用的参数组,如功能号以及其他功能的调用参数。
[DllImport("hnbridge.dll")]
private static extern long Run(long pDataHandle);
注:运行调用实例。pDataHandle:功能调用的处理句柄,由接口函数CreateInstace()创建。
[DllImport("hnbridge.dll")]
private static extern long DestroyInstance(long pDataHandle);
注:释放功能函数调用句柄。
[DllImport("hnbridge.dll")]
private static extern long GetSysMessage(long pDataHandle,ref String Message1, uint nMaxMessage);
注:获取详细的系统信息。通过该函数可以获取功能调用的返回信息;如果系统发生异常,则返回最后一次错误的出错信息。
(2) 定义 Web Service方法。
[WebMethod(Description = "连接医保前置机")]
//定义的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;
//调用医保接口函数进行初始化,连接医保前置机
rnt = Initialize(ybip, port, sndBufSize, recvBufSize);
if (rnt <= 0) { return rnt; }//如果初始化失败,函数返回handle = CreateInstace();//创建调用实例
rnt = SetParam(handle, "FN", fn); //设置功能号
rnt = SetParam(handle, "YYBH", yybh);//医院编号
rnt = SetParam(handle, "USERID", userid);//医院HIS登录用户
rnt = SetParam(handle, "PWD", pwd);//医院HIS登录密码
rnt = SetParam(handle, "JBR", jbr);//经办人
rnt = SetParam(handle, "JBRQ", jbrq);//经办日期
rnt = SetParam(handle, "CLIENTTYPE", "HIS");//客户端类型
rnt = SetParam(handle, "COMPUTER", computer);// 医院HIS登录计算机名
rnt = SetParam(handle, "IP", ip);//医院HIS登录计算机IP地址
rnt = SetParam(handle, "MAC", mac);//医院HIS登录计算机MAC地址
rnt = Run(handle); //运行该调用实例,向服务器发送请求并接收响应
if (rnt != 1)//如果实例运行不成功
{
GetSysMessage(handle, ref errMsg, 1024); //取详细信息
DestroyInstance(handle); ///释放调用实例
return rnt;//函数返回
}
//获取返回的单项数据
rnt = GetParam(handle, "FHZ", ref fhz, 1024);//返回值
rnt = GetParam(handle, "MSG", ref msg, 1024);//返回信息
if (fhz != "1")//如果返回值不为’1’
{
errMsg = "连接医保前置机服务器失败!" + msg;//设置返回信息
DestroyInstance(handle);//释放调用实例
return -1;//函数返回
}
rnt = DestroyInstance(handle); ///释放调用实例
if (rnt != 1)//如果释放调用实例失败
{
errMsg = "HNHISBridge释放调用实例操作异常!";//设置返回信息
return rnt;//函数返回
}
return rnt;//函数返回
}
将此WebService发布成IIS方式供门诊收费程序调用。
2.2.2 医保功能层调用Web Service方法
使用PowerBuilder编程工具创建Web Service Proxy Wizard项目,程序在调用Web Service前必须引用一个pbwsclient90.pbd文件。所有医保功能封装在一个用户对象中,如u_ybinterface对象,该对象中连接医保前置机的函数名为uf_connect_yb,此函数调用Web Service接口代码如下:
3 应用效果与结论
我院门诊收费系统集成后,大大减轻了收费员工作量,同时也降低了收费的差错率;解决了集成前数据不一致的问题,使数据的来源更加可靠,程序维护起来更加方便。对新引入的业务系统能够通过这种方式,使用已经开发的Web Services接口实现与医院信息系统(HIS)连接[6-7]。
本文主要介绍Web Service技术体系以及实现我院门诊收费系统集成解决方案,针对我院多个门诊收费系统各自为政的弊端,结合Web Service的特点和要求,构建了一种动态的、可控的、统一的全面集成化框架模式。该集成模式突破了传统的集成方案在应用范围等多方面的限制,提供了松藕合的远程调用方式,完全屏蔽了不同软件平台之间的差异,不需要对现有系统做大的改动就可以实现集成的高可用性和高扩展性,拓展了现有系统之间的互操作能力。此技术对医院信息系统集成提供了一种新的思路。
[1]夏慧,熊俊芬,张帆."军卫1号"工程与武汉地方医疗保险系统的对接[J].医学信息,2003,9(16):497-498.
[2]柴晓路.Web Services技术架构[M].北京:电子工业出版社,2003.
[3]端妮,郭文明,张雪林.基于Web service的远程放射系统集成模型研究[J].南方医科大学学报,2007,27(8):1203-1205.
[4]谭显东,李存斌,樊建平,等.基于Web Services的电力营销管理信息系统框架研究[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]刘芳.分布式医疗信息系统互联技术[J].中国医疗设备,2012,27(5):108-110.
[7]余浩,保鹏飞.HIS系统Web Services接口设计与实现[J].中国医疗设备, 2011,26(4):43-45.