升龙物业 老版本 ocx IPO, 加密狗 转值班电话

AgentClient.cpp 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. #include "stdafx.h"
  2. #include "AgentClient.h"
  3. #include "AgentEventManager.h"
  4. #include "AgentLog.h"
  5. #include "NetCtrlInterface.h"
  6. #include "AgentOp.h"
  7. #include "AgentBusiness.h"
  8. #include "AgentMsgProc.h"
  9. #include "PduDataFormat.h"
  10. #include "TFBTimer.h"
  11. /*
  12. * 函数名称:CAgentClient()
  13. * 概要分析:
  14. */
  15. CAgentClient::CAgentClient()
  16. {
  17. m_nAgentExtension = 0;
  18. m_nAgentNumber = 0;
  19. m_nAgentType = AGENT_TYPE_NORMAL;
  20. m_sAgentGroup = "";
  21. m_nAgentSkill = 0;
  22. m_nWorkOverTime = 0;
  23. m_firstAcdServer.m_nAcdServerId = 0;
  24. m_firstAcdServer.m_sAcdServerName.Empty();
  25. m_firstAcdServer.m_sAcdServerName = "主ACD服务器";
  26. m_firstAcdServer.m_sAcdServerIpAddr.Empty();
  27. m_firstAcdServer.m_sAcdServerIpAddr = "127.0.0.1";
  28. m_firstAcdServer.m_nAcdServerPort = 0;
  29. // 业务数据
  30. m_bAutoReconnect = TRUE;
  31. m_bAutoAnswer = FALSE;
  32. m_nAgentState = AGENT_STATE_UNKNOWN;
  33. m_nAgentLineState = INNER_STATE_DISABLED;
  34. m_nAgentLinkState = PDU_LINK_STATE_UNKNOWN;
  35. m_nCallID = 0;
  36. m_nFaxCallID = 0;
  37. m_sOuterNumber = "";
  38. m_sRecordFilePath = "";
  39. m_sLeaveWordFilePath = "";
  40. m_nFaxAction = 0;
  41. m_sFaxFilePath = "";
  42. m_sLogFileDirectory = "";
  43. memset(m_sAssoData, 0, MAX_DATA_BUF_LEN);
  44. m_nAgentBusyCode = 0;
  45. m_nErrorCode = NONE_ERR;
  46. m_bIsConnInfoChange = FALSE;
  47. m_pEventManager = NULL;
  48. m_pAgentLog = NULL;
  49. m_pAgentOp = NULL;
  50. m_pAgentBusiness = NULL;
  51. m_pAgentMsgProc = NULL;
  52. m_pAgentOnTimer = new CTFBTimer(this);
  53. g_pAgentClient = this;
  54. // 初始化命令配置
  55. CPduDataFormat* pDataFormat = CPduDataFormat::getInstance();
  56. #ifndef _DEBUG
  57. pDataFormat->Load("C:/WINDOWS/system32/PDUFormat.ini");
  58. #else
  59. pDataFormat->Load("../../../Public/PduLink/PDUFormat.ini"); //../../../Public/PduLink/PDUFormat.ini
  60. #endif
  61. // 注册Scoket连接状态变化
  62. CInterfaceWindow::getLinkInstance()->RegistPduLinkProc(this, TRUE);
  63. }
  64. /*
  65. * 函数名称:~CAgentClient()
  66. * 概要分析:析构函数
  67. */
  68. CAgentClient::~CAgentClient()
  69. {
  70. // scoket连接变化反注册
  71. CInterfaceWindow::getLinkInstance()->RegistPduLinkProc(this, FALSE);
  72. // 断开scoket
  73. CloseClient();
  74. if(m_pEventManager != NULL )
  75. {
  76. delete m_pEventManager;
  77. m_pEventManager = NULL;
  78. }
  79. if( m_pAgentLog != NULL )
  80. {
  81. delete m_pAgentLog;
  82. m_pAgentLog = NULL;
  83. }
  84. if( m_pAgentOp != NULL )
  85. {
  86. delete m_pAgentOp;
  87. m_pAgentOp = NULL;
  88. }
  89. if( m_pAgentMsgProc != NULL )
  90. {
  91. delete m_pAgentMsgProc;
  92. m_pAgentMsgProc = NULL;
  93. }
  94. if(m_pAgentBusiness != NULL)
  95. {
  96. delete m_pAgentBusiness;
  97. m_pAgentBusiness = NULL;
  98. }
  99. if(m_pAgentOnTimer != NULL)
  100. {
  101. delete m_pAgentOnTimer;
  102. m_pAgentOnTimer = NULL;
  103. }
  104. }
  105. /*
  106. * 函数名称:GetClientType()
  107. * 概要分析:返回客户端类型
  108. */
  109. PDU_DEV_TYPE CAgentClient::GetClientType()
  110. {
  111. return PDU_DEV_TYPE_AGENT;
  112. }
  113. /*
  114. * 函数名称:CreateEventManager()
  115. * 概要分析:创建事件管理器
  116. */
  117. BOOL CAgentClient::CreateEventManager(CTFBCtrl *a_pClientCtrl)
  118. {
  119. if( m_pEventManager == NULL )
  120. {
  121. m_pEventManager = new CAgentEventManager(a_pClientCtrl);
  122. if( m_pEventManager == NULL )
  123. return FALSE;
  124. else
  125. return TRUE;
  126. }
  127. return TRUE;
  128. }
  129. /*
  130. * 函数名称:CreateAgentOp()
  131. * 概要分析:创建坐席操作
  132. */
  133. BOOL CAgentClient::CreateAgentOp()
  134. {
  135. if( m_pAgentOp == NULL )
  136. {
  137. m_pAgentOp = new CAgentOp(this);
  138. if( m_pAgentOp == NULL )
  139. return FALSE;
  140. else
  141. return TRUE;
  142. }
  143. return TRUE;
  144. }
  145. /*
  146. * 函数名称:CreateAgentBussiness()
  147. * 概要分析:创建坐席业务类
  148. */
  149. BOOL CAgentClient::CreateAgentBussiness()
  150. {
  151. if( m_pAgentBusiness == NULL )
  152. {
  153. m_pAgentBusiness = new CAgentBusiness(this);
  154. if( m_pAgentBusiness == NULL )
  155. return FALSE;
  156. else
  157. return TRUE;
  158. }
  159. return TRUE;
  160. }
  161. /*
  162. * 函数名称:CreateAgentLog()
  163. * 概要分析:创建日志类
  164. */
  165. BOOL CAgentClient::CreateAgentLog()
  166. {
  167. if( m_pAgentLog == NULL )
  168. {
  169. m_pAgentLog = new CAgentLog(this);
  170. if( m_pAgentLog == NULL )
  171. return FALSE;
  172. else
  173. return TRUE;
  174. }
  175. return TRUE;
  176. }
  177. /*
  178. * 函数名称:CreateAgentMsgProc()
  179. * 概要分析:创建坐席命令处理类
  180. */
  181. BOOL CAgentClient::CreateAgentMsgProc()
  182. {
  183. if( m_pAgentMsgProc == NULL )
  184. {
  185. m_pAgentMsgProc = new CAgentMsgProc(this);
  186. if( m_pAgentMsgProc == NULL )
  187. return FALSE;
  188. else
  189. return TRUE;
  190. }
  191. return TRUE;
  192. }
  193. /*
  194. * 函数名称:GetEventManager()
  195. * 概要分析:返回事件管理器指针
  196. */
  197. CAgentEventManager* CAgentClient::GetEventManager()
  198. {
  199. return m_pEventManager;
  200. }
  201. /*
  202. * 函数名称:GetEventManager()
  203. * 概要分析:返回事件管理器指针
  204. */
  205. CAgentOp* CAgentClient::GetAgentOp()
  206. {
  207. return m_pAgentOp;
  208. }
  209. /*
  210. * 函数名称:GetEventManager()
  211. * 概要分析:返回事件管理器指针
  212. */
  213. CAgentLog* CAgentClient::GetAgentLog()
  214. {
  215. return m_pAgentLog;
  216. }
  217. /*
  218. * 函数名称:GetAgentBussiness()
  219. * 概要分析:返回业务类对象指针
  220. */
  221. CAgentBusiness* CAgentClient::GetAgentBussiness()
  222. {
  223. return m_pAgentBusiness;
  224. }
  225. // 获取坐席定时器
  226. CTFBTimer* CAgentClient::GetAgentTimer()
  227. {
  228. return m_pAgentOnTimer;
  229. }
  230. /*****************************************************************
  231. **【函数名称】 GetAssociateData
  232. **【函数功能】 获取随路数据
  233. **【参数】 a_sCaption 随路数据标题
  234. **【返回值】 void
  235. ****************************************************************/
  236. CString CAgentClient::GetAssociateData(LPCTSTR a_sCaption)
  237. {
  238. /*随路数据格式:变量名1:变量值1|变量名2:变量值2*/
  239. // 解析随路数据
  240. char szData[MAX_DATA_BUF_LEN];
  241. memset(szData, 0, MAX_DATA_BUF_LEN);
  242. lstrcpy(szData, m_sAssoData);
  243. char steps[] = "|";
  244. char* lplpNextToken = NULL;
  245. char* lpToken = NULL;
  246. // 解析单个随路数据定义临时变量
  247. CString strSingleData = _T("");
  248. int nIndex = -1;
  249. // 开始解析
  250. lpToken = strtok_s(szData, steps, &lplpNextToken);
  251. while(lpToken != NULL)
  252. {
  253. // 对单个随路数据解析
  254. strSingleData = lpToken;
  255. nIndex = strSingleData.Find(":");
  256. if(strSingleData.Left(nIndex).Compare(a_sCaption) == 0)
  257. {
  258. // 查找到该随路数据
  259. strSingleData = strSingleData.Right(strSingleData.GetLength()-(nIndex+1));
  260. return strSingleData.GetBuffer();
  261. }
  262. lpToken = strtok_s(NULL, steps, &lplpNextToken);
  263. }
  264. return _T("");
  265. }
  266. /*****************************************************************
  267. **【函数名称】 GetAgentInfo
  268. **【函数功能】 获取坐席信息
  269. **【参数】 坐席工号|分机号|坐席类型|坐席组号|AcdIp|Acd端口
  270. **【返回值】 void
  271. ****************************************************************/
  272. CString CAgentClient::GetAgentInfo()
  273. {
  274. CString strAgentInfo = "";
  275. strAgentInfo.Format("%u|%u|%u|%s|%s|%d",
  276. m_nAgentNumber,
  277. m_nAgentExtension,
  278. m_nAgentType,
  279. m_sAgentGroup,
  280. m_firstAcdServer.m_sAcdServerIpAddr,
  281. m_firstAcdServer.m_nAcdServerPort);
  282. return strAgentInfo;
  283. }
  284. /*****************************************************************
  285. **【函数名称】 LinkAcdServer
  286. **【函数功能】 连接ACD服务器
  287. **【参数】
  288. **【返回值】 void
  289. ****************************************************************/
  290. BOOL CAgentClient::LinkAcdServer()
  291. {
  292. // 检查登录属性值
  293. if(m_nAgentExtension == 0 || m_nAgentNumber == 0 || m_firstAcdServer.m_nAcdServerPort == 0)
  294. {
  295. SetErrorCode( ERR_AGENT_INFO_INVALID );
  296. GetEventManager()->Fire_Evt_LogIn(false, ERR_AGENT_INFO_INVALID);
  297. return FALSE;
  298. }
  299. // 关闭SOCKET连接
  300. CloseClient();
  301. //初始化坐席端连接状态
  302. m_nAgentLinkState = PDU_LINK_STATE_UNKNOWN;
  303. m_bIsConnInfoChange = FALSE;
  304. // Socket通讯类创建连接ACD的socket
  305. if(!CInterfaceWindow::getLinkInstance()->CreatePduClient(m_firstAcdServer.m_sAcdServerIpAddr,
  306. m_firstAcdServer.m_nAcdServerPort,
  307. PDU_DEV_TYPE_AGENT, m_nAgentNumber,
  308. PDU_DEV_TYPE_ACD, m_firstAcdServer.m_nAcdServerId, m_bAutoReconnect ? true : false))
  309. {
  310. SetErrorCode( ERR_CREATE_SOCKET );
  311. GetEventManager()->Fire_Evt_LogIn(false, ERR_CREATE_SOCKET);
  312. m_nAgentLinkState = PDU_LINK_STATE_FAILED;
  313. GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_FAILED);
  314. return FALSE;
  315. }
  316. return TRUE;
  317. }
  318. /*****************************************************************
  319. **【函数名称】 CloseClient
  320. **【函数功能】 关闭scoket
  321. **【参数】
  322. **【返回值】 void
  323. ****************************************************************/
  324. BOOL CAgentClient::CloseClient()
  325. {
  326. return CInterfaceWindow::getLinkInstance()->ClosePduClient(PDU_DEV_TYPE_ACD, m_firstAcdServer.m_nAcdServerId);
  327. }
  328. /*****************************************************************
  329. **【函数名称】 OnLinkStateChanged
  330. **【函数功能】 PDU连接状态变化事件处理
  331. **【参数】
  332. **【返回值】 void
  333. ****************************************************************/
  334. void CAgentClient::OnLinkStateChanged(const PduLinkContent& linkContent)
  335. {
  336. m_nAgentLinkState = linkContent.nLinkState; // 保存连接状态
  337. m_bIsConnInfoChange = TRUE; // 设置连接变化状态标识为TRUE
  338. switch(m_nAgentLinkState)
  339. {
  340. case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
  341. {
  342. GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_SUCCESSED);
  343. }
  344. break;
  345. case PDU_LINK_STATE_FAILED: // 请求连接失败
  346. {
  347. GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_FAILED);
  348. SetErrorCode(ERR_NO_ACD);
  349. GetEventManager()->Fire_Evt_LogIn(false, ERR_NO_ACD);
  350. }
  351. break;
  352. case PDU_LINK_STATE_REG_OK: // 注册成功
  353. {
  354. GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_REG_OK);
  355. // 发送签入命令
  356. m_pAgentOp->Login();
  357. }
  358. break;
  359. case PDU_LINK_STATE_REG_FAILED: // 注册失败
  360. {
  361. GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_REG_FAILED);
  362. SetErrorCode(ERR_BIND_AGENT);
  363. GetEventManager()->Fire_Evt_LogIn(false, ERR_BIND_AGENT);
  364. }
  365. break;
  366. case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
  367. {
  368. GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_DISCONNECTED);
  369. }
  370. break;
  371. default:
  372. break;
  373. }
  374. }