area_business_count_checker.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "area.h"
  2. #include "card_base.h"
  3. #include "common_tool.h"
  4. #include "log.h"
  5. #include "event.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. a->m_area->m_event_person_count = true;
  25. }
  26. }
  27. else if (c->is_vehicle())
  28. {
  29. a->m_area->m_vehicle_count ++ ;
  30. if (a->m_area->m_vehicle_count > a->m_area->m_limit_vehicle_count)
  31. {
  32. a->m_area->m_event_vehicle_count = true;
  33. }
  34. }
  35. }
  36. //增加计数,并进行判断
  37. void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
  38. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
  39. {
  40. if (nullptr == a->m_area )//|| !a->m_area->is_mine())
  41. {
  42. return ;
  43. }
  44. EVENT_TYPE ev = EVENT_TYPE::ET_OVER_COUNT_PERSON;
  45. int limitVal = 0;
  46. int curVal = 0;
  47. //uint64_t key = tool_other::type_id_to_u64(c->m_id,c->m_type);
  48. if (c->is_person())
  49. {
  50. a->m_area->m_person_count ++ ;
  51. limitVal = a->m_area->m_limit_person_count;
  52. curVal = a->m_area->m_person_count;
  53. ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
  54. }
  55. else if (c->is_vehicle())
  56. {
  57. a->m_area->m_vehicle_count ++ ;
  58. limitVal = a->m_area->m_limit_vehicle_count;
  59. curVal = a->m_area->m_vehicle_count;
  60. ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
  61. }
  62. if(curVal > limitVal)
  63. {
  64. if (c->is_vehicle())
  65. {
  66. a->m_area->m_event_vehicle_count = true;
  67. }
  68. else
  69. {
  70. a->m_area->m_event_person_count = true;
  71. }
  72. event_tool::instance()->handle_event(a->m_area->is_mine()? OT_MINE : OT_AREA,ev,a->m_area->id(),limitVal,curVal,true);
  73. log_info("area_business_count_checker::on_enter : Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
  74. ,ev,a->m_area->id(),limitVal,curVal);
  75. }
  76. }
  77. void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
  78. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  79. {
  80. }
  81. //减少计数
  82. void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
  83. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  84. {
  85. if (nullptr == a->m_area )//|| !a->m_area->is_mine())
  86. {
  87. return ;
  88. }
  89. int limitVal = 0;
  90. int curVal = 0;
  91. bool tmp_event = false;
  92. EVENT_TYPE ev = EVENT_TYPE::ET_OVER_COUNT_PERSON;
  93. if (c->is_person())
  94. {
  95. a->m_area->m_person_count -- ;
  96. limitVal = a->m_area->m_limit_person_count;
  97. curVal = a->m_area->m_person_count;
  98. tmp_event = a->m_area->m_event_person_count;
  99. ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
  100. }
  101. else if (c->is_vehicle())
  102. {
  103. a->m_area->m_vehicle_count -- ;
  104. limitVal = a->m_area->m_limit_vehicle_count;
  105. curVal = a->m_area->m_vehicle_count;
  106. tmp_event = a->m_area->m_event_vehicle_count;
  107. ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
  108. }
  109. else{
  110. return ;
  111. }
  112. if(tmp_event && curVal < limitVal)
  113. {
  114. if (c->is_vehicle())
  115. {
  116. a->m_area->m_event_vehicle_count = false;
  117. }
  118. else
  119. {
  120. a->m_area->m_event_person_count = false;
  121. }
  122. log_info("area_business_count_checker::on_leave :Cancel Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
  123. ,ev,a->m_area->id(),limitVal,curVal);
  124. event_tool::instance()->handle_event(a->m_area->is_mine()? OT_MINE : OT_AREA,ev,a->m_area->id(),limitVal,curVal,false);
  125. }
  126. }