#include "area.h" #include "card_base.h" #include "event.h" #include "tool_time.h" #include "common_tool.h" #include "log.h" #include "area_business_person_dwell_checker.h" /* 判断当前区域a中的人卡停留时间 人员进入区域时间存储在area_hover对象中,在当前类on_enter/on_leave中进行更新 人员&车辆的代码重用,请自行设计 */ struct SPersonDwellChecker : business_data { bool m_send_event; // 是否发生告警 ture=已发生告警 false=没有 SPersonDwellChecker() { m_send_event = false; } }; //服务器重启加载数据 void area_business_person_dwell_checker::on_load_his(const std::shared_ptr&a,const std::shared_ptr&c,std::shared_ptr&ptr) { if(!c->is_person()) return; std::shared_ptr p = std::make_shared(); ptr = p; EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON; auto ev_ptr_temp = event_list::instance()->get_event_card(c->m_id,c->m_type,evType); if (ev_ptr_temp && !ev_ptr_temp->is_end()) p->m_send_event = true; } //进入区域,记录进入时间 void area_business_person_dwell_checker::on_enter(const std::shared_ptr&a, const std::shared_ptr&c,std::shared_ptr&ptr) { ptr = std::make_shared(); log_info("area_business_person_dwell_checker::on_enter : In Area=%d Card = %d ",a->m_area->id(),c->m_id); } //判断是否超时 void area_business_person_dwell_checker::on_hover(const std::shared_ptr&a, const std::shared_ptr&c,std::shared_ptr ptr) { if(!c->is_person()) return; auto ptr_temp = dynamic_cast(ptr.get()); if(nullptr == ptr_temp || a->m_enter_time == 0) return ; double limit_val = a->m_area->m_limit_person_second; double cur_val = ( tool_time::now_to_seconds() - a->m_enter_time / 1000); if (!ptr_temp->m_send_event && limit_val < cur_val) { EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON; uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id); event_tool::instance()->handle_event(OT_CARD,evType,id,limit_val,cur_val,ptr_temp->m_send_event = true); } } //如果有超时告警,取消超时告警 void area_business_person_dwell_checker::on_leave(const std::shared_ptr&a, const std::shared_ptr&c,std::shared_ptr ptr) { if(!c->is_person()) return; auto ptr_temp = dynamic_cast(ptr.get()); if(nullptr == ptr_temp) return ; if(ptr_temp->m_send_event) { ptr_temp->m_send_event = false; EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON:EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON; uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id); event_tool::instance()->handle_event(OT_CARD, evType, id, 0, 0, false); } }