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

📄 cash_manage.c

📁 LINUX下POS收银系统,可以对货物及工作人员进行管理.近本实现增删改查的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/*#include "dialog_frame.h"*/
#include "cash_manage.h"
#include "roll_bar.h"
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int node_exist_judge(LINK *link,char *str);
/*
scr_dump(scan.dat);//屏幕保存
scr_restore(scan.dat);//屏幕恢复
*/
extern int (*fp1)(NODE *node,char * key);


////////////////////////////////////////////////////////辅助函数
int getInputString(ROLL_BAR *r)
{
	int sign=0;
	sign=(*(r->input))->input_char(*(r->input),1,1,1);
	return sign;
}

int (*fp11)(ROLL_BAR *r)=getInputString;
/*
typedef struct sell_goods_list
{
	int sell_list_id;
    char bar_code[9];
	int sell_ID;
    int total_count;
	float sell_price;

}SELL_GOODS_LIST;*/
void print_a_node(ROLL_BAR *r,int choise)
{
	NODE *temp=NULL;
	temp=(*(r->link))->get_node_by_index((*(r->link)),r->current_suffix);
	if(choise)
	{
		(*(r->frame+1))->color=*(r->colors+1);
	}
	else
	{
		(*(r->frame+1))->color=*(r->colors);
	}
	mvwprintw((*(r->frame+1))->win,0,0,"%-8d%-12s%-8d%-8d%-8.2f",
		((SELL_GOODS_LIST *)(temp->data))->sell_list_id,((SELL_GOODS_LIST *)(temp->data))->bar_code,((SELL_GOODS_LIST *)(temp->data))->sell_ID
		,((SELL_GOODS_LIST *)(temp->data))->total_count,((SELL_GOODS_LIST *)(temp->data))->sell_price);
	(*(r->frame+1))->draw(*(r->frame+1));
}
void print_aa_page(ROLL_BAR *r)
{
	int i=0;
	if((*(r->link))->count < r->height_and_length[0])
	{
		r->current_suffix++;
		for (i=1;i<(*(r->link))->count;i++)
		{
			mvwin((*(r->frame+1))->win,r->startXY[0]+i,r->startXY[1]);
			print_a_node(r,0);
			r->current_suffix++;
		}

	}
	else
	{
		r->current_suffix++;
		for (i=1;i< r->height_and_length[0];i++)
		{
			mvwin((*(r->frame+1))->win,r->startXY[0]+i,r->startXY[1]);
			print_a_node(r,0);
			r->current_suffix++;
		}
	}
	r->current_suffix=1;
	mvwin((*(r->frame+1))->win,r->startXY[0],r->startXY[1]);
	print_a_node(r,1);

}
///////////////////////////////////////////////////////////////////////////////////删除全部
void del_all_list(LINK *note)
{
	del_sell_list_by_sell_id(((SELL_GOODS_LIST *)(note->head->next->data))->sell_ID);
	note->del_all_data(note);
}
///////////////////////////////////////////////////////////////////////////////////删除一个
void del_one_record(LINK *note,ROLL_BAR *r)
{
	NODE *temp=note->get_node_by_index(note,r->current_suffix);
	del_sell_list_by_bar_code(((SELL_GOODS_LIST *)(note->head->next->data))->bar_code);
	note->del_node_by_index(note,r->current_suffix);
}
///////////////////////////////////////////////////////////////////////////////////滚动界面控制
void action_roll_bar(ROLL_BAR *r,LINK *note)
{
	int result=0;
	int sign=1;
	int i=0;
	int place=0;
	BUTTON *b[3];
	b[0]=createButton(22,17,3,8,"全删");
	b[1]=createButton(22,27,3,8,"删除");
	b[2]=createButton(22,37,3,8,"退出");
	b[0]->setColor(b[0],3,1,4);
	b[1]->setColor(b[1],3,1,4);
	b[2]->setColor(b[2],3,1,4);
	b[0]->show(b[0]);
	b[1]->show(b[1]);
	b[2]->show(b[2]);
	do
	{
		result=r->get_input_string(r,fp11);
		switch (result)
		{
		case 1:
			if(0 == (*(r->link))->count)
			{
				continue;
			}
			if (r->current_place>1)
			{
				mvwin((*(r->frame+1))->win,r->startXY[0]+r->current_place-1,r->startXY[1]);
				print_a_node(r,0);
				r->current_place--;
				r->current_suffix--;
				mvwin((*(r->frame+1))->win,r->startXY[0]+r->current_place-1,r->startXY[1]);
				print_a_node(r,1);
			} 
			else
			{
				if (r->current_suffix>1)
				{
					r->current_suffix--;
					mvwin((*(r->frame+1))->win,r->startXY[0],r->startXY[1]);
					print_a_node(r,1);
					for (i=1;i<r->height_and_length[0];i++)
					{
						r->current_suffix++;
						mvwin((*(r->frame+1))->win,r->startXY[0]+r->current_place+i-1,r->startXY[1]);
						print_a_node(r,0);
					}
					r->current_suffix-=r->height_and_length[0]-1;
					
				} 
				else
				{
					continue;
				}
			}
			break;
		case 2:
			if(0 == (*(r->link))->count)
			{
				continue;
			}
			if(r->current_suffix<(*(r->link))->count)
			{
				if (r->current_place<r->height_and_length[0])
				{
					mvwin((*(r->frame+1))->win,r->startXY[0]+r->current_place-1,r->startXY[1]);
					print_a_node(r,0);
					r->current_place++;
					r->current_suffix++;
					mvwin((*(r->frame+1))->win,r->startXY[0]+r->current_place-1,r->startXY[1]);
					print_a_node(r,1);
				} 
				else
				{
					r->current_suffix++;
					mvwin((*(r->frame+1))->win,r->startXY[0]+r->current_place-1,r->startXY[1]);
					print_a_node(r,1);
					for (i=1;i<r->height_and_length[0];i++)
					{
						r->current_suffix--;
						mvwin((*(r->frame+1))->win,r->startXY[0]+r->current_place-1-i,r->startXY[1]);
						print_a_node(r,0);
					}
					r->current_suffix+=r->height_and_length[0]-1;
				}
			}
			else
			{
				continue;
			}
			break;
		case 9:
			do
			{
				if(place == 4)
				{
					place = 1;
				}
				else
				{
					place++;
				}
				if(place == 4)
				{
					break;
				}
				switch (place)
				{
				case 1:
					b[0]->pitch_on(b[0]);
					sign=b[0]->attack(b[0],3,2,2);
					if(sign == 0)
					{
						del_all_list(note);
						messagebox(stdscr,7,19,44,12,PAUSE,"退货成功");
					}
					break;
				case 2:
					b[1]->pitch_on(b[1]);
					sign=b[1]->attack(b[1],1,3,3);
					if(sign == 0)
					{
						del_one_record(note,r);
						sign=9;
						place--;
					}
					break;
				case 3:
					b[2]->pitch_on(b[2]);
					sign=b[2]->attack(b[2],2,1,1);
					break;
				}

			}
			while (1);
			break;
		}
	}
	while (sign);
	b[0]->free(&b[0]);
	b[1]->free(&b[1]);
	b[2]->free(&b[2]);
}

////////////////////////////////////////////////////////////////////////////添加明细
void show_add_list(DIALOG *d)
{
	scr_dump("scan.dat");//屏幕保存
	box((*(d->f))->win,0,0);
	mvwprintw((*(d->f))->win,0,12,"%s",*(d->str));
	mvwprintw((*(d->f))->win,2,3,"%s",*(d->str+1));
	mvwprintw((*(d->f))->win,4,5,"%s",*(d->str+2));
	mvwprintw((*(d->f))->win,6,1,"%s",*(d->str+3));
	(*(d->f))->draw(*(d->f));
	(*((d->f)+1))->draw(*((d->f)+1));
	(*((d->f)+2))->draw(*((d->f)+2));
	(*(d->b))->setColor(*(d->b),3,1,4);
	(*((d->b)+1))->setColor(*((d->b)+1),3,1,4);
	(*(d->b))->show(*(d->b));
	(*((d->b)+1))->show(*((d->b)+1));
	WINDOW *input=derwin((*(d->f))->win,1,2,2,10);
	wattron(input,COLOR_PAIR(1));
	wbkgd(input,COLOR_PAIR(1));
	mvwprintw(input,0,0,"CN");
	touchwin(input);
	wrefresh(input);
	
}
void (*fp2)(DIALOG *d)=show_add_list;

int action(DIALOG *d)
{
	int result=0,sign=1;
	int node_exist=0;
	int count=0,i=0;
	NODE *temp=NULL;
	int len=strlen((*(d->i))->str)+3;
	char *t=(char *)malloc(len);
	memset(t,0,len);
	do
	{
		switch (sign)
		{
		case 1:
			sign=(*(d->i))->input_char(*(d->i),1,0,1);
			if(sign==27)
			{
				sign=messagebox(stdscr,7,19,44,12,YORN,"确认要退出");
				if(sign)
				{
					sign=0;
					break;
				}
				else
				{
					sign=1;
				}
			}
			del_blank((*(d->i))->str);
			if(isdigital((*(d->i))->str) == 0 || strlen((*(d->i))->str) == 0)
			{
				/*请输入数字*/
				messagebox(stdscr,7,19,44,12,PAUSE,"请输入数字");
				sign=1;

			}
			break;
		case 2:
			strcpy(t,"CN");
			strcat(t,(*(d->i))->str);
			count=select_db_goods(t);//数据库中有几个该货物
			if (count == -1)//数据库中无该货物
			{
				sign=1;
				/*显示不存在*/
				messagebox(stdscr,7,19,44,12,PAUSE,"仓库中没这东西");
			}
			else//数据库中有该货物
			{
				mvwprintw((*(d->f))->win,4,10,"    \b\b\b\b%d",count);//显示库存
				wrefresh((*(d->f))->win);
				sign=(*((d->i)+1))->input_char(*((d->i)+1),1,0,1);//输入个数
				/*数目有没有超过*/
				del_blank((*((d->i)+1))->str);
				if(isdigital((*((d->i)+1))->str)&&strlen((*((d->i)+1))->str)!=0)//输入的数目不否合法*************
				{
					i=atoi((*((d->i)+1))->str);
					if (i > count)//输入的数量超过库存
					{
						/*提示超过库存量*/
						messagebox(stdscr,7,19,44,12,PAUSE,"您输入的数量超出库存量");
						sign=2;
					}
				}
				else
				{
					sign=2;
					messagebox(stdscr,7,19,44,12,PAUSE,"请输入数字");
					/*提示有非数字字符*/
				}
			}
			break;
		case 3:
			(*(d->b))->pitch_on(*(d->b));
			sign=(*(d->b))->attack(*(d->b),2,4,4);
			if(sign == 0)
			{
				result=1;
			}
			break;
		case 4:
			(*((d->b)+1))->pitch_on(*((d->b)+1));
			sign=(*((d->b)+1))->attack(*((d->b)+1),3,1,1);
			if(sign == 0)
			{
				result=0;
			}
			break;
		}
	}
	while (sign);
	free(t);
	return result;
}

int (*fp3)(DIALOG *d)=action;
/*
f->free(&f);
f1->free(&f1);
b->free(&b);
b1->free(&b1);
i1->free(&i1);
i2->free(&i2);

*/

void free_dialog(DIALOG **d)
{
	(*((*d)->f))->free(&(*((*d)->f)));
	(*(((*d)->f)+1))->free(&(*(((*d)->f)+1)));
	(*(((*d)->f)+2))->free(&(*(((*d)->f)+2)));
	(*((*d)->b))->free(&(*((*d)->b)));
	(*(((*d)->b)+1))->free(&(*(((*d)->b)+1)));
	(*((*d)->i))->free(&(*((*d)->i)));
	(*(((*d)->i)+1))->free(&(*(((*d)->i)+1)));
	free((*d));

}
void (*fp4)(DIALOG **d)=free_dialog;

int node_exist_judge(LINK *link,char *str)
{
	int result=0;
	result=link->get_index_by_key(link,str,(int (*)(void *,void*))fp1);
	return result;
	
}


GMSG *add_list(ROLL *r)
{
	FRAME *f[3];
	BUTTON *b[2];
	INPUT *i[2];
	int result=0;
	GMSG *msg=(GMSG *)malloc(sizeof(GMSG));
	memset(msg,0,sizeof(GMSG));
	char *str[4]={"新增明细","条形码:","库存:","添加个数:"};
	f[0]=creat_frame(3,19,13,34,3);
	f[1]=creat_frame(5,31,1,16,1);
	f[2]=creat_frame(9,29,1,18,1);
	b[0]=createButton(11,25,3,8,"确定");
	b[1]=createButton(11,39,3,8,"取消");
	i[0]=create_input(f[1],6,0,2,2);
	i[1]=create_input(f[2],4,1,3,3);
	//DIALOG *create_dialog(FRAME **f,INPUT **i,BUTTON **b,char **str,LINK *link);
	DIALOG *d=create_dialog(f,i,b,str,r->link);
	if(r->link->count != 0)
	{
		NODE *temp=r->link->get_node_by_index(r->link,r->current_suffix);
		char bar[7]={0};
		strcpy(bar,((UNS *)(temp->data))->bar_code+2);
		strcpy((*(d->i))->str,bar);
		mvwprintw((*(d->f+1))->win,0,0,"%s",bar);
		char *t=((UNS *)((r->link->get_node_by_index(r->link,r->current_suffix))->data))->bar_code;
		mvwprintw((*(d->f))->win,4,10,"%d",select_db_goods(t));
	}
	d->show(d,(void (*)(void *))fp2);
	result=d->control(d,(int (*)(void *))fp3);
	if(result)
	{
		msg->num=atoi((*(d->i+1))->str);
		strcpy(msg->bar_code,(*(d->i))->str);
	}
	else
	{
		free(msg);
		msg=NULL;
	}
	free(d);
	f[0]->free(&f[0]);
	f[1]->free(&f[1]);
	f[2]->free(&f[2]);
	b[0]->free(&b[0]);
	b[1]->free(&b[1]);
	i[1]->free(&i[1]);
	i[0]->free(&i[0]);
	scr_restore("scan.dat");//屏幕恢复
	return msg;
}
///////////////////////////////////////////删除明细
void show_del_list(DIALOG *d)
{
	scr_dump("scan2.dat");//屏幕保存
	box((*(d->f))->win,0,0);
	mvwprintw((*(d->f))->win,0,12,"%s",*(d->str));
	mvwprintw((*(d->f))->win,2,3,"%s",*(d->str+1));
	mvwprintw((*(d->f))->win,4,5,"%s",*(d->str+2));
	mvwprintw((*(d->f))->win,6,1,"%s",*(d->str+3));
	(*(d->f))->draw(*(d->f));
	(*((d->f)+1))->draw(*((d->f)+1));
	(*(d->b))->setColor(*(d->b),3,1,4);
	(*((d->b)+1))->setColor(*((d->b)+1),3,1,4);
	(*(d->b))->show(*(d->b));
	(*((d->b)+1))->show(*((d->b)+1));
	
}

int action_del_list(DIALOG *d,ROLL *r)
{
	int result=0,sign=1;
	int node_exist=0;
	int count=0,i=0;
	NODE *temp=NULL;
	do
	{
		switch (sign)
		{
		case 1:
			sign=(*((d->i)))->input_char(*((d->i)),1,0,1);//输入个数
			if(sign==27)
			{
				sign=messagebox(stdscr,7,19,44,12,YORN,"确认要退出");
				if(sign)
				{
					sign=0;
					break;
				}
				else
				{
					sign=1;
				}
			}
			/*数目有没有超过*/
			del_blank((*(d->i))->str);
			if(isdigital((*(d->i))->str)&&strlen((*(d->i))->str)!=0)//输入的数目不否合法
			{
				i=atoi((*(d->i))->str);
				count=((UNS *)((r->link->get_node_by_index(r->link,r->current_suffix))->data))->total_count;
				if (i > count)//输入的数量超过库存
				{
					/*提示超过库存量*/
					messagebox(stdscr,7,19,44,12,PAUSE,"您输入的数量超出数量");
					sign=1;
				}
			}
			else
			{
				sign=1;
				messagebox(stdscr,7,19,44,12,PAUSE,"请输入数字");
				/*提示有非数字字符*/
			}
			break;
		case 2:
			(*(d->b))->pitch_on(*(d->b));
			sign=(*(d->b))->attack(*(d->b),1,3,3);
			if(sign == 0)
			{
				result=1;
			}
			break;
		case 3:
			(*((d->b)+1))->pitch_on(*((d->b)+1));
			sign=(*((d->b)+1))->attack(*((d->b)+1),2,1,1);
			if(sign == 0)
			{
				result=0;
			}
			break;
		}
	}
	while (sign);
	return result;
}

GMSG *del_list(ROLL *r)
{
	if(r->link->count == 0)
	{
		messagebox(stdscr,7,19,44,12,PAUSE,"没有可以删除的货物");
		return NULL;
	}
	FRAME *f[2];
	BUTTON *b[2];
	INPUT *i;
	int result=0;
	GMSG *msg=(GMSG *)malloc(sizeof(GMSG));
	memset(msg,0,sizeof(GMSG));
	char *str[4]={"删除明细","条形码:","个数:","删除个数:"};
	f[0]=creat_frame(3,19,13,34,3);
	f[1]=creat_frame(9,29,1,18,1);
	b[0]=createButton(11,25,3,8,"确定");
	b[1]=createButton(11,39,3,8,"取消");
	i=create_input(f[1],4,0,2,2);
	DIALOG *d=create_dialog(f,&i,b,str,r->link);
	
	NODE *temp=r->link->get_node_by_index(r->link,r->current_suffix);
	mvwprintw((*(d->f))->win,2,10,"%s",((UNS *)(temp->data))->bar_code);
	int t=((UNS *)((r->link->get_node_by_index(r->link,r->current_suffix))->data))->total_count;
	mvwprintw((*(d->f))->win,4,10,"%d",t);
	show_del_list(d);
	result=action_del_list(d,r);	
	if(result)
	{
		msg->num=atoi((*(d->i))->str);
		strcpy(msg->bar_code,((UNS *)(temp->data))->bar_code);
	}
	else
	{
		free(msg);
		msg=NULL;
	}
	free(d);
	f[0]->free(&f[0]);
	f[1]->free(&f[1]);
	b[0]->free(&b[0]);
	b[1]->free(&b[1]);
	i->free(&i);
	scr_restore("scan2.dat");//屏幕恢复
	return msg;
}

///////////////////////////////////////////////收银
void show_settle_accounts(DIALOG *d)
{
	scr_dump("scan3.dat");//屏幕保存
	box((*(d->f))->win,0,0);
	mvwprintw((*(d->f))->win,0,13,"%s",*(d->str));
	mvwprintw((*(d->f))->win,2,5,"%s",*(d->str+1));
	mvwprintw((*(d->f))->win,4,1,"%s",*(d->str+2));
	mvwprintw((*(d->f))->win,6,1,"%s",*(d->str+3));
	mvwprintw((*(d->f))->win,8,1,"%s",*(d->str+4));
	mvwprintw((*(d->f))->win,10,5,"%s",*(d->str+5));
	(*(d->f))->draw(*(d->f));
	(*((d->f)+1))->draw(*((d->f)+1));
	(*(d->b))->setColor(*(d->b),3,1,4);
	(*((d->b)+1))->setColor(*((d->b)+1),3,1,4);
	(*(d->b))->show(*(d->b));
	(*((d->b)+1))->show(*((d->b)+1));
}
float accounts(LINK *link)
{
	float count=0;
	NODE *temp=link->head->next;
	while (temp->next!=NULL)
	{
		count=count+(((UNS *)(temp->data))->total_pay);
		temp=temp->next;
	}
	return count;
}
int action_settle_accounts(DIALOG *d,ROLL *r)
{
	int result=0,sign=1;
	int node_exist=0;
	float count=0;
	float i=0;
	NODE *temp=NULL;
	do
	{
		switch (sign)
		{
		case 1:
			sign=(*((d->i)))->input_char(*((d->i)),1,0,1);//输入个数
			if(sign==27)
			{
				sign=messagebox(stdscr,7,19,44,12,YORN,"确认要退出");
				if(sign)
				{
					sign=0;
					break;
				}
				else
				{
					sign=1;
				}
			}
			/*数目有没有超过*/
			del_blank((*(d->i))->str);
			if(isdigital((*(d->i))->str)&&strlen((*(d->i))->str)!=0)//输入的数目不否合法
			{
				i=atof((*(d->i))->str);
				count=accounts(r->link);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -