📄 possystem.c
字号:
//////////////////////////////////////////////////////////////////////////
// Pos机主函数文件入口
//////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <ncurses.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include "PosSystem.h"
#include "OracleDB.h"
char name[100];
char id[20];
//取得节点
void * GetNodeData(LINKLIST* linklist,int cur)
{
void * node=get_node_by_index(linklist,cur)->node_data;
return node;
}
//单页上下滚动反白显示
//win是指定窗口 lines代表的是每页显示多少条,dir代表输入的键码 *cur代表的是当前第几条 linklist这个是链表
void option_reverse(WINDOW* win,int lines,int dir,int *cur,LINKLIST* linklist)
{
//char * ps=(char *)get_node_by_index(linklist,*cur);
if((*cur == 1 && dir == KEY_UP) || (*cur == lines && dir == KEY_DOWN) || (*cur==linklist->count && dir == KEY_DOWN))
return;
if(*cur==1)
{
wattron(win,A_REVERSE);//反白显示上一行
mvwprintw(win,(*cur)-1,0,((BillID *)GetNodeData(linklist,*cur))->no);
wattroff(win,A_REVERSE);
wrefresh(win);
}
if(dir == KEY_UP)
{
mvwprintw(win,(*cur)-1,0,((BillID *)GetNodeData(linklist,*cur))->no);//恢复当前行
(*cur)--;
wattron(win,A_REVERSE);//反白显示上一行
mvwprintw(win,(*cur)-1,0,((BillID *)GetNodeData(linklist,*cur))->no);
wattroff(win,A_REVERSE);
wrefresh(win);
}
else if(dir == KEY_DOWN)
{
mvwprintw(win,(*cur)-1,0,((BillID *)GetNodeData(linklist,*cur))->no);//恢复当前行
(*cur)++;
wattron(win,A_REVERSE);//反白显示下一行
mvwprintw(win,(*cur)-1,0,((BillID *)GetNodeData(linklist,*cur))->no);//恢复当前行
wattroff(win,A_REVERSE);
wrefresh(win);
}
wattron(win,A_REVERSE);//反白显示下一行
mvwprintw(win,0,0,"%8d",*cur);
wattroff(win,A_REVERSE);
wrefresh(win);
}
//单页上下滚动反白显示
//参数说明
//win是指定窗口 cursorLocation代表的是当前光标的位置,
//currentRecNo当前记录号 linklist这个是链表
void ListOption_reverse(WINDOW* win,int cursorLocation,int currentRecNo,LINKLIST* linklist)
{
wattron(win,A_REVERSE);//反白显示上一行
mvwprintw(win,cursorLocation-1,2,((BillID *)GetNodeData(linklist,currentRecNo))->no);
wattroff(win,A_REVERSE);
wrefresh(win);
// wattron(win,A_REVERSE);//反白显示下一行
// mvwprintw(win,0,0,"%5d",cursorLocation);
// wattroff(win,A_REVERSE);
// wrefresh(win);
}
//挂单项反白显示
void HandBillItem_reverse(WINDOW* win,int cursorLocation,int currentRecNo,LINKLIST* linklist)
{
wattron(win,A_REVERSE);//反白显示上一行
mvwprintw(win,cursorLocation-1,2,(char *)GetNodeData(linklist,currentRecNo));
wattroff(win,A_REVERSE);
wrefresh(win);
}
void saleRecord_reverse(WINDOW* win,int cursorLocation,int currentRecNo,LINKLIST* linklist)
{
wattron(win,A_REVERSE);//反白显示上一行
saleProduct * pSaleProduct=(saleProduct *)GetNodeData(linklist,currentRecNo);
mvwprintw(win,cursorLocation-1,0,"%-6d%-10s%-30s%-6s%-7s%-7.2f%-6d%-6.2f",currentRecNo,pSaleProduct->bar_code,pSaleProduct->product_name,pSaleProduct->unit,pSaleProduct->spec,pSaleProduct->sale_price,pSaleProduct->amount,pSaleProduct->money);
wattroff(win,A_REVERSE);
wrefresh(win);
// wattron(win,A_REVERSE);//反白显示下一行
// mvwprintw(win,0,0,"%5d",cursorLocation);
// wattroff(win,A_REVERSE);
// wrefresh(win);
}
//取得系统时间
void GetSystemTime(char * timeString)
{
time_t temp_time;//定义 nowtime是一个time_t类型的变量 time_t就是long类型的别名
time(&temp_time);//取得从纪元开至今的秒数
struct tm * systime=localtime(&temp_time);//将秒数将换成 年 月 日
strftime(timeString,sizeof("20080101010101"),"%Y%m%d%H%M%S",systime);
return;
}
//读取配制文件 返回1就是读取失败 0就是成功 第一个参数是数据要存的指针,第二个是最多读取信息数 第三个指向是用来返回最终读取了多少条信息
int ReadConfigInfo(struct configInfo * config,int maxReadCount,int *alreadyReadCount)
{
FILE * file=fopen("pos.conf","r");
if(file==NULL)
{
printf("File Open Error");
return 1;
}
//struct configInfo config[10];
char buffer[128]={0};
int buffer_size=128;
int read_count=0;
while(fgets(buffer,buffer_size,file)!=NULL)
{
if(buffer[0]!=35 && buffer[0]!='\n') //#的ascii码为35
{
int position=0; //字符保存的位置
char * pBuffer=buffer;
//取出键名
while(!isspace(*pBuffer))
{
*(config[read_count].keyname+position)=*pBuffer;//将字符保存进结构体
position++;
pBuffer++;
}
*(config[read_count].keyname+position)='\0';
//printf("%s\t",&(config[read_count].keyname));
//从键名后查找非空字符的位置
while(isspace(*(++pBuffer)))
{}
position=0;
//将非空字符保存起来,直到回车符为止
while(*pBuffer!='\n')
{
*(config[read_count].value+position)=*pBuffer;
position++;
pBuffer++;
}
*(config[read_count].value+position)='\0';
//printf("%s\n",&(config[read_count].value));
read_count++;
if(read_count>=maxReadCount)
{
break;
}
}
}
/*
int size;
for (size=0;size<read_count; size++)
{
printf("%s\t",config[size].keyname);
printf("%s\n",config[size].value);
}
*/
*alreadyReadCount=read_count;
fclose(file);
//getchar();
return 0;
}
//新增明细窗口
int NewListWindow(int startY,int startX,char * title,char * barcode,int * amount)
{
char barcod[20]={'0'};
char number[10]={'0'};
sprintf(number,"%d",*amount);
scr_dump("save.scr");
int ListWindowHight=10;
int ListWindowWidth=33;
int result=0;
WINDOW * win=CreateWindow(ListWindowHight,ListWindowWidth,startY,startX,Yes,RED_BLACK);
StringCenterPrint(win,1,title);
wrefresh(win);
printhline(win,2,1,ListWindowWidth-2);//画水平线
mvwprintw(win,3,5,"商品条形码:");
wrefresh(win);
//创建条形码输入框
WINDOW * BarCodeInputWin=CreateWindow(1,10,startY+3,startX+16,No,WHITE_BLACK);
mvwprintw(BarCodeInputWin,0,0,barcode);
wrefresh(BarCodeInputWin);
printhline(win,4,1,ListWindowWidth-2);//画水平线
mvwprintw(win,5,11,"数量:");
//创建数量输入框
WINDOW * numberInputWin=CreateWindow(1,10,startY+5,startX+16,No,WHITE_BLACK);
mvwprintw(numberInputWin,0,0,number);
wrefresh(numberInputWin);
WINDOW * okButton=CreateButtonWindow(startY+7,startX+7,No,RED_BLACK,"确定");
WINDOW * returnButton=CreateButtonWindow(startY+7,startX+18,No,RED_BLACK,"返回");
wrefresh(win);
wrefresh(BarCodeInputWin);
wrefresh(numberInputWin);
int ch;
while(1)
{
// BarCodeInputWin:
// while(1)
// {
// ch=GetString(BarCodeInputWin,0,0,barcod,14);
// switch(ch)
// {
// case KEY_DOWN:
// case '\n'://转到numberInputWin下面
// goto numberInputWin;
// break;
// }
// }
numberInputWin:
while(1)
{
ch=GetNumber(numberInputWin,0,0,number,5);
switch(ch)
{
// case KEY_UP:
// goto BarCodeInputWin;
// break;
case KEY_DOWN:
case '\n':
goto okButton;
break;
}
}
okButton:
while(1)
{
IntoButtonWindow(okButton,WHITE_RED);
ch=wgetch(okButton);
switch(ch)
{
case KEY_UP:
LeaveButtonWindow(okButton,RED_BLACK);
goto numberInputWin;
break;
case KEY_DOWN:
case KEY_RIGHT:
LeaveButtonWindow(okButton,RED_BLACK);
goto returnButton;
break;
case '\n':
{
if(isNull(number))
{
Message_Box(10,30,10,10,RED_WHITE,"提示","输入框不能空值");
wclear(numberInputWin);
wrefresh(numberInputWin);
goto numberInputWin;
}
}
LeaveButtonWindow(okButton,RED_BLACK);
result=0;
goto exit;
}
}
returnButton:
while(1)
{
IntoButtonWindow(returnButton,WHITE_RED);
ch=wgetch(returnButton);
switch(ch)
{
case KEY_LEFT:
case KEY_UP:
LeaveButtonWindow(returnButton,RED_BLACK);
//IntoButtonWindow(okButton,WHITE_RED);
goto okButton;
break;
case '\n':
LeaveButtonWindow(returnButton,RED_BLACK);
result=1;
goto exit;
break;
}
}
}
exit:
if(result==0)//确定退出再转换数字
{
*amount=atoi(number);
}
DestroyWindow(win);
DestroyWindow(BarCodeInputWin);
DestroyWindow(numberInputWin);
scr_restore("save.scr");
refresh();
return result;//返回选择的值,如确定就是0,返回就是1
}
//删除明细窗口
int DelListWindow(int startY,int startX,char * title,saleProduct * salePro,int * amount)
{
char barcod[20]={'0'};
char number[10]={'0'};
sprintf(number,"%d",*amount);
scr_dump("save.scr");
int ListWindowHight=10;
int ListWindowWidth=33;
int result=0;
WINDOW * win=CreateWindow(ListWindowHight,ListWindowWidth,startY,startX,Yes,RED_BLACK);
StringCenterPrint(win,1,title);
wrefresh(win);
printhline(win,2,1,ListWindowWidth-2);//画水平线
mvwprintw(win,3,5,"商品条形码:");
wrefresh(win);
//创建条形码输入框
WINDOW * BarCodeInputWin=CreateWindow(1,10,startY+3,startX+16,No,WHITE_BLACK);
mvwprintw(BarCodeInputWin,0,0,salePro->bar_code);
wrefresh(BarCodeInputWin);
printhline(win,4,1,ListWindowWidth-2);//画水平线
mvwprintw(win,5,11,"数量:");
//创建数量输入框
WINDOW * numberInputWin=CreateWindow(1,10,startY+5,startX+16,No,WHITE_BLACK);
mvwprintw(numberInputWin,0,0,number);
wrefresh(numberInputWin);
WINDOW * okButton=CreateButtonWindow(startY+7,startX+7,No,RED_BLACK,"确定");
WINDOW * returnButton=CreateButtonWindow(startY+7,startX+18,No,RED_BLACK,"返回");
wrefresh(win);
wrefresh(BarCodeInputWin);
wrefresh(numberInputWin);
int ch;
while(1)
{
// BarCodeInputWin:
// while(1)
// {
// ch=GetString(BarCodeInputWin,0,0,barcod,14);
// switch(ch)
// {
// case KEY_DOWN:
// case '\n'://转到numberInputWin下面
// goto numberInputWin;
// break;
// }
// }
numberInputWin:
while(1)
{
ch=GetNumber(numberInputWin,0,0,number,5);
switch(ch)
{
// case KEY_UP:
// goto BarCodeInputWin;
// break;
case KEY_DOWN:
case '\n':
goto okButton;
break;
}
}
okButton:
while(1)
{
IntoButtonWindow(okButton,WHITE_RED);
ch=wgetch(okButton);
switch(ch)
{
case KEY_UP:
LeaveButtonWindow(okButton,RED_BLACK);
goto numberInputWin;
break;
case KEY_DOWN:
case KEY_RIGHT:
LeaveButtonWindow(okButton,RED_BLACK);
goto returnButton;
break;
case '\n':
LeaveButtonWindow(okButton,RED_BLACK);
result=0;
goto exit;
}
}
returnButton:
while(1)
{
IntoButtonWindow(returnButton,WHITE_RED);
ch=wgetch(returnButton);
switch(ch)
{
case KEY_LEFT:
case KEY_UP:
LeaveButtonWindow(returnButton,RED_BLACK);
//IntoButtonWindow(okButton,WHITE_RED);
goto okButton;
break;
case '\n':
LeaveButtonWindow(returnButton,RED_BLACK);
result=1;
goto exit;
break;
}
}
}
exit:
if(result==0)//确定退出再转换数字
{
*amount=atoi(number);
if(isNull(number))
{
Message_Box(10,30,10,10,RED_WHITE,"提示","不能输入空值");
wclear(numberInputWin);
wrefresh(numberInputWin);
goto numberInputWin;
}
if(*amount<0 || *amount>salePro->amount)
{
Message_Box(10,30,10,10,RED_WHITE,"提示","输入的数值超出范围");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -