SmsCenter/SPThread.cpp
2025-01-03 16:47:25 +08:00

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