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

📄 hotel_misview.cpp

📁 我的毕业设计---高级宾馆门禁系统 VC数据库+串口 从串口接收
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void CHotel_MISView::OnAddCheckOut() 
{
	// TODO: Add your command handler code here
	
	// Check if any record exist
	_variant_t strQuery, Holder;	
	strQuery = "select * from bookin";
	theApp.ADOExecute(theApp.m_pADOSet, strQuery);
	int iCount = theApp.m_pADOSet->GetRecordCount();
	if ( 0==iCount ) 
	{
		AfxMessageBox(_T("没有顾客入住!"), MB_ICONEXCLAMATION);
		return;
	}
	
	// Check if any not checked record exist
	strQuery = "select * from bookin where checkdate is NULL";
	theApp.ADOExecute(theApp.m_pADOSet, strQuery);
	iCount = theApp.m_pADOSet->GetRecordCount();
	if ( 0==iCount ) 
	{
		AfxMessageBox(_T("全部客房均以结算!"), MB_ICONEXCLAMATION);
		strQuery = "select * from bookin where checkdate is not NULL";
		RefreshCheckOut(strQuery);
		return;
	}
	
	CCheckOutDLG dlg;
	dlg.m_bAppend = true;
	dlg.DoModal();
}

void CHotel_MISView::RefreshCheckOut(_variant_t strQuery)
{
	if (m_ListCtrl)	m_ListCtrl.DestroyWindow();
	
 	CreateBookIn( strQuery );

	m_sCurrentList = _T("结算信息列表");
    m_StaticCtrl.SetWindowText(m_sCurrentList);
}

void CHotel_MISView::OnAlterCheckOut() 
{
	// TODO: Add your command handler code here
	_variant_t strQuery;
	
	if ( m_ListCtrl && m_sCurrentList!=_T("结算信息列表") )
	{
		m_ListCtrl.DestroyWindow();
	    strQuery = "select * from bookin where checkdate is not NULL";
		CreateBookIn(strQuery);
	    
		m_sCurrentList = _T("结算信息列表");
        m_StaticCtrl.SetWindowText(m_sCurrentList);
		
		return;
	}
    if ( !m_ListCtrl )
	{
		strQuery = "select * from bookin where checkdate is not NULL";
		CreateBookIn(strQuery);
	    
		m_sCurrentList = _T("结算信息列表");
    	m_StaticCtrl.SetWindowText(m_sCurrentList);
		
		return;
	}
	POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();
    if (pos == NULL) AfxMessageBox(_T("没有选中的记录!"), MB_ICONEXCLAMATION);
    else
	{
	   CCheckOutDLG dlg;
	   dlg.m_bAppend = false;
	   
	   CString str;
	   int iItem = m_ListCtrl.GetNextSelectedItem(pos);
       // Get Room No
	   dlg.m_sRoomNo = m_ListCtrl.GetItemText(iItem, 3);
	   // Get Name
       dlg.m_sName = m_ListCtrl.GetItemText(iItem, 1);
	   // Get ID
       dlg.m_sID = m_ListCtrl.GetItemText(iItem, 2);
	   // Get InDate
       dlg.m_sInDate = m_ListCtrl.GetItemText(iItem, 4);
	   // Get discount
       dlg.m_sDiscount = m_ListCtrl.GetItemText(iItem, 5);
	   // Get Memo
       dlg.m_sMemo = m_ListCtrl.GetItemText(iItem, 8);
	   // Get CheckOut Date
       _variant_t strQuery, Holder;	
	   strQuery = "select checkdate from bookin where roomno='"+dlg.m_sRoomNo+"'";
	   theApp.ADOExecute(theApp.m_pADOSet, strQuery);
	   Holder = theApp.m_pADOSet->GetCollect("checkdate");
	   dlg.m_tOutDate = Holder;
	   
	   dlg.DoModal();
	}
}

void CHotel_MISView::OnSearchCheckOut() 
{
	// TODO: Add your command handler code here
	CSearchCheckOutDLG dlg;
	dlg.DoModal();
}

int CHotel_MISView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here

	m_MSComm.Create(NULL,0,CRect(0,0,0,0),this,IDC_MSCOMM1);
	if(m_MSComm.GetPortOpen()) //如果串口是打开的,则行关闭串口
	m_MSComm.SetPortOpen(FALSE);

	m_nBaud=9600;
	m_nCom=1;
	m_cParity='N';
	m_nDatabits=8;
	m_nStopbits=1;

	m_MSComm.SetCommPort(1); //选择COM1
	m_MSComm.SetInBufferSize(1024); //接收缓冲区
	m_MSComm.SetOutBufferSize(1024);//发送缓冲区
	m_MSComm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
	m_MSComm.SetInputMode(1);//以二进制方式读写数据
	m_MSComm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
	m_MSComm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位

	if(!m_MSComm.GetPortOpen())//如果串口没有打开则打开
	m_MSComm.SetPortOpen(TRUE);//打开串口
	else
	AfxMessageBox("Open Serial Port Failure!");
	m_MSComm.GetInput(); //先预读缓冲区以清除残留数据

	return 0;
}

void CHotel_MISView::OnComm()
{
	/*CString strtemp;
	strtemp.Format("OK,I've received some data!\r\n");
	m_MSComm.SetOutput(COleVariant(strtemp));//发送数据*/
	

VARIANT variant_inp;
COleSafeArray safearray_inp;

long len,k;
 BYTE rxdata[1024];
 int rec[1024]={0};
 CString strtemp,m_strRXData;


 switch (m_MSComm.GetCommEvent())
	 {
		 case 2:
		 //表示接收缓冲区内有字符
				 variant_inp = m_MSComm.GetInput();
				 safearray_inp = variant_inp;
				 len = safearray_inp.GetOneDimSize();
				 for (k = 0; k < len; k++)
				 {
					safearray_inp.GetElement(&k, rxdata+k); 
				 } 
				for(k=0;k<len;k++) //将数组转换为Cstring型变量
				{
					BYTE bt=*(char*)(rxdata+k); //字符型
					rec[k]=int(bt);
					strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
					m_strRXData+=strtemp; //加入接收编辑框对应字符串
				}
			UpdateData(false);
			break;
		 default:
			break;
	 }
//变量定义
long num,pswd1=0,pswd2;
int j,i;
CByteArray sendArr; 
WORD wLength;
CString m_send;
COleDateTime time;
CString str;
CString s;
BOOL b=1;
TCHAR bufDir[_MAX_PATH];
CString dS1,dS2;
_variant_t strQuery, Holder;
char buffer[20];


int iCount;

//提取门牌号和密码
num=rec[3]*100+rec[4];
		

switch (rec[2])
 {
	 case 1://表示请求开门

	 //提取密码
		for(j=6,k=1000;j<10;j++)
		{
			pswd1+=rxdata[j]*k;
			k/=10;
		}		
		
		 //查找数据库中对应记录		
		strtemp.Format("%d",num);		
		strQuery = "select inmemo from bookin where roomNO like '"+strtemp+"'";
		theApp.ADOExecute(theApp.m_pADOSet, strQuery);
		iCount = theApp.m_pADOSet->GetRecordCount();
		if ( 0==iCount ) 
			b=0;
		else
		{			
			Holder = theApp.m_pADOSet->GetCollect("inmemo");
			str = Holder.vt==VT_NULL?"":(char *)(_bstr_t)Holder;
			pswd2 =atol(str);				
		}

		
        strtemp.Format("%d",num);
		
		
        time = COleDateTime::GetCurrentTime();
		s = time.Format("%y-%m-%d %H:%M:%S");

		if(b==FALSE)
			AfxMessageBox("注意!非法门牌号!");
		else
			{
			//返回开门数据
				 if(pswd1==pswd2)
				 {
					 //rec[2]=2;
					 rxdata[2]=2;
					 //m_send="08 88 02 01 01 00 01 02 03 04 00 00 00 00 08";
					 //str="正常开门";
					 record=strtemp+"  正常开门  "+s+"\r\n";Savedata();
				 }
				 else
				 {
					 //rec[2]=3;
					 rxdata[2]=3;
					 //m_send="08 88 03 01 01 00 01 02 03 04 00 00 00 00 08";
					 //str="非法请求";
					 record=strtemp+"  非法开门  "+s+"\r\n";Savedata();
				 }
				
				 for(i=0;i<len;i++) //将数组转换为Cstring型变量
						{
							BYTE bt=*(char*)(rxdata+i); //字符型//将字符送入临时变量strtemp存放
							
							strtemp.Format("%02x ",bt);
							//itoa(rec[i],buffer,16);
							m_send += strtemp; 
						}	 
									 /*//m_send+=rxdata;
									 wLength = m_send.GetLength();
									 sendArr.SetSize(wLength);
									 for( i =0; i<wLength; i++)
										 {
										   sendArr.SetAt(i, m_send.GetAt(i));
										 }		*/
				CByteArray hexdata;
				int slen=String2Hex(m_send,hexdata);
				m_MSComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据

										//	int len=String2Hex(m_send,sendArr); //此处返回的len可以用于计算发送了多少个十六进制数
										//	m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据

											//m_MSComm.SetOutput(COleVariant(sendArr));
			}
		break;
	 case 6:
			
			dS1+="报警.txt";
			GetWindowsDirectory(bufDir,_MAX_PATH);
			dS2.Format("%s\\NOTEPAD.exe  %s",bufDir,dS1);
			WinExec(dS2,SW_NORMAL);
			for( i =0; i<10; i++)
			Beep(800,100);//如何实现在吧点确认前一直响?6.2

			dS1="";
			dS1+="在路上.wav";     //打开报警文件,不能实现,能打开,但不自动播放6.1
		/*	GetSystemDirectory(bufDir,_MAX_PATH);
			dS2.Format("%s\\system32\\sndrec32.exe  %s",bufDir,dS1);
			//dS2.Format("C:\Program Files\Windows Media Player\wmplayer.exe  %s",dS1);
			WinExec(dS2,SW_NORMAL);*/
			ShellExecute(NULL, "open", dS1,NULL,NULL,SW_SHOW); 
			
			//num=rec[3]*100+rec[4];
			strtemp.Format("%d",num);
			MessageBox("请检查"+strtemp+"房间!");
		break;
	 default:
		break;
	}
}

int CHotel_MISView::String2Hex(CString str, CByteArray &senddata)
{
	
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	senddata.SetSize(len/2);
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
		if(hstr==' ')
		{
		i++;
		continue;
		}
		i++;
		if(i>=len)
			break;
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);
		if((hexdata==16)||(lowhexdata==16))
			break;
		else 
			hexdata=hexdata*16+lowhexdata;
			i++;
			senddata[hexdatalen]=(char)hexdata;
			hexdatalen++;
	}
	senddata.SetSize(hexdatalen);
	return hexdatalen;

}

char CHotel_MISView::ConvertHexChar(char ch)
{
	if((ch>='0')&&(ch<='9'))
	return ch-0x30;
	else if((ch>='A')&&(ch<='F'))
	return ch-'A'+10;
	else if((ch>='a')&&(ch<='f'))
	return ch-'a'+10;
	else return (-1);
}

void CHotel_MISView::Savedata()
{
	int		nLength;
	nLength = m_strCurPath.GetLength();

	for( int nCount = 0; nCount < nLength; nCount++ )
	{
		if( m_strCurPath.GetAt( nCount ) == '\\' )
			CreateDirectory( m_strCurPath.Left( nCount + 1 ), NULL );
	}
	CreateDirectory( m_strCurPath, NULL );

	CFile m_rFile;
	LPCSTR	lpszPath =m_strCurPath;// "c:\\comdata";
	SetCurrentDirectory( lpszPath );
    
	//文件名为Rec**.txt,以下代码自动检测文件名是否存在,若存在,则后面序号自动递增
	//如Rec00.txt Rec01.txt,程序自动为正要保存的文件命名为Rec02.txt.
	char buf[20]; 
	CTime t = CTime::GetCurrentTime();
	CString str=t.Format("%Y%m%d");
	//for(int j=0;j<100;j++)
	//{
		sprintf(buf,str+".txt");
		if(_access(buf,0)==0)
			if(!m_rFile.Open(buf,CFile::modeWrite)) 
			{
				AfxMessageBox( "打开记录文件失败!");
				return;
			}
		if((access(buf,0))==-1)
			if(!m_rFile.Open(buf,CFile::modeCreate | CFile::modeWrite )) 
			{
				AfxMessageBox( "创建记录文件失败!");
				return;
			}
	//}
    
	
	if((access(buf,0))==-1)
	{
		AfxMessageBox("failed");
		return;
	}
	//str=t.Format("%Y年%m月%d日\r\n");
	//m_rFile.Write((LPCTSTR)str,str.GetLength());
	m_rFile.SeekToEnd();
	m_rFile.Write((LPCTSTR)record,record.GetLength());
	m_rFile.Flush();
	m_rFile.Close();

}

⌨️ 快捷键说明

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