中间件标准版5.1git,去除基础模块

TaskAgentConsulCall.cpp 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include"stdafx.h"
  2. #include "TaskAgentConsulCall.h"
  3. #include "LineHolder.h"
  4. #include "LogicLine.h"
  5. #include "LogicLineExt.h"
  6. #include "StatisticsMgr.h"
  7. #include "CtiCore.h"
  8. CTaskAgentConsulCall::CTaskAgentConsulCall(CPduEntity &PduEntity): CTask(PduEntity), m_OpStep(0)
  9. {
  10. }
  11. CTaskAgentConsulCall::~CTaskAgentConsulCall(void)
  12. {
  13. }
  14. /*****************************************************************
  15. **【函数名称】 DoTask
  16. **【函数功能】 Task处理
  17. **【参数】
  18. **【返回值】 void
  19. ****************************************************************/
  20. BOOL CTaskAgentConsulCall::DoTask()
  21. {
  22. // 显示日志
  23. ShowLog();
  24. // 校验
  25. if(!Verify()) return FALSE;
  26. // 设置当前操作类型
  27. m_pCurrLine->opType() = PDU_CMD_AGENT_CONSULTATION_CALL;
  28. // 向底层设备发送协商呼叫操作
  29. LineOpParam Param;
  30. memset(&Param, 0, sizeof(Param));
  31. lstrcpy(Param.szParam1, m_CurrCmd.GetDataString(5));
  32. lstrcpy(Param.szParam2, m_CurrCmd.GetDataString(4));
  33. return CCtiCore::GetInstance().getDevLink().exec((long)this, LINE_OP_CONSULT_CALL_BEGIN, m_pCurrLine->lineId(), &Param);
  34. }
  35. /*****************************************************************
  36. **【函数名称】 Verify
  37. **【函数功能】 校验
  38. **【参数】
  39. **【返回值】 BOOL
  40. ****************************************************************/
  41. BOOL CTaskAgentConsulCall::Verify()
  42. {
  43. // 线路绑定校验
  44. if(!_bindLogicLine(m_CurrCmd.GetDataUInt(1)))
  45. return FALSE;
  46. // 本端状态校验
  47. if(m_pCurrLine->status() != INNER_STATE_TALKING)
  48. {
  49. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Task}: 线路[%d]执行座席协商呼叫任务校验时失败:当前线路未在通话中"), m_pCurrLine->lineId());
  50. return FALSE;
  51. }
  52. return TRUE;
  53. }
  54. /*****************************************************************
  55. **【函数名称】 ShowLog
  56. **【函数功能】 显示日志
  57. **【参数】
  58. **【返回值】 void
  59. ****************************************************************/
  60. void CTaskAgentConsulCall::ShowLog()
  61. {
  62. // 显示日志
  63. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("AGENT->CTI, CMD = [座席协商呼叫], \
  64. Exten = %d, DestNum = %s"), m_CurrCmd.GetDataUInt(1), m_CurrCmd.GetDataString(4));
  65. }
  66. /*****************************************************************
  67. **【函数名称】 OnDevOpProcess
  68. **【函数功能】 处理设备操作进展
  69. **【参数】 EvtType 消息事件类型;lpContent 消息内容
  70. **【返回值】 void
  71. ****************************************************************/
  72. void CTaskAgentConsulCall::OnDevOpProcess(EventOpProcess &EvtInfo)
  73. {
  74. // 获取对端线路
  75. CLogicLine *pAssoLine = CLineHolder::GetInstance().getLogicLine(EvtInfo.nAssoLine);
  76. if(pAssoLine == NULL) return;
  77. // 处理会话
  78. _PrcoCallNode(m_pCurrLine->lineId(), EvtInfo.nAssoLine);
  79. // 获取主叫的工号
  80. CLogicLine *pCallerLine = CLineHolder::GetInstance().getLogicLine(atoi(EvtInfo.szCallerNum));
  81. UINT nCallerAgentId = (pCallerLine == NULL ? 0 : pCallerLine->getAgentNum());
  82. UINT nCurrLineId = m_pCurrLine->lineId();
  83. // 统计转移 REP_EVENT_TRANSFER
  84. T_EvtTransfer repInfoTransfer;
  85. memset(&repInfoTransfer, 0, sizeof(repInfoTransfer));
  86. repInfoTransfer.nPeerLineType = pAssoLine->type(); // 对端线路类型
  87. //lstrcpy(repInfoTransfer.szCallerNum, EvtInfo.szCallerNum); // 主叫号码
  88. //repInfoTransfer.nCallerAgentId = nCallerAgentId; // 主叫工号
  89. sprintf_s(repInfoTransfer.szCallerNum, "%lu", nCurrLineId); // 转移表中主叫号码为发起转移者的号码
  90. repInfoTransfer.nCallerAgentId = m_pCurrLine->getAgentNum(); // 主叫工号
  91. repInfoTransfer.nCalleeAgentId = pAssoLine->getAgentNum(); // 被叫坐席工号
  92. lstrcpy(repInfoTransfer.szCalleeNum, m_CurrCmd.GetDataString(4)); // 转移号码
  93. repInfoTransfer.szTrunkId = pAssoLine->lineId(); // 被转移线路Id
  94. CStatisticsMgr::GetInstance().onCallDetail(m_pCurrLine->callId(), REP_EVENT_TRANSFER, m_pCurrLine->lineId(), &repInfoTransfer);
  95. // 统计REP_EVENT_EXT_CALL_IN
  96. if(pAssoLine->type() != DEV_RES_TYPE_EXT)
  97. return;
  98. T_EvtExtCallIn repInfoCallIn;
  99. memset(&repInfoCallIn, 0, sizeof(repInfoCallIn));
  100. repInfoCallIn.nCallType = 2; // 呼入方式(1:转坐席呼入,2:转移呼入,3:会议呼入)
  101. repInfoCallIn.nPeerLineType = m_pCurrLine->type(); // 对端线路类型
  102. repInfoCallIn.nCallerAgentId = nCallerAgentId; // 主叫坐席工号
  103. lstrcpy(repInfoCallIn.szCallerNum, EvtInfo.szCallerNum); // 主叫号码
  104. repInfoCallIn.nCalleeAgentId = pAssoLine->getAgentNum(); // 被叫坐席工号
  105. CStatisticsMgr::GetInstance().onCallDetail(pAssoLine->callId(), REP_EVENT_EXT_CALL_IN, pAssoLine->lineId(), &repInfoCallIn);
  106. }
  107. /*****************************************************************
  108. **【函数名称】 OnDevOpResult
  109. **【函数功能】 设备操作结果返回
  110. **【参数】 成功还是失败
  111. **【返回值】 void
  112. ****************************************************************/
  113. BOOL CTaskAgentConsulCall::OnDevOpResult(EventOpResult &EvtInfo)
  114. {
  115. // 命令返回
  116. _ProcCmdReturn(EvtInfo.bIsSucceed);
  117. // 协商呼叫结果返回成功
  118. if(m_OpStep == 0 && EvtInfo.bIsSucceed)
  119. {
  120. m_OpStep++;
  121. // 统计-协商呼叫成功
  122. CStatisticsMgr::GetInstance().onCallDetail(m_TaskCallId, REP_EVENT_CONSUL_RESULT, m_pCurrLine->lineId(), NULL);
  123. return (!EvtInfo.bIsSucceed);
  124. }
  125. // 统计-转移结果
  126. T_EvtTransfer repInfoTransfer;
  127. memset(&repInfoTransfer, 0, sizeof(repInfoTransfer));
  128. repInfoTransfer.bEvtResult = EvtInfo.bIsSucceed;
  129. CStatisticsMgr::GetInstance().onCallDetail(m_TaskCallId, REP_EVENT_TRANSFER_RESULT, m_pCurrLine->lineId(), &repInfoTransfer);
  130. return TRUE;
  131. }
  132. /*****************************************************************
  133. **【函数名称】 OnCmdOperation
  134. **【函数功能】 Task命令处理
  135. **【参数】 PduEntity 命令实体
  136. **【返回值】
  137. ****************************************************************/
  138. BOOL CTaskAgentConsulCall::OnCmdOperation(CPduEntity &PduEntity)
  139. {
  140. // 处理确认转移命令
  141. if(PduEntity.GetCmdType() != PDU_CMD_AGENT_CONFIRM_TRANSFER || m_OpStep == 0)
  142. {
  143. PduEntity.SetToExecReturn();
  144. PduEntity.SetDataBool(0, false);
  145. CInterfaceWindow::getIocpCommInstance()->Send(&PduEntity, PduEntity.GetLocalDevType(), PduEntity.GetLocalDevId());
  146. return FALSE;
  147. }
  148. // 设置当前命令
  149. m_CurrCmd = PduEntity;
  150. // 显示日志
  151. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("AGENT->CTI, CMD = [坐席确认转移], Exten = %d"), m_CurrCmd.GetDataUInt(1));
  152. // 向底层发送确认转移命令
  153. LineOpParam param = { 0 };
  154. param.nParam1 = PduEntity.GetDataUInt(3);
  155. return (!CCtiCore::GetInstance().getDevLink().exec((long)this, LINE_OP_CONSULT_CALL_CONFIRM, m_pCurrLine->lineId(), &param));
  156. }