1
0

area_business_count_checker.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "event.h"
  2. #include "area.h"
  3. #include "card_base.h"
  4. #include "common_tool.h"
  5. #include "log.h"
  6. #include "area_business_count_checker.h"
  7. /*
  8. 判断当前区域a中的人数是否超过设定人数,超过后告警
  9. 区域内实时人数存储在area对象中,在当前类on_enter/on_leave中进行更新
  10. 整个井下的超员和某个区域的超员都使用这个代码
  11. */
  12. //服务器重启加载数据
  13. void area_business_count_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)
  14. {
  15. if (nullptr == a->m_area )//|| !a->m_area->is_mine())
  16. {
  17. return ;
  18. }
  19. if (c->is_person())
  20. {
  21. a->m_area->m_person_count ++ ;
  22. if (a->m_area->m_person_count > a->m_area->m_limit_person_count)
  23. {
  24. EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
  25. auto ev_ptr_temp = event_list::instance()->get_event_area(a->m_area->id(),ev);
  26. a->m_area->m_event_person_count = false;
  27. if (ev_ptr_temp && !ev_ptr_temp->is_end())
  28. {
  29. a->m_area->m_event_person_count = true;
  30. }
  31. }
  32. }
  33. else if (c->is_vehicle())
  34. {
  35. a->m_area->m_vehicle_count ++ ;
  36. if (a->m_area->m_vehicle_count > a->m_area->m_limit_vehicle_count)
  37. {
  38. EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
  39. a->m_area->m_event_vehicle_count = false;
  40. auto ev_ptr_temp = event_list::instance()->get_event_area(a->m_area->id(),ev);
  41. if (ev_ptr_temp && !ev_ptr_temp->is_end())
  42. {
  43. a->m_area->m_event_vehicle_count = true;
  44. }
  45. }
  46. }
  47. }
  48. //增加计数,并进行判断
  49. void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
  50. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
  51. {
  52. if (nullptr == a->m_area )//|| !a->m_area->is_mine())
  53. {
  54. return ;
  55. }
  56. EVENT_TYPE ev = EVENT_TYPE::ET_OVER_COUNT_PERSON;
  57. int limitVal = 0;
  58. int curVal = 0;
  59. //uint64_t key = tool_other::type_id_to_u64(c->m_id,c->m_type);
  60. if (c->is_person())
  61. {
  62. a->m_area->m_person_count ++ ;
  63. limitVal = a->m_area->m_limit_person_count;
  64. curVal = a->m_area->m_person_count;
  65. ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
  66. }
  67. else if (c->is_vehicle())
  68. {
  69. a->m_area->m_vehicle_count ++ ;
  70. limitVal = a->m_area->m_limit_vehicle_count;
  71. curVal = a->m_area->m_vehicle_count;
  72. ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
  73. }
  74. if(curVal > limitVal)
  75. {
  76. if (c->is_vehicle())
  77. {
  78. a->m_area->m_event_vehicle_count = true;
  79. }
  80. else
  81. {
  82. a->m_area->m_event_person_count = true;
  83. }
  84. event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),limitVal,curVal,true);
  85. log_info("area_business_count_checker::on_enter : Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
  86. ,ev,a->m_area->id(),limitVal,curVal);
  87. }
  88. }
  89. void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
  90. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  91. {
  92. }
  93. //减少计数
  94. void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
  95. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  96. {
  97. if (nullptr == a->m_area )//|| !a->m_area->is_mine())
  98. {
  99. return ;
  100. }
  101. int limitVal = 0;
  102. int curVal = 0;
  103. bool tmp_event = false;
  104. EVENT_TYPE ev = EVENT_TYPE::ET_OVER_COUNT_PERSON;
  105. if (c->is_person())
  106. {
  107. a->m_area->m_person_count -- ;
  108. limitVal = a->m_area->m_limit_person_count;
  109. curVal = a->m_area->m_person_count;
  110. tmp_event = a->m_area->m_event_person_count;
  111. ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
  112. }
  113. else if (c->is_vehicle())
  114. {
  115. a->m_area->m_vehicle_count -- ;
  116. limitVal = a->m_area->m_limit_vehicle_count;
  117. curVal = a->m_area->m_vehicle_count;
  118. tmp_event = a->m_area->m_event_vehicle_count;
  119. ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
  120. }
  121. else{
  122. return ;
  123. }
  124. if(tmp_event && curVal < limitVal)
  125. {
  126. if (c->is_vehicle())
  127. {
  128. a->m_area->m_event_vehicle_count = false;
  129. }
  130. else
  131. {
  132. a->m_area->m_event_person_count = false;
  133. }
  134. log_info("area_business_count_checker::on_leave :Cancel Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
  135. ,ev,a->m_area->id(),limitVal,curVal);
  136. event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),limitVal,curVal,false);
  137. }
  138. }