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

📄 dlgaddmoney.cpp

📁 通用的餐饮收费系统:其主要技术是通过计算机串口与IC卡相关设备进行数据交互.
💻 CPP
字号:
// DlgAddMoney.cpp : implementation file
//

#include "stdafx.h"
#include "ShoolCard.h"
#include "DlgAddMoney.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include "Card.h"
#include "Config.h"
#include "Global.h"

//全局变量
extern CConfig gConfig;

/////////////////////////////////////////////////////////////////////////////
// CDlgAddMoney dialog


CDlgAddMoney::CDlgAddMoney(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgAddMoney::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgAddMoney)
	m_Money = 0;
	m_CardId = _T("");
	//}}AFX_DATA_INIT
}


void CDlgAddMoney::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgAddMoney)
	DDX_Text(pDX, IDC_EDIT_MONEY, m_Money);
	DDX_Text(pDX, IDC_EDIT_CARDID, m_CardId);
	DDX_Control(pDX, IDC_MSCOMM2, m_ComPort);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgAddMoney, CDialog)
	//{{AFX_MSG_MAP(CDlgAddMoney)
	ON_WM_SHOWWINDOW()
	ON_WM_TIMER()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgAddMoney message handlers

void CDlgAddMoney::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	
	// TODO: Add your message handler code here
	m_Timer = SetTimer(1000,1000,0);
}

void CDlgAddMoney::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CByteArray mByteAry;
	CByteArray mIn;
	if (!m_ComPort.GetPortOpen())
	{
	    try
		{
			short int nComPort = CGlobal::ComStrToInt(gConfig.Port);
		    m_ComPort.SetCommPort(nComPort);
			CString strSetting = gConfig.Speed + ','
				                +gConfig.CheckBit.GetAt(0) + ','
								+gConfig.DataBit + ','
								+gConfig.StopBit;
			m_ComPort.SetSettings(strSetting);
			m_ComPort.SetPortOpen(true);
		}
		catch(CException ee)
		{
			MessageBox("串口不能打开,请检查串口的配置!");
			return;
		}

	}
    //构造上位机报文
	mByteAry.SetSize(5);
	mByteAry.SetAt(0,0x0f);
	mByteAry.SetAt(1,0xf0);
	mByteAry.SetAt(2,0x5);
	mByteAry.SetAt(3,0x1);
	mByteAry.SetAt(4,CGlobal::CalCheck(&mByteAry,0,3));

    //发读第一区的命令
	m_ComPort.SetOutput(COleVariant(mByteAry));
    //等待读卡机的应答信息
    Sleep(60);
	//读串口信息
	if (m_ComPort.GetInBufferCount() != 13) 
	{
		//下位机不应答,表示没有卡放入
        m_CardId = "00000";
		//更新界面
		CWnd *pWnd = GetDlgItem(IDC_EDIT_CARDID);
		//后台数据和界面一致
		pWnd->SetWindowText(m_CardId); 
		return;
	}
    //将下位机报文接受到缓冲区
	mIn.SetSize(13);
    COleVariant olearray = m_ComPort.GetInput();
	for(int i=0;i<13;i++)
		mIn.SetAt(i,((unsigned char *)olearray.parray->pvData)[i]);
	//检查校验位
	if(!CGlobal::IsArrayValid(&mIn)) return;
    //从应答的报文中解析卡号
	CString strCardId = "";
	strCardId += (char)mIn.GetAt(4);
	strCardId += (char)mIn.GetAt(5);
	strCardId += (char)mIn.GetAt(6);
	strCardId += (char)mIn.GetAt(7);
	strCardId += (char)mIn.GetAt(8);
	////在用户界面中显示卡号
	CWnd *pWnd = GetDlgItem(IDC_EDIT_CARDID);
	pWnd->SetWindowText(strCardId);
	pWnd->SetFocus();
	//调用基类处理函数 
	CDialog::OnTimer(nIDEvent);
}

short int CDlgAddMoney::AddMoney(CString CardId, double Money)
{
    CCard card;
	card.m_strFilter = "card_id = '" + CardId + "'";
	try
	{
	    if(!card.Open()) return -1;
	    //没有记录
	    if(card.GetRecordCount() != 1) return -100;
	    card.Edit();
		//将金额加到相应的卡中
	    card.m_money +=  Money;
		card.Update();
		//关闭资源
		card.Close();
	}
	catch(CException ee)
	{
		//数据库操作异常
	    return -1;
	}
	//正确正常
	return 1;
	
}

double CDlgAddMoney::QueryMoney(CString CardId)
{
    CCard card;
	double dRet;
	card.m_strFilter = "card_id = '" + CardId + "'";
	try
	{
	    if(!card.Open()) return -1;
	    //没有记录
	    if(card.GetRecordCount() != 1) return -2;
		//得到数据记录
	    dRet = card.m_money;
		//关闭资源
		card.Close();
	}
	catch(CException ee)
	{
		//数据库操作异常
	    return -1.0;
	}
	//正确正常
	return dRet;
}

void CDlgAddMoney::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	//关闭定时器
	if(m_Timer) KillTimer(m_Timer);
	//关闭串口,释放资源
	if(m_ComPort.GetPortOpen()) m_ComPort.SetPortOpen(false);
	CDialog::OnClose();
}

short int CDlgAddMoney::DoAddMoney()
{
    short int nRet ;
	UpdateData(CON2VAR);
	nRet = AddMoney(m_CardId,m_Money);
	if(nRet ==100 ) 
	{
	    MessageBox("数据库中没有该卡号,请核查!");
		return -1;
	}
	if(nRet < 0)
	{
	    MessageBox("数据库出错,该加卡程序无法完成!");
		return -1;
	}

	//从数据库中取出加入后的金额
    double mMoneyFloat = QueryMoney(m_CardId);
    if(mMoneyFloat < 0)
    {
		MessageBox("数据库出错,该加卡程序无法完成!");
		return -1;
    }
	int nMoney = mMoneyFloat * 100;
    CByteArray mB;
	//分别得到每一位
	mB.SetSize(6);
	for(int i=0;i<6;i++)
	{
		mB.SetAt(i,nMoney%10);
		nMoney = nMoney / 10;
	}
	//等待Timer时间函数执行完成
    if(m_Timer) KillTimer(m_Timer);    
	Sleep(200);

	//================串口数据操作=====================
	if (!m_ComPort.GetPortOpen())
	{
	    try
		{
			m_ComPort.SetCommPort(CGlobal::ComStrToInt(gConfig.Port));
			CString strSetting = gConfig.Speed + ','
				                +gConfig.CheckBit.GetAt(0) + ','
								+gConfig.DataBit + ','
								+gConfig.StopBit;
			m_ComPort.SetSettings(strSetting);
			m_ComPort.SetPortOpen(true);
		}
		catch(CException ee)
		{
			MessageBox("串口不能打开,请检查串口的配置!");
			return -1;
		}

	}
    
    CByteArray mByteAry;
	//构造上位机报文
	mByteAry.SetSize(13);
	mByteAry.SetAt(0,0x0f);
	mByteAry.SetAt(1,0xf0);
	mByteAry.SetAt(2,0x03);
	mByteAry.SetAt(3,0x03);

	//报文数据体
	mByteAry.SetAt(4,CGlobal::Encrypt(mB.GetAt(0)));
	mByteAry.SetAt(5,CGlobal::Encrypt(mB.GetAt(1)));
	mByteAry.SetAt(6,CGlobal::Encrypt(mB.GetAt(2)));
	mByteAry.SetAt(7,CGlobal::Encrypt(mB.GetAt(3)));
	mByteAry.SetAt(8,CGlobal::Encrypt(mB.GetAt(4)));
	mByteAry.SetAt(9,CGlobal::Encrypt(mB.GetAt(5)));
	mByteAry.SetAt(10,CGlobal::CalMoneyCheck(&mByteAry,4,9));
	//数据区以$FF结尾
	mByteAry.SetAt(11,0xff);
	mByteAry.SetAt(12,CGlobal::CalCheck(&mByteAry,0,11));

    //发读第3区的命令
	m_ComPort.SetOutput(COleVariant(mByteAry));
    //等待读卡机的应答信息
    Sleep(60);
	//读串口信息
	if (m_ComPort.GetInBufferCount() != 6) 
	{
		MessageBox("写入数据时出错,请重试!");
		return -1;
	}
    //将下位机报文接受到缓冲区
	CByteArray mIn;
	mIn.SetSize(6);
    COleVariant olearray = m_ComPort.GetInput();
	for(i=0;i<6;i++)
		mIn.SetAt(i,((unsigned char *)olearray.parray->pvData)[i]);
	//检查校验位
	if(!CGlobal::IsArrayValid(&mIn)||mIn.GetAt(4)!=0x0f) return -1;

	return 1;
}

void CDlgAddMoney::OnOK() 
{
	// TODO: Add extra validation here
	if(DoAddMoney()<0)
	{
	    MessageBox("对不起,加卡失败,请重试!");
		return;
	}
	CDialog::OnOK();
}

⌨️ 快捷键说明

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