中航光电的中间件仓库

TaskAgentTransfer.cpp 5.7KB

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