module_attendance_vehicle.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "module_attendance_vehicle.h"
  2. #include<memory>
  3. #include<string>
  4. #include"area_business.h"
  5. #include"event.h"
  6. #include"log.h"
  7. #include"common_tool.h"
  8. #include"area.h"
  9. #include"db/db_api/CDBSingletonDefine.h"
  10. #include"db/db_tool.h"
  11. #include"mine.h"
  12. struct attendance_vehicle_data:business_data
  13. {
  14. attendance_vehicle_data():m_is_attendance(false)
  15. ,m_attendance_start_time(std::chrono::seconds(0))
  16. {
  17. }
  18. ///考勤状态 0初始状态 1 没在考勤 2 考勤;参看ATTENDANCE_STATUS
  19. bool m_is_attendance;
  20. ///考勤开始时间
  21. std::chrono::system_clock::time_point m_attendance_start_time;
  22. };
  23. void module_attendance_vehicle::on_enter(std::shared_ptr<card_location_base> card_ptr, int index)
  24. {
  25. auto area_hover_ptr = card_ptr->get_area_hover();
  26. if(!area_hover_ptr)
  27. {
  28. log_error("if(!area_hover_ptr)==true");
  29. return;
  30. }
  31. area_hover_ptr->m_data[index] = std::make_shared<attendance_vehicle_data>();
  32. auto ptr = static_cast<attendance_vehicle_data*>(area_hover_ptr->m_data[index].get());
  33. ptr->m_is_attendance=true;
  34. ptr->m_attendance_start_time=std::chrono::system_clock::now();
  35. //作为一条开始考勤记录保存到数据库
  36. db_tool::save_attendance(card_ptr, ptr->m_is_attendance, ptr->m_attendance_start_time);
  37. }
  38. void module_attendance_vehicle::on_hover(std::shared_ptr<card_location_base> card_ptr, int index)
  39. {
  40. }
  41. void module_attendance_vehicle::on_leave(std::shared_ptr<card_location_base> card_ptr, int index)
  42. {
  43. auto area_hover_ptr = card_ptr->get_area_hover();
  44. if(!area_hover_ptr)
  45. {
  46. log_error("if(!area_hover_ptr)==true");
  47. return;
  48. }
  49. area_hover_ptr->m_data[index] = std::make_shared<attendance_vehicle_data>();
  50. auto ptr = static_cast<attendance_vehicle_data*>(area_hover_ptr->m_data[index].get());
  51. if(ptr->m_is_attendance)
  52. {
  53. ptr->m_is_attendance=false;
  54. //作为一条开始考勤记录保存到数据库
  55. db_tool::save_attendance(card_ptr, ptr->m_is_attendance, ptr->m_attendance_start_time);
  56. }
  57. }
  58. void module_attendance_vehicle::on_enter(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<area_hover>&c)
  59. {
  60. auto area_ptr = c->m_area;
  61. //从考勤状态转换为结束考勤
  62. if(is_not_attendance_area(area_ptr->m_id, card_ptr->get_vehicle_type_id()))
  63. {
  64. save_attendance(card_ptr, area_ptr);
  65. }
  66. else//没在考勤状态转换为考勤状态
  67. {
  68. auto mine_tool_ptr = card_ptr->get_mine_tool();
  69. if(!mine_tool_ptr->is_attendance())
  70. {
  71. //考勤开始
  72. mine_tool_ptr->m_stat_attendance=AS_ATTENDANCE;
  73. mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
  74. //作为一条开始考勤记录保存到数据库
  75. db_tool::save_attendance(card_ptr);
  76. log_info("车卡考勤开始:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
  77. card_ptr->m_id, card_ptr->m_type,
  78. area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
  79. }
  80. }
  81. }
  82. void module_attendance_vehicle::init_attendance_area_from_db()
  83. {
  84. const char *sql = "select a.area_id, a.att_rule_id, vt.vehicle_type_id \
  85. from dat_att_rule_area a, dat_att_rule_vehicle_type vt, dat_att_rule r\
  86. where a.att_rule_id=vt.att_rule_id and a.att_rule_id=r.att_rule_id;";
  87. std::string Error;
  88. YADB::CDBResultSet DBRes;
  89. sDBConnPool.Query(sql,DBRes,Error);
  90. if(!Error.empty())
  91. log_error("初始化attendance_area Error,%s",Error.c_str());
  92. uint64_t nCount = DBRes.GetRecordCount( Error );
  93. if(int64_t(nCount) <= 0)
  94. {
  95. log_error("初始化attendance_area Error,%s",Error.c_str());
  96. }
  97. log_info( "init_attendance_area_from_db. The record count=%ld\n", nCount );
  98. m_map.clear();
  99. while ( DBRes.GetNextRecod(Error) )
  100. {
  101. int area_id = 0;
  102. DBRes.GetField( "area_id",area_id, Error );
  103. int att_rule_id = 0;
  104. DBRes.GetField( "att_rule_id",att_rule_id, Error );
  105. int vehicle_type_id = 0;
  106. DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
  107. m_map.insert(std::make_pair(to_list_id(area_id, vehicle_type_id), att_rule_id));
  108. }
  109. }
  110. ///area_ptr==nullptr 表示接收到 web的删除卡命令
  111. void module_attendance_vehicle::save_attendance(std::shared_ptr<card_location_base>& card_ptr, std::shared_ptr<area> area_ptr)
  112. {
  113. auto mine_tool_ptr = card_ptr->get_mine_tool();
  114. if(!mine_tool_ptr->is_attendance())
  115. {
  116. return;
  117. }
  118. //考勤结束
  119. mine_tool_ptr->m_stat_attendance=AS_NOT_ATTENDANCE;
  120. //作为一条结束考勤记录保存到数据库
  121. db_tool::save_attendance(card_ptr);
  122. if(area_ptr)
  123. {
  124. log_info("车卡考勤结束:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
  125. card_ptr->m_id, card_ptr->m_type,
  126. area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
  127. }
  128. else
  129. {
  130. log_info("收到web的删除卡命令,车卡考勤结束:卡id=%d,卡type=%d,stat_attendance=%d",
  131. card_ptr->m_id, card_ptr->m_type,mine_tool_ptr->m_stat_attendance);
  132. }
  133. }