📄 jsprint.c
字号:
#include <string.h>#include <signal.h>#include <time.h>#include <ctype.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <pwd.h>#include <fcntl.h>#include <curses.h>#include <unistd.h>#define MAXSEAT 60#define ROWS 14#define ROW 5#define MSGROW 23#define BEGINYEAR 1970#define DSEC 86400#define HSEC 3600#define MSEC 60struct 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 time{ int second; int minute; int hour; int mday; int month; int year; int wday; int yday; long tseconds;};struct ticket{ int bus; int sta; unsigned user; char flag; int date; int time; char checkflag; unsigned number; int seat; unsigned price; int ruser; int rdate; int rtime; unsigned rprice;}tic; struct stadata{ int sta; char name[50]; int money; int count; int hmoney; int hcount; int bagmoney; int bagcount; int toacount; int toamoney;};struct owner{ int no; char name[50];};struct jsdata{ int user; int no; char name[50]; int bus; int time; struct stadata stadata[10];};struct buses{ int no; int time; int owner; int rate; int gate; int model; int nseat;};struct statobus{ int sta; int bus; unsigned price; unsigned bprice;};struct station{ int no; char code[5]; char name[10]; unsigned howfar;};struct baggage{ int bus; int seat; int sta; int user; int date; int time; char checkflag; char model; int npiece; int weight; unsigned price; unsigned lift; int ruser; int rdate; int rtime; unsigned rprice;};int uno,locate;char ucode[5],uname[10];struct passwd *upwd;char *RP;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 head[]="*** 打 印 结 算 单 ***";main(int argc,char *argv[]){ struct time t; long tn; int bn=0,busno,date; char c; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; uno=getuid(); upwd=getpwuid(uno); if(upwd==NULL) { printf("\n用户%s不存在!\n",uno); return -1; } else { strcpy(ucode,upwd->pw_name); strcpy(uname,upwd->pw_comment); } init(); tn=time(0); gettime(tn,&t); date=t.year*10000+t.month*100+t.mday; while(1) if(comm(date)==-2) break; sigignore(SIGALRM); erase(); refresh(); endwin(); return;}int comm(int date){ struct jsdata js; int busno; busno=getbus(date,&js); if(busno==-1) return -2; if(readtic(&js,date,busno)==-1) return -1; if(writestate(date,busno)==-1) return -1; print(js,date); return 0;} int getbus(int date,struct jsdata *jsd){ char c; int exit=0,busno=0,n; char ss[]="该班次已打印结算单, 要重打(y/n)? "; while(exit==0) { if(get_n(13,35,"班次:",&busno,10)==-1) return -1; else { n=readstate(date,busno,jsd); switch(n) { case -1: showmsg("该班次不存在,请重新输入!"); break; case 1: showmsg(ss); while(1) { move(MSGROW,41+strlen(ss)/2); refresh(); c=getkey(); if(c!=-1) break; } if(c=='y') exit=1; break; case 0: exit=1; break; case 2: showmsg("该班次还未检票!"); break; } } } return busno;} int readstate(int date,int no,struct jsdata *jsd){ char fn[80]; char errs[128]; int fd,i; long size,s; sprintf(fn,"%s/data/state/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s不存在!",fn); showmsg(errs); return fd; } size=sizeof(struct busstate); for(i=0;;i++) { s=read(fd,(char *)&bs,size); if(s!=size) { close(fd); return -1; } if(bs.bus==no) { jsd->bus=no; jsd->no=bs.owner; jsd->time=bs.time; break; } } locate=i; close(fd); if(bs.check==0) return 2; else if(bs.print!=0) return 1; else return 0;}init(){ int i; signal(SIGINT,SIG_IGN); initscr(); raw(); nonl(); noecho(); erase(); mvaddstr(10,40-strlen(head)/2,head); refresh();}int readtic(struct jsdata *jsd,int date,int bus){ char fn1[80],fn2[80],fn3[80],fn4[80],fn[80]; int fd1,fd2,fd3,fd4,fd; long s1,size1,s2,size2,s3,size3,s4,size4,s,size; int i,j,x,y,k; struct owner own; struct ticket tic; struct statobus rsta; struct baggage bag; struct station sta; char msg[80],name[80]; sprintf(fn2,"%s/bas/owner.dat",RP); fd2=open(fn2,O_RDONLY); if(fd2==-1) { showmsg("车主数据有错!"); return -1; } size2=sizeof(struct owner); while(1) { s2=read(fd2,(char *)&own,size2); if(s2!=size2) break; if(own.no==jsd->no) { strcpy(jsd->name,own.name); break; } } close(fd2); sprintf(fn,"%s/data/idex/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { showmsg("索引文件有错!"); return -1; } size=sizeof(struct statobus); for(i=0;i<10;i++) jsd->stadata[i].sta=-1; for(j=0;j<10;) { s=read(fd,(char *)&rsta,size); if(s!=size) break; if(rsta.bus==bus) { jsd->stadata[j].sta=rsta.sta; j=j+1; } } close(fd); sprintf(fn,"%s/bas/stas.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) return -1; size=sizeof(struct station); while(1) { s=read(fd,(char *)&sta,size); if(s!=size) break; for(j=0;j<10&&jsd->stadata[j].sta!=-1;j++) if(jsd->stadata[j].sta==sta.no) { strcpy(jsd->stadata[j].name,sta.name); break; } } close(fd); for(i=0;i<10;i++) { jsd->stadata[i].money=0; jsd->stadata[i].count=0; jsd->stadata[i].hmoney=0; jsd->stadata[i].hcount=0; jsd->stadata[i].bagmoney=0; jsd->stadata[i].bagcount=0; jsd->stadata[i].toamoney=0; jsd->stadata[i].toacount=0; } sprintf(fn1,"%s/data/ticket/%d",RP,date); fd1=open(fn1,O_RDONLY); if(fd1==-1) { showmsg("售票文件有错误!"); return -1; } size1=sizeof(struct ticket); for(k=0;k<MAXSEAT;) { s1=read(fd1,(char *)&tic,size1); if(s1!=size1) break; if(tic.bus!=bus||tic.ruser!=-1||tic.checkflag!=1) continue; for(j=0;jsd->stadata[j].sta!=-1&&j<10;j++) if(tic.sta==jsd->stadata[j].sta) { if(tic.flag==0) { jsd->stadata[j].money+=tic.price-250; jsd->stadata[j].count++; } else { jsd->stadata[j].hmoney+=tic.price-250; jsd->stadata[j].hcount++; } k=k+1; break; } } close(fd1); sprintf(fn4,"%s/data/baggage/%d",RP,date); fd4=open(fn4,O_RDONLY); if(fd4!=-1) { size4=sizeof(struct baggage); for(k=0;k<MAXSEAT;) { s4=read(fd4,(char *)&bag,size4); if(s4!=size4) break; if(bag.bus!=bus||bag.ruser!=-1/*||bag.checkflag==0*/) continue; for(j=0;j<10&&jsd->stadata[j].sta!=-1;j++) if(jsd->stadata[j].sta==bag.sta) { jsd->stadata[j].bagmoney+=bag.price; jsd->stadata[j].bagcount+=bag.npiece; k++; break; } } close(fd4); } for(i=0;i<10&&jsd->stadata[i].sta!=-1;i++) { jsd->stadata[i].toamoney=jsd->stadata[i].money +jsd->stadata[i].hmoney +jsd->stadata[i].bagmoney; jsd->stadata[i].toacount=jsd->stadata[i].count +jsd->stadata[i].hcount; }}int writestate(int date,int busno){ char fn[80]; int fd; long size; long tn; struct time t; size=sizeof(struct busstate); tn=time(0); gettime(tn,&t); bs.printtime=t.hour*100+t.minute; bs.print=1; bs.printuser=uno; sprintf(fn,"%s/data/state/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { showmsg("无法将数据写入状态数据文件, 请排除故障后重新结算!"); return -1; } lseek(fd,(long)(locate*size),0); lockf(fd,F_LOCK,size); write(fd,(char *)&bs,size); close(fd); return 0;}print(struct jsdata jsd,int date){ int z; int total[9],i; for(i=0;i<9;i++) total[i]=0; for(i=0;i<10&&jsd.stadata[i].sta!=-1;i++) { total[0]+=jsd.stadata[i].toacount; total[1]+=jsd.stadata[i].toamoney; total[2]+=jsd.stadata[i].count; total[3]+=jsd.stadata[i].money; total[4]+=jsd.stadata[i].hcount; total[5]+=jsd.stadata[i].hmoney; total[6]+=jsd.stadata[i].bagcount; total[7]+=jsd.stadata[i].bagmoney; } total[8]=total[0]*250; printf("%c{",0x1b); printf("%13d%32s%14d%17d年%2d月%2d日%4d:%02d",jsd.no,jsd.name,jsd.bus, date/10000,date/100%100,date%100,jsd.time/100,jsd.time%100); printf("\n\n\n\n\n"); for(z=0;z<10&&jsd.stadata[z].sta!=-1;z++) { printf("\n\r%9s%5d%7d.%02d",jsd.stadata[z].name, jsd.stadata[z].toacount,jsd.stadata[z].toamoney/100, jsd.stadata[z].toamoney%100); printf("%6d%7d.%02d",jsd.stadata[z].count, jsd.stadata[z].money/100,jsd.stadata[z].money%100); printf("%6d%7d.%02d",jsd.stadata[z].hcount, jsd.stadata[z].hmoney/100,jsd.stadata[z].hmoney%100); printf("%6d%7d.%02d",jsd.stadata[z].bagcount, jsd.stadata[z].bagmoney/100, jsd.stadata[z].bagmoney%100); printf("%7d.%02d\n\r",jsd.stadata[z].toacount*250/100, jsd.stadata[z].toacount*250%100); } for(;z<10;z++) printf("\n\n"); printf("\n%14d%7d.%02d",total[0],total[1]/100,total[1]%100); printf("%6d%7d.%02d",total[2],total[3]/100,total[3]%100); printf("%6d%7d.%02d",total[4],total[5]/100,total[5]%100); printf("%6d%7d.%02d",total[6],total[7]/100,total[7]%100); printf("%7d.%02d",total[8]/100,total[8]%100); printf("\n\n\n\n\n\n\n"); printf("%c}",0x1b);}showmsg(char s[]){ move(MSGROW,0); clrtoeol(); mvaddstr(MSGROW,40-strlen(s)/2,s); refresh(); printf("\7\7");}clrmsg(){ move(MSGROW,0); clrtoeol(); refresh();}getkey(){ char c,key; char keys[]={Up,Down,Right,Left,NONE,End,PgDn,Home, PgUp,NONE,NONE,Ins}; void showtime(); sigset(SIGALRM,showtime); alarm(1); key=getch(); refresh(); if(key==0x1b) { alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } } sigignore(SIGALRM); return key;}int get_n(int y,int x,char *prompt,int *n,int b){ char c,ss[128]; int i; sprintf(ss,"%d",*n); for(i=strlen(ss);i<b-1;i++) ss[i]=' '; ss[b-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,ss); refresh(); i=0; while(1) { move(y,x+i); refresh(); alarm(1); 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) *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; ss[i]='\0'; break; default: printf("\7\7"); break; } mvaddstr(y,x,ss); 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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -