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

📄 salewin1.cpp

📁 金融pos机前台源码
💻 CPP
字号:
#include <stdlib.h>
#include <string.h>
#include "box.h"
#include "salewin.h"
#include "findsale.h"
#include "sysinfo.h"
#include "alloc.h"

//产生查找营业员的对象。
FindSaler	Saler(".\\data\\Salers.dat");
//产生查找柜组对应的数据对象。
FindGroup	FGroup(".\\data\\grcode.dat");

//运行主界面。
void
SaleWin::RunSale()
{
	unsigned int Event, Ev;
	//显示操作员信息。
	OpCode->SetText(OperatorCode);
	OpName->SetText(OperatorName);
	OpTerm->SetText(sys->TermID);
	//取得当前交易临时文件中最大单号.
	MaxCheck = GetMaxCheck();
	if(MaxCheck >= 1)
	{
		//更新流水号。
		char temp[7];
		sprintf(temp, "%06ld", GetSeqNum());
		SeqNumber->SetText(temp);
		//取得当前交易临时文件中最大单号.
		CheckNumber = MaxCheck;
		GetFromFile(CheckNumber);
		Row = Rows - 1;
		Read(Row);
		goto run;
	}
	for(;;)
	{
		//更新流水号。
		char temp[7];
		sprintf(temp, "%06ld", GetSeqNum());
		SeqNumber->SetText(temp);

		if(sys->SalSW == L_YES)
		{
			//运行营业员输入框。
			SaleCode->Run();
		}
		else
		{
			//外部产生事件。这个事件将导致运行网格。
			PutEvent(KEY_RETURN);
		}
		//取得返回事件。
		GetEvent(Event);
		switch(Event)
		{
			case EV_QUIT:
				return;
			case KEY_F7:
				//结帐。
				if(CheckOut()==L_OK)
				{
					TestNetwork();
					//打印小票标题。
					PrintTitle();
				}
				break;
			case KEY_F6:
				//产生新单。
				NewCheck();
				break;
			case KEY_F8:
				//测试网络并传送数据.
				TestNetwork();
				break;
			case KEY_ALT_P:
				//不打印数据.
				if(sys->PrnType != 0)
				{
					sys->PrnType = 0;
				}
				else
				{
					sys->PrnType = 1;
				}
				GetFlag();
				break;
			case EV_NEXT:
			case EV_PREV:
			case KEY_RETURN:
				//如果是有营业员方式。
				if(sys->SalSW == L_YES)
				{
					//查找营业员。
					if(FindSaler() == L_ERROR )
					{
						break;
					}
				}
				//打印小票头部信息。
				PrintHeadInfo();
run:
				RunGrid();
				GetEvent(Ev);
				//如果是无营业员方式。
				if(sys->SalSW != L_YES)
				{
					if(Ev == EV_QUIT)
					{
						return;
					}
					break;
				}
				else
				{
					break;
				}
			case KEY_PGDWN:
				//下一单。
				NextCheck();
				break;
			case KEY_PGUP:
				//上一单。
				PrevCheck();
				break;
			default:
				break;
		}
	}
}

//运行网格。
void
SaleWin::RunGrid()
{
	unsigned int Event, Ev;
	QuestionBox *QBox;
	//根据变量刷新状态位。
	GetFlag();
	for(;;)
	{
		SaleGrid::Run();
		GetEvent(Event);
		switch(Event)
		{
			case EV_QUIT:
				//退出。
				//如果是无营业员方式。
				if(sys->SalSW != L_YES)
				{
					if(Rows > 1 || CheckNumber > 1)
					{
						QBox = new QuestionBox("交易未结帐,您一定要退出吗?", "不是", "是的");
						QBox->Run();
						GetEvent(Ev);
						switch(Ev)
						{
							case CMD_NO:
								PutEvent(EV_QUIT);
								if(CheckNumber>=GetMaxCheck())
								{
									SaveToFile();
								}
								delete QBox;
								return;
							case CMD_YES:
								delete QBox;
								break;
							case EV_QUIT:
								delete QBox;
								break;
						};
						break;
					}
					else
					{
						PutEvent(EV_QUIT);
						return;
					}
				}
				else
				{
					if(Rows > 1 || CheckNumber > 1)
					{
						QBox = new QuestionBox("交易未结帐,您一定要退出吗?", "不是", "是的");
						QBox->Run();
						GetEvent(Ev);
						switch(Ev)
						{
							case CMD_NO:
								PutEvent(EV_QUIT);
								if(CheckNumber>=GetMaxCheck())
								{
									SaveToFile();
								}
								delete QBox;
								return;
							case CMD_YES:
								delete QBox;
								break;
							case EV_QUIT:
								delete QBox;
								break;
						};
						break;
					}
					else
					{
						PutEvent(EV_QUIT);
						return;
					}
//	韩冰6.17.				break;
				}
			case KEY_F7:
				//结帐。
				if(CheckOut()==L_OK)
				{
					TestNetwork();
					//打印小票标题。
					PrintTitle();
					PutEvent(EV_NOTHING);
					return;
				}
				else
				{
					break;
				}
			case KEY_F6:
				if(sys->SalSW == L_YES)
				{
					//产生新单。
					NewCheck();
					PutEvent(EV_NOTHING);
					return;
				}
				else
				{
					//产生新单。
					if(NewCheck()==L_OK)
					{
						//打印小票头部信息。
						PrintHeadInfo();
					}
					break;
				}
			case KEY_F8:
				//测试网络并传送数据.
				TestNetwork();
				break;
			case EV_NEXTCHECK:
				//下一单。
				NextCheck();
				break;
			case EV_PREVCHECK:
				//上一单。
				PrevCheck();
				break;
			case KEY_F5:
				if(ReadOnlyFlag == L_YES) break;
				//改变整体折扣率。
				ChangeTotalDiscount();
				break;
			case KEY_ALT_P:
				//不打印数据.
				if(sys->PrnType != 0)
				{
					sys->PrnType = 0;
				}
				else
				{
					sys->PrnType = 1;
				}
				GetFlag();
				break;
			default:
				break;
		}
		//刷新状态栏标志。
		GetFlag();
	}
}

//改变整体折扣率。
void
SaleWin::ChangeTotalDiscount()
{
	unsigned int Ev;
	int i, row;
	char temp[10];
	//循环运行。
	for(;;)
	{
		//运行整体折扣框。
		TotalDisRate->Run();
		//获取返回的事件。
		GetEvent(Ev);
		switch(Ev)
		{
			case EV_QUIT:
				//按ESC返回。
				return;
			case KEY_RETURN:
			case EV_NEXT:
				//按回车。
				//如果输入数据大于100。
				if(atoi(TotalDisRate->Text()) >= 100)
				{
					sprintf(temp, "%5d", 99);
				}
				//如果小于0。
				else if(atoi(TotalDisRate->Text()) <= 0)
				{
					strcpy(temp, "");
				}
				//在0~100之间。
				else
				{
					sprintf(temp, "%5d", atoi(TotalDisRate->Text()));
				}
				//回写文本。
				TotalDisRate->SetText(temp);
				//重新计算小计。
				row = Row;//记住当前行。
				for(i=0; i<Rows; i++)
				{
					Read(i);
					if(strlen(Data[1]) > 0)
					{
						//更新小计
						CalPrice();
						//写入网格.
						Write(i);
					}
				}
				Row = row;//回到原来当前行。
				Read(Row);
				//重画。
				Draw();
				//重新进行单累计.
				GridSum();
				return;
			default:
				//如果是其他事件,不响应,继续运行。
				break;
		}
	}
}

//刷新状态标志。
void
SaleWin::GetFlag()
{
	//刷新累加标志。
	if(SumMode == L_NO)
	{
		//如果显示的不是要求值则修改。
		if(strcmp(IsGroupBy->Text(),"不累加")!=0)
		{
			IsGroupBy->SetText("不累加");
		}
	}
	else
	{
		//如果显示的不是要求值则修改。
		if(strcmp(IsGroupBy->Text(),"累  加")!=0)
		{
			IsGroupBy->SetText("累  加");
		}
	}
	//刷新退货/销售标志。
	if(ReturnFlag == L_NO)
	{
		//如果显示的不是要求值则修改。
		if(strcmp(IsSale->Text(),"销  售")!=0)
		{
			IsSale->SetText("销  售");
		}
	}
	else
	{
		//如果显示的不是要求值则修改。
		if(strcmp(IsSale->Text(),"退  货")!=0)
		{
			IsSale->SetText("退  货");
		}
	}
	//刷新打印标志。
	if(sys->PrnType == 0)
	{
		if(strcmp(IsPrint->Text(),"不打印")!=0)
		{
			IsPrint->SetText("不打印");
		}
	}
	else
	{
		if(strcmp(IsPrint->Text(),"打  印")!=0)
		{
			IsPrint->SetText("打  印");
		}
	}
}

//计算单价。
void
SaleWin::CalPrice()
{
	//更新计算小计。

	//计算单笔折扣。
	double pr = atof(Data[3]) - atof(Data[5])/ 100.0 * atof(Data[3]);
	//计算整体折扣。
	pr = pr - atof(TotalDisRate->Text())/100.0 * pr;
	//四舍五入。
	pr = (long)(pr * 100.0 + 0.5) / 100.0;
	//计算小计。
	sprintf(Data[7], "%11.2lf" , pr * atof(Data[4]) - atof(Data[6]));
	//判断数据的合法性,如果在非退货情况下金额小于0给出提示。
	if(atof(Data[7]) < 0.0 && atof(Data[4]) > 0)
	{
		char temp[100];
		//产生消息字符串。
		sprintf(temp, "第:%4d", atoi(Data[0]));
		strcat(temp, " 行金额小于 0.00, 不合法, 请改正.");
		//产生消息对话框。参见Box.cpp.
		MsgBox *Msg = new MsgBox(temp);
		//运行消息框。
		Msg->Run();
		//删除消息框。
		delete Msg;
	}
}

int
SaleWin::FindSaler()
{
	//给营业员编号加上前导0。
	char temp[10];
	strncpy(temp, SaleCode->Text(),6);
	temp[5] = NULL;
	sprintf(temp, "%05ld", atol(temp));
	SaleCode->SetText(temp);
	if(Saler.SearchCode(SaleCode->Text()) == L_ERROR)
	{
		return L_ERROR;
	}
	else
	{
		//营业员代码.
		SaleCode->SetText(Trim(Saler.SaCode));
		//营业员姓名.
		SaleName->SetText(Trim(Saler.SaName));
		//营业员台号.
		SaleGroup->SetText(Trim(Saler.SaGroup));
	}
	return L_OK;
}

//验证商品对应营业员柜组是否正确。
void
SaleWin::AdjGroup()
{
	char temp[14];
	MsgBox *Msg;
	strcpy(temp, Data[1]);
	Trim(temp);
	temp[3] = NULL;
	if(FGroup.SearchCode(temp)==L_ERROR)
	{
		//发现未知柜组编码.
		printf("\007\007\007");
		Msg = new MsgBox("发现未知柜组的商品编码,请立即与管理员联系.");
		Msg->Run();
		delete Msg;
	}
	else
	{

		//如果是营业员方式。
		if(sys->SalSW == L_YES)
		{
			//将查询的柜组编码与营业员编码比较.
			if(strcmp(FGroup.Group, SaleGroup->Text())!=0)
			{
				//提示不允许卖非此营业员管理的柜组的商品.
				printf("\007\007");
				Msg = new MsgBox("营业员或者商品柜组不对,请与营业员核对");
				Msg->Run();
				delete Msg;
			}
		}
	}
}

⌨️ 快捷键说明

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