📄 return.c
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<signal.h>#include<curses.h>#include<malloc.h>#include<time.h>#include<errno.h>#include<unistd.h>#include<pwd.h>#define MAXSEAT 60#define INROW 22#define MSGROW 23#define BEGINYEAR 1970#define DSEC 86400#define HSEC 3600#define MSEC 60struct time{ int second; /* 0--59 */ int minute; /* 0--59 */ int hour; /* 0--23 */ int mday; /* 1--31 */ int month; /* 1--12 */ int year; /* 1970-- */ int wday; /* 0--6(0=Sunday)*/ int yday; /* 1--365(366) */ long tseconds; /* seconds from 1970.1.1,0:0:0 */};struct ticket{ int bus; int sta; unsigned user; /* sale user */ char flag; /* 0-all 1-half */ int date; /* date saled */ int time; /* time saled */ char checkflag; /* checked or not */ unsigned number; /* number of ticket */ int seat; /* seat of ticket in bus */ int price; /* all price or half price */ int ruser; /* return user(normal -1) */ int rdate; /* date returned */ int rtime; /* time returned */ unsigned rprice; /* price returned */}*tic=NULL;int *locate=NULL;struct busstate{ int bus; int time; char regi; int reguser; int regtime; char check; int gate; int checkuser; int checkbegintime; int checkendtime; char print; int printuser; int printtime; char settle; int owner; int rate; int settleuser; int settletime;}bs;struct returnt{ int user; int date; int bus; char flag; int time; int seat; int sta; int price; int fee; int rprice; unsigned number;}*rtic=NULL;struct ticketlib{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[MAXSEAT];}tl;int tllocate;enum Key{ NONE,Up,Down,Right,Left,Center,End,PgDn,Home, PgUp,Ins,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12};char *RP;int uno;main(){ long tn; struct time t; int date,num=0,ntic=1,flag; char msg[80]; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; uno=getuid(); signal(SIGINT,SIG_IGN); initscr(); raw(); nonl(); noecho(); clear(); refresh(); tn=time(0); gettime(tn,&t); date=t.year*10000+t.month*100+t.mday; mvaddstr(9,25,"***** 退 票 系 统 *****"); refresh(); while(1) { if(get_n(12,30,"日期: ",&date,10)==-1) break; if(get_n(13,30,"首号: ",&num,10)==-1) continue; if(get_n(14,30,"张数: ",&ntic,5)==-1) continue; showmsg("0--折扣退 1--全退"); flag=0; if(get_n(15,30,"方式: ",&flag,3)==-1) continue; if(retfun(date,num,ntic,flag)==0) showmsg("退票成功!"); } erase(); clear(); refresh(); endwin();}int retfun(int date,int number,int ntic,char flag){ int fd; char fn[80]; long tn; struct time t; char msg[80],s[10]="n"; int bus,btime,dd,tt; int i,j; long size,ss; unsigned rprice=0,fee=0; if(ntic<=0) return -1; if(tic!=NULL) free(tic); if(locate!=NULL) free(locate); if(rtic!=NULL) free(rtic); tic=(struct ticket *)malloc(ntic*sizeof(struct ticket)); locate=(int *)malloc(ntic*sizeof(int)); rtic=(struct returnt *)malloc(ntic*sizeof(struct returnt)); if(tic==NULL||locate==NULL||rtic==NULL) { showmsg("为退票数据分配内存出错!"); return -1; } sprintf(fn,"%s/data/ticket/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件 %s 无法打开, 不能退票!",fn); showmsg(msg); return fd; } size=sizeof(struct ticket); for(i=0,j=0;j<ntic;i++) { ss=read(fd,(char *)(tic+j),size); if(ss!=size) break; if(tic[j].number>=number&&tic[j].number<number+ntic) locate[j++]=i; } close(fd); if(j==0) { showmsg("查无此票, 请核实后酌情处理!"); return -1; } ntic=j; sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件 %s 无法打开, 不能退票!",fn); showmsg(msg); return fd; } size=sizeof(struct ticketlib); for(i=0;;i++) { ss=read(fd,(char *)&tl,size); if(ss!=size) { close(fd); showmsg("票库数据与售票数据不一致, " "请排除故障后重新办理退票!"); return -1; } if(tl.bus==tic[0].bus) { tllocate=i; break; } } close(fd); sprintf(fn,"%s/data/state/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件 %s 无法打开, 系统存在故障!",fn); showmsg(msg); return -1; } for(i=0;i<ntic;i++) { if(tic[i].checkflag!=0) { close(fd); sprintf(msg,"票号为 %d 的票已办理过检票手续, " "不允许退票!",tic[i].number); showmsg(msg); return -1; } if(tic[i].ruser!=-1) { close(fd); sprintf(msg,"票号为 %d 的票已办理过退票手续, " "不允许重办, 应予以没收!",tic[i].number); showmsg(msg); return -1; } if(tl.tab[tic[i].seat-1]==0) { close(fd); showmsg("票库数据与售票数据不一致, " "请排除故障后重新办理退票!"); return -1; } else tl.tab[tic[i].seat-1]=0; bus=tic[i].bus; lseek(fd,0L,0); while(1) { size=read(fd,(char *)&bs,sizeof(struct busstate)); if(size!=sizeof(struct busstate)) { close(fd); showmsg("售票文件与班次状态文件的数据不一致!"); return -1; } if(bs.bus==bus) break; } btime=bs.time; tn=time(0); gettime(tn,&t); dd=t.year*10000+t.month*100+t.mday; tt=t.hour*100+t.minute; tic[i].ruser=uno; tic[i].rdate=dd; tic[i].rtime=tt; if(flag==1) tic[i].rprice=tic[i].price; else if(date>dd) tic[i].rprice=tic[i].price*90/100; else if(tt-btime>=100) /* one hour later */ { close(fd); sprintf(msg,"%d号票所在班车发车已超过一小时, 不能办理退票!",tic[i].number); showmsg(msg); return -1; } else if(btime-tt>200) /* before two hours */ tic[i].rprice=tic[i].price*90/100; else if(btime-tt>0) /* in two hours */ tic[i].rprice=tic[i].price*80/100; else tic[i].rprice=tic[i].price*50/100; tl.lseat++; rtic[i].user=tic[i].ruser; rtic[i].date=tic[i].rdate; rtic[i].bus=tic[i].bus; rtic[i].flag=-1; rtic[i].time=tic[i].rtime; rtic[i].seat=tic[i].seat; rtic[i].sta=tic[i].sta; rtic[i].price=tic[i].price; rtic[i].fee=tic[i].price-tic[i].rprice; rtic[i].rprice=tic[i].rprice; rtic[i].number=tic[i].number; } close(fd); for(i=0;i<ntic;i++) { rprice+=rtic[i].rprice; fee+=rtic[i].fee; } mvprintw(16,30,"退款: %d.%02d元",rprice/100,rprice%100); mvprintw(17,30,"手续费: %d.%02d元",fee/100,fee%100); refresh(); if(get_s(INROW,30,"以上数据正确吗?(y/n)? ",s,10)==-1) { showmsg("请注意: 你取消了此次退票!"); return; } if(s[0]!='y'&&s[0]!='Y') { showmsg("请注意: 你取消了此次退票!"); return; } sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { sprintf(msg,"文件 %s 无法打开, 退票数据不能写入!",fn); showmsg(msg); return -1; } size=sizeof(struct ticketlib); lseek(fd,size*tllocate,0); lockf(fd,F_LOCK,size); write(fd,(char *)&tl,size); lseek(fd,size*tllocate,0); lockf(fd,F_ULOCK,size); close(fd); sprintf(fn,"%s/data/ticket/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { sprintf(msg,"文件 %s 无法打开, 退票数据不能写入!",fn); showmsg(msg); return -1; } size=sizeof(struct ticket); for(i=0;i<ntic;i++) { lseek(fd,size*locate[i],0); lockf(fd,F_LOCK,size); write(fd,(char *)(tic+i),size); lseek(fd,size*locate[i],0); lockf(fd,F_ULOCK,size); } close(fd); sprintf(fn,"%s/data/user/%d",RP,date); fd=open(fn,O_RDWR|O_APPEND); if(fd==-1) { fd=open(fn,O_CREAT|O_RDWR); if(fd==-1) { sprintf(msg,"文件 %s 无法打开, 退票员数据不能写入!",fn); showmsg(msg); return -1; } else chmod(fn,0666); } size=ntic*sizeof(struct returnt); lockf(fd,F_LOCK,0L); write(fd,(char *)rtic,size); close(fd); return 0;}int gettime(long tn,struct time *t){ int days,ydays; short TZ; char *tzs; short mdays[2][12]={31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31}; short i; tzs=(char *)getenv("TZ"); if(tzs==NULL) TZ=0; else { for(;*tzs!='\0'&&*tzs!='+'&&*tzs!='-'&&(*tzs<'0'||*tzs>'9');tzs++) ; TZ=atoi(tzs); TZ=-TZ; } tn+=TZ*HSEC; days=tn/DSEC; t->tseconds=tn; t->wday=(days+4)%7; ydays=365; for(t->year=BEGINYEAR;days>=ydays;t->year++,days-=ydays) if(t->year%400==0||(t->year%4==0&&t->year%100!=0)) ydays=366; else ydays=365; t->yday=days; t->month=1; if(t->year%400==0||(t->year%4==0&&t->year%100!=0)) for(i=0;days>=mdays[1][i];i++) { days-=mdays[1][i]; t->month++; } else for(i=0;days>=mdays[0][i];i++) { days-=mdays[0][i]; t->month++; } t->mday=days+1; t->hour=tn%DSEC/HSEC; t->minute=tn%HSEC/MSEC; t->second=tn%MSEC; return 0;}int get_s(int y,int x,char prompt[],char s[],int n) /* x,y location of cursor; s the string */ /* n length of s; */{ char c,ss[128]; int i; for(i=0;i<n-1;i++) ss[i]=' '; ss[n-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,ss); mvaddstr(y,x,s); refresh(); i=0; while(1) { move(y,x+i); refresh(); if(i>=n-1) c=0x0d; else c=getkey(); switch(c) { case -1: continue; case 0x1b: /* <ESC> pressed */ return -1; case 0x0d: /* <ENTER> pressed */ if(i) { ss[i]='\0'; strcpy(s,ss); } return 0; case 0x08: /* <BS> pressed */ if(i<=0) continue; else ss[--i]=' '; break; default: ss[i++]=c; break; } mvaddstr(y,x,ss); refresh(); }}int get_n(int y,int x,char *prompt,int *n,int b){ char c,s[80],ss[80]; int i; sprintf(s,"%d",*n); for(i=0;i<b-1;i++) ss[i]=' '; ss[b-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,ss); mvaddstr(y,x,s); refresh(); i=0; while(1) { move(y,x+i); refresh(); if(i>=b-1) c=0x0d; else c=getkey(); switch(c) { case -1: continue; case 0x1b: /* <ESC> pressed */ return -1; case 0x0d: /* <ENTER> pressed */ if(i) { ss[i]='\0'; *n=atoi(ss); } return 0; case 0x08: /* <BS> pressed */ if(i<=0) continue; else { ss[--i]=' '; ss[i]='\0'; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ss[i++]=c; break; default: printf("\7\7"); break; } mvaddstr(y,x,ss); refresh(); }}getkey(){ char c,key; char keys[]={Up,Down,Right,Left,NONE,NONE,PgDn,Home, PgUp,NONE,End,Ins}; void timeint(); sigset(SIGALRM,timeint); key=getch(); refresh(); if(key==0x1b) { alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } } sigignore(SIGALRM); return key;}void timeint(){}showmsg(char s[]){ move(MSGROW,0); clrtoeol(); mvaddstr(MSGROW,(80-strlen(s))/2,s); refresh(); printf("\7\7"); refresh();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -