module_attendance_vehicle.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #ifndef MODULE_ATTENDANCE_VEHICLE_H
  2. #define MODULE_ATTENDANCE_VEHICLE_H
  3. /**
  4. *@brief 车辆考勤模块
  5. *车辆进入某些特定区域,结束考勤;从特定区域进入其他区域,开始考勤
  6. *@author 戴月腾
  7. *@date 2018-08-07
  8. */
  9. #include <memory>
  10. #include <mutex>
  11. #include <map>
  12. #include <string>
  13. #include <chrono>
  14. #include <vector>
  15. #include <set>
  16. #include "module_const.h"
  17. #include "common_tool.h"
  18. /**
  19. * @brief 车辆进入某些特定区域,结束考勤;从特定区域进入其他区域,开始考勤, 单例
  20. */
  21. class module_attendance_vehicle:public singleton_base<module_attendance_vehicle>
  22. {
  23. private:
  24. friend class singleton_base<module_attendance_vehicle>;
  25. module_attendance_vehicle()
  26. {
  27. }
  28. public:
  29. void on_enter(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<area_hover>&c)
  30. {
  31. auto mine_tool_ptr = card_ptr->get_mine_tool();
  32. auto area_ptr = c->m_area;
  33. //从考勤状态转换为结束考勤
  34. if(is_attendance_area(area_ptr->m_id, card_ptr->get_vehicle_type_id()))
  35. {
  36. if(mine_tool_ptr->is_attendance())
  37. {
  38. //考勤结束
  39. mine_tool_ptr->m_stat_attendance=AS_NOT_ATTENDANCE;
  40. //作为一条结束考勤记录保存到数据库
  41. tool_db::save_attendance(card_ptr);
  42. log_info("车卡考勤结束:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
  43. card_ptr->m_id, card_ptr->m_type,
  44. area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
  45. }
  46. }
  47. else//没在考勤状态转换为考勤状态
  48. {
  49. if(!mine_tool_ptr->is_attendance())
  50. {
  51. //考勤开始
  52. mine_tool_ptr->m_stat_attendance=AS_ATTENDANCE;
  53. mine_tool_ptr->m_attendance_start_time=
  54. std::chrono::system_clock::time_point(std::chrono::milliseconds(card_ptr->m_time));
  55. //作为一条开始考勤记录保存到数据库
  56. tool_db::save_attendance(card_ptr);
  57. log_info("车卡考勤开始:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
  58. card_ptr->m_id, card_ptr->m_type,
  59. area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
  60. }
  61. }
  62. }
  63. // void on_hover(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  64. // {
  65. // }
  66. // void on_leave(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  67. // {
  68. // }
  69. void init_attendance_area_from_db()
  70. {
  71. const char *sql = "select a.area_id, a.att_rule_id, vt.vehicle_type_id \
  72. from dat_att_rule_area a, dat_att_rule_vehicle_type vt, dat_att_rule r\
  73. where a.att_rule_id=vt.att_rule_id and a.att_rule_id=r.att_rule_id;";
  74. std::string Error;
  75. YADB::CDBResultSet DBRes;
  76. sDBConnPool.Query(sql,DBRes,Error);
  77. if(!Error.empty())
  78. log_error("初始化attendance_area Error,%s",Error.c_str());
  79. uint64_t nCount = DBRes.GetRecordCount( Error );
  80. if (nCount > 0)
  81. {
  82. log_info( "init_attendance_area_from_db. The record count=%ld\n", nCount );
  83. while ( DBRes.GetNextRecod(Error) )
  84. {
  85. int area_id = 0;
  86. DBRes.GetField( "area_id",area_id, Error );
  87. int att_rule_id = 0;
  88. DBRes.GetField( "att_rule_id",att_rule_id, Error );
  89. int vehicle_type_id = 0;
  90. DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
  91. m_map.insert(std::make_pair(to_list_id(area_id, vehicle_type_id), att_rule_id));
  92. }
  93. }
  94. }
  95. private:
  96. bool is_attendance_area(int area_id, int vehicle_type_id)
  97. {
  98. return m_map.end() != m_map.find(to_list_id(area_id, vehicle_type_id));
  99. }
  100. uint64_t to_list_id(int area_id, int vehicle_type_id)
  101. {
  102. return (static_cast<uint64_t>(area_id)<<32) | static_cast<uint64_t>(vehicle_type_id);
  103. }
  104. ///area_id<<32| vehicle_type_id; att_rule_id
  105. std::unordered_map<uint64_t, int> m_map;
  106. };
  107. #endif // MODULE_ATTENDANCE_VEHICLE_H