#include "StdAfx.h" #include "LogicLineTrunk.h" #include "SessionHolder.h" #include "CallSession.h" #include "CtiCore.h" #include "SqlWriter.h" CLogicLineTrunk::CLogicLineTrunk(UINT ResId) : CLogicLine(ResId) { } CLogicLineTrunk::~CLogicLineTrunk(void) { } /***************************************************************** **【函数名称】 onLineStatusUpdated **【函数功能】 处理线路状态变化 **【参数】 EvtInfo: 线路资源状态 **【返回值】 ****************************************************************/ void CLogicLineTrunk::onLineStatusUpdated( const EventResStatus &EvtInfo ) { if(m_LineStatus == EvtInfo.nState) return; // 保存线路信息 m_LineStatus = EvtInfo.nState; //m_CallerNum = EvtInfo.szCallerNum; //m_CalleeNum = EvtInfo.szCalleeNum; if (m_LineStatus != TRUNK_STATE_FREE) // 2021-12-22 挂断时等使用完主被叫再更新,挂机时底层传上来的主被叫为空 { m_CallerNum = EvtInfo.szCallerNum; m_CalleeNum = EvtInfo.szCalleeNum; } if(m_CallId != 0) 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); // 空闲时保存是否是主动挂断 2022-04-15 if (EvtInfo.nState == TRUNK_STATE_FREE && m_CallId != 0 && m_IsFirstTrunk) { CString strSql; strSql.Format("insert into rep_hangup values(%lu,%d)", m_CallId, EvtInfo.nActiveHangup ? 1 : 2); CSqlWriter::GetInstance().addSql(strSql); } // 保存呼入中继的系统callid,fs id 2022-09-29 if (EvtInfo.nState == TRUNK_STATE_ALERTING) { m_UUID = EvtInfo.szChanID; // 保存对应fs uuid CString strSql; strSql.Format("insert into rep_freeswitch(UUId,CallId) values('%s',%lu)", EvtInfo.szChanID, m_CallId); CSqlWriter::GetInstance().addSql(strSql); } else if (EvtInfo.nState == TRUNK_STATE_FREE) { CString strSql; if (DB_SQLServer == IOtlConnection::getInstance()->GetDatabaseType()) { 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); } else if (DB_MySQL == IOtlConnection::getInstance()->GetDatabaseType()) { 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); } CSqlWriter::GetInstance().addSql(strSql); } //统计线路状态变化 _reportLineStatus(); // 2019-9-18 bwj 外线转外线,后者外线挂机,挂掉前者外线 CCallSession* pSession = CSessionHolder::GetInstance().findSession(m_CallId); if (pSession != NULL) { // 获取对端线路类型 CLogicLine* pAssoLine = pSession->getAssoLine(this); if (pAssoLine != NULL) { UINT m_AssoLineType = pAssoLine->type(); //2018.5.19 分机外线判定 if (m_AssoLineType == DEV_RES_TYPE_VOIP) { m_AssoLineType = pAssoLine->typeExtTrunk(); } // 影响代接功能 //if (m_LineStatus == TRUNK_STATE_FREE) // if (pSession->lineCount() == 2 && m_AssoLineType == DEV_RES_TYPE_TRUNK) // 对端线路是外线 // { // CCtiCore::GetInstance().getDevLink().exec((long)-1, LINE_OP_HANG_UP, pAssoLine->lineId(), NULL); // ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Line}: 外线挂机,挂断关联中继线路")); // } } } // 通知会话状态变化,保持会话(m_nHoldCallId)不再通知 CSessionHolder::GetInstance().onLineStatusUpdated(this); if (m_LineStatus == TRUNK_STATE_FREE) // 挂断时等使用完主被叫再更新, { m_CallerNum = EvtInfo.szCallerNum; m_CalleeNum = EvtInfo.szCalleeNum; } }