资源描述
德州学院 物理系 2011届 电子信息工程专业 毕业设计
酒店管理系统设计
张平
(德州学院物理系,山东德州253023)
摘 要 本论文针对酒店管理系统的简单的功能进行设计,以求达到对酒店的简单管理。共分为三章。第一章主要阐述了该应用系统的设计思路,其中包括系统的功能目标、功能模块的设计图以及应用系统的开发工具;第二章主要讲述数据库设计过程,包括数据库的需求分析、概念结构设计以及逻辑结构设计;第三章是整个论文的主体部分,主要介绍各个主体模块的功能实现以及源程序代码。本论文的设计过程中,应用了图形界面的应用程序开发环境Power Builder 9.0以及SQL Server 7 作为后台数据库支持,通过PB9.0 与数据库的连接完成了对数据库现存数据的操作,从而实现了对整个酒店系统的管理。
关键词 酒店管理系统; 功能模块; 数据库; Power Builder 9.0; SQL; Server 7
绪论
在科技高速发展的今天,一切的商业行为都能跟计算机搭上边。这不仅仅是为了不落后于时代,不被主流所淘汰,更是为了更好的借助于计算机来实现更大的商业利益。随着更多的人接受电子商务,以及年轻一代享受电脑带来的方便、迅速,酒店行业也不例外的加入了电子商务时代的行列。现代化的酒店是集客房、餐饮、通讯、娱乐,商务文化及其他各种服务与设施为一体化的消费场所。酒店在正常的运营中需要对客房资源、顾客信息、结算信息等进行管理,但是酒店组织庞大,服务项目多,信息量大,要想提高效率,降低成本,提高服务质量和管理水平,进而促进经济效益,必须借助计算机来进行现代化的信息管理。酒店管理系统正是为此而设计的。
1 系统的功能框架设计
1.1 功能目标
该酒店管理系统主要有两大功能模块,即:客房部管理和餐饮部管理。
1.1.1 客房管理
该模块主要用来实现客户登记,并打印入住单。根据客人的需求查询房间,进而选定房间,并填写客人信息,完成登记,最后打印入住单。要求实现查询客房状态(占用或空房)、显示客房类型(标准间、单人间、豪华间等)和查看已入住客户信息等功能。
1.1.2 餐饮管理
餐饮管理分菜单、点菜、结帐、报表、菜谱编辑等。
下面列举一些最主要的功能:
菜单:列出常用菜名称、编号、所属类别、定价等内容。
点菜:记录点菜单、定价、台号、就餐人数、就餐人员类别、就餐时间、服务员等。
结帐:记录结算信息。
1.1.3 系统维护
该功能模块为用户提供维护、设置功能。在相应的设置模块中用户可以自行设置系统的数据,设置完成以后该设置立刻会在系统中生效,并在下一次的使用中反映出来。在这里,数据维护非常重要的,它的作用是将系统中用户选择的数据进行初始化,一旦操作完成,系统中原有的数据将会被全部删除,所以需慎重使用。
1.2 功能模块图
酒店管理系统的功能模块如图1-1。
酒店管理系统
餐饮部
客房部
系统维护
统计分析卡
就餐结帐
修改登记
就餐登记
用户设置
退房结帐
预定房间
开房登记
图1-1 酒店管理系统功能模块图
1.3 开发工具选择
1.3.1 前台开发工具的选择
该酒店管理系统前端开发工具为PowerBuilder9.0,PowerBuilder是一个图形界面的应用程序开发环境。在Client/Server结构的应用中,PowerBuilder具有描述多个数据库连接与检索的前端能力。尤其是PowerBuilder能从大多数流行的RDBMS中存取数据,且不管数据存放在什么地方。另外,各种应用程序又可以独立于RDBMS,因为PowerBuilder可以与数据库的标准操纵语言SQL(结构化查询语言)进行通信。
PowerBuilder相对于其他应用程序开发环境来说,可使开发人员的工作更快、成本更低、质量更高、功能更强。PowerBuilder为应用开发提供了全面支持,可以概括为如下五点。
Ø 事件驱动应用程序
Ø PowerScript 语言与函数
Ø 面向对象的编程
Ø 跨平台开发
Ø 与数据库的连接性
1.3.2 数据库OS平台的选择
该酒店管理系统选用sql server7作为后台数据库支持。
2 数据库设计
2.1 数据库需求分析
根据对客房部的功能需求分析,画出系统的数据流图,如图2-1。
开房登记
帐单打印
登记管理
退房结帐
报表统计
登记查询
图2-1 客房部数据流图
通过对酒店客房部管理的内容和数据流程分析,设计的数据项和数据结构如下:
客房信息:包括的数据项有房间号、房间类型、房间状态。
客房登记信息:包含数据项有姓名、性别、职业、工作单位、联系电话、证件名称、 证件号码、住址、国籍、房间号、登记时间、预付金、折扣、备注。
客房结帐信息:包含数据项有房间号、姓名、性别、证件名称、证件号、国籍、退房时间、住宿天数、预付金、住宿费、其他费用、总费用、折扣、收银员、备注。
客房预定信息:包含数据项有房间号、预定人姓名、证件名称、证件号码、押金、联系电话、操作员、备注。
根据对餐饮部的功能需求分析,画出系统的数据流图,如图2-1。
就餐登记
帐单打印
登记管理
就餐结帐
报表统计
就餐查询
图2-2 客房部数据流图
餐桌信息:桌号、状态。
菜单信息:包括的数据项有菜名、所属类别、所属子类、价格、折扣、实收价格、备注。
菜统计:菜名、份数、金额、桌号、就餐时间、是否结帐。
就餐结帐:桌号、就餐人数、就餐时间、结帐时间、服务员名、就餐费、其他费用、总费用、支付方式、收银员、备注。
定餐信息:桌号、定餐人姓名、联系电话、定餐时间、就餐时间、备注。
2.2 数据库概念结构设计
根据上面设计,规划出实体ER图有:客房实体、客户实体、开房登记实体、退房结帐实体。
房间信息
类型
状态
价格
图2-3 客房实体ER图
客户信息
联系方式
个人信息
客户号
姓名
单位信息
图2-4 客户实体ER图
开房登记信息
价格
日期
房间号
图2-5 开房登记实体ER图
退房结帐
结帐日期
费用
房间号
折扣
图2-6 退房结帐实体ER图
菜单信息
菜名
类别
价格
折扣
图2-7 菜单信息实体ER图
就餐结帐
结帐日间
桌号
费用
图2-8 就餐结帐实体ER图
菜统计
桌号
菜名
份数
金额
图2-9 菜统计实体ER图
定餐信息
桌号
就餐时间
定餐人姓名
图2-10 定餐信息实体ER图
2.3 数据库逻辑结构设计
表2-1 客房类型(kf_leixing)
字段名
字段类型
字段长度
可否为空
说明
Kf_leixing
varchar
10
Not null
客房类型(主键)
Kf_jage
Numeric
8.2
Null
客房价格
Kf_mzzongshu
integer
Null
每种客房总数
Kf_beizhu
varchar
100
Null
备注
表2-2 房间信息(kf_xinxi)
字段名
字段类型
字段长度
可否为空
说明
Kf_no
Varchar
6
Not null
房间号(主键)
Kf_leixing
Varchar
10
Null
客房类型(外键)
Kf_kongfou
Varchar
2
Null
是否空闲
表2-3 客房登记信息(kf_dengjixinxi)
字段名
字段类型
字段长度
可否为空
说明
Name
Varchar
10
Not null
登记人姓名
Sex
Varchar
2
Null
登记人性别
Zhiye
Varchar
40
Null
职业
Gzdanwei
Varchar
40
Null
工作单位
Tel
Varchar
12
Null
联系电话
Zhengjianname
Varchar
10
Null
证件名称
Zhengjianhao
Varchar
20
Null
证件号码
Zhuzhi
Varchar
40
Null
住址
Guoji
Varchar
10
Null
国籍
Kf_no
Varchar
6
Null
房间号(外键)
Dengjishijian
Timestamp
Null
登记时间
Yufujin
Numeric
6.2
Null
预付金
zhifufangshi
Varchar
20
Null
支付方式(外键)
zhekou
Numeric
2.1
Null
折扣
beizhu
Varchar
100
Null
备注
表2-4 客房预定(kf_yuding)
字段名
字段类型
字段长度
可否为空
说明
Id
Varchar
10
Not null
Id号
Kf_no
Varchar
3
Null
客房号
Name
Varchar
10
Null
预定人姓名
Zhengjianname
Varchar
20
Null
证件名
Zhengjianhao
Varchar
20
Null
证件号
Yajin
Numeric
9
Null
押金
Lianxitel
Varchar
12
Null
联系电话
Caozuoyuan
Varchar
10
Null
操作员
beizhu
Varchar
512
Null
备注
表2-5 客房结帐(kf_jiezhang)
字段名
字段类型
字段长度
可否为空
说明
Kf_no
Varchar
6
Not null
房间号(主键)
Name
Varchar
10
Not null
姓名
Sex
Varchar
2
Null
性别
Zhengjianname
Varchar
10
Null
证件名称
Zhengjianhao
Varchar
20
Null
证件号
Guoji
Varchar
10
Null
国籍
Tuifangdate
Timestamp
Null
退房时间
Yufujin
Numeric
6.2
Null
预付金
Zhekou
Numeric
2.1
Null
折扣
Zhusutianshu
integer
3
Null
住宿天数
Zhusufei
Numeric
6.2
Null
住宿费
Qitafei
Numeric
6.2
Null
其他费用
Zongfei
Numeric
6.2
Null
总费用
Xujiaofei
Numeric
6.2
Null
续交费用
Shouyinyuan
Varchar
10
Null
收银员
beizhu
Varchar
100
Null
备注
表2-6 菜单信息(caidan1)
字段名
字段类型
字段长度
可否为空
说明
cainame
Varchar
10
Not null
菜名
class
Varchar
20
Null
所属类别
subclass
Varchar
20
Null
所属子类
Jiage
Numeric
11.2
Null
价格
Zhekou
Numeric
4.2
Null
折扣
Shishoujiage
Numeric
11.2
Null
实收价格
beizhu
Varchar
512
Null
备注
表2-7 就餐结帐(jc_jiezhang)
字段名
字段类型
字段长度
可否为空
说明
zhuohao
varchar
5
Not null
桌号
jiucanrenshu
int
2
Null
就餐人数
jiucanshijian
Timestamp
Null
就餐时间
jiezhangshijian
Timestamp
Null
结帐时间
Fuwuyuan_no
Varchar
10
Null
服务员名
jiucanfei
Numeric
9.2
Null
就餐费
Qitafei
Numeric
9.2
Null
其他费用
Zongfeiyong
Numeric
9.2
Null
总费用
zhifufangshi
Varchar
20
Null
支付方式(外键)
Shouyinyuan
Varchar
10
Null
收银员
Beizhu
Varchar
1000
Null
备注
表2-8 定餐信息(dc_xinxi)
字段名
字段类型
字段长度
可否为空
说明
Zhu_no
Varchar
5
Not null
桌号
Name
Varchar
10
Null
定餐人姓名
tel
Varchar
12
Null
联系电话
Dizhi
Varchar
60
Null
地址
Dctime
Timestamp
Null
定餐时间
Jctime
Timestamp
Null
就餐时间
Beizhu
varchar
512
Null
备注
表2-9 餐桌信息(canzhuoinfo)
字段名
字段类型
字段长度
可否为空
说明
Zhuohao
varchar
5
Not null
桌号(主键)
zhuangtai
Varchar
10
Null
状态
表2-10 菜统计(cai_tongji)
字段名
字段类型
字段长度
可否为空
说明
Id
Varchar
10
Not null
(主键)
Caiming
Varchar
30
Null
菜名
Fenshu
Int
Null
份数
Jine
Numeric
9
Null
金额
Zhuohao
Varchar
5
Null
桌号
Jiucantime
Datetime
Null
就餐时间
shifoujiezhang
varchar
4
Null
是否结帐
表2-11 就餐登记
字段名
字段类型
字段长度
可否为空
说明
id
varchar
5
Not null
id号
zhuohao
Varchar
5
Not null
桌号
Jiucanren_name
Varchar
10
Null
姓名
renshu
Varchar
2
Null
人数
jiucantime
datetime
Null
就餐时间
Fuwuyuan
Varchar
10
Null
服务员姓名
3 系统实现
3.1 客房登记模块
该系统模块完成的功能主要为用户登记并打印入住单发票,是客房管理系统的重要模块之一。展现给用户的两个界面,即两个窗口分别为w_kf_dengji和w_kf_dengji_ruzhudan和以上窗口相关连还有三个数据窗口和四个表,分别为dw_kf_all,dw_kf_zhuangtai,dw_kf_rzxx;kf_dengjixinxi,kf_leixing,kf_xinxi,kf_jiezhang。其实现登记功能的界面如图3-1所示。
图3-1 实现登记功能的界面
该界面主要分为两大区域,即客房状态区和用户注册区。在客房状态区的左上角的下拉列表框中显示的是所有可供选择的房间的类别,根据住客需求来选择某类房间时,在下拉菜单选项中“空房间”,即可进行检索。检索结果在左边的下半部(数据窗口dw_1)中显示出来,其中包括房号,类别,价格。具体实现代码如下:
if ddlb_1.text='所有可供' then
ddlb_1.text="所有可供"
dw_1.dataobject="dw_kf_all"
dw_1.settransobject(sqlca)
dw_1.retrieve("空房间")
dw_1.selectrow(0,false)
else
dw_1.dataobject="dw_kf_zhuangtai"
dw_1.settransobject(sqlca)
dw_1.retrieve(ddlb_1.text,"空房间")
dw_1.selectrow(0,false)
end if
在dw_1中双击某一行时,该行相关信息将显示在该窗口的右半部分,即用户注册区。实现代码为:
sle_1.text=dw_1.GetItemstring(dw_1.getrow(),1)
sle_2.text=dw_1.GetItemstring(dw_1.getrow(),2)
sle_3.text=string(dw_1.GetItemnumber(dw_1.getrow(),3))
当成功的完成了用户信息的注册后,即点击cb_1按扭则具有该用户信息的空房间记录将被修改为入住房,则在下一次检索空房间记录时,此房间信息将不被显示。该过程用insert语句将用户的信息插入到表kf_dengjixinxi和kf_jiezhang中。具体实现代码如下:
select count(id) into :num from kf_dengjixinxi;
bb=string(num+1)
insert
into
kf_dengjixinxi
values (:bb,:sle_9.text,:sle_8.text,:sle_6.text,:sle_5.text,:sle_7.text,:ddlb_2.text,:sle_12.text,:sle_15.text,:sle_14.text,:sle_1.text,:dt,:cc,:ddlb_3.text,:dd,:mle_1.text,:sle_16.text,'否');
update kf_xinxi set kf_zhuangtai='入住房' where kf_no=:sle_1.text;
select count(id) into :num1 from kf_jiezhang;
jz_num=string(num1+1)
insert
into
kf_jiezhang (id,kf_no,name,sex,zhengjianname,zhengjianhao,guoji,yufujin,shouyinyuan,beizhu,shifoujiezhang)
values (:jz_num,:sle_1.text,:sle_9.text,:sle_8.text,:ddlb_2.text,:sle_12.text,:sle_14.text,:cc,:sle_16.text,:mle_1.text,'否');
commit;
dw_1.dataobject="dw_kf_all"
dw_1.settransobject(sqlca)
dw_1.retrieve("空房间")
sle_4.setfocus()
sle_13.text=string(datetime(today(),now()))
此窗口中用游标实现数据窗口取数据的代码为:
string ch
int shu,i
DECLARE kf_lx CURSOR FOR
SELECT kf_leixing
FROM kf_leixing;
select count(kf_leixing)
into :shu
from kf_leixing;
open kf_lx;
for i=1 to shu
fetch kf_lx into :ch ;
ddlb_1.additem(ch)
next
close kf_lx;
ddlb_1.text="所有可供"
dw_1.dataobject="dw_kf_all"
dw_1.settransobject(sqlca)
dw_1.retrieve("空房间")
dw_1.selectrow(0,false)
if dw_1.rowcount()<1 then
messagebox("","暂时没有空房间!")
cb_1.enabled=false
else
sle_4.setfocus()
sle_13.text=string(datetime(today(),now()))
end if
当点击cb_2(代码为:open(w_kf_dengji_ruzhudan))时显示的是客房入住单的界面,如图3-2。
图3-2 客房入住单界面
此窗口中实现数据窗口取数据代码为:
dw_1.settransobject(sqlca)
dw_1.retrieve(rzxx_kfno1,'否')
完成的功能为打印发票单据。
3.2 就餐登记模块
客人在就餐前,一定要定下菜,主食和酒水等,即就餐登记,所以该系统包含了就餐登记,也就是开单的功能。该功能所涉及的数据库表为:菜单信息表(candan1)、菜统计表(cai_tongji)。
实现该功能的第一个界面如图3-3。
图3-3 第一个界面
该界面主要分两个区域,左边是桌号图标显示区,右边是桌号图标调整区。
具体操作过程为:选中一个桌号后,点击确定按钮即可显示该餐桌的详细信息,是否可用。
确定的代码如下:
string zhuohao,zhuozt
currentbnum=integer(left(currentitem.label,3))
zhuohao=string(currentbnum)
SELECT canzhuoinfo.zhuangtai
INTO :zhuozt
FROM canzhuoinfo
WHERE canzhuoinfo.zhuohao = :zhuohao;
if zhuozt="结帐" then
UPDATE canzhuoinfo
SET zhuangtai = '开单'
WHERE canzhuoinfo.zhuohao = :zhuohao;
open(w_cy_kaidan)
close(parent)
else
messagebox("抱歉","对不起,此桌已被占用!")
end if
实现该功能的第二个界面如图3-4。
图3-4 第二个界面
该界面主要分两个区域,左边(数据窗口dw_1)显示所有菜的名称、价格、折扣。右边(数据窗口dw_2)显示桌的详细信息,其中包括该桌所点的所有菜的名称、数量、金额以及合计多少钱等。
要添加菜,只需双击左下方的数据窗口中相应的菜即可,或选中该菜,单击添加按钮即可添加。要删除菜,只需在右侧窗口中选中要删除的菜,单击删除按钮即可。
该功能实现的具体思路是:在窗口打开代码中检索出数据窗口dw_1、dw_2的数据,在窗口打开后就将菜谱信息显示出来。添加菜时,首先检索表cai_tongji中是否有要添加的菜的信息,如果有,用update语句将该菜的份数加一,金额增加相应的数目,如果没有则在cai_tongji表中用insert语句插入该菜的信息,包括菜的名称、数量、金额、所属桌号等。然后数据窗口dw_2重新检索数据,即所添加的菜显示在数据窗口dw_2中。
在下拉列表框中使用了游标技术,代码如下:
string ch
int shu,i
DECLARE cai_subclass CURSOR FOR
SELECT subclass
FROM cai_subclass
WHERE cai_subclass.suoshuclass = :this.text;
SELECT count(subclass)
into :shu
FROM cai_subclass
WHERE cai_subclass.suoshuclass = :this.text;
open cai_subclass;
// do while cai_subclass <> -1
ddlb_2.reset()
ddlb_2.additem("全部")
ddlb_2.text="全部"
for i=1 to shu
fetch cai_subclass into :ch ;
ddlb_2.additem(ch)
next
//loop
close cai_subclass;
if this.text="全部" then
dw_1.dataobject="dw_cai_xinxi"
dw_1.settransobject(sqlca)
dw_1.retrieve()
else
dw_1.dataobject="dw_cai_xinxi1"
dw_1.settransobject(sqlca)
dw_1.retrieve(ddlb_1.text)
end if
在此下拉列表框中,用户可以对各种菜,主食,酒水等分类进行选择,然后再在另一个下拉列表框中对它们的子类进行选择。例如:在第一个下拉列表框中选择了“主食”,就可以在第二个下拉列表框中选择“馒头”,或是“米饭”等。选中的菜显示在第一个数据窗口中。
在第一个数据窗口中,有选自表caidan1的caiming,jiage,zhekou等字段。在第二个数据窗口中,有选自表cai_tongji的caiming,jine,Fenshu,zhuohao等字段。第二个数据窗口也可实现合计的功能;用“退出”实现返回。
3.3 就餐登记修改模块
3.3.1 功能实现
考虑客人就餐时,随时都可能加菜、退菜和换菜,所以该系统包含了修改就餐登记的功能。该功能所涉及的数据库表为:餐桌信息表(canzhuoinfo)、菜统计表(cai_tongji)。实现该功能的界面如图3-5。
图3-5 实现餐桌信息表、菜统计表功能的界面
该界面主要分三个区域,左上角显示所有未结帐的桌号(数据窗口dw_3),左边的下半部显示菜谱(数据窗口dw_1),右侧显示要修改信息的桌的详细信息(数据窗口dw_2),其中包括该桌所点的所有菜的名称、数量、金额以及合计多少钱等。
具体操作过程为:先在未结帐的桌号中选择要修改信息的桌号,双击该桌号,则该桌的点菜的详细信息就显示在右侧的数据窗口中。要添加菜,只需双击左下方的数据窗口中相应的菜即可,或选中该菜,单击添加按钮即可添加。要删除菜,只需在右侧窗口中选中要删除的菜,单击删除按钮即可。
该功能实现的具体思路是:在窗口打开的代码中检索出数据窗口dw_1、dw_3的数据,在窗口打开后就将未结帐的桌号以及菜谱信息显示出来。窗口打开后,在数据窗口dw_3的双击事件中,将选中桌的菜的详细信息显示在数据窗口dw_2中。其过程为:首先取选中桌的桌号,然后数据窗口dw_2以所取桌号为检索参数进行检索,即将该桌的菜的详细信息显示在数据窗口dw_2中。
添加时,首先检索表cai_tongji中是否有要添加的菜的信息,如果有,用update语句将该菜的份数加一,金额增加相应的数目,如果没有则在cai_tongji表中用insert语句插入该菜的信息,包括菜的名称,数量、金额、所属桌号等。然后数据窗口dw_2重新检索数据,即所添加的菜显示在数据窗口dw_2中。
3.1.2 程序代码
具体实现的代码如下:
zh=dw_3.getitemstring(dw_3.getrow(),1)
cai=dw_1.getitemstring(dw_1.getrow(),1)
SELECT count(cai_tongji.id)
INTO :shu
FROM cai_tongji;
shu1=string(shu+1)
SELECT caidan1.jiage,zhekou
INTO :jg,:zhk
FROM caidan1
WHERE caidan1.cainame = :cai;
SELECT count(cai_tongji.caiming)
INTO :fsh
FROM cai_tongji
WHERE ( cai_tongji.caiming = :cai ) AND
( cai_tongji.zhuohao = :zh ) AND
( cai_tongji.shifoujiezhang = '否' );
SELECT fenshu
INTO :fennum
FROM cai_tongji
WHERE ( cai_tongji.caiming = :cai ) AND
( cai_tongji.zhuohao = :zh ) AND
( cai_tongji.shifoujiezhang = '否' );
je=jg*(fennum+1)*zhk
if fsh>= 1 then
UPDATE cai_tongji
SET jine = :je,fenshu = fenshu+ 1
where ( cai_tongji.caiming = :cai ) AND
( cai_tongji.zhuohao = :zh ) AND
( cai_tongji.shifoujiezhang = '否' );
commit;
else
INSERT INTO cai_tongji
( id,
caiming,
fenshu,
jine,
zhuohao,
jiucantime,
shifoujiezhang)
VALUES ( :shu1,
:cai,
1,
:je,
:zh,
:kaidandt,
'否');
commit;
end if
dw_2.settransobject(sqlca)
dw_2.retrieve(zh,'否')
删除时,首先检索表cai_tongji表中该菜的份数为多少,如果份数大于1,将份数更新为原份数减1,如果份数等于1,则删除该菜的信息。然后数据窗口2重新检索数据,即删除的菜在菜的详细信息中也没有了。具体实现的代码如下:
if dw_2.getrow()>0 then
cai=dw_2.getitemstring(dw_2.getrow(),1)
zh=dw_2.getitemstring(dw_2.getrow(),4)
SELECT fenshu
INTO :fennum
FROM cai_tongji
WHERE ( cai_tongji.caiming = :cai ) AND
( cai_tongji.zhuohao = :zh ) AND
( cai_tongji.shifoujiezhang = '否' );
if fennum>1 then
SELECT caidan1.jiage
INTO :jg
FROM caidan1
WHERE caidan1.cainame =
展开阅读全文