#include "StdAfx.h" #include "IncomingCallGroup.h" #include "IncomingCall.h" #include "MsgCenter.h" CIncomingCallGroup::CIncomingCallGroup(void) { } CIncomingCallGroup::~CIncomingCallGroup(void) { } /***************************************************************** **【函数名称】 __queue **【函数功能】 根据来电VIP级别排队 **【参数】 **【返回值】 ****************************************************************/ int CIncomingCallGroup::__queue( CIncomingCall* pCall ) { CSingleLock Lock(&m_Cs4CallList, TRUE); int Index = m_nCount; if(Index == 0) { AddTail(pCall); return 0; } else { POSITION pos = GetTailPosition(); POSITION FirstPos = GetHeadPosition(); while(pos != NULL) { POSITION posPrev = pos; CIncomingCall* pTmpCall = GetPrev(pos); if(pTmpCall->vipLevel() >= pCall->vipLevel()) { InsertAfter(posPrev, pCall); break; } if (posPrev == FirstPos) { InsertBefore(FirstPos, pCall); Index = 0; break; } --Index; } // end if return Index; } // end if } /***************************************************************** **【函数名称】 addCall **【函数功能】 添加呼叫 **【参数】 **【返回值】 ****************************************************************/ CIncomingCall* CIncomingCallGroup::addCall( CPduEntity* pCmd, int& Index ) { CIncomingCall* pCall = new CIncomingCall(pCmd); ASSERT(pCall != NULL); Index = __queue(pCall); // 通知排队队列变化事件 CMsgCenter::GetInstance().pushMsg(ACD_MSG_QUEUE_UPDATE, (PARAM)pCall->groupAsked()); return pCall; } /***************************************************************** **【函数名称】 getCall **【函数功能】 查找指定索引的呼叫 **【参数】 **【返回值】 ****************************************************************/ CIncomingCall* CIncomingCallGroup::getCall( int Index ) { CSingleLock Lock(&m_Cs4CallList, TRUE); CIncomingCall* pCall; POSITION pos = GetHeadPosition(); while(pos != NULL) { pCall = GetNext(pos); if(pCall->index() == Index) return pCall; } // end while return NULL; } /***************************************************************** **【函数名称】 addCall **【函数功能】 添加呼叫 **【参数】 **【返回值】 ****************************************************************/ bool CIncomingCallGroup::delCall( int Index ) { CSingleLock Lock(&m_Cs4CallList, TRUE); CIncomingCall* pCall = NULL; POSITION pos = GetHeadPosition(); while(pos != NULL) { POSITION posPrev = pos; pCall = GetNext(pos); ASSERT(pCall != NULL); if(pCall->index() == Index) { // 删除呼叫 RemoveAt(posPrev); // 通知排队队列变化事件 CMsgCenter::GetInstance().pushMsg(ACD_MSG_QUEUE_UPDATE, (PARAM)pCall->groupAsked()); delete pCall; return true; } // end if } // end while return false; } /***************************************************************** **【函数名称】 clear **【函数功能】 释放所有呼叫 **【参数】 **【返回值】 ****************************************************************/ void CIncomingCallGroup::clear( void ) { CSingleLock Lock(&m_Cs4CallList, TRUE); // 清除所有呼叫 while(m_nCount > 0) { delete RemoveHead(); } } /***************************************************************** **【函数名称】 getCallInfo **【函数功能】 获取指定呼叫的相关信息用于UI展现 **【参数】 **【返回值】 ****************************************************************/ bool CIncomingCallGroup::getCallInfo( Call2Show& Info ) { CSingleLock Lock(&m_Cs4CallList, TRUE); CIncomingCall* pCall = getCall(Info.Index); if(pCall != NULL) { Info.CallId = pCall->callId(); Info.State = pCall->state(); Info.VipLevel = pCall->vipLevel(); Info.Group = pCall->groupAsked(); Info.Strategy = pCall->agentStrategy(); Info.Caller = pCall->callerNum(); return true; } return false; } /***************************************************************** **【函数名称】 getTopWaitedCall **【函数功能】 得到当前可分配座席的呼叫 **【参数】 **【返回值】 ****************************************************************/ CIncomingCall* CIncomingCallGroup::getTopWaitedCall( void ) { CSingleLock Lock(&m_Cs4CallList, TRUE); CIncomingCall* pCall = NULL; POSITION pos = GetHeadPosition(); while(pos != NULL) { pCall = GetNext(pos); if(pCall->state() == OUTER_CALL_WAITING) return pCall; } // end while return NULL; }