area_business_count_checker.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. static void check_event(bool &event_flag,EVENT_TYPE et,EVENT_DIS_TYPE edt,int id)
  13. {
  14. if(!event_flag)
  15. {
  16. auto ev_p = event_list::instance()->get_event_area(id,et,edt);
  17. if (ev_p && !ev_p->is_end())
  18. event_flag = true;
  19. }
  20. }
  21. //服务器重启加载数据
  22. 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)
  23. {
  24. if (nullptr == a->m_area )
  25. return ;
  26. if (c->is_person())
  27. {
  28. EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
  29. check_event(a->m_area->m_event_person_count,ev,DT_NORMAL,a->m_area->id());
  30. check_event(a->m_area->m_event_person_show_count,ev,DT_SPECIAL,a->m_area->id());
  31. }
  32. else if (c->is_vehicle())
  33. {
  34. EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
  35. check_event(a->m_area->m_event_vehicle_count,ev,DT_NORMAL,a->m_area->id());
  36. check_event(a->m_area->m_event_vehicle_show_count,ev,DT_SPECIAL,a->m_area->id());
  37. }
  38. on_enter(a,c,ptr);
  39. }
  40. //增加计数,并进行判断
  41. //多线程环境有可能同时产生相同的告警。
  42. //如果多个线程同一时间触发。
  43. void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
  44. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
  45. {
  46. if (nullptr == a->m_area )
  47. return ;
  48. if (c->is_person())
  49. {
  50. int limit_val=a->m_area->m_limit_person_count;
  51. int aid=a->m_area->id();
  52. if(limit_val<=0)
  53. {
  54. log_warn("on_enter_area_id:%d,limit_person_count is 0.so should not run area_business_count_checker...",aid);
  55. return;
  56. }
  57. if(!ptr)
  58. {
  59. log_info("person_count_enter[ptr is nulll....]:%d,v_count: limit:%d",aid,limit_val);
  60. a->m_area->m_person_count ++;
  61. }
  62. if(c->m_display)
  63. a->m_area->m_person_show_count ++ ;
  64. int pc=a->m_area->m_person_count.load();
  65. int pc_=a->m_area->m_person_show_count.load();
  66. EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
  67. if(pc>limit_val){
  68. lock();
  69. event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_person_count=true,DT_NORMAL);
  70. unlock();
  71. log_info("person_count_enter:%d,v_count:%d limit:%d",aid,pc,limit_val);
  72. }
  73. if(pc_>limit_val){
  74. lock();
  75. event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_person_show_count=true,DT_SPECIAL);
  76. unlock();
  77. log_info("person_count_enter_show:%d,v_count:%d limit:%d",aid,pc_,limit_val);
  78. }
  79. }
  80. else if (c->is_vehicle())
  81. {
  82. int limit_val=a->m_area->m_limit_vehicle_count;
  83. int aid=a->m_area->id();
  84. if(limit_val<=0)
  85. {
  86. log_warn("on_enter_area_id:%d,limit_vehicle_count is 0.so should not run area_business_count_checker...",aid);
  87. return;
  88. }
  89. if(!ptr)
  90. a->m_area->m_vehicle_count ++ ;
  91. if(c->m_display)
  92. a->m_area->m_vehicle_show_count ++ ;
  93. int vc=a->m_area->m_vehicle_count.load();
  94. int vc_=a->m_area->m_vehicle_show_count.load();
  95. EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
  96. if(vc>limit_val){
  97. lock();
  98. event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,vc,a->m_area->m_event_vehicle_count=true,DT_NORMAL);
  99. unlock();
  100. log_info("vehicle_count_enter:%d,v_count:%d limit:%d",aid,vc,limit_val);
  101. }
  102. if(vc_>limit_val){
  103. lock();
  104. event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,vc_,a->m_area->m_event_vehicle_show_count=true,DT_SPECIAL);
  105. unlock();
  106. log_info("vehicle_count_enter_show:%d,v_count:%d limit:%d",aid,vc_,limit_val);
  107. }
  108. }
  109. c->update_display();
  110. }
  111. void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
  112. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  113. {
  114. if(!c->eq_display())
  115. {
  116. ptr=std::make_shared<business_data>();
  117. if(c->m_display==1)
  118. on_enter(a,c,ptr);
  119. else if(c->m_display==0)
  120. on_leave(a,c,ptr);
  121. c->update_display();
  122. ptr=nullptr;
  123. }
  124. }
  125. //减少计数
  126. void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
  127. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  128. {
  129. if (nullptr == a->m_area )return ;
  130. int flag=c->m_display;
  131. if(!ptr){
  132. if(!c->eq_display()){
  133. c->update_display();
  134. //从0 变成1 之前是0 m_show_count没加1 这里不需要减一
  135. if(c->m_display==1)flag=0;
  136. //从1 变成 0 之前是加1了。 这里需要减去
  137. if(c->m_display==0)flag=1;
  138. }
  139. }
  140. if (c->is_person())
  141. {
  142. if(ptr)
  143. a->m_area->m_person_show_count -- ;
  144. else{
  145. a->m_area->m_person_count -- ;
  146. //if(c->m_display)
  147. if(flag)
  148. a->m_area->m_person_show_count -- ;
  149. }
  150. int pc=a->m_area->m_person_count.load();
  151. int pc_=a->m_area->m_person_show_count.load();
  152. int limit_val=a->m_area->m_limit_person_count;
  153. int aid=a->m_area->id();
  154. EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
  155. if(a->m_area->m_event_person_count&& pc <= limit_val){
  156. lock();
  157. event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_person_count=false,DT_NORMAL);
  158. unlock();
  159. log_info("person_count_leave:%d,v_count:%d limit:%d",aid,pc,limit_val);
  160. }
  161. if(a->m_area->m_event_person_show_count&& pc_ <= limit_val){
  162. lock();
  163. event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_person_show_count=false,DT_SPECIAL);
  164. unlock();
  165. log_info("person_count_leave_show:%d,v_count:%d limit:%d",aid,pc,limit_val);
  166. }
  167. }
  168. else if (c->is_vehicle())
  169. {
  170. if(ptr)
  171. a->m_area->m_vehicle_show_count -- ;
  172. else{
  173. a->m_area->m_vehicle_count -- ;
  174. //if(c->m_display)
  175. if(flag)
  176. a->m_area->m_vehicle_show_count -- ;
  177. }
  178. int pc=a->m_area->m_vehicle_count.load();
  179. int pc_=a->m_area->m_vehicle_show_count.load();
  180. int limit_val=a->m_area->m_limit_vehicle_count;
  181. int aid=a->m_area->id();
  182. EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
  183. if(a->m_area->m_event_vehicle_count&& pc <= limit_val){
  184. lock();
  185. event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_vehicle_count=false,DT_NORMAL);
  186. unlock();
  187. log_info("vehicle_count_leave:%d,v_count:%d limit:%d",aid,pc,limit_val);
  188. }
  189. if(a->m_area->m_event_vehicle_show_count&& pc_ <= limit_val){
  190. lock();
  191. event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_vehicle_show_count=false,DT_SPECIAL);
  192. unlock();
  193. log_info("vehicle_count_leave_show:%d,v_count:%d limit:%d",aid,pc,limit_val);
  194. }
  195. }
  196. }