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