中间件底层,websocket

LogicLineTrunk.cpp 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "StdAfx.h"
  2. #include "LogicLineTrunk.h"
  3. #include "SessionHolder.h"
  4. #include "CallSession.h"
  5. #include "CtiCore.h"
  6. #include "SqlWriter.h"
  7. CLogicLineTrunk::CLogicLineTrunk(UINT ResId) : CLogicLine(ResId)
  8. {
  9. }
  10. CLogicLineTrunk::~CLogicLineTrunk(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 onLineStatusUpdated
  15. **【函数功能】 处理线路状态变化
  16. **【参数】 EvtInfo: 线路资源状态
  17. **【返回值】
  18. ****************************************************************/
  19. void CLogicLineTrunk::onLineStatusUpdated( const EventResStatus &EvtInfo )
  20. {
  21. if(m_LineStatus == EvtInfo.nState)
  22. return;
  23. // 保存线路信息
  24. m_LineStatus = EvtInfo.nState;
  25. //m_CallerNum = EvtInfo.szCallerNum;
  26. //m_CalleeNum = EvtInfo.szCalleeNum;
  27. if (m_LineStatus != TRUNK_STATE_FREE) // 2021-12-22 挂断时等使用完主被叫再更新,挂机时底层传上来的主被叫为空
  28. {
  29. m_CallerNum = EvtInfo.szCallerNum;
  30. m_CalleeNum = EvtInfo.szCalleeNum;
  31. }
  32. if(m_CallId != 0)
  33. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{LogicLineTrunk}: 线路状态, LineId = %lu,State=%d,CallId=%lu,Caller=%s,Callee=%s"), m_LineId, m_LineStatus, m_CallId, m_CallerNum, m_CalleeNum);
  34. // 空闲时保存是否是主动挂断 2022-04-15
  35. if (EvtInfo.nState == TRUNK_STATE_FREE && m_CallId != 0 && m_IsFirstTrunk)
  36. {
  37. CString strSql;
  38. strSql.Format("insert into rep_hangup values(%lu,%d)", m_CallId, EvtInfo.nActiveHangup ? 1 : 2);
  39. CSqlWriter::GetInstance().addSql(strSql);
  40. }
  41. // 保存呼入中继的系统callid,fs id 2022-09-29
  42. if (EvtInfo.nState == TRUNK_STATE_ALERTING) {
  43. m_UUID = EvtInfo.szChanID; // 保存对应fs uuid
  44. CString strSql;
  45. strSql.Format("insert into rep_freeswitch(UUId,CallId) values('%s',%lu)", EvtInfo.szChanID, m_CallId);
  46. CSqlWriter::GetInstance().addSql(strSql);
  47. }
  48. else if (EvtInfo.nState == TRUNK_STATE_FREE) {
  49. CString strSql;
  50. if (DB_SQLServer == IOtlConnection::getInstance()->GetDatabaseType()) {
  51. strSql.Format("if EXISTS(select callid from rep_freeswitch where UUId='%s') begin update rep_freeswitch set HupTime=getdate(),CALLID = CASE CallId WHEN 0 THEN %lu ELSE CALLID END where UUId='%s' end", EvtInfo.szChanID, m_CallId, EvtInfo.szChanID);
  52. }
  53. else if (DB_MySQL == IOtlConnection::getInstance()->GetDatabaseType()) {
  54. strSql.Format("update rep_freeswitch set HupTime=now(),CALLID = CASE CallId WHEN 0 THEN %lu ELSE CALLID END where UUId='%s' and UUID IS NOT NULL", m_CallId, EvtInfo.szChanID);
  55. }
  56. CSqlWriter::GetInstance().addSql(strSql);
  57. }
  58. //统计线路状态变化
  59. _reportLineStatus();
  60. // 2019-9-18 bwj 外线转外线,后者外线挂机,挂掉前者外线
  61. CCallSession* pSession = CSessionHolder::GetInstance().findSession(m_CallId);
  62. if (pSession != NULL)
  63. {
  64. // 获取对端线路类型
  65. CLogicLine* pAssoLine = pSession->getAssoLine(this);
  66. if (pAssoLine != NULL)
  67. {
  68. UINT m_AssoLineType = pAssoLine->type();
  69. //2018.5.19 分机外线判定
  70. if (m_AssoLineType == DEV_RES_TYPE_VOIP)
  71. {
  72. m_AssoLineType = pAssoLine->typeExtTrunk();
  73. }
  74. // 影响代接功能
  75. //if (m_LineStatus == TRUNK_STATE_FREE)
  76. // if (pSession->lineCount() == 2 && m_AssoLineType == DEV_RES_TYPE_TRUNK) // 对端线路是外线
  77. // {
  78. // CCtiCore::GetInstance().getDevLink().exec((long)-1, LINE_OP_HANG_UP, pAssoLine->lineId(), NULL);
  79. // ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Line}: 外线挂机,挂断关联中继线路"));
  80. // }
  81. }
  82. }
  83. // 通知会话状态变化,保持会话(m_nHoldCallId)不再通知
  84. CSessionHolder::GetInstance().onLineStatusUpdated(this);
  85. if (m_LineStatus == TRUNK_STATE_FREE) // 挂断时等使用完主被叫再更新,
  86. {
  87. m_CallerNum = EvtInfo.szCallerNum;
  88. m_CalleeNum = EvtInfo.szCalleeNum;
  89. }
  90. }