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

📄 dlgmodify.cpp

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

#include "stdafx.h"
#include "ShoolCard.h"
#include "DlgModify.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"
#include "DlgModifyFee.h"

//全局变量
extern CConfig gConfig;
extern CDatabase gDatabase;

/////////////////////////////////////////////////////////////////////////////
// CDlgModify dialog


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


void CDlgModify::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgModify)
	DDX_Control(pDX, IDC_LIST1, m_ListControl);
	DDX_Control(pDX, IDC_MSCOMM1, m_ComPort);
	DDX_Text(pDX, IDC_EDIT_CARDID, m_CardId);
	DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER1, m_Time);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgModify, CDialog)
	//{{AFX_MSG_MAP(CDlgModify)
	ON_WM_SHOWWINDOW()
	ON_WM_TIMER()
	ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETIMEPICKER1, OnDatetimechangeDatetimepicker1)
	ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
	ON_BN_CLICKED(IDC_BUTTON_MODIFY, OnButtonModify)
	ON_WM_CLOSE()
	ON_NOTIFY(DTN_CLOSEUP, IDC_DATETIMEPICKER1, OnCloseupDatetimepicker1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgModify message handlers

void CDlgModify::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	
	// TODO: Add your message handler code here
    
    //
	m_Card.m_pDatabase = &gDatabase;
	m_CardUse.m_pDatabase = &gDatabase;

	//打开串口	
	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;
		}

	}
    //设置时间消息
	m_Timer = SetTimer(1000,1000,0);
	//设置timepicker 的当前时间
    m_Time = CTime::GetCurrentTime();
	UpdateData(VAR2CON);//
	//初始化listview的表头
	InitListView();
	//初始化其他数据
	OnCloseupDatetimepicker1(NULL,NULL);
}

void CDlgModify::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CByteArray mByteAry;
	CByteArray mIn;

    //构造上位机报文
	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 = "00001";
		//更新界面
        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);
}

void CDlgModify::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	//*pResult = 0;
}

void CDlgModify::OnButtonDelete() 
{
	// TODO: Add your control notification handler code here
	UpdateData(CON2VAR);
    //调试使用
	ASSERT(m_CardUse.IsOpen());
	
	//获取用户选择的卡使用记录
	int nIndex = m_ListControl.GetNextItem(-1, LVNI_SELECTED); 
	if (nIndex < 0)
	{
	    MessageBox("请选择要删除的消费记录!");
		return;
	}
	
	//m_CardUse.m_pDatabase = &gDatabase;
	gDatabase.BeginTrans();

	m_CardUse.MoveFirst();
	m_CardUse.Move(nIndex);
	//保存数据
	double mMoney = m_CardUse.m_money;
	m_CardUse.Delete();

    //m_Card.m_pDatabase = &gDatabase;
    m_Card.m_strFilter = "card_id = '" + m_CardId + "'";
	if(m_Card.IsOpen()) m_Card.Close();
	//重新获卡的取信息
	m_Card.Open();
    ASSERT(m_Card.GetRecordCount() == 1);
	m_Card.Edit();
	//将多余的消费金额重新写入卡
    m_Card.m_money = m_Card.m_money + mMoney;
	m_Card.Update();
	//同步数据库中的金额和卡中的金额
    if(this->WriteMoney(m_Card.m_money) < 0 ) 
	{
	     MessageBox("读写卡错误,数据修改失败!");
		 gDatabase.Rollback();
		 //用后台数据更新前台界面
	     OnCloseupDatetimepicker1(NULL,NULL);
		 return;
	}
	//提交事务
	gDatabase.CommitTrans();
	MessageBox("错误修改操作成功!");
	//用后台数据更新前台界面
	OnCloseupDatetimepicker1(NULL,NULL);
}

void CDlgModify::OnButtonModify() 
{
	UpdateData(CON2VAR);

    //调试使用
	ASSERT(m_CardUse.IsOpen());
	
	//获取用户选择的卡使用记录
	int nIndex = m_ListControl.GetNextItem(-1, LVNI_SELECTED); 
	if (nIndex < 0)
	{
	    MessageBox("请选择要删除的消费记录!");
		return;
	}

	m_CardUse.MoveFirst();
	m_CardUse.Move(nIndex);
	//保存数据
	double mMoney = m_CardUse.m_money;
	//显示修改费用窗体
	CDlgModifyFee dlg;
	dlg.m_ErrorMoney = mMoney;
	dlg.m_RealMoney = 0.0;
	//更新修改费用窗体界面
	//dlg.UpdateData(VAR2CON);
	if(dlg.DoModal() == IDCANCEL) return;
    
	//dlg.UpdateData(CON2VAR);
    //m_CardUse.m_pDatabase = &gDatabase;
	gDatabase.BeginTrans();
	m_CardUse.Edit();
	m_CardUse.m_money = dlg.m_RealMoney;
	m_CardUse.Update();

    m_Card.m_strFilter = "card_id = '" + m_CardId + "'";
	//m_CardUse.m_pDatabase = &gDatabase;
	if(m_Card.IsOpen()) m_Card.Close();
	//重新获卡的取信息
	m_Card.Open();
    ASSERT(m_Card.GetRecordCount() == 1);
	m_Card.Edit();
	//将多余的消费金额重新写入卡
    m_Card.m_money = m_Card.m_money + dlg.m_ErrorMoney - dlg.m_RealMoney;
	m_Card.Update();
	//同步数据库中的金额和卡中的金额
    if(this->WriteMoney(m_Card.m_money) < 0 ) 
	{
	     MessageBox("读写卡错误,数据修改失败!");
		 gDatabase.Rollback();
		 //用后台数据更新前台界面
	     OnCloseupDatetimepicker1(NULL,NULL);
		 return;
	}
	//提交事务
	gDatabase.CommitTrans();
	MessageBox("错误修改操作成功!");
	//用后台数据更新前台界面
	OnCloseupDatetimepicker1(NULL,NULL);
}

void CDlgModify::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);
	if(m_CardUse.IsOpen()) m_CardUse.Close();
	CDialog::OnClose();
}

void CDlgModify::OnCloseupDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	UpdateData(CON2VAR);
	CString str;
	str.Format("%d-%d-%d",m_Time.GetYear(),m_Time.GetMonth(),m_Time.GetDay());
	m_CardUse.m_strFilter = "use_date >= '" + str + "'";
	CTime tmpTime(m_Time.GetYear(),
		          m_Time.GetMonth(),
				  m_Time.GetDay()+1,0,0,0);
	str.Format("%d-%d-%d",tmpTime.GetYear(),tmpTime.GetMonth(),tmpTime.GetDay());
	m_CardUse.m_strFilter = m_CardUse.m_strFilter + " " + "and use_date < '" + str + "'";
	m_CardUse.m_strFilter = m_CardUse.m_strFilter + " " + " and card_id = '" + m_CardId + "'";
    if(m_CardUse.IsOpen()) m_CardUse.Close();
	if(!m_CardUse.Open())
	{
	    MessageBox("数据表不能打开!");
		return;
	}
	//用后台数据更新前台界面
    FillListView();
	ConfigButtons();
	
	//*pResult = 0;
}

void CDlgModify::FillListView()
{
	ASSERT(m_CardUse.IsOpen());
	//清除原来的数据
	m_ListControl.DeleteAllItems();
    if(m_CardUse.GetRecordCount() <= 0) return;

	int nRow = 0;
	m_CardUse.MoveFirst();
	while(!m_CardUse.IsEOF())
	{
	    m_ListControl.InsertItem(nRow,"");
		m_ListControl.SetItemText(nRow,0,m_CardUse.m_card_id);
		CString str;
		str.Format("%f",m_CardUse.m_money);
		m_ListControl.SetItemText(nRow,1,str);
		str.Format("%d-%d-%d"
			,m_CardUse.m_use_date.GetYear()
			,m_CardUse.m_use_date.GetMonth()
			,m_CardUse.m_use_date.GetDay());
		m_ListControl.SetItemText(nRow,2,str);
	    //移动数据库游标	
		nRow++;
		m_CardUse.MoveNext();   
	}
}

void CDlgModify::InitListView()
{
    m_ListControl.InsertColumn(0,"卡号");
	m_ListControl.InsertColumn(1,"消费金额");
	m_ListControl.InsertColumn(2,"消费日期");

	m_ListControl.SetColumnWidth(0,100);
	m_ListControl.SetColumnWidth(1,150);
	m_ListControl.SetColumnWidth(2,150);

}

void CDlgModify::ConfigButtons()
{
	//?m_ListControl.Get
	if(m_CardUse.GetRecordCount() < 1)
	{
		CWnd *pWnd = GetDlgItem(IDC_BUTTON_DELETE);
		pWnd->EnableWindow(false);
		pWnd = GetDlgItem(IDC_BUTTON_MODIFY);
		ASSERT(pWnd != NULL);
		pWnd->EnableWindow(false);
	}
	else
	{
	    CWnd *pWnd = GetDlgItem(IDC_BUTTON_DELETE);
		pWnd->EnableWindow(true);
		pWnd = GetDlgItem(IDC_BUTTON_MODIFY);
		ASSERT(pWnd != NULL);
		pWnd->EnableWindow(true);
	}
}

short int CDlgModify::WriteMoney(float AMoney)
{
    //for debug
	return 1;
    //======================串口操作==================
	CByteArray mByteAry;
	CByteArray mIn;

	//构造上位机报文
	mByteAry.SetSize(13);
	mByteAry.SetAt(0,0x0f);
	mByteAry.SetAt(1,0xf0);
	mByteAry.SetAt(2,0x03);//写命令
	mByteAry.SetAt(3,0x03);//第3区

    char chMoney[6];
	//转换为整数
	int nMoney = AMoney * 100;
	//取出每一位
    for(int i=0 ;i<6 ;i++)
	{
		chMoney[i] = nMoney % 10;
		nMoney = nMoney /10;
	}
	
	//卡中的金额数据写入
	mByteAry.SetAt(4,CGlobal::Encrypt(chMoney[0]));
	mByteAry.SetAt(5,CGlobal::Encrypt(chMoney[1]));
	mByteAry.SetAt(6,CGlobal::Encrypt(chMoney[2]));
	mByteAry.SetAt(7,CGlobal::Encrypt(chMoney[3]));
	mByteAry.SetAt(8,CGlobal::Encrypt(chMoney[4]));
	mByteAry.SetAt(9,CGlobal::Encrypt(chMoney[5]));
	
	mByteAry.SetAt(10,CGlobal::CalMoneyCheck(&mByteAry,4,9));
	mByteAry.SetAt(11,0xff);//数据区以FF结尾
	//计算报文的校验位
	mByteAry.SetAt(12,CGlobal::CalCheck(&mByteAry,0,12));

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

    return 1;

}

⌨️ 快捷键说明

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