华辉中间件项目(代码服务器上没有,用杨成电脑的源代码上传的)

AgentOffice.cpp 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. #include "StdAfx.h"
  2. #include "AgentOffice.h"
  3. #include "Agent.h"
  4. #include "AcdCore.h"
  5. #include "ExtenCtrl.h"
  6. #include "MsgCenter.h"
  7. CAgentOffice::CAgentOffice(void)
  8. {
  9. }
  10. CAgentOffice::~CAgentOffice(void)
  11. {
  12. m_AgentPropertyMap.clear();
  13. }
  14. /*****************************************************************
  15. **【函数名称】 getAgentById
  16. **【函数功能】 根据工号查找座席对象
  17. **【参数】 AgentId: 要查找的座席工号
  18. **【返回值】 对应工号的座席对象
  19. ****************************************************************/
  20. CAgent* CAgentOffice::getAgentById( UINT AgentId )
  21. {
  22. CSingleLock Lock(&m_Cs4AgentMap, TRUE);
  23. CAgent* pAgent = NULL;
  24. m_AgentMap.Lookup(AgentId, pAgent);
  25. return pAgent;
  26. }
  27. /*****************************************************************
  28. **【函数名称】 getAgentByExt
  29. **【函数功能】 根据分机号查找座席对象
  30. **【参数】
  31. **【返回值】 对应工号的座席对象
  32. ****************************************************************/
  33. CAgent* CAgentOffice::getAgentByExt( UINT AgentId, UINT ExtenId )
  34. {
  35. CSingleLock Lock(&m_Cs4AgentMap, TRUE);
  36. CAgent* pAgent = NULL;
  37. if(m_AgentMap.Lookup(AgentId, pAgent))
  38. {
  39. if(pAgent->assoExten() == ExtenId)
  40. return pAgent;
  41. }
  42. return NULL;
  43. }
  44. /*****************************************************************
  45. **【函数名称】 getAgentByIp
  46. **【函数功能】 根据工号及IP查找座席对象
  47. **【参数】 AgentId: 要查找的座席工号
  48. AgentIp: 座席IP
  49. **【返回值】 对应工号及IP的座席对象
  50. ****************************************************************/
  51. CAgent* CAgentOffice::getAgentByIp( UINT AgentId, const CString& AgentIp )
  52. {
  53. CSingleLock Lock(&m_Cs4AgentMap, TRUE);
  54. CAgent* pAgent = NULL;
  55. if(m_AgentMap.Lookup(AgentId, pAgent))
  56. {
  57. if(pAgent->ip() == AgentIp)
  58. return pAgent;
  59. }
  60. return NULL;
  61. }
  62. /*****************************************************************
  63. **【函数名称】 getAgentInfo
  64. **【函数功能】 获取坐席信息
  65. **【参数】
  66. **【返回值】
  67. ****************************************************************/
  68. BOOL CAgentOffice::getAgentInfo( Agent2Show& Info )
  69. {
  70. CSingleLock Lock(&m_Cs4AgentMap, TRUE);
  71. CAgent* pAgent = NULL;
  72. if(m_AgentMap.Lookup(Info.AgentId, pAgent))
  73. {
  74. Info.ExtId = pAgent->assoExten();
  75. Info.GroupNo = pAgent->group();
  76. Info.AgentType = pAgent->type();
  77. Info.State = pAgent->state();
  78. return TRUE;
  79. }
  80. return FALSE;
  81. }
  82. /*****************************************************************
  83. **【函数名称】 close
  84. **【函数功能】 释放资源
  85. **【参数】
  86. **【返回值】
  87. ****************************************************************/
  88. void CAgentOffice::close( void )
  89. {
  90. clearAgent();
  91. }
  92. /*****************************************************************
  93. **【函数名称】 clearAgent
  94. **【函数功能】 清理所有座席
  95. **【参数】
  96. **【返回值】
  97. ****************************************************************/
  98. void CAgentOffice::clearAgent( void )
  99. {
  100. CSingleLock Lock(&m_Cs4AgentMap, TRUE);
  101. UINT Key;
  102. CAgent* pAgent;
  103. POSITION Pos = m_AgentMap.GetStartPosition();
  104. // 清除所有座席
  105. while(Pos != NULL)
  106. {
  107. m_AgentMap.GetNextAssoc(Pos, Key, pAgent);
  108. ASSERT(pAgent != NULL);
  109. CAcdCore::GetInstance().getQueueMgr().delAgent(pAgent); // 从排队队列中删除
  110. pAgent->release(0);
  111. delete pAgent;
  112. }
  113. m_AgentMap.RemoveAll();
  114. }
  115. /*****************************************************************
  116. **【函数名称】 insertAgent
  117. **【函数功能】 座席状态变化的对应处理
  118. **【参数】 a_AgentID 座席工号
  119. a_ExtID 分机号
  120. a_GroupID 座席组号
  121. a_AgentType 座席类型
  122. a_TimeOverWork 话后处理时长
  123. a_ExtStatus 关联的分机状态
  124. **【返回值】
  125. ****************************************************************/
  126. BOOL CAgentOffice::insertAgent( UINT a_AgentID, UINT a_ExtID, LPCTSTR a_GroupID, UINT a_AgentType, UINT a_TimePostProcessing, INNER_STATE a_ExtStatus )
  127. {
  128. CSingleLock Lock(&m_Cs4AgentMap, TRUE);
  129. // 查找是否存在当前座席
  130. if (isAgentExisted(a_AgentID))
  131. return FALSE;
  132. // 保存对象
  133. CAgent* pAgent = new CAgent(a_AgentID, a_ExtID, a_GroupID, a_AgentType, a_TimePostProcessing);
  134. m_AgentMap.SetAt(pAgent->id(), pAgent); // 座席添加到全体座席索引
  135. CAcdCore::GetInstance().getQueueMgr().addAgent(pAgent); // 座席添加到排队队列
  136. pAgent->onAssoExtStatusUpdated(a_ExtStatus);// 设置座席当前状态
  137. return TRUE;
  138. }
  139. /*****************************************************************
  140. **【函数名称】 isAgentExisted
  141. **【函数功能】 指定工号的座席是否存在
  142. **【参数】 a_AgentId: 要查找的座席工号
  143. **【返回值】
  144. ****************************************************************/
  145. BOOL CAgentOffice::isAgentExisted( UINT a_AgentId )
  146. {
  147. return getAgentById(a_AgentId) == NULL ? FALSE : TRUE;
  148. }
  149. /*****************************************************************
  150. **【函数名称】 isAgentExisted
  151. **【函数功能】 指定工号及IP的座席是否存在
  152. **【参数】 a_AgentId: 要查找的座席工号
  153. a_AgentIp: 要查找的座席IP
  154. **【返回值】
  155. ****************************************************************/
  156. BOOL CAgentOffice::isAgentExisted( UINT a_AgentId, const CString& a_AgentIp )
  157. {
  158. return getAgentByIp(a_AgentId, a_AgentIp) == NULL ? FALSE : TRUE;
  159. }
  160. /*****************************************************************
  161. **【函数名称】 removeAgent
  162. **【函数功能】 删除指定座席
  163. **【参数】 a_AgentID: 座席工号
  164. a_HostAgent: 主控制坐席工号
  165. **【返回值】
  166. ****************************************************************/
  167. BOOL CAgentOffice::removeAgent( UINT a_AgentID, UINT a_HostAgent )
  168. {
  169. CAgent* pAgent = NULL;
  170. CSingleLock Lock(&m_Cs4AgentMap, TRUE);
  171. if(m_AgentMap.Lookup(a_AgentID, pAgent))
  172. {
  173. CAcdCore::GetInstance().getQueueMgr().delAgent(pAgent); // 从排队队列中删除
  174. m_AgentMap.RemoveKey(a_AgentID); // 从全体座席索引中删除
  175. pAgent->release(a_HostAgent);
  176. delete pAgent;
  177. pAgent = NULL;
  178. return TRUE;
  179. }
  180. return FALSE;
  181. }
  182. /*****************************************************************
  183. **【函数名称】 getAgentAssoExten
  184. **【函数功能】 查找座席对应的分机号
  185. **【参数】 a_AgentID: 座席工号
  186. **【返回值】 该座席关联的分机号
  187. ****************************************************************/
  188. UINT CAgentOffice::getAgentAssoExten( UINT a_AgentID )
  189. {
  190. CAgent* pAgent = getAgentById(a_AgentID);
  191. return pAgent == NULL ? 0 : pAgent->assoExten();
  192. }
  193. /*****************************************************************
  194. **【函数名称】 getAgentGroup
  195. **【函数功能】 查找座席对应的类型
  196. **【参数】 a_AgentID: 座席工号
  197. **【返回值】 该座席关联的类型
  198. ****************************************************************/
  199. UINT CAgentOffice::getAgentType( UINT a_AgentID )
  200. {
  201. CAgent* pAgent = getAgentById(a_AgentID);
  202. return pAgent == NULL ? 0 : pAgent->type();
  203. }
  204. /*****************************************************************
  205. **【函数名称】 getAgentState
  206. **【函数功能】 查找指定座席的当前状态
  207. **【参数】 a_AgentID: 座席工号
  208. **【返回值】 该座席当前状态
  209. ****************************************************************/
  210. UINT CAgentOffice::getAgentState( UINT a_AgentID )
  211. {
  212. CAgent* pAgent = getAgentById(a_AgentID);
  213. return pAgent == NULL ? AGENT_STATE_UNKNOWN : pAgent->state();
  214. }
  215. /*****************************************************************
  216. **【函数名称】 isAgentRepose
  217. **【函数功能】 查找指定座席是否是置忙状态
  218. **【参数】 a_AgentID: 座席工号
  219. **【返回值】
  220. ****************************************************************/
  221. BOOL CAgentOffice::isAgentRepose( UINT a_AgentID )
  222. {
  223. CAgent* pAgent = getAgentById(a_AgentID);
  224. return pAgent == NULL ? FALSE : pAgent->isRepose();
  225. }
  226. /*****************************************************************
  227. **【函数名称】 lockAgent
  228. **【函数功能】 临时对座席进行锁定
  229. **【参数】 a_AgentId: 座席工号
  230. **【返回值】
  231. ****************************************************************/
  232. BOOL CAgentOffice::lockAgent( UINT a_AgentId )
  233. {
  234. CAgent* pAgent = getAgentById(a_AgentId);
  235. if(pAgent != NULL)
  236. return pAgent->lock();
  237. else
  238. return FALSE;
  239. }
  240. /*****************************************************************
  241. **【函数名称】 setAgentState4Calling
  242. **【函数功能】 为外呼设置座席状态
  243. **【参数】 a_AgentId: 座席工号
  244. **【返回值】
  245. ****************************************************************/
  246. BOOL CAgentOffice::setAgentState4Calling( UINT a_AgentId )
  247. {
  248. CAgent* pAgent = getAgentById(a_AgentId);
  249. ASSERT(pAgent != NULL);
  250. if(pAgent == NULL)
  251. return FALSE;
  252. // 确保一下座席状态空闲
  253. if (!pAgent->setState(AGENT_STATE_FREE))
  254. return FALSE;
  255. return pAgent->lock();
  256. }
  257. /*****************************************************************
  258. **【函数名称】 onExtenStateUpdated
  259. **【函数功能】 分机状态变化事件响应
  260. **【参数】 a_pCmd: PDU命令内容
  261. **【返回值】
  262. ****************************************************************/
  263. void CAgentOffice::onExtenStateUpdated( UINT a_AgentID, CPduEntity* a_pCmd )
  264. {
  265. CAgent* pAgent = getAgentByExt(a_AgentID, a_pCmd->GetDataUInt(0));
  266. if(pAgent != NULL)
  267. pAgent->onAssoExtStatusUpdated((INNER_STATE)a_pCmd->GetDataUInt(1), a_pCmd);
  268. }
  269. /*****************************************************************
  270. **【函数名称】 setAgentState
  271. **【函数功能】 设置指定座席的逻辑状态
  272. **【参数】 a_AgentId: 座席工号
  273. a_AgentState: 座席状态
  274. **【返回值】
  275. ****************************************************************/
  276. BOOL CAgentOffice::setAgentState( UINT a_AgentID, AGENT_STATE a_AgentStatus )
  277. {
  278. CAgent* pAgent = getAgentById(a_AgentID);
  279. ASSERT(pAgent != NULL);
  280. if(pAgent != NULL)
  281. return pAgent->setState(a_AgentStatus);
  282. else
  283. return FALSE;
  284. }
  285. /*****************************************************************
  286. **【函数名称】 isNoAgent
  287. **【函数功能】 是否无座席签入
  288. **【参数】
  289. **【返回值】
  290. ****************************************************************/
  291. BOOL CAgentOffice::isNoAgent( void )
  292. {
  293. return (m_AgentMap.GetCount() == 0) ? TRUE : FALSE;
  294. }
  295. /*****************************************************************
  296. **【函数名称】 getStateSpecAgentList
  297. **【函数功能】 获取指定状态的座席列表
  298. **【参数】 SpecState: 指定状态
  299. **【返回值】 座席工号字符串列表,以 | 进行分隔
  300. ****************************************************************/
  301. void CAgentOffice::getStateSpecAgentList( AGENT_LIST_SPEC_STATE SpecState, CString& AgentList )
  302. {
  303. AgentList = _T("");
  304. CSingleLock Lock(&m_Cs4AgentMap, TRUE);
  305. UINT Key;
  306. CAgent* pAgent;
  307. POSITION pos = m_AgentMap.GetStartPosition();
  308. while(pos != NULL)
  309. {
  310. bool IsInsert = false;
  311. m_AgentMap.GetNextAssoc(pos, Key, pAgent);
  312. ASSERT(pAgent != NULL);
  313. switch(SpecState)
  314. {
  315. case AGENT_LIST_FREE: // 空闲座席列表
  316. if(pAgent->state() == AGENT_STATE_FREE)
  317. IsInsert = true;
  318. break;
  319. case AGENT_LIST_BUSY: // 忙
  320. if(pAgent->state() != AGENT_STATE_FREE && pAgent->state() != AGENT_STATE_LOGOUT)
  321. IsInsert = true;
  322. break;
  323. case AGENT_LIST_TALKING: // 通话
  324. if(pAgent->state() == AGENT_STATE_BUSY)
  325. IsInsert = true;
  326. break;
  327. case AGENT_LIST_ALTERING: // 来电振铃
  328. if(CAcdCore::GetInstance().getExtenCtrl().getExtenState(pAgent->assoExten()) == INNER_STATE_ALERTING)
  329. IsInsert = true;
  330. break;
  331. } // end switch
  332. // 如果是指定状态的座席
  333. if(IsInsert)
  334. {
  335. CString block;
  336. block.Format(_T("%lu,%lu"), pAgent->id(), pAgent->assoExten());
  337. if(AgentList.GetLength() != 0)
  338. AgentList += _T("|");
  339. AgentList += block;
  340. } // end if
  341. } // end while
  342. }
  343. std::map<UINT, CAgentProperty>& CAgentOffice::GetAgentPropertyMap()
  344. {
  345. return m_AgentPropertyMap;
  346. }