// FSmsLog.cpp : implementation file // #include "stdafx.h" #include "corpsms.h" #include "FSmsLog.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CFSmsLog dialog #include "MainFrm.h" #include "ProcessSocket.h" #include "DLG_SMSLog_Export.h" #include "DLG_Find_SmsLog.h" #include "DLG_BAK.h" #include "DLG_Find_Fail.h" #include "DLG_SmsLog_MO.h" CFSmsLog::CFSmsLog(CWnd* pParent /*=NULL*/) : CDialog(CFSmsLog::IDD, pParent) { //{{AFX_DATA_INIT(CFSmsLog) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_bInit = false; m_bRefresh = false; m_lRefreshStatusIndex = 0; m_bShowToday = true; m_bShowAllRecord = false; m_bNewDB = true; } void CFSmsLog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFSmsLog) DDX_Control(pDX, IDC_SMSLOG_LIST, m_wndList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CFSmsLog, CDialog) //{{AFX_MSG_MAP(CFSmsLog) ON_WM_SIZE() ON_NOTIFY(NM_RCLICK, IDC_SMSLOG_LIST, OnRclickSmslogList) ON_NOTIFY(NM_DBLCLK, IDC_SMSLOG_LIST, OnDblclkSmslogList) ON_NOTIFY(LVN_KEYDOWN, IDC_SMSLOG_LIST, OnKeydownSmslogList) //}}AFX_MSG_MAP ON_COMMAND( MENU_LOG_DEL , On_User_Del ) ON_COMMAND( MENU_LOG_SEE , On_User_See ) ON_COMMAND( MENU_LOG_SEND , On_User_Send ) ON_COMMAND( MENU_LOG_EXPORT , On_User_Export ) ON_COMMAND( MENU_LOG_REFRESH , On_User_Refresh ) ON_COMMAND( MENU_LOG_REFSTATUS , On_User_RefStatus ) ON_COMMAND( MENU_LOG_FIND , On_User_Find ) ON_COMMAND( MENU_LOG_BAK , On_User_Bak ) ON_COMMAND( MENU_LOG_QUERYFAIL , On_User_QueryFail ) ON_COMMAND( MENU_LOG_MO , On_User_MO ) ON_COMMAND( MENU_LOG_SHOWALLRECORD , On_User_Refresh_All) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CFSmsLog message handlers BOOL CFSmsLog::OnInitDialog() { CDialog::OnInitDialog(); //取得共用参数 //CMainFrame * pFrame = static_cast ((CMainFrame *)AfxGetMainWnd()); this->GetParent()->GetParentFrame(); m_pMainFrame = (CMainFrame *)this->GetParent()->GetParentFrame(); m_pSocket = &m_pMainFrame->m_Socket; m_AdoRS.SetAdoConnection( &m_pMainFrame->m_adoConnection ); //初始化List m_Image.Create(16,16,ILC_COLOR32|ILC_MASK,5,5); m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_SMSDF) ); m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_SMS_SEND) ); m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_SMSJS) ); m_Image.Add(AfxGetApp()->LoadIcon(IDI_L_SMSSB) ); m_wndList.SubClassWindow2(); #ifdef STATUS_ENABLE_RECV_TIME m_wndList.SetHeadings(_T("序号,50; 状态,70;发信号码,100;收信号码,150; 短信内容,280;发信时间,130;收信时间,130;")); #else m_wndList.SetHeadings(_T("序号,50; 状态,70;发信号码,100;收信号码,150; 短信内容,280;发信时间,130")); #endif m_wndList.SetGridLines(true); m_wndList.SetImageList(&m_Image,LVSIL_SMALL); //m_wndList.SetBkColor( RGB(237,191,175) ); //m_wndList.SetTextBkColor( RGB(237,191,175) ); m_bInit = true; return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } BOOL CFSmsLog::ReHide() { ShowWindow( SW_HIDE ); return true; } BOOL CFSmsLog::ReShow(BOOL bRefresh) { USES_CONVERSION; m_AdoRS.Close(); if ( m_strBakDBName.GetLength()<=0 ) { m_adoConnection.Close(); m_AdoRS.SetAdoConnection( &m_pMainFrame->m_adoConnection ); } else { //解密码 char szPasswd[64]={0};strcpy(szPasswd , ACCESS_PASSWD ); char szKey[64]={0};strcpy( szKey , ACCESS_KEY ); char szNew2[64]={0};long lOut=sizeof(szNew2); TCHAR szNew[64]={0}; CDes des; des.Decrypt( szPasswd , strlen(szPasswd),szNew2,lOut,szKey,8); #ifdef UNICODE _tcscpy(szNew,A2W(szNew2)); #else _tcscpy(szNew,szNew2); #endif m_adoConnection.Close(); if ( !m_adoConnection.ConnectAccess(m_strBakDBName,szNew ) ) //连接数据库错误,需要重新创建 { MessageBox( _T("打开备份文件错误,请检查!") , _T("错误") , MB_ICONWARNING ); m_bShowToday = true; m_AdoRS.SetAdoConnection( &m_pMainFrame->m_adoConnection ); } else { m_bShowToday = false; m_AdoRS.SetAdoConnection( &m_adoConnection ); //设置连接 } } ShowWindow( SW_SHOW ); if ( bRefresh || !m_bRefresh || m_bNewDB ) { RefreshInfo(); m_bNewDB = false; } return true; } BOOL CFSmsLog::RefreshInfo() { m_wndList.ShowWindow( SW_HIDE ); //为了加快显示速度 m_bRefresh = true; m_wndList.DeleteAllItems(); TCHAR szSelect[256]={0}; long lCount2 = m_wndList.GetColumnCount(); if (lCount2>5) { for ( int i=lCount2;i>5;i--) m_wndList.DeleteColumn(i); } CString strTop; if ( !m_bShowAllRecord && m_pMainFrame->m_Setup.lTopRecord>0 ) { strTop.Format(_T(" top %d "),m_pMainFrame->m_Setup.lTopRecord ); } if ( m_bShowToday ) { //仅查询当天的 SYSTEMTIME t;::GetLocalTime(&t); if ( m_pMainFrame->m_Setup.bSQLUse ) _stprintf( szSelect , _T("select %s * from smslog where SubTime>='%04d%02d%02d' %s order by SubTime desc"),strTop,t.wYear,t.wMonth,t.wDay,m_strFindAdd ); //查询已发短信 else _stprintf( szSelect , _T("select %s * from smslog where SubTime>=#%04d-%02d-%02d# %s order by SubTime desc"),strTop,t.wYear,t.wMonth,t.wDay,m_strFindAdd ); //查询已发短信 } else { if ( m_strFindAdd.GetLength()>0 ) _stprintf( szSelect , _T("select * from smslog where 1 %s order by SubTime desc"),m_strFindAdd ); //查询接收记录 else _stprintf( szSelect , _T("select * from smslog order by SubTime desc") ); //查询日志,显示全部的,不用只显示头部分 } BOOL b = m_AdoRS.Open( szSelect ); long lSendID=0; long lStatus=0; TCHAR szStatus[24]={0}; TCHAR szSendNum[24]={0}; TCHAR szRecver[64]={0}; TCHAR szRecvNum[64]={0}; COleDateTime tSub; COleDateTime tRecv; CString strSubTime; CString strRecvTime; long lCount = m_AdoRS.GetRecordCount(); if ( !m_bShowAllRecord && m_pMainFrame->m_Setup.lTopRecord>0 && lCount>m_pMainFrame->m_Setup.lTopRecord ) { lCount = m_pMainFrame->m_Setup.lTopRecord; } m_bShowAllRecord = false; //显示完一次后,不用再全部显示 if ( b && lCount ) { CAdoSmsLog adoSms; m_AdoRS.RecordBinding( adoSms ); m_AdoRS.MoveFirst(); long iItem = 0; while( !m_AdoRS.IsEOF() && iItem0 ) { _tcscat( szRecvNum , "-" ); _tcscat( szRecvNum , szRecver ); } m_wndList.SetItemText(iItem,3,szRecvNum); m_wndList.SetItemText(iItem,4,szMsg); if ( tSub.GetStatus() == COleDateTime::valid ) { _stprintf( szMsg , "%04d.%02d.%02d %02d:%02d" , tSub.GetYear(),tSub.GetMonth(),tSub.GetDay(),tSub.GetHour(),tSub.GetMinute() ); m_wndList.SetItemText(iItem,5,szMsg); } #ifdef STATUS_ENABLE_RECV if ( tRecv.GetStatus() == COleDateTime::valid ) { _stprintf( szMsg , "%04d.%02d.%02d %02d:%02d" , tRecv.GetYear(),tRecv.GetMonth(),tRecv.GetDay(),tRecv.GetHour(),tRecv.GetMinute() ); m_wndList.SetItemText(iItem,6,szMsg); } #endif */ #ifdef STATUS_ENABLE_RECV long lIcon = GetStatusText( adoSms.m_Status , szStatus ); #else long lIcon = GetStatusText2( adoSms.m_Status , szStatus ); #endif //无需要状态的短信通所有都返回“发送成功”。 BOOL bNoStatus = m_pMainFrame->m_Setup.bSDK & SDK_NOSTATUS ? true:false; if ( bNoStatus ) { _tcscpy( szStatus , _T("发送成功") ); lIcon = 1; } _tcscpy(szRecvNum,adoSms.m_RecvNum); if ( m_pMainFrame->GetUserPurview_HideNum() ) { szRecvNum[4]='*'; szRecvNum[5]='*'; szRecvNum[6]='*'; szRecvNum[7]='*'; } if ( _tcslen(adoSms.m_Recver)>0 ) { _tcscat( szRecvNum , _T("-") ); _tcscat( szRecvNum , adoSms.m_Recver ); } if ( adoSms.m_SubTime.GetStatus() == COleDateTime::valid ) { strSubTime.Format(_T("%04d.%02d.%02d %02d:%02d") , adoSms.m_SubTime.GetYear(),adoSms.m_SubTime.GetMonth(),adoSms.m_SubTime.GetDay(),adoSms.m_SubTime.GetHour(),adoSms.m_SubTime.GetMinute() ); } #ifdef STATUS_ENABLE_RECV_TIME if ( adoSms.m_RecvTime.GetStatus() == COleDateTime::valid && adoSms.m_RecvTime>COleDateTime(2010,1,1,0,0,0) ) { strRecvTime.Format(_T("%04d.%02d.%02d %02d:%02d") , adoSms.m_RecvTime.GetYear(),adoSms.m_RecvTime.GetMonth(),adoSms.m_RecvTime.GetDay(),adoSms.m_RecvTime.GetHour(),adoSms.m_RecvTime.GetMinute() ); } m_wndList.InsertItemAndCol( iItem , _itot( lCount-iItem,szSelect,10) , szStatus,adoSms.m_SendNum,szRecvNum,adoSms.m_Msg,strSubTime,strRecvTime ); #else m_wndList.InsertItemAndCol( iItem , _itot( lCount-iItem,szSelect,10) , szStatus,adoSms.m_SendNum,szRecvNum,adoSms.m_Msg,strSubTime); #endif m_wndList.SetItemData( iItem, adoSms.m_SendID ); m_wndList.SetIconIndex( iItem , lIcon ); iItem++; memset(&adoSms,0,sizeof(adoSms)); m_AdoRS.MoveNext(); } } RefreshStatus(); m_wndList.ShowWindow( SW_SHOW ); //为了加快显示速度 if ( strTop.GetLength()>0 && lCount>=m_pMainFrame->m_Setup.lTopRecord) //显示显示“显示所有记录”的选项 { CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_SEPARATOR ); menu.AppendMenu(MF_STRING , MENU_LOG_SHOWALLRECORD, _T(" 显示所有记录 ") ); menu.AppendMenu(MF_SEPARATOR ); CRect rect; GetWindowRect(&rect); //ClientToScreen(&rect); //显示菜单 POINT pt ; pt.x = rect.Width()/2; pt.y = rect.Height()/3; ClientToScreen(&pt); //menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL); menu.TrackPopupMenu(TPM_CENTERALIGN,pt.x,pt.y, this, NULL); menu.DestroyMenu(); } return true; } void CFSmsLog::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if ( m_bInit ) { m_wndList.MoveWindow( 0 , 0 , cx,cy); } } long CFSmsLog::GetStatusText(long lStatus, TCHAR *pStatus) { _tcscpy( pStatus , _T("未知状态") ); long lIcon = 0; switch(lStatus) { case SEND_STATUS_SUB_OK: _tcscpy( pStatus , _T("提交成功") ); break; case SEND_STATUS_SUB_FILT: //_tcscpy( pStatus , _T("审核中") ); _tcscpy( pStatus , _T("提交成功") ); break; case SEND_STATUS_SUB_ERROR: case SEND_STATUS_SUB_USERNOSMS: case SEND_STATUS_SUB_CORPNOSMS: case SEND_STATUS_SUB_CORPOVRDATE: _tcscpy( pStatus , _T("提交失败") ); lIcon = 3; break; case SEND_STATUS_SUB_NUMNOSUP: _tcscpy( pStatus , _T("目标有误") ); lIcon = 3; break; case SEND_STATUS_FILT_ERROR: _tcscpy( pStatus , _T("审核失败") ); lIcon = 3; break; case SEND_STATUS_SEND_OK: _tcscpy( pStatus , _T("发送成功") ); lIcon = 1; break; case SEND_STATUS_SEND_ERROR: _tcscpy( pStatus , _T("发送失败") ); lIcon = 3; break; case SEND_STATUS_RECV_OK: _tcscpy( pStatus , _T("接收成功") ); lIcon = 2; break; case SEND_STATUS_RECV_ERROR: _tcscpy( pStatus , _T("接收失败") ); lIcon = 3; break; } return lIcon; } void CFSmsLog::OnRclickSmslogList(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; ShowRMenu(); } void CFSmsLog::ShowRMenu() { CMenu menu; menu.CreatePopupMenu(); BOOL bLock = false; long lItem = this->GetCurrentSelected(); BOOL bNoStatus = m_pMainFrame->m_Setup.bSDK & SDK_NOSTATUS ? true:false; if ( lItem >= 0 ) { if ( !m_pMainFrame->GetUserPurview_HideNum() ) { menu.AppendMenu(MF_STRING , MENU_LOG_SEE , _T(" 查 看 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_LOG_SEE , _T(" 查 看 ") ); } menu.AppendMenu(MF_STRING , MENU_LOG_SEND, _T(" 再次发送 ") ); menu.AppendMenu(MF_STRING , MENU_LOG_DEL , _T(" 删 除 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_LOG_SEE , _T(" 查 看 ") ); menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_LOG_SEND, _T(" 再次发送 ") ); menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_LOG_DEL, _T(" 删 除 ") ); } menu.AppendMenu(MF_SEPARATOR ); //匹配上行 if ( !m_pMainFrame->GetUserPurview_HideNum() ) menu.AppendMenu(MF_STRING , MENU_LOG_MO, _T(" 匹配上行... ") ); else menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_LOG_MO, _T(" 匹配上行... ") ); //导出 if ( !m_pMainFrame->GetUserPurview_HideNum() ) menu.AppendMenu(MF_STRING , MENU_LOG_EXPORT, _T(" 导出... ") ); else menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , MENU_LOG_EXPORT, _T(" 导出... ") ); //刷新 menu.AppendMenu(MF_STRING , MENU_LOG_FIND , _T(" 查找... ") ); menu.AppendMenu(MF_SEPARATOR ); if ( lItem >= 0 ) menu.AppendMenu(MF_STRING , MENU_LOG_BAK , _T(" 备份... ") ); else menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED, MENU_LOG_BAK , _T(" 备份... ") ); menu.AppendMenu(MF_SEPARATOR ); BOOL bFindFail = m_pMainFrame->m_Setup.bSDK & SDK_ALLOWFINDFAIL ? true:false; if ( bFindFail && !bNoStatus ) { menu.AppendMenu(MF_STRING , MENU_LOG_QUERYFAIL, _T(" 查失败短信 ") ); menu.AppendMenu(MF_SEPARATOR ); } //刷新 menu.AppendMenu(MF_STRING , MENU_LOG_REFRESH, _T(" 刷 新 ") ); if ( !bNoStatus ) //如果无需要状态,没有刷新状态的菜单 { //刷新 menu.AppendMenu(MF_STRING , MENU_LOG_REFSTATUS, _T(" 刷新状态 ") ); } //显示菜单 POINT pt ; ::GetCursorPos( &pt ); //this->ClientToScreen( &pt); menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL); menu.DestroyMenu(); } long CFSmsLog::GetCurrentSelected() { POSITION pos = m_wndList.GetFirstSelectedItemPosition(); if ( pos ) { return m_wndList.GetNextSelectedItem(pos); } return -1; } void CFSmsLog::On_User_See() { long lItem = GetCurrentSelected(); if ( lItem <0 ) return ; SMS_See sms = GetSms(lItem); sms.lType = SMS_SEE_TYPE_LOG; if ( m_pMainFrame->GetUserPurview_HideNum() ) { sms.szRecver[4]='*'; sms.szRecver[5]='*'; sms.szRecver[6]='*'; sms.szRecver[7]='*'; } DLG_SmsLogSee dlg(this); dlg.SetParam(sms); dlg.DoModal(); } void CFSmsLog::On_User_Send() { long lItem = GetCurrentSelected(); if ( lItem <0 ) return ; if ( m_pMainFrame->m_pFuncView->On_User_List_Add() ) //新建列表 { //添加内容 m_pMainFrame->m_pFuncView->m_DLGSend.List_SetMsg( _T("\"%Memo%\"") ); //添加号码 long lCount = m_wndList.GetSelectedCount(); if ( lCount <= 0 ) return ; //分配数据 long lSize = sizeof(Send_User)*lCount; BYTE *pS = new BYTE[lSize]; memset( pS , 0 , lSize ); Send_User * pUser = (Send_User * )pS; CString strCM; BOOL bCMFirst = m_pMainFrame->GetQJCM(strCM); CString strMsg; TCHAR szSelect[128]={0}; POSITION pos = m_wndList.GetFirstSelectedItemPosition(); while ( pos ) { long lItem = m_wndList.GetNextSelectedItem( pos ); long lSendID = m_wndList.GetItemData( lItem ); strMsg = _T(""); if ( lSendID > 0 ) { _stprintf( szSelect , _T("select * from smslog where SendID=%d"), lSendID ); BOOL b = m_AdoRS.Open( szSelect ); if ( b && !m_AdoRS.IsEOF() ) { m_AdoRS.GetCollect( _T("Recver") , pUser->szName); m_AdoRS.GetCollect( _T("RecvNum") , pUser->szMobile); m_AdoRS.GetCollect( _T("Msg") , strMsg); } } else { CString strTemp22; strTemp22 = m_wndList.GetItemText(lItem,3); strMsg = m_wndList.GetItemText(lItem,4); CStringArray strTemp23; long lSplit = SplitString(strTemp23,strTemp22,_T("-")); if ( strTemp23.GetCount()>=1 ) _tcscpy(pUser->szMobile,strTemp23.GetAt(0)); if ( strTemp23.GetCount()>=2 ) _tcscpy(pUser->szName,strTemp23.GetAt(1)); } _tcscpy(pUser->szBZ,strMsg); if ( strCM.GetLength()>0 ) { if ( strMsg.Find(strCM) ==0 ) //开头是签名,去除 { memset(pUser->szBZ,0,sizeof(pUser->szBZ)); _tcscpy(pUser->szBZ,((const TCHAR*)strMsg)+strCM.GetLength()); } if ( strMsg.Find(strCM) == strMsg.GetLength()-strCM.GetLength() ) //结尾是签名,去除 { memset(pUser->szBZ,0,sizeof(pUser->szBZ)); _tcsncpy(pUser->szBZ,strMsg,strMsg.GetLength()-strCM.GetLength()); } } pUser ++; } m_pMainFrame->m_pFuncView->On_User_List_AddUser(lCount,(Send_User*)pS); delete pS; } } void CFSmsLog::On_User_Del() { long lCount = m_wndList.GetSelectedCount(); long *lDel = new long[lCount+2]; POSITION pos = m_wndList.GetFirstSelectedItemPosition(); long i = 0; while(pos) { lDel[i]= m_wndList.GetNextSelectedItem(pos); i ++; } long lSendID = 0; TCHAR szSelect[128]; //倒转删除 m_wndList.ShowWindow( SW_HIDE ); //加快显示的速度 for ( i = lCount ; i>0 ; i-- ) { lSendID = m_wndList.GetItemData( lDel[i-1] ); _stprintf( szSelect , _T("delete from smslog where SendID=%d ") , lSendID ); BOOL b = m_AdoRS.Open( szSelect ); if ( b && m_AdoRS.GetRecordCount() ) { m_wndList.DeleteItem(lDel[i-1]); //从列表中删除 } } m_wndList.ShowWindow( SW_SHOW ); //加快显示的速度 delete lDel; } void CFSmsLog::On_User_MO() { long lCount = m_wndList.GetSelectedCount(); if ( lCount<=0 ) { MessageBox(_T("请先选择需要匹配上行的记录,可多选."),_T("信息"),MB_ICONINFORMATION); return ; } COleDateTime tBegin=COleDateTime::GetCurrentTime(); long *lDel = new long[lCount+2]; POSITION pos = m_wndList.GetFirstSelectedItemPosition(); long i = 0; while(pos) { lDel[i]= m_wndList.GetNextSelectedItem(pos); CString str=m_wndList.GetItemText(lDel[i],5); //取发送时间 try { COleDateTime t; str = str+CString(_T(":00")); str.Replace( _T(".") , _T("-") ); t.ParseDateTime(str); if ( t.GetStatus()==COleDateTime::valid && t0 ) { str.Format(_T("select * from smsrecv where SendNum='%s' and RecvTime>=#%04d-%02d-%02d %02d:%02d:%02d# and RecvTime<=#%04d-%02d-%02d %02d:%02d:%02d# order by recvtime") , strRecvNum,tBegin.wYear,tBegin.wMonth,tBegin.wDay,tBegin.wHour,tBegin.wMinute,tBegin.wSecond ,tEnd.wYear,tEnd.wMonth,tEnd.wDay,tEnd.wHour,tEnd.wMinute,tEnd.wSecond ); if ( m_AdoRS.Open( str ) && !m_AdoRS.IsEOF() ) { SYSTEMTIME tMo={0}; m_AdoRS.GetCollect(_T("Msg"), strMOMsg); m_AdoRS.GetCollect(_T("RecvTime"), tMo); strMOTime.Format(_T("%04d.%02d.%02d %02d:%02d") , tMo.wYear,tMo.wMonth,tMo.wDay,tMo.wHour,tMo.wMinute); lMoCount ++; } } } m_wndList.SetItemText(lDel[i],lMO_TimeItem,strMOTime); m_wndList.SetItemText(lDel[i],lMO_MsgItem,strMOMsg); } m_wndList.CopySelToClipboard(); str.Format(_T("匹配记录成功,共选择%d条记录,成功匹配上行%d条。\r\n匹配数据已拷贝至粘贴板!"),lCount,lMoCount); MessageBox(str,_T("信息") , MB_ICONINFORMATION); } } void CFSmsLog::On_User_Export() { //无需要状态的短信通所有都返回“发送成功”。 BOOL bNoStatus = m_pMainFrame->m_Setup.bSDK & SDK_NOSTATUS ? true:false; DLG_SMSLog_Export dlg(this); dlg.SetParam(&m_AdoRS,&m_wndList,bNoStatus); dlg.DoModal(); } void CFSmsLog::On_User_Refresh() { RefreshInfo(); } void CFSmsLog::On_User_QueryFail() { DLG_Find_Fail dlg(this); if ( dlg.DoModal() == IDOK ) { m_wndList.ShowWindow(SW_HIDE ); //加快显示速度 m_wndList.DeleteAllItems(); m_wndList.ShowWindow(SW_SHOW ); //加快显示速度 REQ_List * pList = new REQ_List; memset(pList , 0 , sizeof(REQ_List)); dlg.m_tQBegin.GetAsSystemTime(pList->tBegin); dlg.m_tQEnd.GetAsSystemTime(pList->tEnd); pList->lCorpID = m_pMainFrame->m_lCorpID; pList->bOld = false; pList->lMobileType = -1; pList->lMsgType = -1; pList->lMsgType = -1; pList->lStatus = -1; pList->bJF = false; if ( dlg.m_bNoStatus ) pList->lStatus = 10; //查询没状态的短信 if ( dlg.m_strMobile.GetLength()<=0 ) { _tcscpy( pList->szMobile , _T("FAIL") ); } else { _tcscpy( pList->szMobile , dlg.m_strMobile ); pList->lStatus = -1; //如果有录入号码,则查询所有短信 pList->bOld = true; } m_pMainFrame->SendFrame( SMSFUNC_LIST , (BYTE*)pList , sizeof(REQ_List) ); } } void CFSmsLog::On_User_Find() { CString strTemp; DLG_Find_SmsLog dlg(this); BOOL bNoStatus = m_pMainFrame->m_Setup.bSDK & SDK_NOSTATUS ? true:false; dlg.SetParam(!m_bShowToday , !bNoStatus ); if ( dlg.DoModal() == IDOK ) { m_strFindAdd = _T(""); //if ( !m_bShowToday ) //{ strTemp.Format( _T(" AND SubTime>=#%04d-%02d-%02d %02d:%02d:%02d# AND SubTime<=#%04d-%02d-%02d %02d:%02d:%02d#"),dlg.m_TBegin.GetYear(),dlg.m_TBegin.GetMonth(),dlg.m_TBegin.GetDay(), dlg.m_TBegin2.GetHour(), dlg.m_TBegin2.GetMinute(), dlg.m_TBegin2.GetSecond(),dlg.m_TEnd.GetYear(),dlg.m_TEnd.GetMonth(),dlg.m_TEnd.GetDay(), dlg.m_TEnd2.GetHour(), dlg.m_TEnd2.GetMinute(), dlg.m_TEnd2.GetSecond()); m_strFindAdd = strTemp; //} if ( dlg.m_lStatus>=0 ) { strTemp.Format( _T(" AND Status=%d"),dlg.m_lStatus ); m_strFindAdd += strTemp; } if ( dlg.m_strSendNum.GetLength()>0 ) { strTemp.Format( _T(" AND SendNum like '%%%s%%'"),dlg.m_strSendNum ); m_strFindAdd += strTemp; } if ( dlg.m_strRecvNum.GetLength()>0 ) { strTemp.Format( _T(" AND RecvNum like '%%%s%%'"),dlg.m_strRecvNum ); m_strFindAdd += strTemp; } if ( dlg.m_strMsg.GetLength()>0 ) { strTemp.Format( _T(" AND Msg like '%%%s%%'"),dlg.m_strMsg ); m_strFindAdd += strTemp; } On_User_Refresh(); m_strFindAdd = _T(""); //刷新后,查询结束 } } void CFSmsLog::On_User_Bak() { USES_CONVERSION; long lCount = m_wndList.GetSelectedCount(); DLG_BAK dlg(this); dlg.SetParam(lCount); if ( dlg.DoModal() == IDOK ) { //读入数据库 TCHAR szPath[512]={0}; TCHAR szBakPath[64]={0}; TCHAR szOldDB[512]={0}; TCHAR szNewDB[512]={0}; this->m_pMainFrame->GetCurrentPath( szPath ); _stprintf(szOldDB , _T("%s%s"),szPath,ACCESS_SOURCE); _stprintf(szBakPath,_T("Bak_%d_%s"),m_pMainFrame->m_lCorpID,m_pMainFrame->m_pCurUser->szUser); _tcscat(szPath,szBakPath); ::CreateDirectory(szPath,NULL); //不管有理没理,先创建再说 _stprintf(szNewDB , _T("%s\\SmsLog_%s.bak"),szPath,dlg.m_strTitle); if ( !CopyFile( szOldDB , szNewDB , false ) ) //copy文件失败 { MessageBox( _T("系统文件丢失1,请重新安装!") , _T("致命错误") , MB_ICONWARNING ); return ; } //打开新的备份数据库 CAdoConnection bakadoConnection; CAdoRecordSet bakAdoRS; //解密码 char szPasswd[64]={0};strcpy(szPasswd , ACCESS_PASSWD ); char szKey[64]={0};strcpy( szKey , ACCESS_KEY ); char szNew2[64]={0};long lOut=sizeof(szNew2); TCHAR szNew[64]={0}; CDes des; des.Decrypt( szPasswd , strlen(szPasswd),szNew2,lOut,szKey,8); #ifdef UNICODE _tcscpy(szNew , A2W(szNew2)); #else _tcscpy(szNew , szNew2); #endif if ( !bakadoConnection.ConnectAccess(szNewDB,szNew ) ) //连接数据库错误,需要重新创建 { MessageBox( _T("系统文件丢失2,请重新安装!") , _T("致命错误") , MB_ICONWARNING ); return; } bakAdoRS.SetAdoConnection( &bakadoConnection ); //设置连接 //检测数据库是否需要升级 this->m_pMainFrame->UpdateDB(bakadoConnection, bakAdoRS); if ( !bakAdoRS.Open(_T("smslog"),adCmdTable) ) { MessageBox( _T("系统文件丢失3,请重新安装!") , _T("致命错误") , MB_ICONWARNING ); return; } long *lDel = new long[lCount+2]; int lDelCount=0; TCHAR szSelect[256]={0}; POSITION pos = m_wndList.GetFirstSelectedItemPosition(); while ( pos ) { long lItem = m_wndList.GetNextSelectedItem( pos ); long lSendID = m_wndList.GetItemData( lItem ); lDel[lDelCount]=lItem; if ( lSendID > 0 ) { _stprintf( szSelect , _T("select * from smslog where SendID=%d"), lSendID ); BOOL b = m_AdoRS.Open( szSelect ); if ( b && m_AdoRS.GetRecordCount() ) { CAdoSmsLog adoSms; m_AdoRS.RecordBinding( adoSms ); m_AdoRS.MoveFirst(); //插入到另一个表 BOOL b = bakAdoRS.RecordBinding( adoSms ); b = bakAdoRS.AddNew(adoSms); b = bakAdoRS.Update(); } } lDelCount ++; } //倒转删除 m_wndList.ShowWindow( SW_HIDE ); //加快显示的速度 for ( int i=lDelCount-1 ; i>=0 ; i-- ) { long lSendID = m_wndList.GetItemData( lDel[i] ); _stprintf( szSelect , _T("delete from smslog where SendID=%d ") , lSendID ); BOOL b = m_AdoRS.Open( szSelect ); if ( b && m_AdoRS.GetRecordCount() ) { m_wndList.DeleteItem(lDel[i]); //从列表中删除 } } m_wndList.ShowWindow( SW_SHOW ); //加快显示的速度 delete lDel; //在树中添加 CString strName; strName.Format( _T("备份_%s") , dlg.m_strTitle ); m_pMainFrame->m_pFuncView->AddBak_SmsLog(strName); } } void CFSmsLog::On_User_RefStatus() { RefreshStatus(); } void CFSmsLog::On_User_Refresh_All() { m_bShowAllRecord = true; On_User_Refresh(); } void CFSmsLog::RefreshStatus(BOOL bBegin) { BOOL bNoStatus = m_pMainFrame->m_Setup.bSDK & SDK_NOSTATUS ? true:false; if ( bNoStatus ) //如果无需要状态,不用刷新状态 return ; //第一步,查找状态为未固定的短信 long lCount = m_wndList.GetItemCount(); long * pSendID= new long[STATUS_MAX_QUERY*3+100]; long lCount2=0; if ( bBegin ) m_lRefreshStatusIndex = 0; else m_lRefreshStatusIndex ++; for ( int i=m_lRefreshStatusIndex*STATUS_MAX_QUERY;i= STATUS_MAX_QUERY*3 ) //超过1000条了 break; } lCount = lCount2/3; //取得需要取状态的个数 if ( lCount > 0 ) { long lSize = sizeof(REQ_SendStatus)+sizeof(ANS_SendStatus_Data)*lCount; BYTE * pData = new BYTE[lSize];memset(pData,0,lSize); REQ_SendStatus * pStatus = (REQ_SendStatus *)pData; ANS_SendStatus_Data * pStatusData = (ANS_SendStatus_Data *)(pData+sizeof(REQ_SendStatus)); pStatus->lCorpID = m_pMainFrame->m_lCorpID; pStatus->lCount = lCount; for ( i=0;ilItemID = pSendID[i*3]; pStatusData->lSendID = pSendID[i*3+1]; pStatusData->lStatus = pSendID[i*3+2]; pStatusData++; } m_pMainFrame->SendFrame( SMSFUNC_SENDSTATUS , pData , lSize ); } delete pSendID; } long CFSmsLog::GetItemStatus(long iItem) { TCHAR szStatus[16]={0}; TCHAR szTime[32]={0}; m_wndList.GetItemText( iItem , 1 , szStatus , sizeof(szStatus) ); m_wndList.GetItemText( iItem , 5 , szTime ,sizeof(szTime)); szTime[4]=0; szTime[7]=0; szTime[10]=0; long lYear=_ttol(szTime); long lMon =_ttol(szTime+5); long lDay =_ttol(szTime+8); CTime t2 = CTime::GetCurrentTime(); if (lYear <= 0 || lMon <= 0 || lDay <= 0) { lYear = t2.GetYear(); lMon = t2.GetMonth(); lDay = t2.GetDay(); } CTime t1(lYear,lMon,lDay,0,0,0); CTime t3 = t1 + CTimeSpan( 10, 0, 0, 0 ); if ( t3 < t2 ) //2日前的信息,跳过 { return SEND_STATUS_UNKNOW; } if ( !_tcscmp( szStatus , _T("提交成功") ) ) return SEND_STATUS_SUB_OK; if ( !_tcscmp( szStatus , _T("审核中") ) ) return SEND_STATUS_SUB_FILT; if ( !_tcscmp( szStatus , _T("提交失败") ) ) return SEND_STATUS_SUB_ERROR; if ( !_tcscmp( szStatus , _T("目标有误") ) ) return SEND_STATUS_SUB_NUMNOSUP; if ( !_tcscmp( szStatus , _T("审核失败") ) ) return SEND_STATUS_FILT_ERROR; if ( !_tcscmp( szStatus , _T("发送成功") ) ) return SEND_STATUS_SEND_OK; if ( !_tcscmp( szStatus , _T("发送失败") ) ) return SEND_STATUS_SEND_ERROR; if ( !_tcscmp( szStatus , _T("接收成功") ) ) return SEND_STATUS_RECV_OK; if ( !_tcscmp( szStatus , _T("接收失败") ) ) return SEND_STATUS_RECV_ERROR; // if ( !_tcscmp( szStatus , _T("未知状态") ) ) return SEND_STATUS_UNKNOW; } BOOL CFSmsLog::ProcessSocket(Socket_Head *pHead) { //修改公用地址本 if (pHead->lFuncType == SMSFUNC_SENDSTATUS) { ANS_SendStatus * pStatus = (ANS_SendStatus *)pHead->pFrame; ANS_SendStatus_Data * pData = (ANS_SendStatus_Data *)(pHead->pFrame+sizeof(ANS_SendStatus)); for ( int i = 0;ilCount;i++) { if ( pData->lStatus != -1 ) //如果其值为-1,证明状态没变,所以不必更改 { COleDateTime tSend(pData->tSendTime ); COleDateTime tRecv(pData->tRecvTime ); //将结果先入数据库 TCHAR szBuf[32]; TCHAR szSelect[128]={0}; _stprintf( szSelect , _T("select * from smslog where SendID=%d") , pData->lSendID ); if ( m_AdoRS.Open(szSelect) && m_AdoRS.GetRecordCount()>0 ) { m_AdoRS.MoveFirst(); m_AdoRS.PutCollect( _T("Status") , pData->lStatus ); m_AdoRS.PutCollect( _T("SendTime") , tSend ); m_AdoRS.PutCollect( _T("RecvTime") , tRecv ); m_AdoRS.Update(); m_AdoRS.Close(); } //更新显示 if ( pData->lItemID>=0 && pData->lItemIDlItemID); if ( lSendID == pData->lSendID ) //更新显示内容 { #ifdef STATUS_ENABLE_RECV long lIcon = GetStatusText( pData->lStatus , szBuf ); #else long lIcon = GetStatusText2(pData->lStatus , szBuf); #endif m_wndList.SetItemText(pData->lItemID,1,szBuf); m_wndList.SetIconIndex( pData->lItemID , lIcon ); #ifdef STATUS_ENABLE_RECV_TIME if ( tRecv.GetStatus() == COleDateTime::valid && tRecv>COleDateTime(2010,1,1,0,0,0) ) { _stprintf( szBuf , _T("%04d.%02d.%02d %02d:%02d") , tRecv.GetYear(),tRecv.GetMonth(),tRecv.GetDay(),tRecv.GetHour(),tRecv.GetMinute() ); m_wndList.SetItemText(pData->lItemID,6,szBuf); } #endif } } } pData ++; //继续处理下一条 } RefreshStatus( false ); //查询下1000条的状态 return true; } //修改公用地址本 if (pHead->lFuncType == SMSFUNC_LIST) { ANS_List * pList = (ANS_List *)pHead->pFrame; ANS_ListData * pData = (ANS_ListData *)(pHead->pFrame+sizeof(ANS_List)); TCHAR szStatus[24]={0}; TCHAR szSelect[64]={0}; COleDateTime tSub; CString strSubTime,strRecvTime; for ( int i = 0;ilCount;i++) { long iItem = m_wndList.GetItemCount(); #ifdef STATUS_ENABLE_RECV long lIcon = GetStatusText( pData->lStatus , szStatus ); #else long lIcon = GetStatusText2( pData->lStatus , szStatus ); #endif tSub = COleDateTime(pData->tSubTime); if ( tSub.GetStatus() == COleDateTime::valid ) { strSubTime.Format(_T("%04d.%02d.%02d %02d:%02d") , tSub.GetYear(),tSub.GetMonth(),tSub.GetDay(),tSub.GetHour(),tSub.GetMinute() ); } #ifdef STATUS_ENABLE_RECV_TIME tSub = COleDateTime(pData->tRecvTime); if ( tSub.GetStatus() == COleDateTime::valid && tSub>COleDateTime(2010,1,1,0,0,0)) { strRecvTime.Format(_T("%04d.%02d.%02d %02d:%02d") , tSub.GetYear(),tSub.GetMonth(),tSub.GetDay(),tSub.GetHour(),tSub.GetMinute() ); } m_wndList.InsertItemAndCol( iItem , _itot( iItem+1,szSelect,10) , szStatus,pData->szSendNum,pData->szRecvNum,pData->szMsg,strSubTime,strRecvTime ); #else m_wndList.InsertItemAndCol( iItem , _itot( iItem+1,szSelect,10) , szStatus,pData->szSendNum,pData->szRecvNum,pData->szMsg,strSubTime); #endif m_wndList.SetItemData( iItem, 0 ); m_wndList.SetIconIndex( iItem , lIcon ); pData ++; } return true; } return false; } SMS_See CFSmsLog::GetSms(long lItem) { SMS_See sms={0}; long lSendID = m_wndList.GetItemData(lItem); CString strSelect; long lStatus; TCHAR szSender[16]={0}; TCHAR szRecver[16]={0}; COleDateTime t; strSelect.Format( _T("select * from smslog where SendID=%d") , lSendID ); if ( m_AdoRS.Open( strSelect ) && m_AdoRS.GetRecordCount() ) { m_AdoRS.MoveFirst(); m_AdoRS.GetCollect( _T("Status") , lStatus ); m_AdoRS.GetCollect( _T("SendNum") , sms.szSender ); m_AdoRS.GetCollect( _T("Recver") , szRecver ); m_AdoRS.GetCollect( _T("RecvNum") , sms.szRecver ); m_AdoRS.GetCollect( _T("Msg") , sms.szMsg ); m_AdoRS.GetCollect( _T("SubTime") , t );t.GetAsSystemTime(sms.tSend); m_AdoRS.GetCollect( _T("RecvTime"), t );t.GetAsSystemTime(sms.tRecv); //#ifdef STATUS_ENABLE_RECV GetStatusText( lStatus , sms.szStatus ); //#else // GetStatusText2( lStatus , sms.szStatus ); //#endif //无需要状态的短信通所有都返回“发送成功”。 BOOL bNoStatus = m_pMainFrame->m_Setup.bSDK & SDK_NOSTATUS ? true:false; if ( bNoStatus ) { _tcscpy( sms.szStatus , _T("发送成功") ); } if ( _tcslen(szSender)>0 ) { _tcscat( sms.szSender , _T("-") ); _tcscat( sms.szSender , szSender ); } if ( _tcslen(szRecver)>0 ) { _tcscat( sms.szRecver , _T("-") ); _tcscat( sms.szRecver , szRecver ); } } return sms; } void CFSmsLog::OnDblclkSmslogList(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; On_User_See(); } void CFSmsLog::OnKeydownSmslogList(NMHDR* pNMHDR, LRESULT* pResult) { LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR; *pResult = 0; if ( pLVKeyDow->wVKey == VK_DELETE ) { On_User_Del(); } if ( pLVKeyDow->wVKey == VK_SPACE) { On_User_See(); } if ( pLVKeyDow->wVKey == 'S' || pLVKeyDow->wVKey == 's') { On_User_Send(); } if ( pLVKeyDow->wVKey == 'R' || pLVKeyDow->wVKey == 'r') { On_User_Refresh(); } if ( pLVKeyDow->wVKey == 'T' || pLVKeyDow->wVKey == 't') { On_User_RefStatus(); } if ( pLVKeyDow->wVKey == 'F' || pLVKeyDow->wVKey == 'f') { On_User_Find(); } if ( pLVKeyDow->wVKey == 'B' || pLVKeyDow->wVKey == 'b') { On_User_Bak(); } if ( pLVKeyDow->wVKey == 'A' || pLVKeyDow->wVKey == 'a') { m_wndList.SelectAllItems(); } } long CFSmsLog::GetStatusText2(long lStatus, TCHAR *pStatus) { _tcscpy( pStatus , _T("未知状态") ); long lIcon = 0; switch(lStatus) { case SEND_STATUS_SUB_OK: _tcscpy( pStatus , _T("提交成功") ); break; case SEND_STATUS_SUB_FILT: _tcscpy( pStatus , _T("审核中") ); break; case SEND_STATUS_SUB_ERROR: case SEND_STATUS_SUB_USERNOSMS: case SEND_STATUS_SUB_CORPNOSMS: case SEND_STATUS_SUB_CORPOVRDATE: _tcscpy( pStatus , _T("提交失败") ); lIcon = 3; break; case SEND_STATUS_SUB_NUMNOSUP: _tcscpy( pStatus , _T("目标有误") ); lIcon = 3; break; case SEND_STATUS_FILT_ERROR: _tcscpy( pStatus , _T("审核失败") ); lIcon = 3; break; case SEND_STATUS_SEND_OK: _tcscpy( pStatus , _T("发送成功") ); lIcon = 1; break; case SEND_STATUS_SEND_ERROR: _tcscpy( pStatus , _T("发送失败") ); lIcon = 3; break; case SEND_STATUS_RECV_OK: _tcscpy( pStatus , _T("发送成功") ); lIcon = 1; break; case SEND_STATUS_RECV_ERROR: _tcscpy( pStatus , _T("接收失败") ); lIcon = 3; break; } return lIcon; } void CFSmsLog::OnOK() { //CDialog::OnOK(); } void CFSmsLog::OnCancel() { //CDialog::OnCancel(); } void CFSmsLog::SetToday(BOOL bToday) { if ( m_bShowToday != bToday ) { m_bShowToday = bToday; m_bRefresh = false; } } void CFSmsLog::SetBakDBName(CString strDBName) { m_strBakDBName = strDBName; m_bNewDB = true; }