酒店点餐系统3-厨师终端模块设计_第1页
酒店点餐系统3-厨师终端模块设计_第2页
酒店点餐系统3-厨师终端模块设计_第3页
酒店点餐系统3-厨师终端模块设计_第4页
酒店点餐系统3-厨师终端模块设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、2009-2010学年第二学期管理信息系统系统设计报告专 业:计算机科学与技术班 级:071011班题 目:酒店点餐系统成 员:姓名分工邓军成员任务分配、软件设计、软件调试靳鹏界面美化、成果汇报王锐强系统分析、数据库设计王隽捷系统分析、软件测试边金虎数据录入、软件测试赵佳欢数据录入、软件测试厨师终端模块设计1、任务分配32、厨师终端模块73、出勤管理模块94、任务管理模块(CTaskManager)105、通信模块156、资源对话框对照说明151、任务分配本模块重点在任务分配上,从公平的角度,采取“先来先服务”原则更为适合,但是顾客在点菜时可能出现指定了某个厨师做某道菜的情况,所以本系统针对未

2、指定厨师的情况设计了一个非指定队列用于保存未指定做菜厨师的任务信息,同时为每个厨师添加了一个指定队列用于存放指定其要做的任务信息。为了更好的分配任务,本系统将厨师分为三种状态:全空闲、半空闲、忙。全空闲,指没有正在做的任务,其指定队列也为空;半空闲,指没有正在进行的任务,但是其指定队列不为空;忙,指有正在进行的任务。任务分配分两种情况,一是自动分配任务,二是非自动分配任务。自动分配,指每当有做菜任务到达时,先由系统根据现有厨师的状态分配任务,并在终端显示任务分配情况;非自动分配,指厨师在完成某菜品后,在终端输入其厨师编号后显示其下一任务信息。自动分配任务是为了避免在所有厨师都处于全空闲而有新任

3、务到达时,厨师不能知道有任务到达的情况。自动分配任务流程图,如图1:图 1读取任务模块流程图,如图2:图 2非自动任务分配流程图,如图3:图 32、厨师终端模块1)向项目添加Dialog资源,其ID设置为IDD_COOKTERMINAL_DIALOG,修改其属性“Caption”为“厨师终端”。具体设计如图4:图 42)向对话框资源添加1个Static Text、1个Button和1个Edit Box,其属性设置如表1:表 1IDPropertiesMember VariablesTypesMemberIDC_COOKID默认CStringm_CookID3)初始化终端,首先得到厨师的出勤情况

4、,然后根据出勤创建厨师队列,最后初始化网络连接,启动定时重连以确保网络通畅。m_TaskMan负责任务分配:CAttendanceManagementDlg AMDlg; /弹出出勤管理对话框if(AMDlg.DoModal() = IDOK) m_TaskMan.CreateCookQueue();/创建厨师队列ConnectInit(); /连接管理系统服务器/连接服务器GetPrivateProfileString("ServerIP","IP","127.0.0.1",m_SerIP.GetBuffer(20),20,&quo

5、t;.default.ini");m_SerIP.ReleaseBuffer();m_SerPort = GetPrivateProfileInt("ServerIP","PORT",8880,".default.ini");BOOL bRet = m_Socket.Connect(m_SerIP,m_SerPort);int nNum = 0;while(!bRet)nNum+;bRet = m_Socket.Connect(m_SerIP,m_SerPort);if (nNum > 20)MessageBox(_T

6、("连接服务器超时,系统将自动进行连接!"),_T("友情提示");break;/发送连接消息if(bRet = TRUE)CMessage Msg;Msg.CreateMsg(OSM_CONNECT,OST_COOK | 0x0001,OST_SERVER | 0x0001);m_Socket.Send(&Msg,sizeof(CMessage);/启动定时重连m_ReconnectNum = 0;SetTimer(1,2000,NULL);if(theApp.m_SDlg.GetSafeHwnd() != NULL)AnimateWindow

7、(theApp.m_SDlg.m_hWnd,2000,AW_HIDE|AW_CENTER|AW_BLEND);theApp.m_SDlg.DestroyWindow();4)自动分配任务操作:/自动分配任务void CCookTerminalDlg:AutoTaskAssign(int deskid,char *dishedtime)m_TaskMan.AutoAssignTask(deskid,dishedtime);5)非自动分配任务操作,厨师完成某菜品后在终端输入其编号,任务管理器向其返回分配结果:void CCookTerminalDlg:OnOK() if(CheckInput()

8、= TRUE)m_TaskMan.AssignTaskToCook(m_CookID.GetBuffer(0);m_CookID.ReleaseBuffer();(CEdit*)GetDlgItem(IDC_COOKID)->SetWindowText(_T("COOK");/将光标移动到编辑框中字符结尾处(CEdit*)GetDlgItem(IDC_COOKID)->SetSel(-1);(CEdit*)GetDlgItem(IDC_COOKID)->SetFocus();6)网络重连操作:/重连管理void CCookTerminalDlg:OnTim

9、er(UINT nIDEvent) if (nIDEvent = 1)/连接测试CMessage Msg;Msg.CreateMsg(OSM_TEST,OST_COOK | 0x0001,OST_SERVER | 0x0001);m_Socket.Send(&Msg,sizeof(CMessage);if (m_ReconnectNum > 4)/4*2秒种没有收到服务器发来的信息,表示已经断线m_ReconnectNum = 0;/重新连接服务器ConnectInit();if(m_Socket.Connect(m_SerIP,m_SerPort) = TRUE)Msg.Cre

10、ateMsg(OSM_CONNECT,OST_COOK | 0x0001,OST_SERVER | 0x0001);m_Socket.Send(&Msg,sizeof(CMessage);elsem_ReconnectNum+;CDialog:OnTimer(nIDEvent);3、出勤管理模块1)向项目添加Dialog资源,其ID设置为IDD_ATTENDANCE_MANAGEMENT_DIALOG,其属性“Caption”设置为“出勤管理”。设计如图5:图 52)向对话框中1个Check Box、1个Button、1个List Control,设置其属性如表:IDPropertie

11、sMember VariablesTypesMemberIDC_ATTENDANCE_LISTView:ReportCListCtrlm_AttendanceList3)初始化列表内容:/初始化列表项void CAttendanceManagementDlg:InitListData()CString selected,cookid,cookname; int row,i = 0;selected.Format("SELECT cookid,LEFT(cookname,LEN(cookname) as cookname FROM CookTable");if(theApp.

12、m_DbOp.OpenRecordset(selected) = FALSE)/数据库打开失败,则返回return;if(theApp.m_DbOp.MoveFirst() = FALSE) return;do cookid = theApp.m_DbOp.GetAttrValues("cookid");cookname = theApp.m_DbOp.GetAttrValues("cookname");if(cookid.Left(4) = "NONE")/为空的行,则不显示continue;row = m_AttendanceLi

13、st.InsertItem(i+,cookid);m_AttendanceList.SetItemText(row,1,cookname);while(theApp.m_DbOp.MoveNext();4)记录厨师在岗情况:/记录厨师在岗情况void CAttendanceManagementDlg:CookDuty()CString updated;CString cookid;for(int i = 0; i < m_AttendanceList.GetItemCount(); i+)cookid = m_AttendanceList.GetItemText(i,0);if(m_At

14、tendanceList.GetCheck(i)/在岗updated.Format("UPDATE CookTable SET duty=1 WHERE cookid='%s'",cookid);else/未在岗updated.Format("UPDATE CookTable SET duty=0 WHERE cookid='%s'",cookid);theApp.m_DbOp.UpdateItem(updated);4、任务管理模块(CTaskManager)1)任务分配结构:#define CS_BUSY1/*忙*/#

15、define CS_FREE2/*全空闲*/#define CS_HALFFREE3/*半空闲*/任务结构体struct TASKint deskid;char dishtimeDISHED_TIME_LEN;char dishidDISH_ID_LEN;char cookidCOOK_ID_LEN;struct TASK *next;/任务队列struct TaskQueuestruct TASK *first;struct TASK *last;/厨师结构体struct COOKchar cookidCOOK_ID_LEN;int state;struct TASK *doing;/正在做

16、的任务struct TaskQueue *assign;/指定的任务队列;/厨师队列struct CookQueueint len;struct COOK *cooks;2)创建厨师列表:/创建厨师队列,并填充结构void CTaskManager:CreateCookQueue()CString selected;int len;/得到实际在岗厨师数selected.Format("SELECT COUNT(*) as len FROM CookTable WHERE duty=1");if(theApp.m_DbOp.OpenRecordset(selected) =

17、FALSE)return;len = atoi(theApp.m_DbOp.GetAttrValues("len");if(len <= 0)return;/得到在岗厨师记录集selected.Format("SELECT cookid FROM CookTable WHERE duty=1");theApp.m_DbOp.OpenRecordset(selected);theApp.m_DbOp.MoveFirst();char cookidCOOK_ID_LEN;int i = 0;m_cq->cooks = new COOKlen;m_

18、cq->len = len;domemset(cookid,0,COOK_ID_LEN);strncpy(cookid,theApp.m_DbOp.GetAttrValues("cookid"),COOK_ID_LEN);InitCook(&m_cq->cooksi+,cookid);while(theApp.m_DbOp.MoveNext();3)读取任务,并将任务添加到非指定队列或指定队列:/读取并添加任务,按情况添加到指定或非指定队列void CTaskManager:ReadAddTask(int deskid, char *dishtime)C

19、String selected;selected.Format("SELECT dishid,cookid FROM DishedTable WHERE dishedtime='%s' AND deskid=%d",dishtime,deskid);if(theApp.m_DbOp.OpenRecordset(selected) = FALSE)return;if(theApp.m_DbOp.MoveFirst() = FALSE)return;struct TaskQueue *temp = new struct TaskQueue;struct TASK

20、 *task = NULL;char dishidDISH_ID_LEN,cookidCOOK_ID_LEN;if(temp = NULL)return;temp->first = temp->last = NULL;domemset(dishid,0,DISH_ID_LEN);memset(cookid,0,COOK_ID_LEN);strncpy(dishid,theApp.m_DbOp.GetAttrValues("dishid"),DISH_ID_LEN);strncpy(cookid,theApp.m_DbOp.GetAttrValues("

21、cookid"),COOK_ID_LEN);task = CreateTask(deskid,dishtime,dishid,cookid);if(strncmp(task->cookid,"NONE",4) = 0)/添加到临时队列if(IsEmptyQueue(temp)/第一个任务temp->first = temp->last = task;else /添加到队列尾temp->last->next = task;temp->last = task;elseAddToAssign(cookid,task);/添加到指定队列

22、while(theApp.m_DbOp.MoveNext();AddToNoAssign(temp);/添加到非指定队列delete temp;4)自动分配任务:/自动分配任务void CTaskManager:AutoAssignTask(int deskid, char *dishtime)int at = 0;CCookTerminalDlg *m_Parent = (CCookTerminalDlg*)AfxGetMainWnd();if(m_Parent = NULL) AfxMessageBox(_T("系统出错!"); return; ReadAddTask(

23、deskid,dishtime);/读取并添加任务while(!IsEmptyQueue(m_noAssign)/如果非指定队列不为空,则继续寻找at = GetFirstFree(at);/找到全空闲的厨师if(at = -1)/如果没找到则结束break;/为该厨师分配非指定队列的首任务m_cq->cooksat.doing = GetHeaderTask(m_noAssign);m_cq->cooksat.state = CS_BUSY;strncpy(m_cq->cooksat.doing->cookid,m_cq->cooksat.cookid,COOK

24、_ID_LEN);/显示自动任务分配情况m_Parent->ShowAutoTaskAssign(m_cq->cooksat);at = 0; struct TaskQueue *queue = NULL;while(at = GetFirstHalfFree(at) != -1)/如果半空闲的厨师存在,则继续分配任务queue = m_cq->cooksat.assign;/取指定队列if(!IsEmptyQueue(m_noAssign)/如果非指定队列不为空,按先来先服务原则分配 if(strncmp(m_noAssign->first->dishtime,

25、queue->first->dishtime,DISHED_TIME_LEN - 1) < 0)/非指定队列首任务优先,开始非指定队列首任务m_cq->cooksat.doing = GetHeaderTask(m_noAssign);else/否则取指定队列首任务m_cq->cooksat.doing = GetHeaderTask(queue);else/如果非指定队列为空,则直接开始指定队列首任务m_cq->cooksat.doing = GetHeaderTask(queue);m_cq->cooksat.state = CS_BUSY;str

26、ncpy(m_cq->cooksat.doing->cookid,m_cq->cooksat.cookid,COOK_ID_LEN);/显示自动任务分配情况m_Parent->ShowAutoTaskAssign(m_cq->cooksat);5)非自动分配任务:void CTaskManager:AssignTaskToCook(char *cookid) int at; struct TaskQueue *queue = NULL;CCookTerminalDlg *m_Parent = (CCookTerminalDlg*)AfxGetMainWnd();i

27、f(m_Parent = NULL) AfxMessageBox(_T("系统出错!"); return; at = FindCook(cookid);if(at = -1)AfxMessageBox(_T("在岗厨师中不存在该编号的厨师!"),MB_OK);return;if(m_cq->cooksat.doing != NULL)/显示菜品完成,注意处理完后将空间释放m_Parent->TaskFinish(m_cq->cooksat.doing);m_cq->cooksat.doing = NULL;if(IsEmptyQu

28、eue(m_cq->cooksat.assign)/如果指定队列为空,则置其状态为空闲,否则为半空闲m_cq->cooksat.state = CS_FREE;elsem_cq->cooksat.state = CS_HALFFREE;if(m_cq->cooksat.state = CS_FREE)/若该厨师全空闲,则分配非指定队列的任务if(!IsEmptyQueue(m_noAssign)/非指定不为空,则分配首任务给该厨师m_cq->cooksat.doing = GetHeaderTask(m_noAssign);m_cq->cooksat.sta

29、te = CS_BUSY; else /若厨师为半空闲,则按先来先服务原则分配任务queue = m_cq->cooksat.assign;if(!IsEmptyQueue(m_noAssign)/非指定队列不为空且优先于指定队列首任务 if(strncmp(m_noAssign->first->dishtime,queue->first->dishtime,DISHED_TIME_LEN - 1) < 0)m_cq->cooksat.doing = GetHeaderTask(m_noAssign);elsem_cq->cooksat.doing = GetHeaderTask(que

温馨提示

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

评论

0/150

提交评论