Browse Source

Merge branch 'master' of http://local.beijingyongan.com:3000/linux-dev/ya-serv

lixioayao 6 years ago
parent
commit
a81ea6b9de

+ 1 - 0
area.h

@@ -24,6 +24,7 @@ struct site;
 struct area
 {
     area(int id,int limit_count_person, int limit_time_person,double scale,int32_t mapid,int32_t type);
+
   	virtual void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
 	virtual	void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
 	virtual	void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);

+ 59 - 44
module_service/area_business_count_checker.cpp

@@ -10,6 +10,34 @@
 	区域内实时人数存储在area对象中,在当前类on_enter/on_leave中进行更新
 	整个井下的超员和某个区域的超员都使用这个代码
 */
+
+//服务器重启加载数据
+void area_business_count_checker::on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
+{
+    if (nullptr == a->m_area )//|| !a->m_area->is_mine())
+    {
+        return ;
+    }
+    if (c->is_person() && !a->m_area->m_event_person_count)
+    {
+        EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+        auto ev_ptr_temp = event_list::instance()->get_event_area(a->m_area->id(),ev);
+        if (ev_ptr_temp && !ev_ptr_temp->is_end())
+            a->m_area->m_event_person_count = true;
+
+    }
+    else if (c->is_vehicle() && !a->m_area->m_event_vehicle_count)
+    {
+        EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
+        auto ev_ptr_temp = event_list::instance()->get_event_area(a->m_area->id(),ev);
+        if (ev_ptr_temp && !ev_ptr_temp->is_end())
+        {
+            a->m_area->m_event_vehicle_count = true;
+        }
+    }
+    on_enter(a,c,ptr);
+}
+
 //增加计数,并进行判断
 void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
@@ -18,45 +46,35 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
     {
         return ;
     }
-	EVENT_TYPE ev = EVENT_TYPE::ET_OVER_COUNT_PERSON;
-	int limitVal = 0;
-	int curVal = 0;
-	//uint64_t key = tool_other::type_id_to_u64(c->m_id,c->m_type);
 	if (c->is_person())
 	{
 		a->m_area->m_person_count ++ ;
-		limitVal = a->m_area->m_limit_person_count;
-		curVal = a->m_area->m_person_count;
-		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+		if (!a->m_area->m_event_person_count && a->m_area->m_person_count > a->m_area->m_limit_person_count)
+        {
+            a->m_area->m_event_person_count = true;
+            EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+            event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),a->m_area->m_limit_person_count,a->m_area->m_person_count,true);
+            log_info("area_business_count_checker::on_enter : Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
+            ,ev,a->m_area->id(),a->m_area->m_limit_person_count,(int)a->m_area->m_person_count);
+        }
 	}
 	else if (c->is_vehicle())
 	{
-		a->m_area->m_vehicle_count ++ ;
-		limitVal = a->m_area->m_limit_vehicle_count;
-		curVal = a->m_area->m_vehicle_count;
-		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
-	}
-	if(curVal > limitVal)
-	{
-		if (c->is_vehicle())
-		{
-			a->m_area->m_event_vehicle_count = true;
-		}
-		else
-		{
-			a->m_area->m_event_person_count = true;
-		}
-		event_tool::instance()->handle_event(a->m_area->is_mine()? OT_MINE : OT_AREA,ev,a->m_area->id(),limitVal,curVal,true);
-		log_info("area_business_count_checker::on_enter : Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
-		            ,ev,a->m_area->id(),limitVal,curVal);
+        a->m_area->m_vehicle_count ++ ;
+        if (a->m_area->m_vehicle_count > a->m_area->m_limit_vehicle_count && !a->m_area->m_event_vehicle_count)
+        {
+            a->m_area->m_event_vehicle_count = true;
+            EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+            event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),a->m_area->m_limit_vehicle_count,a->m_area->m_vehicle_count,true);
+            log_info("area_business_count_checker::on_enter : Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
+            ,ev,a->m_area->id(),a->m_area->m_limit_vehicle_count,(int)a->m_area->m_vehicle_count);
+        }
 	}
 }
 
 void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-
-
 }
 
 	//减少计数
@@ -78,6 +96,13 @@ void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
 		curVal = a->m_area->m_person_count;
 		tmp_event = a->m_area->m_event_person_count;
 		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+        if(tmp_event && curVal < limitVal)
+        {
+            a->m_area->m_event_person_count = false;
+            log_info("area_business_count_checker::on_leave :Cancel Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
+            ,ev,a->m_area->id(),limitVal,curVal);
+            event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),limitVal,curVal,false);
+        }
 	}
 	else if (c->is_vehicle())
 	{
@@ -86,23 +111,13 @@ void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
 		curVal = a->m_area->m_vehicle_count;
 		tmp_event = a->m_area->m_event_vehicle_count;
 		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
-	}
-	else{
-		return ;
-	}
-	if(tmp_event && curVal < limitVal)
-	{
-		if (c->is_vehicle())
-		{
-			a->m_area->m_event_vehicle_count = false;
-		}
-		else
-		{
-			a->m_area->m_event_person_count = false;
-		}
-        log_info("area_business_count_checker::on_leave :Cancel Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
-        ,ev,a->m_area->id(),limitVal,curVal);
-		event_tool::instance()->handle_event(a->m_area->is_mine()? OT_MINE : OT_AREA,ev,a->m_area->id(),limitVal,curVal,false);
+        if(tmp_event && curVal < limitVal)
+        {
+            a->m_area->m_event_vehicle_count = false;
+            log_info("area_business_count_checker::on_leave :Cancel Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
+            ,ev,a->m_area->id(),limitVal,curVal);
+            event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),limitVal,curVal,false);
+        }
 	}
 }
 

+ 2 - 0
module_service/area_business_count_checker.h

@@ -16,6 +16,8 @@ struct area_business_count_checker:area_business
 		return 3;
 	
 	}
+	//服务器重启加载数据
+	void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
 	//增加计数,并进行判断
 	void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
 	void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);

+ 45 - 34
module_service/area_business_person_dwell_checker.cpp

@@ -14,48 +14,59 @@
 
 struct SPersonDwellChecker : business_data
 {
-    int m_enter_time;
-    point m_enter_point;
-    int m_level_time;
-    point m_level_point;
-    bool m_send_event;  // 是否发生告警
+    bool m_send_event;  // 是否发生告警 ture=已发生告警 false=没有
     SPersonDwellChecker()
     {
-        m_enter_time = 0;
-        m_level_time = 0;
         m_send_event = false;
     }
 };
+//服务器重启加载数据
+void area_business_person_dwell_checker::on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
+{
+    std::shared_ptr<SPersonDwellChecker> p = std::make_shared<SPersonDwellChecker>();
+    p->m_send_event = false;
+    ptr = p;
+    EVENT_TYPE evType = EVENT_TYPE::ET_CARD_OVER_TIME_PERSON;
+    if(c->is_person())
+    {
+        evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+    }
+    else if (c->is_vehicle())
+    {
+        return ;
+    }
+    else
+    {
+        return;
+    }
+    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<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
-    if (nullptr == ptr)
-    {
-        ptr = std::make_shared<SPersonDwellChecker>();
-    }
-    auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
-    ptr_temp->m_enter_point.set(c->x,c->y,c->z);
-    ptr_temp->m_enter_time = tool_time::now_to_seconds();
-    ptr_temp->m_level_time = 0;
-    ptr_temp->m_level_point.set(0,0,0);
-    a->m_data[this->area_business_type()] = ptr;
+    std::shared_ptr<SPersonDwellChecker> p = std::make_shared<SPersonDwellChecker>();
+    p->m_send_event = false;
+    ptr = p;
     log_info("area_business_person_dwell_checker::on_enter : In Area=%d Card = %d  ",a->m_area->is_mine(),c->m_id);
 }
 
-
 //判断是否超时
 void area_business_person_dwell_checker::on_hover(const std::shared_ptr<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
     auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
-    if(nullptr == ptr_temp || ptr_temp->m_enter_time == 0)
+    if(nullptr == ptr_temp || a->m_enter_time == 0)
     {
         return ;
     }
 	double limit_val = 0;
-	double cur_val = ( tool_time::now_to_seconds() - ptr_temp->m_enter_time);
+	double cur_val = ( tool_time::now_to_seconds() - a->m_enter_time / 1000);
 	EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
 	if(c->is_person())
     {
@@ -89,21 +100,21 @@ void area_business_person_dwell_checker::on_leave(const std::shared_ptr<area_hov
     {
         return ;
     }
-    ptr_temp->m_level_point.set(c->x,c->y,c->z);
-    ptr_temp->m_level_time = tool_time::now_to_seconds();
-    ptr_temp->m_enter_point.set(0,0,0);
-    ptr_temp->m_enter_time = 0;
-    ptr_temp->m_send_event = false;
-    EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
-    if(c->is_person())
+    if(ptr_temp->m_send_event)
     {
-        evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
-    }
-    else
-    {
-        return ;
+        ptr_temp->m_send_event = false;
+        EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+        if (c->is_person())
+        {
+            evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON
+                                          : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+        }
+        else
+        {
+            return;
+        }
+        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);
     }
-    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);
 }
 

+ 2 - 0
module_service/area_business_person_dwell_checker.h

@@ -14,6 +14,8 @@ struct area_business_person_dwell_checker:area_business
 	{
 		return 2;
 	}
+	//服务器重启加载数据
+	virtual void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
 	//进入区域,记录进入时间
 	void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
 	//判断是否超时