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

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