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

📄 salewin3.cpp

📁 C++写的POS前台程序
💻 CPP
字号:
#include <string.h>
#include <math.h>
#include <io.h>
#include <conio.h>
#include <dos.h>
#include "sysinfo.h"
#include "salewin.h"


//结帐.
int
SaleWin::CheckOut()
{
	unsigned int Ev;

	//先保存最后一个交易单.
	if(CheckNumber >= GetMaxCheck())
	{
		SaveToFile();
	}
	//计算总计值.
	if(Summary()==L_ERROR)
	{
		//如果不存在数据则返回.
		PutEvent(EV_QUIT);
		goto over;
	}
	//打印结帐内容。
	PrintCheckOut();
	//进行付款操作.
	RunPay();
//--------------------------------------------
over:
	GetEvent(Ev);
	switch(Ev)
	{
		case EV_QUIT:
			return L_ERROR;
		case EV_EXCHANGE_OVER:
			//结帐结束操作.
			remove(".\\gridtemp.$$$");
			//如果是有营业员方式。
			if(sys->SalSW == L_YES)
			{
				SaleCode->SetText("");
				SaleName->SetText("");
				SaleGroup->SetText("");
			}
			AllSum->SetText("");
			AllDiscount->SetText("");
			ShouldPay->SetText("");
			Get->SetText("");
			Change->SetText("");
			ClearGrid();
			CheckNumber = 1;
			ReadOnlyFlag = L_NO;
			MaxCheck = GetMaxCheck();
			return L_OK;
	}
	return L_ERROR;
}

//总计.统计多单总金额.

int
SaleWin::Summary()
{
	//所有数据以临时文件为基础.
	struct FDATA data;
	char temp[32];
	double TotalMoney = 0;//应付总金额.
	double TotalDisMoney = 0;//总折扣金额.
	FILE *fp;
	//打开文件.
	if((fp = fopen(".\\Gridtemp.$$$","rb"))==NULL)
	{
		fclose(fp);
		return L_ERROR;
	}
	if(filelength(fileno(fp))==0)
	{
		fclose(fp);
		return L_ERROR;
	}
	//定位文件指针到最开始.
	fseek(fp, 0, 0);
	for(;;)
	{
		//从文件读取数据.
		if(fread(&data, sizeof(FDATA), 1, fp) == 0)
		{
			break;
		}
		//累计金额.
		TotalMoney = TotalMoney + atof(data.Money);
		//累计总折扣额.
		TotalDisMoney = TotalDisMoney + atof(data.Price)*atof(data.Number) - atof(data.Money);
	}
	//关闭文件.
	fclose(fp);
	//将计算结果保存到文本框.
	sprintf(temp, "%13.2f", TotalDisMoney);
	AllDiscount->SetText(temp);
	sprintf(temp, "%13.2f", TotalMoney);
	AllSum->SetText(temp);
	ShouldPay->SetText(temp);
	Get->SetText(Trim(temp));
	//向顾客显示屏幕输出.
	char cttemp[25];
	Ct_Clear();
	Ct_Out("Sum:");
	sprintf(cttemp, "%12.2f\r\n", TotalMoney);
	Ct_Out(cttemp);
	return L_OK;
}

//运行
void
SaleWin::RunPay()
{
	unsigned int Event;
	int stat;

	//开始事务.
	BeginTran();
	Get->ReturnFlag = L_YES;
	for(;;)
	{
		Get->Run();
		GetEvent(Event);
		switch(Event)
		{
			case EV_QUIT:
				PutEvent(EV_QUIT);
				//回滚事务.
				RollBackTran();
				return;
			case KEY_RETURN:
				//输入了金额以后进行第一次确认(按回车)
				stat = Pay();
				if(stat == L_NO)//是否要进行多重付款.
				{
					PutEvent(EV_EXCHANGE_OVER);
					WriteLDB();//写本地数据库.
					//提交事务.
					CommitTran();
					getch();
					return;
				}
				else if(stat == -2)//写多重付款库错误.
				{

				}
				else
				{
					break;
				}
		}
	}
}

//在输入框中操作员已经填写了金额,以下程序判断金额的正确性,并记录数据
int
SaleWin::Pay()
{
	char temp[20];
	char prtemp[30], prtemp1[80];
	//如果金额长度大于11位则截断它。
	if(strlen(Get->Text()) > 11)
	{
		strncpy(temp, Get->Text(), 11);
		temp[11] = NULL;
	}
	else
	{
		strcpy(temp, Get->Text());
	}
	sprintf(temp, "%0.2f", atof(temp));
	Get->SetText(temp);
	//数据判断:
	//将字符转换成数字进行判断.
	double shouldpay = atof(ShouldPay->Text());
	double pay = atof(Get->Text());
	//向顾客显示屏幕输出.
	char cttemp[25];
	Ct_Clear();
	Ct_Out("Pay:");
	sprintf(cttemp, "%12.2f\r\n", pay);
	Ct_Out(cttemp);
	//1、如果顾客付的金额负数,认为不合法,返回重来。
	if(pay < 0)
	{
		sprintf(temp, "%0.2f", 0.0);
		Change->SetText(temp);

		return L_YES;
	}
	//2、如果金额在零到应付额之间,
	//   进行部分付帐(多重付款)。
	if(pay - shouldpay < 0)
	{
		//写付款数据文件.
		if(WriteMulpay(Get->Text(), "0", "", "")==L_ERROR)
		{
			return -2;
		}

		//打印付款数据.
		sprintf(prtemp, "    付现金:%12.2f\n", pay);
		PrOut(prtemp);

		sprintf(temp, "%13.2f", shouldpay - pay);
		ShouldPay->SetText(temp);

		sprintf(temp, "%0.2f", 0.0);
		Get->SetText(temp);

		sprintf(temp, "%0.2f", 0.0);
		Change->SetText(temp);

		//开钱箱。
		outportb(0x220,1);
		delay(200);
		outportb(0x220,0);
		//多重付款打印在此.
		return L_YES;
	}
	//3、如果金额大于应付,则进行找零。
	if(pay - shouldpay >= 0)
	{
		//写付款数据文件.
		if(WriteMulpay(ShouldPay->Text(), "0", "", "")==L_ERROR)
		{
			return -2;
		}
		//向顾客显示屏幕输出.
		char cttemp[25];
		Ct_Out("Change:");
		sprintf(cttemp, "%6.2f\r\n", pay - shouldpay);
		Ct_Out(cttemp);
		//打印付款数据.
		sprintf(prtemp, "    付现金:%12.2f\n", pay);
		strcpy(prtemp1, prtemp);
		strcat(prtemp1, "------------------------\n");
		sprintf(prtemp, "    找  零:%12.2f\n", pay - shouldpay);
		strcat(prtemp1, prtemp);
		PrOut(prtemp1);
		//打印尾标题。
		PrintTail();

		ShouldPay->SetText("<已付清>");

//		Get->SetText("<已付清>");

		sprintf(temp, "%13.2f", pay - shouldpay);
		Change->SetText(temp);

		//开钱箱。
		outportb(0x220,1);
		delay(200);
		outportb(0x220,0);
		return L_NO;
	}
	return L_YES;
}

int
SaleWin::BeginTran()
{
	FILE *fp;
	long s1,s2,t1,t2,m1,m2;
	//记录sales.dat的文件长度.
	if((fp = fopen(".\\data\\sales.dat", "rb"))==NULL)
	{
		s1 = 0L;
	}
	s1 = filelength(fileno(fp));
	fclose(fp);
	//记录sales.tmp的文件长度.
	if((fp = fopen(".\\data\\sales.tmp", "rb"))==NULL)
	{
		s2 = 0L;
	}
	else
	{
		s2 = filelength(fileno(fp));
		fclose(fp);
	}
	//记录total.dat的文件长度.
	if((fp = fopen(".\\data\\total.dat", "rb"))==NULL)
	{
		t1 = 0L;
	}
	t1 = filelength(fileno(fp));
	fclose(fp);
	//记录total.tmp的文件长度.
	if((fp = fopen(".\\data\\total.tmp", "rb"))==NULL)
	{
		t2 = 0L;
	}
	else
	{
		t2 = filelength(fileno(fp));
		fclose(fp);
	}
	//记录Mulpay.dat的文件长度.
	if((fp = fopen(".\\data\\mulpay.dat", "rb"))==NULL)
	{
		m1 = 0L;
	}
	m1 = filelength(fileno(fp));
	fclose(fp);
	//记录mulpay.dat的文件长度.
	if((fp = fopen(".\\data\\mulpay.tmp", "rb"))==NULL)
	{
		m2 = 0L;
	}
	else
	{
		m2 = filelength(fileno(fp));
		fclose(fp);
	}
//------------------------------------------------------------
	if((fp = fopen(".\\data\\tran.dat", "w+b")) == NULL)
	{
		return L_ERROR;
	}
	if(fwrite(&s1, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fwrite(&s2, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fwrite(&t1, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fwrite(&t2, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fwrite(&m1, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fwrite(&m2, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	fclose(fp);
	return L_OK;
}

int
SaleWin::RollBackTran()
{
	FILE *fp;
	long s1,s2,t1,t2,m1,m2;
	if((fp = fopen(".\\data\\tran.dat", "rb")) == NULL)
	{
		return L_ERROR;
	}
	if(fread(&s1, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fread(&s2, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fread(&t1, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fread(&t2, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fread(&m1, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	if(fread(&m2, sizeof(long), 1, fp)==0)
	{
		return L_ERROR;
	}
	fclose(fp);
//------------------------------------------------------------
	//记录sales.dat的文件长度.
	if((fp = fopen(".\\data\\sales.dat", "r+b"))==NULL)
	{
		return L_ERROR;
	}
	chsize(fileno(fp), s1);
	fclose(fp);
	//记录sales.tmp的文件长度.
	if((fp = fopen(".\\data\\sales.tmp", "r+b"))==NULL)
	{
		return L_ERROR;
	}
	chsize(fileno(fp), s2);
	fclose(fp);
	//记录total.dat的文件长度.
	if((fp = fopen(".\\data\\total.dat", "r+b"))==NULL)
	{
		return L_ERROR;
	}
	chsize(fileno(fp), t1);
	fclose(fp);
	//记录total.tmp的文件长度.
	if((fp = fopen(".\\data\\total.tmp", "r+b"))==NULL)
	{
		return L_ERROR;
	}
	chsize(fileno(fp), t2);
	fclose(fp);
	//记录Mulpay.dat的文件长度.
	if((fp = fopen(".\\data\\mulpay.dat", "r+b"))==NULL)
	{
		return L_ERROR;
	}
	chsize(fileno(fp), m1);
	fclose(fp);
	//记录mulpay.dat的文件长度.
	if((fp = fopen(".\\data\\mulpay.tmp", "r+b"))==NULL)
	{
		return L_ERROR;
	}
	chsize(fileno(fp), m2);
	fclose(fp);
	remove(".\\data\\tran.dat");
	return L_OK;
}

int
SaleWin::CommitTran()
{
	remove(".\\data\\tran.dat");
	return L_OK;
}

⌨️ 快捷键说明

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