area_business_person_dwell_checker.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "area.h"
  2. #include "card_base.h"
  3. #include "event.h"
  4. #include "tool_time.h"
  5. #include "common_tool.h"
  6. #include "log.h"
  7. #include "area_business_person_dwell_checker.h"
  8. /*
  9. 判断当前区域a中的人卡停留时间
  10. 人员进入区域时间存储在area_hover对象中,在当前类on_enter/on_leave中进行更新
  11. 人员&车辆的代码重用,请自行设计
  12. */
  13. struct SPersonDwellChecker : business_data
  14. {
  15. bool m_send_event; // 是否发生告警 ture=已发生告警 false=没有
  16. SPersonDwellChecker()
  17. {
  18. m_send_event = false;
  19. }
  20. };
  21. //服务器重启加载数据
  22. void area_business_person_dwell_checker::on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
  23. {
  24. std::shared_ptr<SPersonDwellChecker> p = std::make_shared<SPersonDwellChecker>();
  25. p->m_send_event = false;
  26. ptr = p;
  27. EVENT_TYPE evType = EVENT_TYPE::ET_CARD_OVER_TIME_PERSON;
  28. if(c->is_person())
  29. {
  30. evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  31. }
  32. else if (c->is_vehicle())
  33. {
  34. return ;
  35. }
  36. else
  37. {
  38. return;
  39. }
  40. auto ev_ptr_temp = event_list::instance()->get_event_card(c->m_id,c->m_type,evType);
  41. if (ev_ptr_temp && !ev_ptr_temp->is_end())
  42. {
  43. p->m_send_event = true;
  44. }
  45. }
  46. //进入区域,记录进入时间
  47. void area_business_person_dwell_checker::on_enter(const std::shared_ptr<area_hover>&a,
  48. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
  49. {
  50. std::shared_ptr<SPersonDwellChecker> p = std::make_shared<SPersonDwellChecker>();
  51. p->m_send_event = false;
  52. ptr = p;
  53. log_info("area_business_person_dwell_checker::on_enter : In Area=%d Card = %d ",a->m_area->is_mine(),c->m_id);
  54. }
  55. //判断是否超时
  56. void area_business_person_dwell_checker::on_hover(const std::shared_ptr<area_hover>&a,
  57. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  58. {
  59. auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
  60. if(nullptr == ptr_temp || a->m_enter_time == 0)
  61. {
  62. return ;
  63. }
  64. double limit_val = 0;
  65. double cur_val = ( tool_time::now_to_seconds() - a->m_enter_time / 1000);
  66. EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  67. if(c->is_person())
  68. {
  69. if (a->m_area->m_limit_person_second > cur_val)
  70. {
  71. return;
  72. }
  73. ptr_temp->m_send_event = true;
  74. evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  75. limit_val = a->m_area->m_limit_person_second;
  76. }
  77. else if (c->is_vehicle())
  78. {
  79. return ;
  80. }
  81. else
  82. {
  83. return;
  84. }
  85. uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id);
  86. event_tool::instance()->handle_event(OT_CARD,evType,id,limit_val,cur_val,true);
  87. }
  88. //如果有超时告警,取消超时告警
  89. void area_business_person_dwell_checker::on_leave(const std::shared_ptr<area_hover>&a,
  90. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  91. {
  92. auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
  93. if(nullptr == ptr_temp)
  94. {
  95. return ;
  96. }
  97. if(ptr_temp->m_send_event)
  98. {
  99. ptr_temp->m_send_event = false;
  100. EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  101. if (c->is_person())
  102. {
  103. evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON
  104. : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  105. }
  106. else
  107. {
  108. return;
  109. }
  110. uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id);
  111. event_tool::instance()->handle_event(OT_CARD, evType, id, 0, 0, false);
  112. }
  113. }