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