#ifndef MODULE_ATTENDANCE_PERSON_H #define MODULE_ATTENDANCE_PERSON_H /** *@brief 人员考勤模块 2018-08-26 戴月腾修改 *主要是针对人卡进行考勤,人卡从井上切换到井下为考勤开始,人卡从井下切换到井上为考勤结束 *@author 陈欧美 *@date 2018-08-03 */ #include #include #include #include #include #include #include #include"ant.h" #include"area.h" #include"site_area.h" #include"module_const.h" /** * @brief 主要是针对人卡进行考勤,人卡从井上切换到井下为考勤开始,人卡从井下切换到井上为考勤结束 */ class module_attendance_person:public singleton_base { private: friend class singleton_base; module_attendance_person() { } public: /** * @brief 进入分站覆盖区域处理,考勤 * @param card_id * @param enter_site */ void enter_site(uint64_t card_id,int enter_site,uint64_t type) { if(!tool_other::is_person(type)) { return; } auto card_ptr=card_list::instance()->get(tool_other::to_uint64_cardid(type, card_id)); if(!card_ptr) { log_error("卡不存在card_id=%ld, type=%ld", card_id, type); return; } auto site_ptr=sit_list::instance()->get(enter_site); if(!site_ptr) { log_error("在分站列表中找不到分站,分站id=%d", enter_site); return; } // 从井下切换到井上为考勤结束 if(tool_other::is_up_site(site_ptr->m_reader_type_id)) { if(tool_other::is_attendance(card_ptr->m_stat_attendance)) { //考勤结束 card_ptr->m_stat_attendance=AS_NOT_ATTENDANCE; //作为一条结束考勤记录保存到数据库 tool_db::save_attendance(card_ptr); log_debug("人卡考勤结束:site_id=%d,reader_type_id=%d,stat_attendance=%d", site_ptr->m_id,site_ptr->m_reader_type_id,card_ptr->m_stat_attendance); } } // 从井上切换到井下为考勤开始 if(!tool_other::is_up_site(site_ptr->m_reader_type_id)) { if(!tool_other::is_attendance(card_ptr->m_stat_attendance)) { //考勤开始 card_ptr->m_stat_attendance=AS_ATTENDANCE; //card_ptr->m_attendance_start_time=std::chrono::system_clock::now(); std::time_t start= card_ptr->m_time/1000; card_ptr->m_attendance_start_time=std::chrono::system_clock::from_time_t(start); //作为一条开始考勤记录保存到数据库 tool_db::save_attendance(card_ptr); log_debug("人卡考勤开始:site_id=%d,reader_type_id=%d,stat_attendance=%d", site_ptr->m_id,site_ptr->m_reader_type_id,card_ptr->m_stat_attendance); } } } /** * @brief 离开现有分站处理,记录现有分站的进出时间和地点 * @param card_id * @param enter_site */ void leave_site(uint64_t card_id,int enter_site,uint64_t type) { } /** * @brief 手工升井函数 */ void up_well(std::vector& card_ids) { // std::chrono::system_clock::time_point time_current = std::chrono::system_clock::now(); // std::vector ids; // { // //std::lock_guard lock(m_mutex); // for(auto iter = card_ids.begin(); iter != card_ids.end(); ++iter) // { // auto iter_card = g_card_map_ptr->find(*iter); // if(g_card_map_ptr->end() == iter_card) // { // continue; // } // if(!iter_card->second->is_attendance) // 该卡当前没在井下,不能形成考勤记录 // { // // 该卡当前没在井下,不能形成考勤记录 // continue; // } //// // 添加到考勤处理列表 //// iter_card->second->last_status_well = enum_status_well::STATUS_WELL_UP; //// iter_card->second->time_end = time_current; //// attendances.push_back(iter_card->second); // ids.push_back(*iter); // } // } // // 插入考勤记录到数据库 // for(auto iter = ids.begin(); iter != ids.end(); ++iter) // { // g_card_map_ptr->erase(*iter); // // 插入考勤记录到数据库 // } } }; #endif // MODULE_ATTENDANCE_PERSON_H