module_area.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #ifndef MODULE_AREA_H
  2. #define MODULE_AREA_H
  3. /**
  4. * @brief 与区域相关的业务模块总接口
  5. * @author 戴月腾
  6. * @date 2018-08-25
  7. */
  8. #include"area.h"
  9. #include"module_const.h"
  10. #include"module_web.h"
  11. #include"module_attendance_vehicle.h"
  12. #include"module_area_over_count.h"
  13. #include"module_area_timeout.h"
  14. class module_area: public singleton_base<module_area>
  15. {
  16. private:
  17. friend class singleton_base<module_area>;
  18. module_area()
  19. {
  20. }
  21. public:
  22. static void on_enter(uint32_t card_id,std::shared_ptr<area_hover>&c, int32_t type)
  23. {
  24. if(0==c->id() || 0==c->mapid())
  25. {
  26. log_error("(0==c->id() || 0==c->mapid()), card_id=%d, 卡type=%d,areaid=%d,mapid=%d",
  27. card_id, type, c->id(), c->mapid());
  28. return;
  29. }
  30. auto card_ptr=card_list::instance()->get(tool_other::type_id_to_u64(type, card_id));
  31. if(!card_ptr)
  32. {
  33. log_error("卡不存在card_id=%d", card_id);
  34. return;
  35. }
  36. c->m_enter_time = tool_time::now_to_seconds();
  37. if(card_ptr->is_person())//统计人卡
  38. {
  39. c->m_area->m_person_count++;
  40. }
  41. if(card_ptr->is_vehicle())//统计车卡
  42. {
  43. c->m_area->m_vehicle_count++;
  44. //车卡考勤
  45. module_attendance_vehicle::instance()->on_enter(card_ptr, c);
  46. }
  47. //区域超员
  48. module_area_over_count::instance()->on_enter(card_ptr, c);
  49. //区域超时
  50. module_area_timeout::instance()->on_enter(card_ptr, c);
  51. save_his_area_location_enter(card_ptr);
  52. }
  53. static void on_hover(uint32_t card_id,std::shared_ptr<area_hover>&c, int32_t type)
  54. {
  55. if(0==c->id() || 0==c->mapid())
  56. {
  57. log_error("(0==c->id() || 0==c->mapid()), card_id=%d, 卡type=%d,areaid=%d,mapid=%d",
  58. card_id, type, c->id(), c->mapid());
  59. return;
  60. }
  61. auto card_ptr=card_list::instance()->get(tool_other::type_id_to_u64(type, card_id));
  62. if(!card_ptr)
  63. {
  64. log_error("卡不存在card_id=%d", card_id);
  65. return;
  66. }
  67. // if(card_ptr->is_person())//人卡
  68. // {
  69. // }
  70. // if(card_ptr->is_vehicle())//车卡
  71. // {
  72. // }
  73. //区域超时
  74. module_area_timeout::instance()->on_hover(card_ptr, c);
  75. }
  76. static void on_leave(uint32_t card_id, std::shared_ptr<area_hover>&c, int32_t type)
  77. {
  78. if(0==c->id() || 0==c->mapid())
  79. {
  80. log_error("(0==c->id() || 0==c->mapid()), card_id=%d, 卡type=%d,areaid=%d,mapid=%d",
  81. card_id, type, c->id(), c->mapid());
  82. return;
  83. }
  84. auto card_ptr=card_list::instance()->get(tool_other::type_id_to_u64(type, card_id));
  85. if(!card_ptr)
  86. {
  87. log_error("卡不存在card_id=%d", card_id);
  88. return;
  89. }
  90. if(card_ptr->is_person())//统计人卡
  91. {
  92. c->m_area->m_person_count--;
  93. }
  94. if(card_ptr->is_vehicle())//统计车卡
  95. {
  96. c->m_area->m_vehicle_count--;
  97. }
  98. //区域超员
  99. module_area_over_count::instance()->on_leave(card_ptr, c);
  100. //区域超时
  101. module_area_timeout::instance()->on_leave(card_ptr, c);
  102. save_his_area_location_leave(card_ptr);
  103. }
  104. ///入库
  105. static void save_his_area_location_enter(const std::shared_ptr<card_location_base> card_ptr)
  106. {
  107. auto area_hover_ptr = card_ptr->get_area_hover();
  108. char sql[LENGTH_SQL] = {0};
  109. std::string call("add_area_staff");
  110. if(card_ptr->is_vehicle())//车卡
  111. {
  112. call="add_area_vehicle";
  113. }
  114. std::string start_str = tool_time::to_str_ex(static_cast<uint64_t>(area_hover_ptr->m_enter_time) *1000);
  115. sprintf(sql, "CALL %s(%s, %d, %d, %d, '%s','%s');", call.c_str(),
  116. tool_other::type_id_to_str(card_ptr->m_type, card_ptr->m_id).c_str(),
  117. card_ptr->m_id, area_hover_ptr->id(), area_hover_ptr->mapid(), start_str.c_str(), start_str.c_str());
  118. db_tool::PushAsync(sql);
  119. }
  120. ///入库
  121. static void save_his_area_location_leave(const std::shared_ptr<card_location_base> card_ptr)
  122. {
  123. auto area_hover_ptr = card_ptr->get_area_hover();
  124. char sql[LENGTH_SQL] = {0};
  125. std::string call("add_area_staff");
  126. if(card_ptr->is_vehicle())//车卡
  127. {
  128. call="add_area_vehicle";
  129. }
  130. std::string start_str = tool_time::to_str_ex(static_cast<uint64_t>(area_hover_ptr->m_enter_time) *1000);
  131. std::string end_str = tool_time::to_str_ex(tool_time::now_to_ms());
  132. sprintf(sql, "CALL %s(%s, %d, %d, %d, '%s','%s');", call.c_str(),
  133. tool_other::type_id_to_str(card_ptr->m_type, card_ptr->m_id).c_str(),
  134. card_ptr->m_id, area_hover_ptr->id(), area_hover_ptr->mapid(), start_str.c_str(), end_str.c_str());
  135. db_tool::PushAsync(sql);
  136. }
  137. };
  138. #endif // MODULE_AREA_H