Нет описания

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. printf("%s\n", m_Sql);
  44. __execSQL();
  45. }
  46. /*****************************************************************
  47. **【函数名称】 __onStateOver
  48. **【函数功能】 状态结束时的处理函数
  49. **【参数】
  50. **【返回值】
  51. ****************************************************************/
  52. void CSItemAgentStatus::__onStateOver( AGENT_STATE OverState )
  53. {
  54. time_t StateTime;
  55. if(!m_StateMap.Lookup(OverState, StateTime)) // 未找到此状态,说明统计出现异常
  56. {
  57. ASSERT(FALSE);
  58. if (AGENT_STATE_LOGOUT == OverState) // 2021-11-11 签出
  59. {
  60. __onStateStart(AGENT_STATE_LOGOUT);
  61. // 删除该状态
  62. m_StateMap.RemoveKey(OverState);
  63. }
  64. return;
  65. }
  66. // 删除该状态
  67. m_StateMap.RemoveKey(OverState);
  68. // 状态持续时间
  69. UINT Duration = (UINT)(time(NULL) - StateTime);
  70. // 编写SQL语句
  71. m_Sql.Format(_T("UPDATE rep_agent_state SET Duration = %d WHERE AgentId = %d AND LoginId = %d AND State = %d AND OccurTime = %s"),
  72. Duration,
  73. m_AgentID,
  74. m_LoginID,
  75. OverState,
  76. FormatTime(StateTime));
  77. printf("%s\n",m_Sql);
  78. __execSQL();
  79. }
  80. /*****************************************************************
  81. **【函数名称】 OnRepEvent
  82. **【函数功能】 统计事件变化通知
  83. **【参数】
  84. **【返回值】
  85. ****************************************************************/
  86. void CSItemAgentStatus::onSEvent( REP_EVENT EvtType, PARAM Param )
  87. {
  88. switch(EvtType)
  89. {
  90. case REP_EVENT_STATE:
  91. {
  92. T_EvtStatus* pStatus = (T_EvtStatus*)Param;
  93. ASSERT(pStatus != NULL);
  94. if(pStatus == NULL)
  95. return;
  96. if(pStatus->StartFlag)
  97. __onStateStart(pStatus->State);
  98. else
  99. __onStateOver(pStatus->State);
  100. }
  101. break;
  102. case REP_EVENT_LOGIN:
  103. __onStateStart(AGENT_STATE_LOGING); // 2021-11-22 ,添加了置闲保存记录,签入后置闲会导致连续两条置闲记录,因此记录改为为登录状态
  104. __onStateStart(AGENT_STATE_FREE);
  105. break;
  106. case REP_EVENT_LOGOUT:
  107. __onStateOver(AGENT_STATE_LOGOUT);
  108. break;
  109. }
  110. }
  111. /*****************************************************************
  112. **【函数名称】 __flush
  113. **【函数功能】 将所有遗留的状态统计存入数据库
  114. **【参数】
  115. **【返回值】
  116. ****************************************************************/
  117. void CSItemAgentStatus::__flush( void )
  118. {
  119. AGENT_STATE State;
  120. time_t StateTime;
  121. // 重新显示
  122. POSITION pos = m_StateMap.GetStartPosition();
  123. while(pos != NULL)
  124. {
  125. m_StateMap.GetNextAssoc(pos, State, StateTime);
  126. __onStateOver(State);
  127. } // end while
  128. }