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

📄 gateagentdlg.cpp

📁 PDA通讯网关服务器源码程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
		OnInsertMess("插入短消息原始记录表失败!");
	}

	//处理不是正常完整的销售记录的数据,比如查询短信、取消短信等消息
	if (iRetSmsType!=SALE_SMS && iRetSmsType!=NOSALE_SMS) 
	{
		return OnDoSpecific(nHandle,iRetSmsType,strMess,strTel,strTime.GetBuffer(0),strName);
	}

	//如果当天售货员销售额度为0
	if (iRetSmsType==NOSALE_SMS)
	{
		iRet=OnWhole(nHandle,strEmpcode.GetBuffer(0),strTerm.GetBuffer(0),strBelong2.GetBuffer(0),strTel.GetBuffer(0),strTime.GetBuffer(0),"",pchFlag);
		if (iRet<0) return -1;
		return 0;
	}
	

	/*以下销售记录部分,刘义强编写*/	
	//如果为完整的销售记录,
	if (OnIsWhole(strMess,m_sDiv.GetBuffer(0))==0)
	{
		//解析网点和产品代码是否合格;
		if(m_nIsNode==SMS_SALERNONODE) //则将网点补齐
		{
			strTerm.TrimRight();
			strTerm.TrimLeft();
			if (strTerm.IsEmpty())
			{
				OnInsertMess("该雇员没有所属终端!", true,m_bWrite);
				return -1;
			}
			strMess=strTerm+","+strMess;
			strToken=strMess;
		}

		//如果消息完整的话,系统则插入销售记录表格当中
		iRet= OnWhole(nHandle,strEmpcode.GetBuffer(0),strTerm.GetBuffer(0),strBelong2.GetBuffer(0),strTel.GetBuffer(0),strTime.GetBuffer(0),strToken.GetBuffer(0),pchFlag);
		if (iRet<0)
		{
			return -1;
		}
		return 0;
	}


	//如果从临时表格中没有查找到原来记录,则提示用户重新发送原来的销售记录
	if (iRet==88)
	{
		if (OnInsertSend(nHandle,strTel.GetBuffer(0),strTime.GetBuffer(0),"您前一条销售记录找不到,请将本天销售记录重新发送",SMS_OK)<0) return -2;
		return -1;
	}
	//如果销售记录没有完整的话,提示售货员
	if ((iRet>0)&&(iRet!=NUM_OK))
	{
		OnInsertMess("销售记录没有完整,请继续努力!", true,m_bWrite);
		if (OnInsertSend(nHandle,strTel.GetBuffer(0),strTime.GetBuffer(0),"销售记录没有完整,请继续努力!",SMS_OK)<0) return -2;
		return 0;
	}
	return 0;
}

int CGateAgentDlg::OnDbDoWith(char *pchSql)
{
	st_Rec	stRec;
	bool bLeaveRecord = false;
	char chMsg[1000]	= {0};
	int iRet=-10;

	memset(&stRec, 0x00, sizeof(st_Rec));
	stRec.iRecStart = 0;
	stRec.iRecNum = 100;		//每次读100条,直到完毕
	iRet = m_sqlDB.OnExecSql(pchSql, &stRec, bLeaveRecord, chMsg);
	m_sqlDB.OnFreeRec(&stRec);
	if (iRet != 0)
	{//***执行SQL语句失败		
		OnAgainConnectDb();
		return -1;
	}	
	return 0;
}

//发送消息的函数
int CGateAgentDlg::OnSend(int nHandle, char *pchDestMnum, char *pchText, char *pchFlag,int nTextLen)
{
	int iRet=-1;
	CString strTmp;
	strTmp=pchText;
	if(strlen(pchText) > 140)		// 我们决定全部用UCS2编码,最大70个字符(半角/全角),如果大于70则只发送
	{
		OnInsertMess("发送数据太长,截断发送了", true,false);
		strTmp=strTmp.Mid(0,140);
	}
	CString strDestTel=m_CPubBase.OnNumSendCheck(pchDestMnum,m_sNumFront);

	int nType=-1;
	if (strDestTel.Mid(0,4).Compare("8613")==0) nType=1;//表示为手机
	else 	{	nType=0; 	}//小灵通类型

	bool bFind=false;//判断是否找到了发送的设备的变量
	if (nHandle<1)//如果数据库当中设备为空的话,那么则默认第一个设备发送数据
	{
		iRet = m_cSmsOper.OnSendMess(g_smsCom[0].iCom,nType,g_smsCom[0].chSca,strDestTel.GetBuffer(0),strTmp.GetBuffer(0));
//		iRet = m_cSmsOper.OnSendMess(1864,nType,g_smsCom[0].chSca,strDestTel.GetBuffer(0),strTmp.GetBuffer(0));
		bFind=true;
	}
	else
	{
		for(int i=0;i<MAX_COM;i++)
		{
			if (nHandle==g_smsCom[i].iCom)//找到设备的短信中心号码
			{
				iRet = m_cSmsOper.OnSendMess(g_smsCom[i].iCom,nType,g_smsCom[i].chSca,strDestTel.GetBuffer(0),strTmp.GetBuffer(0));
				if (iRet<0)
				{
					break;//return iRet;
				}
				bFind=true;
				break;
			}
		}
		//没有找到的话,那么也默认第一个设备发送数据
		if (bFind==false)
		{
			iRet = m_cSmsOper.OnSendMess(g_smsCom[0].iCom,nType,g_smsCom[0].chSca,strDestTel.GetBuffer(0),strTmp.GetBuffer(0));
		}
	}

	CString strShow;
	if (iRet>0)
	{
		strShow.Format("发送到(%s:%s)成功!",strDestTel,strTmp);	
	}
	else
	{
		strShow.Format("发送到(%s:%s)失败***",strDestTel,strTmp);	
	}
	OnInsertMess(strShow.GetBuffer(0),true,m_bWrite);
	return iRet;
}




//检查是否为有效的手机号码
int CGateAgentDlg::OnCheckIsLogin(int nSmsType,char *pchTelNo,CString &strEmpcode,CString &strTerm,CString &strBelong2,CString &strName)
{
	st_Rec	stRec;
	bool bLeaveRecord = false;
	char chMsg[1000]	= {0};
	char chSQLCmd[SQLLENGTH]={0};
	int iRet = -10;
	CString strTmp;

	memset(&stRec, '\0', sizeof(st_Rec));
	stRec.iRecStart = 0;
	stRec.iRecNum = 1000;	

	if (nSmsType==REPORT_SMS)
	{
		_snprintf(chSQLCmd, SQLLENGTH - 1,
			 "select vcNO,vcBelong2,vcBelongterm,vcName from ba_employee where vcMovetel='%s' and iQuery='%d'" ,pchTelNo,REPORTED);
	}
	else
	{
		_snprintf(chSQLCmd, SQLLENGTH - 1,
			 "select vcNO,vcBelong2,vcBelongterm,vcName from ba_employee where vcMovetel='%s'" ,pchTelNo);
	}
	iRet = m_sqlDB.OnExecSql(chSQLCmd, &stRec, bLeaveRecord, chMsg);
	if(iRet<0)
	{
		strTmp.Format("查询语句%s失败",chSQLCmd);	
		OnInsertMess(strTmp.GetBuffer(0));
		m_sqlDB.OnFreeRec(&stRec);
		return -1;
	}
	if(stRec.iRecNum == 0)
	{
		strTmp.Format("%s没有权限,请确认是否为贵公司职员或者有此权限?",pchTelNo);
		OnInsertMess(strTmp.GetBuffer(0));	
		m_sqlDB.OnFreeRec(&stRec);
		return -2;
	}
	
	strEmpcode=m_CPubBase.OnDoStr(0,20,stRec.pchRecVal);
	strBelong2=m_CPubBase.OnDoStr(20,20,stRec.pchRecVal);
	strTerm=m_CPubBase.OnDoStr(40,20,stRec.pchRecVal);
	strName=m_CPubBase.OnDoStr(60,30,stRec.pchRecVal);

	m_sqlDB.OnFreeRec(&stRec);
	return 0;
}

//消息最后是否为正常的结束符号
int CGateAgentDlg::OnIsEnd(CString strMess)
{	
	return m_CPubBase.OnIsEnd(strMess);
}

//是否为完整的消息
int CGateAgentDlg::OnIsWhole(CString strMess,char *pchDiv)
{
	return m_CPubBase.OnIsWhole(strMess,pchDiv);
}

//如果为完整的销售记录,则进行如下操作,销售记录表格当中还没有最终确定--刘
int CGateAgentDlg::OnWhole(int nHandle,char *pchEmpcode,char *pchTerm,char *pchBelong2,char *pchTelNum,char *pchTime,char *pchText,char *pchFlag)
{
	char chMsg[1000]	= {0};
	char chSQLCmd[1000]={0};
	char chCode[CARD_LEN]={0};
	int iRet = -10;
	CString strTmp;
	double dSaleNum=0;
	double dSaleSum=0;
	double dProfit=0;
	double dCost=0;
	double dfPercentage=0;
	CString strWholeSms;
	st_Sms stSms[200];
	CString strCardShow;
	CString strCardSms;


	for (int i=0;i<200;i++)
	{
		memset(&stSms[i],0x00,sizeof(st_Sms));
	}

	if (m_nIsCard==SMS_ISCARD)//带有客户卡号
	{
		CString strGetEnd=pchText;
		//获取消息后最后一个结束符号
		CString strEnd=strGetEnd.Right(1);
		//调用分解带有卡号的数据
		if (m_CPubBase.OnGetNormal(m_strNoDiv.GetBuffer(0),m_sDiv.GetBuffer(0),strEnd.GetBuffer(0),pchText,stSms,strCardShow)<0)
		{
			if (OnInsertSend(nHandle,pchTelNum,pchTime,strCardShow.GetBuffer(0),SMS_OK)<0) return -2;
		}
		
		double dCardNum=0;
		double dCardSum=0;
		for (i=0;i<200;i++)
		{
			if (stSms[i].nState==1)
			{
				strCardSms.Format("%s,%s",pchTerm,stSms[i].chSms);
				strCardSms.TrimRight();
				strWholeSms="";

				dCardNum=dCardNum+dSaleNum;
				dCardSum=dCardSum+dSaleSum;

				memset(chSQLCmd,0x00,sizeof(chSQLCmd));
				_snprintf(chSQLCmd, 999,"insert into me_SaleRecord\
					(vcMovetel,vcBelongterm,vcBelong2,vcDatetime,vcText,vcNum,vcSum,vcProfit,vcPercentage,vcCost,cState,cFrom,vcEmpcode,bEdit,bCheck,vcCCode) values\
					('%s','%s','%s','%s','%s','%.1f','%.2f','%.2f','%.2f','%.2f','%s','%s','%s',0,0,'%s')" ,\
					pchTelNum,pchTerm,pchBelong2,pchTime,strWholeSms.GetBuffer(0),dSaleNum,dSaleSum,dProfit,dfPercentage,dCost,"00",FROMGSM,pchEmpcode,stSms[i].chCardNo);
				iRet= OnDbDoWith(chSQLCmd);
				if (iRet<0)
				{
					strTmp.Format("插入执行语句失败:%s",chSQLCmd);
					OnInsertMess(strTmp.GetBuffer(0));
					return -1;
				}
			}
		}//for (i=0;i<200;i++)
		//同时插入回复消息到自动回复表格当中
		if (m_iIsSucceedBack==1)//如果确定要回送则插入回送表格当中
		{
			CString strCard;
			strCard.Format("您本天销售的产品总数量为%.1f,总金额为%.2f,%s",dCardNum,dCardSum,m_strBkInfo.GetBuffer(0));
			dCardNum=0;
			dCardSum=0;
			if (OnInsertSend(nHandle,pchTelNum,pchTime,strCard.GetBuffer(0),SMS_OK)<0) return -2;
		}		
	}
	else
	{

		memset(chSQLCmd,0x00,sizeof(chSQLCmd));
		_snprintf(chSQLCmd, 999,"insert into me_SaleRecord\
			(vcMovetel,vcBelongterm,vcBelong2,vcDatetime,vcText,vcNum,vcSum,vcProfit,vcPercentage,vcCost,cState,cFrom,vcEmpcode,bEdit,bCheck,vcCCode) values\
			('%s','%s','%s','%s','%s','%.1f','%.2f','%.2f','%.2f','%.2f','%s','%s','%s',0,0,'%s')" ,\
			pchTelNum,pchTerm,pchBelong2,pchTime,strWholeSms.GetBuffer(0),dSaleNum,dSaleSum,dProfit,dfPercentage,dCost,"00",FROMGSM,pchEmpcode,chCode);
		iRet= OnDbDoWith(chSQLCmd);
		if (iRet<0)
		{
			strTmp.Format("插入执行语句失败:%s",chSQLCmd);
			OnInsertMess(strTmp.GetBuffer(0));
			return -1;
		}	
		//同时插入回复消息到自动回复表格当中
		if (m_iIsSucceedBack==1)//如果确定要回送则插入回送表格当中
		{
			if (OnInsertSend(nHandle,pchTelNum,pchTime,strTmp.GetBuffer(0),SMS_OK)<0) return -2;
		}
	}
	return 0;
}






//////////////////////////下列托盘显示菜单
LONG CGateAgentDlg::OnTrayNotification(WPARAM wparam, LPARAM lparam)
{   
    switch ( lparam )// The tray icon sent us a message.  Let's see what it is
    {
        case WM_RBUTTONDOWN:
            {// 用户在托盘图标上单击鼠标右键,弹出上下文菜单隐藏/显示对话框。
                CMenu oMenu;
                if (oMenu.LoadMenu(IDR_MENU_TRAY))        
                {
                    CMenu* pPopup = oMenu.GetSubMenu(0);
                    ASSERT(pPopup != NULL);
                    CPoint oPoint;
					if (IsWindowVisible())// 根据对话框窗口的显示/隐藏状态修改菜单名称
						oMenu.ModifyMenu(IDC_SHOW,MF_STRING,IDC_SHOW,"隐藏(&H)");
					else
						oMenu.ModifyMenu(IDC_SHOW,MF_STRING,IDC_SHOW,"显示(&S)");
                    // 确定鼠标位置以便在该位置附近显示菜单
					GetCursorPos( &oPoint );
                    SetForegroundWindow();
                    pPopup->TrackPopupMenu(
                        TPM_LEFTALIGN | TPM_RIGHTBUTTON,
                        oPoint.x, oPoint.y, this); 
                }
            }
            break;
		// 单击/双击鼠标左键均显示出对话框
		case WM_LBUTTONDBLCLK:
			OnShow();
			break; 
		case WM_LBUTTONDOWN:
			OnShow();
			break;
    }
    return 0;
}

void CGateAgentDlg::OnShow() 
{
	if (!IsWindowVisible()) 
	{
		ShowWindow(SW_SHOW);
	}
	else
		ShowWindow(SW_HIDE);
}

void CGateAgentDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	//窗口最小化的时候将系统显示再托盘当中
	if (SIZE_MINIMIZED==nType)
	{
		ShowWindow(SW_HIDE);
	}
}

void CGateAgentDlg::OnMenuShut() 
{
	OnClose();
}

void CGateAgentDlg::OnTrayClose() 
{
	OnClose();	
}

//处理特殊消息类型的主流程
int CGateAgentDlg::OnDoSpecific(int nHandle,int nType, CString strMess, CString  strTel, char *pchTime,CString strName)
{
	//去掉前面的字符
	CString strSpecMess;	
	strSpecMess=strMess.Mid(1,strMess.GetLength());

	switch (nType)
	{
	case FIND_SMS:
		return OnAnalyzeFindSms(nHandle,strSpecMess.GetBuffer(0),m_sDiv.GetBuffer(0),m_strBkInfo.GetBuffer(0),pchTime,strTel.GetBuffer(0));
		break;
	case PUBLICE_SMS:  //普通公用信息,则插入到ba_message
		return OnPublicMess(strMess,strName);
		break;
	case FINDPRICE_SMS:
		return OnDoFind(nHandle,strSpecMess.GetBuffer(0),strTel.GetBuffer(0),pchTime);
	case REPORT_SMS:
		return OnReportTotal(nHandle,strSpecMess.GetBuffer(0),strTel.GetBuffer(0),pchTime,SMS_REPORT);
	case TOTALNODE_SMS: //统计节点数据
		break;
	default:
		break;
	}
	return 0;
}



//处理查询单价命令
/*
1、根据手机号码和带有的时间从销售记录表和产品表中,查询计算出产品所有的价格
2、然后将记录插入发送记录表格当中;
*/
int CGateAgentDlg::OnDoFind(int nHandle,char *pchCode, char *pchTelNum, char *pchTime)
{
	st_Rec	stRec;
	bool bLeaveRecord = false;
	char chMsg[1000]	= {0};
	char chSQLCmd[SQLLENGTH]={0};
	int iRet = -10;
	CString strTmp,strData,strName;

	memset(&stRec, 0x00, sizeof(st_Rec));
	stRec.iRecStart = 0;
	stRec.iRecNum = 9999;	
	_snprintf(chSQLCmd, SQLLENGTH-1,"select vcPrice,vcName from ba_Product where vcCode='%s'",pchCode);
	iRet = m_sqlDB.OnExecSql(chSQLCmd, &stRec, bLeaveRecord, chMsg);
	if(iRet<0)
	{
		strTmp.Format("查询失败:%s",chSQLCmd);
		OnInsertMess(strTmp.GetBuffer(0));
		m_sqlDB.OnFreeRec(&stRec);
		return -1;
	}
	if(stRec.iRecNum == 0)
	{
		strData.Format("没有该产品(%s)的单价",pchCode);
		m_sqlDB.OnFreeRec(&stRec);
		if (OnInsertSend(nHandle,pchTelNum,pchTime,strData.GetBuffer(0),SMS_OK)<0) return -2;		
		return 88;
	}
	
	strTmp = m_CPubBase.OnDoStr(0,20,stRec.pchRecVal);
	strName = m_CPubBase.OnDoStr(20,50,stRec.pchRecVal);
	strData.Format("%s[%s]的单价为%s(元)",strName,pchCode,strTmp);
	m_sqlDB.OnFreeRec(&stRec);
	//同时插入回复消息到自动回复表格当中
	if (OnInsertSend(nHandle,pchTelNum,pchTime,strData.GetBuffer(0),SMS_OK)<0) return -2;		
	return 0;
}

//找到到要发送的消息后,然后将消息发送出去。/*测试的时候先将数据回送过去*/
int CGateAgentDlg::OnPreSend(int iSendNum,int nHandle,char *pchFlag)
{
	st_Rec	stRec;
	bool bLeaveRecord = false;
	char chMsg[1000]	= {0};
	char chSQLCmd[SQLLENGTH]={0};
	int iRet = -10;
	CString strTmp;

	memset(&stRec, '\0', sizeof(st_Rec));
	stRec.iRecStart = 0;
	stRec.iRecNum = 9999;	
	//从发送表中查找没有发送成功并且发送次数没有达到最大数目的记录
	char chState[2]={0};
	sprintf(chState,"%02d",iSendNum+1);
	memset(chSQLCmd,0x00,sizeof(chSQLCmd));

	_snprintf(chSQLCmd, SQLLENGTH-1,"select atID,nDevice,vcTel,cState,cAtonce,vcTime,vcText from me_send where cState<>'%s' and cState<'%s' order by vcSendtime",STATE_SENDOK,chState);
	iRet = m_sqlDB.OnExecSql(chSQLCmd, &stRec, bLeaveRecord, chMsg);
	if(iRet<0)
	{
		OnInsertMess("从发送记录表中查找失败!");
		m_sqlDB.OnFreeRec(&stRec);
		OnAgainConnectDb();
		return 88;
	}
	if(stRec.iRecNum == 0)
	{
		m_sqlDB.OnFreeRec(&stRec);
		return NO_SEND;
	}

	CString strState,strBack,strTel,strId,strHandle,strAtOnce,strSetTime;
	strId=m_CPubBase.OnDoStr(0,11,stRec.pchRecVal);//取出id
	strHandle=m_CPubBase.OnDoStr(11,11,stRec.pchRecVal);//取出发送句柄设备号码
	strTel=m_CPubBase.OnDoStr(22,30,stRec.pchRecVal); //取出手机号码
	strState=m_CPubBase.OnDoStr(52,2,stRec.pchRecVal);//取出状态
	strAtOnce=m_CPubBase.OnDoStr(54,2,stRec.pchRecVal); //取出是否立即发送的标志
	strSetTime=m_CPubBase.OnDoStr(56,14,stRec.pchRecVal); //取出是否立即发送的标志
	strBack=m_CPubBase.OnDoStr(70,300,stRec.pchRecVal); //取出回复短信

	//去掉从数据库当中取出来的空格
	char chTmp[300]={0};
	sprintf(chTmp,"%s",strBack.GetBuffer(0));
	char *pdest=strstr(chTmp," ");
	int i=0;
	if (pdest!=NULL)
	{
		i=pdest - chTmp + 1;
		strBack=strBack.Mid(0,i);
	}

	m_sqlDB.OnFreeRec(&stRec);
	//如果发送失败次数已经达到设定的最大发送次数,则不处理数据
	int iState = atoi(strState.GetBuffer(0));
	if (iState>iSendNum) return 55;

⌨️ 快捷键说明

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