435 lines
12 KiB
C++
435 lines
12 KiB
C++
// 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;
|
|
}
|