linux版本中间件

OpTransfer.cpp 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "OpTransfer.h"
  2. #include "VirtualChan.h"
  3. #include "OperationReactor.h"
  4. #include "FsProxy.h"
  5. #include "Session.h"
  6. COpTransfer::COpTransfer(COperationReactor * pParent, long Instance) : COperation(pParent, Instance), m_pHostExtChan(nullptr)
  7. {
  8. }
  9. COpTransfer::~COpTransfer(void)
  10. {
  11. }
  12. /*****************************************************************
  13. **【函数名称】 _end
  14. **【函数功能】 操作完成
  15. **【参数】 IsSucceed 操作是否成功
  16. lpData 随路数据
  17. **【返回值】
  18. ****************************************************************/
  19. void COpTransfer::_end(bool IsSucceed)
  20. {
  21. int nActionID = 2;
  22. auto pSession = CFsProxy::GetInstance().getSession(m_SessionId);
  23. if (pSession)
  24. {
  25. nActionID = pSession->getActionId();
  26. Format fmt("update rep_cdr set op_type = %d where uuid = '%s' and action_id=%d");
  27. fmt % type() % m_SessionId %nActionID;
  28. SqlWrite::GetInstance()->addSql(fmt.str());
  29. }
  30. std::string sql;
  31. if (IsSucceed)
  32. {
  33. LOG_INFO(("{OpTransfer}: 分机[%lu]转移成功, DestNum = %s"), m_pHostExtChan->no(), m_DestNumber.c_str());
  34. Format fmt("update rep_transfer set answer_time = '%s',is_success = %d where uuid = '%s'");
  35. fmt % Util::CurTime() % 1 % m_SessionId;
  36. sql = fmt.str();
  37. }
  38. else
  39. {
  40. LOG_WARN(("{OpTransfer}: 分机[%lu]转移失败, DestNum = %s"), m_pHostExtChan->no(), m_DestNumber.c_str());
  41. Format fmt("update rep_transfer set end_time = '%s',is_success = %d where uuid = '%s'");
  42. fmt % Util::CurTime() % 0 % m_SessionId;
  43. sql = fmt.str();
  44. }
  45. SqlWrite::GetInstance()->addSql(sql);
  46. SqlWrite::GetInstance()->addSql(toSql(IsSucceed, "转移"));
  47. // 返回执行结果
  48. if (m_InstanceCancel != FS_LINK_INSTANCE_INVALID)
  49. m_pParent->onOpResult(m_InstanceCancel, !IsSucceed);
  50. m_pParent->onOpResult(m_Instance, this, IsSucceed, std::to_string(m_pHostExtChan->no()));
  51. }
  52. /*****************************************************************
  53. **【函数名称】 start
  54. **【函数功能】 执行操作
  55. **【参数】
  56. **【返回值】
  57. *****************************************************************/
  58. bool COpTransfer::start(LineOpParam* pParam)
  59. {
  60. // 校验状态
  61. if (m_pHostChan->state() != CHAN_LOGIC_STATE_TALKING)
  62. return false;
  63. // 获取待转移的通道
  64. VirtualChan* pDestChan = CFsProxy::GetInstance().getAssoChanInSession(m_pHostChan);
  65. if (pDestChan == nullptr || pDestChan->currOp() != nullptr)
  66. {
  67. if (pDestChan != nullptr && pDestChan->currOp() != nullptr)
  68. LOG_WARN("当前通道[%lu]已绑定操作,OpType = [%s]", pDestChan->no(), pDestChan->opNumber().c_str());
  69. return false;
  70. }
  71. // 保存被叫信息
  72. std::string CallerNum = pParam->szParam1;
  73. m_DestNumber = pParam->szParam2;
  74. m_pHostExtChan = m_pHostChan;
  75. detachHostChan();
  76. attachHostChan(pDestChan);
  77. // 通知启动日志
  78. LOG_INFO(("{OpConsult}: 分机[%lu]执行转移, DestNum = %s"), m_pHostExtChan->no(), m_DestNumber.c_str());
  79. m_SessionId = pDestChan->sessionId();
  80. std::string caller_agent = CFsProxy::GetInstance().getAgentByExten(CallerNum);
  81. std::string callee_agent = CFsProxy::GetInstance().getAgentByExten(m_DestNumber);
  82. m_CallerAgent = caller_agent;
  83. m_Caller = CallerNum;
  84. m_CalleeAgent = callee_agent;
  85. m_Callee = m_DestNumber;
  86. m_OpTime = Util::CurTime();
  87. {
  88. Format fmt("insert into rep_transfer(uuid,caller_agent,caller,callee_agent,callee,create_time) values('%s','%s','%s','%s','%s','%s')");
  89. fmt %m_SessionId % caller_agent %CallerNum %callee_agent %m_DestNumber %m_OpTime;
  90. SqlWrite::GetInstance()->addSql(fmt.str());
  91. }
  92. return CFsProxy::GetInstance().transfer(uniqueId(), pDestChan, m_DestNumber);
  93. }
  94. /*****************************************************************
  95. **【函数名称】 onBackgroudJobDone
  96. **【函数功能】 后台命令执行结束事件处理
  97. **【参数】
  98. **【返回值】
  99. *****************************************************************/
  100. void COpTransfer::onBackgroudJobDone(PBG_JOB_NOTIFY pNotify)
  101. {
  102. if (pNotify->JobBody.find(ESL_JOB_DONE_RES_FAILED) != std::string::npos)
  103. _end(false);
  104. }
  105. void COpTransfer::onHostChanStateUpdated(VirtualChan * pHostChan)
  106. {
  107. // 说明转移到了一个不存在的号码
  108. if (m_pHostChan->state() == CHAN_LOGIC_STATE_FREE)
  109. {
  110. int nActionID = 2;
  111. auto pSession = CFsProxy::GetInstance().getSession(m_SessionId);
  112. if (pSession)
  113. {
  114. nActionID = pSession->getActionId();
  115. ++nActionID;
  116. }
  117. Format fmt("insert into rep_cdr(uuid,caller_agent,caller,callee,op_type,call_type,create_time,action_id,is_answer,end_time) values('%s','%s','%s','%s',%d,%d,'%s',%d,'%d','%s')"); // 分机呼叫 call_type=1
  118. fmt %m_SessionId %m_CallerAgent % m_Caller %m_Callee %type() % 1 % m_OpTime % nActionID %0 % Util::CurTime();
  119. SqlWrite::GetInstance()->addSql(fmt.str());
  120. {
  121. LOG_WARN(("{OpTransfer}: 分机[%lu]转移失败, DestNum = %s"), m_pHostExtChan->no(), m_DestNumber.c_str());
  122. Format fmt("update rep_transfer set end_time = '%s',is_success = %d where uuid = '%s'");
  123. fmt % Util::CurTime() % 0 % m_SessionId;
  124. SqlWrite::GetInstance()->addSql(fmt.str());
  125. SqlWrite::GetInstance()->addSql(toSql(0, "转移"));
  126. m_pParent->onOpResult(m_Instance, this, 0, std::to_string(m_pHostExtChan->no()));
  127. }
  128. }
  129. }
  130. void COpTransfer::onSessionChanStateUpdated(VirtualChan * pChan)
  131. {
  132. if (pChan == m_pHostExtChan)
  133. return;
  134. switch ((int)pChan->state())
  135. {
  136. case CHAN_LOGIC_STATE_RING_BACK:
  137. case CHAN_LOGIC_STATE_ALERTING:
  138. m_pParent->onOpProcess(m_Instance, m_pHostChan->no(), pChan->no(), pChan->type(), pChan->callerNum(), pChan->calleeNum());
  139. break;
  140. case CHAN_LOGIC_STATE_TALKING:
  141. _end(true);
  142. break;
  143. case CHAN_LOGIC_STATE_FREE:
  144. _end(false);
  145. }
  146. }