// SPThread.cpp : implementation file // #include "stdafx.h" #include "smscenter.h" #include "SPThread.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CSPThread #include "SmsCenterDlg.h" IMPLEMENT_DYNCREATE(CSPThread, CWinThread) CSPThread::CSPThread() { m_bStart = false; } CSPThread::~CSPThread() { } BOOL CSPThread::InitInstance() { CoInitializeEx( NULL , COINIT_MULTITHREADED ); // TODO: perform and per-thread initialization here return TRUE; } int CSPThread::ExitInstance() { CoUninitialize(); // TODO: perform any per-thread cleanup here return CWinThread::ExitInstance(); } BEGIN_MESSAGE_MAP(CSPThread, CWinThread) //{{AFX_MSG_MAP(CSPThread) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP ON_THREAD_MESSAGE(TH_SMSSP,On_SPDZ) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSPThread message handlers BOOL CSPThread::SetParam(CSmsCenterDlg *pSmsDlg) { m_pSMSDlg = pSmsDlg; BOOL b = m_adoConnection.ConnectSQLServer2(m_pSMSDlg->m_Setup.szDBName,DEFAULT_DBNAME,m_pSMSDlg->m_Setup.szDBUser,m_pSMSDlg->m_Setup.szDBPasswd, m_pSMSDlg->m_Setup.szProvider); if ( b ) { m_adoConnection.SetCommandTimeout(7200); //�������ӳ�ʱʱ�� #ifdef SMSCENTER_USECLIENT m_adoConnection.SetCursorLocation(adUseClient); //����Ϊ�����α����� #endif m_AdoRS.SetAdoConnection( &m_adoConnection ); //�������ݿ����� m_AdoRS2.SetAdoConnection( &m_adoConnection ); //�������ݿ����� m_AdoRS3.SetAdoConnection( &m_adoConnection ); //�������ݿ����� } return b; } void CSPThread::On_SPDZ(WPARAM wParam, LPARAM lParam) { if ( m_bStart ) //������ڷ��ͣ��������� return ; Sleep(10000); //��ʱ10�� m_pSMSDlg->m_bAutoSend_SP = false; m_bStart = true; try { CString strSelect; strSelect.Format( _T("select dz.*,users.mobile from dz,users where dz.userid = users.userid order by dz.OperCmd,dz.Birthday") ); BOOL b = m_AdoRS.Open( strSelect ); long lAllCount = m_AdoRS.GetRecordCount() ; if ( b && lAllCount>0) //�������ж�������Ϣ���û� { m_AdoRS.MoveFirst(); long lCorpID=0; long lUserID=0; CString strMobile; TCHAR szOldOperCmd[32]={0}; TCHAR szOldAddCmd[32]={0}; COleDateTime tOldBirthday; BOOL bOldMsg = false; long lOldPrice=0; CString strOldMsg; long lOperCmdID; COleDateTime tBirthday; TCHAR szOperCmd[32]={0}; TCHAR szAddCmd[32]={0}; COleDateTime tSend; COleDateTime tYSend; //Ӧ���͵�ʱ�� long lDZID; long lAllCount2=0; while( !m_AdoRS.IsEOF() && lAllCount2<lAllCount) { m_AdoRS.GetCollect( _T("CorpID"), lCorpID ); m_AdoRS.GetCollect( _T("UserID"), lUserID ); m_AdoRS.GetCollect( _T("OperCmd"), szOperCmd ); m_AdoRS.GetCollect( _T("AddCmd") , szAddCmd ); m_AdoRS.GetCollect( _T("Mobile") , strMobile ); m_AdoRS.GetCollect( _T("DZID") , lDZID ); m_AdoRS.GetCollect( _T("OperCmdID") , lOperCmdID ); m_AdoRS.GetCollect( _T("SendLast") , tSend ); m_AdoRS.GetCollect( _T("Birthday") , tBirthday ); Sleep(10);//����������Ҫ�� if ( strMobile.GetLength() < 11 ) { lAllCount2 ++; m_AdoRS.MoveNext(); continue; } if ( bOldMsg && !_tcscmp(szOperCmd,szOldOperCmd) && //�¾�ָ����һ����,ֱ�ӷ�����Ϣ���� !_tcscmp(szAddCmd,szOldAddCmd ) && tBirthday== tOldBirthday ) { CString strSelect3; if ( tSend.GetStatus()!= COleDateTime::valid || tSend < tYSend ) //�����ʱ��Ϊ�գ��������ʱ��С��Ӧ����ʱ��,��ʼ���� { //����Ϣ�����ʱ�� strSelect3.Format( _T("update dz set SendLast=GetDATE() where DZID=%d") ,lDZID ); m_AdoRS2.Open(strSelect3); m_AdoRS2.Close(); //�ύ���� long lMobType = MOBILE_TYPE_CMCC; //if ( isNumUnicom((char*)(LPCTSTR)strMobile) ) // lMobType = MOBILE_TYPE_UNICOM; SubmitData data={0}; data.lCorpID = lCorpID; data.lUserID = lUserID; _tcscpy( data.szName , _T("SP") ); _tcscpy( data.szMobile , strMobile ); _tcscpy( data.szMsg , strOldMsg ); CSendThread::SubmitSms( data,&m_AdoRS2,&m_AdoRS3,m_pSMSDlg,lMobType,SMSTYPE_SP,lOldPrice); //���Ͷ��� } } else { bOldMsg = false; _tcscpy( szOldOperCmd , szOperCmd ); //���浱ǰָ�� _tcscpy( szOldAddCmd , szAddCmd ); tOldBirthday = tBirthday; //����ָ������ CString strSelect2; BOOL b2; //Sleep(100); //������,��Ҫ�� strSelect2.Format(_T("select * from OperCmd where OperCmdID=%d"),lOperCmdID); b2 = m_AdoRS2.Open( strSelect2 ); if ( b2 && m_AdoRS2.GetRecordCount() ) { //���ж��Ƿ�ʱ�䷢�� long lTemp; BOOL bWeek; TCHAR szWeek[32]={0}; COleDateTime t1; COleDateTime t2; COleDateTime t3; COleDateTime tNow = ::COleDateTime::GetCurrentTime(); m_AdoRS2.MoveFirst(); m_AdoRS2.GetCollect( _T("DZSendTime1") , t1 ); m_AdoRS2.GetCollect( _T("DZSendTime2") , t2 ); m_AdoRS2.GetCollect( _T("DZSendTime3") , t3 ); m_AdoRS2.GetCollect( _T("Price") , lOldPrice ); m_AdoRS2.GetCollect( _T("isWeek") , bWeek ); m_AdoRS2.GetCollect( _T("WeekDay"), szWeek ); m_AdoRS2.Close(); t1.SetDateTime(tNow.GetYear() , tNow.GetMonth() , tNow.GetDay(),t1.GetHour(),t1.GetMinute(),t1.GetSecond()); t2.SetDateTime(tNow.GetYear() , tNow.GetMonth() , tNow.GetDay(),t2.GetHour(),t2.GetMinute(),t2.GetSecond()); t3.SetDateTime(tNow.GetYear() , tNow.GetMonth() , tNow.GetDay(),t3.GetHour(),t3.GetMinute(),t3.GetSecond()); SYSTEMTIME ttn;tNow.GetAsSystemTime(ttn); SYSTEMTIME tts;tSend.GetAsSystemTime(tts); SYSTEMTIME tt1;t1.GetAsSystemTime(tt1); SYSTEMTIME tt2;t2.GetAsSystemTime(tt2); SYSTEMTIME tt3;t3.GetAsSystemTime(tt3); BOOL bSend=false; if ( !bSend && tSend.GetStatus() != COleDateTime::valid && t1.GetHour() > 2 && tNow>t1 ) { bSend = true; tYSend = t1; } if ( !bSend && tSend.GetStatus() == COleDateTime::valid && t1.GetHour() > 2 && tSend < t1 && tNow>t1 ) { bSend = true; tYSend = t1; } /* if ( !bSend && tSend.GetStatus() == COleDateTime::valid && t1.GetHour() > 2 && tSend > t1 && tNow>t1 && tNow < t2 ) { bSend = true; tYSend = t1; } */ if ( !bSend && tSend.GetStatus() == COleDateTime::valid && t2.GetHour() > 2 && tSend < t2 && tNow>t2 ) { bSend = true; tYSend = t2; } if ( !bSend && tSend.GetStatus() == COleDateTime::valid && t3.GetHour() > 2 && tSend < t3 && tNow>t3 ) { bSend = true; tYSend = t3; } if ( bSend && bWeek ) { //��������˰����ڷ��ͣ���Ƚ� lTemp = tNow.GetDayOfWeek(); lTemp--; if ( szWeek[lTemp] != '1' ) //�����ڲ��÷��� bSend = false; } if ( bSend ) //��Ҫ���ͣ�ȡ��Ϣ { CString strSelect3; BOOL b3; if ( !_tcscmp(szOperCmd,_T("XD") )) //�ִ������Ķ��� { //����С������ int iMon=0; int iDay=0; if ( GetBBMonDay(tBirthday,iMon,iDay) && iDay>0 ) { strSelect3.Format( _T("select * from DataMsg where OperCmd='%s' and convert(int,key1)=%d order by yelevel") , szOperCmd,iMon); b3 = m_AdoRS2.Open(strSelect3 ); if ( b3 && !m_AdoRS2.IsEOF() ) { long lAdoCount = m_AdoRS2.GetRecordCount(); if ( iDay<=lAdoCount ) { m_AdoRS2.Move(iDay-1); m_AdoRS2.GetCollect( _T("Msg") , strOldMsg ); m_AdoRS2.Close(); //����Ϣ�����ʱ�� strSelect3.Format( _T("update dz set SendLast=GetDATE() where DZID=%d") ,lDZID ); m_AdoRS2.Open(strSelect3); m_AdoRS2.Close(); bOldMsg = true; //�ύ���� long lMobType = MOBILE_TYPE_CMCC; //if ( isNumUnicom((char*)(LPCTSTR)strMobile) ) // lMobType = MOBILE_TYPE_UNICOM; SubmitData data={0}; data.lCorpID = lCorpID; data.lUserID = lUserID; _tcscpy( data.szName , _T("SP") ); _tcscpy( data.szMobile , strMobile ); _tcscpy( data.szMsg , strOldMsg ); CSendThread::SubmitSms( data,&m_AdoRS2,&m_AdoRS3,m_pSMSDlg,lMobType,SMSTYPE_SP,lOldPrice); //���Ͷ��� } else { //strSelect.Format( _T("Error:%s:%s->%s,û�й����ƻظ�����Ϣ����!"),smsSend.ServiceType,smsSend.szRecvNum,smsSend.szSendNum); //g_dlg->AddLog((char*)(LPCSTR)strSelect); } } } } else { //��ͨ���� if ( _tcslen(szAddCmd) > 0 ) strSelect3.Format( _T("select top 1 * from DataMsg where OperCmd='%s' and Key1='%s' and status=0 order by MsgTime desc") , szOperCmd,szAddCmd ); else strSelect3.Format( _T("select top 1 * from DataMsg where OperCmd='%s' and status=0 order by MsgTime desc") , szOperCmd ); if ( !_tcscmp(szOperCmd,_T("HL")) ) //��Ҫ��ѯ������Ϣ������� { SYSTEMTIME t ; ::GetLocalTime(&t); CString strTime; strTime.Format( _T("%04d.%02d.%02d") , t.wYear,t.wMonth,t.wDay ); strSelect3.Format( _T("select top 1 * from DataMsg where OperCmd='%s' and Key1='%s' order by MsgTime desc") , szOperCmd,strTime ); } b3 = m_AdoRS2.Open(strSelect3 ); if ( b3 && m_AdoRS2.GetRecordCount()>0 ) { m_AdoRS2.MoveFirst(); long lMsgID; m_AdoRS2.GetCollect( _T("DataMsgID") , lMsgID ); m_AdoRS2.GetCollect( _T("Msg") , strOldMsg ); m_AdoRS2.Close(); strSelect3.Format( _T("update DataMsg set status=1 where DataMsgID=%d") , lMsgID ); m_AdoRS2.Open(strSelect3); m_AdoRS2.Close(); //����Ϣ�����ʱ�� strSelect3.Format( _T("update dz set SendLast=GetDATE() where DZID=%d") ,lDZID ); m_AdoRS2.Open(strSelect3); m_AdoRS2.Close(); bOldMsg = true; //�ύ���� long lMobType = MOBILE_TYPE_CMCC; //if ( isNumUnicom((char*)(LPCTSTR)strMobile) ) // lMobType = MOBILE_TYPE_UNICOM; SubmitData data={0}; data.lCorpID = lCorpID; data.lUserID = lUserID; _tcscpy( data.szName , _T("SP") ); _tcscpy( data.szMobile , strMobile ); _tcscpy( data.szMsg , strOldMsg ); CSendThread::SubmitSms( data,&m_AdoRS2,&m_AdoRS3,m_pSMSDlg,lMobType,SMSTYPE_SP,lOldPrice); //���Ͷ��� } else { //strSelect.Format( _T("Error:%s:%s->%s,û�й����ƻظ�����Ϣ����!"),smsSend.ServiceType,smsSend.szRecvNum,smsSend.szSendNum); //g_dlg->AddLog((char*)(LPCSTR)strSelect); } } } } } lAllCount2 ++; //Sleep(50); //������,��Ҫ�� m_AdoRS.MoveNext(); //����������һ�� } } m_AdoRS.Close(); } catch (...) { LOG_APPERROR(_T("T")); m_bStart = false; return ; } m_bStart = false; return ; } BOOL CSPThread::GetBBMonDay(COleDateTime tBirthday, int &iMon, int &iDay) { COleDateTime tNow2 = ::COleDateTime::GetCurrentTime(); if ( tBirthday>tNow2 ) //������ { iMon = -1; iDay = -1; return false; } SYSTEMTIME tNow,tBB; tNow2.GetAsSystemTime(tNow); tBirthday.GetAsSystemTime(tBB); //�ȼ����� if ( tNow.wDay >=tBB.wDay ) { iDay = tNow.wDay-tBB.wDay; } else { tNow.wMonth--; if ( tNow.wMonth<=0 ) { tNow.wMonth=12; tNow.wYear--; } switch(tNow.wMonth) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: tNow.wDay += 31; break; case 2: if (tNow.wYear%4==0 ) tNow.wDay += 30; else tNow.wDay += 28; break; default: tNow.wDay += 30; } iDay = tNow.wDay-tBB.wDay; } //������ if ( tNow.wMonth >=tBB.wMonth ) { iMon = tNow.wMonth-tBB.wMonth; } else { tNow.wYear --; tNow.wMonth+= 12; iMon = tNow.wMonth-tBB.wMonth; } iMon = iMon+(tNow.wYear-tBB.wYear)*12; iDay++; iMon++; return true; }