struct rect { }; struct area_interface { uint32_t m_id; std::string m_name; std::atomic m_card_count; int id(); std::string name(); int get_card_count(); double get_limit_speed(); double get_limit_time_second(); double get_limit_card_count(); virtual int type()=0;//site:0,normal:1 void inc_card_count(int deta) { } virtual ~area_interface(){} }; struct normal_area:area_interface { rect m_bound; }; struct site_area:area_interface { uint32_t m_site_id; }; struct area_main { std::vector m_normal_list,m_site_list; area_interface*get_normal_area(int id); area_interface*get_normal_area(const point&pt); area_interface*get_site_area(int site_id); }; struct area_hover { area* m_area; time_t m_enter_time,m_last_time,m_leave_time; }; struct card_area_tool { area_hover m_prev,m_last; area_hover m_prev_site,m_last_site; void on_point(const char* card_id,int site_id,const point&pt,double speed) { { area_interface *a=area_main_inst->get_site_area(site_id); on_site_area_point(a,card_id); } { area_interface *a=area_main_inst->get_normal_area(pt); on_site_area_point(a,card_id); } } //插入进入新分站记录 //离开分站时更新记录//本版本只在数据库生成记录 void on_site_area_point(a,card_id,site_id,speed) { if(enter) do_att_biz(a,card_id); } //人卡考勤 void do_att_biz(a,card_id) { } //生成卡进入区域、在区域活跃和离开区域的调用 void on_normal_area_point(a,card_id,pt,speed) { if(hover) do_hover_biz(a,card_id,pt,speed); if(enter) do_enter_biz(a,card_id,pt,speed); } //检测是否超时 void on_timer(card_id) { } void do_hover_biz(a,card_id,pt,speed) { //区域超时超时检测 //区域超速检测 //电子围栏检测 } void do_enter_biz(a,card_id,pt,speed) { //当前区域超员检测 //车卡考勤逻辑检测 //电子围栏检测 } }; struct person_card:card { card_area_tool*m_area_tool; void on_point(int site_id,const point&pt,double speed) { m_area_tool->on_point(m_id,site_id,pt,speed); } };