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

📄 trade.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 5 页
字号:
				strcpy(buf,"条码输入无效");
				lcd_disp(3,0,buf);
				if(in_plubarcode_hand)in_plubarcode_hand=0;
				continue;
			}
			
			sprintf(numkey,"%u",plu_no);
			strcpy(buf,"条码输入有效");
			lcd_disp(3,0,buf);
            beep(50);
			key_tmp=PLU;           //作为直接PLU处理
			
			if(trade_info.trade_status==WAITTRADE)
				trade_info.trade_status=TRADEING;


		}
		
		//#endif
		if (error)
		{
		  if(error<50 //<50硬件故障
					|| error==MACHINE_NO_ERROR 
					|| error==TAXCARD_NO_ERROR
					|| error==TAXCARD_MAC_ERROR
					|| error==USERCARD_MAC_ERROR
					|| error==TAXCARD_REGISTER_ERROR
					|| error==ADD_MONEY_ERROR
                    || error==ADD_MONEY1_ERROR
					|| error==INVO_ROLL_END
					|| error==LOCK_DATE
					|| error==POWER_FAIL
				   )
			{return(error);}
				//错误分类处理
			if(error!=old_error)
			{
			    beep(250);
                catch_error_display(error,0);
				old_error=error;
			}
			if(key_tmp==CLEAR)
			{
				error=0;
				old_error=0;
				clear_lcd(3,1);
				strcpy(buf,"等待重新输入...");
				lcd_disp(3,0,buf);
				
				/*	if(numkey[0]==0 )
				{
					strcpy(buf,"等待重新输入...");
					lcd_disp(3,0,buf);
				}
				else
				*/
                if(numkey[0]!=0 )
				{
				    set_value0(numkey,(uint)sizeof(numkey));
			        num=0;
			        //clear_lcd(3,1);
				    //strcpy(buf,numkey);
				}
				continue;
			}
			else
				continue;
		}
		if(trade_info.trade_status==WAITPYINPUT) //等待拼音输入
		{
			rlt=0;
			if(g_pda_switch)
			{
				clear_lcd(3,1);
				strcpy(buf,"PDA输入...");
				lcd_disp(3,0,buf);
				//PDA输入
				rlt=Pda_input(&i,trade_info.customer_name);
                if(!rlt) //显示PDA输入的名称
				{
					beep(100);
					strcpy(buf,"名称:");
					strcat(buf,trade_info.customer_name);
					lcd_disp(2,0,buf);
				}
				else if(low_pwr) return(POWER_OFF);
			}
            
			if(!g_pda_switch || rlt)//PDA输入不正确或不能PDA输入
			{
				rlt=Get_HzString(20,trade_info.customer_name);//20个汉字
		        if(low_pwr) return(POWER_OFF);
		        //2005.11.26
		        if(rlt==CANCEL)
		        {
		        	//退票付款单位默认为原票号
					if(trade_info.invoice_type==RETREAT_INVOICE)
					{
						sprintf(buf,"%%0%ulu",(uint)MAX_INVO_NO_LEN);						
						sprintf(trade_info.customer_name,buf,trade_info.invoice_no);
						//sprintf(buf,"%08lu",trade_info.invoice_no);
					}
					else ;
					//strcpy(trade_info.customer_name,"个人");//2006.01.16
		        }
			}
			
			if(trade_info.menu_num>0)
			{
				strcpy(buf,"输入完毕");
				lcd_disp(3,0,buf);
				/*rlt=disp_trade(ALL_AREA,&menu,buf,INPUT_AREA,
					&trade_info);
				if(rlt)
				{
					error=rlt;
					continue;
				}*/
			}
			
			#ifdef GS
				trade_info.trade_status=TRADEING;
			#else
				trade_info.trade_status=HZSELECTED;
				key_tmp=CASH;//汉字输入完毕开始打票
				key_first=0;
			#endif
		}
		//if((key_tmp==RESCISSORY)&&(!error))send_char(1);
		if(trade_info.trade_status==WAITRECEIVER)
		{
			rlt=receiver_log_on(&trade_info.receiver_no); //收款员登录
					    
			if(rlt==CANCEL) //按了取消键返回的
			{
				return 0;//返回上一级
			}
			else if(rlt)
			{
				error=rlt;
				continue;
			}
			error=0;
			trade_info.trade_status=WAITTRADE;first=1;
			//读收款员报表
			if(read_eeprom(RECEIVER_ADDR+(trade_info.receiver_no-1)*(uint)sizeof(receiver_report),
			(uint)sizeof(receiver_report),&receiver_report))
				return(READ_EEPROM_FAIL);
			//send_char(lrcdata((uint)sizeof(receiver_report)-1,1,&receiver_report));
			if(lrcdata((uint)sizeof(receiver_report)-1,0,&receiver_report))
			{
				return(LRC_ERROR);
			}
			receiver_report.receiver_no=trade_info.receiver_no; //收款员号
			rlt=read_rtc(buf); //上班时间
			memcpy(receiver_report.time,buf,6);
			if(rlt)
			{
				error=READ_CLOCK_FAIL;
				continue;
			}
						//保存收款员号到EEPROM
						rlt=write_eeprom(RECEIVER_NO,1,&trade_info.receiver_no);
						if(rlt)
						{
							error=rlt;
							continue;
						}
						//收款员报表更新到EEPROM
						receiver_report.lrc=lrcdata((uint)sizeof(receiver_report)-1,1,
							&receiver_report);
						if(write_eeprom(RECEIVER_ADDR+
							(trade_info.receiver_no-1)*(uint)sizeof(receiver_report),
							(uint)sizeof(receiver_report),&receiver_report))
						{
							error=WRITE_EEPROM_FAIL;
							continue;
						}
                        rlt=is_lock_mac(); //检查是否到了开票截止日期
				         if(rlt) return(rlt);//暂时不检查
						//检查发票是否用完,这里不需要保存发票卷数据
						//从税控卡获得发票卷的信息
						rlt=get_invoice_roll_info(&invoice_roll_info);
						if(rlt)
							return(rlt);
						continue; //返回
		}
	     
		if (key_tmp==0)	  
		{
		   if(is_displaytime) 
		   {
				read_rtc(rtc);
				display_time(rtc,0,is_trade);	
			}	
			old_key_tmp=0;
			continue;
		}
		else
		{
			if(is_displaytime)
			{
				clear_lcd(0,MAX_LCD_NUM);
				if(key_tmp!=QUANTITY)  is_displaytime=0;
			}
			if(key_tmp==old_key_tmp)
			 {
				/*if(key_first)
				{
				 delayms(100);
				 key_first=0;
				 continue;
				}
				else
				{
				//	beep(30);
					
				}
				*/
			 }
			else
			 {
				key_first=1;
				//beep(30);
			 }
			 old_key_tmp=key_tmp;
		}
	      
		//if(trade_info.trade_status==WAITTRADE)
		//	clear_lcd(0,MAX_LCD_NUM);
       
		if(trade_info.trade_status==READYRETREAT && //准备退货状态
				key_tmp!=VOID && key_tmp!=RETREAT)
		{
			error=KEY_ERROR;
			continue;
		}
		
		if(key_tmp==RECEIVER) //收款员键
		{
			if(is_trade==YES)
			{
				if(trade_info.trade_status==WAITTRADE)
				{
					rlt=receiver_log_off();//收款员退出
					if(rlt==CANCEL)        //按了取消键返回的
					{
						first=1;
						continue;
					}
					else if(rlt) //有错误
					{
						error=rlt;
						continue;
					}
					error=0;
				    trade_info.trade_status=WAITRECEIVER;
					continue;
				}
			}
		   //看是否为挂单键
			if(trade_info.trade_status!=TRADEING)//&&(trade_info.trade_status!=WAITPAY))
			{
				error=KEY_ERROR;
				continue;
			}
		}
		else //不是收款员键
		{
			if(key_tmp==VOID && (trade_info.trade_status==WAITTRADE ||
				 trade_info.trade_status==WAITRECEIVER))
			 {
				 clear_lcd(0,MAX_LCD_NUM);
				 return(0); //返回上一级
			 }
		}

		/*******************按键处理**************************/
		//if(key_tmp>='0' && key_tmp<='9' ||
		//	key_tmp==KEY00 || key_tmp==POINT) //数字键
		//2005.11.16
		if(key_tmp>='0' && key_tmp<='9' ||
			key_tmp==KEY00 || key_tmp==POINT||((key_tmp=='-')&&(!strlen(numkey)))) //数字键//
		{
		    //send_char(key_tmp);
			if(trade_info.trade_status==WAITPYINPUT ||
				trade_info.trade_status==HZSELECTED)
			{
				error=KEY_ERROR;
				continue;
			}
			if(input_plu_barcode)
			rlt=get_valid_digit(key_tmp,2,20,numkey);
			else 
			rlt=get_valid_digit(key_tmp,1,10,numkey);
			clear_lcd(3,1);
			lcd_disp(3,0,numkey);
			if(rlt)
			{
				error=KEY_ERROR;
				num=0;
				set_value0(numkey,(uint)sizeof(numkey));
			}
			else
				if(trade_info.trade_status==WAITTRADE)
					trade_info.trade_status=READYTRADE; //等待营业


			continue;
		}
		else //功能键
		{
			if(
			key_tmp==RETREAT ||//退票键
			((key_tmp==RESCISSORY)&&(trade_info.trade_status==READYTRADE)) || //废票键
			key_tmp==BRANCH || //部门
			key_tmp==PLU ||    //PLU
			key_tmp==PAPER1 || //走纸
			key_tmp==NS || //开钱箱
			key_tmp==BIT      //辅币键
			#ifdef C8_VER
			||key_tmp==TRADER 
			#endif
			)//编号
				num=numstr_to_long(numkey,0,2);//send_char(0xaa);
			else
			{
				pointlong=look_up_pointlong(numkey);
				//2005.12.9
				if(((pointlong>2)&&(key_tmp!=QUANTITY)&&(key_tmp!=VOID)&&(key_tmp!=CLEAR))||(((look_up_fushu(numkey)))&&(key_tmp!=PRICE)))//||(key_tmp!=VOID)||(key_tmp!=CLEAR))
				{
					error=KEY_ERROR;
					continue;
				}
				if(key_tmp==QUANTITY)
				{
					num=numstr_to_long(numkey,1,pointlong);
					if(num>0xffffff)
					{
						error=KEY_ERROR;
						continue;
					}
					tmp=pointlong;
					tmp=tmp<<24;
					num|=tmp; //小数点的位数
				}
				else if(key_tmp==PRICE)
				{
					is_fushu=0;
					if((look_up_fushu(numkey)))//单价为负数
					{
						is_fushu=0xaa;
					    num=numstr_to_long(&numkey[1],1,2);
						
					}
					else
						num=numstr_to_long(&numkey[0],1,2);
					num&=0x7fffffff;
					if(is_fushu==0xaa)num|=0x80000000; //单价为负数
						is_fushu=0;
				}
				//2005.12.9
				else if(!((key_tmp==VOID)||(key_tmp==CLEAR)))num=numstr_to_long(numkey,1,2);
			}
		}
		
		switch(key_tmp)
		{
		
		case RETREAT: //退票键\挂单(C6)
		   //send_char(0xaa);
			#ifdef C6_VER
			if(trade_info.trade_status==TRADEING || 
				trade_info.trade_status==WAITPAY)
			{
			  if(trade_info.menu_num==0 || 
				menu[trade_info.menu_num-1].money==0 ||
				numkey[0]!=0 || trade_info.table_no==0)
			  {
				error=KEY_ERROR;
				continue;
			  }
			  sprintf(buf,"%u号台挂单...",(uint)trade_info.table_no);
			  clear_lcd(3,1);
			  lcd_disp(3,0,buf);
			  if(is_trade==YES)
			  {
				//保存定金(保存到每个台号的最前面4个字节)
				if(write_sramb(MENU_START_ADDR+
						(ulong)((trade_info.table_no-1)*((uint)sizeof(menu)+4)),4,
						&trade_info.pre_money))
				{
					error=WRITE_SRAM_FAIL;
					continue;
				}
				//保存当前台号的菜单数据到SRAM
				if(write_sramb(MENU_START_ADDR+
						(ulong)((trade_info.table_no-1)*((uint)sizeof(menu)+4)+4),(uint)sizeof(menu),&menu))
				{
					error=WRITE_SRAM_FAIL;
					continue;
				}
			  }
			  set_value0(&menu,(uint)sizeof(menu));
			  //交易信息更新
			  init_trade_info(&trade_info);
			  trade_info.trade_status=WAITTRADE;first=1;
			  continue;
			}
			#endif
			if(trade_info.trade_status==READYRETREAT) //退票确认
			{
				if(numkey[0]!=0)
				{
					error=KEY_ERROR;
					continue;
				}
				trade_info.invoice_type=RETREAT_INVOICE;
				trade_info.trade_status=TRADEING;
				trade_info.pay_way=PAY_CASH; //退货只能退现金
				//原发票号作为付款单位
				sprintf(buf,"%010lu",trade_info.invoice_no);
				strcpy(trade_info.customer_name,buf);
				clear_lcd(0,MAX_LCD_NUM);
				strcpy(buf,"退货状态");
				lcd_disp(3,0,buf);
				continue;
			}
			
			if(trade_info.trade_status!=READYTRADE)
			{
				error=KEY_ERROR;
				continue;
			}
			if(num==0)
			{
				//无效票号
				error=INVO_NO_ERROR;
				continue;
			}
			sprintf(buf,"%lu",num);
			if(strlen(buf)>MAX_INVOICE_LENGTH)
			{
				//无效票号
				error=INVO_NO_ERROR;
				continue;
			}
			
			//num为原票号,根据票号查找是否有历史记录,
			rlt=locate_invoice(num,&record,1);
			if((rlt && rlt!=1)&&(rlt!=2))
			{
				error=rlt;
				continue;
			}
		   	if(rlt==2) //已退票
			{
				error=NOT_RETREAT;
				trade_info.trade_status=WAITTRADE;first=1;
				num=0;
				set_value0(numkey,(uint)sizeof(numkey));
				continue;
			}
			if(rlt==1) //没找到
			{
				clear_lcd(0,MAX_LCD_NUM);
				
				#ifdef C6_VER
					strcpy(buf,"没找到该票号的记录,\r请再按[退货]键手工退货,\r[取消]键取消退货");
				#else
					strcpy(buf,"没找到该票号的记录,\r再按[退票]键手工退货,\r[取消]键取消退货");
				#endif
				
				lcd_disp(0,0,buf);
				trade_info.trade_status=READYRETREAT;
				trade_info.invoice_no=num;
				num=0;
                retreat__money=0;
				set_value0(numkey,(uint)sizeof(numkey));
				continue;
			}
			//找到若是废票或退票不能退
			if(record.invoice_type!=NORMAL_INVOICE)
			{
				error=NOT_RETREAT;
				trade_info.trade_status=WAITTRADE;first=1;
				num=0;
				set_value0(numkey,(uint)sizeof(numkey));
				continue;
			}
			//找到则
			/*加以下括号中的代码是为了退本机发票时,不能打印出同种税目不同商品的明细
			例如:原票 经营了,商品1 15元 商品2 20元 退票时只能打印 商品2 35元 因为明细保存中
			同一种税目只保存最后的名称,以下代码改变退票方式
			*/
			
			/* {
			clear_lcd(0,MAX_LCD_NUM);
			strcpy(buf,"请再按[退货]键手工退货,\r按[取消]键取消退货");
			lcd_disp(0,0,buf);
			trade_info.trade_status=READYRETREAT;
			trade_info.invoice_no=num;
			num=0;
			retreat__money=record.invoice_money;
			set_value0(numkey,(uint)sizeof(numkey));
			continue;
            }
			*/
			//2005.10.24
			sprintf(buf,"退票票号:%08lu",num);
            lcd_disp(2,0,buf);
            sprintf(buf,"按[确定]退票");
			lcd_disp(3,0,buf);
			while(1)
			{

⌨️ 快捷键说明

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