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

📄 deal_data.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 5 页
字号:
	}
	return(1);  //没找到

}         
  
/*---------------------------------------------------------------
  功能:  在明细中找发票电子票根
 入口参数: invoice_no发票号
           
            *invoice_roll_code 发票卷的代号
 出口参数: * record:该发票的记录
 
 返回值:成功返回0,否则返回其它错误
 /*-------------------------------------------------------------*/
uchar locate_invoice_roll(ulong invoice_no,uchar *invoice_roll_code,struct record_struct * record)
{
	struct record_addr_struct xdata RecordAddr; 
	struct record_struct xdata mrecord;
	struct invoice_roll_struct InvoiceRoll;
	uchar j;
	uchar tmp;
	//uchar sector; //扇区号
	//uchar start; //是否为某扇区的开始地址
	uint  size,i,x;
	ulong addr;
	uint crc;
	uchar lrc;
    uchar error;
    ulong temp_add;
    //ulong first_add;
    uchar find;
	
	//uint  recod_long;
   
	//从EEPROM中读笔记录地址(最后写的一笔记录的结束地址)
	read_eeprom(RECORD_ADDR1,(uint)sizeof(RecordAddr),&RecordAddr);
	crc=crcxdata((uint)sizeof(RecordAddr)-2,&RecordAddr);
	if(crc!=RecordAddr.crc)
	{
		if(read_eeprom(RECORD_ADDR2,(uint)sizeof(RecordAddr),&RecordAddr))
			return(READ_EEPROM_FAIL);
		
		crc=crcxdata((uint)sizeof(RecordAddr)-2,&RecordAddr);
		if(crc!=RecordAddr.crc)
			return(CRC_ERROR);
	}
   
	if(RecordAddr.record_addr==RECORD_START_ADDR) //没有写数据
		return(1);
 
	find=0;
	if(read_eeprom(INVOICE_ROLL,(uint)sizeof(InvoiceRoll),&InvoiceRoll)) //当前发票卷中找
		return(READ_EEPROM_FAIL);
	//LRC校验
	if(lrcdata((uint)sizeof(InvoiceRoll)-1,0,&InvoiceRoll))
		return(LRC_ERROR);
	  //send_str((uint)sizeof(InvoiceRoll),&InvoiceRoll);
	if((memcmp(InvoiceRoll.invoice_code,invoice_roll_code,(uint)sizeof(InvoiceRoll.invoice_code))==0)
	&&(invoice_no>=InvoiceRoll.invoice_start_no)
	)//发票卷号符合
	{
		size=InvoiceRoll.normal_num+InvoiceRoll.retreat_num+InvoiceRoll.resissory_num;//当前卷开票的张数
		addr=InvoiceRoll.invoice_start_add;
  
		for(i=0;i<size;i++)
		{
			if(read_flash(addr,1,&tmp))
				return(READ_FLASH_FAIL);
			if(tmp!=0xFF)
			{
			  //2005.11.7
		     if(read_flash(addr+RECORD_LENGTH,1,&tmp))return(READ_FLASH_FAIL);
		     if(i==invoice_no-InvoiceRoll.invoice_start_no) 
		     {
			//读出记录全部信息
			//2005.12.30
		  
		   if(read_flash(addr+1,RECORD_LENGTH+(uint)INVOICE_ITEM_LEN*tmp+1,&mrecord))
		       return(READ_FLASH_FAIL);
			   //校验
					lrc=lrcdata(RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num,1,&mrecord);
					if(lrc!=((uchar *)&mrecord)[RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num])	return(LRC_ERROR);
					if(!find)
					{
						if(mrecord.invoice_no==invoice_no) //找到返回
						{
							*record=mrecord;
							return(0);			
						}
						 //2005.12.31
			            else break;//return(1);     //
					}
				}
				//2005.11.7
				addr+=RECORD_LENGTH+(uint)INVOICE_ITEM_LEN*tmp+1; //该票的结束地址 
			}
			else 
			{
				i--;
				crc=0;
				for(j=0;j<(uint)sizeof(RECORD_SIZE);j++)//
				{
					crc+=RECORD_SIZE[j]; //KBYTE
					temp_add=(ulong)crc*1024+RECORD_START_ADDR;
					if(temp_add>addr)
					{
						if(j<((uint)sizeof(RECORD_SIZE)-1))//没有到最后一个扇区
						{
							addr=temp_add;
							break;
						}
						else
						{
							addr=RECORD_START_ADDR;//明细滚动卷
							break;
						}
					}   
				}
			}
		}
	}

	for(x=0;x<MAX_ROLL_NUM;x++)
	{
		//2005.11.7
		set_value0(&InvoiceRoll,(uint)sizeof(InvoiceRoll));
		error=get_inv_roll(x,&InvoiceRoll);
		if(error)return error;
	
		if(
	    (InvoiceRoll.lrc==lrcdata(INV_ROLL_STRUCT_LENGTH-1,1,&InvoiceRoll))//正常的发票卷数据
	    &&(InvoiceRoll.invoice_start_no)
	    &&(InvoiceRoll.invoice_end_no)
		)
		{
			if(
			(memcmp(InvoiceRoll.invoice_code,invoice_roll_code,(uint)sizeof(InvoiceRoll.invoice_code))==0)
			&&(invoice_no>=InvoiceRoll.invoice_start_no)
			&&(invoice_no<=InvoiceRoll.invoice_end_no)
			)//发票卷号符合
			{
				size=InvoiceRoll.normal_num+InvoiceRoll.retreat_num+InvoiceRoll.resissory_num;//当前卷开票的张数
				addr=InvoiceRoll.invoice_start_add;
	   
				for(i=0;i<size;i++)
				{
				//2005.11.7
         if(read_flash(addr,1,&tmp))return(READ_FLASH_FAIL);
		 
	     if(tmp!=0xFF)
		  {
		   //2005.12.30
		   if(read_flash(addr+RECORD_LENGTH,1,&tmp))return(READ_FLASH_FAIL);
		   //send_char(tmp);
		   if(i==(uchar)(invoice_no-InvoiceRoll.invoice_start_no))
		     {
			   //读出记录全部信息
			   //2005.12.30
		       
		       if(read_flash(addr+1,RECORD_LENGTH+(uint)INVOICE_ITEM_LEN*tmp+1,&mrecord))
			          return(READ_FLASH_FAIL);
					 // send_str(RECORD_LENGTH+(uint)INVOICE_ITEM_LEN*tmp+1,&mrecord);
				//校验
							lrc=lrcdata(RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num,1,&mrecord);
							if(lrc!=((uchar *)&mrecord)[RECORD_LENGTH+INVOICE_ITEM_LEN*mrecord.item_num])	return(LRC_ERROR);
			   
							if(!find)
							{
								if(mrecord.invoice_no==invoice_no) //找到返回
								{
									*record=mrecord;
									return(0);			
								}
								//2005.12.31
			                  else break;//return(1);
							}
						}
						//2005.11.7
						addr+=RECORD_LENGTH+(uint)INVOICE_ITEM_LEN*tmp+1; //该票的结束地址 
						//send_str(4,&addr);
					}
					else //if(tmp!=0xFF)
					{
						i--;
						crc=0;
						for(j=0;j<(uint)sizeof(RECORD_SIZE);j++)//
						{
							crc+=RECORD_SIZE[j]; //KBYTE
							temp_add=(ulong)crc*1024+RECORD_START_ADDR;
							if(temp_add>addr)
							{
								if(temp_add<InvoiceRoll.invoice_end_add)
								{
									addr=temp_add;
									break;
								}
								else
								{
									if(InvoiceRoll.invoice_start_add>InvoiceRoll.invoice_end_add) addr=RECORD_START_ADDR;//明细滚动卷
									else i=size; //明细已经滚动掉
								}
							}   
						}
					}
				}//for(i=0;i<size;i++)
			}
		}//if((InvoiceRoll.lrc==lrcdata(INV_ROLL_STRUCT_LENGTH-1,1,&InvoiceRoll))&&(InvoiceRoll.lrc!=0))
		else //本扇区无发票卷数据
		{
			if(x<177)x=178; //进入第2扇区
			else if(x<354)x=354;//进入第3扇区
			else x=MAX_ROLL_NUM; //退出
		}
	}//for(x=0;x<MAX_ROLL_NUM;x++)
	return(1);  //没找到
}         
          
       
/*---------------------------------------------------------------
 功能:计算发票卷记录在FLASH中的当前保存地址
  入口参数: InvRollAddr上一发票卷的结束地址及所在扇区的发票卷记录地址结构
           
 出口参数: newInvRollAddr:该卷发票存放的起始地址及所在扇区的发票卷记录地址结构
  
  返回值:成功返回0,否则返回其它错误
/*-------------------------------------------------------------*/
uchar calc_invoice_roll_addr(const struct invoice_roll_addr_struct InvRollAddr,
         				 struct invoice_roll_addr_struct* newInvRollAddr)
{
	uchar i,j;
	uint size;

	i=0;
	j=0;
	size=0;
	if(InvRollAddr.invoice_roll_addr+(uint)sizeof(InvRollAddr)<INVOICE_ROLL_START_ADDR ||
     InvRollAddr.invoice_roll_sector<INVOICE_ROLL_SECTOR[0] ||
     InvRollAddr.invoice_roll_sector>INVOICE_ROLL_SECTOR[
		(uint)sizeof(INVOICE_ROLL_SECTOR)-1])
		return(ADDR_FLASH_FAIL);	//地址错

	while(1)
	{
		size+=INVOICE_ROLL_SIZE[i];
		if((ulong)size*1024+INVOICE_ROLL_START_ADDR-1>=
			InvRollAddr.invoice_roll_addr+INVOICE_ROLL_LENGTH)
      			break;
		i=(i+1)%((uint)sizeof(INVOICE_ROLL_SIZE));
	}

	newInvRollAddr->invoice_roll_sector=INVOICE_ROLL_SECTOR[i];

	if (newInvRollAddr->invoice_roll_sector!=InvRollAddr.invoice_roll_sector) 
	{
		//擦出该扇区
		if (flash_sector_erase(newInvRollAddr->invoice_roll_sector))
      		return(ERASE_FLASH_FAIL);
		//计算该扇区的开始地址
		size=0;
		for(j=0;j<i;j++)
     		size+=INVOICE_ROLL_SIZE[j];
		newInvRollAddr->invoice_roll_addr=(ulong)size*1024+INVOICE_ROLL_START_ADDR;
	}
	else
		newInvRollAddr->invoice_roll_addr=InvRollAddr.invoice_roll_addr+1;

	if(newInvRollAddr->invoice_roll_addr<INVOICE_ROLL_START_ADDR ||
     newInvRollAddr->invoice_roll_sector<INVOICE_ROLL_SECTOR[0] ||
     newInvRollAddr->invoice_roll_sector>INVOICE_ROLL_SECTOR[
		(uint)sizeof(INVOICE_ROLL_SECTOR)-1])
		return(ADDR_FLASH_FAIL);	//地址错
	return(0);
}
 
//==============================================================================================================
#ifdef DS   //地税
uchar save_data_DS( struct menu_struct * menu,
					struct trade_info_struct * trade_info,
					uchar is_trade,ulong * menu_price
					)
{
	
	struct record_struct xdata record;
	struct record_struct xdata print_rec;
	struct day_struct xdata day;
	struct branch_struct  xdata branch;
	struct plu_struct xdata plu;
	struct receiver_report_struct xdata receiver_report;
	struct day_report_struct xdata day_report;
	struct month_report_struct xdata month_report;
	struct trade_report_struct xdata trade_report;
	struct money_add_struct xdata money_add;
	struct invoice_roll_info_struct xdata invoice_roll_info;
	struct invoice_roll_struct xdata invoice_roll;
    struct record_addr_struct RecordAddr; 
	uchar xdata tmp[7];
	ulong  class_money[6];
	uint   plu_no,branch_no;
	uchar  menu_no;
	uchar  invoice_num;
	uchar  rlt,print_error;
	uchar j,p,i,end;
	uchar  xdata buf[130];
	uchar  item_index;
	uchar  invoice_roll_end;
    //send_char(trade_info->invoice_type);
	//save_data_flg=1;
	//send_char(trade_info->receiver_no);
	rlt=0;
	print_error=0;
	if(trade_info->menu_num==0 && 
		trade_info->invoice_type==NORMAL_INVOICE)
		return(0);
	if(low_pwr) return(POWER_OFF);
	shut_bat(0); //
	if(g_printer_sel==1)g_printer_sel=0xaa;//转成内置打印机
	if(is_trade==YES)
	{
		//从税控卡获得发票卷的信息
		rlt=get_invoice_roll_info(&invoice_roll_info);
		if(rlt)
			return(rlt);
		//从EEPROM中读有关信息
		//读累加金额
		if(read_eeprom(MONEY_ADD,(uint)sizeof(money_add),&money_add))
			return(READ_EEPROM_FAIL);
		if(crcxdata((uint)sizeof(money_add)-2,&money_add)!=money_add.crc)
			return(CRC_ERROR);
		//读日记录暂存
		if(read_eeprom(DAY,(uint)sizeof(day),&day))
			return(READ_EEPROM_FAIL);
		  
		if(trade_info->invoice_type!=RESCISSORY_INVOICE) //非废票
		{
			//收款员报表
			if(read_eeprom(RECEIVER_ADDR+(uint)((trade_info->receiver_no-1)*sizeof(receiver_report)),
					(uint)sizeof(receiver_report),&receiver_report))
				return(READ_EEPROM_FAIL);
			
			if(lrcdata((uint)sizeof(receiver_report)-1,0,&receiver_report))
				return(LRC_ERROR);
			
			//日报表
			if(read_eeprom(DAY_ADDR,(uint)sizeof(day_report),&day_report))
			   {
				return(READ_EEPROM_FAIL);
			    }
			if(day_report.lrc!=lrcdata((uint)sizeof(day_report)-1,1,&day_report))
			   {//send_char(0);
				return(LRC_ERROR);
				}
			//月报表
			if(read_eeprom(MONTH_ADDR,(uint)sizeof(month_report),&month_report))
				return(READ_EEPROM_FAIL);
            //send_str((uint)sizeof(month_report),&month_report);
			//send_char(((uint)sizeof(month_report)-1,1,&month_report));
			if(lrcdata((uint)sizeof(month_report)-1,0,&month_report))
				{//send_char(1);
				return(LRC_ERROR);
				}
			#ifdef C8_VER
			if(trade_info->trader_no)
			{
				//营业员报表
				if(read_eeprom(TRADE_ADDR+(trade_info->trader_no-1)*(uint)sizeof(trade_report),
						(uint)sizeof(trade_report),&trade_report))
					return(READ_EEPROM_FAIL);
				if(lrcdata((uint)sizeof(trade_report)-1,0,&trade_report))
					return(LRC_ERROR);
			}
			#endif
		}
	}
	invoice_num=0;
	p=1;
	
	//invoice_num++;//产生新的一张发票
	set_value0(&record,(uint)sizeof(record));
	set_value0(&print_rec,(uint)sizeof(record));
	set_value0(class_money,(uint)sizeof(class_money));		
	//时间处理
	if(read_rtc(tmp))
		return(READ_CLOCK_FAIL);
    //2005.7.26
    zip_date(tmp,record.date);
   //memcpy(record.date,tmp,3);

	if(is_trade==YES && 
		trade_info->invoice_type!=RESCISSORY_INVOICE)//非废票
	{
		if(day_report.time[2]==0)
			memcpy(day_report.time,tmp,6);
		if(month_report.time[2]==0)
			memcpy(month_report.time,tmp,6);
	}
	record.invoice_type=trade_info->invoice_type;
		if(is_trade==YES)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -