| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #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;
- }
- }
|