多线程医院排号系统

1.1课题背景
时间等于金钱,这句话是这个飞速发展时代的真实写照,随着科技的不断发展,人们越来越要求办事的效率,讨厌把宝贵的时间花在一些排队的事情上。我国是一个人口众多的国家,各大银行,邮局,医院等营业大厅常常人满为患,排着长队等着办理业务,这种局面常常使人们怨声载道。
随着社会的发展,特别是信息技术的发展,计算机已经在社会的各个方面凸显出来。原始呆板固化的排队等候方式转变为基于计算机管理与控制的舒适、休闲的等候方式。由于原始的排队等候方式存在不方便、不安全等缺点,而基于计算机管理与控制的舒适、休闲的等候方式完全可以解决这些弊端,人们不仅可以自由安排等待时间,而且可以轻松的享受其他服务,这方式不仅提高了业务员的工作效率,也提高了其业务素质。
1.2 设计的目的
排号系统是为解决一些服务业营业大厅排队问题而设计的,它能够有效地提高工作人员的工作效率,也能够使顾客合理的安排等待时间,让顾客感到服务的公平公正。
1.3 设计的基本任务
排号系统在现今的服务行业还是个比较新鲜的名词,利用这种先进的排号系统管理模式将网络技术、通信技术相结合,采用TCP/IP通信连接,使企业的服务机构通过网络与顾客通信,完成对顾客的管理。排号系统实现每个客户端可以迅速建立与服务器端的实时通信连接,并且操作互动的业务。顾客不仅可以进行取号业务,还可以进行一些其它操作,业务员除了进行业务处理还可以对数据库进行一些增删改查等操作。随着网络编程技术研究的不断深入和完善,国内外越来越多的企业己经开始使用排号系统,中国建设银行,上海长海医院等地方已开始使用,并且取得了相当的业绩和成果。
论文首先讨论了医院排号系统的背景、意义、应用现状以及研究与开发现状。本文在对C/S架构、Socket网络编程技术、Java线程编程等相关技术理论做了简单的论述。结合工程项目,具体论述了医院排号系统的需求分析、整体设计以及系统数据库的设计,其中包括业务流程图、系统用例图、功能结构图、数据流程图、以及系统数据库的E-R图的分析和描述。
其次,论文着重讨论了C/S架构的医院排号系统的设计和实现。在论文中详细地论述了医院排号系统的数据库设计与系统实现的各个步骤,并对原型系统作了简要介绍。
最后,论文对主要完成的工作进行了总结,并提出了研究的不足之处以及对今后研究的展望。
关键词:C/S架构;Java多线程;医院排号系统;Socket网络编程

二 需求分析

2.1 系统初步调查
医院是非常需要有一套通过计算机来处理排队的系统,从本质上改善传统排队管理所存在的一些混乱、无序等问题,很好地解决病员在排队中所遇到的各种混乱等现象,以静化医院的工作环境,避免无谓的争执,加快医院的现代化进程。医院排队管理系统就是在此背景下,通过对医院环境特点、排队问题特点、工作流程环节的大量调研开发出的一套计算机排队管理系统,形成有序的就医环境和工作环境,适用于各类医院。
2.2 系统可行性分析
2.2.1 经济可行性
该系统对于医院这种高消费机构,投入使用该系统不仅仅可以节约人力、物力,而且对于医院的排队环境,将使群众反映普遍良好。
2.2.2 操作可行性
目前中国移动、银行等各大重要机构都有应用类似的排号系统,对于我们来说,该系统已经比较熟悉,所以在操作的时候难度问题将会越来越低。
2.2.3 技术可行性
本系统采用Java语言编写,它是一种简单的,面向对象的编程语言,具有多线程,分布式,跨平台等特性。它有自己的安全机制,并且移植性很好。在数据库方面采用了SQL Server 2000,其灵活性,安全性和易用性为数据库编程提供了良好的条件。
而且该数据库广泛应用于各种环境,系统使用和维护的时候很具有通用性。

2.3 系统开发环境概述
2.3.1 硬件环境
本系统采用单机操作方式,基本配置如下;
处理器:Intel(R) Pentium(R) M 786MHz 2.13GHz
硬盘空间:80GB
内存:512MB
显示器:ATI X30
2.3.2 软件环境
采用C/S架构,使用Eclipse运行环境
开发平台:Eclipse+salories10
操作系统:Windows XP
数据库服务器:SQL Server2000
使用技术:Java GUI、JDBC、Socket

2.4 系统需求分析
2.4.1 业务流程分析
在调研过程中,已了解到所涉及的业务流程如图2-1所示:

图2-1 业务流程图
2.4.2 系统体系结构
系统体系结构如图2-2系统体系结构所示:


图2-2 系统体系结构
2.4.3 系统逻辑模型
系统逻辑模型如图2-3所示:

图2-3 系统逻辑模型

2.5 系统需求定义
2.5.1 病人用例图
病人用例图如图2-4病人用例图所示:

图2-4 病人用例图
2.5.2 医院工作人员用例图
医院工作人员用列图如图2-5所示:



图 2-5 医院工作人员用列图

三 总体设计
3.1 系统设计目的与任务
系统设计阶段的主要目的是,将系统分析阶段所提出的、充分反映病人信息需求的系统逻辑方案转换成可以实施的、基于计算机和网络技术的物理方案。这一阶段的主要任务是从信息系统的总体目标出发,根据系统分析阶段对系统的逻辑功能的需要,并考虑到经济、技术和运行环境等方面的条件,确定系统的整体结构和系统各组成部分的技术方案,合理选择计算机和通信的软件、硬件设备,提出系统的实施计划。
3.2 开发设计思想
医院排号系统从界面上看主要实现两个方面的功能:
(1)取号 客户按键反馈给服务器,然后服务器从数据库获得一个号反馈给病人,这就完成了取号的过程,在病人取号的可视化界面上病人可以查询当前取号总人数,也可查询到已处理的人数,在病人想放弃当前的号票时也可以对号票进行删除,病人还可以在可视化界面看到自己的取票信息和需要等待的人数。
(2)叫号 医院工作人员按键反馈给服务器,服务器拿到取号时存储在数据库中的数据,进行业务处理,在这个过程中医院工作人员可以进行对病人人数的查询,还可以对不需要进行处理的票号进行删除,也可已充当管理员的角色对数据库进行删除。医院工作人员还可以查看病人的取票情况,以及票号的业务的处理情况。
医院排号系统的特点:
(1)可操作性
界面简易,使用通用的菜单式风格,使用直观,操作简便。
(2) 容量大
支持联网,不限制取号数量,可满足大型客流场所的使用。
(3)高性能
系统的所有对象都存放到数据库中,表示逻辑与业务逻辑相互分离,保证系统的处理能力。
(4)伸缩性
它能适应不同的应用环境,对于只实现基本功能的服务大厅,如银行系统,可以采用微机控制的医院排号系统,无需单独配置系统电脑,即可实现自动排队叫号的功能。
(5)可靠性
能保证长时间的正常运行,同时系统有比较好的安全机制,提高了安全性能。
3.3 系统总体设计框架
据以上章节所做需求分析对系统进行功能设计,见系统功能模块图如图3-1所示:


图3-1 系统的总体功能模块图


四 详细设计
4.1 系统功能详细设计
该系统功能从服务器端和客户端角度来说可分以下两大模块,具体每一个模块又分为几个小模块:
(1) 服务器端
1)取号功能:打开服务器与终端进行通信。由于把服务器设置到了病人的一端,所以在服务器端进行取号,然后把号存到数据库中。
2)统计功能:数据访问层从数据库中查出所有取票人数和等待人数在服务器端界面显示。
3)删除功能:删除当前取票病人的牌号。
4)查询功能:病人可以从此处了解到所有病人的取票情况及被处理状况。
5)通知功能:从服务器端获得牌号,通过服务器端通知***病人到***工作台办理业务。
(2) 客户端
同一时刻允许多个工作台办理业务。病人通过在服务器端的通知功能知道去哪个工作台办理业务,工作台显示正在为哪个号码的病人办理业务。
1) 登录功能:医院工作人员从此处登录,医院工作人员的姓名,密码是事先录入数据库的。
2) 叫号功能:医院工作人员点击处理按钮触发事件发送信息给服务器,服务器从数据库拿到号票,返回给医院工作人员进行业务处理。
3)统计功能:数据访问层从数据库查询总取票人数和查询未处理人数在业务端显示。
4) 删除功能:医院工作人员可以删除数据库中所有的记录,也可以选择删除某条记录。
5) 查询功能:医院工作人员可以查询所有病人的取票情况及医院工作人员对号票的处理情况,这块主要为了能够及时掌握病人取票信息及医院工作人员处理情况。

4.2 数据库设计
4.2.1数据库需求分析
通过对医院排号系统内容和数据流程分析,设计的数据项和数据结构如下:
(1)病人信息。包括的数据项有病人ID,病人牌号、取号时间、状态标志等。
(2)业务端信息。包括的数据项有业务ID、处理时间、服务台编号、服务的病人票号。
(3)医院工作人员信息。包括的数据项有医院工作人员姓名、医院工作人员密码。
(4)自动出号信息。包括的数据项有ID、服务类型。
有了上面的数据结构、数据项和数据流程,就可以进行下面的数据库设计。
4.2.2数据库概念设计
这一设计阶段是在需求分析的基础上,设计出能够满足病人需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。根据上面的设计规划出的实体有病人信息实体、业务端信息实体、医院工作人员信息实体、自动出号信息实体。业务端信息实体E-R如图4-1所示,各个实体的E-R图及其关系描述如图4-2所示:


图4-1业务端信息实体E-R图


图4-2医院工作人员信息实体E-R图


病人信息实体E-R如图4-3所示,实体之间的关系E-R如图4-4所示:


图4-3 病人信息实体E-R图
图4-4 实体之间关系E-R
4.2.3 数据库逻辑结构设计
在上面的实体以及实体之间关系的基础上,形成各个表格之间的关系。医院排号系统数据库中的各个表的设计结果如下面的几个表格所示,每个表格表示数据库中的一个表。
(1) 病人信息表customer_tbl
表customer_tbl用来保存病人取票信息
字段名 字段类型 中文描述 备注 非空 主键
Id NUMBER 唯一标识 √
nextId NUMBER 病人牌号 Unique √
takeDate Date 取票日期 √
flag NUMBER 处理标记 Unique √
(2) 业务端信息表work_tbl
表work_tbl用来保存业务端信息
字段名 字段类型 中文描述 备注 非空 主键
Id NUMBER 唯一标识 √
processDate Date 处理日期 √
workId NUMBER 服务台编号 √
nextId NUMBER 病人牌号 Unique √

(3) 医院工作人员信息表workmen_tbl
表workmen_tbl用来表示医院工作人员信息
字段名 字段类型 中文描述 备注 非空 主键
Id NUMBER 唯一标识 √
name varchar2(20) 用户名 √
password varchar2(20) 密码

(4) 自动出号信息srt_tbl
表srt_tbl用来产生唯一的号票信息
字段名 字段类型 中文描述 备注 非空 主键
nextId NUMBER(20) 病人牌号 √

4.2.4 系统安全性设计
(1) 数据因素:系统数据库中包含多个表信息,所以在系统与数据库的连接上,直接封装到代码中,由于java的安全机制比较好,所以数据信息在存储和传递过程中不可见。
(2)硬件及物理因素:系统硬件及安全环境安全可靠,包括机房设施、计算机主体、存储系统、数据通信设备设施等方面是安全的。
(3) 存储安全:通过SQL Server 2000的数据库安全设置,连接数据库需要用户名和密码,保证了数据库的安全性[1]。
五 系统的调试

5.1 系统的总体概述
医院排号系统采用java GUI设计的界面,它通过scoket实现点对点的通信,在实现过程中,客户取号的一端设置成了server端,医院工作人员处理一端设置成了client端,所以必须先启动server端,才能启动client端。在整个系统中server端实现了病人的取号功能和一些查询删除功能,client端实现了医院工作人员登录和叫号处理以及一些查询删除功能[2]。
5.2 系统相关技术简介
5.2.1 C/S的简介
传统的应用体系结构模式主要有两种:C/S(Client/Server)结构模式B/S(Browser/ Server)结构模式。
C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是C/S形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向[3]。
C/S体系结构的优点:
(1) 应用服务器运行数据负荷较轻。
最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻[4]。
(2) 数据的储存管理功能较为透明。
在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络[5] 。
5.2.2 Socket的简介
Socket 是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。在java中创建一个Socket,用它建立与其他机器的连接。从Socket得到的结果是一个InputStream以及OutputStream或Reader和Writer,以便将连接作为一个I/O流对象对待。这有两个基于数据流的套接字类:一个是ServerSocket,服务器用它“侦听”进入的连接;另一个是Socket,客户用他初始化一次连接。一旦客户(程序)申请建立一个套接字连接,ServerSocket就会返回(通过accept()方法)一个对应的服务器端套接字,以便进行直接通信。可以利用getInputStream()以及getOutputStream()每个套接字产生对应的InputStream和OutputStream对象。这些数据流必须封装到缓冲区内。在医院排号系统中采用了TCP/IP协议,这样实现了点对点通信等功能[6]。
5.2.3 JAVA多线程技术
(1)多线程[7]
多线程编程技术是Java语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子任务。特别是在网络编程中,你会发现很多功能是可以并发执行的。比如网络传输速度较慢、用户输入速度较慢,你可以用两个独立的线程去完成这两个功能,而不影响正常的显示或其它功能。
多线程是与单线程比较而言的,男科门诊的Windows采用单线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是针对一个函数,只有等这个函数执行完之后,主程序才能接收另外的消息来执行。比如子函数功能是在读一个网络数据,或读一个文件。只有等读完这个数据或文件才能接收下一个消息。在执行这个子函数过程中你什么也不能干。但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题。
(2)线程创建的方法[8]
1)从一个自定义的类中创建一个对象,这个类扩展了Thread类。
2)使用接口。在java中,用于创建线程的接口是Runable。
(3) 多线程在医院排号系统中的应用
为了实现多用户同时在线服务采用了多线程机制,在实际应用中启动一个业务端产生一个线程。业务端分布在不同的机器上,同时进行业务处理。多线程解决了并发执行造成的死锁问题。并实现了多用户同时在线处理[9]。
5.3 系统的执行流程图
服务端系统执行流程如图5-1所示:


图5-1 服务器端系统执行流程

客户端系统执行流程如图5-2所示:


图5-2 客户端系统执行流程
5.4 系统主界面的实现
5.4.1 服务器主界面的实现
用户在取号的时候必须先启动服务器,才能进行取号。服务器端主界面如图 5-3所示:

图5-3 服务器端主界面
服务器端主界面采用菜单式风格,用户可以根据需求进行取号,查询,删除等功能。界面主要采用了Grid Layout,Flow Layout,BorderLayout等布局管理器来对界面进行布局的。
5.4.2 客户端界面的实现
客户端是为医院工作人员设计的以下是客户端登录界面如图5-4所示


图5-4 医院工作人员登录界面

客户端业务处理界面如图5-5所示:


图5-5 业务处理界面
客户端业务处理界面也采用了菜单式风格,采用了布局管理器对界面进行布局管理,其中在显示这一项里采用了JTable设计的设计界面如下图5-6所示:

图5-6 员工处理情况界面
部分实现代码如下:
private Thread t;
private boolean flag;
private QueueData vipData, normData;// vip,norm队列
private DatagramSocket socket;
// 对所有客户端地址进行统一的管理
private Map<String, SocketAddress> map = new HashMap<String, SocketAddress>();
// ---------------------------------------
private SocketAddress address;
private SocketAddress mainAddress;
private ServerLog log = new ServerLog();// 服务器的日志
public QueueServer() {
vipData = new QueueData();
normData = new QueueData();
try {
socket = new DatagramSocket(9000);
log.writeLog("创建服务器成功!");
System.out.println("创建服务器成功!");
} catch (Exception e) {
log.writeLog("创建服务器失败!");
System.out.println("创建服务器失败!");
}
t = new Thread(this);
}
public void run() {
byte[] inArray = new byte[30];
DatagramPacket inPacket = new DatagramPacket(inArray, inArray.length);
while (flag) {
try {
socket.receive(inPacket);
String str = new String(inPacket.getData(), 0, inPacket
.getLength());
/*
* str情况: 主显示屏信息:main 柜台: counter+id+type 取号台:order+id+type
*/
address = inPacket.getSocketAddress();
String subStr[] = str.split(",");
// 统一的地址处理
if (str.equals("main")) {
map.put("main", address);
} else {
map.put(subStr[0] + subStr[1], address);
}
System.out.println(map);

// ***********接收取号器信息的处理*************
if (subStr[0].trim().equals("order")) {
if (subStr[2].trim().equals("vip")) {
vipData.add();
String sendStr = vipData.getLastValue() + ","
+ (vipData.size() - 1) + ",vip";
connectClient(sendStr, subStr[0] + subStr[1]);
if (vipData.size() == 1) {
// 向所有柜台广播
Set<String> keys = map.keySet();
for (String key : keys) {
if (key.indexOf("counter") == 0) {
connectClient("当前是否可以为"
+ vipData.getLastValue()
+ "男科门诊?", key);
}
}
}
}

if (subStr[2].trim().equals("norm")) {
normData.add();
String sendStr = normData.getLastValue() + ","
+ (normData.size() - 1) + ",norm";
connectClient(sendStr, subStr[0] + subStr[1]);

if (normData.size() == 1) {
// 向所有柜台广播
Set<String> keys = map.keySet();
for (String key : keys) {
if (key.indexOf("counter") == 0) {
connectClient("当前是否可以为"
+ normData.getLastValue()
+ "普通顾客办理业务?", key);
}
}
}
}
}

// ***********柜台信息处理****************
else if (subStr[0].equals("counter")) {
if (subStr[2].equals("vip")) {
if (vipData.size() > 0) {
int code = vipData.getFirstValue();
vipData.remove();
String sendStr = code + "";
connectClient(sendStr, subStr[0] + subStr[1]);
connectClient("请" + code + "号妇科病人到" + subStr[1]
+ "门诊室办理就诊!", "main");
} else {
connectClient("", subStr[0] + subStr[1]);
connectClient("欢迎光临", "main");
}
}
if (subStr[2].equals("norm")) {
if (normData.size() > 0) {
int code = normData.getFirstValue();
normData.remove();
String sendStr = code + "";
connectClient(sendStr, subStr[0] + subStr[1]);
connectClient("请" + code + "号病人到" + subStr[1]
+ "门诊室就诊!", "main");
} else {
connectClient("", subStr[0] + subStr[1]);
connectClient("欢迎光临", "main");
}
}
}
} catch (Exception e) {
log.writeLog("服务器处理信息失败!");
}
}
}
public void stop() {
flag = false;
}

public static void main(String[] args) {
System.out.println("ok");
QueueServer qs = new QueueServer();
qs.start();
}

}

5.5 服务器端取号的实现
在整个系统中取号是一个至关重要的环节,也是设计它的目的所在。它的实现与其他模块紧密相连,它在Server端实现的,取号分为两个服务类型:妇科门诊和男科门诊首先在数据库里建立srt_tbl这张表,它用来存储自动生成的客户牌号。它里面设置字段为nextId,nextId是用来标识病人的牌号的,而type则是用来表示病人所要选取的服务类型,妇科门诊和男科门诊。当点击其中的一个业务时它就会产生一个牌号,这个牌号是通过在dao层的一个方法实现的,dao层通过JDBC连接数据库实现数据的持久化。在取完号的同时调用Dao层的saveID()方法把这个信息保存在cuntomer_tbl表中。
(1)妇科门诊取号如图5-7所示:

图5-7 妇科门诊病人取号界面
实现代码如下:
private JFrame frame;
private Container contentPane;
private JLabel mainLbl, icoLbl; // 主信息提示
private JButton vipBtn, normBtn;
private JLabel timeLbl;
private Timer timer = new Timer(700, this);
private DatagramSocket socket;
private int id;
public GetOrderGUI(int id) {
this.id = id;
frame = new JFrame(id + "号取号台");
frame.setBounds(450, 550, 350, 150);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = frame.getContentPane();
initGUI();
timer.start();
try {
socket = new DatagramSocket();
} catch (Exception e) {
// 日志
}
new Receiver();
}

public void initGUI() {
contentPane.setLayout(new BorderLayout());
JPanel p1 = new JPanel(new FlowLayout());
icoLbl = new JLabel();
mainLbl = new JLabel("欢迎光临!");
p1.add(icoLbl);
p1.add(mainLbl);
JPanel p2 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
vipBtn = new JButton("妇科门诊");
normBtn = new JButton("男科门诊");
timeLbl = new JLabel("当前时间:");
p2.add(timeLbl);
p2.add(vipBtn);
p2.add(normBtn);
contentPane.add(p1, BorderLayout.CENTER);
contentPane.add(p2, BorderLayout.SOUTH);
vipBtn.addActionListener(this);
normBtn.addActionListener(this);
}

// 向服务器端发送信息
public void connectServer(String informStr) {
byte[] outArray = informStr.getBytes();
try {
DatagramPacket outPacket = new DatagramPacket(outArray,
outArray.length, new InetSocketAddress("127.0.0.1", 9000));
socket.send(outPacket);
} catch (Exception e) {
}
}
public class Receiver implements Runnable {
public Receiver() {
(new Thread(this)).start();
}
public void run() {
byte[] inArray = new byte[30];
DatagramPacket inPacket = new DatagramPacket(inArray,
inArray.length);
while (true) {
try {
socket.receive(inPacket);
String str = new String(inPacket.getData(), 0, inPacket
.getLength());
String subStr[] = str.split(",");

if (subStr[2].equals("vip"))
mainLbl.setText("您的号码为" + subStr[0] + "妇科门诊," + "当前还有"
+ subStr[1] + "人在排队!");
else if (subStr[2].equals("norm"))
mainLbl.setText("您的号码为" + subStr[0] + "男科门诊," + "当前还有"
+ subStr[1] + "人在排队!");
} catch (Exception e) {
}
}
}
}。
5.6 客户端业务处理的实现
这个模块的实现主要是在不同的医院工作人员登录后选择了服务台以后才开始业务处理,业务处理的实现首先是server端调用socketThread这个多线程类,在这个类的run方法里调用了service层的unProcess(int type)方法从数据库中拿到nextId(牌号),client端从server端的输出流里获得牌号,进行处理。处理的时候会显示提示信息[10]。
因为各个单位所有的服务台是不确定的,所以在这里采用了多线程,可以按需求增加服务台数量。每增加一个服务台就启动一个线程,实现了多病人同时在线服务。由于采用了TCP协议,也实现了点对点通信。在服务台界面设计时,把id=1设为妇科门诊服务台,id>1的设为男科门诊服务台。当取妇科门诊业务的牌号大于2时候,男科门诊服务台优先处理妇科门诊业务,当处理的低于2的时候就处理男科门诊业务,如没有需要处理的男科门诊的业务就停止业务处理。以下是实现界面和实现代码:
业务处理如5-8所示
当妇科门诊人数大于2时


图 5-8 业务处理界面
主要实现代码如下:
1) 如果输入的服务台编号为1,服务台专门处理妇科门诊业务。并且客户端通过流输入把信息传到服务器端获得相应的信息再返回给客户端
if (id == 1)
{
pw.println("妇科门诊" + id);
ICustomerDao dao = (ICustomerDao) BeanFactory
.getPojo("customerDao");
IWorkDao workdao = (IWorkDao) BeanFactory
.getPojo("workDao");
2) 从服务器端读入信息
int num = Integer.parseInt(br.readLine());
if (num > 0) {
3) 把医院工作人员的信息保存到数据库中
Work work = new Work(1, 1, num);
workdao.saveWork(work);
4) 查找未处理的妇科门诊业务人数并且在标签里显示
List<Customer> list = dao.findUprocess(1);
int num1 = list.size();
lbl.setText("正在为妇科门诊业务" + num + "号病人办理业务!" + 有"+ num1 + "人等待")
}
5) id不等于1为男科门诊病人同样通过流输入把信息传递给服务器端获得相应的信息
if (id != 1) {
pw.println("normals" + id);
String temp = br.readLine();
int index = 0;
int num = 0;
6) 判断是否为妇科门诊病人,如果是,在男科门诊服务台进行优先业务处理。
if ((index = temp.indexOf("妇科门诊")) != -1) {
ICustomerDao dao = (ICustomerDao) BeanFactory
.getPojo("customerDao");
IWorkDao workdao = (IWorkDao) BeanFactory
.getPojo("workDao");
num = Integer.parseInt(temp.substring(index + 3));
if (num > 0) {
Work work = new Work(id, 1, num);
workdao.saveWork(work);
7) 查询还有多少妇科门诊号票没有处理
List<Customer> list = dao.findUprocess(1);
int num1 = list.size();
}
8) 判断是否为男科门诊
else if ((index = temp.indexOf("normals")) !=-1) {
ICustomerDao dao = (ICustomerDao)
BeanFactory.getPojo("customerDao");
IWorkDao workdao = (IWorkDao) BeanFactory
.getPojo("workDao");
num = Integer.parseInt(temp.substring(index + 7));
}
5.7客户端等待
主要使用液晶显示屏,在大厅中对排队病人进行叫号显示。原理是医生处受理后,在排队病人中按顺序取出一个

主要实现代码为:
private Vector<Integer> list = new Vector<Integer>();
private int value = 1; //下一个要添加的号码

//添加号码
synchronized public void add() {
list.add(list.size(), value++);
}

//删除号码
synchronized public void remove() {
if(list.size() > 0) list.remove(0);
}
//获得当前最后一个排队号码
synchronized public int getLastValue() {
if (list.size() != 0)
return value-1;
return 0;
}

//获得当前第一个排队号码
synchronized public int getFirstValue() {
if (list.size() != 0)
return list.firstElement();
return 0;
5.8 Dao层的实现
Dao层是整个系统的关键所在,它是实现与数据库交互的桥梁,在这层里,主要是对一些数据的增删改查,它使用了JDBC作为与数据库连接的桥梁,配合一些pojo类来完成与数据库的交互,使业务逻辑层能够调用它来完成业务逻辑。Dao层也是所谓的Dao模式,它采用了接口机制,在这一层只完成与数据库的交互,实现了低耦合[11]。
5.9置模块的实现
在系统里配置模块使用了XML解析技术来完成对XML配置文件的解析。在系统里它的作用是实现其他模块,降低了模块间的耦合度。一些数据库驱动,URL,病人名,密码都写到这个配置文件里,以便在一个数据库出问题的时候更换到另一个,这也方便了不同病人的使用。因为修改封装好的Java代码不容易,所以就采用了XML配置文件来实现低耦合。
在系统里配置模块还使用了资源配置文件,这也是为了一个系统能够在不同的企业运用,只需更改配置文件里的信息就可以。下面是XML文件解析的一些代码:
Properties pro = new Properties();
1、创建DOM解析器
DocumentBuilderFactory factory=
DocumentBuilderFactory.newInstance();
2、创建文档构建器
DocumentBuilder builder=
factory.newDocumentBuilder();
医院排队叫号导诊台取号系统为SQL网络版,排队叫号系统办事营业大厅版主要面向营业厅,办事大厅等各类服务场所(系统可接物理呼叫器和LED窗口屏,可以和评价器结合使用), 为改善办事大厅和管理所存在的一些混乱、无序等弊端而开发的,系统能很好地解决顾客在服务中所遇到的各种排队、拥挤和混乱等现象,为顾客办事及员工操作带来莫大的方便和愉悦,做到人人平等,合理公正,秩序井然。同时也能对客户情况及员工的工作状况做出各种统计,为管理层进一步决策提供依据。本系统有上百家的成功案例,是由一批常年开发叫号系统的工程师历时多年开发而成的一个系统系统成熟稳定。 医院排队叫号导诊台取号系统优 a、整个系统全部可采用软件实现排队叫号,不用布线,充分利用现有的计算机设备就可以实排队叫号管理,节约了投入的硬件成本,,是同类软件性价比最高的软件之一,系统实施简单方便; b、液晶/同步LED屏显示格式可以自定义; c、取号界面也实现了自定义,业务可以随时增加和删除,图片和样式可以随便切换; d、营业员端呼叫软件的设计充分为营业员着想,完全不影响营业员的工作,软件自动隐藏,营业员呼叫时用自定义的热键就可以呼叫,不用打开呼叫软件界面。 e、显示屏软件和取号机系统可以共用一台电脑,相互不影响。节省电脑硬件资源。 f、可以和物理呼叫器一起使用,在没有电脑的窗口可以接物理呼叫器,系统方便灵活配置。 g、语音支持普通话女声、普通话男声、英语女声、粤语女声等多语种。 h、系统可以和评价系统相结合使用,真到达到一个排队号码一次评价。 i、 基本兼容市场上LED屏通讯协议(可以定制)。 医院排队叫号导诊台取号系统主要包括5个子程序 1、 排队系统参数设置程序pdcsset.exe运行它就可以设置排队叫号系统的相关参数; 2、 控制系统加语音系统“proserver.exe”,此子程序主要作用是和安装在营业员端的虚拟叫号程序进行通信,并发出叫号信息的语音。 3、 营业员端虚拟叫号程序,此子程序主要是给营业员用来呼叫客户的,此程序会自动隐藏,有热键功能,安装在营业员端的电脑上,完全不影响的工作,营业员只要按事先定义好的热键就可以呼叫客户过来办理。 4、 液晶显示屏或等离子显示屏/同步LED屏显示程序,此子程序主要是用来显示呼叫客户的排队系统,比如营业员端按下呼叫下一个,则显示屏上就显示“请1001号到201窗口 办理”等信息。 5、 触摸屏取号系统, 此程序是为客户取号用的,软件安装在一个触摸屏机上,也可安装在普通电脑上,设置好办理业务业务后,客户点击相应的办理业务,打印机打出一张排队号票。 医院排队叫号导诊台取号系统 v30.6.9更新日志 更新:取号程序。 医院排队叫号导诊台取号系统截图
一个简单的医院挂号系统本采用ACCESS+ASP开发,系统经过多年应用并且持续不断改进,系统各部功能已基本完善,非常适合大型医疗集团,当然小型医院或科室就更适合了。 (注:如果你觉的功能太多而不想用其他功能,你可以只用挂号登记) 系统功能说明 1.账号权限 (系统可以任设账号,然后给账号赋予权限,比如导医账户,你可以只给他到院与否的设置,其他一概无法操作和查看,咨询账户只允许填写登记而不能修改和删除以确保登记信息不会被随意更改) 2.咨询内容 (可将咨询内容填入患者资料,以方便查询回访) 3.医院(科室)添加 (可无限动态添加科室或医院) 4.回访 (实时回访标注功能,让你对回访记录一目了然) 5.同比数据对比 (让您时时刻刻了解同期数据对比情况,以了解广告投入和同期回报率) 6.数据明细 (竞价广告、电视广告等等全部综合和单独统计到院和预约量实时掌握成本控制) 7.预约人员评比 (实时查看咨询人员到诊数与预约数,以便了解每位咨询人员的咨询质量和能力,更能促进咨询人员的竞争心理) 8.咨询内容记录 (以方便记录每位患者的详细情况,并了解他为何没有到院以便更好的回访) 9、到院跟踪 (运营部、网络部、医院组、导医组、咨询组完美解决医院内部沟通之间的问题) 还有更多更能您可登陆查看
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值