📄 report2.c
字号:
/*
* Copyright (c) 2004,成都港顺科技发展有限公司
* All rights reserved.
*
* 编 译 器:Keil:C Compiler:7.20;Assembler:7.10
* 工程名称:POS-Test.UV2
* 文件名称:ReportPrint.C
* 摘 要:表报打印
*
* 单 片 机:uPSD3254
* 当前版本:0.4
* 作 者:雍继兵
* 完成日期:2004-12-7 14:45
*/
#include "Main.h"
#include "Report.h"
#define useinfo 1 //测试时使用 在实际使用时将此置为0
/*-----------------------------------------------------------------------------------
日交易数据在LCD上显示打印
disHead = 0:不显示提示语
disHead = 1:显示提示语
disHead = 2:不打印报表头
disHead = 3:打印报表头
-----------------------------------------------------------------------------------*/
uchar DayCollDataDisplay(uchar disHead,uchar *InputDayData)
{
uchar i=0,j=0,InitVal[3],str[30],PrintBuf[50],time[10];
gyt2 *Npm;
gyt4 *Ipt;
ulong delay = 0xffff;
Itarr(InitVal);
if(disHead == 1)
DisHint("指定时间段内的","<<日交易数据>>汇总报表","按[确认]开始查找...");//只有在时间段查询时有
WindowsSet(12);
//当前日期
strcpy(&WinHint[0][1],"当前日期:");
BcdToStr(4,&InputDayData[0],&WinHint[0][10],0);
//当天正常发票份数
strcpy(&WinHint[1][1],"当天正常份数:");
Npm = &InputDayData[4];
if(Npm->dat == 0)
strcpy(&WinHint[1][14],"0");
else
NumToStr(Npm->dat,&WinHint[1][14],0);
//当天退票份数
strcpy(&WinHint[2][1],"当天退票份数:");
Npm = &InputDayData[6];
if(Npm->dat == 0)
strcpy(&WinHint[2][14],"0");
else
NumToStr(Npm->dat,&WinHint[2][14],0);
//当天废票份数
strcpy(&WinHint[3][1],"当天废票份数:");
Npm = &InputDayData[8];
if(Npm->dat == 0)
strcpy(&WinHint[3][14],"0");
else
NumToStr(Npm->dat,&WinHint[3][14],0);
//分类统计金额
strcpy(&WinHint[4][1]," 分类统计金额");
strcpy(&WinHint[5][1],"税号 正常金额 退票金额");
for(j=0;j<6;j++)
{
for(i=0;i<29;i++)str[i]=' ';
NumToStr(InputDayData[10+j],str,0);//税率
Ipt = &InputDayData[16+j*4];
if(Ipt->dat == 0)
strcpy(&str[4],"0.00");
else
NumToStr(Ipt->dat,&str[4],5); //正常金额
Ipt = &InputDayData[40+j*4];
if(Ipt->dat == 0)
strcpy(&str[15],"0.00");
else
NumToStr(Ipt->dat,&str[15],5);//退票金额
for(i=0;i<23;i++)
if(str[i]==0)str[i]=' ';
str[23]=0;
strcpy(&WinHint[6+j][1],str);
}
if(disHead == 0 || disHead == 1)//在LCD上显示
{
Windows(1,0,InitVal);//按退出键退出
return *InitVal;
}
else if(disHead == 2 || disHead == 3)//打印报表数据
{
if(disHead == 3)//打印报表头
PrintLine("指定时间段内的日交易数据报表");
else
PrintLine("日交易数据");
BcdToStr(4,&InputDayData[0],&time[0],0);
PrintTime("当前日期:",&time[0],&PrintBuf[0]);
PrintStr(&PrintBuf[0]);
for(i=1;i<12;i++)
PrintStr(&WinHint[i][1]);
PrintLine("");
PrintStr("电子存根");
while(--delay);
}
else ;
}
/*-----------------------------------------------------------------------------------
发票打印数据在LCD上显示
disfg = 0:不显示提示语
disfg = 1:显示提示语
disfg = 2:不打印报表头
disfg = 3:打印报表头
Sectfg = 0 :按时间查询
Sectfg = 1 :按时间段查询
Sectfg = 2 :按发票号查询
-----------------------------------------------------------------------------------*/
uchar InvPrintData(uchar disfg,uchar Sectfg,uchar *str)
{
uchar i=0,InitVal[3],PrintBuf[50],time[10],InputData[30];
uint v=0,n=0,delay=0x7fff;
gyt4 *Ips,*Its,*Sts;
gyt2 tp;
ulong InvStartAddress,temp=0;
n=0;
InvStartAddress=InvoListLimit1;
for(i=0;i<27;i++) InputData[i]=str[i];
if(disfg == 0xff)
return 0; //在打印时选择退出
Itarr(InitVal);
WindowsSet(7);
if(disfg == 1) //显示提示窗口
DisHint("指定时间段内的","<<发票打印数据>>报表","按[确认]开始查找...");
Its = &InputData[0];//按输入时间查询时
temp = Its->dat;
// UartTxd(4,Its->str);
I2cRead(InvoPrintNum,2,tp.str);
if(tp.dat == 0)
return 0; //返回 数量为0 说明没有数据
while(Sectfg == 0 && disfg == 0)
{
SerialFlashRead(FlashInvo,InvStartAddress,27,InputData);
Ips = InputData;
if(temp == Ips->dat)
break;
else
{
InvStartAddress+=27;
n++;
if(n >= tp.dat)
return 0;
}
}
while(1)
{
Itarr(InitVal);
strcpy(&WinHint[0][1],"开票日期:");
BcdToStr(4,&InputData[0],&WinHint[0][10],0);
strcpy(&WinHint[1][1],"发票号:");
Ips = &InputData[4];
NumToStr(Ips->dat,&WinHint[1][8],0); //按HEX格式转换
strcpy(&WinHint[2][1],"开票类型:");
NumToStr(InputData[8],&WinHint[2][10],0);
strcpy(&WinHint[3][1],"开票总金额:");
Ips = &InputData[9];
if(Ips->dat == 0)
strcpy(&WinHint[3][12],"0.00");
else
NumToStr(Ips->dat,&WinHint[3][12],5);
strcpy(&WinHint[4][1],"税控码:"); //在第五行上显示税控码字样
Ips = &InputData[13];
NumToStr(Ips->dat,&WinHint[5][1],0); //最高位如果是‘0’不会显示
for(i=0;i<10;i++)
if(WinHint[5][1+i]==0)
WinHint[5][1+i]='0';//如果数据为0则显示出字符0
Ips = &InputData[17];
NumToStr(Ips->dat,&WinHint[5][11],0);
for(i=0;i<10;i++)
if(WinHint[5][11+i]==0)
WinHint[5][11+i]='0';//如果数据为0则显示出字符0
strcpy(&WinHint[6][1],"原始发票号:");
Sts = &InputData[21];
NumToStr(Sts->dat,&WinHint[6][12],0);
if(disfg == 0 || disfg == 1)
{
Windows(1,0,InitVal);
if(*InitVal == K_TC)
return K_TC;//按退出键退出
else if(Sectfg == 1) //在时间段查询时用
return *InitVal;
else if(Sectfg == 2)//按发票号查询
return 0;
}
if(disfg == 2 || disfg == 3)//disfg = 3:打印报表头,disfg = 2 :不打印报表头
{
if(disfg == 3)
PrintLine("指定时间段内的发票打印数据报表");
else
PrintLine("发票打印数据");
BcdToStr(4,&InputData[0],&time[0],0);
PrintTime("开票日期:",&time[0],&PrintBuf[0]);
PrintStr(&PrintBuf[0]);
for(i=1;i<4;i++)
{
PrintStr(&WinHint[i][1]);
delay=0x6fff;
while(--delay); //由于发送数据太快.导至打印缓冲数据溢出所以得延时
}
strcpy(PrintBuf,"税控码:");
strcpy(&PrintBuf[7],&WinHint[5][1]);
PrintStr(&PrintBuf[0]);
delay=0x6fff;
while(--delay); //由于发送数据太快.导至打印缓冲数据溢出所以得延时
PrintStr(&WinHint[6][1]);
delay=0x6fff;
while(--delay); //由于发送数据太快.导至打印缓冲数据溢出所以得延时
PrintLine("");
PrintStr("电子存根");
if(Sectfg == 1 || Sectfg == 2)
return 0;
}
if(Sectfg == 0) //只有在输入时间查询时才有效
{
while(1)
{
InvStartAddress+=27;
SerialFlashRead(FlashInvo,InvStartAddress,27,InputData);
Ips = &InputData[0];
// UartTxd(4,Ips->str);
n++;
if((Ips->dat > temp) || (n >= tp.dat))
return 0;
else if(Ips->dat == temp) break;
// if((temp != Ips->dat) && (n >= tp.dat))
// {
// Sts.dat = temp;
// for(i=0;i<4;i++)
//// *InputData++ = Sts.str[i]; //为保证退出程序再进时指向下一笔数据
// InputData[i]=Sts.str[i];
// for(i=4;i<8;i++)
// InputData[i]=0;
//// *InputData++ = 0; //为保证退出程序再进时指向下一笔数据
// return 0;
// }
}
}
}
}
//----------------------------------------------------------------------------
//
//
//
//----------------------------------------------------------------------------
void DanJunInvoiceWindownOne(uchar *InputDat)
{
uchar i,UnitName[45],Use[10];
I2cRead(TaxpayerName,40,UnitName); //读取单位名称
WindowsSet(12);
strcpy(&WinHint[0][1],"单位名称:");
for(i=0;i<22;i++) WinHint[1][1+i]=UnitName[i];
for(i=0;i<18;i++) WinHint[2][1+i]=UnitName[22+i];
strcpy(&WinHint[3][1],"税号:");
I2cRead(TaxNumber,20,UnitName); //读取税号 == 纳税人编码
for(i=0;i<20;i++) WinHint[4][1+i]=UnitName[i];
strcpy(&WinHint[5][1],"机器号:");
I2cRead(MachineNo,8,Use);
BcdToStr(8,Use,UnitName,0x81);
strcpy(&WinHint[6][1],UnitName);
strcpy(&WinHint[7][1],"开票日期:");
BcdToStr(4,&InputDat[29],UnitName,0x81);
strcpy(&WinHint[8][1],UnitName);
strcpy(&WinHint[8][9]," 至 ");
BcdToStr(4,&InputDat[33],UnitName,0x81);
strcpy(&WinHint[8][13],UnitName);
strcpy(&WinHint[9][1],"发票代码:");
BcdToStr(10,&InputDat[0],UnitName,0x81);
strcpy(&WinHint[10][1],UnitName);
strcpy(&WinHint[11][1],"按〖小计〗显示下屏内容");
}
void DanJunInvoiceWindownTwo(uchar *InputDat)
{
gyt2 *Ipint;
gyt4 *Iplong;
uchar Use[15];
WindowsSet(8);
strcpy(&WinHint[0][1],"发票起始号:");
Iplong = &InputDat[10];
NumToStr(Iplong->dat,Use,0);
strcpy(&WinHint[0][12],Use);
strcpy(&WinHint[1][1],"发票终止号:");
Iplong = &InputDat[14];
NumToStr(Iplong->dat,Use,0);
strcpy(&WinHint[1][12],Use);
strcpy(&WinHint[2][1],"正常发票份数:");
NumToStr(InputDat[18],&WinHint[2][14],0);
strcpy(&WinHint[3][1],"正常开具金额:");
Iplong = &InputDat[21];
NumToStr(Iplong->dat,Use,7);
strcpy(&WinHint[3][14],Use);
strcpy(&WinHint[4][1],"退票份数:");
NumToStr(InputDat[20],&WinHint[4][10],2);
strcpy(&WinHint[5][1],"废票份数:");
NumToStr(InputDat[21],&WinHint[5][10],2);
strcpy(&WinHint[6][1],"退票金额:");
Ipint = &InputDat[25];
NumToStr(Ipint->dat,&WinHint[6][10],7);
strcpy(&WinHint[7][1],"按〖小计〗显示下屏内容");
}
/*------------------------------------------------------------------------------------
发票代码在LCD上显示
dts = 0:不显示提示语
dts = 1:显示提示语
dts = 2:不打印报表头
dts = 3:打印报表头
------------------------------------------------------------------------------------*/
uchar AppointInvdis(uchar dts,uchar *indat)
{
uchar i=0,InitKey[3];
ulong delay = 0xffff;
if(dts == 1) //要显示提示则将disTS=1否则不显示提示
DisHint("指定时间段内的","<<单卷发票使用>>报表","按[确认]开始查找...");
InitKey[0]=K_TC;
InitKey[1]=K_HJ;
InitKey[2]=K_XJ;
InitKey[3]=0;
if(dts == 1 || dts == 0) //显示
{
while(1)
{
InitKey[0]=K_TC;
InitKey[1]=K_HJ;
InitKey[2]=K_XJ;
InitKey[3]=0;
if(!i)
DanJunInvoiceWindownOne(indat);
else
DanJunInvoiceWindownTwo(indat);
Windows(1,0,InitKey);
if(*InitKey==K_TC) return K_TC;
else if(*InitKey==K_XJ) i=~i;
else if(*InitKey==K_HJ) return 1;
}
return *InitKey;
}
if(dts == 2 || dts == 3) //打印
{
PtintInvoTome(indat);
return 1;
}
}
/*
uchar AppointInvdis(uchar dts,uchar *indat)
{
uchar i=0,InitKey[3];
gyt4 *Inv;
ulong delay = 0xffff;
Itarr(InitKey);
WindowsSet(11);
if(dts == 1) //要显示提示则将disTS=1否则不显示提示
DisHint("指定时间段内的","<<单卷发票使用>>报表","按[确认]开始查找...");
//发票代码
strcpy(&WinHint[0][1],"发票代码:");//copy 发票代码 to WinHint[0][0]
BcdToStr(10,&indat[0],&WinHint[1][1],0);
//发票起始号
strcpy(&WinHint[2][1],"发票起始号:");//copy 发票代码到Inv2
Inv=&indat[10];
NumToStr(Inv->dat,&WinHint[2][12],0);
//发票终止号
strcpy(&WinHint[3][1],"发票终止号:");
Inv=&indat[14];
NumToStr(Inv->dat,&WinHint[3][12],0);
//正常发票份数
strcpy(&WinHint[4][1],"正常发票份数:");
if(indat[18] == 0)
strcpy(&WinHint[4][14],"0");
else
NumToStr(indat[18],&WinHint[4][14],0);
//退票份数
strcpy(&WinHint[5][1],"退票份数:");
if(indat[19] == 0)
strcpy(&WinHint[5][10],"0");
else
NumToStr(indat[19],&WinHint[5][10],0);
//废票份数
strcpy(&WinHint[6][1],"废票份数:");
if(indat[20] == 0)
strcpy(&WinHint[6][10],"0");
else
NumToStr(indat[20],&WinHint[6][10],0);
//正常发票总金额
strcpy(&WinHint[7][1],"正常总金额:");
Inv=&indat[21];
if(Inv->dat == 0)
strcpy(&WinHint[7][12],"0.00");
else
NumToStr(Inv->dat,&WinHint[7][12],5);
//退票总金额
strcpy(&WinHint[8][1],"退票总金额:");
Inv=&indat[25];
if(Inv->dat == 0)
strcpy(&WinHint[8][12],"0.00");
else
NumToStr(Inv->dat,&WinHint[8][12],5);
//开票起始日期
strcpy(&WinHint[9][1],"开票起始日期:");
BcdToStr(4,&indat[29],&WinHint[9][14],0);
//开票截止时间
strcpy(&WinHint[10][1],"开票截止时间:");
BcdToStr(4,&indat[33],&WinHint[10][14],0);
if(dts == 1 || dts == 0) //显示
{
Windows(1,0,InitKey);
return *InitKey;
}
if(dts == 2 || dts == 3) //打印
{
if(dts == 3)
PrintLine("指定时间段内的单卷发票使用汇总数据报表");
else
PrintLine("单卷发票使用汇总数据报表");
for(i=0;i<11;i++)
PrintStr(&WinHint[i][1]);//打印
PrintLine("");
PrintStr("电子存根");
while(--delay);
}
}
*/
/*--------------------------------------------------------------------------
提示对话
'/':表示做为不延时,用法:在第个提示栏中只在带有'/'即不显示延时,但'/'后面的
内容将不做显示
--------------------------------------------------------------------------*/
void ReHint(uchar *Dialog1,uchar *Dialog2)
{
uchar code pic1[]={
/*-- 宽度x高度=24x24 --*/
0x00,0x80,0xC0,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x67,0xF7,0xF7,0xF7,0x67,0x0F,0x1E,
0x3C,0x78,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x07,0x0F,0x1F,0x3F,0x70,0xE0,0xC0,
0x80,0x00,0x7E,0x7E,0x7E,0x00,0x80,0xC0,0xE0,0x70,0x3F,0x1F,0x0F,0x07,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x27,0x43,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
uchar i=0,Dialbuff[30];
ulong val=0x2FFF;
for(i=0;i<24;i++)
{
Dialbuff[i]=Dialog2[i];
}
LcdDisplay(8,72,"信 息",3);
ShowPicture(0,30,24,54,pic1);//显示图标
for(i=0;i<4;i+=3)
DisplayFullRec(i,i,63-i,191-i,1);
LcdDisplay(32,8,Dialog1,0);
for(i=0;i<24;i++)
{
if(Dialbuff[i] == '/')
{
Dialbuff[i] = 0;
LcdDisplay(48,8,Dialbuff,0);
return;
}
}
LcdDisplay(48,8,Dialog2,0);
while(--val)
{
if(GetKey()!=0xFF)
return;
}
}
////////////////////////发票数据的显示与打印选择//////////////////////////
// flag = 1:单卷发票使用汇总
// flag = 2:发票打印数据
// flag = 3:日交易数据
// flag = 4:监控数据
// flag = 5:申报备份数据
// flag = 6:营业员销售额营业员的XZ报表查询
// flag = 7:已分发的发票查询
// flag = 8:已录入的发票查询
// flag = 9:全部营业员的XZ报表
///////////////////////////////////////////////////////////////////////////
void InvDisAndPrint(uchar flag,uchar *dat,uchar xz,uchar *Number)
{
uchar i = 0,k = 0;
while(1)
{
i = ReSelectMode();
switch(i)
{
case 1:
switch(flag)
{
case 1:
case 2:
case 3:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -