| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- #include "stdafx.h"
- #include "AgentClient.h"
- #include "AgentEventManager.h"
- #include "AgentLog.h"
- #include "NetCtrlInterface.h"
- #include "AgentOp.h"
- #include "AgentBusiness.h"
- #include "AgentMsgProc.h"
- #include "PduDataFormat.h"
- #include "TFBTimer.h"
- /*
- * 函数名称:CAgentClient()
- * 概要分析:
- */
- CAgentClient::CAgentClient()
- {
- m_nAgentExtension = 0;
- m_nAgentNumber = 0;
- m_nAgentType = AGENT_TYPE_NORMAL;
- m_sAgentGroup = "";
- m_nAgentSkill = 0;
- m_nWorkOverTime = 0;
- m_firstAcdServer.m_nAcdServerId = 0;
- m_firstAcdServer.m_sAcdServerName.Empty();
- m_firstAcdServer.m_sAcdServerName = "主ACD服务器";
- m_firstAcdServer.m_sAcdServerIpAddr.Empty();
- m_firstAcdServer.m_sAcdServerIpAddr = "127.0.0.1";
- m_firstAcdServer.m_nAcdServerPort = 0;
- // 业务数据
- m_bAutoReconnect = TRUE;
- m_bAutoAnswer = FALSE;
- m_nAgentState = AGENT_STATE_UNKNOWN;
- m_nAgentLineState = INNER_STATE_DISABLED;
- m_nAgentLinkState = PDU_LINK_STATE_UNKNOWN;
- m_nCallID = 0;
- m_nFaxCallID = 0;
- m_sOuterNumber = "";
- m_sRecordFilePath = "";
- m_sLeaveWordFilePath = "";
- m_nFaxAction = 0;
- m_sFaxFilePath = "";
- m_sLogFileDirectory = "";
- memset(m_sAssoData, 0, MAX_DATA_BUF_LEN);
- m_nAgentBusyCode = 0;
- m_nErrorCode = NONE_ERR;
- m_bIsConnInfoChange = FALSE;
- m_pEventManager = NULL;
- m_pAgentLog = NULL;
- m_pAgentOp = NULL;
- m_pAgentBusiness = NULL;
- m_pAgentMsgProc = NULL;
- m_pAgentOnTimer = new CTFBTimer(this);
- g_pAgentClient = this;
- // 初始化命令配置
- CPduDataFormat* pDataFormat = CPduDataFormat::getInstance();
- #ifndef _DEBUG
- pDataFormat->Load("C:/WINDOWS/system32/PDUFormat.ini");
- #else
- pDataFormat->Load("../../../Public/PduLink/PDUFormat.ini"); //../../../Public/PduLink/PDUFormat.ini
- #endif
- // 注册Scoket连接状态变化
- CInterfaceWindow::getLinkInstance()->RegistPduLinkProc(this, TRUE);
- }
- /*
- * 函数名称:~CAgentClient()
- * 概要分析:析构函数
- */
- CAgentClient::~CAgentClient()
- {
- // scoket连接变化反注册
- CInterfaceWindow::getLinkInstance()->RegistPduLinkProc(this, FALSE);
- // 断开scoket
- CloseClient();
- if(m_pEventManager != NULL )
- {
- delete m_pEventManager;
- m_pEventManager = NULL;
- }
- if( m_pAgentLog != NULL )
- {
- delete m_pAgentLog;
- m_pAgentLog = NULL;
- }
- if( m_pAgentOp != NULL )
- {
- delete m_pAgentOp;
- m_pAgentOp = NULL;
- }
- if( m_pAgentMsgProc != NULL )
- {
- delete m_pAgentMsgProc;
- m_pAgentMsgProc = NULL;
- }
- if(m_pAgentBusiness != NULL)
- {
- delete m_pAgentBusiness;
- m_pAgentBusiness = NULL;
- }
- if(m_pAgentOnTimer != NULL)
- {
- delete m_pAgentOnTimer;
- m_pAgentOnTimer = NULL;
- }
- }
- /*
- * 函数名称:GetClientType()
- * 概要分析:返回客户端类型
- */
- PDU_DEV_TYPE CAgentClient::GetClientType()
- {
- return PDU_DEV_TYPE_AGENT;
- }
- /*
- * 函数名称:CreateEventManager()
- * 概要分析:创建事件管理器
- */
- BOOL CAgentClient::CreateEventManager(CTFBCtrl *a_pClientCtrl)
- {
- if( m_pEventManager == NULL )
- {
- m_pEventManager = new CAgentEventManager(a_pClientCtrl);
- if( m_pEventManager == NULL )
- return FALSE;
- else
- return TRUE;
- }
-
- return TRUE;
- }
- /*
- * 函数名称:CreateAgentOp()
- * 概要分析:创建坐席操作
- */
- BOOL CAgentClient::CreateAgentOp()
- {
- if( m_pAgentOp == NULL )
- {
- m_pAgentOp = new CAgentOp(this);
- if( m_pAgentOp == NULL )
- return FALSE;
- else
- return TRUE;
- }
-
- return TRUE;
- }
- /*
- * 函数名称:CreateAgentBussiness()
- * 概要分析:创建坐席业务类
- */
- BOOL CAgentClient::CreateAgentBussiness()
- {
- if( m_pAgentBusiness == NULL )
- {
- m_pAgentBusiness = new CAgentBusiness(this);
- if( m_pAgentBusiness == NULL )
- return FALSE;
- else
- return TRUE;
- }
-
- return TRUE;
- }
- /*
- * 函数名称:CreateAgentLog()
- * 概要分析:创建日志类
- */
- BOOL CAgentClient::CreateAgentLog()
- {
- if( m_pAgentLog == NULL )
- {
- m_pAgentLog = new CAgentLog(this);
- if( m_pAgentLog == NULL )
- return FALSE;
- else
- return TRUE;
- }
- return TRUE;
- }
- /*
- * 函数名称:CreateAgentMsgProc()
- * 概要分析:创建坐席命令处理类
- */
- BOOL CAgentClient::CreateAgentMsgProc()
- {
- if( m_pAgentMsgProc == NULL )
- {
- m_pAgentMsgProc = new CAgentMsgProc(this);
- if( m_pAgentMsgProc == NULL )
- return FALSE;
- else
- return TRUE;
- }
- return TRUE;
- }
- /*
- * 函数名称:GetEventManager()
- * 概要分析:返回事件管理器指针
- */
- CAgentEventManager* CAgentClient::GetEventManager()
- {
- return m_pEventManager;
- }
- /*
- * 函数名称:GetEventManager()
- * 概要分析:返回事件管理器指针
- */
- CAgentOp* CAgentClient::GetAgentOp()
- {
- return m_pAgentOp;
- }
- /*
- * 函数名称:GetEventManager()
- * 概要分析:返回事件管理器指针
- */
- CAgentLog* CAgentClient::GetAgentLog()
- {
- return m_pAgentLog;
- }
- /*
- * 函数名称:GetAgentBussiness()
- * 概要分析:返回业务类对象指针
- */
- CAgentBusiness* CAgentClient::GetAgentBussiness()
- {
- return m_pAgentBusiness;
- }
- // 获取坐席定时器
- CTFBTimer* CAgentClient::GetAgentTimer()
- {
- return m_pAgentOnTimer;
- }
- /*****************************************************************
- **【函数名称】 GetAssociateData
- **【函数功能】 获取随路数据
- **【参数】 a_sCaption 随路数据标题
- **【返回值】 void
- ****************************************************************/
- CString CAgentClient::GetAssociateData(LPCTSTR a_sCaption)
- {
- /*随路数据格式:变量名1:变量值1|变量名2:变量值2*/
-
- // 解析随路数据
- char szData[MAX_DATA_BUF_LEN];
- memset(szData, 0, MAX_DATA_BUF_LEN);
- lstrcpy(szData, m_sAssoData);
- char steps[] = "|";
- char* lplpNextToken = NULL;
- char* lpToken = NULL;
- // 解析单个随路数据定义临时变量
- CString strSingleData = _T("");
- int nIndex = -1;
- // 开始解析
- lpToken = strtok_s(szData, steps, &lplpNextToken);
- while(lpToken != NULL)
- {
- // 对单个随路数据解析
- strSingleData = lpToken;
- nIndex = strSingleData.Find(":");
- if(strSingleData.Left(nIndex).Compare(a_sCaption) == 0)
- {
- // 查找到该随路数据
- strSingleData = strSingleData.Right(strSingleData.GetLength()-(nIndex+1));
- return strSingleData.GetBuffer();
- }
- lpToken = strtok_s(NULL, steps, &lplpNextToken);
- }
- return _T("");
- }
- /*****************************************************************
- **【函数名称】 GetAgentInfo
- **【函数功能】 获取坐席信息
- **【参数】 坐席工号|分机号|坐席类型|坐席组号|AcdIp|Acd端口
- **【返回值】 void
- ****************************************************************/
- CString CAgentClient::GetAgentInfo()
- {
- CString strAgentInfo = "";
- strAgentInfo.Format("%u|%u|%u|%s|%s|%d",
- m_nAgentNumber,
- m_nAgentExtension,
- m_nAgentType,
- m_sAgentGroup,
- m_firstAcdServer.m_sAcdServerIpAddr,
- m_firstAcdServer.m_nAcdServerPort);
- return strAgentInfo;
- }
- /*****************************************************************
- **【函数名称】 LinkAcdServer
- **【函数功能】 连接ACD服务器
- **【参数】
- **【返回值】 void
- ****************************************************************/
- BOOL CAgentClient::LinkAcdServer()
- {
- // 检查登录属性值
- if(m_nAgentExtension == 0 || m_nAgentNumber == 0 || m_firstAcdServer.m_nAcdServerPort == 0)
- {
- SetErrorCode( ERR_AGENT_INFO_INVALID );
- GetEventManager()->Fire_Evt_LogIn(false, ERR_AGENT_INFO_INVALID);
- return FALSE;
- }
- // 关闭SOCKET连接
- CloseClient();
-
- //初始化坐席端连接状态
- m_nAgentLinkState = PDU_LINK_STATE_UNKNOWN;
- m_bIsConnInfoChange = FALSE;
- // Socket通讯类创建连接ACD的socket
- if(!CInterfaceWindow::getLinkInstance()->CreatePduClient(m_firstAcdServer.m_sAcdServerIpAddr,
- m_firstAcdServer.m_nAcdServerPort,
- PDU_DEV_TYPE_AGENT, m_nAgentNumber,
- PDU_DEV_TYPE_ACD, m_firstAcdServer.m_nAcdServerId, m_bAutoReconnect ? true : false))
- {
- SetErrorCode( ERR_CREATE_SOCKET );
- GetEventManager()->Fire_Evt_LogIn(false, ERR_CREATE_SOCKET);
- m_nAgentLinkState = PDU_LINK_STATE_FAILED;
- GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_FAILED);
- return FALSE;
- }
- return TRUE;
- }
- /*****************************************************************
- **【函数名称】 CloseClient
- **【函数功能】 关闭scoket
- **【参数】
- **【返回值】 void
- ****************************************************************/
- BOOL CAgentClient::CloseClient()
- {
- return CInterfaceWindow::getLinkInstance()->ClosePduClient(PDU_DEV_TYPE_ACD, m_firstAcdServer.m_nAcdServerId);
- }
- /*****************************************************************
- **【函数名称】 OnLinkStateChanged
- **【函数功能】 PDU连接状态变化事件处理
- **【参数】
- **【返回值】 void
- ****************************************************************/
- void CAgentClient::OnLinkStateChanged(const PduLinkContent& linkContent)
- {
- m_nAgentLinkState = linkContent.nLinkState; // 保存连接状态
- m_bIsConnInfoChange = TRUE; // 设置连接变化状态标识为TRUE
- switch(m_nAgentLinkState)
- {
- case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
- {
- GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_SUCCESSED);
- }
- break;
- case PDU_LINK_STATE_FAILED: // 请求连接失败
- {
- GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_FAILED);
- SetErrorCode(ERR_NO_ACD);
- GetEventManager()->Fire_Evt_LogIn(false, ERR_NO_ACD);
- }
- break;
- case PDU_LINK_STATE_REG_OK: // 注册成功
- {
- GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_REG_OK);
- // 发送签入命令
- m_pAgentOp->Login();
- }
- break;
- case PDU_LINK_STATE_REG_FAILED: // 注册失败
- {
- GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_REG_FAILED);
- SetErrorCode(ERR_BIND_AGENT);
- GetEventManager()->Fire_Evt_LogIn(false, ERR_BIND_AGENT);
- }
- break;
- case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
- {
- GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_DISCONNECTED);
- }
- break;
- default:
- break;
- }
- }
|