242 lines
7.3 KiB
C++
242 lines
7.3 KiB
C++
// CalendarThread.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "SmsCenter.h"
|
|
#include "CalendarThread.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCalendarThread
|
|
|
|
#include "SmsCenterDlg.h"
|
|
|
|
IMPLEMENT_DYNCREATE(CCalendarThread, CWinThread)
|
|
|
|
CCalendarThread::CCalendarThread()
|
|
{
|
|
m_bStart = false;
|
|
m_pSMSDlg = NULL;
|
|
}
|
|
|
|
CCalendarThread::~CCalendarThread()
|
|
{
|
|
}
|
|
|
|
BOOL CCalendarThread::InitInstance()
|
|
{
|
|
CoInitializeEx( NULL , COINIT_MULTITHREADED );
|
|
// TODO: perform and per-thread initialization here
|
|
return TRUE;
|
|
}
|
|
|
|
int CCalendarThread::ExitInstance()
|
|
{
|
|
CoUninitialize();
|
|
|
|
// TODO: perform any per-thread cleanup here
|
|
return CWinThread::ExitInstance();
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CCalendarThread, CWinThread)
|
|
//{{AFX_MSG_MAP(CCalendarThread)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
//}}AFX_MSG_MAP
|
|
ON_THREAD_MESSAGE(TH_CALENDAR,On_Calendar)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCalendarThread message handlers
|
|
|
|
void CCalendarThread::On_Calendar(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if ( m_bStart ) //如果正在发送,立即返回
|
|
return ;
|
|
try
|
|
{
|
|
m_bStart = true;
|
|
CString strSelect;
|
|
strSelect = "select calendar.*,users.mobile from calendar,users where calendar.Status=1 and calendar.userid = users.userid";
|
|
BOOL b = m_AdoRS.Open( strSelect );
|
|
if ( b && !m_AdoRS.IsEOF() )
|
|
{
|
|
long lID;
|
|
long lCorpID;
|
|
long lUserID;
|
|
long lType;
|
|
COleDateTime tAlarm;
|
|
COleDateTime tSendLast;
|
|
CString strMsg;
|
|
CString strAddMsg;
|
|
CString strMobile;
|
|
CString strAddMobile;
|
|
COleDateTimeSpan ts(0,0,30,0);
|
|
TCHAR szTemp[32]={0};
|
|
|
|
long lCount2 = 0;
|
|
while ( !m_AdoRS.IsEOF() && lCount2<1000 )
|
|
{
|
|
m_AdoRS.GetCollect( _T("CalendarID") , lID );
|
|
m_AdoRS.GetCollect( _T("CorpID") , lCorpID );
|
|
m_AdoRS.GetCollect( _T("UserID") , lUserID );
|
|
m_AdoRS.GetCollect( _T("Type") , lType );
|
|
m_AdoRS.GetCollect( _T("Alarm"), tAlarm );
|
|
m_AdoRS.GetCollect( _T("SendLast"),tSendLast);
|
|
m_AdoRS.GetCollect( _T("Msg") , strMsg );
|
|
m_AdoRS.GetCollect( _T("AddMsg") , strAddMsg );
|
|
m_AdoRS.GetCollect( _T("Mobile") , strMobile );
|
|
m_AdoRS.GetCollect( _T("AddMobile") , strAddMobile );
|
|
|
|
if ( strAddMobile.GetLength()>=10 )
|
|
strMobile = strAddMobile;
|
|
if ( tAlarm.GetStatus() == COleDateTime::valid )
|
|
{
|
|
BOOL bSend=false;
|
|
COleDateTime tNow = COleDateTime::GetCurrentTime();
|
|
switch ( lType )
|
|
{
|
|
case 0: //年提醒
|
|
tAlarm.SetDateTime(tNow.GetYear(),tAlarm.GetMonth(),tAlarm.GetDay(),tAlarm.GetHour(),tAlarm.GetMinute(),tAlarm.GetSecond() ); //提醒时间
|
|
if (tAlarm.GetStatus()==COleDateTime::valid && tNow > tAlarm && (tNow-tAlarm)<ts) //当前时间大于提醒时间,并且间隔小于30分钟
|
|
{
|
|
if ( tSendLast.GetStatus() == COleDateTime::valid )
|
|
{
|
|
if ( tSendLast != tAlarm ) //如果最后提醒时间与提醒时间相一,则表示当前日期已提醒过
|
|
bSend = true;
|
|
}
|
|
else
|
|
{
|
|
bSend = true;
|
|
}
|
|
}
|
|
break;
|
|
case 1: //月提醒
|
|
tAlarm.SetDateTime(tNow.GetYear(),tNow.GetMonth(),tAlarm.GetDay(),tAlarm.GetHour(),tAlarm.GetMinute(),tAlarm.GetSecond() ); //提醒时间
|
|
if (tAlarm.GetStatus()==COleDateTime::valid && tNow > tAlarm && (tNow-tAlarm)<ts) //当前时间大于提醒时间,并且间隔小于30分钟
|
|
{
|
|
if ( tSendLast.GetStatus() == COleDateTime::valid )
|
|
{
|
|
if ( tSendLast != tAlarm ) //如果最后提醒时间与提醒时间相一,则表示当前日期已提醒过
|
|
bSend = true;
|
|
}
|
|
else
|
|
{
|
|
bSend = true;
|
|
}
|
|
}
|
|
break;
|
|
case 2: //周提醒
|
|
_stprintf(szTemp, _T("%d") , tNow.GetDayOfWeek()-1 ); //星期
|
|
if ( strAddMsg.Find(szTemp[0]) >= 0 ) //判断此星期数是否需要提醒
|
|
{
|
|
tAlarm.SetDateTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),tAlarm.GetHour(),tAlarm.GetMinute(),tAlarm.GetSecond() ); //提醒时间
|
|
if (tAlarm.GetStatus()==COleDateTime::valid && tNow > tAlarm && (tNow-tAlarm)<ts) //当前时间大于提醒时间,并且间隔小于30分钟
|
|
{
|
|
if ( tSendLast.GetStatus() == COleDateTime::valid )
|
|
{
|
|
if ( tSendLast != tAlarm ) //如果最后提醒时间与提醒时间相一,则表示当前日期已提醒过
|
|
bSend = true;
|
|
}
|
|
else
|
|
{
|
|
bSend = true;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 3: //日提醒
|
|
tAlarm.SetDateTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),tAlarm.GetHour(),tAlarm.GetMinute(),tAlarm.GetSecond() ); //提醒时间
|
|
if (tAlarm.GetStatus()==COleDateTime::valid && tNow > tAlarm && (tNow-tAlarm)<ts) //当前时间大于提醒时间,并且间隔小于30分钟
|
|
{
|
|
if ( tSendLast.GetStatus() == COleDateTime::valid )
|
|
{
|
|
if ( tSendLast != tAlarm ) //如果最后提醒时间与提醒时间相一,则表示当前日期已提醒过
|
|
bSend = true;
|
|
}
|
|
else
|
|
{
|
|
bSend = true;
|
|
}
|
|
}
|
|
break;
|
|
case 4: //提醒一次
|
|
//tAlarm.SetDateTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),tAlarm.GetHour(),tAlarm.GetMinute(),tAlarm.GetSecond() ); //提醒时间
|
|
if (tAlarm.GetStatus()==COleDateTime::valid && tNow > tAlarm && (tNow-tAlarm)<ts) //当前时间大于提醒时间,并且间隔小于30分钟
|
|
{
|
|
if ( tSendLast.GetStatus() == COleDateTime::valid )
|
|
{
|
|
if ( tSendLast != tAlarm ) //如果最后提醒时间与提醒时间相一,则表示当前日期已提醒过
|
|
bSend = true;
|
|
}
|
|
else
|
|
{
|
|
bSend = true;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
if ( bSend )
|
|
{
|
|
m_AdoRS.Close();
|
|
strSelect.Format( _T("update calendar set SendLast='%04d%02d%02d %02d:%02d:%02d' where CalendarID=%d"),tAlarm.GetYear(),tAlarm.GetMonth(),tAlarm.GetDay(),tAlarm.GetHour(),tAlarm.GetMinute(),tAlarm.GetSecond(),lID );
|
|
m_AdoRS1.Open(strSelect);
|
|
if ( lType == 4 ) //提醒一次,提醒后置状态为
|
|
{
|
|
strSelect.Format( _T("update calendar set Status=0 where CalendarID=%d"),lID );
|
|
m_AdoRS1.Open(strSelect);
|
|
}
|
|
//提交短信
|
|
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("calendar") );
|
|
_tcscpy( data.szMobile , strMobile );
|
|
_tcscpy( data.szMsg , strMsg );
|
|
CSendThread::SubmitSms( data,&m_AdoRS1,&m_AdoRS2,m_pSMSDlg,lMobType,SMSTYPE_ALARM); //发送短信
|
|
//提醒一次后,退出,等下一次再检测下一条
|
|
m_bStart = false;
|
|
return ;
|
|
}
|
|
}
|
|
m_AdoRS.MoveNext();
|
|
lCount2 ++;
|
|
}
|
|
}
|
|
m_bStart = false;
|
|
}
|
|
catch(...)
|
|
{
|
|
LOG_APPERROR(_T("T"));
|
|
m_bStart = false;
|
|
return ;
|
|
}
|
|
m_bStart = false;
|
|
return ;
|
|
}
|
|
|
|
BOOL CCalendarThread::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_AdoRS1.SetAdoConnection( &m_adoConnection ); //设置数据库连接
|
|
m_AdoRS2.SetAdoConnection( &m_adoConnection ); //设置数据库连接
|
|
}
|
|
return b;
|
|
}
|