📄 sale.c
字号:
s=sbus; refresh();}showone(int row,int n){ int i,j,k,l; int ptl,psb; move(row,0), clrtoeol(); ptl=bus[n].ptl; psb=bus[n].psb; mvprintw(row,col[0],"%d",tl[ptl].bus); mvprintw(row,col[1],"%2d:%02d",tl[ptl].time/100,tl[ptl].time%100); mvprintw(row,col[2],"%3d.%02d",sb[psb].price/100,sb[psb].price%100); j=0; k=nsta-1; while(j<=k) { l=(j+k)/2; if(tl[ptl].laststa<sta[l].no) k=l-1; else if(tl[ptl].laststa>sta[l].no) j=l+1; else break; } if(j>k) mvaddstr(row,col[3],""); else mvaddstr(row,col[3],sta[l].name); mvprintw(row,col[4],"%d",tl[ptl].nseat); mvprintw(row,col[5],"%d",tl[ptl].lseat); mvprintw(row,col[6],"%d",tl[ptl].gate); for(i=0;i<nmod&&tl[ptl].model!=mod[i].no;i++) ; if(i>=nmod) i=nmod-1; mvaddstr(row,col[7],mod[i].name); refresh();}void showtime(){ long tn; struct time t; tn=time(0); gettime(tn,&t); mvprintw(0,0,"%4d.%02d.%02d/%02d:%02d:%02d",t.year, t.month,t.mday,t.hour,t.minute,t.second); refresh();}int gettime(long tn,struct time *t){ int days,ydays; int TZ; char *tzs; int 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}; int 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++) { if(t->year%400==0||(t->year%4==0&&t->year%100!=0)) ydays=366; else ydays=365; days-=ydays; } 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 getdays(int date1,int date2){ int days; int 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}; int i; int dd1,dd2; int y1,y2,m1,m2,d1,d2; if(date1>date2) dd1=date2, dd2=date1; else if(date1<date2) dd1=date1, dd2=date2; else return 0; y1=dd1/10000, y2=dd2/10000; m1=dd1%10000/100, m2=dd2%10000/100; d1=dd1%100, d2=dd2%100; days=0; for(i=y1+1;i<y2;i++) if(i%400==0||(i%4==0&&i%100!=0)) days+=366; else days+=365; if(y1==y2) for(i=m1;i<m2;i++) if(y1%400==0||(y1%4==0&&y1%100!=0)) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; else { for(i=m1+1;i<=12;i++) if(y1%400==0||(y1%4==0&&y1%100!=0)) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; for(i=1;i<m2;i++) if(y2%400==0||(y2%4==0&&y2%100!=0)) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; } days-=d1; days+=d2; if(date1>date2) return -days; else return days;}showmsg(char s[]){ move(MSGROW,0); clrtoeol(); mvaddstr(MSGROW,40-strlen(s)/2,s); refresh(); printf("\7\7");}clrmsg(){ move(MSGROW,0); clrtoeol(); refresh();}clrin(){ move(INROW,0); clrtoeol(); refresh();}clrscr(){ int i; for(i=0;i<ROWS;i++) { move(ROW+i,0); clrtoeol(); } 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(); }}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(); }}getkey(){ char c,key; char keys[]={Up,Down,Right,Left,NONE,End,PgDn,Home, PgUp,NONE,NONE,Ins}; key=getch(); refresh(); if(key==0x1b) { alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } } return key;}sale(int pbus){ int ntic1,ntic2,ntic; int i,j,ptl,busno,num; char yn[10],s[80]; unsigned price,bprice,money=0; struct ticket *tic; struct ticketlib ticlib; long tn,tlsize=sizeof(struct ticketlib); struct time t; char fn[80]; int fd; if(nbus<=0) return -1; if(number<0) { showmsg("注意: 请在售票前先输入你所持车票的票号!"); return -1; } ntic1=1; do{ if(get_n(INROW,25,"全票张数: ",&ntic1,5)==-1) return -1; }while(ntic1<0); ntic2=0; do{ if(get_n(INROW,40,"半票张数: ",&ntic2,5)==-1) return -1; }while(ntic2<0); ntic=ntic1+ntic2; tic=(struct ticket *)malloc(ntic*sizeof(struct ticket)); if(tic==NULL) { showmsg("为售票数据分配内存出错!"); return -1; } ptl=bus[pbus].ptl; busno=tl[ptl].bus; price=sb[bus[pbus].psb].price; bprice=sb[bus[pbus].psb].bprice; sprintf(s,"敲'Y'键将打印车票, 其他键将取消售票!"); yn[0]='\0'; if(get_s(MSGROW,41-strlen(s)/2,s,yn,10)==-1) { free(tic); showmsg("请注意: 你取消了此次售票!"); return -1; } if(yn[0]!='y'&&yn[0]!='Y') { free(tic); return -1; }/* ntl=readtl(date); for(ptl=0;ptl<ntl&&tl[ptl].bus!=busno;ptl++) ; if(ptl>=ntl) { free(tic); return -1; }*//* 记录加锁 */ sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { free(tic); sprintf(s,"文件%s打开失败, 无法写入票库数据!",fn); showmsg(s); return -1; } do{ lseek(fd,(long)ptl*tlsize,0); if(lockf(fd,F_TLOCK,(long)tlsize)==0) break; }while(1); lseek(fd,(long)ptl*tlsize,0); read(fd,&ticlib,tlsize); if(tl[ptl].lseat<=0) { free(tic); close(fd); showmsg("注意: 该班车的票已售完!"); return -1; } if(ntic>ticlib.lseat) { free(tic); close(fd); sprintf(s,"对不起, 该车只有%d张票!",ticlib.lseat); return -1;/* sprintf(s,"注意: 该车只有%d张票, 你要这些票吗?(y/n): ", tl[ptl].lseat); showmsg(s); yn[0]='n', yn[1]='\0'; if(get_s(MSGROW,41+strlen(s)/2,"",yn,10)==-1) { free(tic); return -1; } else if(yn[0]!='y'&&yn[0]!='Y') { free(tic); return -1; } else ntic=tl[ptl].lseat;*/ } num=number; for(i=0;i<ntic;i++) { tic[i].bus=ticlib.bus; tic[i].sta=psta; tic[i].user=uno; if(i<ntic1) tic[i].flag=0; else tic[i].flag=1; tic[i].checkflag=0; tic[i].number=num; for(j=0;j<MAXSEAT&&j<ticlib.nseat;j++) if(ticlib.tab[j]==0) { tic[i].seat=j+1; /* if(checkbus(tl[ptl].bus)==0) */ /* { */ ticlib.lseat--; ticlib.tab[j]=1; /* } */ break; } if(tic[i].flag==0) tic[i].price=price; else tic[i].price=bprice; tic[i].ruser=-1; tic[i].rdate=0; tic[i].rtime=0; tic[i].rprice=0; tn=time(0); gettime(tn,&t); tic[i].date=t.year*10000+t.month*100+t.mday; tic[i].time=t.hour*100+t.minute; if(/* (checkbus(tl[ptl].bus)==0 */ /* && */ tic[i].date==date &&tic[i].time>=ticlib.time /*) ||(checkbus(tl[ptl].bus)==1 &&tic[i].time>=pretime)*/) { showmsg("该车发车时间已过, 不能再售票!"); free(tic); return -1; } num++; money+=tic[i].price; }/* if(writetl(tl,ptl)==-1) return -1;*/ lseek(fd,(long)ptl*tlsize,0); i=write(fd,(char *)&ticlib,tlsize); lseek(fd,(long)ptl*tlsize,0); lockf(fd,F_ULOCK,tlsize); close(fd); if(i!=tlsize) { showmsg("票库记录未正常写入, 售票失败!"); return -1; } if(writetic(tic,ntic)==-1) { showmsg("票库记录可能与售票记录不一致, 请核实!"); return -1; } if(writeud(tic,ntic)==-1) { showmsg("记录写入出现错误!"); return -1; } free(tic); if(i==-1) return -1; number=num; sprintf(s,"应收票款: %d.%02d(元)!",money/100,money%100); showmsg(s); getch(); refresh(); printtic(tic,ntic,ticlib); return money;}/*int writetl(struct ticketlib *tl,int ptl){ char fn[80]; int fd; char s[80]; sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { sprintf(s,"文件%s打开失败, 无法写入票库数据!",fn); showmsg(s); return -1; } do{ lseek(fd,(long)ptl*sizeof(struct ticketlib),0); if(lockf(fd,F_TLOCK,(long)sizeof(struct ticketlib))==0) break; }while(1); lseek(fd,(long)ptl*sizeof(struct ticketlib),0); write(fd,(char *)(tl+ptl),sizeof(struct ticketlib)); lseek(fd,(long)ptl*sizeof(struct ticketlib),0); lockf(fd,F_ULOCK,(long)sizeof(struct ticketlib)); close(fd); return 0;}*/int writetic(struct ticket *tic,int ntic){ char fn[80]; int fd; char s[80]; sprintf(fn,"%s/data/ticket/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { fd=open(fn,O_CREAT|O_RDWR); if(fd==-1) { sprintf(s,"文件%s打开失败, 无法写入售票数据!",fn); showmsg(s); return -1; } else chmod(fn,0666); } do{ lseek(fd,0L,2); if(lockf(fd,F_TLOCK,0L)==0) break; }while(1); lseek(fd,0L,2); write(fd,(char *)tic,ntic*sizeof(struct ticket)); lseek(fd,-(long)ntic*sizeof(struct ticket),2); lockf(fd,F_ULOCK,0L); close(fd); return 0;}int writeud(struct ticket *tic,int ntic){ struct userdata{ int user; int date; int bus; char flag; int time; int seat; int sta; int price; int fee; int rprice; unsigned number; }*ud; char fn[80]; int fd; char s[80]; int i,dd; long tn; struct time t; ud=(struct userdata *)malloc(ntic*sizeof(struct userdata)); if(ud==NULL) { showmsg("分配内存出错, 无法保存售票员数据!"); return; } for(i=0;i<ntic;i++) { ud[i].user=tic[i].user; ud[i].date=date; ud[i].bus=tic[i].bus; ud[i].flag=tic[i].flag; ud[i].time=tic[i].time; ud[i].seat=tic[i].seat; ud[i].sta=tic[i].sta; ud[i].price=tic[i].price; ud[i].fee=0; ud[i].rprice=0; ud[i].number=tic[i].number; } tn=time(0); gettime(tn,&t); dd=t.year*10000+t.month*100+t.mday; sprintf(fn,"%s/data/user/%d",RP,dd); fd=open(fn,O_RDWR|O_APPEND); if(fd==-1) { fd=open(fn,O_CREAT|O_RDWR); if(fd==-1) { sprintf(s,"文件%s打开失败, 无法写入售票员数据!",fn); showmsg(s); return -1; } else chmod(fn,0666); } while(lockf(fd,F_TLOCK,0L)!=0) ; write(fd,(char *)ud,ntic*sizeof(struct userdata)); lseek(fd,-(long)ntic*sizeof(struct userdata),2); lockf(fd,F_ULOCK,0L); close(fd); return 0;}int printtic(struct ticket tic[],int ntic,struct ticketlib tl){ int i,j; char s[20]; showmsg("正在打印车票, 请稍候..."); printf("%c{",0x1b); /* print "ESC {" */ for(i=0;i<ntic;i++) { for(j=0;j<nsta&&sta[j].no!=tic[i].sta;j++) ; if(j<nsta) strcpy(s,sta[j].name); else strcpy(s,"(None)"); printf("%17s%8d.%02d\n",s,tic[i].price/100,tic[i].price%100); printf("\n\n"); /* if(checkbus(tic[i].bus)==0) */ printf("%d.%02d.%02d%5d:%02d%8d%6d%5d\n",date/10000, date%10000/100,date%100, tl.time/100,tl.time%100,tic[i].bus, tic[i].seat,tl.gate); /* else printf("%d.%02d.%02d 本票%2d时%02d分前有效!%5d\n", date/10000,date%10000/100, date%100,pretime/100,pretime%100,tl.gate); */ printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); } printf("%c}",0x1b); return 0;}/*int checkbus(int busno){ int i; for(i=0;i<MAXBUS;i++) if(busno==prebus[i]) return 1; return 0;}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -