⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 declare.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 5 页
字号:
/*-------------------------------------------------------------
功能:申报--税控数据的卡申报、打印、稽查
说明:符合国家标准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 + -