📄 sale.bak
字号:
tp->dat = price;
x=3;
continue;
}
price = tp->dat; //获得价格
tp = &WinDat[3][2];
if(tp->dat==0 || tp->dat>WareMaxNum)
{
if(tp->dat>WareMaxNum)Hint(16,16,"超出最大数量限制!",3);
if(tp->dat==0)Hint(16,48,"数量不能为0!",3);
tp->dat = num;
x=4;
continue;
}
num = tp->dat; //获得数量
tp = &WareList[m][2];
tp->dat = price; //商品价格
tp = &WareList[m][6];
tp->dat = num; //商品数量
Hint(16,32,"修改成功!",3);
break;
}
}
}
}
}
uchar FindIndex(uchar m)
{
uchar i,k;
for(i=0;i<6;i++)
{
if(m==WareClassStat[5*i])
{
k=i*5+1;
return k;
}
}
return 0xFF;
}
void ClassStat(ulong per,bit xp,bit hp)
{//per:金额或是百分比; xp=0:打折-1:加费; hp=0:金额-1:百分比
ulong tp,wc;
uchar i,j,k;
gyt4 *wp;
// float x1,x2,x3;
// if(hp==0)
// x2 = WareTotalPrice;
wc = per;
for(k=0;k<WareClass;k++)
{
j = WareList[k][10];
i=FindIndex(j);
if(i==0xFF)
ErrorHint("税种税目索引号出错!",0x3003);
wp=&WareClassStat[i]; //分类统计金额累加
if(wp->dat!=0)
{
if(hp==1)
{
tp = (wp->dat*per)/100;
if(xp)
{
wp->dat += tp;
WareTotalPrice += tp;
Surcharge += tp;
}
else
{
wp->dat -= tp;
WareTotalPrice -= tp;
Discount += tp;
}
}
else
{
tp = wp->dat*per/WareTotalPrice;
if(xp)
{
if(wp->dat>wc){wp->dat += wc;break;}
wp->dat += tp;
}
else
{
if(wp->dat>wc){wp->dat -= wc;break;}
wp->dat -= tp;
}
wc -=tp;
}
}
}
if(hp==0)
{
if(xp==1)
{
WareTotalPrice+=per;
Surcharge += per;
}
else
{
Discount += per;
WareTotalPrice-=per;
}
}
}
uchar WaitKey(uchar ln, uchar col)
{
uchar val=0xFF,tp[2];
uint cursordelay = 0;
bit flg = 1;
tp[1]=0;
while(val==0xFF)
{
val = GetKey();
if(RxdFlg==1)return 0;
cursordelay++;
if(cursordelay>CursorTime) //光标显示
{
cursordelay = 0;
if(flg) tp[0]='_';
else tp[0]=' ';
LcdDisplay(ln,col,tp,0);
flg = ~flg;
}
}
return val;
}
void AmendPrice(uchar f,uchar t,ulong price)
{//f=1:加费;f=0:打折; t=0:单个商品操作;t=1:对已经输入商品全体操作
uchar k,tag,str[25];
uint n;
bit m;
ulong tp,xp;
gyt4 *hp;
if((PluPress==0) && (ItemPress==0) || (NumberPress))
// if((PluPress==0) && (ItemPress==0))
{//是否按了数量键后就不能打折、加费
Beep(400);
return;
}
if(t==1)
{//对已经输入商品全体操作
if((TotalAbate && f==0) || (TotalExcess && f==1))
{
//提示
Beep(400);
return;
}
}
else
{//对单个商品操作
if((f==0 && AbatePress) || (f==1 && ExcessPress))
{//如果已经加收费用或者打折了,就不允许进行同样的操作
//提示
Beep(400);
return;
}
}
tag=0;
memset(str,0,sizeof(str));
if(t==0)
strcpy(str,"本商品价格:");
else
strcpy(str,"商品总价格:");
NumToStr(price,&str[11],SwitchFloat);
LcdDisplay(0,0,str,3); //是否需要滚动条,需要的话就要更新滚动条
if(f)LcdDisplay(16,0,"加费金额:",0);
else LcdDisplay(16,0,"打折金额:",0);
while(1)
{
k=WaitKey(16,72);//应该加光标提示
switch(k)
{
case K_BF :
while(1)
{
if(f)
LcdDisplay(16,0,"加费百分比:",1);
else
LcdDisplay(16,0,"打折百分比:",1);
str[0]=0;
tp=GetInt(16,88,0,2,0,str);
if(str[0] == K_TC)return;
if(tp!=0)
{
if(tp<=100 && f==1)break;
if(tp<100 && f==0)break;
}
if(f==1)
LcdDisplay(32,32,"0< 加费百分比 <=100",1);
else
LcdDisplay(32,32,"0< 打折百分比 <100",1);
Beep(400);
}
m=1;tag=1;
break;
case K_0 : //此处输入0,在GetFloat()中不会显示出来
case K_1 :
case K_2 :
case K_3 :
case K_4 :
case K_5 :
case K_6 :
case K_7 :
case K_8 :
case K_9 : k=KeyDat(k);n=k*100;
while(1)
{
str[0]=0;
tp=GetFloat(16,72,n,6,str);
if(str[0] == K_TC)return;
if(t==0)
{
if(tp<price && f==0)break;
if(tp<=price && f==1)break;
}
if(tp<WareTotalPrice && t==1)break;
if(f)
LcdDisplay(32,0,"加费金额 <= 商品价格!",1);
else
LcdDisplay(32,0,"打折金额 < 商品价格!",1);
k=0;
Beep(400);
}
m=0;tag=1;
break;
case K_TC : return; //强制退出
default : Beep(400); break;
}
if(tag!=0)break;
}
if(t)
{
ClassStat(tp,f,m);
if(f)
{
SetTotalExcess;
}
else
{
SetTotalAbate;
}
NumToStr(WareTotalPrice,&WinHint[1][6],SwitchFloat);
}
else
{
if(f)
{
if(m==1)
{
xp = price * (100+tp);
price = xp/100;
}
else
price += tp;
SetExcess;
}
else
{
if(m==1)
{
xp = price * (100-tp);
price = xp/100;
}
else
price -= tp;
SetAbate;
}
hp = &WinDat[2][2];
hp->dat = price;
}
ClrAbate;
ClrExcess;
// ClrTotalAbate;
// ClrTotalExcess;
}
uchar SaleWare(uchar xm)
{
uchar key[40],k,n,taxindex;
ulong adr,warenum;
uint no;
gyt4 price,*tp;
gyt2 *hp;
if(WareClass>=ClassMaxNum)
{//一次可以输入商品种类的最大值
return K_XJ;
}
SetSale;
ClrAbate;
ClrExcess;
WindowsSet(5);
if(xm==0)
{//PLU
if(WareNo==0)
{
Hint(16,0,"没有对应的商品信息!",3);
return 0;
}
strcpy(&WinHint[0][1],"PLU:");
NumToStr(WareNo,&WinHint[0][5],SwitchInt);
adr=WareAdr+39*(WareNo-1);
SetPlu;
}
else
{//项目
if(ItemShift){WareNo=xm+25+0xFF00;ClrShift;}
else WareNo=xm+0xFF00;
//如果项目数量不足50,应该与PLU做相同处理
no=WareNo&0x00FF;
strcpy(&WinHint[0][1],"项目:");
NumToStr(no,&WinHint[0][6],0);
adr=ItemAdr+33*(no-1);
SetItem;
}
strcpy(&WinHint[1][1],"名称:");
SerialFlashRead(FlashDat,adr,16,&WinHint[1][6]);
SerialFlashRead(FlashDat,adr+32,1,&taxindex);
SerialFlashRead(FlashDat,adr+20,4,price.str);
strcpy(&WinHint[2][1],"价格:");
tp = &WinDat[2][2];
tp->dat = price.dat;
WinDat[2][0]=8;WinDat[2][1]=8;
warenum=100;
strcpy(&WinHint[3][1],"数量:");
tp = &WinDat[3][2];
tp->dat = warenum;
WinDat[3][0]=8;WinDat[3][1]=6;
strcpy(&WinHint[4][1],"税种税目索引号:");
WinHint[4][16]=taxindex+'0';
WinHint[4][17]=0;
n=3;
while(1)
{
memset(key,0,sizeof(key));
SetKey(key);
k=Windows(n,1,key);
tp = &WinDat[2][2];
if(tp->dat==0)
{//价格不能为0 是否要限制最大价格?
Hint(16,48,"价格不能为0!",3);
tp->dat = price.dat;
n=3;
continue;
}
price.dat = tp->dat;
tp = &WinDat[3][2];
if(tp->dat==0 || tp->dat>WareMaxNum)
{//数量不能为0,最大数量限制
if(tp->dat>WareMaxNum)Hint(16,16,"超出最大数量限制!",3);
if(tp->dat==0)Hint(16,48,"数量不能为0!",3);
tp->dat = 100;
n=4;
continue;
}
warenum = tp->dat;
if(k==0xF0)break; //扫描仪输入返回
if(k==K_SL)
{//如果按“数量”键修改数量,就清除原有数量,等待输入
n=4;
tp->dat = 0;
continue;
}
if(k == K_DZ || k == K_JF)
{
if(k == K_DZ)k=0;
if(k == K_JF)k=1;
AmendPrice(k,0,price.dat);
tp = &WinDat[2][2];
price.dat = tp->dat; //打折之后是否保留原始价格?
continue;
}
break;
}
tp = &WinDat[2][2];
price.dat = tp->dat;
tp = &WinDat[3][2];
warenum = tp->dat; //获得数量
hp = &WareList[WareClass][0];
hp->dat = WareNo; //商品编号
tp = &WareList[WareClass][2];
tp->dat = price.dat; //商品价格
tp = &WareList[WareClass][6];
tp->dat = warenum; //商品数量
WareList[WareClass][10]=taxindex;
WareClass++;
if(WareClass>=ClassMaxNum) //一张发票可以打印的最大的商品种类
{
return K_XJ;
}
return k;
}
uchar DailyDatCheck()
{
gyt2 wp;
I2cRead(DailyDatNum,2,wp.str);
if(wp.dat>=DailyTradeMax)
{//日交易存储器写满后禁止继续销售和日交易签名,开发票前也必须检测
LcdDisplay(16,0,"日交易存储器已满,",3);
Hint(16,32,"禁止销售!",0);
return 0;
}
return 1;
}
uchar DeadlineCheck()
{//检测是否已经到开票截止日期,是就禁止销售
gyt4 *xp,hp;
uchar dat;
ReadDate();
xp=&InvoDate[0];
I2cRead(InvoiceEndData,4,hp.str);
if(hp.dat==xp->dat)
{
dat=0x03;
I2cWrite(MacState,1,&dat);
LcdDisplay(16,0,"开票截止日期已到,",3);
Hint(16,32,"禁止销售!",0);
return 0;
}
else return 1;
}
void DailyDatAddUp()
{//当天交易数据累加
gyt4 *xp,*fp;
gyt2 *kp;
uchar i,k,tp[66];
I2cRead(IntradayTime,64,tp);
if(InvoiceFlg==2)
{//输入的是退票
k=40;
kp=&tp[6];
}
else
{//输入的是正常发票,(InvoiceFlg==1)
k=16;
kp=&tp[4];
}
for(i=0;i<6;i++)
{//累加正常发票或退票分类累计金额
xp=&tp[k+i*4];
fp=&WareClassStat[i*5+1];
xp->dat += fp->dat;
fp->dat = 0; //清零WareClassStat
}
kp->dat += 1; //累加当天正常发票份数、退票份数
I2cWrite(IntradayTime,64,tp);
}
void InvoiceStorage(uchar *fcode)
{
uchar i,str[30];
ulong adr,gs;
uint adr1,adr2,adr3;
gyt2 hp;
gyt4 *fp,xp;
//-----------------------------------------------------
//发票打印数据存储
for(i=0;i<4;i++)str[i]=InvoDate[i]; //开票日期 4 BCD
fp=&str[4];
fp->dat=CurInvoNo; //发票号(打印) 4
str[8]=InvoiceFlg; //发票类型 1 HEX
fp=&str[9];
fp->dat = WareTotalPrice; //开票总金额 4
for(i=0;i<8;i++)
str[13+i] = fcode[i]; //税控码 8
if(InvoiceFlg==1)UntreadCode.dat=0; //原发票号 4
fp=&str[21];
fp->dat = UntreadCode.dat;
str[25]=0;str[26]=0; //保留2字节
I2cRead(InvoPrintNum,2,hp.str);
gs = hp.dat;
if(gs > 38836)
{//掉电保护处理:擦除过程必须加掉电检测,如果掉电,退出擦除程序,
//将发票打印数据存入24C64的缓冲区,并设置标志位,继续处理其它流程,下一次开机时处理
//但是如果下一次开机时又掉电如何处理?
#if FlashInvoM25P80
SerialFlashBulkErase(FlashInvo);
#endif
adr=InvoPrintDat;
hp.dat=0;
}
else
adr=InvoPrintDat+ gs*27;
SerialFlashWrite(FlashInvo,adr,27,str); //写入发票打印数据存储器
hp.dat+=1;
I2cWrite(InvoPrintNum,2,hp.str);
//-----------------------------------------------------
if(InvoiceFlg==1)
{ //累加单卷发票使用汇总数据缓冲区
adr1=TomeNum1; //正常发票份数
adr2=TomeStat; //正常发票总金额
adr3=DecAddUp; //一个报税周期内的销售累计金额
}
else
{ //累加单卷发票使用汇总数据缓冲区
adr1=TomeNum2; //退票份数
adr2=TomeUntread; //退票总金额
adr3=DecUntread; //一个报税周期内的退票累计金额
}
I2cRead(adr1,1,str);
str[0]+=1;
I2cWrite(adr1,1,str);
I2cRead(adr2,4,xp.str);
xp.dat+=WareTotalPrice;
I2cWrite(adr2,4,xp.str);
I2cRead(adr3,4,xp.str);
xp.dat+=WareTotalPrice;
I2cWrite(adr3,4,xp.str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -