📄 recvsend.cpp
字号:
// RecvSend.cpp: implementation of the CRecvSend class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "HHSJ_Msg.h"
#include "RecvSend.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRecvSend::CRecvSend()
{
}
CRecvSend::~CRecvSend()
{
}
void CRecvSend::MainProcess()
{
WriteLogFile("SMG线程启动了");
while(GlobalVar.ThreadContr.IsRecvSendThreadTerm)
{
try
{
int iCount=0;
//扫描待发信息表,从而发送数据
if (0==SendMsg()) iCount++;
if (0==RecvMsg()) iCount++;
if (2==iCount) Sleep(2000);//如果收发都没有数据处理,让线程休息2秒钟
}catch(...)
{
WriteLogFile("发送程序发生异常");
}
}
for(int i=0;i<10;i++)
{
int iRet=SMGPDisconnect();//尝试10次----关闭和网关建立的所有连接
if (iRet == SMGP_API_SUCCESS) break;
Sleep(100);
}
GlobalVar.ThreadContr.IsRecvSendThreadTerm = 1 ; //通知主线程,从线程已经结束了
WriteLogFile("SMG线程正常结束");
}
int CRecvSend::SendMsg()
{
int RetValue=0;
try
{
///////////////////////////////////////////////////////////////
CString str=_T("");
str="Select top 100 * from PHS_SEND where Arranged_time<getdate() order by priority desc";//每次最多只处理100条记录
CRecSet RecSet(GlobalVar.DB.DBSQLServer.pDatabase);
RecSet.OpenRecordSet(str);
RetValue=RecSet.RecordCount;
if (RetValue==0) return RetValue;
////////////////////////////////////////////////////////////////
SendToGateWay(&RecSet);
}
catch(...)
{
WriteLogFile("Exception In SendMsg()");
}
return RetValue;
}
void CRecvSend::SendToGateWay(CRecSet *pRecSet)
{
//for循环逐条处理待发记录
for(int i=1;i<=pRecSet->RecordCount;i++)
{
CString str=_T("");
CString Seq=_T("");
CString MsgFro=_T("");
CString MsgTitleCode=_T("");
CString IS_OPER_CONT=_T("");
Seq=pRecSet->GetFieldValueByName("SEQ",SQL_C_CHAR);
MsgFro=pRecSet->GetFieldValueByName("MSG_FRO",SQL_C_CHAR);
MsgTitleCode=pRecSet->GetFieldValueByName("MSG_TITLE_CODE",SQL_C_CHAR);
IS_OPER_CONT=pRecSet->GetFieldValueByName("IS_OPER_CONT",SQL_C_CHAR);
//////////////////////////////////////////////////
//公共字段
CString NeedReport=_T("");
CString Priority=_T("");
CString ServerID=_T("");
CString MsgFormat=_T("");
CString FeeType=_T("");
CString FeeCode=_T("");
CString FixedFee=_T("");
CString ValidTime=_T("");
CString AtTime=_T("");
CString ChargeTermID=_T("");
CString DestTermID=_T("");
CString SRC_TERMID=_T("");
CString MsgLength=_T("");
CString MsgCont=_T("");
CString MsgType=_T("");
char * p;
//从记录集合提取转移的内容
NeedReport=pRecSet->GetFieldValueByName("NEED_REPORT",SQL_C_CHAR);
Priority=pRecSet->GetFieldValueByName("PRIORITY",SQL_C_CHAR);
ServerID=pRecSet->GetFieldValueByName("SERVER_ID",SQL_C_CHAR);
MsgFormat=pRecSet->GetFieldValueByName("MSG_FORMAT",SQL_C_CHAR);
FeeType=pRecSet->GetFieldValueByName("FEE_TYPE",SQL_C_CHAR);
FeeCode=pRecSet->GetFieldValueByName("FEE_CODE",SQL_C_CHAR);
FixedFee=pRecSet->GetFieldValueByName("FIXED_FEE",SQL_C_CHAR);
ValidTime=pRecSet->GetFieldValueByName("VALID_TIME",SQL_C_TIMESTAMP);
AtTime=pRecSet->GetFieldValueByName("AT_TIME",SQL_C_TIMESTAMP);
ChargeTermID=pRecSet->GetFieldValueByName("CHARGE_TERMID",SQL_C_CHAR);
DestTermID=pRecSet->GetFieldValueByName("DEST+TERMID",SQL_C_CHAR);
SRC_TERMID=pRecSet->GetFieldValueByName("SRC_TERMID",SQL_C_CHAR);
//再次判断长度是否准确
bool IsLengthRight=true;
MsgLength=pRecSet->GetFieldValueByName("MSG_LENGTH",SQL_C_CHAR);
MsgCont=pRecSet->GetFieldValueByName("MSG_CONT",SQL_C_CHAR);
short len=atoi(MsgLength.GetBuffer(0));
if(len!=MsgCont.GetLength())
{
IsLengthRight=false;
len=MsgCont.GetLength();
MsgLength.Format("%d",len);
}
///////////////////////////////////////////////////////////////////
MsgType=pRecSet->GetFieldValueByName("MSG_TYPE",SQL_C_CHAR);
///////////////////////////////////////////////////////////////////////
//往网关发送
int nErrorCode;
CString RetMsgID;
int nReturn = SMGPSendSingle( atoi(NeedReport.GetBuffer(0)),
atoi(Priority.GetBuffer(0)),
(LPCSTR)ServerID,
atoi(MsgFormat.GetBuffer(0)),
(LPCSTR)FeeType,
(LPCSTR)FeeCode,
(LPCSTR)FixedFee,
(LPCSTR)ValidTime,
(LPCSTR)AtTime,
(LPCSTR)ChargeTermID,
(LPCSTR)DestTermID,
atoi(MsgLength.GetBuffer(0)),
(LPCSTR)MsgCont,
RetMsgID.GetBuffer(0),//注意数据类型,此处可能有错误
&nErrorCode,
atoi(MsgType.GetBuffer(0)),
(LPCSTR)SRC_TERMID);
//下面2行语句是将字符串转换为日期 以便插入数据库
ValidTime.Format("cast('%s' as datetime)",ValidTime);
AtTime.Format("cast('%s' as datetime)",AtTime);
////////////////////////////////////////////////////
CString ErrorCode=_T("");
CString IsSubmitSucc;
if( nReturn == SMGP_API_SUCCESS )
{
IsSubmitSucc="1";
}
else
{
ErrorCode.Format("%d",nErrorCode);
IsSubmitSucc="0";
}
////////////////////////////////////////////////////////
//删除该条记录
//测试期间可以临时暂时注释
str.Format("delete from PHS_SEND where seq=%s",Seq);
p=str.GetBuffer(0);
GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(p);
str.Format("INSERT INTO PASSMSG (Need_Report,Priority,Server_ID,Msg_Format,Fee_Type,Fee_Code,\
Fixed_Fee,Valid_Time,At_Time,Charge_TermID,Dest_TermID,SRC_TERMID,Msg_Length,Msg_Cont,\
Msg_Type,SEQ,MSG_FRO,MSG_TITLE_CODE,REPORT_SN,IS_SUBMIT_S,F_RSON_SUBMIT)\
values ('%s','%s','%s','%s','%s','%s',\
'%s',%s,%s,'%s','%s','%s',%s,'%s','%s','%s','%s','%s','%s','%s','%s')",\
NeedReport,Priority,ServerID,MsgFormat,FeeType,FeeCode,FixedFee,\
ValidTime,AtTime,ChargeTermID,DestTermID,SRC_TERMID,MsgLength,\
MsgCont,MsgType,Seq,MsgFro,MsgTitleCode,RetMsgID,IsSubmitSucc,ErrorCode);
p=str.GetBuffer(0);
GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(p);//执行插入语句
/* if( nReturn == SMGP_API_SUCCESS )
{//发送成功的处理
//往已发表写备份
//if(IS_OPER_CONT=="0")//往普通短信已经发送表写 否则往内容短信已经发送表写
str="INSERT INTO PASSMSG (Seq,Need_Report,Priority,Server_ID,Msg_Format,Fee_Type,Fee_Code,";
//else str="INSERT INTO MSG_CONT (Need_Report,Priority,Server_ID,Msg_Format,Fee_Type,Fee_Code,";
str+="Fixed_Fee,Valid_Time,At_Time,Charge_TermID,Dest_TermID,SRC_TERMID,Msg_Length,Msg_Cont,";
str+="Msg_Type,SEQ,MSG_FRO,MSG_TITLE_CODE,REPORT_SN) values (";
str+=NeedReport+","+Priority+","+ServerID+","+MsgFormat+","+FeeType+","+FeeCode;
str+=","+FixedFee+","+ValidTime+","+AtTime+","+ChargeTermID+","+DestTermID;
str+=","+SRC_TERMID+","+MsgLength+","+MsgCont+","+MsgType;
str+=","+Seq+","+MsgFro+","+MsgTitleCode+","+RetMsgID+")";
p=str.GetBuffer(0);
GlobalVar.DB.DBSQLServer .NoRetExecuteSQL(p);//执行插入语句
}
else
{//发送失败的处理
CString ErrorCode=_T("");
ErrorCode.Format("%d",nErrorCode);
str="INSERT INTO FailedMsg (Need_Report,Priority,Server_ID,Msg_Format,Fee_Type,Fee_Code,";
str+="Fixed_Fee,Valid_Time,At_Time,Charge_TermID,Dest_TermID,Reply_Path,Msg_Length,Msg_Cont,";
str+="Msg_Type,SEQ,MSG_FRO,MSG_TITLE_CODE,Error_Code,REPORT_SN) values (";
str+=NeedReport+","+Priority+","+ServerID+","+MsgFormat+","+FeeType+","+FeeCode;
str+=","+FixedFee+","+ValidTime+","+AtTime+","+ChargeTermID+","+DestTermID;
str+=","+SRC_TERMID+","+MsgLength+","+MsgCont+","+MsgType;
str+=","+Seq+","+MsgFro+",";
str+=MsgTitleCode+","+ErrorCode+","+RetMsgID+")";
char * p=str.GetBuffer(0);
GlobalVar.DB.DBSQLServer .NoRetExecuteSQL(p);//执行插入语句
}*/
///////////////////////////////////////////////////////////////////////
//移动记录指针
pRecSet->LocateRecord(1);
}
}
int CRecvSend::RecvMsg()
{
int iRecvCount=0;
for(int i=0;i<100;i++)
{
DeliverResp DlvrResp;
if(SMGP_API_SUCCESS==SMGPDeliver(5000,&DlvrResp))
{
iRecvCount++;
WriteToPHS_DELIVER(&DlvrResp);
continue;
}
else
{
break;
}
}
return iRecvCount;
}
void CRecvSend::WriteToPHS_DELIVER(DeliverResp* p)
{
CString strSQL=_T("");
char * pSQL;
//先往上行备份表写
strSQL.Format("insert into PHS_DELIVER_BAK (MSG_ID,MSG_FORMAT,SRC_TERMID,IS_REPORT,MSG_LEN,\
MSG_CONT,DEST_TERMID,RECV_TIME) values ('%s','%d','%s','%d',%d,'%s','%s',cast('%s' as datetime)",\
p->SMsgID,p->NMsgFormat,p->SSrcTermID,p->NIsReport,p->NMsgLen,\
p->sMsgContent,p->sDestTermID,p->sRecvTime);
pSQL=strSQL.GetBuffer(0);
GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(pSQL);//执行插入语句
//再准备往上行表写
if(p->NIsReport!=0)
{//非状态报告
strSQL.Format("insert into PHS_DELIVER (MSG_ID,MSG_FORMAT,SRC_TERMID,IS_REPORT,MSG_LEN,\
MSG_CONT,DEST_TERMID,RECV_TIME) values ('%s','%d','%s','%d',%d,'%s','%s',cast('%s' as datetime)",\
p->SMsgID,p->NMsgFormat,p->SSrcTermID,p->NIsReport,p->NMsgLen,\
p->sMsgContent,p->sDestTermID,p->sRecvTime);
pSQL=strSQL.GetBuffer(0);
GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(pSQL);//执行插入语句
}
else
{//状态报告
CString sCont=_T("");
sCont.Format("%s",p->sMsgContent);
if( (-1==sCont.Find("id:"))||(-1==sCont.Find("sub:"))||
(-1==sCont.Find("stat:"))||(-1==sCont.Find("err:"))||
(-1==sCont.Find("submit:")) )
{
CString str=_T("");
str.Format("收到一个错误内容的状态报告,消息标志:%s\n消息内容:%s",p->SMsgID,sCont);
WriteLogFile(str);
return;
}
CString ID=_T("");
CString stat=_T("");
CString Err=_T("");
int nPosition=sCont.Find("sub:");
ID=sCont.Left(nPosition);
ID.TrimLeft();
ID.TrimRight();
int len=ID.GetLength();
ID=ID.Right(len-3);
int nFirst=sCont.Find("stat:");
int nNext=sCont.Find("err:");
stat=sCont.Mid(nFirst+5,nNext-nFirst-5);
stat.TrimLeft();
stat.TrimRight();
nFirst=nNext;
nNext=sCont.Find("err:");
Err=sCont.Mid(nFirst+4,nNext-nFirst-4);
Err.TrimLeft();
Err.TrimRight();
CString str=_T("");
str.Format("select seq from PASSMSG where REPORT_SN='%s'",ID);
CRecSet RecSet(GlobalVar.DB.DBSQLServer.pDatabase);
RecSet.OpenRecordSet(str);
short RetValue=RecSet.RecordCount;
if(0==RetValue)
{
CString str=_T("");
str.Format("收到一个流水号不存在的状态报告,消息标志:%s\n消息内容:%s",p->SMsgID,sCont);
WriteLogFile(str);
return;
}
if(RetValue>1)
{
CString str=_T("");
str.Format("收到一个流水号重复的状态报告,消息标志:%s\n消息内容:%s",p->SMsgID,sCont);
WriteLogFile(str);
}
str.Format("update passmsg set IS_SEND_S=%s,F_RSON_SEND='%s' where REPORT_SN='%s'",\
stat,Err,ID);//stat 的具体值还需要查阅相关文档
pSQL=str.GetBuffer(0);
GlobalVar.DB.DBSQLServer.NoRetExecuteSQL(pSQL);//执行插入语句
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -