📄 hotel_misview.cpp
字号:
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 + -