武警医院系统设计说明书_第1页
武警医院系统设计说明书_第2页
武警医院系统设计说明书_第3页
武警医院系统设计说明书_第4页
武警医院系统设计说明书_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 武警医院自助服务终端系统概要详细设计说明书1. 前言31.1. 文档目的31.2. 文档的范围31.3. 读者对象31.4. 参考资料32. 终端管理系统架构42.1. 总体设计42.1.1. 系统前台42.1.2. 系统后台管理系统42.2. 设计流程52.3. 医院就诊卡现金充值交易52.4. 充值机通过his系统接口实现功能62.5. 需求规定72.5.1. 基本要求72.5.2. 功能要求72.5.3. 精度112.5.4. 时间特性112.5.5. 其他专门要求112.6. 运行环境123. 详细设计123.1创办诊疗卡123.2充值业务163.3挂号业务223.3.1功能描述22

2、3.3.2业务逻辑和数据库设计223.4缴费业务393.5 终端管理模块463.6 日志管理模块513.7 充值管理模块593.8 终端设置模块651. 前言武警医院自助服务是集合了终端机、终端管理、中行交易三大板块网络系统。每个系统都包含着管理系统,终端作为与用户的交互界面,对其管理尤为重要。终端管理系统是增值业务系统的辅助管理系统之一,主要包含了终端基本信息的管理、终端日志的管理、终端程序版本的管理、对终端监控管理、对终端报警的管理。终端安全的管理也是一个重要的方面,对终端的认证、维护等在安全系统里有详细的介绍。1.1. 文档目的本文作为终端管理系统的开发基础;可作为终端规范的参考文档,文

3、档为武警医院自助服务终端项目的详细设计。可作为终端管理系统的项目评估参考文档。1.2. 文档的范围武警医院自助服务终端系统详细设计包含了发放诊疗卡、充值、挂号、交费、打印诊疗单(化验单)等;1.3. 读者对象武警医院,承接商,项目评估小组成员,程序员。1.4. 参考资料系统需求说明书2. 终端管理系统架构2.1. 总体设计2.1.1. 系统前台u 创办诊疗卡模块可以通过自助终端为医院创办个人诊卡。填写个人详细信息.u 诊疗卡充值模块 进行充值的功能,包含了两种类型的交易:现金充值,中行充值。u 挂号模块可以在自助终端上挂号也可预约挂号,可以凭诊疗卡在自助终端上领号。u 缴费模块可以凭借诊疗卡在

4、自助终端上查询未交费的项目,如果有未交费的信息,可以在自助终端上缴费。2.1.2. 系统后台管理系统u 终端管理模块u 日志管理模块u 充值管理模块u 终端设置模块2.2. 设计流程2.3. 医院就诊卡现金充值交易自助终端2.4. 充值机通过his系统接口实现功能接口实现自 助终 端充值机读取就诊卡现金充值查询充值记录查询余额 预缴金查询日清单his系统数据库2.5. 需求规定2.5.1. 基本要求u b/s模式。u 通信使用tcp/ip协议。u 页面由freemaker 实现。u 简单管理(增删查改)用minilang实现。u 数据库操作使用hipay实体引擎。u 通讯服务程序使用hipay

5、服务引擎。2.5.2. 功能要求详情请见系统需求说明书,系统需求规格说明书。前台自助服务终端系统:1. 办诊疗卡功能:用户可以通过扫描二代身份证或银行卡的方式在自助终端办理诊疗卡。a. 通过扫描仪读取二代身份证信息获取用户真实的个人资料。b如果扫描失败,用户可以通过窗口办卡系统,办理诊疗卡。c第一次办卡必须给卡里充值,如不充值则办卡失败,充值分为现金充值和联充值。d通过钱箱系统识别现金及其对现金其他操作。e插入银联卡后,通过调用银联系统进行充值处理。f办卡成功从自助终端设备弹出办理好的诊疗卡。具体流程图如下:2.医保卡缴费:使用自助终端医保结算缴费方式。a. 插入诊疗卡后,输入诊疗卡密码。b.

6、 选择查询缴费信息c. 进入缴费信息详情页面查看药品或检查价格与数量。d. 选择要缴费的单据插入医保卡。e. 选择缴费,扣费成功取走缴费单据。充值流程图如下 图 1-2所示: 图 1-2 3. 诊疗卡挂号功能:使用诊疗卡可以在自助终端上自行挂号。a. 插入诊疗卡,系统识别后方可进行挂号业务操作。b. 挂号分为:诊疗卡挂号,中行诊疗卡挂号c. 输入诊疗卡密码,密码错误从新插卡d. 选择科室,选择挂号e. 选择好号后弹出确认挂号信息界面,确认完毕,挂号成功。挂号流程图如下 图 1-3 所示: 4 查询机a:插入诊疗卡,选择查询缴费信息,进入查询缴费信息页面显示过去所有消费充值信息。b:选择药品信息

7、查询,进入药品查询信息后输入药品名称,可具体查询药品详细信息与价格 5 化验单打印a:插入诊疗卡,输入诊疗卡密码,显示分别黑白打印机(化验单打印)彩色打印机(pacs打印)。b:选择打印的化验单,打印化验单,取走化验单。后台终端管理系统:输入处理输出终端号查询终端号、ip地址、联系人、联系电话、终端类型、创建时间终端号查询终端号、状态、ip终端号查询终端、事件、时间用户名查询用户名、密码、真实姓名、用户角色、备注终端要求:100台以上同时缴费功能。终端故障报警:并发交易满足100台。2.5.3. 精度该软件在输入、输出时保留到小数点后两位,在传输过程中保存到小数点后三位。2.5.4. 时间特性

8、1. 页面响应时间:小于1s。2. 更新处理时间:小于1s。3. 数据的转换和处理时间:小于1s。2.5.5. 其他专门要求1.安全性:前台终端设备前后有锁,钱箱有锁。 后台系统在登录后,有管理权限的设定。2.可维护性:可维护。3.易操作性:易操作。4.gui界面:颜色绿色2.6. 运行环境硬件环境:。自助终端为公共自助智能终端。管理终端为pc机。软件环境:操作系统:系统自带。自助终端:嵌入式操作系统。管理终端:win2008。应用系统:应用系统为hipay系统, 数据库系统:oracle或db2或informix。网络环境:adsl网络或其他电信的网络系统。3. 详细设计3.1创办诊疗卡v

9、参数设置函数返回值:boolean true/false参数名称数据类型是否可为空说明idcardstring是身份证号namestring否姓名sexstring否性别birthdaydate否出生日期medicalcardidstring否医疗卡号fillingmoneydouble否充钱(办卡的时候不充钱是不吐卡的)v 部分代码public response createcard(patient patient, medicalcard medicalcard, string terminalno, string flag) response response = new respons

10、e();try timestamp createdate = new timestamp(new date().gettime();string idno = patient.getidno();/身份证号string name = patient.getname();/姓名date birthday = patient.getbirthday();/出生日期simpledateformat sdf = new simpledateformat(yyyy-mm-dd);/格式化出生日期patient.setbirthday(sdf.parse(sdf.format(birthday);pati

11、ent.setoperator(terminalno.trim();/根据卡号判断卡是否存在,若存在,判断状态medicalcard card = baseservice.querymedicalcard(medicalcard.getcardno();if(card != null & card.getstatus() != 2)/若状态不等于注销,该卡不可用,予以回收response.setresult(f);response.seterrorinfo(卡未注销);else /卡存在且状态等于注销,该卡回收利用,更新卡信息,再次发出medicalcard.setcreatedate(cre

12、atedate);medicalcard.setbalance(0);/medicalcard.setpassword(md5util.md5(medicalcard.getpassword();medicalcard.setpassword(md5util.md5(123456);medicalcard.setpat_birthday(sdf.parse(sdf.format(birthday);medicalcard.setpat_idno(idno);medicalcard.setpat_name(name);medicalcard.setpat_sex(patient.getsex()

13、;medicalcard.setstatus(0);medicalcard.settelphone(patient.getphone();medicalcard medcard = baseservice.createcard(patient, medicalcard, flag);simpledateformat sdf1 = new simpledateformat(yyyy-mm-dd hh:mm:ss);medcard.setcreatetime(sdf1.format(medcard.getcreatedate();response.setdata(medcard);response

14、.setresult(s); catch (exception e) loger.error(n);e.printstacktrace();loger.error(=建卡失败=);loger.error(e,e);system.out.println(e.getmessage();response.setresult(f);response.seterrorinfo(建卡失败,请联系工作人员);/response.seterrorinfo(建卡失败,服务器异常,请重试或联系工作人员);/保存异常信息exceptioninfo info = new exceptioninfo();timesta

15、mp exceptiondate = new timestamp(new date().gettime();info.setexceptiondate(exceptiondate);info.setdescription(e.getmessage();info.setcardno(medicalcard.getcardno();info.setterminalno(terminalno);info.setsummary(创建诊疗卡异常);try baseservice.saveexception(info); catch (exception e1) e1.printstacktrace();

16、return response;3.2充值业务v 参数设置功能:充值:fillingmoney();函数调用:现金充值 - usepapermoney();银联充值 - usebankcard();函数返回值:boolean true/false(是否充值成功)参数名称数据类型是否可为空说明medicalcardidstring否医疗卡号bankcardidstring否银行卡号addmoneytypeint否充值类型amountdouble否充值金额v 描述 充值服务包括现金充值和银联充值,用户可以选择其中的任意一种方式来完成充值业务。 用户在进行现金充值操作时,存放现金时必须每次只放一张5

17、0元或100元面值的人民币,可存放多张。 用户在进行银联充值操作时,在选择要充值的金额时,如果终端上得金额显示菜单不能满足用户的需求,用户可以手动输入充值金额进行充值。v 部分代码public response recharge(medicalcard card, string terminalno, string transactiontype, double amount, user user)response response = new response();try selfterminal terminal = baseservice.queryterminalbyno(termin

18、alno);if(terminal != null)simpledateformat sdf = new simpledateformat(yyyy-mm-dd);card.setpat_birthday(sdf.parse(sdf.format(card.getpat_birthday();simpledateformat sdf1 = new simpledateformat(yyyy-mm-dd hh:mm:ss);card.setcreatedate(sdf1.parse(card.getcreatetime();double balance = new bigdecimal(doub

19、le.tostring(card.getbalance() + amount).setscale(2, bigdecimal.round_half_up).doublevalue();card.setbalance(balance);/更新诊疗卡余额timestamp transactiondate = new timestamp(new date().gettime();transactionrecord record = new transactionrecord();record.setamount(amount);record.setcardno(card.getcardno();re

20、cord.setselfterminal(terminal);record.settransactiondate(transactiondate);record.settransactiontype(transactiontype);record.setpatientid(card.getpat_id();record.setuser(user);/插入住院预交金明细记录表prepaymentrcpt rcpt = new prepaymentrcpt();rcpt.setamount(new bigdecimal(double.tostring(amount).setscale(2, big

21、decimal.round_half_up);rcpt.setoperator_no(user.getuserid();rcpt.setpat_id(card.getpat_id();if(转账存款.equals(transactiontype)rcpt.setpay_way(转账存款);else rcpt.setpay_way(现金);rcpt.setrefunded_rcpt_no(null);rcpt.settransact_date(transactiondate);rcpt.settransact_type(交款);rcpt.settransact_class(充值);rcpt.se

22、tterm_window_no(terminal.getwindowno();(诊疗卡: + card.getcardno() + t充值: + amount + 元);baseservice.recharge(card, record, rcpt);response.setresult(s);response.setdata(card);else response.seterrorinfo(该终端信息有误,请联系工作人员核对终端信息);response.setresult(f); catch (exception e) loger.error(n);e.printstac

23、ktrace();loger.error(=充值失败=);loger.error(e,e);system.out.println(e.getmessage();response.setresult(f);response.seterrorinfo(充值失败,请联系工作人员);/response.seterrorinfo(充值失败,服务器异常,请重试或联系工作人员);/保存异常信息exceptioninfo info = new exceptioninfo();timestamp exceptiondate = new timestamp(new date().gettime();info.se

24、texceptiondate(exceptiondate);info.setdescription(e.getmessage();info.setcardno(card.getcardno();info.setterminalno(terminalno);info.setamount(amount);info.setsummary(诊疗卡充值异常);try baseservice.saveexception(info); catch (exception e1) e1.printstacktrace(); return response;3.3挂号业务3.3.1功能描述用户在正确插入医疗卡的前

25、提下,能够查询到医院能够挂号的科室门诊;选择要挂号的科室门诊之后,会自动查询出该科室能够挂号的具体专科信息;选择挂号的专科之后,系统会从数据库的挂号安排表中得出该专科的挂号情况(比如:时间、专家名称、已挂数量等等信息);当用户按照提示一步步操作并且确认进行挂号(其中系统会从用户的医疗卡中扣取挂号费)并且能够挂号成功,会显示出该用户挂号的信息,用户可以打印出挂号的凭条(具体格式待于讨论)。3.3.2业务逻辑和数据库设计(一)后台程序设计,从整体上会按照action-service-dao的多层来架构,这样能分工明确,方便程序的可维护性以及可扩展性,严格遵守web程序设计的mvc原则。以下介绍在本

26、模块中较为重要功能的实现方法或接口。querymaindept()此服务方法会从数据库中检索到科室的信息,并返回前台界面显示。科室比如用:外科门诊、内科门诊等等,在此不一一列举。queryregisterinfo(string dept_code)参数就是用户要选择的科室的代码,比如外科门诊的代码为030115。此方法会从数据库中查询出相应专科信息、医生信息、挂号安排信息。由于数据库这些信息不都是全部在一张表中,所以要进行多表查询的关联。regdept(map regmap)参数是放在一个map类型中,里面大致包含用户选择挂号的科室、挂号类别(普通号或者专家号等)、挂号时间等。这个方法就实现挂

27、号,中间会扣取挂号费。由于此方法的数据库操作接口具体实现是由院方提供oracle数据库的存储过程,所以目前包括参数在内的一些具体细节还需跟院方详细的讨论(二)数据表的设计,本系统是采用双数据库。一个是院方his系统的oracle数据库,此数据库不会修改太多,如需修改也是在本项目组和院方相关技术人员经过详细讨论之后才会由院方技术人员实行his数据库的修改操作,在此就不进行过多的描述;另一个是本系统的专有数据库,是mysql数据库,而针对本功能模块,在mysql中会具体会用到的挂号的科室表registerdepartment。当然此模块中有较多相关的javabean类,但没有具体地映射到数据库中,

28、在此也不多介绍。字段名称数据类型是否为空说明idint否主键dept_codestring否科室代码dept_namestring否科室名称orderint否顺序,为扩展考虑,方法在程序界面中自由排序的显示v 部分代码/* 诊疗卡挂号,更新当前号和已挂号数,向就诊主表插入数据,从诊疗卡扣费,插入交易记录*/public response registrationbycard(clinicforregist clinicforregist, medicalcard card, string terminalno, user user)response response = new respons

29、e();double amount = 0;/交易金额(挂号费用)try selfterminal terminal = baseservice.queryterminalbyno(terminalno);if(terminal != null)string pat_id = card.getpat_id();patsinhospital pih = baseservice.querypatsinhospital(pat_id);boolean flag = false;/病人是否在院的标识if(pih = null)flag = true;/不在院else bigdecimal result

30、 = baseservice.queryinpbilldetail(pat_id);if(pareto(bigdecimal.zero) = 0)flag = true;/不在院且已结算完成else flag = false;/不在院但未结算完成/若病人为住院状态,门诊停用该诊疗卡if(flag)/查询病人所选号信息clinicforregist regist = baseservice.queryclinicforregist(clinicforregist.getclinicdate(), clinicforregist.gettimedesc(), clinicfor

31、regist.getcliniclabel();if(regist != null)/已挂号数integer registrationnum = regist.getregistrationnum();if(registrationnum = null)registrationnum = 0;/当前号integer current_no = regist.getcurrentno();if(current_no = null)current_no = 1;/限号数int registrationlimits = 0;/判断限号数是否为空或等于0,若为空或等于0,则不限号。若小于0,则该号已停诊

32、。if(regist.getregistrationlimits() = null)registrationlimits = 1000000;else if(regist.getregistrationlimits() 0)registrationlimits = regist.getregistrationlimits();else if (regist.getregistrationlimits() = 0) registrationlimits = 1000000;else response.setresult(f);response.seterrorinfo(该号已经停诊);/开始挂号

33、if(registrationnum registrationlimits)if(registrationnum = 0)registrationnum = 1;current_no = 2;/更新当前号else registrationnum += 1;current_no += 1;/更新当前号/更新当天已挂号数regist.setregistrationnum(registrationnum);regist.setcurrentno(current_no);string patientid = card.getpat_id();patient patient = baseservice.

34、querypatient(patientid);/总挂号费(挂号费+诊疗费+其它费)double price = 0;/计算挂号费(clinicprice的查询结果可以为空,具体参照chargetypedict和clinicprice两张表)clinicprice clinicprice = baseservice.queryclinicprice(patient.getchargetype();string clinic_type = regist.getcliniclabel().getclinictype();/号类string charge_type = patient.getchar

35、getype();/费别/计算诊疗费list registprices = baseservice.queryregistprice(clinic_type, charge_type);if(registprices != null & registprices.size() 0)specialregistprice srp = registprices.get(0);if(clinicprice != null)price = srp.getprice() + clinicprice.getprice();else price = srp.getprice();else if(clinicp

36、rice != null)price = clinicprice.getprice();else price = 0;amount = price;/卡内余额double balance = card.getbalance();/更新卡内余额card.setbalance(new bigdecimal(double.tostring(balance - price).setscale(2, bigdecimal.round_half_up).doublevalue();simpledateformat sdf = new simpledateformat(yyyy-mm-dd);card.se

37、tpat_birthday(sdf.parse(sdf.format(card.getpat_birthday();simpledateformat sdf1 = new simpledateformat(yyyy-mm-dd hh:mm:ss);card.setcreatedate(sdf1.parse(card.getcreatetime();/插入交易记录timestamp transactiondate = new timestamp(new date().gettime();transactionrecord record = new transactionrecord();reco

38、rd.setamount(clinicforregist.getregistprice().doublevalue();record.setcardno(card.getcardno();record.settransactiondate(transactiondate);record.settransactiontype(挂号);record.setselfterminal(terminal);record.setpatientid(card.getpat_id();record.setuser(user);/向就诊记录表插入数据clinicmaster clinicmaster = new

39、 clinicmaster();clinicmaster.setvisitdate(regist.getclinicdate();clinicmaster.setcliniclabel(regist.getcliniclabel().getcliniclabel();clinicmaster.setvisittimedesc(regist.gettimedesc();clinicmaster.setserialno(current_no - 1);clinicmaster.setpatientid(patient.getpatientid();clinicmaster.setname(pati

40、ent.getname();clinicmaster.setnamephonetic(patient.getnamephonetic();clinicmaster.setsex(patient.getsex();calendar cal = calendar.getinstance();int yearnow = cal.get(calendar.year);int monthnow = cal.get(calendar.month);int daynow = cal.get(calendar.day_of_month);cal.settime(patient.getbirthday();in

41、t yearbirth = cal.get(calendar.year);int monthbirth = cal.get(calendar.month);int daybirth = cal.get(calendar.day_of_month);int age = yearnow - yearbirth;if(monthnow = monthbirth)if(monthnow = monthbirth)if(daynow 0)clinicmaster.setregistfee(registprices.get(0).getprice();else clinicmaster.setregist

42、fee(0.00);if(clinicprice.getprice() != null & !.equals(clinicprice.getprice()clinicmaster.setclinicfee(clinicprice.getprice();else clinicmaster.setclinicfee(0.00);clinicmaster.setcliniccharge(price);clinicmaster.setpayway(预交金);clinicmaster.setoperator(user.getusername();/插入住院预交金明细记录表prepaymentrcpt r

43、cpt = new prepaymentrcpt();rcpt.setamount(new bigdecimal(double.tostring(price).setscale(2, bigdecimal.round_half_up).negate();rcpt.setoperator_no(user.getuserid();rcpt.setpat_id(card.getpat_id();rcpt.setpay_way(预交金);rcpt.setrefunded_rcpt_no(null);rcpt.settransact_date(transactiondate);rcpt.settrans

44、act_type(结算);rcpt.settransact_class(挂号);rcpt.setterm_window_no(terminal.getwindowno();baseservice.registrationbycard(regist, card, record, clinicmaster, rcpt);cardpkclinicmaster info = new cardpkclinicmaster();info.setmedicalcard(card);if(regist.getcliniclabel().getdoctortitle() != null)clinicmaster

45、.settitlename(regist.getcliniclabel().getdoctortitle().gettitlename();else clinicmaster.settitlename(null);simpledateformat sdf2 = new simpledateformat(hh:mm:ss);string registertime = sdf2.format(new date();/挂号时间,用于病人排队clinicmaster.setregistertime(registertime);info.setclinicmaster(clinicmaster);res

46、ponse.setresult(s);response.setdata(info);else response.setresult(f);response.seterrorinfo(号已经挂完);else response.seterrorinfo(该号暂时停诊,暂无该号信息);response.setresult(f);else response.seterrorinfo(住院期间,该卡暂不能在门诊挂号);response.setresult(f);else response.seterrorinfo(该终端信息有误,请联系工作人员核对终端信息);response.setresult(f);

47、 catch (exception e) loger.error(n);e.printstacktrace();loger.error(=诊疗卡挂号失败=);loger.error(e,e);system.out.println(e.getmessage();response.setresult(f);response.seterrorinfo(诊疗卡挂号失败,请联系工作人员);/response.seterrorinfo(诊疗卡挂号失败,服务器异常,请重试或联系工作人员);/保存异常信息exceptioninfo info = new exceptioninfo();timestamp ex

48、ceptiondate = new timestamp(new date().gettime();info.setexceptiondate(exceptiondate);info.setdescription(e.getmessage();info.setcardno(card.getcardno();info.setterminalno(terminalno);info.setamount(amount);info.setsummary(诊疗卡挂号异常);try baseservice.saveexception(info); catch (exception e1) e1.printst

49、acktrace();return response;3.4缴费业务功能描述:插卡后,系统会识别磁卡所有人是否有尚未缴费的信息存在。如果存在,将会显示近一个月的缴费信息,用户可以直接在终端机上缴费。如果没有,将不会显示信息。v 部分代码/* 自费缴费模块(按每张单子结算,金额为合计金额)*/public response payment(medicalcard card, prescriptioninfo infos, string terminalno, user user)response response = new response();try selfterminal termina

50、l = baseservice.queryterminalbyno(terminalno);if(terminal != null)string pat_id = card.getpat_id();patsinhospital pih = baseservice.querypatsinhospital(pat_id);boolean flag = false;/病人是否在院的标识if(pih = null)flag = true;/不在院else bigdecimal result = baseservice.queryinpbilldetail(pat_id);if(pareto(bigdecimal.zero) = 0)flag = true;/不在院且已结算完成else flag = false;/不在院但未结算完成/若病人为住院状态,门诊停用该诊疗卡if(flag)/获取病人id,查询病人信息medicalcard medicalcard = baseservice.querymedicalcard(card.getcardno();string patientid = medicalcard.getpat_id();patient patient =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论