📄 declare.c
字号:
/*-------------------------------------------------------------
功能:申报--税控数据的卡申报、打印、稽查
说明:符合国家标准GB18240.1-2003和GB18240.2-2003的税控机软件
日期:2003年6月12日
---------------------------------------------------------------*/
#include "include.h"
//------添加MODEM申报所需要的一些声明------//
//#define Load_Dis(A,B,C) strcpy(dbuf,C);lcd_disp(A,B,dbuf)
#define MODEM_DISP_LEN 80 //超级终端每行显示的长度
//==============================================================
//向用户卡申报明细
/*uchar card_declare_list(uchar * startdate,uchar *enddate)
{
uchar rlt;
rlt=locate_invoice_by_date(0,startdate,enddate);
if(rlt && rlt!=1)
return(rlt);
return(0);
}
*/
//=============================================================
/*
功能:判断卡是否已报税
*/
uchar check_usrcard_dec(void)
{
uchar result;
uchar mach_num;
uchar find;
uchar j;
uchar xdata buf[230];//,buf1[50];
//2005.8.27
result=enter_application_direct(USER_CARD);
if(result) return result;
if(SelFile_id(USER_CARD,0xEF02))
return (USR_COMM_FAIL);
result=RW_bin(USER_CARD,0,1,1,&mach_num); //lyj
if(result) return(result);
find=0;
//------找到对应机器监控管理数据密文----------//
/*if(SelFile_id(USER_CARD,0xEF01))
return (USR_COMM_FAIL);
for(i=1;i<=mach_num;i++)
{
result=ReadRec(USER_CARD, 1, i,CONTROL_MSG_LEN_US, buf1);
if(result) return (result);
//比较税控卡编号
if(memcmp(buf1,g_user_info.register_no,8)==0)//一户多机的处理
{
*/
//判断卡的报税标志//
if(SelFile_id(USER_CARD,0xEF04))return (USR_COMM_FAIL);
for(j=1;j<=mach_num;j++)
{
result=ReadRec(USER_CARD, 1, j, 0xDC, buf);// FIXED_FILE=1;
if(result) return (result);
if(memcmp(&buf[1],g_user_info.register_no,8)==0)
{
if(buf[0]==0){find=1;break;}
else return (ALREADY_COLLECTED);//没有向税局申报
}
}
/* if(find)
break;
if(j>mach_num) return (USERCARD_MAC_ERROR);
}
}
*/
return 0;
}
//========================================================
uchar declare_day_record(uchar*start_date,uchar *end_date)
{
struct day_addr_struct da_addr;
struct day_struct da;
uchar error,i;
uchar rec_sn;
uchar buffer[200];
uchar temp_buf[200];
ulong addr;
//-----读取日记录数据地址-----------//
error=read_eeprom(DAY_ADDR1,DAY_ADDR_LEN,&da_addr);
if(error) return READ_EEPROM_FAIL;
if(da_addr.crc!=crcxdata(DAY_ADDR_LEN-2,&da_addr))
{
error=read_eeprom(DAY_ADDR2,DAY_ADDR_LEN,&da_addr);
if(error) return READ_EEPROM_FAIL;
}
if(da_addr.crc!=crcxdata(DAY_ADDR_LEN-2,&da_addr)) return CRC_ERROR;
for(i=0; i<255; i++)//计算记录的条数 以追加的方式写
{
error = ReadRec(USER_CARD,1,i+1,192, buffer);
if((error)&&(i==0)) {rec_sn =0;break;}
if(buffer[0]!=0x20){rec_sn = i; break;}
}
//-----读取日记录数据-----------//
for(addr=DAY_START_ADDR;addr<da_addr.day_addr;addr+=DAY_LEN_FH)//192
{
if(read_flash(addr,DAY_LEN_EM,da.date)) return READ_FLASH_FAIL;//64
if(memcmp(da.date,start_date,3)<0) continue;
else if(memcmp(da.date,end_date,3)>0) break;
//if(read_flash(addr,DAY_LEN_EM,&buffer[1])) return READ_FLASH_FAIL;//192
//if(read_flash(addr+DAY_LEN_EM,(DAY_LEN_FH-DAY_LEN_FH),&buffer[DAY_LEN_EM])) return READ_FLASH_FAIL;//192
if(read_flash(addr,DAY_LEN_FH,&buffer[1])) return READ_FLASH_FAIL;//192
memcpy(temp_buf,&buffer[DAY_LEN_EM+1],DAY_LEN_FH-DAY_LEN_EM);
memcpy(&buffer[DAY_LEN_EM],temp_buf,DAY_LEN_FH-DAY_LEN_EM);
// memcpy(&buffer[DAY_LEN_FH],&buffer[DAY_LEN_FH+1],(DAY_LEN_FH-DAY_LEN_FH));
buffer[0]=0x20;
//send_str(192,buffer);
rec_sn+=1;
if(!(rec_sn<101))rec_sn=1;
error = WriteRec(USER_CARD,rec_sn,DAY_LEN_FH,buffer);
if(error) return error;
if(memcmp(da.date,end_date,3)==0) break;
}
}
//========================================================
//功能:向用户卡申报明细及天记录
//输入:*start_date 开始日期,*end_date 结束日期,如:050912,050918
//返回:0申报成功,其他 则出现错误
//==============================================================
uchar Declare_Day_List(uchar*start_date,uchar *end_date)
{
uchar result;
uchar temp_buf[5];
uint fileID;
uchar check_type;
ulong addtemp;
uint rec_sn;
struct record_struct record;
uchar buf[512];
uint len;
uchar machine_num,i,j,y;
uchar change_card_ture;
uint star_rec; //记录的起止号
uint all_rec;//明细总的记录数
uint card_add;//写卡时的偏移地址
uint file_len;//卡中报明细的文件的长度
uchar declear_over;//报记录结束标志
check_type=g_user_info.record_delaring&0xf0;
//check_type=0x10;
/*
start_date[0]=end_date[0]=0x05;
start_date[1]=end_date[1]=0x08;
start_date[2]=end_date[2]=0x15;
machine_num=1;
*/
//machine_num=2;
if(!((check_type==0x30)||(check_type==0x20)||(check_type==0x10)))return 0;//申报的要求标志位
//2005.12.5
strcpy(buf,"1:卡报记录 2:U盘报记录");
lcd_disp(1,0,buf);
strcpy(buf,"请按键选择申报介质");
lcd_disp(2,0,buf);
while(1)
{
result=get_key();;
if(low_pwr) return(POWER_OFF);
if(result==VOID)return CANCEL;
if(result=='1')break;
else if(result=='2')
{
result=Udisk_declare_Day_List(start_date,end_date);
return result;
}
}
result=check_user_card();
if(result)return result;
machine_num=gb_temp;
if((check_type==0x30)||(check_type==0x20))//要求报天记录及明细或只要报天记录
{
result=check_user_card_get_fileid(temp_buf,1);//获取可用的文件名
if(result)return result;
fileID=temp_buf[0];
fileID<<=8;
fileID|=temp_buf[1];
strcpy(buf,"正在报日记录...");
lcd_disp(1,0,buf);
result =SelFile_id(USER_CARD,fileID);//打开找到的文件
if(result) return(result);
result=declare_day_record(start_date,end_date);//天记录申报
if(result) return(result);
if(check_type==0x20)return 0;
}
if(machine_num==1)j=SelFile_id(USER_CARD,0xEF10);//防止机器的数量不对多机变成单机
//报明细为另外一张卡
if((machine_num>1)||(j==USR_SEL_FIL_FAIL))//等待换成明细卡
{
strcpy(buf,"请换成报明细的卡!\r 再按[确定]");
lcd_disp(1,0,buf);
clear_lcd(3,1);
result=0;
while(1)
{
if(result)
{
catch_error_display(result,0);
result=0;
}
result=wait_usal_key(0);
if(result==POWER_OFF) return POWER_OFF;
else if(result==CANCEL)return CANCEL;
//send_char(0xaa);
result=enter_application_direct(USER_CARD);
if(result)continue;
if(SelFile_id(USER_CARD,0xEF02))continue;
if(RW_bin(USER_CARD, 0, 0, 61, buf))continue;
//send_str(61,buf);
//send_char(0xbb);
if(
(buf[0]!=USER_CARD)
||(buf[20]!=0x81)
||(memcmp(&buf[2],g_user_info.tax_payer_code,8)!=0)//明细卡时通不过
//||(memcmp(&buf[21],g_user_info.tax_payer_name,40)!=0)
){result=CARD_ERROR;continue; }//用户卡出错
//send_char(0xcc);
result=check_user_card_get_fileid(temp_buf,2); //防止是已经写满的卡
if(result)continue;
clear_lcd(2,2);
break;
}
}
if((check_type==0x10)||(check_type==0x30))//报明细
{
strcpy(buf,"正在报明细记录...");
lcd_disp(1,0,buf);
result=locate_invoice_by_date(0,start_date,end_date);//找出总的明细条数
if((result)&&(result!=NO_DATA)){return (result);}
all_rec=gb_temp;
//2005.8.14
if(all_rec==0) //return(NO_DATA);
{
rec_sn=0;
star_rec=0;
//2005.8.27
return(NO_DATA);//无明细时不用写索引文件
}
else
{
rec_sn=1;
star_rec=1;
}
result=check_user_card_get_fileid(temp_buf,2);//找出报明细的记录文件
//send_char(result);
if(result)return result;
//send_str(2,temp_buf);
fileID=temp_buf[0];
fileID<<=8;
fileID|=temp_buf[1];
result =SelFile_id(USER_CARD,fileID);
if(result) return(result);
file_len=gb_temp;//0xef11的文件长度
card_add=0;
change_card_ture=0;
declear_over=0;
while(all_rec)//找出未滚掉的明细的条数
{
if(!change_card_ture)//不用换卡
{
if(star_rec==1)result=LookUp_inv_list_roll(start_date,end_date,&addtemp,0,&record);//找第一条明细
else result=LookUp_inv_list_roll(start_date,end_date,&addtemp,1,&record); //找非第一条明细
if(result){if(result==OK){declear_over=1;}else break;}//
}
else {change_card_ture=0;}//换卡后
len=(RECORD_LENGTH+(uint)(record.item_num)*INVOICE_ITEM_LEN);
buf[0]=0xaa;
buf[1]=len/256;
buf[2]=len%256;
memcpy(&buf[3],(uchar*)&record,len+1);//组成明细申报的数据包
len+=4;
//len+=3;
//buf[len-1]=lrcdata(len,1,buf);
if(file_len>card_add) //当前卡的已写的数据长度小于定长文件
result =RW_bin(USER_CARD,1,card_add,len,buf);//写入明细文件中
else result=FILE_OVER; //定长文件不够写入当前的数据,认为文件写满
if(declear_over==1) {rec_sn++;card_add+=len;break;}//找出的是最后一条明细,则退出
if(result==FILE_OVER)//当前文件写满
{
//写0XEF10文件
j=0;
if(SelFile_id(USER_CARD,0xEF10))return (USR_COMM_FAIL);
//2005.8.10
for(i=0;i<255;i++)//多文件处理 //找出空的索引文件
{
result=ReadRec(USER_CARD,1,i+1,25,buf);
if((result)&&(i==0)) return(result);
for(y=0;y<25;y++){if(buf[0]!=buf[y])break;}
if((buf[8]!=0x20)&&(buf[12]!=0x20)&&(y>10))
{
j=i+1;
break;
}//{if(j==0)j=i+1;}//找到未用的文件
//else if(memcmp(buf,g_manufacturer_info.machinery_no,8)==0){j=i+1;break;}//找到本来的文件
}
if((i==255)&&(j==0))return (USR_COMM_FAIL);
i=0;
memcpy(buf,g_manufacturer_info.machinery_no,8);
i=8;
buf[i]=0x20;
i++;
memcpy(&buf[i],start_date,3);
i+=3;
buf[i]=0x20;
i++;
memcpy(&buf[i],end_date,3);
i+=3;
memcpy(&buf[i],(uchar*)&all_rec,2);
i+=2;
memcpy(&buf[i],(uchar*)&fileID,2);
i+=2;
memcpy(&buf[i],(uchar*)&star_rec,2);
//if(star_rec==1)star_rec=rec_sn-2;
//else
star_rec+=rec_sn-2; //写入索引文件中的明细
rec_sn=0;
i+=2;
memcpy(&buf[i],(uchar*)&star_rec,2);
i+=2;
buf[i]=lrcdata(i,1,buf);//组成索引文件的数据包
if(WriteRec(USER_CARD,j,25,buf))return(CPU_OPERATE_FAIL);//更新文件
result=check_user_card_get_fileid(temp_buf,2); //用下一明细文件
if((result!=FILE_OVER)&&(result))return result;
if(result!=FILE_OVER)
{
fileID=temp_buf[0];
fileID<<=8;
fileID|=temp_buf[1];
result =SelFile_id(USER_CARD,fileID);//找出下一空的明细文件
if(result) return(result);
file_len=gb_temp;//0xef11的文件长度
card_add=0;
change_card_ture=1;//把文件写满作为换卡处理(因为最后找出的明细未写入卡中)
}
star_rec++; //下一索引文件中明细的起条数
if(result==FILE_OVER)//明细文件全部用完要换卡
{
//result=FILE_OVER;
while(1)
{
result=Change_cardover(result);
if(result) return (result);
result=enter_application_direct(USER_CARD);
if(result)continue;
if(SelFile_id(USER_CARD,0xEF02))continue;
if(RW_bin(USER_CARD, 0, 0, 61, buf))continue;
if(
(buf[0]!=USER_CARD)
||(memcmp(&buf[2],g_user_info.tax_payer_code,8)!=0)
||(memcmp(&buf[21],g_user_info.tax_payer_name,40)!=0)
)continue; //用户卡出错
change_card_ture=1;
if(SelFile_id(USER_CARD,0xEF10))continue;
for(i=0;i<255;i++)//多文件处理
{
result=ReadRec(USER_CARD,1,i+1,25,buf);
if(result)
{
if(i==0)change_card_ture=0;
break;
}
for(y=0;y<25;y++){if(buf[0]!=buf[y])break;}
if(memcmp(buf,g_manufacturer_info.machinery_no,8)==0)//
{
if( //刚报过的用户卡
((buf[16]!=0)||(buf[17]!=0))
&&(memcmp(&buf[9],start_date,3)==0)
&&(memcmp(&buf[13],end_date,3)==0)
)
{
result=CARD_ERROR;
change_card_ture=0;
break;
}
}
if((buf[8]!=0x20)&&(buf[12]!=0x20)&&(y>10)){break;}//找到了空文件
}
if(!change_card_ture)continue;
result=check_user_card_get_fileid(temp_buf,2);//找到文件
if(result)continue;
fileID=temp_buf[0];
fileID<<=8;
fileID|=temp_buf[1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -