#ifndef MODULE_ATTENDANCE_VEHICLE_H #define MODULE_ATTENDANCE_VEHICLE_H /** *@brief 车辆考勤模块 *车辆进入某些特定区域,结束考勤;从特定区域进入其他区域,开始考勤 *@author 戴月腾 *@date 2018-08-07 */ #include #include #include #include #include #include #include #include "module_const.h" #include "common_tool.h" /** * @brief 车辆进入某些特定区域,结束考勤;从特定区域进入其他区域,开始考勤, 单例 */ class module_attendance_vehicle:public singleton_base { private: friend class singleton_base; module_attendance_vehicle() { } public: void on_enter(std::shared_ptr card_ptr, std::shared_ptr&c) { auto site_area_ptr = card_ptr->get_site_area(); if(!site_area_ptr || site_area_ptr->is_invalid()) { return; } auto area_ptr = c->m_area; //从考勤状态转换为结束考勤 if(!is_attendance_area(area_ptr->m_id, card_ptr->m_id)) { if(site_area_ptr->is_attendance()) { //考勤结束 site_area_ptr->m_stat_attendance=AS_NOT_ATTENDANCE; //作为一条结束考勤记录保存到数据库 tool_db::save_attendance(card_ptr); log_info("车卡考勤结束:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d", card_ptr->m_id, card_ptr->m_type, area_ptr->m_id,site_area_ptr->m_stat_attendance); } } else//没在考勤状态转换为考勤状态 { if(!site_area_ptr->is_attendance()) { //考勤开始 site_area_ptr->m_stat_attendance=AS_ATTENDANCE; site_area_ptr->m_attendance_start_time= std::chrono::system_clock::time_point(std::chrono::milliseconds(card_ptr->m_time)); //作为一条开始考勤记录保存到数据库 tool_db::save_attendance(card_ptr); log_info("车卡考勤开始:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d", card_ptr->m_id, card_ptr->m_type, area_ptr->m_id,site_area_ptr->m_stat_attendance); } } } // void on_hover(std::shared_ptr card_ptr,std::shared_ptr&c) // { // } // void on_leave(std::shared_ptr card_ptr,std::shared_ptr&c) // { // } private: bool is_attendance_area(int area_id, uint32_t vehicle_id) { char sql[1024] = {'\0'}; sprintf(sql, "select vt.att_rule_id from dat_att_rule_area a, dat_att_rule_vehicle_type vt, dat_vehicle v\ where a.area_id=%d and v.vehicle_id=%d \ and vt.vehicle_type_id=v.vehicle_type_id \ and a.att_rule_id=vt.att_rule_id;", area_id, vehicle_id); std::string Error; YADB::CDBResultSet DBRes; sDBConnPool.Query(sql,DBRes,Error); uint64_t nCount = DBRes.GetRecordCount( Error ); std_debug("车卡考勤区域查询:nCount=%d,sql=%s", nCount, sql); return (nCount > 0); } }; #endif // MODULE_ATTENDANCE_VEHICLE_H