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

📄 trade.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 5 页
字号:
/*-------------------------------------------------------------
功能:交易和交易培训
说明:符合国家标准GB18240.1-2003和GB18240.2-2003的税控机软件
日期:2003年6月12日
 
---------------------------------------------------------------*/
#include "include.h"

//sbit check_paper=P3^3;
//状态常数
#define		WAITRECEIVER	0 //等待收款员登录
#define		WAITTRADE	    1 //等待营业
#define		READYTRADE	    2 //准备营业
#define     TRADEING        3 //营业中(正常营业)
#define		WAITPAY	        4 //等待结算
#define		WAITPYINPUT	    5 //等待拼音输入
#define		HZSELECTED	    6 //汉字选择完毕
#define     READYRETREAT    7 //准备手工退货

//发票类型定义
#define NORMAL_INVOICE       1    //正常票
#define RETREAT_INVOICE      2    //退票
#define RESCISSORY_INVOICE   3    //废票

//付款方式
#define PAY_CASH         0     //现金
#define PAY_BITMONEY0    1     //辅币0
#define PAY_BITMONEY1    2     //辅币1
#define PAY_BITMONEY2    3     //辅币2
#define PAY_BITMONEY3    4     //辅币3
#define PAY_CREDIT       5     //信用卡
#define PAY_ACCOUNT      6     //记帐
#define PAY_CHECK        7     //支票
#define KaiTai_Key       TABLENUM
#define CardPay_Key      CREDIT
//extern uchar xdata Leddata;
uchar branch_no1=0 ; //作交易时要不要刷新部类的标志
uint  plu_no1=0;

/*----------------------------------------------------
函数功能:	收款员登录
入口参数:   
          
出口参数:receiver_no 收款员号
返回值:  == 0 正确
		  != 0 错误代码
作者  :
-----------------------------------------------------*/

/**************************************************************/
/*uchar bar_code(uchar len,uchar * bar)
{ 
	if(NO_Paperflg) return 1;//缺纸检测
	//beep(50);
	//select_com(2);        //选取Com1
	//modify_rate(3);       //选取波特率9600bps
	//clear_rece_buffer();  //清除接收缓冲区
	
	//modify_rate2(3);       //选取Com2并设定波特率9600bps
	//clear_rece_buffer2();  //清除接收缓冲区	  
	if(!rece2(len,bar))     //接收条形码字符串
	{
		return(0);
	}
	else
	{
		return(1);
	}
}
*/
//======================================================================================
uchar receiver_log_on(uchar * receiver_no)//收款员号 登录
{
 
	uchar tmp_receiver_no;             //收款员号  
	uchar password[PASSWORD_LEN+1];    //收款员密码
	ulong num;
	uchar numkey[10],buf[50];
	uchar key_tmp,rlt,key_num;

	tmp_receiver_no=0;
	num=0;	
	set_value0(numkey,(uint)sizeof(numkey));
	set_value0(password,(uint)sizeof(password));
	key_tmp=0;
	clear_lcd(0,MAX_LCD_NUM);
	strcpy(buf,"营业员登录:\r输入营业员号+[营业员]键\r[取消]键返回");
	lcd_disp(0,0,buf);
   
	while(1)
	{
		
		if(low_pwr){return(POWER_OFF);}//send_char(0xaa);
		openbacklight();
		key_tmp=get_key();
		if(!key_tmp) continue;//等待按键
		//if(key_tmp) beep(50);
		if(key_tmp==VOID)//取消退出 
		{
			clear_lcd(0,MAX_LCD_NUM);
            return(CANCEL);
		}
		if(key_tmp==CLEAR)//清除 
		{
			set_value0(numkey,(uint)sizeof(numkey));
			clear_lcd(3,1);
			continue;
		}
		if(key_tmp>='0' && key_tmp<='9' ||
			key_tmp==KEY00 || key_tmp==POINT) //数字键
		{
			if(!tmp_receiver_no) key_num=2;
			rlt=get_valid_digit(key_tmp,0,key_num,numkey);
			if(tmp_receiver_no) //输入了收款员号后,输入密码不显示原文
			{
				memcpy(buf,"**************",strlen(numkey));
				buf[strlen(numkey)]=0;
			}
			else
				strcpy(buf,numkey);
			if(strlen(numkey)==0)
			 clear_lcd(3,1);
			lcd_disp(3,0,buf);
			if(rlt)
			{
				clear_lcd(3,1);
				num=0;
				set_value0(numkey,(uint)sizeof(numkey));
				strcpy(buf,"按键错误,请重新输入");
				lcd_disp(3,0,buf);
				continue;
			}
			continue;
		}
		else //功能键
		{
			num=numstr_to_long(numkey,0,2);	
		}
			

		switch(key_tmp)
		{
		case RECEIVER:
			if(num==0 ||
				num>MAX_RECEIVER_NUM || tmp_receiver_no)
			{
				clear_lcd(3,1);
				num=0;
				set_value0(numkey,(uint)sizeof(numkey));
				strcpy(buf,"该号超出范围,请重输");
				lcd_disp(3,0,buf);
				continue;
			}
			tmp_receiver_no=num;
			num=0;
			key_num=6;
			set_value0(numkey,(uint)sizeof(numkey));
			clear_lcd(1,3);
			sprintf(buf,"营业员号:%u  \r请输入密码:",(uint) tmp_receiver_no);
			lcd_disp(1,0,buf);
			continue;
		case CASH://现金/确认键
			if(num==0  || tmp_receiver_no==0)
			{
				clear_lcd(3,1);
				strcpy(buf,"按键错误,请重新输入");
				lcd_disp(3,0,buf);
				num=0;
				set_value0(numkey,(uint)sizeof(numkey));
				continue;
			}
			//从eeprom中读出该收款员的密码,并比较
			clear_lcd(3,1);
			strcpy(buf,"密码校验中...");
			lcd_disp(3,0,buf);
			if(read_eeprom(LOGON_PASSWORD+
				(tmp_receiver_no-1)*PASSWORD_LEN,PASSWORD_LEN,password))
				return(READ_EEPROM_FAIL);
		    password[PASSWORD_LEN]=0;
			sprintf(buf,"%lu",num);
			
			if(strcmp(password,buf))
			{
				clear_lcd(3,1);
				strcpy(buf,"密码不符,请重新输入");
				lcd_disp(3,0,buf);
				num=0;
				set_value0(numkey,(uint)sizeof(numkey));
				continue;
			}
			else
			{
				*receiver_no=tmp_receiver_no;
				clear_lcd(0,MAX_LCD_NUM);
                receiver_log=1;
				return(0);
			}
			break;
		default:
			clear_lcd(3,1);
			strcpy(buf,"按键错误,请重新输入");
			lcd_disp(3,0,buf);
			num=0;
			key_tmp=0;
			set_value0(numkey,(uint)sizeof(numkey));
			continue;

		}

	}
	return(0);
}


/*----------------------------------------------------
函数功能:	收款员退出过程 
入口参数:
          void
出口参数:
		== 0 正确
		!= 0 错误代码
全局变量:
作者  :
-----------------------------------------------------*/

uchar receiver_log_off(void)
{
	uchar key_tmp;
	uchar buf[50];
	key_tmp=0;
	clear_lcd(0,MAX_LCD_NUM);
	strcpy(buf,"按[确认]键退出\r[取消]键返回");
	lcd_disp(0,0,buf);
	while(1)
	{
		if(low_pwr) return(POWER_OFF);
		openbacklight();
		key_tmp=get_key();
		if(!key_tmp) continue;//等待按键
		
		if(key_tmp==VOID)//取消退出 
		{
			clear_lcd(0,MAX_LCD_NUM);
			return(CANCEL);
		}
		if(key_tmp!=CASH) //不为现金/确认键
		{
			clear_lcd(3,1);
			strcpy(buf,"按键错误,请重新输入");
			lcd_disp(3,0,buf);
			key_tmp=0;
			continue;
		}
		clear_lcd(0,MAX_LCD_NUM);
		//清除EEPROM中记录的登录收款员号
		buf[0]=0;
		if(write_eeprom(RECEIVER_NO,1,buf))
			return(WRITE_EEPROM_FAIL);
       receiver_log=0;
		return(0);
	}
	return(0);
}



/*--------------------------------------------------------------
功能:销售交易
输入:uchar is_trade,交易方式,=YES销售 =NO训练
返回值:没有错误返回0,否则返回有关错误
作者:
----------------------------------------------------------------*/
uchar exchange_function(uchar is_trade)
{
	uchar old_error,error;      //错误值
	uchar rlt;        //函数执行结果
	uchar i,x;

	//struct invoice_roll_struct invoice_roll; //发票卷信息
	struct branch_struct  xdata branch;
	struct record_struct xdata record; //当前交易的笔记录
	struct receiver_report_struct xdata receiver_report;
	struct day_report_struct xdata day_report;
	struct month_report_struct xdata month_report;

    struct parameter_struct xdata parameter;
	struct menu_struct xdata menu[MAX_MENU_NUM]; //当前台号的菜单信息
	struct plu_struct xdata plu;
	struct trade_info_struct xdata trade_info;
	struct invoice_roll_info_struct  xdata invoice_roll_info;
	struct money_add_struct xdata money_add;
	

    ulong  menu_price[MAX_MENU_NUM];
	uchar  key_tmp,old_key_tmp;   //按键保存
	uchar  numkey[20];            //保存按下的数字键(包括小数点)
	ulong  num;                   //数值
	ulong  quantity;              //当前商品的数量
	ulong  price;                 //当前商品的单价
	uint   plu_no;                //当前商品的PLU号
	uint   branch_no;             //当前商品的部门号
	ulong  tmp;                   //临时变量
	uchar  rate;                  //比率
	uchar  xdata  buf[50],buf1[30];
	uchar  xdata rtc[7]; //时钟
	uchar  time_old[3]; //时钟时、分、秒
	uchar  first;
	uchar  key_first;
    uchar  is_displaytime;        ////在WAITTRADE状态下按下了"数量"键后,该位置1,在WAITTRADE状态下按下了"清除"键后,该位置0
    uchar  in_plubarcode_hand;
    uchar  re_lcd;             //返回显示

	uchar pointlong=0;
	uchar is_fushu;
	uint j;

    //ulong  total_moneybuf; //打折前的商品总价
    ulong  retreat__money; //退票总金
	//初始化
	re_lcd=0;
    in_plubarcode_hand=0;//条码枪输入条码
	plu_no1=0;
	branch_no1=0 ; 

    
	is_displaytime=0;
	first=1;
	key_first=1;
	error=0;
	old_error=0;
	rlt=0;
	key_tmp=0;
	old_key_tmp=0;
	set_value0(numkey,(uint)sizeof(numkey));
	tmp=0;
	num=0;
	quantity=0;
	price=0;
	plu_no=0;
	init_trade_info(&trade_info);
	set_value0(&record,(uint)sizeof(record));
	set_value0(buf,(uint)sizeof(buf));
	set_value0(time_old,3);
	set_value0(buf1,(uint)sizeof(buf1));
	//trade_info.table_no=1;//默认为1号台
	set_value0(menu,(uint)sizeof(menu));
	
	if(is_trade==YES)
	{
		//检查是否到了新的一天并保存数据
		rlt=save_day_data();
		if(rlt)  return(rlt);
			//send_char(0xaa);
		//从EEPROM中读收款员号
		if(read_eeprom(RECEIVER_NO,2,buf))//&trade_info.receiver_no))
			return(READ_EEPROM_FAIL);
        trade_info.receiver_no=buf[0];	
		if(trade_info.receiver_no) //收款员登录过
		{
			//从税控卡获得发票卷的信息
			
			rlt=get_invoice_roll_info(&invoice_roll_info);
			if(rlt)
				return(rlt);
			trade_info.trade_status=WAITTRADE;first=1; //等待营业
		}
		
		else 
		{
			trade_info.trade_status=WAITRECEIVER;//等待收款员登录
		}
	}
	else
	{
		trade_info.trade_status=WAITTRADE;first=1; //等待营业(训练状态不需收款员登录)
	}
	
	//读参数结构
	if(read_eeprom(PARAMETER,(uint)sizeof(parameter),&parameter)) //固定服务费 //固定折扣 //辅币兑换率 // crc校验
      {return(READ_EEPROM_FAIL);}
	 // send_str((uint)sizeof(parameter),&parameter);
	if(crcxdata((uint)sizeof(parameter)-2,&parameter)!=parameter.crc)
	{
		if(g_tax_pin_pass)return(CRC_ERROR);
		else 
	    {
			parameter.fix_discount=0;
			parameter.fix_service=0;
			for(i=0;i<4;i++)
			parameter.bit_rate[i]=100;
			parameter.crc=crcxdata((uint)sizeof(parameter)-2,&parameter);
			if(write_eeprom(PARAMETER,(uint)sizeof(parameter),&parameter)) //共12字节
			{
				return(WRITE_EEPROM_FAIL);
			}
		}
	}
	 
	//交易主循环
	while(1)
	{
		if(!NO_Paperflg) open_Nopaper_Printing_light(1); //装好纸
        else           open_Nopaper_Printing_light(2);//缺纸
		if(low_pwr) return(POWER_OFF);//等1时表示已关掉了交流电
		else        shut_bat(1);     //防止中间掉电又来电此时法拉电容已打开
		if(!is_displaytime)openbacklight();

		key_tmp=0;
		key_tmp=get_key();
		
		//2004.10.25
		if(re_lcd==1){re_lcd=0;key_tmp=VOID;}//取消废票操作时清显示
		
		if(trade_info.trade_status==WAITTRADE && key_tmp==0 && !error)//训练状态
		{
			read_rtc(rtc);
          
			if(first)	clear_lcd(0,MAX_LCD_NUM);
		   
			if(is_trade==YES)
			{
				if(rtc[4]-time_old[1]>=1) //分
				{
					time_old[1]=rtc[4];//分
					//检查是否到了新的一天并保存数据
					rlt=save_day_data();
					if(rlt)
					{
						error=rlt;
						continue;
					}
					rlt=is_lock_mac(); //检查是否到了锁机日期
					if(rlt)
						return(rlt);
				}
			}
			if(first)
			{
				//clear_lcd(0,MAX_LCD_NUM);
				if(is_trade==YES)
				{

				   //读累加金额
				   if(read_eeprom(MONEY_ADD,(uint)sizeof(money_add),&money_add))
					return(READ_EEPROM_FAIL);
				   if(money_add.crc!=crcxdata((uint)sizeof(money_add)-2,&money_add))
					return(CRC_ERROR);
				   display_issue_msg(&invoice_roll_info,&money_add);
				}
				else
				{
				    
					strcpy(buf,"训练工作状态...\r请输入!");
					lcd_disp(1,0,buf);
				}
				//客显
				#ifdef __VFD_H_
				ClrVFD();
				DispNumVfd(0);
				DisplayVFD(2,VFD_DOT);
				#endif
				
				first=0;
			}
			/*
			if(rtc[5]-time_old[2]>=1 || first)	//更新秒
			{
				first=0;
				time_old[2]=rtc[5];//秒
				display_time(rtc,is_trade,trade_info.receiver_no,&invoice_roll_info);
			}*/
		}
		//#ifdef C8_VER
		if (key_tmp==0 && numkey[0]==0 && !error && (trade_info.trade_status==WAITTRADE||
			     trade_info.trade_status==TRADEING))
		{
			//条形码输入
			if(!in_plubarcode_hand) //条码枪输入条码
			{
				rlt=rece(14,buf);//bar_code(14,buf);
				if(rlt)
				{
					if(is_displaytime) 
					{
						read_rtc(rtc);
						display_time(rtc,0,is_trade);//显示开票累计限额等	
					}
					continue;
				}
				//lcd_disp(2,0,buf);
		
				if(buf[13]!=0x0d)
				{
					error=rlt;
					strcpy(buf,"条码输入无效");
					lcd_disp(3,0,buf);
					continue;
				}
				
				buf[12]=0;
				in_plubarcode_hand=1;
			}
			/*else 
			{
				//if(!input_plu_barcode)continue;
				//in_plubarcode_hand=0;
				send_str(6,buf);
			}
			*/
			
			rlt=get_plu_by_barcode(&plu_no,buf); //得到PLU号第几个商品 
			
			if(rlt)
			{
				error=rlt;

⌨️ 快捷键说明

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