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