驻马店视频中间件项目,与标准版stand区分

TaskAgentThreeTalk.cpp 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "stdafx.h"
  2. #include "TaskAgentThreeTalk.h"
  3. #include "LineHolder.h"
  4. #include "LogicLine.h"
  5. #include "StatisticsMgr.h"
  6. #include "CtiCore.h"
  7. CTaskAgentThreeTalk::CTaskAgentThreeTalk( CPduEntity &PduEntity ) : CTask( PduEntity )
  8. {
  9. }
  10. CTaskAgentThreeTalk::~CTaskAgentThreeTalk( void )
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 DoTask
  15. **【函数功能】 Task处理
  16. **【参数】
  17. **【返回值】 void
  18. ****************************************************************/
  19. BOOL CTaskAgentThreeTalk::DoTask()
  20. {
  21. // 显示日志
  22. ShowLog();
  23. // 校验
  24. if( !Verify() ) return FALSE;
  25. m_pCurrLine->opType() = PDU_CMD_AGENT_THREETALK;
  26. if (m_CurrCmd.GetDataString(4).IsEmpty() || m_CurrCmd.GetDataString(4) == "")
  27. m_CurrCmd.SetDataString(4, m_pCurrLine->callerNum());
  28. // 向底层设备发送三方通话
  29. LineOpParam pLineOpParam;
  30. memset( &pLineOpParam, 0, sizeof( pLineOpParam ) );
  31. pLineOpParam.nParam1 = m_pCurrLine->callId();
  32. lstrcpy( pLineOpParam.szParam1, m_CurrCmd.GetDataString( 4 ) );
  33. lstrcpy( pLineOpParam.szParam2, m_CurrCmd.GetDataString( 3 ) );
  34. return CCtiCore::GetInstance().getDevLink().exec( ( long )this, LINE_OP_CONFERENCE, m_pCurrLine->lineId(), &pLineOpParam );
  35. }
  36. /*****************************************************************
  37. **【函数名称】 Verify
  38. **【函数功能】 校验
  39. **【参数】
  40. **【返回值】 BOOL
  41. ****************************************************************/
  42. BOOL CTaskAgentThreeTalk::Verify()
  43. {
  44. // 线路绑定校验
  45. if( !_bindLogicLine( m_CurrCmd.GetDataUInt( 1 ) ) )
  46. return FALSE;
  47. // 本端线路状态校验
  48. if( m_pCurrLine->status() != INNER_STATE_TALKING )
  49. {
  50. ILogger::getInstance().log( LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T( "{Task}: 线路[%d]执行座席三方任务校验时失败:当前线路未在通话中" ), m_pCurrLine->lineId() );
  51. return FALSE;
  52. }
  53. // 对端线路状态验证
  54. int nAssoLineId;
  55. sscanf_s( m_CurrCmd.GetDataString( 3 ).GetBuffer(), "%d", &nAssoLineId );
  56. CLogicLine *pAssoLine = CLineHolder::GetInstance().getLogicLine( nAssoLineId );
  57. if( pAssoLine != NULL && pAssoLine->type() == DEV_RES_TYPE_EXT &&
  58. pAssoLine->status() != INNER_STATE_INIT &&
  59. pAssoLine->status() != INNER_STATE_FREE )
  60. {
  61. ILogger::getInstance().log( LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T( "{Task}: 线路[%d]执行座席三方任务校验时失败:关联线路状态校验不通过" ), m_pCurrLine->lineId() );
  62. return FALSE;
  63. }
  64. return TRUE;
  65. }
  66. /*****************************************************************
  67. **【函数名称】 ShowLog
  68. **【函数功能】 显示日志
  69. **【参数】
  70. **【返回值】 void
  71. ****************************************************************/
  72. void CTaskAgentThreeTalk::ShowLog()
  73. {
  74. // 显示日志
  75. ILogger::getInstance().log( LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T( "AGENT->CTI, CMD = [座席三方], \
  76. Exten = %d DestNum = %s" ),
  77. m_CurrCmd.GetDataUInt( 1 ),
  78. m_CurrCmd.GetDataString( 3 ) );
  79. }
  80. /*****************************************************************
  81. **【函数名称】 ProcLineOpProcess
  82. **【函数功能】 处理设备操作进展
  83. **【参数】 EvtType 消息事件类型;lpContent 消息内容
  84. **【返回值】 void
  85. ****************************************************************/
  86. void CTaskAgentThreeTalk::OnDevOpProcess( EventOpProcess &EvtInfo )
  87. {
  88. // 处理会话
  89. _PrcoCallNode( m_pCurrLine->lineId(), EvtInfo.nAssoLine );
  90. //获取对端线路
  91. CLogicLine *pAssoLine = CLineHolder::GetInstance().getLogicLine( EvtInfo.nAssoLine );
  92. if( pAssoLine == NULL ) return;
  93. // 统计 REP_EVENT_CONFERENCE
  94. T_EvtConference repInfoConf;
  95. memset( &repInfoConf, 0, sizeof( repInfoConf ) );
  96. repInfoConf.nPeerLineType = pAssoLine->type(); // 对端线路类型
  97. repInfoConf.nCallerAgentId = m_pCurrLine->getAgentNum(); // 主叫坐席工号
  98. repInfoConf.nCalleeAgentId = pAssoLine->getAgentNum(); // 被叫坐席工号
  99. lstrcpy( repInfoConf.szCalleeNum, m_CurrCmd.GetDataString( 3 ) ); // 三方号码
  100. repInfoConf.szTrunkId = pAssoLine->lineId(); // 被转移线路Id
  101. CStatisticsMgr::GetInstance().onCallDetail( m_pCurrLine->callId(), REP_EVENT_CONFERENCE, m_pCurrLine->lineId(), &repInfoConf );
  102. // 统计 REP_EVENT_EXT_CALL_IN
  103. if( pAssoLine->type() != DEV_RES_TYPE_EXT )
  104. return;
  105. T_EvtExtCallIn repInfoCallIn;
  106. memset( &repInfoCallIn, 0, sizeof( repInfoCallIn ) );
  107. repInfoCallIn.nCallType = 3; // 呼入方式(1:转坐席呼入,2:转移呼入,3:会议呼入)
  108. repInfoCallIn.nPeerLineType = m_pCurrLine->type(); // 对端线路类型
  109. repInfoCallIn.nCallerAgentId = m_pCurrLine->getAgentNum(); // 主叫坐席工号
  110. sprintf_s( repInfoCallIn.szCallerNum, REP_PHONE_NUM_LENGTH, "%d", m_pCurrLine->lineId() ); // 主叫号码
  111. repInfoCallIn.nCalleeAgentId = pAssoLine->getAgentNum(); // 被叫坐席工号
  112. CStatisticsMgr::GetInstance().onCallDetail( pAssoLine->callId(), REP_EVENT_EXT_CALL_IN, pAssoLine->lineId(), &repInfoCallIn );
  113. }
  114. /*****************************************************************
  115. **【函数名称】 OnDevOpResult
  116. **【函数功能】 设备操作结果返回
  117. **【参数】
  118. **【返回值】 void
  119. ****************************************************************/
  120. BOOL CTaskAgentThreeTalk::OnDevOpResult( EventOpResult &EvtInfo )
  121. {
  122. // 命令返回
  123. _ProcCmdReturn( EvtInfo.bIsSucceed );
  124. // 统计
  125. T_EvtConference repInfo;
  126. memset( &repInfo, 0, sizeof( repInfo ) );
  127. repInfo.bEvtResult = EvtInfo.bIsSucceed;
  128. CStatisticsMgr::GetInstance().onCallDetail( m_TaskCallId, REP_EVENT_CONF_RESULT, m_pCurrLine->lineId(), &repInfo );
  129. return TRUE;
  130. }