int Ui_admin() { int n; void (*pst[3])() = {Table_manage,Menu_manage,Staff_manage}; while(1) { system("cls"); printf("\n\n\n\t\t\t管理员功能选择界面\n\n"); printf("\t\t\t1、台桌管理\n\n"); printf("\t\t\t2、菜谱管理\n\n"); printf("\t\t\t3、人员管理\n\n"); printf("\t\t\t4、注销\n\n"); printf("\t\t\t5、退出\n\n"); printf("\t\t\t请输入您所要选择的功能:"); n = glb_putString(NULL,'1','5',1,2); if (n > 0 && n <4) { pst[n-1](); } else if(n == 4) return 0; else if (n == 5) return 1; } }
void Staff_manage() { char dirname[] = "./Date/Staff.txt"; FILE *fp; pList head; int n,count; fp = File_open(dirname); head = File_read(fp,sizeof(struct staff_t)); count = List_count(head); while(1) { system("cls"); printf("\n\n\n\t\t\t员工管理界面\n\n"); printf("\t\t\t1、增加员工\n\n"); printf("\t\t\t2、删除员工\n\n"); printf("\t\t\t3、修改员工\n\n"); printf("\t\t\t4、查询员工\n\n"); printf("\t\t\t5、返回\n\n"); printf("\t\t\t请输入要操作的功能:"); n = glb_putString(NULL,'1','5',1,2); switch(n) { case 1: List_print(head,staff_print); File_add(fp,head,sizeof(struct staff_t),staff_add); List_print(head,staff_print); break; case 2: List_print(head,staff_print); File_remove(fp,head,sizeof(struct staff_t),staff_remove); head = File_read(fp,sizeof(struct staff_t)); List_print(head,staff_print); break; case 3: List_print(head,staff_print); File_updata(fp,head,sizeof(struct staff_t),staff_updata); head = File_read(fp,sizeof(struct staff_t)); List_print(head,staff_print); break; case 4: staff_search(head); break; case 5: break; } if (n == 5) { break; } else { printf("\n按<Esc>键返回..."); while(getch() != 27) {} } } List_free(head); }
/************************************************************************ int Ui_waiter() 服务员界面 ************************************************************************/ int Ui_waiter() { pList pTable; int n; FILE *fp; void (*pst[5])(pList pTable) = {Open_desk,Order_dishes,Settle_Accounts,turnover_search,Order_search}; fp = File_open("./Date/Table.txt"); pTable= File_read(fp,sizeof(struct Table_t)); while(1) { system("cls"); printf("\n\n\n\t\t\t服务员功能选择界面\n\n"); printf("\t\t\t1、开桌\n\n"); printf("\t\t\t2、点菜\n\n"); printf("\t\t\t3、结账\n\n"); printf("\t\t\t4、营业额查询\n\n"); printf("\t\t\t5、已买/未买单查询\n\n"); printf("\t\t\t6、注销\n\n"); printf("\t\t\t7、退出\n\n"); printf("\t\t\t请输入您所要选择的功能:"); n = glb_putString(NULL,'1','7',1,2); if (n > 0 && n <6) { pst[n-1](pTable); } else if(n == 6) return 0; else if (n == 7) return 1; } }
void Menu_manage() { char dirname[] = "./Date/Menu.txt"; FILE *fp; pList head; int n; fp = File_open(dirname); head = File_read(fp,sizeof(struct Menu_t)); while(1) { system("cls"); printf("\n\n\n\t\t\t菜谱管理界面\n\n"); printf("\t\t\t1、增加菜谱\n\n"); printf("\t\t\t2、删除菜谱\n\n"); printf("\t\t\t3、修改菜谱\n\n"); printf("\t\t\t4、查询菜谱\n\n"); printf("\t\t\t5、返回\n\n"); printf("\t\t\t请输入您要操作的功能:"); n = glb_putString(NULL,'1','5',1,2); switch(n) { case 1: List_print(head,Menu_print); File_add(fp,head,sizeof(struct Menu_t),Menu_add); head = File_read(fp,sizeof(struct Menu_t)); List_print(head,Menu_print); break; case 2: List_print(head,Menu_print); File_del(fp,dirname,head,sizeof(struct Menu_t),Menu_del); List_print(head,Menu_print); break; case 3: List_print(head,Menu_print); File_updata(fp,head,sizeof(struct Menu_t),Menu_updata); head = File_read(fp,sizeof(struct Menu_t)); List_print(head,Menu_print); break; case 4: Menu_search(head); break; case 5: break; } if (n == 5) { break; } else { printf("\n按<Esc>键返回..."); while(getch() != 27) {} } } List_free(head); }
void Table_manage() { char dirname[] = "./Date/Table.txt"; FILE *fp; pList head; int n; fp = File_open(dirname); head = File_read(fp,sizeof(struct Table_t)); while(1) { system("cls"); printf("\n\n\n\t\t\t台桌管理界面\n\n"); printf("\t\t\t1、增加台桌\n\n"); printf("\t\t\t2、删除台桌\n\n"); printf("\t\t\t3、修改台桌\n\n"); printf("\t\t\t4、查询台桌\n\n"); printf("\t\t\t5、返回\n\n"); printf("\t\t\t请输入您要操作的功能:"); n = glb_putString(NULL,'1','5',1,2); switch(n) { case 1: List_print(head,Table_print); File_add(fp,head,sizeof(struct Table_t),Table_add); head = File_read(fp,sizeof(struct Table_t)); List_print(head,Table_print); break; case 2: List_print(head,Table_print); File_remove(fp,head,sizeof(struct Table_t),Table_remove); head = File_read(fp,sizeof(struct Table_t)); List_print(head,Table_print); break; case 3: List_print(head,Table_print); File_updata(fp,head,sizeof(struct Table_t),Table_updata); head = File_read(fp,sizeof(struct Table_t)); List_print(head,Table_print); break; case 4: Table_search(head,3,4); break; case 5: break; } if (n == 5) { break; } else { printf("\n按<Esc>键返回..."); while(getch() != 27) {} } } List_free(head); }
/************************************************************************ void turnover_search(pList pTable) 营业额查询 ************************************************************************/ void turnover_search(pList pTable) { FILE *fp; pList pOrder,pt; struct Order_t *data; long *stardate,*enddate; long ordernum;// 订单号 int a,b,c;// 用来打印年月日 long money = 0;// 总营业额 stardate = (long *)malloc(sizeof(long));// 开始日期 enddate = (long *)malloc(sizeof(long));// 结束日期 fp = File_open("./Date/Order/Order.txt"); pOrder = File_read(fp,sizeof(struct Order_t));// 读出已买订单链表 system("cls"); printf("\n\t\t\t(1):当天查询\n"); printf("\n\t\t\t(2):历史查询\n"); printf("\n\t\t\t请输入要选择的功能:"); if (glb_putString(NULL,'1','2',1,2) == 1) { system("cls"); *stardate = Ordernum_get(NULL,NULL);// 获取当前系统日期 *enddate = *stardate; } else { Orderdate_input(stardate,enddate);// 输入开始和结束日期 printf("\n"); } printf("\t\t%-16s%-18s%-11s\n","订单号","时间","金额"); pt = pOrder->pNext; while (pt) { data = (struct Order_t *)(pt->pData); sscanf(data->ordernum,"%8ld",&ordernum);// 字符串转化成长整型 if ((strcmp(data->acname,acName) == 0)&&((ordernum <= *enddate) && (ordernum >= *stardate)))// { money = money + (data->money);// 营业额累加 sscanf(data->ordernum,"%4d%2d%2d",&a,&b,&c);//分别取出年月日 printf("\t\t%-16s%d%s%2d%s%2d%-6s%s%d\n",data->ordernum,a,"年",b,"月",c,"日","¥",data->money); } pt = pt->pNext; } printf("\n\t\t营业额总额:¥%ld\n",money); List_free(pOrder); printf("\n\t\t按任意键返回..."); getch(); }
/************************************************************************ void Order_search(pList pTable) 已买/未买单查询 ************************************************************************/ void Order_search(pList pTable) { int n; FILE *fp; pList pOrder; fp = File_open("./Date/Cache/Order.txt"); pOrder = File_read(fp,sizeof(struct Order_t));// 读出未买单链表 while (1) { system("cls"); printf("\n\n\n\t\t\t已买/未买单查询界面\n\n"); printf("\t\t\t1、未买单查询\n\n"); printf("\t\t\t2、已买单查询\n\n"); printf("\t\t\t3、退出\n\n"); printf("\t\t\t请输入您所要选择的功能:"); n = glb_putString(NULL,'1','3',1,2); switch(n) { case 1: Order_search_unbuy(pOrder);// 未买单查询函数 getch(); break; case 2: Order_search_buy();// 已买单查询函数 getch(); break; case 3: break; } if (n == 3) { break; } } List_free(pOrder);// 释放链表 }
int Ui_manage() { int n; while(1) { system("cls"); printf("\n\n\n\t\t\t经理功能选择界面\n\n"); printf("\t\t\t1、营收汇总\n\n"); printf("\t\t\t2、注销\n\n"); printf("\t\t\t3、退出\n\n"); printf("\t\t\t请输入您所要选择的功能:"); n = glb_putString(NULL,'1','3',1,2); if (n == 1) { Profit_statist(); } else if(n == 2) return 0; else if (n == 3) return 1; } }
void way_add_arb(LIST_T*head) { int get,count; FILE*stt_fp,*way_fp; LIST_T*stt_head; STT_T*stt_data; char str=' '; WAY_T*data,*fdata,*ldata; char filename[15]=" "; int sum=list_count(head); stt_head=list_init(); stt_fp=file_open("station.txt"); file_readall(stt_fp,stt_head,ISTT); data=(WAY_T*)malloc(IWAY); memset(data,0,IWAY); fdata=(WAY_T*)malloc(IWAY); memset(fdata,0,IWAY); ldata=(WAY_T*)malloc(IWAY); memset(ldata,0,IWAY); while(1) { count=way_printpage(head); if (count==27) { return; } if (count==sum) { gotoXY(18,16); printf("不能在终点站后插入站点"); Sleep(1000); continue; } fdata=list_search_count(count,head); ldata=list_search_count(count+1,head); break; } data->tickctnum=((WAY_T*)(head->pnext->data))->tickctnum; print_way_add(); strcpy(data->id,((WAY_T*)(head->pnext->data))->id); while(1) { gotoXY(26,3); get=glb_putString(data->stt,4,10,1); if(get==27) { return ; } if(list_search_name(data->stt,head,way_sttmatch)!=NULL) { gotoXY(20,20); printf("该车次已有该站点"); Sleep(1000); gotoXY(20,20); printf(" "); gotoXY(26,3); printf(" "); continue; } else if(list_search_name(data->stt,stt_head,stt_namematch)==NULL) { gotoXY(20,20); printf("没有该站点"); Sleep(1000); gotoXY(20,20); printf(" "); gotoXY(26,3); printf(" "); continue; } else if (list_search_name(data->stt,head,way_sttmatch)!=NULL) { gotoXY(20,20); printf("该站点已经在该车次中出现"); Sleep(1000); gotoXY(20,20); printf(" "); gotoXY(26,3); printf(" "); continue; } else { break; } } while (1) { gotoXY(26,5); get=glb_putTime(data->btime); if(get==27) { return ; } gotoXY(26,7); get=glb_putTime(data->etime); if(get==27) { return ; } if(!(trn_usetime(data->btime,fdata->etime)<0&&trn_usetime(ldata->btime,data->etime)<0)) { gotoXY(17,17); printf("该时间不合法"); Sleep(1000); gotoXY(17,17); printf(" "); gotoXY(26,5); printf(" "); gotoXY(26,7); printf(" "); continue; } break ; } data->usetime=trn_usetime(data->btime,data->etime); gotoXY(26,9); printf("%d:%d",data->usetime/60,data->usetime%60); while (1) { gotoXY(26,11); get=data->distance=glb_putNumber(4); if(get==0) { return ; } if(!(data->distance>fdata->distance&&data->distance<ldata->distance)) { gotoXY(17,17); printf("该里程不合法"); Sleep(1000); gotoXY(17,17); printf(" "); gotoXY(26,11); printf(" "); continue; } break; } gotoXY(26,13); data->price=data->distance*1.2; printf("%.2f",data->price); list_add_count(head,count,data); gotoXY(20,18); printf("成功增加途径站点"); sprintf(filename,"%s.txt",((WAY_T*)(head->pnext->data))->id); file_writeall(head,IWAY,filename); way_fp=file_open(filename); fclose(way_fp); stt_data=list_search_name(data->stt,stt_head,stt_search); stt_data->isdelete++; file_writeall(stt_head,ISTT,"station.txt"); fclose(stt_fp); Sleep(1000); return ; }
/************************************************************************ void Open_desk(pList pTable) 开桌 ************************************************************************/ void Open_desk(pList pTable) { pList pt; int n; struct Table_t *ps; char str[8] = {0}; FILE *fp; fp = File_open("./Date/Table.txt"); while (1) { system("cls"); n = Table_search(pTable,0,3);// 打印空闲和预定的台桌 if (n == 0) { printf(",暂无空闲桌子,按任意键返回..."); getch(); return; } printf("请输入要开桌的台桌号:"); glb_putString(str,'0','9',3,2);// str存放要开桌的台桌号 pt = pTable->pNext; while(pt != NULL) { ps = (struct Table_t *)(pt->pData); if (strcmp(ps->acNo,str) == 0) { if ((ps->state == 0)||(ps->state == 3)) break; } pt = pt->pNext; } if (pt == NULL) { memset(str,0,sizeof(char)); printf("\n台桌号有误或不可用,请重新输入,按任意键继续..."); getch(); } else break; } if (ps->state == 3)// 若为预定状态,直接跳转为点菜界面 { ps->state = 2;//占用,转到点菜界面 File_write(fp,pTable,sizeof(struct Table_t),0);// 更新台桌文件 printf("\n开桌成功,按任意键继续..."); getch(); Order_dishes(pTable);// 跳转到点菜界面 return; } printf("\n是否马上开始点菜(y)确定、(n)返回:"); if(glb_putString(NULL,0,0,1,1) != 'y') { ps->state = 3;//预定状态 File_write(fp,pTable,sizeof(struct Table_t),0); printf("\n预定成功,按任意键继续..."); getch(); } else { ps->state = 2;//占用,转到点菜界面 File_write(fp,pTable,sizeof(struct Table_t),0); printf("\n开桌成功,按任意键继续..."); getch(); Order_dishes(pTable); return; } }
/************************************************************************ void Settle_Accounts(pList pTable) 结账功能 ************************************************************************/ void Settle_Accounts(pList pTable) { FILE *fp; int money; pList pt,pTitle,pOrder,ps; struct Order_t * data; char txt[] = ".txt"; char str[6] = {0}; char str1[6] = {0}; char tabpath[30] ="./Date/Cache/";// 未结详单路径 fp = File_open("./Date/Cache/Order.txt");// 打开未买订单文件 pOrder = File_read(fp,sizeof(struct Order_t)); while(1) { system("cls"); pt = pOrder->pNext; if (pt == NULL)//判断当前是否有未买订单 { printf("\n目前没有未买订单,按任意键返回..."); return; } printf("\t\t%12s%12s%11s%11s\n","订单号","台桌号","金额","状态"); while (pt) { data = (struct Order_t *)(pt->pData); printf("\t\t%12s%12s%11d%11s\n",data->ordernum,data->tablenum,data->money,"未支付");// 打印所有未结订单信息 pt = pt->pNext; } printf("\n请输入要结账的台桌号(3位):"); glb_putString(str,'0','9',3,2); ps = pOrder; pt = pOrder->pNext; while (pt) { data = (struct Order_t *)(pt->pData); if (strcmp(data->tablenum,str) == 0)// 找出要结账的订单结点 break; ps = pt; pt = pt->pNext; } if (pt == NULL)// 未找到订单,作提示 { printf("\n\n台桌号无订单或有误,按<Esc>键返回、其他键重新输入:"); if (getch() == 27) return; memset(str,0,sizeof(char)); } else break; } strcat(tabpath,str);// 获取详单的路径 strcat(tabpath,txt); fp = File_open(tabpath);// 打开将结账的详单文件 pTitle = File_read(fp,sizeof(struct Title_t));// 读出未买详单链表 Title_print(pTitle,data);// 打印未买详单信息 printf("\n订单号为%s是否结账,(y)确定、(n)返回:",data->ordernum); if (glb_putString(NULL,0,0,1,1) == 'y') { printf("\n实收金额:"); money = glb_putString(str1,'0','9',5,2);// 输入金额 if (money < data->money)// 实收金额不可小于订单金额 { printf("\n实收金额小于订单金额,无法结账,按任意键返回..."); getch(); return; } printf("\n回找金额:%d",money - (data->money)); fp = File_open("./Date/Title/Title.txt"); File_write(fp,pTitle,sizeof(struct Title_t),2);//写入已结详单链表 fp = File_open("./Date/Order/Order.txt"); fseek(fp,0,2); strcpy(data->acname,acName);//写入结账服务员登录名到订单结构体中 fwrite(data,sizeof(struct Order_t),1,fp);//写入已结订单的结点到另一个文件 fflush(fp); ps->pNext = pt->pNext;// 删除结点 free(pt);//释放已结订单的结点 fp = fopen("./Date/Cache/Order.txt","w+"); File_write(fp,pOrder,sizeof(struct Order_t),0);//刷新未结订单的文件 pt = pTable->pNext; while(pt) { if(strcmp(((struct Table_t *)(pt->pData))->acNo,str) == 0)// 找到已结账台桌结点 { ((struct Table_t *)(pt->pData))->state = 0;// 桌子状态改为空闲 fp = File_open("./Date/Table.txt"); File_write(fp,pTable,sizeof(struct Table_t),0);// 更新台桌信息文件 break; } pt = pt->pNext; } printf("\n结账成功"); } else printf("\n结账失败"); printf(",按任意键返回..."); getch(); List_free(pTitle); List_free(pOrder); }
/************************************************************************ void Order_dishes(pList pTable) 点菜 ************************************************************************/ void Order_dishes(pList pTable) { FILE *fd; int n,count1; pList pMenu,pOrder,pTitle,pt; struct Order_t *pNew,*pdata; char txt[] = ".txt"; char str[8] = {0}; char tabpath[30] ="./Date/Cache/";// 详单的相对路径 fd = File_open("./Date/Menu.txt"); pMenu = File_read(fd,sizeof(struct Menu_t)); fd = File_open("./Date/Cache/Order.txt"); pOrder = File_read(fd,sizeof(struct Order_t)); while (1) { system("cls"); n = Table_search(pTable,2,4);// 判断是否有可用桌子 if (n == 0) { printf(",暂无可用桌子,按任意键继续..."); getch(); return; } printf("请输入要点菜的台桌号:"); glb_putString(str,'0','9',3,2); strcat(tabpath,str); strcat(tabpath,txt);// 获取详单的路径 pt = pOrder->pNext; while(pt) { pdata = (struct Order_t *)(pt->pData); if (strcmp(pdata->tablenum,str) == 0)// 判断当前未买订单中是否存在此台桌的订单 { pNew = pdata; fd = File_open(tabpath); pTitle = File_read(fd,sizeof(struct Title_t)); break; } pt = pt->pNext; } if (pt == NULL)// 未买订单不存在输入台桌的订单 { pt = pTable ->pNext; while(pt) { if (strcmp(((struct Table_t *)(pt->pData))->acNo,str) == 0) { if (((struct Table_t *)(pt->pData))->state == 2) { pNew = Order_init(str);// 初始化一个订单结点 List_add(pOrder,pNew); File_write(fd,pOrder,sizeof(struct Order_t),0);// 写入未买订单文件 fd = fopen(tabpath,"w+");// 已w+方式打开详单文件,便于开始点菜 pTitle = File_read(fd,sizeof(struct Title_t)); break; } else if (((struct Table_t *)(pt->pData))->state == 0) { printf("\n此桌号为空闲需先开桌才能点菜,是否开桌,(y)开桌、(n)返回:"); if (glb_putString(NULL,0,0,1,1) == 'y') Open_desk(pTable);// 跳转到开桌界面 return; } } pt = pt->pNext; } if (pt == NULL) { memset(str,0,sizeof(char)); strcpy(tabpath,"./Date/Cache/"); printf("\n输入的桌号有误或者处于维修状态,请重新输入,按任意键继续..."); getch(); } else break; } else break; } Order_print(pMenu,pTitle,pNew); count1 = List_count(pMenu);// 获取菜谱的个数 while (1) { JR_EmptyRaw(count1+3,count1+12);// 清空菜谱下面的几行信息 JR_SetCursor(count1+3,0); printf("\t\t(1):点菜\n"); printf("\t\t(2):退菜\n"); printf("\t\t(3):返回\n"); printf("\t\t请输入要操作的功能:"); n = glb_putString(NULL,'1','3',1,2); switch(n) { case 1: { Order_add(count1,pNew,pTitle,pOrder,pMenu,tabpath); // 加菜功能函数 break; } case 2: { Order_del(count1,pNew,pTitle,pMenu,pOrder,tabpath);// 减菜功能函数 break; } case 3: break; } if (n == 3) { break; } } List_free(pOrder); List_free(pMenu); List_free(pTitle); }
void Profit_statist() { pList pOrder,pStaff; pList p1,p2; struct Order_t *Odate; struct staff_t *Sdate; FILE *fp; long money,income;// 总金额 long *stardate,*enddate; long ordernum;// 订单号 money = income = 0; stardate = (long *)malloc(sizeof(long));// 开始日期 enddate = (long *)malloc(sizeof(long));// 结束日期 fp = File_open("./Date/Order/Order.txt"); pOrder= File_read(fp,sizeof(struct Order_t)); fp = File_open("./Date/Staff.txt"); pStaff= File_read(fp,sizeof(struct staff_t)); system("cls"); printf("\n\t\t\t(1):当天查询\n"); printf("\n\t\t\t(2):历史查询\n"); printf("\n\t\t\t请输入要选择的功能:"); if (glb_putString(NULL,'1','2',1,2) == 1) { system("cls"); *stardate = Ordernum_get(NULL,NULL);// 获取当前系统日期 *enddate = *stardate; } else { Orderdate_input(stardate,enddate);// 输入开始和结束日期 printf("\n"); } printf("\t\t\t%-15s%s\n","服务员","营收"); p1 = pStaff->pNext; while (p1) { Sdate = (struct staff_t *)(p1->pData); p2 = pOrder->pNext; while(p2) { Odate = (struct Order_t *)(p2->pData); sscanf(Odate->ordernum,"%8ld",&ordernum);// 获取订单号上的日期 if ((strcmp(Sdate->acName,Odate->acname) == 0)&&(ordernum <= *enddate) && (ordernum >= *stardate)) { money = money + (Odate->money); } p2 = p2->pNext; } if ((Sdate->role == 0))// 判断是否为服务员 { printf("\t\t\t%-15s%s%ld\n",Sdate->acName,"¥",money); income = income + money;// 累加每个服务员的营业额 money = 0; } p1 = p1->pNext; } printf("\n\t\t\t总营业额:¥%ld\n",income); printf("\n\t\t\t请按任意键返回..."); getch(); }