#ifndef MODULE_AREA_TIMEOUT_PERSON_H #define MODULE_AREA_TIMEOUT_PERSON_H /** *@brief 区域超时模块 2018-08-26 戴月腾修改 * 当某张人卡在某个区域的时间超过指定值时,会发出区域超时告警 * @author 陈欧美 * @date 2018-08-05 */ #include #include #include #include #include #include "point.h" #include "module_const.h" #include"module_const.h" /** * @brief 当某张人卡在某个区域的时间超过指定值时,会发出区域超时告警 */ class module_area_timeout_person:public singleton_base { private: friend class singleton_base; module_area_timeout_person() { } public: void on_enter(std::shared_ptr card_ptr,std::shared_ptr&c) { //中途服务器宕机处理 if(auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ET_CARD_AREA_OVER_TIME_PERSON)) { c->m_enter_time = std::chrono::system_clock::to_time_t(ev_ptr->m_cur_time); } else { std::time(&c->m_enter_time); } } void on_hover(std::shared_ptr card_ptr,std::shared_ptr&c) { auto area_ptr = c->m_area; int seconds = tool_time::elapse_seconds(c->m_enter_time); if(seconds > area_ptr->m_limit_time_second)//发生告警 { auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ET_CARD_AREA_OVER_TIME_PERSON); if(ev_ptr) { event_list::copy_event(card_ptr, ev_ptr); ev_ptr->m_limit_value = area_ptr->m_limit_time_second; ev_ptr->m_cur_value = seconds; } else//从没有告警状态转化为告警状态 { auto ev_ptr = event_list::create_event_card(card_ptr->m_id, card_ptr->m_type, ET_CARD_AREA_OVER_TIME_PERSON); event_list::copy_event(card_ptr, ev_ptr); ev_ptr->m_limit_value = area_ptr->m_limit_time_second; ev_ptr->m_cur_value = seconds; //保存到数据库 event_list::save_event(ev_ptr); event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr); log_info("人卡区域超时开始:卡id=%d,卡type=%d,区域id=%d,时间门限=%d,呆的时间长度=%d", card_ptr->m_id, card_ptr->m_type, area_ptr->id(), area_ptr->m_limit_time_second, seconds); } } } void on_leave(std::shared_ptr card_ptr,std::shared_ptr&c) { auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ET_CARD_AREA_OVER_TIME_PERSON); if(ev_ptr)//有超时告警就删除 { auto area_ptr = c->m_area; event_list::copy_event(card_ptr, ev_ptr); ev_ptr->m_limit_value = area_ptr->m_limit_time_second; ev_ptr->m_cur_value = tool_time::elapse_seconds(c->m_enter_time); ev_ptr->m_status = ES_END; //保存到数据库 event_list::save_event(ev_ptr); log_info("人卡区域超时结束:卡id=%d,卡type=%d,区域id=%d,时间门限=%d", card_ptr->m_id, card_ptr->m_type, area_ptr->id(), area_ptr->m_limit_time_second); } } }; #endif // MODULE_AREA_TIMEOUT_PERSON_H