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

SItemAgentStatus.cpp 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "StdAfx.h"
  2. #include "SItemAgentStatus.h"
  3. CSItemAgentStatus::CSItemAgentStatus(UINT AgentId, ULONG LoginId) : m_AgentID(AgentId), m_LoginID(LoginId)
  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. __execSQL();
  35. }
  36. /*****************************************************************
  37. **【函数名称】 __onStateOver
  38. **【函数功能】 状态结束时的处理函数
  39. **【参数】
  40. **【返回值】
  41. ****************************************************************/
  42. void CSItemAgentStatus::__onStateOver( AGENT_STATE OverState )
  43. {
  44. time_t StateTime;
  45. if(!m_StateMap.Lookup(OverState, StateTime)) // 未找到此状态,说明统计出现异常
  46. {
  47. ASSERT(FALSE);
  48. return;
  49. }
  50. // 删除该状态
  51. m_StateMap.RemoveKey(OverState);
  52. // 状态持续时间
  53. UINT Duration = (UINT)(time(NULL) - StateTime);
  54. // 编写SQL语句
  55. m_Sql.Format(_T("UPDATE rep_agent_state SET Duration = %d WHERE AgentId = %d AND LoginId = %d AND State = %d AND OccurTime = %s"),
  56. Duration,
  57. m_AgentID,
  58. m_LoginID,
  59. OverState,
  60. FormatTime(StateTime));
  61. __execSQL();
  62. }
  63. /*****************************************************************
  64. **【函数名称】 OnRepEvent
  65. **【函数功能】 统计事件变化通知
  66. **【参数】
  67. **【返回值】
  68. ****************************************************************/
  69. void CSItemAgentStatus::onSEvent( REP_EVENT EvtType, PARAM Param )
  70. {
  71. switch(EvtType)
  72. {
  73. case REP_EVENT_STATE:
  74. {
  75. T_EvtStatus* pStatus = (T_EvtStatus*)Param;
  76. ASSERT(pStatus != NULL);
  77. if(pStatus == NULL)
  78. return;
  79. if(pStatus->StartFlag)
  80. __onStateStart(pStatus->State);
  81. else
  82. __onStateOver(pStatus->State);
  83. }
  84. break;
  85. case REP_EVENT_LOGIN:
  86. __onStateStart(AGENT_STATE_LOGING);
  87. break;
  88. case REP_EVENT_LOGOUT:
  89. __onStateOver(AGENT_STATE_LOGING);
  90. break;
  91. }
  92. }
  93. /*****************************************************************
  94. **【函数名称】 __flush
  95. **【函数功能】 将所有遗留的状态统计存入数据库
  96. **【参数】
  97. **【返回值】
  98. ****************************************************************/
  99. void CSItemAgentStatus::__flush( void )
  100. {
  101. AGENT_STATE State;
  102. time_t StateTime;
  103. // 重新显示
  104. POSITION pos = m_StateMap.GetStartPosition();
  105. while(pos != NULL)
  106. {
  107. m_StateMap.GetNextAssoc(pos, State, StateTime);
  108. __onStateOver(State);
  109. } // end while
  110. }