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

AgentMsgProc.cpp 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. #include "StdAfx.h"
  2. #include "AgentMsgProc.h"
  3. #include "NetCtrlInterface.h"
  4. #include "PduEntity.h"
  5. #include "AgentClient.h"
  6. #include "AgentEventManager.h"
  7. #include "AgentLog.h"
  8. #include "TFBCtrl.h"
  9. #include "AgentOp.h"
  10. #include "PduDataFormat.h"
  11. #include "TFBTimer.h"
  12. CAgentMsgProc::CAgentMsgProc(CAgentClient* pClient)
  13. {
  14. m_pAgentClient = pClient;
  15. // 注册PDU命令到达事件处理
  16. CInterfaceWindow::getCommInstance()->RegistPduCommProc(this, TRUE);
  17. }
  18. CAgentMsgProc::~CAgentMsgProc(void)
  19. {
  20. // PDU命令到达事件反注册
  21. CInterfaceWindow::getCommInstance()->RegistPduCommProc(this, FALSE);
  22. }
  23. /*****************************************************************
  24. **【函数名称】 OnRecvCommand
  25. **【函数功能】 PDU命令到达事件处理
  26. **【参数】
  27. **【返回值】 void
  28. ****************************************************************/
  29. void CAgentMsgProc::OnRecvCommand(CPduEntity* a_pPduEntity)
  30. {
  31. if(a_pPduEntity->GetIsExecReturn())
  32. {
  33. __ProcCmdReturn(a_pPduEntity); // 处理ACD的返回命令
  34. }
  35. else
  36. {
  37. __ProcCmdAcd(a_pPduEntity); // 处理ACD主动发来的命令
  38. }
  39. }
  40. /*****************************************************************
  41. **【函数名称】 __ProcCmdReturn
  42. **【函数功能】 PDU返回命令处理
  43. **【参数】
  44. **【返回值】 void
  45. ****************************************************************/
  46. void CAgentMsgProc::__ProcCmdReturn(CPduEntity* a_pPduEntity)
  47. {
  48. switch(a_pPduEntity->GetCmdType())
  49. {
  50. case PDU_CMD_AGENT_LOGIN: // 签入
  51. {
  52. if(a_pPduEntity->GetDataBool(0))
  53. {
  54. // 签入成功
  55. m_pAgentClient->GetEventManager()->Fire_Evt_LogIn( true, 0 );
  56. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_LOGIN 成功" );
  57. }
  58. else
  59. {
  60. int nErrCode = (int)a_pPduEntity->GetDataUInt(6);
  61. m_pAgentClient->SetErrorCode(nErrCode);
  62. m_pAgentClient->GetEventManager()->Fire_Evt_LogIn( false, nErrCode);
  63. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_LOGIN 失败" );
  64. // 关闭Socket连接
  65. if(!m_pAgentClient->CloseClient())
  66. {
  67. m_pAgentClient->SetErrorCode( ERR_CLOSE_SOCKET );
  68. m_pAgentClient->GetEventManager()->Fire_Evt_SysError( ERR_CLOSE_SOCKET );
  69. return;
  70. }
  71. // 设置连接状态
  72. m_pAgentClient->m_nAgentLinkState = PDU_LINK_STATE_DISCONNECTED;
  73. m_pAgentClient->GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_DISCONNECTED);
  74. }
  75. }
  76. break;
  77. case PDU_CMD_AGENT_SETSTATE: // 设置坐席状态
  78. {
  79. if(a_pPduEntity->GetDataUInt(3) == AGENT_STATE_FREE)
  80. {
  81. // 示闲成功
  82. if(a_pPduEntity->GetDataBool(0))
  83. {
  84. m_pAgentClient->GetEventManager()->Fire_Evt_SayFree( true, 0 );
  85. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_SETSTATE->AGENT_STATE_FREE 成功" );
  86. }
  87. else
  88. {
  89. m_pAgentClient->SetErrorCode( ERR_SAY_FREE );
  90. m_pAgentClient->GetEventManager()->Fire_Evt_SayFree( false, ERR_SAY_FREE );
  91. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_SETSTATE->AGENT_STATE_FREE 失败" );
  92. }
  93. }
  94. else if(a_pPduEntity->GetDataUInt(3) == AGENT_STATE_REPOSE)
  95. {
  96. // 示忙成功
  97. if(a_pPduEntity->GetDataBool(0))
  98. {
  99. m_pAgentClient->GetEventManager()->Fire_Evt_SayBusy( true, 0 );
  100. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_SETSTATE->AGENT_STATE_FREE 成功" );
  101. }
  102. else
  103. {
  104. m_pAgentClient->SetErrorCode( ERR_SAY_BUSY );
  105. m_pAgentClient->GetEventManager()->Fire_Evt_SayBusy( false, ERR_SAY_BUSY );
  106. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_SETSTATE->Fire_Evt_SayBusy 失败" );
  107. }
  108. }
  109. }
  110. break;
  111. case PDU_CMD_AGENT_RESET: // 重置
  112. {
  113. if(a_pPduEntity->GetDataBool(0))
  114. {
  115. m_pAgentClient->GetEventManager()->Fire_Evt_ResetAgent( true, 0 );
  116. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_RESET 成功" );
  117. }
  118. else
  119. {
  120. m_pAgentClient->SetErrorCode( ERR_RESET_AGENT );
  121. m_pAgentClient->GetEventManager()->Fire_Evt_ResetAgent( false, ERR_RESET_AGENT );
  122. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_RESET 失败" );
  123. }
  124. }
  125. break;
  126. case PDU_CMD_AGENT_MAKECALL: // 外呼
  127. {
  128. if(a_pPduEntity->GetDataBool(0))
  129. {
  130. m_pAgentClient->GetEventManager()->Fire_Evt_MakeCall( true,
  131. a_pPduEntity->GetDataUInt(6),
  132. m_pAgentClient->m_sOuterNumber,
  133. m_pAgentClient->m_nCallID, 0);
  134. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MAKECALL 成功" );
  135. }
  136. else
  137. {
  138. m_pAgentClient->SetErrorCode( ERR_MAKE_CALL );
  139. m_pAgentClient->GetEventManager()->Fire_Evt_MakeCall( false,
  140. a_pPduEntity->GetDataUInt(6),
  141. m_pAgentClient->m_sOuterNumber,
  142. m_pAgentClient->m_nCallID,
  143. ERR_MAKE_CALL);
  144. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MAKECALL 失败" );
  145. }
  146. }
  147. break;
  148. case PDU_CMD_AGENT_ANSWER: // 应答
  149. {
  150. if(a_pPduEntity->GetDataBool(0))
  151. {
  152. m_pAgentClient->GetEventManager()->Fire_Evt_AnswerCall( true, m_pAgentClient->m_nCallID, 0);
  153. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_ANSWER 成功" );
  154. }
  155. else
  156. {
  157. m_pAgentClient->SetErrorCode( ERR_ANSWER_CALL );
  158. m_pAgentClient->GetEventManager()->Fire_Evt_AnswerCall( false, m_pAgentClient->m_nCallID, ERR_ANSWER_CALL);
  159. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_ANSWER 失败" );
  160. }
  161. }
  162. break;
  163. case PDU_CMD_AGENT_HANGUP: // 挂机
  164. {
  165. if(a_pPduEntity->GetDataBool(0))
  166. {
  167. m_pAgentClient->GetEventManager()->Fire_Evt_DropCall( true, 1, m_pAgentClient->m_nCallID, 0);
  168. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_HANGUP 成功" );
  169. }
  170. else
  171. {
  172. m_pAgentClient->SetErrorCode( ERR_DROP_CALL );
  173. m_pAgentClient->GetEventManager()->Fire_Evt_DropCall( false, 1, m_pAgentClient->m_nCallID, ERR_DROP_CALL);
  174. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_HANGUP 失败" );
  175. }
  176. }
  177. break;
  178. case PDU_CMD_AGENT_CANCEL: // 取消操作
  179. {
  180. if(a_pPduEntity->GetDataBool(0))
  181. {
  182. m_pAgentClient->GetEventManager()->Fire_Evt_Cancel( true, m_pAgentClient->m_nCallID, 0);
  183. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_CANCEL 成功" );
  184. }
  185. else
  186. {
  187. m_pAgentClient->SetErrorCode( ERR_CANCEL );
  188. m_pAgentClient->GetEventManager()->Fire_Evt_Cancel( false, m_pAgentClient->m_nCallID, ERR_DROP_CALL);
  189. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_CANCEL 失败" );
  190. }
  191. }
  192. break;
  193. case PDU_CMD_AGENT_HOLD: // 保持
  194. {
  195. if(a_pPduEntity->GetDataBool(0))
  196. {
  197. m_pAgentClient->GetEventManager()->Fire_Evt_Hold( true, m_pAgentClient->m_nCallID, 0);
  198. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_HOLD 成功" );
  199. }
  200. else
  201. {
  202. m_pAgentClient->SetErrorCode( ERR_HOLD );
  203. m_pAgentClient->GetEventManager()->Fire_Evt_Hold( false, m_pAgentClient->m_nCallID, ERR_HOLD);
  204. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_HOLD 失败" );
  205. }
  206. }
  207. break;
  208. case PDU_CMD_AGENT_TAKEBACK: // 接回
  209. {
  210. if(a_pPduEntity->GetDataBool(0))
  211. {
  212. m_pAgentClient->GetEventManager()->Fire_Evt_UnHold( true, m_pAgentClient->m_nCallID, 0);
  213. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_TAKEBACK 成功" );
  214. }
  215. else
  216. {
  217. m_pAgentClient->SetErrorCode( ERR_UN_HOLD );
  218. m_pAgentClient->GetEventManager()->Fire_Evt_UnHold( false, m_pAgentClient->m_nCallID, ERR_UN_HOLD);
  219. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_TAKEBACK 失败" );
  220. }
  221. }
  222. break;
  223. case PDU_CMD_AGENT_TRANSTALK: // 转移
  224. {
  225. if(a_pPduEntity->GetDataBool(0))
  226. {
  227. m_pAgentClient->GetEventManager()->Fire_Evt_Transfer( true, m_pAgentClient->m_nCallID, 0);
  228. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_TRANSTALK 成功" );
  229. }
  230. else
  231. {
  232. m_pAgentClient->SetErrorCode( ERR_TRANSFER );
  233. m_pAgentClient->GetEventManager()->Fire_Evt_Transfer( false, m_pAgentClient->m_nCallID, ERR_TRANSFER);
  234. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_TRANSTALK 失败" );
  235. }
  236. }
  237. break;
  238. case PDU_CMD_AGENT_THREETALK: // 三方
  239. {
  240. if(a_pPduEntity->GetDataBool(0))
  241. {
  242. m_pAgentClient->GetEventManager()->Fire_Evt_ThreeTalk( true, m_pAgentClient->m_nCallID, 0);
  243. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_THREETALK 成功" );
  244. }
  245. else
  246. {
  247. m_pAgentClient->SetErrorCode( ERR_THREE_TALK );
  248. m_pAgentClient->GetEventManager()->Fire_Evt_ThreeTalk( false, m_pAgentClient->m_nCallID, ERR_THREE_TALK);
  249. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_THREETALK 失败" );
  250. }
  251. }
  252. break;
  253. case PDU_CMD_AGENT_MONI_REPLACE: // 代接返回
  254. {
  255. if(a_pPduEntity->GetDataBool(0))
  256. {
  257. m_pAgentClient->GetEventManager()->Fire_Evt_Instead( true, m_pAgentClient->m_nCallID, 0);
  258. }
  259. else
  260. {
  261. m_pAgentClient->SetErrorCode( ERR_INSTEAD );
  262. m_pAgentClient->GetEventManager()->Fire_Evt_Instead( false, m_pAgentClient->m_nCallID, ERR_INSTEAD);
  263. }
  264. }
  265. break;
  266. case PDU_CMD_AGENT_MONI_LISTEN: // 监听座席
  267. {
  268. if(a_pPduEntity->GetDataBool(0))
  269. {
  270. m_pAgentClient->GetEventManager()->Fire_Evt_ListenAgent( true, m_pAgentClient->m_nCallID, 0);
  271. }
  272. else
  273. {
  274. m_pAgentClient->SetErrorCode( ERR_LISTEN_AGENT );
  275. m_pAgentClient->GetEventManager()->Fire_Evt_ListenAgent( false, m_pAgentClient->m_nCallID, ERR_LISTEN_AGENT);
  276. }
  277. }
  278. break;
  279. case PDU_CMD_AGENT_MONI_INSERT: // 强插座席
  280. {
  281. if(a_pPduEntity->GetDataBool(0))
  282. {
  283. m_pAgentClient->GetEventManager()->Fire_Evt_InsertAgent( true, m_pAgentClient->m_nCallID, 0);
  284. }
  285. else
  286. {
  287. m_pAgentClient->SetErrorCode( ERR_INSERT_AGENT );
  288. m_pAgentClient->GetEventManager()->Fire_Evt_InsertAgent( false, m_pAgentClient->m_nCallID, ERR_INSERT_AGENT);
  289. }
  290. }
  291. break;
  292. case PDU_CMD_AGENT_MONI_INTERCEPT: // 强截座席
  293. {
  294. if(a_pPduEntity->GetDataBool(0))
  295. {
  296. m_pAgentClient->GetEventManager()->Fire_Evt_InterceptAgent( true, m_pAgentClient->m_nCallID, 0);
  297. }
  298. else
  299. {
  300. m_pAgentClient->SetErrorCode( ERR_INTERCEPT_AGENT );
  301. m_pAgentClient->GetEventManager()->Fire_Evt_InterceptAgent( false, m_pAgentClient->m_nCallID, ERR_INTERCEPT_AGENT);
  302. }
  303. }
  304. break;
  305. case PDU_CMD_AGENT_MONI_CUT: // 强拆座席
  306. {
  307. if(a_pPduEntity->GetDataBool(0))
  308. {
  309. m_pAgentClient->GetEventManager()->Fire_Evt_CutAgent( true, m_pAgentClient->m_nCallID, 0);
  310. }
  311. else
  312. {
  313. m_pAgentClient->SetErrorCode( ERR_CUT_AGENT );
  314. m_pAgentClient->GetEventManager()->Fire_Evt_CutAgent( false, m_pAgentClient->m_nCallID, ERR_CUT_AGENT);
  315. }
  316. }
  317. break;
  318. case PDU_CMD_AGENT_FAX: // 传真
  319. {
  320. if(a_pPduEntity->GetDataBool(0))
  321. {
  322. if(a_pPduEntity->GetDataUInt(4) == 0)
  323. m_pAgentClient->GetEventManager()->Fire_Evt_SendFax( true, m_pAgentClient->m_nCallID, 0);
  324. else
  325. m_pAgentClient->GetEventManager()->Fire_Evt_RecvFax( true, m_pAgentClient->m_nCallID, 0);
  326. }
  327. else
  328. {
  329. if(a_pPduEntity->GetDataUInt(4) == 0)
  330. {
  331. m_pAgentClient->SetErrorCode( ERR_SEND_FAX );
  332. m_pAgentClient->GetEventManager()->Fire_Evt_SendFax( false, m_pAgentClient->m_nCallID, ERR_SEND_FAX);
  333. }
  334. else
  335. {
  336. m_pAgentClient->SetErrorCode( ERR_RECV_FAX );
  337. m_pAgentClient->GetEventManager()->Fire_Evt_RecvFax( false, m_pAgentClient->m_nCallID, ERR_RECV_FAX);
  338. }
  339. }
  340. }
  341. break;
  342. case PDU_CMD_AGENT_TURN_TO_IVR: // 转IVR
  343. {
  344. if(a_pPduEntity->GetDataBool(0))
  345. {
  346. m_pAgentClient->GetEventManager()->Fire_Evt_TransferToIvr( true, m_pAgentClient->m_nCallID, 0);
  347. }
  348. else
  349. {
  350. m_pAgentClient->SetErrorCode( ERR_TRANSFER_TO_IVR );
  351. m_pAgentClient->GetEventManager()->Fire_Evt_TransferToIvr( false, m_pAgentClient->m_nCallID, ERR_TRANSFER_TO_IVR);
  352. }
  353. }
  354. break;
  355. case PDU_CMD_AGENT_MONI_FORCE_LOGOUT: // 强制签出
  356. {
  357. if(a_pPduEntity->GetDataBool(0))
  358. {
  359. m_pAgentClient->GetEventManager()->Fire_Evt_ForceLogOut( true, 0);
  360. }
  361. else
  362. {
  363. m_pAgentClient->SetErrorCode( ERR_FORCE_LOGOUT_AGENT );
  364. m_pAgentClient->GetEventManager()->Fire_Evt_ForceLogOut( false, ERR_FORCE_CONTROL_AGENT);
  365. }
  366. }
  367. break;
  368. case PDU_CMD_AGENT_MONI_FORCE_STATE: // 被强制签出事件
  369. {
  370. if(a_pPduEntity->GetDataBool(0))
  371. {
  372. m_pAgentClient->GetEventManager()->Fire_Evt_ForceControlAgent( true, m_pAgentClient->m_nCallID, 0);
  373. }
  374. else
  375. {
  376. m_pAgentClient->SetErrorCode( ERR_FORCE_CONTROL_AGENT );
  377. m_pAgentClient->GetEventManager()->Fire_Evt_ForceControlAgent( false, m_pAgentClient->m_nCallID, ERR_FORCE_CONTROL_AGENT);
  378. }
  379. }
  380. break;
  381. case PDU_CMD_AGENT_CONSULTATION_CALL: // 协商呼叫结果
  382. {
  383. if(a_pPduEntity->GetDataBool(0))
  384. {
  385. m_pAgentClient->GetEventManager()->Fire_Evt_Consult(true, m_pAgentClient->m_nCallID, 0);
  386. }
  387. else
  388. {
  389. m_pAgentClient->SetErrorCode(ERR_CONSULTATION_CALL);
  390. m_pAgentClient->GetEventManager()->Fire_Evt_Consult(false, m_pAgentClient->m_nCallID, ERR_CONSULTATION_CALL);
  391. }
  392. }
  393. break;
  394. case PDU_CMD_AGENT_CONFIRM_TRANSFER: // 确认转移结果
  395. {
  396. if(a_pPduEntity->GetDataBool(0))
  397. {
  398. m_pAgentClient->GetEventManager()->Fire_Evt_Confirm(true, m_pAgentClient->m_nCallID, 0);
  399. }
  400. else
  401. {
  402. m_pAgentClient->SetErrorCode(ERR_CONFIRM_TRANSFER);
  403. m_pAgentClient->GetEventManager()->Fire_Evt_Confirm(false, m_pAgentClient->m_nCallID, ERR_CONFIRM_TRANSFER);
  404. }
  405. }
  406. break;
  407. case PDU_CMD_AGENT_MUTE: // 静音
  408. {
  409. if(a_pPduEntity->GetDataUInt(3) == 0) // 开始静音
  410. {
  411. if(a_pPduEntity->GetDataBool(0))
  412. {
  413. m_pAgentClient->GetEventManager()->Fire_Evt_BeginMute( true, m_pAgentClient->m_nCallID, 0);
  414. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MUTE 成功" );
  415. }
  416. else
  417. {
  418. m_pAgentClient->SetErrorCode( ERR_HOLD );
  419. m_pAgentClient->GetEventManager()->Fire_Evt_BeginMute( false, m_pAgentClient->m_nCallID, ERR_BEGIN_MUTE);
  420. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MUTE 失败" );
  421. }
  422. }
  423. else
  424. {
  425. if(a_pPduEntity->GetDataBool(0))
  426. {
  427. m_pAgentClient->GetEventManager()->Fire_Evt_EndMute( true, m_pAgentClient->m_nCallID, 0);
  428. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MUTE 成功" );
  429. }
  430. else
  431. {
  432. m_pAgentClient->SetErrorCode( ERR_HOLD );
  433. m_pAgentClient->GetEventManager()->Fire_Evt_EndMute( false, m_pAgentClient->m_nCallID, ERR_END_MUTE);
  434. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:PDU_CMD_AGENT_MUTE 失败" );
  435. }
  436. }
  437. }
  438. break;
  439. default:
  440. break;
  441. }
  442. }
  443. /*****************************************************************
  444. **【函数名称】 __ProcCmdAcd
  445. **【函数功能】 ACD主动发送命令处理
  446. **【参数】
  447. **【返回值】 void
  448. ****************************************************************/
  449. void CAgentMsgProc::__ProcCmdAcd(CPduEntity* a_pPduEntity)
  450. {
  451. ASSERT(a_pPduEntity != NULL);
  452. switch(a_pPduEntity->GetCmdType())
  453. {
  454. case PDU_CMD_ACD_AGENT_STATE: // 坐席状态
  455. {
  456. __ProcAgentStateChanged(a_pPduEntity);
  457. }
  458. break;
  459. case PDU_CMD_CTI_LINE_STATE: // 线路状态
  460. {
  461. __ProcLineStateChanged(a_pPduEntity);
  462. }
  463. break;
  464. case PDU_CMD_CTI_DEV_CALL: // 分机物理外呼
  465. {
  466. m_pAgentClient->GetEventManager()->Fire_Evt_MakeCall(a_pPduEntity->GetDataBool(0),
  467. a_pPduEntity->GetDataUInt(5),
  468. a_pPduEntity->GetDataString(4),
  469. a_pPduEntity->GetDataULong(3),
  470. 0);
  471. }
  472. break;
  473. case PDU_CMD_ACD_CALL_NUM: // 来电数量
  474. {
  475. // 触发来电数量事件
  476. m_pAgentClient->GetEventManager()->Fire_Evt_CallInQueue_Changed(a_pPduEntity->GetDataUInt(0));
  477. }
  478. break;
  479. case PDU_CMD_CTI_RECORD: // 录音信息
  480. {
  481. // 设置坐席的录音文件路径
  482. m_pAgentClient->m_sRecordFilePath = a_pPduEntity->GetDataString(2);
  483. // 触发开始录音事件
  484. m_pAgentClient->GetEventManager()->Fire_Evt_RecordInform(a_pPduEntity->GetDataString(2),
  485. m_pAgentClient->m_nCallID);
  486. }
  487. break;
  488. case PDU_CMD_ACD_SUBMIT_DATA: // 订阅事件变化通知
  489. {
  490. m_pAgentClient->GetEventManager()->Fire_Evt_SubDataChanged(a_pPduEntity->GetDataUInt(2),
  491. a_pPduEntity->GetDataUInt(0),
  492. a_pPduEntity->GetDataUInt(1),
  493. a_pPduEntity->GetDataString(3));
  494. }
  495. break;
  496. case PDU_CMD_AGENT_MONI_FORCE_LOGOUT: // 被强制签出
  497. {
  498. __ProcForceLogOut();
  499. m_pAgentClient->GetEventManager()->Fire_Evt_LogOutByForce(a_pPduEntity->GetDataUInt(2),
  500. a_pPduEntity->GetDataString(5));
  501. }
  502. break;
  503. default:
  504. break;
  505. }
  506. }
  507. /*****************************************************************
  508. **【函数名称】 __ProcForceLogOut
  509. **【函数功能】 处理坐席被强制签出
  510. **【参数】
  511. **【返回值】 void
  512. ****************************************************************/
  513. void CAgentMsgProc::__ProcForceLogOut()
  514. {
  515. // 关闭Socket连接
  516. if(!m_pAgentClient->CloseClient())
  517. {
  518. m_pAgentClient->SetErrorCode( ERR_CLOSE_SOCKET );
  519. m_pAgentClient->GetEventManager()->Fire_Evt_SysError( ERR_CLOSE_SOCKET );
  520. m_pAgentClient->GetEventManager()->Fire_Evt_LogOut(false, ERR_CLOSE_SOCKET);
  521. return;
  522. }
  523. // 签出成功
  524. m_pAgentClient->GetEventManager()->Fire_Evt_LogOut( true, 0 );
  525. m_pAgentClient->GetAgentLog()->Log( "ACD返回执行结果:Cmd_Agent_Acd_LogOut 成功" );
  526. // 坐席信息反初始化
  527. m_pAgentClient->m_nAgentState = AGENT_STATE_LOGOUT;
  528. m_pAgentClient->GetEventManager()->Fire_Evt_AgentStateChanged( m_pAgentClient->m_nAgentState );
  529. m_pAgentClient->m_nAgentLineState = INNER_STATE_DISABLED;
  530. m_pAgentClient->GetEventManager()->Fire_Evt_AgentLineStateChanged( m_pAgentClient->m_nAgentLineState );
  531. // 触发连接断开事件
  532. m_pAgentClient->m_nAgentLinkState = PDU_LINK_STATE_DISCONNECTED;
  533. m_pAgentClient->GetEventManager()->Fire_Evt_AgentLinkStateChanged(PDU_LINK_STATE_DISCONNECTED);
  534. }
  535. /*****************************************************************
  536. **【函数名称】 __ProcAgentStateChanged
  537. **【函数功能】 处理坐席状态变化
  538. **【参数】
  539. **【返回值】 void
  540. ****************************************************************/
  541. void CAgentMsgProc::__ProcAgentStateChanged(CPduEntity* a_pPduEntity)
  542. {
  543. // 判断是否是当前坐席
  544. if( a_pPduEntity->GetDataUInt(1) == m_pAgentClient->m_nAgentNumber )
  545. {
  546. // 分析坐席状态
  547. __AnalyzeAgentState(a_pPduEntity);
  548. // 保存信息
  549. m_pAgentClient->m_nAgentState = a_pPduEntity->GetDataUInt(2);
  550. m_pAgentClient->GetEventManager()->Fire_Evt_AgentStateChanged( m_pAgentClient->m_nAgentState );
  551. }
  552. }
  553. /*****************************************************************
  554. **【函数名称】 __ProcLineStateChanged
  555. **【函数功能】 处理线路状态变化
  556. **【参数】
  557. **【返回值】 void
  558. ****************************************************************/
  559. void CAgentMsgProc::__ProcLineStateChanged(CPduEntity* a_pPduEntity)
  560. {
  561. // 判断是否是当前坐席
  562. if(a_pPduEntity->GetDataUInt(0) == m_pAgentClient->m_nAgentExtension )
  563. {
  564. // 分析线路状态
  565. __AnalyzeLineState(a_pPduEntity);
  566. // 保存信息
  567. m_pAgentClient->m_nCallID = a_pPduEntity->GetDataULong(2); // 设置坐席CallID
  568. m_pAgentClient->m_nAgentLineState = a_pPduEntity->GetDataUInt(1); // 保存线路状态
  569. // 触发线路状态变化事件
  570. m_pAgentClient->GetEventManager()->Fire_Evt_AgentLineStateChanged(a_pPduEntity->GetDataUInt(1));
  571. }
  572. }
  573. /*****************************************************************
  574. **【函数名称】 __AnalyzeAgentState
  575. **【函数功能】 分析坐席状态
  576. **【参数】
  577. **【返回值】 void
  578. ****************************************************************/
  579. void CAgentMsgProc::__AnalyzeAgentState(CPduEntity* a_pPduEntity)
  580. {
  581. return;
  582. }
  583. /*****************************************************************
  584. **【函数名称】 __AnalyzeLineState
  585. **【函数功能】 分析线路状态
  586. **【参数】
  587. **【返回值】 void
  588. ****************************************************************/
  589. void CAgentMsgProc::__AnalyzeLineState(CPduEntity* a_pPduEntity)
  590. {
  591. switch(a_pPduEntity->GetDataUInt(1))
  592. {
  593. case INNER_STATE_FREE:
  594. {
  595. // CallId不为0时线路空闲判定为挂机
  596. if(m_pAgentClient->m_nCallID != 0)
  597. {
  598. // 触发线路的挂机事件
  599. m_pAgentClient->GetEventManager()->Fire_Evt_Line_HangUp(1, a_pPduEntity->GetDataULong(2));
  600. // 清空外部号码
  601. m_pAgentClient->m_sOuterNumber.Empty();
  602. // 清空随路数据
  603. memset(m_pAgentClient->m_sAssoData, 0, MAX_DATA_BUF_LEN);
  604. }
  605. // 记录到日志
  606. m_pAgentClient->GetAgentLog()->Log( "Acd设置座席的线路状态为:INNER_STATE_FREE" );
  607. m_pAgentClient->GetAgentLog()->Log( "线路空闲" );
  608. }
  609. break;
  610. case INNER_STATE_TALKING:
  611. {
  612. // 通话中
  613. m_pAgentClient->GetEventManager()->Fire_Evt_Line_Talk(a_pPduEntity->GetDataULong(2));
  614. // 监听、强插在通话时发送外部号码信息
  615. if(a_pPduEntity->GetDataUInt(10) == PDU_CMD_AGENT_MONI_LISTEN ||
  616. a_pPduEntity->GetDataUInt(10) == PDU_CMD_AGENT_MONI_INSERT)
  617. {
  618. m_pAgentClient->GetEventManager()->Fire_Evt_Line_Talk(a_pPduEntity->GetDataULong(2),a_pPduEntity->GetDataString(5));
  619. }
  620. else if (a_pPduEntity->GetDataUInt(10) == PDU_CMD_AGENT_MONI_REPLACE ||
  621. a_pPduEntity->GetDataUInt(10) == PDU_CMD_AGENT_MONI_INTERCEPT)
  622. {
  623. m_pAgentClient->GetEventManager()->Fire_Evt_Line_Talk(a_pPduEntity->GetDataULong(2),a_pPduEntity->GetDataString(4));
  624. }
  625. }
  626. break;
  627. case INNER_STATE_ALERTING:
  628. {
  629. // 保存外部号码
  630. m_pAgentClient->m_sOuterNumber = a_pPduEntity->GetDataString(4);
  631. lstrcpy(m_pAgentClient->m_sAssoData, a_pPduEntity->GetDataString(6)); // 保存随路数据
  632. // 触发来电振铃事件
  633. m_pAgentClient->GetEventManager()->Fire_Evt_Line_Offering(m_pAgentClient->m_sOuterNumber,
  634. a_pPduEntity->GetDataUInt(7),
  635. a_pPduEntity->GetDataULong(2),
  636. a_pPduEntity->GetDataUInt(8));
  637. // 看是否自动应答
  638. if(m_pAgentClient->m_bAutoAnswer)
  639. {
  640. m_pAgentClient->GetAgentTimer()->SetTimerAnswer(1);
  641. }
  642. }
  643. break;
  644. case INNER_STATE_RING_BACK:
  645. {
  646. // 保存外部号码
  647. m_pAgentClient->m_sOuterNumber = a_pPduEntity->GetDataString(5);
  648. // 触发呼出振铃事件
  649. m_pAgentClient->GetEventManager()->Fire_Evt_Line_RingBack(m_pAgentClient->m_sOuterNumber,
  650. a_pPduEntity->GetDataULong(2));
  651. }
  652. default:
  653. break;
  654. } // end switch
  655. }