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

📄 possystem.c

📁 在linux平台下模拟超市的收银系统即POS机
💻 C
📖 第 1 页 / 共 3 页
字号:
//////////////////////////////////////////////////////////////////////////
//					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 + -