📄 deal_data.c
字号:
}
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 + -