中间件底层,websocket

SItemAgentStatus.cpp 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "StdAfx.h"
  2. #include "SItemAgentStatus.h"
  3. CSItemAgentStatus::CSItemAgentStatus(UINT AgentId, ULONG LoginId, UINT Exten, CString GroupId) : m_AgentID(AgentId), m_LoginID(LoginId), m_ExtID(Exten), m_GroupID(GroupId)
  4. {
  5. }
  6. CSItemAgentStatus::~CSItemAgentStatus(void)
  7. {
  8. __flush();
  9. }
  10. /*****************************************************************
  11. **【函数名称】 __onStateStart
  12. **【函数功能】 状态发生时的处理函数
  13. **【参数】
  14. **【返回值】
  15. ****************************************************************/
  16. void CSItemAgentStatus::__onStateStart( AGENT_STATE StartState )
  17. {
  18. time_t StateTime;
  19. if(m_StateMap.Lookup(StartState, StateTime)) // 已经存在此状态,说明统计出现异常,该遗留状态未被记入数据库
  20. {
  21. ASSERT(FALSE);
  22. __onStateOver(StartState);
  23. }
  24. StateTime = time(NULL);
  25. // 缓存此状态
  26. m_StateMap.SetAt(StartState, StateTime);
  27. // 编写SQL语句
  28. /*m_Sql.Format(_T("INSERT INTO rep_agent_state (AgentId, LoginId, State, OccurTime)VALUES\
  29. (%d, %d, %d, %s)"),
  30. m_AgentID,
  31. m_LoginID,
  32. StartState,
  33. FormatTime(StateTime));*/
  34. //2021-11-10 添加分机号,坐席组
  35. m_Sql.Format(_T("INSERT INTO rep_agent_state (AgentId, ExtId, GroupId, LoginId, State, OccurTime)VALUES\
  36. (%d, %d, '%s', %d, %d, %s)"),
  37. m_AgentID,
  38. m_ExtID,
  39. m_GroupID,
  40. m_LoginID,
  41. StartState,
  42. FormatTime(StateTime));
  43. __execSQL();
  44. }
  45. /*****************************************************************
  46. **【函数名称】 __onStateOver
  47. **【函数功能】 状态结束时的处理函数
  48. **【参数】
  49. **【返回值】
  50. ****************************************************************/
  51. void CSItemAgentStatus::__onStateOver( AGENT_STATE OverState )
  52. {
  53. time_t StateTime;
  54. if(!m_StateMap.Lookup(OverState, StateTime)) // 未找到此状态,说明统计出现异常
  55. {
  56. ASSERT(FALSE);
  57. if (AGENT_STATE_LOGOUT == OverState) // 2021-11-11 签出
  58. {
  59. __onStateStart(AGENT_STATE_LOGOUT);
  60. // 删除该状态
  61. m_StateMap.RemoveKey(OverState);
  62. }
  63. return;
  64. }
  65. // 删除该状态
  66. m_StateMap.RemoveKey(OverState);
  67. // 状态持续时间
  68. UINT Duration = (UINT)(time(NULL) - StateTime);
  69. // 编写SQL语句
  70. m_Sql.Format(_T("UPDATE rep_agent_state SET Duration = %d WHERE AgentId = %d AND LoginId = %d AND State = %d AND OccurTime = %s"),
  71. Duration,
  72. m_AgentID,
  73. m_LoginID,
  74. OverState,
  75. FormatTime(StateTime));
  76. __execSQL();
  77. }
  78. /*****************************************************************
  79. **【函数名称】 OnRepEvent
  80. **【函数功能】 统计事件变化通知
  81. **【参数】
  82. **【返回值】
  83. ****************************************************************/
  84. void CSItemAgentStatus::onSEvent( REP_EVENT EvtType, PARAM Param )
  85. {
  86. switch(EvtType)
  87. {
  88. case REP_EVENT_STATE:
  89. {
  90. T_EvtStatus* pStatus = (T_EvtStatus*)Param;
  91. ASSERT(pStatus != NULL);
  92. if(pStatus == NULL)
  93. return;
  94. if(pStatus->StartFlag)
  95. __onStateStart(pStatus->State);
  96. else
  97. __onStateOver(pStatus->State);
  98. }
  99. break;
  100. case REP_EVENT_LOGIN:
  101. __onStateStart(AGENT_STATE_LOGING); // 2021-11-22 ,添加了置闲保存记录,签入后置闲会导致连续两条置闲记录,因此记录改为为登录状态
  102. __onStateStart(AGENT_STATE_FREE);
  103. break;
  104. case REP_EVENT_LOGOUT:
  105. __onStateOver(AGENT_STATE_LOGOUT);
  106. break;
  107. }
  108. }
  109. /*****************************************************************
  110. **【函数名称】 __flush
  111. **【函数功能】 将所有遗留的状态统计存入数据库
  112. **【参数】
  113. **【返回值】
  114. ****************************************************************/
  115. void CSItemAgentStatus::__flush( void )
  116. {
  117. AGENT_STATE State;
  118. time_t StateTime;
  119. // 重新显示
  120. POSITION pos = m_StateMap.GetStartPosition();
  121. while(pos != NULL)
  122. {
  123. m_StateMap.GetNextAssoc(pos, State, StateTime);
  124. __onStateOver(State);
  125. } // end while
  126. }