⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 短信群发系统
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "NoteSendSystem.h"
#include "MainFrm.h"
#include "AccountManager.h"
#include "OrderManager.h"
#include "LogManager.h"
#include "MyTreeView.h"
#include "MyFormView.h"
#include "NoteSendSystemView.h"
#include "ComSet.h"
#include "MyListView.h"
#include "AdoRecordSet.h"

extern CNoteSendSystemApp theApp;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(IDM_ACCOUNT_MANAGER, OnAccountManager)
	ON_COMMAND(IDM_LOG_MANAGER, OnLogManager)
	ON_COMMAND(IDM_ORDER_MANAGER, OnOrderManager)
	ON_WM_CLOSE()
	ON_COMMAND(IDM_COM_SET, OnComSet)
	ON_COMMAND(IDM_CONNECT, OnConnect)
	ON_COMMAND(IDM_DISCONNECT, OnDisconnect)
	ON_COMMAND(IDM_SEND, OnSend)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_CONNECTSTR,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{	
	m_strPort = "COM1";
	connect_state = 0;
	m_pSmsManager = new SmsManager;
}

CMainFrame::~CMainFrame()
{
	CNoteSendSystemApp	*pApp = (CNoteSendSystemApp	*)AfxGetApp();
	pApp->m_pConnection.m_connect.Release();
	delete m_pSmsManager;
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
	
	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		sizeof(indicators)/sizeof(UINT)))
	{
	
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}
	
	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	cs.style&=~FWS_ADDTOTITLE;
	//这里还有个要处理的是要加上用户名
 	CString				buf;
	CString				str;
	CNoteSendSystemApp	*pApp = (CNoteSendSystemApp	*)AfxGetApp();
	if (pApp->CulUserAuth == 0)
	{
		str = "管理员";
	}
	else
	{
		str = "普通用户";
	}

 	buf.Format("短信群发系统 - [%s -- %s]", pApp->CulUser, str);
	SetTitle(buf);
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


//DEL void CMainFrame::ReadConfig()
//DEL {
//DEL 	FILE	*fp_opt;
//DEL 	int		i,j;	
//DEL 	char	*p, *value;
//DEL 	char buf[256];
//DEL 	char	*temp[] = {
//DEL 			"  ",
//DEL 			"dbname",
//DEL 			"username",
//DEL 			"password",
//DEL 			0
//DEL 	};	
//DEL 	memset(buf, 0, 256);
//DEL 	//打开系统信息配置文件
//DEL 	fp_opt = fopen("dbconfig.txt", "r");
//DEL 	if(fp_opt == NULL)
//DEL 	{
//DEL 		MessageBox("打开配置文件失败","提示");
//DEL 		return;
//DEL 	}
//DEL 	while(fgets(buf, 256, fp_opt) != NULL)
//DEL 	{
//DEL 		if((buf[0] == '#') || strlen(buf) == 0 )
//DEL 		{
//DEL 			continue;
//DEL 		}
//DEL 		i=0;
//DEL 		p = strtok(buf,"=");
//DEL 		if(p == NULL)
//DEL 		{
//DEL 			continue;
//DEL 		}
//DEL 		for (j=1; j<4; j++)	
//DEL 		{
//DEL 			if (strncmp(p, temp[j],strlen(temp[j]))==0) 
//DEL 			{
//DEL 				i = j;
//DEL 				break;
//DEL 			}
//DEL 		}
//DEL 		value = strtok(0, "=");
//DEL 		if ((value == NULL) || (!isascii(value[0]))) 
//DEL 		{
//DEL 			continue;
//DEL 		}
//DEL 		switch (i) 
//DEL 		{
//DEL 		case 1:
//DEL 			m_dbname = value;
//DEL 			break;
//DEL 		case 2:
//DEL 			m_user= value;
//DEL 			break;
//DEL 		case 3:
//DEL 			m_password = value;
//DEL 			break;
//DEL 		} 
//DEL 		memset(buf, 0, 256);
//DEL 	}	
//DEL 	fclose(fp_opt);
//DEL }

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	//读取配置文件
//	ReadConfig();
	//连接数据库

	//分割窗口
	m_sp1_wnd.CreateStatic(this, 1, 2);
	m_sp1_wnd.CreateView(0,0, RUNTIME_CLASS(CMyTreeView), CSize(120, 300), pContext);
 	m_sp2_wnd.CreateStatic(&m_sp1_wnd, 2, 1, WS_CHILD | WS_VISIBLE, m_sp1_wnd.IdFromRowCol(0,1));
	m_sp2_wnd.CreateView(0, 0, RUNTIME_CLASS(CMyListView), CSize(150, 235), pContext);
 	m_sp2_wnd.CreateView(1, 0, RUNTIME_CLASS(CMyFormView), CSize(80, 150), pContext);

	m_pMyListView = (CMyListView *)m_sp2_wnd.GetPane(0, 0);
	TRACE("OnCreateClient >>> m_sp2_wnd = %x\n", &m_sp2_wnd);
	return TRUE;
}
//帐户管理
void CMainFrame::OnAccountManager() 
{
	CAccountManager				accmanager;
	accmanager.DoModal();
	CNoteSendSystemApp *pApp = (CNoteSendSystemApp *)AfxGetApp();
	pApp->AccountInfoVect.clear();
}
//日志管理
void CMainFrame::OnLogManager() 
{
	CLogManager					logmanager;
	logmanager.DoModal();
}
//订单管理
void CMainFrame::OnOrderManager() 
{
	COrderManager				ordermanager;
	ordermanager.DoModal();
}

void CMainFrame::OnClose() 
{
	m_pSmsManager->CloseComm();
	CFrameWnd::OnClose();
}
//端口设置
void CMainFrame::OnComSet() 
{
	CComSet				comset;
	comset.DoModal();
}
//连接端口,创建一个新进程
void CMainFrame::OnConnect() 
{
	if (connect_state == 1)
	{
		MessageBox("还未断开连接,不能重复连接", "提示");
		return;
	}

	//首先打开端口
	CNoteSendSystemApp * pApp = (CNoteSendSystemApp *)AfxGetApp();
	char* port = new char[10];
	m_strPort = pApp->CulPort;
	strcpy(port, (LPCTSTR)m_strPort);

	if (!m_pSmsManager->OpenComm(port))
	{
		delete port;
		if (AfxMessageBox("打开端口失败,是否要设置", MB_YESNO) == IDYES)
		{
			CComSet		comset;
			comset.DoModal();	
		}
		else
		{
			return;
		}
	}
	else
	{
		if (!gsmInit(this))
		{
			MessageBox("初始化GSM状态失败,请确认短信猫是否连接正确", "提示");
			return;
		}
			
		//首先创建一个新线程
	 	m_pWordThread = new WorkThread(this);
		m_pWordThread->init(this);
		delete port;
		MessageBox("连接成功", "提示");
		//设置状态栏提示已经连接
		m_wndStatusBar.SetPaneText (1, "连接成功", TRUE);
		connect_state = 1;
		//设置定时器,要连接上后才可以
		//1号定时器主要做接收
		SetTimer(1, 10000, NULL);
		//2号定时器做发送
		SetTimer(2, 10000, NULL);
	}
}

void CMainFrame::OnDisconnect() 
{
	
	if (connect_state == 0)
	{
		MessageBox("还未连接,不能断开连接", "提示");
		return;
	}
	if (m_pSmsManager->CloseComm())
	{
		MessageBox("已断开连接", "提示");
		//设置状态栏
		m_wndStatusBar.SetPaneText (1, "断开连接", TRUE);
		connect_state = 0;
	}
	else
	{
		MessageBox("断开连接失败", "提示");
	}
}

void CMainFrame::OnSend() 
{
	CMyFormView *myform = (CMyFormView *)m_sp2_wnd.GetPane(1, 0);
	myform->OnSend();
}

void CMainFrame::OnTimer(UINT nIDEvent) 
{
	CNoteSendSystemApp *pApp = (CNoteSendSystemApp *)AfxGetApp();
	CMainFrame * pMainFrame = (CMainFrame *)AfxGetMainWnd();
		//接收
	if(nIDEvent == 1)
	{
		SM_PARAM SmParam;
		CString strTime;
		CString strNumber;
		CString strContent;
		
		// 取接收到的短消息
		if(m_pWordThread->GetFromRecvQueue(&SmParam))
		{
			// 取短消息信息
			strNumber = SmParam.TPA;
			strContent = SmParam.TP_UD;
			strTime = "20" + CString(&SmParam.TP_SCTS[0],2) 
				+ "-" + CString(&SmParam.TP_SCTS[2],2) 
				+ "-" + CString(&SmParam.TP_SCTS[4],2)
				+ " " + CString(&SmParam.TP_SCTS[6],2) 
				+ ":" + CString(&SmParam.TP_SCTS[8],2) 
				+ ":" + CString(&SmParam.TP_SCTS[10],2);
 			
			// 去掉号码前的"86"
			if(strNumber.Left(2) == "86")  strNumber = strNumber.Mid(2);
			
			CString   str;
			CMyFormView * pMyFromView = (CMyFormView *)pMainFrame->m_sp2_wnd.GetPane(1, 0);
			str.Format("你有新的短消息... [号码:%s][内容:%s]", strNumber, strContent);
			pMyFromView->m_sendrecvmsg.Empty();
			pMyFromView->m_sendrecvmsg = str;										  ;
			pMyFromView->UpdateData(FALSE);

			CMyListView *myListView = (CMyListView *)m_sp2_wnd.GetPane(0, 0);
			CListCtrl& ListCtrl = myListView->GetListCtrl();

			// 最多保留200条
 			int nItemCount = ListCtrl.GetItemCount();
 			if(nItemCount >= 200)
 			{
				ListCtrl.DeleteItem(0);
				nItemCount--;
			}
			//MessageBox(strNumber);
			//MessageBox(strContent);
			ListCtrl.InsertItem(nItemCount, strNumber);
			ListCtrl.SetItemText(nItemCount, 1, strTime);
			ListCtrl.SetItemText(nItemCount, 2, strContent);
			ListCtrl.SetItemText(nItemCount, 3, "接收成功");
 			
			//保存到接收队列
			pApp->m_pConnection.SaveRecvMsg(strNumber, strContent, strTime);
 		//	ListCtrl.EnsureVisible(nItemCount, FALSE);
		}
	}
	//发送
	else if (nIDEvent == 2)
	{
		//读取订单表
		ReadOrderList();
		COleDateTime		CulTime;
		COleDateTime		EndTime;
		CString				StrCulTime;
		CString				StrEndTime;
		int					len;
		CulTime = COleDateTime::GetCurrentTime();
		StrCulTime = CulTime.Format("%Y%m%d%H%M%S");
		
		len = pApp->OrderListVect.size();
		for (int i=0; i<len; i++)
		{
			EndTime = pApp->OrderListVect[i].end_date;
			StrEndTime = EndTime.Format("%Y%m%d%H%M%S");
			int		cultime;
			int		endtime;
			cultime = atoi(StrCulTime);
			endtime = atoi(StrEndTime);
			if (cultime - endtime > 11)
			{
				continue;
			}
			//判断是否是当前时间
			if (cultime - endtime >= 0 && cultime - endtime < 10)//		29		30
			{
				int			order_id;
				int			no_count;
				CString		strSmsc;
				CString		strNumber;
				CString		strContent;
				CString		str;
				order_id = pApp->OrderListVect[i].order_id;
				strContent = pApp->OrderListVect[i].content;
				strSmsc = pApp->CulPhone;
				//读取号码表
				ReadNoList(order_id);
				m_pWordThread->GetOrderId(order_id);
				no_count = pApp->PhoneNoVect.size();
				if (no_count == 0)
				{
					CString		buf;
					buf.Format("订单%d没有导入号码,不能发送", order_id);
					MessageBox(buf, "提示");
					return;
				}
				CMyFormView * pMyFromView = (CMyFormView *)pMainFrame->m_sp2_wnd.GetPane(1, 0);
				pMyFromView->m_sendrecvmsg.Empty();
				pMyFromView->m_sendrecvmsg = "正在导入定单表至发送队列......";
				pMyFromView->UpdateData(FALSE);
				for (i=0; i<no_count; i++)
				{
					strNumber = pApp->PhoneNoVect[i].phone_no;					
					//放到发送短消息队列
					AddSendMsgToMegQueue(strSmsc, strNumber, strContent);
					strNumber.Empty();
				}	
				break;
			}
		}		
		pApp->OrderListVect.clear();
		pApp->PhoneNoVect.clear();
	}
	CFrameWnd::OnTimer(nIDEvent);
}

void CMainFrame::ReadOrderList()
{
	CString					command;
	CAdoRecordSet			record;
	OrderList				list;
	
	command.Format("select * from Orders");
	//
	CNoteSendSystemApp *pApp = (CNoteSendSystemApp *)AfxGetApp();
	//读取订单表
	pApp->m_pConnection.GetRecordSet(command, record);
	while (!record.IsEof())
	{
		record.GetValue("ID", list.order_id);
		record.GetValue("OrderStart", list.start_date);
		record.GetValue("OrderEnd", list.end_date);
		record.GetValue("Content", list.content);
		pApp->OrderListVect.push_back(list);
		record.MoveNext();
	}
}

void CMainFrame::AddSendMsgToMegQueue(CString &strSmsc,CString &strNumber, CString &strContent)
{
	SM_PARAM SmParam;
	
	memset(&SmParam, 0, sizeof(SM_PARAM));
	
	if(strSmsc[0] == '+')  strSmsc = strSmsc.Mid(1);
	if(strNumber[0] == '+')  strNumber = strNumber.Mid(1);
	if(strSmsc.Left(2) != "86")  strSmsc = "86" + strSmsc;
	if(strNumber.Left(2) != "86")  strNumber = "86" + strNumber;
	
	strcpy(SmParam.SCA, strSmsc);
	strcpy(SmParam.TPA, strNumber);
	strcpy(SmParam.TP_UD, strContent);
	SmParam.TP_PID = 0;
	SmParam.TP_DCS = GSM_UCS2;
	CMainFrame * pMainFrame = (CMainFrame *)AfxGetMainWnd();
	// 加到发送队列
	m_pWordThread->PutToSendQueue(&SmParam);
}

void CMainFrame::ReadNoList(int &orderID)
{
	CString					command;
	CAdoRecordSet			record;
	PhoneNo					list;
	
	command.Format("select * from PhoneNumber where OrderID='%d'", orderID);
	CNoteSendSystemApp *pApp = (CNoteSendSystemApp *)AfxGetApp();
	//读取订单表
	pApp->m_pConnection.GetRecordSet(command, record);
	while (!record.IsEof())
	{
		record.GetValue("Number", list.phone_no);
		pApp->PhoneNoVect.push_back(list);
		record.MoveNext();
	}	
}

//void CMainFrame::ShowSendMsg(SM_PARAM &SmParam, int &SendState, CMainFrame pMainFrame)
void CMainFrame::ShowSendMsg(SM_PARAM &SmParam, int &SendState)
{
	CString		strTime;
	CString		strNumber;
	CString		strContent;
	CString		strState;
	CTime		time;
	
	CListCtrl& ListCtrl = m_pMyListView->GetListCtrl();
	strNumber = SmParam.TPA;
	strContent = SmParam.TP_UD;

	time = CTime::GetCurrentTime();
	strTime = time.Format("%Y-%m-%d %H:%M:%S");
	
	if (SendState == 1)
	{
		strState = "发送成功";
	}
	else
	{
		strState = "发送失败";
	}

	int nItemCount = ListCtrl.GetItemCount();
 	if(nItemCount >= 200)
	{
		ListCtrl.DeleteItem(0);
		nItemCount--;
	}
	if(strNumber.Left(2) == "86")  strNumber = strNumber.Mid(2);
	ListCtrl.InsertItem(nItemCount, strNumber);
	ListCtrl.SetItemText(nItemCount, 1, strTime);
	ListCtrl.SetItemText(nItemCount, 2, strContent);
	ListCtrl.SetItemText(nItemCount, 3, "接收成功");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -