module_area_timeout_person.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #ifndef MODULE_AREA_TIMEOUT_PERSON_H
  2. #define MODULE_AREA_TIMEOUT_PERSON_H
  3. /**
  4. *@brief 区域超时模块 2018-08-26 戴月腾修改
  5. * 当某张人卡在某个区域的时间超过指定值时,会发出区域超时告警
  6. * @author 陈欧美
  7. * @date 2018-08-05
  8. */
  9. #include <mutex>
  10. #include <map>
  11. #include <chrono>
  12. #include <boost/thread.hpp>
  13. #include <boost/enable_shared_from_this.hpp>
  14. #include "point.h"
  15. #include "module_const.h"
  16. #include"module_const.h"
  17. /**
  18. * @brief 当某张人卡在某个区域的时间超过指定值时,会发出区域超时告警
  19. */
  20. class module_area_timeout_person:public singleton_base<module_area_timeout_person>
  21. {
  22. private:
  23. friend class singleton_base<module_area_timeout_person>;
  24. module_area_timeout_person()
  25. {
  26. }
  27. public:
  28. void on_enter(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  29. {
  30. //中途服务器宕机处理
  31. if(auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ET_CARD_AREA_OVER_TIME_PERSON))
  32. {
  33. c->m_enter_time = std::chrono::system_clock::to_time_t(ev_ptr->m_cur_time);
  34. }
  35. else
  36. {
  37. std::time(&c->m_enter_time);
  38. }
  39. }
  40. void on_hover(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  41. {
  42. auto area_ptr = c->m_area;
  43. int seconds = tool_time::elapse_seconds(c->m_enter_time);
  44. if(seconds > area_ptr->m_limit_time_second)//发生告警
  45. {
  46. auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ET_CARD_AREA_OVER_TIME_PERSON);
  47. if(ev_ptr)
  48. {
  49. event_list::copy_event(card_ptr, ev_ptr);
  50. ev_ptr->m_limit_value = area_ptr->m_limit_time_second;
  51. ev_ptr->m_cur_value = seconds;
  52. }
  53. else//从没有告警状态转化为告警状态
  54. {
  55. auto ev_ptr = event_list::create_event_card(card_ptr->m_id, card_ptr->m_type, ET_CARD_AREA_OVER_TIME_PERSON);
  56. event_list::copy_event(card_ptr, ev_ptr);
  57. ev_ptr->m_limit_value = area_ptr->m_limit_time_second;
  58. ev_ptr->m_cur_value = seconds;
  59. //保存到数据库
  60. event_list::save_event(ev_ptr);
  61. event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr);
  62. log_info("人卡区域超时开始:卡id=%d,卡type=%d,区域id=%d,时间门限=%d,呆的时间长度=%d",
  63. card_ptr->m_id, card_ptr->m_type,
  64. area_ptr->id(), area_ptr->m_limit_time_second, seconds);
  65. }
  66. }
  67. }
  68. void on_leave(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  69. {
  70. auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ET_CARD_AREA_OVER_TIME_PERSON);
  71. if(ev_ptr)//有超时告警就删除
  72. {
  73. auto area_ptr = c->m_area;
  74. event_list::copy_event(card_ptr, ev_ptr);
  75. ev_ptr->m_limit_value = area_ptr->m_limit_time_second;
  76. ev_ptr->m_cur_value = tool_time::elapse_seconds(c->m_enter_time);
  77. ev_ptr->m_status = ES_END;
  78. //保存到数据库
  79. event_list::save_event(ev_ptr);
  80. log_info("人卡区域超时结束:卡id=%d,卡type=%d,区域id=%d,时间门限=%d",
  81. card_ptr->m_id, card_ptr->m_type,
  82. area_ptr->id(), area_ptr->m_limit_time_second);
  83. }
  84. }
  85. };
  86. #endif // MODULE_AREA_TIMEOUT_PERSON_H