📄 trade.c
字号:
/*-------------------------------------------------------------
功能:交易和交易培训
说明:符合国家标准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),¶meter)) //固定服务费 //固定折扣 //辅币兑换率 // crc校验
{return(READ_EEPROM_FAIL);}
// send_str((uint)sizeof(parameter),¶meter);
if(crcxdata((uint)sizeof(parameter)-2,¶meter)!=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,¶meter);
if(write_eeprom(PARAMETER,(uint)sizeof(parameter),¶meter)) //共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 + -