📄 deal_data.c
字号:
/*---------------------------------------------------------------
税控数据(电子票根、日记录、发票卷、申报数据)的存储、查找
作者:
-------------------------------------------------------------*/
#include "include.h"
/*---------------------------------------------------------------
功能:检查是否到了锁机日期
返回值:到了开票截止日期、或小于应用启用日期或
大于应用有效日期返回LOCK_DATE,否则返回0,读时钟错误返回READ_CLOCK_FAIL
/*-------------------------------------------------------------*/
uchar is_lock_mac()
{
uchar xdata tmp[7];
if (read_rtc(tmp))
return(READ_CLOCK_FAIL);//读时钟错误
if(memcmp(tmp,&g_user_info.issue_deline_date[1],3)>0 //开票截止日期 //年月日
||memcmp(tmp,&g_user_info.application_date[1],3)<0 //应用启用日期
||memcmp(tmp,&g_user_info.application_valid_date[1],3)>0) //应用有效日期
return(LOCK_DATE);
else
{
if(memcmp(tmp,&g_user_info.issue_deline_date[1],3)==0)lastday_to_trade=1;
else lastday_to_trade=0;
return(0);
}
}
//=============================================================================
/* plu_no从0开始
*/
uchar get_plu(struct plu_struct * plu,uint plu_no)
{
uchar buf[10];
if(read_sramb(PLU_START_ADDR+(ulong)plu_no*(uint)sizeof(*plu),
(uint)sizeof(*plu),plu))
return(READ_SRAM_FAIL);
if(crcxdata((uint)sizeof(*plu)-2,plu)!=plu->crc)
return(CRC_ERROR);
//if(lrcdata((uint)sizeof(*plu)-1,1,plu)!=plu->lrc)
//return(LRC_ERROR);
if(plu->name[0]==0)//没有初始化
{
sprintf(plu->name,"商品%u",plu_no+1);
plu->branch=plu_no%MAX_BRANCH_NUM+1;
sprintf(buf,"%06u",plu_no);
memcpy(plu->bar_code,buf,(uint)sizeof(plu->bar_code));
plu->price=100;
if(g_tax_pin_pass)
plu->tax_item=g_tax_catalog[0].tax_item;
else
plu->tax_item=1;
}
return(0);
}
//=================================================================================
uchar get_plu_by_barcode(uint * plu_no,uchar * bar_code)
{
uint i,j,k;
uchar buf[30];
struct plu_struct plu;
//二分法查找
i=0; j=g_max_plu_no-1;//MAX_PLU_NUM;
while (i<=j)
{
openbacklight();
if(low_pwr)return(POWER_OFF);//等1时表示已关掉了交流电
k=(i+j)/2;
//send_char(k);
if(read_sramb(PLU_START_ADDR+(ulong)k*(uint)sizeof(plu),
(uint)sizeof(plu),&plu))
return(READ_SRAM_FAIL);//if(read_plu(k,&plu))return(READ_SRAM_FAIL);
HexToStr(plu.bar_code,buf,(uint)sizeof(plu.bar_code));
if(memcmp(buf,bar_code,(uint)sizeof(plu.bar_code)*2)==0)
{
//i=k-1;
*plu_no=k+1;
return(0);
}
else if (memcmp(buf,bar_code,(uint)sizeof(plu.bar_code)*2)>0)
{
if(k==0)break;
j=k-1;
}
else
{
if(k==g_max_plu_no-1)break;
i=k+1;
}
}
/*
for(i=0;i<g_max_plu_no;i++)
{
openbacklight();
if(low_pwr)//等1时表示已关掉了交流电
{
return(POWER_OFF);
}
if(read_plu(i,&plu))
//if(read_sramb(PLU_START_ADDR+(ulong)i*(uint)sizeof(plu),
//(uint)sizeof(plu),&plu))
return(READ_SRAM_FAIL);
if(crcxdata((uint)sizeof(plu)-2,&plu)!=plu.crc)
return(CRC_ERROR);
//if(lrcdata((uint)sizeof(plu)-1,1,&plu)!=plu.lrc)
//return(LRC_ERROR);
HexToStr(plu.bar_code,buf,(uint)sizeof(plu.bar_code));
if(memcmp(buf,bar_code,(uint)sizeof(plu.bar_code)*2)==0)
{
*plu_no=i+1;
return(0);
}
}
*/
return(PLU_NOT_FOUND);
}
//==========================================================================
/*根据部门号获取部门数据*/
uchar get_branch(struct branch_struct * branch,uint branch_no)
{
if(read_eeprom(BRANCH_ADDR+branch_no*(uint)sizeof(*branch),
(uint)sizeof(*branch),branch))
return(READ_EEPROM_FAIL);
//校验
//if(lrcdata((uint)sizeof(*branch)-1,1,branch)!=branch->lrc)
//return(LRC_ERROR);
if((branch->name[0]==0)||(lrcdata((uint)sizeof(*branch)-1,1,branch)!=branch->lrc)) //没有初始化
{
sprintf(branch->name,"部门%u",branch_no+1);
if(g_tax_pin_pass)
branch->tax_item=g_tax_catalog[0].tax_item;
else
branch->tax_item=1;
}
return(0);
}
//===========================================================
uchar get_tax_item_index(uchar tax_item)
{
uchar i;
for(i=0;i<CATALOG_NUM;i++)
{
if(g_tax_catalog[i].tax_item==tax_item)
return(i); //返回对应下标
}
return(0);
}
/*---------------------------------------------------------------
功能:计算笔记录在FLASH中的当前保存地址
入口参数: RecordAddr上一笔记录的结束地址及所在扇区的笔记录地址结构
出口参数: newRecordAddr:该笔记录的起始地址及所在扇区的笔记录地址结构
返回值:成功返回0,否则返回其它错误
/*-------------------------------------------------------------*/
uchar calc_record_addr(const struct record_addr_struct RecordAddr,
struct record_addr_struct* newRecordAddr,
uint record_length)
{
uchar i,j;
uint size;
ulong addr;
//uchar buf[5];
i=0;
size=0;
if(RecordAddr.record_addr+record_length<RECORD_START_ADDR || RecordAddr.record_sector<RECORD_SECTOR[0] ||
RecordAddr.record_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SECTOR)-1]||
RecordAddr.start_sector<RECORD_SECTOR[0] ||
RecordAddr.start_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SECTOR)-1])
return(ADDR_FLASH_FAIL); //地址错
while(1) //找出新扇区
{
size+=RECORD_SIZE[i]; //电子票根扇区容量(KB)累计
addr=(ulong)size*1024+RECORD_START_ADDR-1;
if(addr>=RecordAddr.record_addr+record_length)
break;
i=(i+1)%((uint)sizeof(RECORD_SIZE));//共18个扇区
}
newRecordAddr->record_sector=RECORD_SECTOR[i];
if (newRecordAddr->record_sector!=RecordAddr.record_sector) //需要换扇区
{
//HYS620
if (flash_sector_erase(newRecordAddr->record_sector))
return(ERASE_FLASH_FAIL);
//END HYS620
if(RecordAddr.start_sector>=newRecordAddr->record_sector)
{
/*if(newRecordAddr->record_sector==RECORD_SECTOR[0])//表示需要滚存
{
if(read_eeprom(OVER_record__ROLL,2,buf))
return(READ_EEPROM_FAIL);
if(buf[0]==0)buf[0]=1;
else buf[0]=0;
if(write_eeprom(OVER_record__ROLL,1,buf))
return(READ_EEPROM_FAIL);
}*/
//擦出该扇区
// if (flash_sector_erase(newRecordAddr->record_sector))
// return(ERASE_FLASH_FAIL);
newRecordAddr->start_sector++;
if(newRecordAddr->start_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SIZE)-1])
newRecordAddr->start_sector=RECORD_SECTOR[0];
}
//计算该扇区的开始地址
size=0;
for(j=0;j<i;j++)
size+=RECORD_SIZE[j];
newRecordAddr->record_addr=(ulong)size*1024+RECORD_START_ADDR;
}
else
newRecordAddr->record_addr=RecordAddr.record_addr+1;
if(newRecordAddr->record_addr<RECORD_START_ADDR || newRecordAddr->record_sector<RECORD_SECTOR[0] ||
newRecordAddr->record_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SECTOR)-1] ||
newRecordAddr->start_sector<RECORD_SECTOR[0] ||
newRecordAddr->start_sector>RECORD_SECTOR[(uint)sizeof(RECORD_SECTOR)-1])
return(ADDR_FLASH_FAIL); //地址错
newRecordAddr->crc=crcxdata((uint)sizeof(newRecordAddr)-2,newRecordAddr);
return(0);
}
//=======================================================================================
/*---------------------------------------------------------------
功能:在明细中找发票记录
入口参数: invoice_no发票号
findmode:找的模式 0,不要找是否已退票,1:要判断是否已退票
//*invoice_roll_code 发票卷的代号
出口参数: * record:该发票的记录
返回值:成功返回0,否则返回其它错误
/*-------------------------------------------------------------*/
uchar locate_invoice(ulong invoice_no,struct record_struct * record,uchar findmode)
{
struct record_addr_struct xdata RecordAddr;
struct record_struct xdata mrecord;
uchar i,j;
uchar tmp;
uchar sector; //扇区号
uchar start; //是否为某扇区的开始地址
uint size;
ulong addr;
uint crc;
uchar lrc;
ulong first_add;
uchar find;
uint recod_long;
//send_str(4,&invoice_no);
//从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);
}
// send_str((uint)sizeof(RecordAddr),&RecordAddr);
if(RecordAddr.record_addr==RECORD_START_ADDR) //没有写数据
return(1);
//从起始扇区顺序读
size=0;
sector=RecordAddr.start_sector;
for(i=RECORD_SECTOR[0],j=0;i<RecordAddr.start_sector;i++,j++)
size+=RECORD_SIZE[j]; //KBYTE
addr=(ulong)size*1024+RECORD_START_ADDR; //当前扇区的起始地址
start=1;
find=0;
while(addr!=RecordAddr.record_addr) //没到最后写的一笔记录的结束地址
{
if(!start)
addr++; //同扇区的下一张票的起始地址
//先读出该票的项目数
if(read_flash(addr,1,&tmp))
return(READ_FLASH_FAIL);
if(tmp==0xFF)//没有写数据则换扇区
{
sector++;
if(sector>RECORD_SECTOR[(uint)sizeof(RECORD_SIZE)-1])
sector=RECORD_SECTOR[0];
//sector扇区的起始地址
size=0;
for(i=RECORD_SECTOR[0],j=0;i<sector;i++,j++)
size+=RECORD_SIZE[j]; //KBYTE
addr=(ulong)size*1024+RECORD_START_ADDR;
start=1;
continue;
}
//2005.7.26
if(read_flash(addr+RECORD_LENGTH-1,1,&tmp))
return(READ_FLASH_FAIL);
//读出记录全部信息
if(read_flash(addr,(uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord))
return(READ_FLASH_FAIL);
//send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
//if(mrecord.invoice_no==invoice_no)send_str((uint)(RECORD_LENGTH+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])
{
//重读一次
if(read_flash(addr,(uint)(RECORD_LENGTH+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);
}
//send_str(4,&mrecord.invoice_no);
if(!find)
{
if(mrecord.invoice_no==invoice_no) //找到返回
{
//send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
if(!findmode)//只找明细不管发票类型
{
*record=mrecord;
//send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
return(0);
}
else
{
find=1;
first_add=addr;
recod_long=(uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1);
}
}
}
else if(findmode)
{
if((mrecord.valid_inv_no==invoice_no)&&(mrecord.invoice_type!=NORMAL_INVOICE)) //已退票
return(2);
}
addr+=RECORD_LENGTH+(uint)INVOICE_ITEM_LEN*tmp; //该票的结束地址
if(addr==RecordAddr.record_addr) //到最后写的一笔记录的结束地址
{
//send_str((uint)(RECORD_LENGTH+INVOICE_ITEM_LEN*tmp+1),&mrecord);
if(find) //未退过票
{
//读出记录全部信息
if(read_flash(first_add,recod_long,&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);
*record=mrecord;
return(0);
}
else return(1);
}
size=0;
for(i=RECORD_SECTOR[0],j=0;i<RECORD_SECTOR[(uchar)sizeof(RECORD_SECTOR)];i++,j++)
size+=RECORD_SIZE[j]; //KBYTE
if(addr==(ulong)size*1024+RECORD_START_ADDR) //该票的结束地址到了最后一个扇区的结束地址
{
addr=RECORD_START_ADDR;//开始扇区的起始地址
start=1;
}
else
start=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -