升龙物业 老版本 ocx IPO, 加密狗 转值班电话

IncomingCallGroup.cpp 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include "StdAfx.h"
  2. #include "IncomingCallGroup.h"
  3. #include "IncomingCall.h"
  4. #include "MsgCenter.h"
  5. CIncomingCallGroup::CIncomingCallGroup(void)
  6. {
  7. }
  8. CIncomingCallGroup::~CIncomingCallGroup(void)
  9. {
  10. }
  11. /*****************************************************************
  12. **【函数名称】 __queue
  13. **【函数功能】 根据来电VIP级别排队
  14. **【参数】
  15. **【返回值】
  16. ****************************************************************/
  17. int CIncomingCallGroup::__queue( CIncomingCall* pCall )
  18. {
  19. CSingleLock Lock(&m_Cs4CallList, TRUE);
  20. int Index = m_nCount;
  21. if(Index == 0)
  22. {
  23. AddTail(pCall);
  24. return 0;
  25. }
  26. else
  27. {
  28. POSITION pos = GetTailPosition();
  29. POSITION FirstPos = GetHeadPosition();
  30. while(pos != NULL)
  31. {
  32. POSITION posPrev = pos;
  33. CIncomingCall* pTmpCall = GetPrev(pos);
  34. if(pTmpCall->vipLevel() >= pCall->vipLevel())
  35. {
  36. InsertAfter(posPrev, pCall);
  37. break;
  38. }
  39. if (posPrev == FirstPos)
  40. {
  41. InsertBefore(FirstPos, pCall);
  42. Index = 0;
  43. break;
  44. }
  45. --Index;
  46. } // end if
  47. return Index;
  48. } // end if
  49. }
  50. /*****************************************************************
  51. **【函数名称】 addCall
  52. **【函数功能】 添加呼叫
  53. **【参数】
  54. **【返回值】
  55. ****************************************************************/
  56. CIncomingCall* CIncomingCallGroup::addCall( CPduEntity* pCmd, int& Index )
  57. {
  58. CIncomingCall* pCall = new CIncomingCall(pCmd);
  59. ASSERT(pCall != NULL);
  60. Index = __queue(pCall);
  61. // 通知排队队列变化事件
  62. CMsgCenter::GetInstance().pushMsg(ACD_MSG_QUEUE_UPDATE, (PARAM)pCall->groupAsked());
  63. return pCall;
  64. }
  65. /*****************************************************************
  66. **【函数名称】 getCall
  67. **【函数功能】 查找指定索引的呼叫
  68. **【参数】
  69. **【返回值】
  70. ****************************************************************/
  71. CIncomingCall* CIncomingCallGroup::getCall( int Index )
  72. {
  73. CSingleLock Lock(&m_Cs4CallList, TRUE);
  74. CIncomingCall* pCall;
  75. POSITION pos = GetHeadPosition();
  76. while(pos != NULL)
  77. {
  78. pCall = GetNext(pos);
  79. if(pCall->index() == Index)
  80. return pCall;
  81. } // end while
  82. return NULL;
  83. }
  84. /*****************************************************************
  85. **【函数名称】 addCall
  86. **【函数功能】 添加呼叫
  87. **【参数】
  88. **【返回值】
  89. ****************************************************************/
  90. bool CIncomingCallGroup::delCall( int Index )
  91. {
  92. CSingleLock Lock(&m_Cs4CallList, TRUE);
  93. CIncomingCall* pCall = NULL;
  94. POSITION pos = GetHeadPosition();
  95. while(pos != NULL)
  96. {
  97. POSITION posPrev = pos;
  98. pCall = GetNext(pos);
  99. ASSERT(pCall != NULL);
  100. if(pCall->index() == Index)
  101. {
  102. // 删除呼叫
  103. RemoveAt(posPrev);
  104. // 通知排队队列变化事件
  105. CMsgCenter::GetInstance().pushMsg(ACD_MSG_QUEUE_UPDATE, (PARAM)pCall->groupAsked());
  106. delete pCall;
  107. return true;
  108. } // end if
  109. } // end while
  110. return false;
  111. }
  112. /*****************************************************************
  113. **【函数名称】 clear
  114. **【函数功能】 释放所有呼叫
  115. **【参数】
  116. **【返回值】
  117. ****************************************************************/
  118. void CIncomingCallGroup::clear( void )
  119. {
  120. CSingleLock Lock(&m_Cs4CallList, TRUE);
  121. // 清除所有呼叫
  122. while(m_nCount > 0)
  123. {
  124. delete RemoveHead();
  125. }
  126. }
  127. /*****************************************************************
  128. **【函数名称】 getCallInfo
  129. **【函数功能】 获取指定呼叫的相关信息用于UI展现
  130. **【参数】
  131. **【返回值】
  132. ****************************************************************/
  133. bool CIncomingCallGroup::getCallInfo( Call2Show& Info )
  134. {
  135. CSingleLock Lock(&m_Cs4CallList, TRUE);
  136. CIncomingCall* pCall = getCall(Info.Index);
  137. if(pCall != NULL)
  138. {
  139. Info.CallId = pCall->callId();
  140. Info.State = pCall->state();
  141. Info.VipLevel = pCall->vipLevel();
  142. Info.Group = pCall->groupAsked();
  143. Info.Strategy = pCall->agentStrategy();
  144. Info.Caller = pCall->callerNum();
  145. return true;
  146. }
  147. return false;
  148. }
  149. /*****************************************************************
  150. **【函数名称】 getTopWaitedCall
  151. **【函数功能】 得到当前可分配座席的呼叫
  152. **【参数】
  153. **【返回值】
  154. ****************************************************************/
  155. CIncomingCall* CIncomingCallGroup::getTopWaitedCall( void )
  156. {
  157. CSingleLock Lock(&m_Cs4CallList, TRUE);
  158. CIncomingCall* pCall = NULL;
  159. POSITION pos = GetHeadPosition();
  160. while(pos != NULL)
  161. {
  162. pCall = GetNext(pos);
  163. if(pCall->state() == OUTER_CALL_WAITING)
  164. return pCall;
  165. } // end while
  166. return NULL;
  167. }