餐饮管理信息系统分析与设计.docx
《餐饮管理信息系统分析与设计.docx》由会员分享,可在线阅读,更多相关《餐饮管理信息系统分析与设计.docx(29页珍藏版)》请在冰豆网上搜索。
餐饮管理信息系统分析与设计
《餐饮管理信息系统分析与设计》
一、开发背景
近年来,随着信息技术的迅速发展及管理理论的不断突破创新,管理信息系统也得到了飞速的发展,在人们的工作、生活与学习中扮演着越来越重要的角色。
下面主要是以餐饮行业为切入点,重点探讨酒店餐馆信息系统。
随着信息化的发展,信息系统不断提高着餐饮企业的管理效率,但是现有的信息系统只是对传统的点餐模式的“无纸化”办公,没有整合供应链与成本管理的思想。
餐饮企业还处在厨师长的领导下的计划经济模式,整个菜系的管理由单纯的厨师长管辖。
一个好的厨师长的去留关系到一个餐饮企业的命运,传统餐饮企业的扩张模式受到厨房体系的制约(火锅店除外)。
究其原因,是没有对菜品实施标准化处理,没有对菜品生产流程标准化固定下来。
因此,开发一个酒店餐馆信息系统是十分必要的,通过前台的菜品信息展示以及包厢展示,通过购物车的模式形成餐饮企业的电子商务平台,通过后台的库存系统,整合餐饮企业的供应链,提高其在信息化条件下的管理水平,对在现在激烈竞争的餐饮行业中求发展的餐饮企业来说,无疑是一个福音。
我们通过对餐饮企业的菜品和菜料的标准化处理,大大压缩了企业的库存成本,提高餐饮企业的经济效益。
二、系统分析
本文开发的管理信息系统全称为酒店餐馆信息系统,作者主要负责此系统中的菜品信息与订餐管理模块,其中重点是物料分解模块的相关流程分析与开发。
(一)系统概况
1.系统简介
订餐服务是酒店餐饮企业的一项日常工作,完成酒店餐饮企业订餐服务的订餐系统,作为酒店餐饮管理系统的一部分,将为酒店餐饮企业提高服务效率和质量,提高企业经济效益起到重要的作用。
目前,我国餐饮业普遍采用的订餐工作方式是客户通过电话与餐厅联系,由餐厅工作人员通过参议企业内部的餐饮管理系统实施订餐工作。
从一定程度上来讲,这种工作方式仍没有完全脱离手工式工作,工作效率低。
同时,从客户订单需求角度考虑,客户希望在订餐前了解更多的有关信息,如餐厅能提供的菜的品种、各种菜的风味、菜的直观图片等,而这些信息仅仅从餐厅工作人员的电话中是不可能有全面的了解。
这无疑给客户的订餐带来不便,同时也影响了餐厅的工作效率和企业的声誉。
(二)可行性分析
1.经济可行性
对于高校来讲,在各项硬件购置以及软件系统的开发中不必要再追加过多资金,而只需要利用学校现有的资源就可以基本完成系统的开发实施工作。
有实验室硬件环境的支持,有高校专业指导教师的帮助,以及对现实酒店的抽象。
是这一系统的开发有了经济可行性。
现代餐饮企业的不断发展,特别的中小餐饮企业的腾飞,为我们系统的开发提供了庞大的市场依托。
2.技术可行性
对于高校来说,其本身的工作的特殊性使得其对于信息技术的研究和应用一直走在各行业的前面。
现代的数据库技术和网络技术趋于成熟,计算机管理在餐饮企业的管理业务过程中扮演着越来越重要的作用,特别是无线网络的发展,大大节约了管理成本。
WEB开发语言的(如ASP、PHP、JSP等)发展为技术开发提供了参考开发工具。
3.管理可行性
现在酒店管理区域标准化,特别是星级标准的施行。
有利于使系统建立在比较标准的管理体系基础上。
特别是国外餐饮标准化企业(如麦当劳、肯德基等)在餐饮标准化上的探索和成功实施,为我们的开发提供的参考。
(三)业务流程分析
基于菜品信息与订单管理业务流程分析的基础上,本文进行了流程重构,以优化相关业务流程,提高信息系统运行效率。
管理业务流程中,相关单据的传递尽量采用电子化的方式,努力避免使用纸质传递的方式。
这一方面加快了信息传递的速度,另一方面也符合当前倡导的建设节约型社会的要求。
一张单据的产生有其上一流程产生的单据为依据,各种单据相互联系,环环相扣,有助于检验或保证相关单据的真实性,有利于明确各个流程中相关责任人的责任,从而达到强化过程管理的目的。
订单管理业务流程的处理过程是:
顾客通过注册并登陆订餐网站的主页,选择喜欢的菜品放入购物车,在购物车里调整菜品的数量,然后通过点击提交,可以去收银台页面,生成菜品订单,后台生成菜料单。
如图3-3-1所示。
图2-1业务流程图
(四)数据流图
1.第一层(顶层)数据流程
第一层数据流程主要是管理员后台定义菜品和菜料信息。
管理员从仓库领取菜料的信息,包括菜料编号和菜料名称,录入材料表。
从厨房领取菜品的信息,包括菜品的编号、名称、价格、初始数量、图片、简介、所需要菜料的编号和数量。
录入菜品表。
这样在订餐的页面就可以显示菜品的信息,顾客就可以通过浏览订餐系统的网页,查看菜品的相关信息,自主选择所喜欢的菜品和数量,如图3-4-2所示。
通过定义菜品与菜料的关系,就可以在顾客提交菜品订单的同时,将菜品分解为所需要的菜料传递给仓库,仓库就可以进行菜料的配货。
这样的大大节省了菜品分解模块的时间。
在相同的时间段内自动生成菜品订单和领料单。
图2-4-2第一层数据流程图
2.第二层数据流程
第二层数据流程主要在前台页面进行,顾客通过将菜品添加到购物车中,提交购物车里的菜品信息,就可以将这些被选择的菜品信息写入到订单里。
同时将顾客登陆是的用户名以及顾客在订包厢系统里所预定的包厢的信息一同写入到订单里,生成订单的同时把订单号返回给顾客,顾客就可以凭借订单号,到指定的包厢和时间用餐了,如图3-4-3所示。
为了限制过量的订餐,我们在菜品的数量上做了限制,当菜品表里菜料的数量为1的时候,就会在顾客点菜的时候提示顾客。
通过这样的方式,可以让顾客所点的菜品都可以在规定的时间内生产出来。
顾客在提交订单的同时,订单里的菜品所需要的菜料生成的领料单也传递到仓库,通过这种方式,仓库就可以及时为厨房的菜品生产提供菜料了。
图2-4-3第二层数据流程图
3.第三层数据流程
第三层数据流程主要是在顾客提交订单的过程中进行。
通过查询顾客订单中菜品的编号和数量,查看菜品表里每种菜品所需要的菜料的数量,然后乘以订单中菜品的数量,将所得到的菜料的编号和菜料的数量写入到领料表里。
生成出库菜料的信息发送给仓库,这样就可以实现仓库将所需要的菜料发送给厨房,如图3-4-4所示。
图2-4-4第三层数据流程图
(五)数据字典
1.数据项
编号:
I1
名称:
菜品编号
简述:
菜品的识别编号
类型:
字符型
宽度:
4位
编号:
I2
名称:
菜料编号
简述:
识别菜料的编号
类型:
字符型
宽度:
4位
编号:
I3
名称:
订单编号
简述:
订单的识别编号
类型:
字符型
宽度:
10位
2.数据处理
编号:
P1
名称:
订餐
输入:
点菜单
处理:
汇总点菜单
输出:
订单
编号:
P2
名称:
才品分解
输入:
订单
处理:
把菜品分解成菜料
输出:
领料单
编号:
P3
名称:
菜料定义
输入:
菜料单
处理:
汇总菜料单
输出:
菜料清单
编号:
P4
名称:
菜品定义
输入:
菜品信息
处理:
绑定菜品与菜料的关系
输出:
菜品信息和所需要的菜料信息
3.数据流
编号:
D1
名称:
点菜单
简述:
返回前台点菜信息
组成:
编号+名称
来源:
顾客
去向:
订餐处理模块
编号:
D2
名称:
订单
简述:
汇总的点餐表
组成:
编号+菜品+数量
来源:
订餐处理模块
去向:
菜品分解模块
编号:
D3
名称:
领料单
简述:
记录领取菜料的信息
组成:
菜料编号+菜料名称+菜料编号
来源:
菜品分解模块
去向:
仓库
编号:
D4
名称:
菜料单
简述:
管理员录入的菜料单
组成:
菜料编号+菜料名称
来源:
管理员
去向:
菜料处理模块
编号:
D5
名称:
菜品单
简述:
菜品的详细信息
组成:
编号+菜品名称+菜品详情+菜品大图+菜品小图+菜品价格
来源:
管理员
去向:
菜品处理模块
编号:
D6
名称:
菜料清单
简述:
菜料的详细信息
组成:
菜料的编号+菜料的名称+菜料的数量
来源:
菜料处理模块
去向:
菜料表
编号:
D7
名称:
菜品清单
简述:
绑定菜品与菜料的信息
组成:
菜品编号+菜品名称+菜料名称+菜料数量
来源:
菜品处理模块
去向:
菜品表
编号:
D8
名称:
出库单
简述:
领料表里的信息
组成:
菜料编号+菜料名称+菜料数量
来源:
领料表
去向:
仓库
编号:
D9
名称:
订单号
简述:
订单表里生成订单号码
组成:
订单号
来源:
订单表
去向:
顾客
4.数据存储
编号:
F1
名称:
订单表
简述:
储存订单的信息
组成:
编号+订餐人+菜品+价格+订餐时间+包厢号+总价格
关键字:
编号+订餐人
编号:
F2
名称:
领料表
简述:
出库的信息
组成:
编号+出库菜品+出库菜品数量
关键字:
编号
编号:
F3
名称:
菜料表
简述:
配菜需要的菜料
组成:
编号+名称+检索码
关键字:
编号+检索码
编号:
F4
名称:
菜品表
简述:
所有菜品信息
组成:
编号+菜品名称+价格+简介+大图+小图+检索码
关键字:
编号+检索码
5.外部实体
编号:
S1
名称:
顾客
简述:
订餐的发起者
输入的数据流:
点菜单
输出的数据流:
无
编号:
S2
名称:
管理员
简述:
更新菜品和管理订单的部门
输入的数据流:
菜品信息
输出的数据流:
无
编号:
S3
名称:
仓库
简述:
配送菜料的部门
输入的数据流:
无
输出的数据流:
出库单
三、模块分析
系统的主要结构如图3-1-1所示。
图3-1-1系统的主要模块
四、系统设计
1.概念结构设计
概念结构设计的任务是在需求分析阶段产生的需求说明书的基础上,按照特定的方法把它们抽象为一个不依赖于任何具体机器的数据模型,即概念模型。
概念模型使设计者的注意力能够从复杂的实现细节中解脱出来,而只集中在最重要的信息的组织结构和处理模式上。
E-R图由三种符号组成,如图4-2-1所示。
“实体”是现实世界中描述客观事物的概念。
“属性”一般指试题具有的某种特性。
“联系”可以分为两类:
一类是实体没不得联系;另一类是实体之间的联系。
图4-2-1E-R图组成符号
图4-2-2全局E-R图
为了简明图示,属性未在图中标出。
各实体的属性分别为:
顾客:
(临时编号,IP地址)
会员:
(会员编号,会员名称,密码,电话,地址,邮箱)
菜品:
(菜品编号,菜品名称,数量,价格,简介)
菜料:
(菜料编号,菜料名称,检索码,数量)
管理员:
(管理员名称,密码)
2.逻辑结构设计
逻辑结构设计是将概念结构设计阶段完成的概念模型转换成能被选定的数据库管理系统支持的数据结构模型。
数据模型由E-R模型转换而来。
数据库的设计采用一库多表式设计。
即设计了一个数据库。
把每个独立的餐饮企业设计为独立的应用实体。
采用这种设计的好处就是:
符合餐饮企业餐饮供应链环节的处理及时迅速的特点,有利于在餐饮企业内部提高工作效率,降低成本。
表4-2-1Cpb(菜品信息表)
序号
字段名称
字段描述
字段类型
长度
备注
1
Cpid
菜品编号
Varchar
10
非空,主键
2
Cpname
菜品名称
Varchar
50
非空
3
huiyuanjia
会员价
Numeric
10
非空
4
Shichangjia
市场价
Numeric
10
允许空
5
CPsp
菜品小图
Varchar
50
保存路径
6
Kucun
菜品库存
Varchar
10
默认值为100
7
Cplp
菜品大图
Varchar
50
保存路径
8
First
一级分类
Varchar
10
允许空
9
Second
二级分类
Varchar
10
允许空
表4-2-1Ddb(订单表)
序号
字段名称
字段描述
字段类型
长度
备注
1
ID
自动编号
Int
4
主键
2
UserName
用户名
nvarchar
50
非空
3
Tprice
总价
Numeric
10
非空
4
details
特别说明
Varchar
50
允许空
5
Useremail
电子邮件
nvarchar
255
非空
6
room
包厢号
Varchar
10
允许空
表4-2-3Clb(菜料表)
序号
字段名称
字段描述
字段类型
长度
备注
1
ID
自动编号
Int
4
主键
2
Cno
菜料编码
Varchar
10
非空
3
Cname
菜料名称
Varchar
50
非空
4
Amount
数量
Numeric
8
非空
5
Measurement
计量单位
Varchar
10
非空
6
Cpid
关联菜品编号
Varchar
10
非空
表4-2-4Lld(领料表)
序号
字段名称
字段描述
字段类型
长度
备注
1
Lld
领料单编号
Int
4
主键,
2
Cno
菜料编号
Varchar
10
允许空
3
Cname
菜品名称
Varchar
50
允许空
4
Amount
需求数量
Varchar
10
允许空
5
Measurement
计量单位
Varchar
10
默认为g
6
Search
检索码
Varchar
10
菜料首字母
7
Room
包厢号
Varchar
10
可以空
8
Time
订餐时间
Datetime
8
非空
9
number
菜料处理编码
Numeric
9
默认为1
3.物理结构设计
物理结构设计是在逻辑结构设计的基础上进一步设计数据存储模式的一些物理细节。
物流结构设计通常分为两步:
确定数据库的物理结构和评价物理结构。
数据库的存放在非系统盘的高速存储硬盘中。
数据采用顺序存放的放的方式,由一个数据库下设置多个表,这样可以提高检索的速度。
这样的结构符合酒店餐馆信息系统的需求。
五、系统开发
(一)系统主要功能及界面
1.登陆界面
2.订餐页面
图5-1订餐页面
2.预定管理页面
图5-2预定管理页面
3.快餐外卖页面
图5-3快餐外卖页面
4.餐饮快速开单界面
六、主要程序代码
publicfrmMain()
{
InitializeComponent();
ArrayListView.Clear();
ArrayListView.Add(listViewHall);
ArrayListView.Add(listViewGeneral);
ArrayListView.Add(listViewLuxury);
CurrentListView=(ListView)ArrayListView[0];
}
publicvoidGetUpToDate()
{
Used=CanUse=Book=StopUse=Dirty=0;
DataTableEatRoom=Program.DBOpertor.GetAllDataOfEatRoom();
EatRoomLab.Text=tabControl1.SelectedTab.Text;
listViewHall.Clear();
listViewGeneral.Clear();
listViewLuxury.Clear();
inti,count=EatRoom.Rows.Count,EatRoomClass=0;
SumDeskAccount=count;
for(i=0;i{
switch(EatRoom.Rows[i]["餐台状态"].ToString())
{
case"可供":
EatRoomClass=0;
CanUse++;
break;
case"预订":
EatRoomClass=1;
Book++;
break;
case"占用":
EatRoomClass=2;
Used++;
break;
case"停用":
EatRoomClass=3;
StopUse++;
break;
case"脏台":
EatRoomClass=4;
Dirty++;
break;
}
switch(EatRoom.Rows[i]["房间类型"].ToString())
{
case"大厅":
listViewHall.Items.Add("a",EatRoom.Rows[i]["餐台号"].ToString(),EatRoomClass);
break;
case"普通包间":
listViewGeneral.Items.Add("a",EatRoom.Rows[i]["餐台号"].ToString(),EatRoomClass);
break;
case"豪华包间":
listViewLuxury.Items.Add("a",EatRoom.Rows[i]["餐台号"].ToString(),EatRoomClass);
//MessageBox.Show(
break;
}
餐台总数.Text=SumDeskAccount.ToString();
当前占用.Text=Used.ToString();
当前可供.Text=CanUse.ToString();
当前预订.Text=Book.ToString();
当前停用.Text=StopUse.ToString();
上座率.Text=Math.Round(((float)Used/(float)SumDeskAccount)*100,1)+"%";
}
}
privatevoidfrmMain_Load(objectsender,EventArgse)
{
GetUpToDate();
Colorcol=Color.FromArgb(234,244,219);
EatRoomLab.Parent=pictureBox;
EatRoomLab.Location=newPoint(30,7);
最低消费.BackColor=col;
计费标准.BackColor=col;
进店时间.BackColor=col;
已用时间.BackColor=col;
消费金额.BackColor=col;
餐台总数.BackColor=col;
当前占用.BackColor=col;
当前可供.BackColor=col;
当前预订.BackColor=col;
当前停用.BackColor=col;
上座率.BackColor=col;
}
privatevoidfrmMain_FormClosing(objectsender,FormClosingEventArgse)
{
Program.DBOpertor.CloseConnection();
Environment.Exit
(1);
}
privatevoidtabControl1_SelectedIndexChanged(objectsender,EventArgse)
{
CurrentSelect=tabControl1.SelectedIndex;
CurrentListView=(ListView)ArrayListView[CurrentSelect];
EatRoomLab.Text=tabControl1.SelectedTab.Text;
//MessageBox.Show(CurrentSelect.ToString());
}
privatevoid大图标ToolStripMenuItem_Click(objectsender,EventArgse)
{
CurrentListView.View=View.LargeIcon;
}
privatevoid小图标ToolStripMenuItem_Click(objectsender,EventArgse)
{
CurrentListView.View=View.SmallIcon;
}
privatevoid列表ToolStripMenuItem_Click(objectsender,EventArgse)
{
CurrentListView.View=View.List;
}
privatevoid详细信息ToolStripMenuItem_Click(objectsender,EventArgse)
{
CurrentListView.View=View.Details;
}
privatevoidListView_ItemActive(objectsender,EventArgse)
{
ListViewItemp=CurrentListView.SelectedItems[0];
CurrentNo=p.Text;
CurrentStatus=Program.DBOpertor.GetStatus(CurrentNo);
//MessageBox.Show(status);
if(CurrentStatus=="停用"||CurrentStatus=="脏台")
{
MessageBox.Show("非可供状态");
return;
}
if(CurrentStatus=="可供"||CurrentStatus=="预订")
newfrmOpen(CurrentNo,true).Show();
else
newfrmAdd(CurrentNo,true).Show();
}
privatevoidReresh_Click(objectsender,EventArgse)
{
}
privatevoidGetCurrentSum(DataGridViewg)
{
//try
CurrentSum=0;
for(inti=0;iCurrentSum+=Convert.ToSingle(g.Rows[i].Cells["金额"].Value);
//catch(Exceptionex){MessageBox.Show(ex.Message);}
}
privatevoidGetCount(DataGridViewg)
{
CurrentAccount=0;
for(inti=0;iif(!
g.Rows[i].Cells["金额"].Value.ToString().Contains("-"))