module_attendance_vehicle.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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 site_area_ptr = card_ptr->get_site_area();
  32. if(!site_area_ptr || site_area_ptr->is_invalid())
  33. {
  34. return;
  35. }
  36. auto area_ptr = c->m_area;
  37. //从考勤状态转换为结束考勤
  38. if(!is_attendance_area(area_ptr->m_id, card_ptr->m_id))
  39. {
  40. if(site_area_ptr->is_attendance())
  41. {
  42. //考勤结束
  43. site_area_ptr->m_stat_attendance=AS_NOT_ATTENDANCE;
  44. //作为一条结束考勤记录保存到数据库
  45. tool_db::save_attendance(card_ptr);
  46. log_info("车卡考勤结束:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
  47. card_ptr->m_id, card_ptr->m_type,
  48. area_ptr->m_id,site_area_ptr->m_stat_attendance);
  49. }
  50. }
  51. else//没在考勤状态转换为考勤状态
  52. {
  53. if(!site_area_ptr->is_attendance())
  54. {
  55. //考勤开始
  56. site_area_ptr->m_stat_attendance=AS_ATTENDANCE;
  57. site_area_ptr->m_attendance_start_time=
  58. std::chrono::system_clock::time_point(std::chrono::milliseconds(card_ptr->m_time));
  59. //作为一条开始考勤记录保存到数据库
  60. tool_db::save_attendance(card_ptr);
  61. log_info("车卡考勤开始:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
  62. card_ptr->m_id, card_ptr->m_type,
  63. area_ptr->m_id,site_area_ptr->m_stat_attendance);
  64. }
  65. }
  66. }
  67. // void on_hover(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  68. // {
  69. // }
  70. // void on_leave(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  71. // {
  72. // }
  73. private:
  74. bool is_attendance_area(int area_id, uint32_t vehicle_id)
  75. {
  76. char sql[1024] = {'\0'};
  77. sprintf(sql,
  78. "select vt.att_rule_id from dat_att_rule_area a, dat_att_rule_vehicle_type vt, dat_vehicle v\
  79. where a.area_id=%d and v.vehicle_id=%d \
  80. and vt.vehicle_type_id=v.vehicle_type_id \
  81. and a.att_rule_id=vt.att_rule_id;",
  82. area_id, vehicle_id);
  83. std::string Error;
  84. YADB::CDBResultSet DBRes;
  85. sDBConnPool.Query(sql,DBRes,Error);
  86. uint64_t nCount = DBRes.GetRecordCount( Error );
  87. std_debug("车卡考勤区域查询:nCount=%d,sql=%s", nCount, sql);
  88. return (nCount > 0);
  89. }
  90. };
  91. #endif // MODULE_ATTENDANCE_VEHICLE_H