1
0
Prechádzať zdrojové kódy

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

zzj 6 rokov pred
rodič
commit
8b1e7e3d01

+ 20 - 15
area.cpp

@@ -429,7 +429,7 @@ std::vector<point> area_list::init_path(std::string &str)
 	return std::move(vp);
 }
 
-std::vector<std::shared_ptr<area>> area_list::get_area(const std::shared_ptr<site> s,const std::shared_ptr<card_location_base> &c,const point&pt,int & sarid)
+std::vector<std::shared_ptr<area>> area_list::get_area(const std::shared_ptr<site>& s,const std::shared_ptr<card_location_base> &c,const point&pt,int & sarid)
 {
 	std::vector<std::shared_ptr<area>> ret;
 
@@ -455,10 +455,12 @@ area_hover::area_hover(const std::shared_ptr<area>&area,const point&pt)
 
 void area_tool::on_point(const std::shared_ptr<card_location_base>& c,const point&pt)
 {
-	log_info("on_point...cardid:%d,type:%d",c->m_id,c->m_type);
-	
+	log_info("on_point...cardid:%d,type:%d,x:%.2f,y:%.2f",c->m_id,c->m_type,pt.x,pt.y);
+    if(pt.empty())	
+      return;
 	int special_area=-1;
 	std::vector<std::shared_ptr<area>> areas=area_list::instance()->get_area(m_site,c, pt,special_area);
+
 	if(special_area != -1)
 	{
 		areas.clear();
@@ -512,20 +514,23 @@ void area_tool::on_point(const std::shared_ptr<card_location_base>& c,const poin
 	m_hover_list=std::move(nlist);
 
     //更新到数据库
-    std::string strAreaInfo = "";
-    for (std::vector<std::shared_ptr<area_hover>>::iterator itvec = m_hover_list.begin(); itvec != m_hover_list.end(); ++itvec)
+    if(m_site && !m_hover_list.empty())
     {
-        if ((*itvec)->id() >= 0)
-        {
-            char tmpArea[128] = {0};
-            snprintf(tmpArea, 128, "%d,%lu|", (*itvec)->id(), (*itvec)->m_enter_time);
-            strAreaInfo += tmpArea;
-        }
+         std::string strAreaInfo = "";
+         for (std::vector<std::shared_ptr<area_hover>>::iterator itvec = m_hover_list.begin(); itvec != m_hover_list.end(); ++itvec)
+         {
+             if ((*itvec)->id() >= 0)
+             {
+                 char tmpArea[128] = {0};
+                 snprintf(tmpArea, 128, "%d,%lu|", (*itvec)->id(), (*itvec)->m_enter_time);
+                 strAreaInfo += tmpArea;
+             }
+         }
+         char sql[1024] = {0};
+         snprintf(sql, 1024, "REPLACE INTO rt_location (card_id, site_id, x, y, z, state, area_info) VALUES (%s, %d, %lf, %lf, %lf, 0, '%s');",
+             tool_other::type_id_to_str(c->m_type, c->m_id).c_str(), m_site->id(), pt.x, pt.y, pt.z, strAreaInfo.c_str());
+         db_tool::PushAsync(sql);
     }
-    char sql[1024] = {0};
-    snprintf(sql, 1024, "REPLACE INTO rt_location (card_id, site_id, x, y, z, state, area_info) VALUES (%s, %d, %lf, %lf, %lf, 0, '%s');",
-        tool_other::type_id_to_str(c->m_type, c->m_id).c_str(), m_site->id(), pt.x, pt.y, pt.z, strAreaInfo.c_str());
-    db_tool::PushAsync(sql);
 }
 
 void area_tool::on_leave(const std::shared_ptr<card_location_base>& c)

+ 2 - 1
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);
@@ -112,7 +113,7 @@ struct area_list:single_base<area_list,int,std::shared_ptr<area>>
     area_list();
 
 	//根据分站、所在点找出所在区域列表
-	std::vector<std::shared_ptr<area>> get_area(const std::shared_ptr<site> s,const std::shared_ptr<card_location_base> &c,const point&pt,int &);
+	std::vector<std::shared_ptr<area>> get_area(const std::shared_ptr<site>& s,const std::shared_ptr<card_location_base> &c,const point&pt,int &);
     std::vector<point> init_path(std::string  &str);
     ///id=-1为初始化所有
     void init_from_db(int id=-1);

+ 2 - 1
card_car.cpp

@@ -65,7 +65,8 @@ void car::handle_three_rates(const point &pt)
 
 void car::on_timer()
 {
-	make_package();
+    if(!empty())
+	    make_package();
 }
 int car::get_area()
 {

+ 22 - 29
event.cpp

@@ -110,9 +110,12 @@ void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,doub
                 _id = tool_other::card_id_to_u64(cardid);
             }
             ev_ptr=on_message(et,_id,f);
-            ev_ptr->m_cur_value=cur_value;
-            ev_ptr->m_limit_value=limit_value;
-            ev_ptr->m_desc=desc;
+            if(ev_ptr){
+                ev_ptr->m_cur_value=cur_value;
+                ev_ptr->m_limit_value=limit_value;
+                ev_ptr->m_desc=desc;
+                ev_ptr->m_id=eid;
+            }
             //保存告警信息
             event_list::instance()->add(eid,ev_ptr);
         }
@@ -216,9 +219,6 @@ std::shared_ptr<ya_event> card_event::on_message(EVENT_TYPE et,uint64_t id,bool
             auto lm = area_info_map.begin()->second;
             event_ptr->m_area_id = std::get<0>(lm);
             event_ptr->m_map_id = card_ptr->get_area_tool()->m_mapid;
-            event_ptr->m_landmarkid = std::get<1>(lm);
-            event_ptr->m_landmarkdist = std::get<3>(lm);
-            event_ptr->m_landmarkdirect = std::get<2>(lm);
         }
     }
     return event_ptr;
@@ -235,14 +235,12 @@ void event_list::save_event(std::shared_ptr<ya_event> ev_ptr)
     char sql[LENGTH_SQL] = {0};
     std::string _time = tool_time::to_str_ex(ev_ptr->m_cur_time);
     sprintf(sql,
-            "INSERT IGNORE INTO his_event_data(event_id, stat, event_type_id, obj_type_id, obj_id, \
-            map_id, area_id, limit_value, cur_value, x, y, cur_time, description, \
-            landmark_id, landmark_dist,direction_mapper_id )\
-            VALUES(%ld, %d, %d, %d, %s, %d, %d, %.2f, %.2f, %f, %f, '%s', '%s', %d, %10.3f, %d);",
-    ev_ptr->get_id(), ev_ptr->m_status, ev_ptr->m_ev_type, ev_ptr->m_obj_type, ev_ptr->m_obj_id.c_str(),
+            "INSERT IGNORE INTO his_event_data(event_id,id, stat, event_type_id, obj_type_id, obj_id, \
+            map_id, area_id, limit_value, cur_value, x, y, cur_time, description) \
+            VALUES(%ld,%ld, %d, %d, %d, %s, %d, %d, %.2f, %.2f, %f, %f, '%s', '%s');",
+            ev_ptr->get_id(),ev_ptr->m_id,ev_ptr->m_status, ev_ptr->m_ev_type, ev_ptr->m_obj_type, ev_ptr->m_obj_id.c_str(),
             ev_ptr->m_map_id, ev_ptr->m_area_id, ev_ptr->m_limit_value, ev_ptr->m_cur_value, ev_ptr->x, ev_ptr->y,
-            _time.c_str(), ev_ptr->m_desc.c_str(),
-            ev_ptr->m_landmarkid, ev_ptr->m_landmarkdist, ev_ptr->m_landmarkdirect);
+            _time.c_str(), ev_ptr->m_desc.c_str());
 
     db_tool::PushAsync(sql);
 }
@@ -250,7 +248,7 @@ void event_list::save_event(std::shared_ptr<ya_event> ev_ptr)
 void event_list::load_his_data_from_db()
 {
     std::unordered_map<uint64_t, std::shared_ptr<ya_event>> map;
-    const char *sql = "SELECT event_id, stat,event_type_id,obj_type_id,obj_id,map_id,area_id,\
+    const char *sql = "SELECT event_id, id,stat,event_type_id,obj_type_id,obj_id,map_id,area_id,\
             limit_value,cur_value,x,y, cur_time FROM his_event_data \
             WHERE event_id IN (SELECT MAX(event_id) FROM his_event_data \
                                WHERE cur_time > (CASE obj_type_id \
@@ -271,13 +269,16 @@ void event_list::load_his_data_from_db()
     uint64_t nCount = DBRes.GetRecordCount( Error );
     if (nCount > 0)
     {
-        log_info( "init_vehicle_category. The record count=%ld\n", nCount );
+        log_info( "init_event_list. The record count=%ld\n", nCount );
 
         while ( DBRes.GetNextRecod(Error) )
         {
-            long long event_id  = 0;
+            long long int event_id  = 0;
             DBRes.GetField( "event_id",event_id, Error );
 
+            long long int id  = 0;
+            DBRes.GetField( "id",id, Error );
+
             int event_type_id  = 0;
             DBRes.GetField( "event_type_id",event_type_id, Error );
 
@@ -327,15 +328,11 @@ void event_list::load_his_data_from_db()
             ev->m_area_id = area_id;
             ev->x = x;
             ev->y = y;
-
-            map.insert(std::make_pair(event_id, ev));
-        }
-
-        for(auto&iter: m_map)
-        {
-            auto ev = iter.second;
-            log_info("event list %lld,%d,%d,%d,%s,%d,%d,%f,%f,%f,%f,%s"
-                     , ev->get_id(),ev->m_status,ev->m_ev_type,ev->m_obj_type,ev->m_obj_id.c_str()
+            ev->m_id = id;
+            
+            map.insert(std::make_pair(id, ev));
+            log_info("event_list %lld,%lld,%d,%d,%d,%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%s"
+                     , ev->get_id(),ev->m_id,ev->m_status,ev->m_ev_type,ev->m_obj_type,ev->m_obj_id.c_str()
                      ,ev->m_map_id,ev->m_area_id,ev->m_limit_value,ev->m_cur_value
                      ,ev->x,ev->y
                      ,tool_time::to_str_ex(ev->m_cur_time).c_str());
@@ -393,10 +390,6 @@ void event_list::_ev_to_node(std::shared_ptr<ya_event> ev_ptr,
     ev.AddMember(JSON_KEY_EVENT_CUR_VALUE,ev_ptr->m_cur_value, allocator);
     ev.AddMember(JSON_KEY_EVENT_CUR_TIME,tool_time::to_ms(ev_ptr->m_cur_time), allocator);
 
-    ev.AddMember(JSON_KEY_EVENT_LANDMARK_ID,ev_ptr->m_landmarkid, allocator);
-    ev.AddMember(JSON_KEY_EVENT_LANDMARK_DIRECTION,ev_ptr->m_landmarkdirect, allocator);
-    ev.AddMember(JSON_KEY_EVENT_LANDMARK_DISTANCE,ev_ptr->m_landmarkdist, allocator);
-
     out_data.PushBack(ev, allocator);
 }
 

+ 2 - 10
event.h

@@ -75,9 +75,6 @@ public:
         m_limit_value = 0;
         m_cur_value = 0;
         m_desc = "";
-        m_landmarkid = 0;
-        m_landmarkdirect = 0;
-        m_landmarkdist = 0;
 
         m_status=ES_START;
         m_is_display=true;
@@ -85,6 +82,8 @@ public:
     }
     ~ya_event(){}
 public:
+    //key of event_list. 
+    uint64_t m_id;
     ///告警状态,开始、结束
     EVENT_STATUS m_status;
 
@@ -112,13 +111,6 @@ public:
     ///描述
     std::string m_desc;
 
-    /// 地标信息
-    int m_landmarkid;
-    /// 与地标的距离
-    double m_landmarkdist;
-    /// 所处地标的方向
-    int m_landmarkdirect;
-    //是否显示
     bool m_is_display;
     //是否已经发送 ture bu发送, false推送. 推送完置为true
     bool m_is_sent;

+ 2 - 2
mine_business.cpp

@@ -64,13 +64,13 @@ struct card_sensor
     void make_reverse_condition(int16_t antid,uint16_t ct,double d)
     {
         dist[antid]=d;
-        if(ct == ct){
+        if(this->ct == ct){
             sum++;
             int b=-1;
             if (dist[0]>dist[1]) b=0 ;else b =1;
             if(b==bigger) count++; //合格的点
         }
-        ct = ct;
+        this->ct = ct;
     }
     void set(const point &p0,const point &p1,int id)
     {

+ 58 - 45
module_service/area_business_count_checker.cpp

@@ -10,6 +10,32 @@
 	区域内实时人数存储在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 )
+        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,52 +44,42 @@ 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)
 {
-
-
 }
 
 	//减少计数
 void area_business_count_checker::on_leave(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())
+    if (nullptr == a->m_area )
     {
         return ;
     }
@@ -78,6 +94,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 +109,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);

+ 32 - 57
module_service/area_business_person_dwell_checker.cpp

@@ -14,69 +14,53 @@
 
 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)
+{
+    if(!c->is_person())
+      return;
+    std::shared_ptr<SPersonDwellChecker> p = std::make_shared<SPersonDwellChecker>();
+    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<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;
-    log_info("area_business_person_dwell_checker::on_enter : In Area=%d Card = %d  ",a->m_area->is_mine(),c->m_id);
+    ptr = std::make_shared<SPersonDwellChecker>();
+    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<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
+    if(!c->is_person())
+      return;
     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 limit_val = a->m_area->m_limit_person_second;
+	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())
+	if (!ptr_temp->m_send_event && a->m_area->m_limit_person_second < cur_val)
     {
-	    if (a->m_area->m_limit_person_second > cur_val)
-        {
-	        return;
-        }
-	    ptr_temp->m_send_event = true;
 	    evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
-	    limit_val = a->m_area->m_limit_person_second;
+        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);
     }
-	else if (c->is_vehicle())
-    {
-	    return ;
-    }
-	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,limit_val,cur_val,true);
+
 }
 
 
@@ -84,26 +68,17 @@ void area_business_person_dwell_checker::on_hover(const std::shared_ptr<area_hov
 void area_business_person_dwell_checker::on_leave(const std::shared_ptr<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
+    if(!c->is_person())
+      return;
     auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
     if(nullptr == ptr_temp)
-    {
         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())
-    {
-        evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
-    }
-    else
+    if(ptr_temp->m_send_event)
     {
-        return ;
+        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);
     }
-    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);
 	//判断是否超时

+ 0 - 1
web-client.cpp

@@ -2,7 +2,6 @@
 #include <functional>
 #include <thread>
 #include <memory>
-#include <memory>
 #include <ev++.h>
 
 #include "zio.h"

+ 4 - 3
znet.cpp

@@ -180,7 +180,7 @@ struct sock_client:fd_io,client_ex
 	io_context&m_ic;
 	std::string m_name;
 	std::atomic<bool> m_close_flag{false};
-	int   m_type=0;//site
+	int   m_type=1;//site
 
 	char  *m_b{0};
 	int   m_clen{0};
@@ -439,11 +439,12 @@ struct sock_client:fd_io,client_ex
 
 	bool check_crc(const char*b,size_t mlen)
 	{
+        return true;
 		uint16_t crc=b[mlen-2];
 		crc<<=8;
 		crc|=b[mlen-1];
 
-		if(do_crc((unsigned char*)b,mlen)==crc)
+		if(do_crc((unsigned char*)b+2,mlen-4)==crc)
 			return true;
 
 		return false;
@@ -527,7 +528,7 @@ struct main_loop:io_context
 
 		sock_listen _1(*this,fd);
 
-		stdin_io _2(*this);
+//		stdin_io _2(*this);
 
 		block_sig(SIGPIPE);
 		signal_w sint(*this,SIGINT),term(*this,SIGTERM);

+ 1 - 1
znet.h

@@ -8,7 +8,7 @@
 struct client:std::enable_shared_from_this<client>
 {
 	virtual std::string name()=0;
-	virtual int type()=0;			//分站:0,WEB:1
+	virtual int type()=0;			//分站:1,模拟客户端:2
 	virtual int handle()=0;
 
 	virtual void close()=0;