📄 dlgaddmoney.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 + -