📄 sale.bak
字号:
break;
}
// if(k == K_DZ || k == K_JF)
// {
// if(k == K_DZ)k=0;
// if(k == K_JF)k=1;
// AmendPrice(k,1,WareTotalPrice);
// k=0;
// continue;
// }
if(k == K_HJ)
{
NumToStr(WareTotalPrice,&WinHint[2][6],1);
LcdDisplay(32,0,&WinHint[2][1],1); //显示现金
LcdDisplay(48,0,"找钱:0",1); //显示找钱
VfdShowPrice(0); //VFD显示找钱
break;
}
Beep(400);
k=0xF0;
}
if(FiscalIdentify(1)!=1)
{
LcdDisplay(48,0,"按任意键继续!",0);
KeyScan();
return 0;
}
DataDispose();
k=SaleEnd();
SimDeactive(0);
return k;
}
void GetPlu(uchar n)
{//条形码如何处理
gyt2 tp;//xp;
uchar str[25],temp[2];
I2cRead(PluNumber,2,tp.str);
memset(str,0,sizeof(str));
strcpy(str,"PLU最大编号为:");
NumToStr(tp.dat,&str[14],0);
LcdDisplay(32,0,"PLU:",n);
if(n==3)LcdDisplay(16,0,"请输入商品编号:",0);
while(1)
{
temp[0]=0;
WareNo=GetInt(32,32,0,5,0,temp);
if(temp[0] == K_TC){WareNo=0;return;}
if(WareNo>0 && WareNo<=tp.dat)break;
if(WareNo==0)
LcdDisplay(48,0,"PLU编号不能为0!",1);
if(WareNo>tp.dat)
LcdDisplay(48,0,str,1);
LcdDisplay(32,0,"PLU:",1);
}
}
uchar VerifyBossPwd()
{//管理员密码验证
ulong pwd;
gyt4 hp;
uchar tp[2]={0,0};
I2cRead(BossPwd,4,hp.str);
while(1)
{
LcdDisplay(16,0,"管理员密码:",3);
tp[0]=0;
pwd=GetInt(16,88,0,18,1,tp);
if(tp[0]==K_TC)return 0;
if(pwd==hp.dat)return 1;
Hint(48,0,"密码错误,请重新输入!",0);
Beep(400);
}
}
uchar InvalidatedTicket(ulong no)
{
uchar num,i;
uint adr;
gyt4 tp;
I2cRead(UntreadNum,1,&num);
for(i=0;i<num;i++)
{
adr = i*4 + UntreadAdr;
I2cRead(adr,4,tp.str);
if(no==tp.dat)
return 1;
}
return 0;
}
uchar UntreadCheck(ulong x)
{//已经退票和废票的发票不能再做退票处理,发票打印数据中没有分税率统计金额,无法自动退票
uchar str[27];
uint i;
ulong adr;
gyt4 *xp,*tp;
gyt2 num;
adr=4+InvoPrintDat;
I2cRead(InvoPrintNum,2,num.str);
xp=&str[0];
tp=&str[17];
for(i=0;i<num.dat;i++)
{
SerialFlashRead(FlashInvo,adr,21,str);
if(str[4]!=1)
{
if(xp->dat==x)return 3; //已经作废
if(tp->dat==x)return 2; //已经退过
}
adr += 27;
}
return 1;
}
uchar BlankOutInvoice()
{
uchar k,i,str[50],fiscalcode[10];
gyt4 *fp,*wp;
gyt2 xp,hp;
uint adr;
ulong fpadr,gs;
if(DailyDatCheck()==0)return 0;
if(DeadlineCheck()==0)return 0;
if(InvoiceFlg!=1)
{
Beep(400);
return 0;
}
if(VerifyBossPwd()==0)return 0;
if(FiscalIdentify(1)!=1)
{
LcdDisplay(48,0,"按任意键继续!",0);
KeyScan();
return 0;
}
memset(str,0,sizeof(str));
WindowsSet(2);
strcpy(&WinHint[0][1],"1.退票");
strcpy(&WinHint[1][1],"2.废票");
str[0]=K_HJ;
str[1]=K_TC;
str[2]=0;
while(1)
{
k=Windows(1,0,str);
if(str[0]==K_TC)return 0;
if(k==1 || k==2)break;
}
if(k==1)
{
InvoiceFlg=2;
LcdDisplay(0,0,"退货发票的发票号:",3);
LcdDisplay(48,32,"(退货状态)",1);
while(1)
{
LcdDisplay(16,0,"->",1);
str[0]=0;
UntreadCode.dat=GetInt(16,16,0,9,0,str);
if(str[0]==K_TC)
{
InvoiceFlg=1;
return 0;
}
if(UntreadCode.dat==0)continue;
i=UntreadCheck(UntreadCode.dat);
if(i==1)break;
if(i==2)LcdDisplay(32,0,"本发票已经做过退票处理!",1);
else LcdDisplay(32,0,"本发票已经作废!",1);
}
//---------------------------------------------------------------
//在发票存储器中查找对应数据,找到就自动开票,否则要求手动输入
//发票打印数据中没有分类金额,如何处理?
// LcdDisplay(0,0,"查找对应的发票明细...",3);
// fpadr=InvoPrintDat;
// I2cRead(InvoPrintNum,2,hp.str);
// for(num=0;num<hp.dat;num++)
// {
// SerialFlashRead(FlashInvo,fpadr,27,str);
// fp=&str[4]; //发票号
// if(fp->dat==UntreadCode.dat && str[8]==1)
// {//正常发票才能退
// wp=&str[9];
// WareTotalPrice=wp->dat;
// n=WareTotalPrice;
// m=WareTotalPrice/6;
// for(i=0;i<6;i++)
// {
// wp=&WareClassStat[i*5+1];
// if(i<5)
// {//暂定退票金额平均分配给每种税率
// wp->dat=m;
// n-=m;
// }
// else wp->dat=n;
// }
// if(PwrFlg!=0)while(1);
// DataDispose();
// if(SaleEnd()==0)return 2;
// LcdDisplay(16,0,"找到对应的发票明细",0);
// Hint(32,0,"已经将发票做退票处理!",0);
// return 1;
// }
// else fpadr+=27;
// }
//---------------------------------------------------------------
// LcdDisplay(16,0,"没有存储对应数据",0);
Hint(32,0,"请输入退货发票明细:",0);
return 1;
}
else
{
#if DebugSim
AutoDailySign();
#endif
I2cRead(InvoiceNo,8,fiscalcode);
wp=&fiscalcode[0];
fp=&fiscalcode[4];
CurInvoNo=wp->dat;
while(1)
{
LcdDisplay(0,0,"作废发票的发票号:",3);
while(1)
{
LcdDisplay(16,0,"->",1);
str[0]=0;
UntreadCode.dat=GetInt(16,16,0,9,0,str);
if(str[0]==K_TC)return 0;
if(UntreadCode.dat!=0)break;
}
//判断发票号是否合法
if(InvalidatedTicket(UntreadCode.dat)==1)
{
LcdDisplay(0,0,"此发票号已经作废,",3);
LcdDisplay(16,16,"不能再次作废!",0);
LcdDisplay(32,8,"<按任意键继续>",0);
KeyScan();
continue;
}
if(UntreadCode.dat>fp->dat || UntreadCode.dat<wp->dat)
{
LcdDisplay(16,0,"您输入的发票号不存在!",3);
LcdDisplay(32,24,"<按任意键继续>",0);
KeyScan();
continue;
}
break;
}
memset(str,0,sizeof(str));
ReadDate();
fp=&str[0];
wp=&InvoDate[0];
fp->dat=wp->dat; //开票日期 4 BCD
str[4]=3; //发票类型:废票
fp=&str[5];
fp->dat=UntreadCode.dat; //发票号
//分类金额为0,总金额为0
I2cRead(InvoPrintNum,2,hp.str);
gs = hp.dat;
if(gs > 38836)
{
#if FlashInvoM25P80
SerialFlashBulkErase(FlashInvo);//如果掉电如何处理
#endif
fpadr=InvoPrintDat;
hp.dat=0;
}
else
fpadr=InvoPrintDat+(hp.dat)*27;
#if DebugSim
if(PwrFlg!=0)
PowerOffHint(" ","发票尚未作废!",0xAA);
IssueInvoice(str);
#endif
for(i=0;i<8;i++)fiscalcode[i]=str[i];
//-----------------------------------------------------------------
//作废发票号处理
I2cRead(UntreadNum,1,str);
adr = str[0]*4+UntreadAdr;
I2cWrite(adr,4,UntreadCode.str); //记录作废发票号
str[0]+=1; //累加本卷发票作废发票数量 1
I2cWrite(UntreadNum,1,str);
I2cRead(TomeNum3,1,str);
str[0]+=1; //累加单卷发票使用汇总数据缓冲区废票份数 1
I2cWrite(TomeNum3,1,str);
I2cRead(IntradayInvalid,2,xp.str);
xp.dat+=1; //累加当天废票份数 2
I2cWrite(IntradayInvalid,2,xp.str);
//-----------------------------------------------------------------
//写入发票打印数据存储器
memset(str,0,sizeof(str));
fp=&str[0];
wp=&InvoDate[0];
fp->dat=wp->dat; //开票日期 4 BCD
fp=&str[4];
fp->dat=UntreadCode.dat; //发票号
str[8]=3; //发票类型 1 HEX
//总金额为0
for(i=0;i<8;i++)
str[13+i] = fiscalcode[i]; //税控码
//其它为0
SerialFlashWrite(FlashInvo,fpadr,27,str);
hp.dat+=1;
I2cWrite(InvoPrintNum,2,hp.str);
//-----------------------------------------------------------------
InvoNoInc(UntreadCode.dat,0);
//-----------------------------------------------------------------
if(PwrFlg!=0)
PowerOffHint(" ","已经完成废票处理!",0x55);
Hint(48,0,"操作成功!",1);
//-----------------------------------------------------------------
while(1)
{
i=InvoiceCheck(1);
if(i==1)break;
if(i==0 || i==2)return 2;
Hint(16,0,"没录入发票,不能销售!",3);
}
//-----------------------------------------------------------------
LcdDisplay(0,0,"需要进纸到下一张发票吗?",3);
LcdDisplay(16,0,"--按<确认>键进纸",0);
LcdDisplay(32,0,"--按其它键不进纸",1);
if(KeyScan()==K_HJ)
{
I2cRead(BlackFlg,1,str);
if(str[0]==1)
BlackOrientation();
}
return 1;
}
}
void FindBar(uchar *ascii)
{
gyt2 *fp,*hp,num;
gyt4 *xp,*tp;
uint i;
ulong adr;
uchar bar[15],tmp[15];
WareNo = 0;
StrToBar(ascii,bar);
fp=bar;
xp = &bar[2];
I2cRead(PluNumber,2,num.str);
adr=WareBarCode;
for(i=0;i<num.dat;i++)
{
SerialFlashRead(FlashDat,adr,6,tmp);
hp = tmp;
tp = &tmp[2];
if(fp->dat==hp->dat && xp->dat==tp->dat)
{
WareNo = i+1;
return;
}
adr+=39;
}
}
uchar GetBar()
{
uchar i,j,k,bcd[15],str[15],temp[2];
while(1)
{
temp[0]=0;
memset(bcd,0,sizeof(bcd));
LcdDisplay(32,0,"条形码:",1);
k=GetBcd(32,56,bcd,13,temp);
// UartTxd(7,bcd);
if(k==K_TC)return 0;
if(k==K_HJ)
{
if(bcd[0]!=0)
break;
LcdDisplay(48,0,"条形码必须是13位!",1);
}
}
k=bcd[0]&0x0F;
str[0]='0'+k; //条形码是13位10进制数,存储为BCD格式时最高位是0
i=1,j=1; //转换为字符串时应该将最高位的0去掉
while(i<7)
{
k=bcd[i]>>4;
str[j]=k+'0';
j++;
k=bcd[i]&0x0F;
str[j]=k+'0';
j++;
i++;
}
str[j]=0;
FindBar(str);
return 1;
}
void Sale()
{
uchar i,k,j;
uchar const str[]={
K_XM1,K_XM2,K_XM3,K_XM4,K_XM5,K_XM6,K_XM7,K_XM8,K_XM9,
K_XM10,K_XM11,K_XM12,K_XM13,K_XM14,K_XM15,K_XM16,K_XM17,
K_XM18,K_XM19,K_XM20,K_XM21,K_XM22,K_XM23,K_XM24,K_XM25};
memset(WareList,0,sizeof(WareList));
SetIndex();
//清零各个标志位
WareTotalPrice=0;
WareClass=0;
InvoiceFlg=1;
SaleFlag=0;
Surcharge=0;
Discount=0;
UntreadCode.dat=0;
k=0;
while(1)
{
if(k==0 || k==K_HD || k==K_PLU || k==K_TM)
{
if(InvoiceFlg==2)LcdDisplay(0,0,"退票状态...",4);
else LcdDisplay(0,0,"销售状态...",4);
LcdDisplay(16,0,"请输入商品编号:",4);
if(ItemShift)
LcdDisplay(32,0,"项目换档状态:",4);
else
LcdDisplay(32,0," ",4);
LcdDisplay(48,0,"(项目1-25,换档,PLU)",4);
if(k==0)
{
ScanerIni();
j=0;
if(ItemShift)j=104;
k=WaitKey(32,j);
if(RxdFlg!=0)
{
RxdFlg=0;
IEA &= 0xEF; //关UART2中断,ES2 = 0;
FindBar(&RxdBuf[200]);
k=SaleWare(0);
}
}
}
i=0;
for(j=0;j<25;j++)
{
if(k==str[j])
{
k=SaleWare(j+1);
i=1;
}
}
if(i==1)continue;
switch(k)
{
case 0xF0 : if(WareClass>=ClassMaxNum)
{//一次可以输入商品种类的最大值
k = K_XJ;
break;
}
FindBar(&RxdBuf[200]);
k=SaleWare(0);
break;
case K_TC : return;
case K_PLU : if(WareClass>=ClassMaxNum)
{//一次可以输入商品种类的最大值
k = K_XJ;
break;
}
GetPlu(1);
if(WareNo==0)
{
k=0;
break;
}
k=SaleWare(0);
break;
case K_TM : if(WareClass>=ClassMaxNum)
{//一次可以输入商品种类的最大值
k = K_XJ;
break;
}
k=GetBar();
if(k==0)break;
k=SaleWare(0);
break;
case K_HD : if(WareClass>=ClassMaxNum)
{//一次可以输入商品种类的最大值
k = K_XJ;
break;
}
if(!ItemShift)
{
LcdDisplay(32,0,"项目换档状态:",4);
SetShift;
k=WaitKey(32,104);
}
else
{
LcdDisplay(32,0," ",4);
ClrShift;
k=WaitKey(32,0);
}
break;
case K_JZ : PaperControl(1,16);k=0; break;
case K_TZ : PaperControl(0,16);k=0; break;
case K_CX : SaleQuery();
k=0; break;
case K_XJ : if(SubTotal()==0)return;
//没有录入发票或超出金额限额,退出销售状态
k=0; break;
case K_BZ : Hint(16,0,"帮助文档!",3);
k=0;
break;
case K_TH: if(BeginSale)
{
Beep(400);
k=0;
break;
}
k=BlankOutInvoice();
if(k==2)return; //没有录入发票,退出销售状态
k=0; break;
default : k=0;Beep(400); break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -