中间件底层,websocket

IncomingCall.cpp 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "StdAfx.h"
  2. #include "IncomingCall.h"
  3. #include "MsgCenter.h"
  4. #include "NetworkAcd.h"
  5. CIncomingCall::CIncomingCall(CPduEntity* pCmd)
  6. {
  7. updateQueueInfo(pCmd);
  8. }
  9. CIncomingCall::~CIncomingCall(void)
  10. {
  11. // 添加消息可供视图刷新
  12. CMsgCenter::GetInstance().pushMsg(ACD_MSG_CALL_FINISH, (const PARAM)m_IvrFlowId);
  13. }
  14. /*****************************************************************
  15. **【函数名称】 setCallState
  16. **【函数功能】 设置排队呼叫状态
  17. **【参数】
  18. **【返回值】
  19. ****************************************************************/
  20. void CIncomingCall::setCallState( OUTER_CALL_STATE State )
  21. {
  22. m_CallState = State;
  23. // 添加消息可供视图刷新
  24. CMsgCenter::GetInstance().pushMsg(ACD_MSG_CALL_INFO_UPDATE, (const PARAM)m_IvrFlowId);
  25. }
  26. /*****************************************************************
  27. **【函数名称】 updateQueueInfo
  28. **【函数功能】 更新请求排队信息
  29. **【参数】 pCmd: 更新排队信息的命令内容
  30. **【返回值】
  31. ****************************************************************/
  32. void CIncomingCall::updateQueueInfo( CPduEntity* pCmd )
  33. {
  34. // PDU命令
  35. m_Cmd = *pCmd;
  36. // 排队状态
  37. m_CallState = OUTER_CALL_WAITING;
  38. // 基础信息
  39. if(m_Cmd.GetCmdType() == PDU_CMD_IVR_WANT_AGENT) // 请求排队
  40. {
  41. m_IvrFlowId = m_Cmd.GetDataInt(1);
  42. m_CallId = m_Cmd.GetDataULong(2);
  43. m_AgentStrategy = (AGENT_STRATEGY)m_Cmd.GetDataUInt(3);
  44. m_GroupNo = m_Cmd.GetDataUInt(4);
  45. m_VipLevel = m_Cmd.GetDataInt(5);
  46. m_CallerNum = m_Cmd.GetDataString(6);
  47. m_InfoEx = m_Cmd.GetDataString(7);
  48. } // end if
  49. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, "{CIncomingCall}: 来电排队,m_GroupNo=%d Index = %d, CallId = %lu, CallerNum = %s,CmdType = %u",
  50. m_GroupNo,
  51. m_IvrFlowId,
  52. m_CallId,
  53. m_CallerNum,
  54. m_Cmd.GetCmdType());
  55. // 添加消息可供视图刷新
  56. CMsgCenter::GetInstance().pushMsg(ACD_MSG_CALL_INFO_UPDATE, (const PARAM)m_IvrFlowId);
  57. }
  58. /*****************************************************************
  59. **【函数名称】 onQueueOK
  60. **【函数功能】 请求座席成功处理
  61. **【参数】 AgentId: 成功请求到的座席工号
  62. Exten: 成功请求到的座席分机号
  63. **【返回值】
  64. ****************************************************************/
  65. void CIncomingCall::onQueueOK( UINT AgentId, UINT Exten )
  66. {
  67. // 发送执行结果返回命令
  68. m_Cmd.SetToExecReturn();
  69. m_Cmd.SetDataBool(0, true);
  70. if(m_Cmd.GetCmdType() == PDU_CMD_IVR_WANT_AGENT) // 请求座席命令
  71. {
  72. m_Cmd.SetDataUInt(9, AgentId);
  73. m_Cmd.SetDataUInt(10, Exten);
  74. }
  75. else // 继续请求排队命令
  76. {
  77. m_Cmd.SetDataUInt(7, AgentId);
  78. m_Cmd.SetDataUInt(8, Exten);
  79. } // end if
  80. CNetworkAcd::GetInstance().send2Cti(&m_Cmd);
  81. }
  82. /*****************************************************************
  83. **【函数名称】 onQueueFailed
  84. **【函数功能】 请求座席失败处理
  85. **【参数】 Reason: 失败原因
  86. **【返回值】
  87. ****************************************************************/
  88. void CIncomingCall::onQueueFailed( UINT Reason, UINT PosInQueue)
  89. {
  90. // 发送执行结果返回命令
  91. if(m_Cmd.GetCmdType() == PDU_CMD_IVR_WANT_AGENT) // 继续等待排队命令不需返回
  92. {
  93. // 暂停请求座席
  94. setCallState(OUTER_CALL_PAUSE);
  95. // 返回执行结果
  96. m_Cmd.SetToExecReturn();
  97. m_Cmd.SetDataBool(0, false);
  98. m_Cmd.SetDataUInt(8, Reason);
  99. m_Cmd.SetDataUInt(9, PosInQueue);
  100. CNetworkAcd::GetInstance().send2Cti(&m_Cmd);
  101. }
  102. else
  103. {
  104. setCallState(OUTER_CALL_WAITING);
  105. }
  106. }