// 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 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; }