Ver Fonte

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

chensongchao há 6 anos atrás
pai
commit
400a1c7986

+ 1 - 1
ant.cpp

@@ -314,7 +314,7 @@ void sit_list::read_sit_list(int id)
 }
 void site::create_area()
 {
-    m_area=std::make_shared<area>(-m_id,0,0,m_scale,m_map_id,1<<9);
+    m_area=std::make_shared<area>(-m_id,0,0,m_scale,m_map_id,1<<7);
 }
 /*
    处理分站供电状态,交流供电时,ac_down=false,直流供电时,ac_down=true

+ 1 - 1
ant.h

@@ -194,7 +194,7 @@ struct site:point,std::enable_shared_from_this<site>
         return READER_TYPE_ID_UP == m_reader_type_id;
     }
     void create_area();
-    const std::shared_ptr<area>& get_area()const{return m_area;}
+    const std::shared_ptr<area> &get_area()const{return m_area;}
     point get_dstp(const point pt) const
     {
         point tmp;

+ 4 - 7
area.cpp

@@ -69,7 +69,7 @@ struct special_area:area
 area::area(int id,int limit_count_person, int limit_time_person,double scale,int32_t mapid,int32_t type)
      :m_id(id)
      ,m_area_type(type)
-     ,m_limit_person_second(limit_time_person)
+     ,m_limit_person_min(limit_time_person)
      ,m_limit_person_count(limit_count_person)
      ,m_scale(scale)
      ,m_mapid(mapid)
@@ -429,7 +429,7 @@ void area_list::init_from_db(int id/*=-1*/)
         if(-1 == id)
         {
             std::shared_ptr<area> ap = create(area_type_id,area_id,over_count_person,over_time_person, scale,map_id,b_type);
-            ap->m_limit_vehicle_second = over_time_vehicle;
+            ap->m_limit_vehicle_min = over_time_vehicle;
             ap->m_limit_vehicle_count = over_count_vehicle;
             ap->m_speed=std::move(map_);
             ap->m_is_work_area = is_work_area;
@@ -459,9 +459,9 @@ void area_list::init_from_db(int id/*=-1*/)
                 log_info("point:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
 
             log_info("基础数据 增加或修改区域成功:区域id:%d,over_count_person:%d over_time_person:%d,scale:%.2f,map_id:%d\
-                     ,area_type_id:%d,over_count_vehicle:%d,over_time_vehicle:%d",
+                     ,area_type_id:%d,over_count_vehicle:%d,over_time_vehicle:%d,b_type:%d",
                      id,over_count_person, over_time_person,scale,map_id,area_type_id,
-                     over_count_vehicle,over_time_vehicle);
+                     over_count_vehicle,over_time_vehicle,b_type);
 
 			if(newobj)
 			{
@@ -539,7 +539,6 @@ void area_tool::on_point(const std::shared_ptr<card_location_base>& c,const poin
       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();
@@ -557,7 +556,6 @@ void area_tool::on_point(const std::shared_ptr<card_location_base>& c,const poin
 	auto a1=areas.begin() ,ae=areas.end();
 
 	std::vector<std::shared_ptr<area_hover>> nlist;
-
 	while (c1!=ce && a1!=ae)
 	{
 		if ((*c1)->id()<(*a1)->id()) //离开区域
@@ -692,7 +690,6 @@ void area_tool::set_area_info(int mapid,int areaid,const point &pt,uint64_t t)
 	int landmark_id = std::get<0>(lm);
 	int landmark_dir = std::get<1>(lm);
 	double landmark_dis = std::get<2>(lm)*m_scale;
-	//log_info("landmark:%d %d %.2f,(%.2f,%.2f),%f",landmark_id,landmark_dir,landmark_dis,pt.x,pt.y,m_scale);
 	std::tuple<int,int,int,double,uint64_t> tinfo=std::make_tuple(areaid,landmark_id,landmark_dir,landmark_dis,t);
 	m_area_info[areaid].swap(tinfo);
 }

+ 8 - 5
area.h

@@ -54,12 +54,12 @@ struct area
                      int32_t type,int limit_count_vehicle, int limit_time_vehicle)
     {
         m_area_type=type;
-        m_limit_person_second=limit_time_person;
+        m_limit_person_min=limit_time_person;
         m_limit_person_count=limit_count_person;
         m_scale=scale;
         m_mapid=mapid;
         m_limit_vehicle_count=limit_count_vehicle;
-        m_limit_vehicle_second=limit_time_vehicle;
+        m_limit_vehicle_min=limit_time_vehicle;
     }
 public:
 	std::vector<area_business*> m_area_business_list;
@@ -106,14 +106,14 @@ public:
     int m_area_type;
 
 	//人卡超时及超员数量(阀值)
-    int m_limit_person_second;
+    int m_limit_person_min;
     int m_limit_person_count;
     //是否人卡超员已有告警
     bool m_event_person_count;
     bool m_event_person_show_count;
 
 	//人卡超时及超员数量(阀值)
-    int m_limit_vehicle_second;
+    int m_limit_vehicle_min;
     int m_limit_vehicle_count;
     //是否人卡超员已有告警
     bool m_event_vehicle_count;
@@ -217,7 +217,10 @@ struct area_tool
 	int m_mapid=-1;
 	double m_scale=2.0;
     std::shared_ptr<site> m_site=nullptr;
-
+    void clear()
+    {
+        m_area_info.clear();
+    }
     void set(const std::shared_ptr<site>& s)
     {
         if(m_site != s)

+ 1 - 1
card.cpp

@@ -24,7 +24,7 @@ void card_list::init_staffer(const std::string & lszId64)
 
 	std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> 
 		map=std::move(db_card::load_person(lszId64,strategy));
-
+	
 	if(map.empty())
 	{
 		log_error("增加或修改失败,数据库中找不到: card_id=%", lszId64.c_str());

+ 4 - 7
card_base.cpp

@@ -18,8 +18,7 @@
 #include "common_tool.h"
 #include "ant.h"
 #include "area.h"
-#include "ya_setting.h"
-
+#include "cardMgr.h"
 extern config_file config;
 
 card_location_base::card_location_base(const std::string&type,uint32_t id,uint16_t dis,int16_t t,int32_t deptid,int32_t level_id,uint32_t cid)
@@ -45,6 +44,7 @@ void card_location_base::on_location(const std::vector<point>&vp,const std::vect
 		//Msg m;
 		//m.type=m_type;m.x=(int)x;m.y=(int)y;m.cmd=CMD_HANDLE;m.cardid=m_type<<32|m_id;
 		//cardMgr::instance()->tryPut(m);
+
 		double acc = lm[0].m_acc;
         m_acc = lm[0].m_acc;
 		log_info("useful:card_id:%d,ct:%d,timestamp:%llu, loc_point,x:%f,y:%f acc:%.2f",m_id,m_ct,m_time,x,y,acc);
@@ -89,13 +89,10 @@ void card_location_base::upt_card_pos(YA::_CARD_POS_&cp, point &pt)
     point _p;
     if(pt.empty())
     {
-        _p=*this;
-        pt=_p;
+         _p=*this;pt=_p;
     }
     else
-	{
-       	 _p=pt;
-	}
+         _p=pt;
 	cp.x = tool_other::round(_p.x,3);
 	cp.y = tool_other::round(_p.y,3);
 	//cp.z = pt.z;

+ 6 - 3
card_person.cpp

@@ -33,15 +33,18 @@ person::~person()
 }
 void person::clear()
 {
-	m_area_tool.reset(new area_tool);
-	m_mine_tool.reset(new mine_tool);
+	//m_area_tool.reset(new area_tool);
+	//m_mine_tool.reset(new mine_tool);
+    m_mine_tool->clear();
+    m_area_tool->clear();
 	card_location_base::clear();
     uint64_t id = tool_other::type_id_to_u64(m_type,m_id);
     for(std::uint8_t i=0;i<CARD_EVENT_COUNT_MAX;i++)
     {
         if(m_event[i]!=0)
         {
-            event_tool::instance()->handle_event(OT_CARD,static_cast<EVENT_TYPE>(i),id,0,0,true);
+            log_info("clear_person_card_event:%d,%d",m_id,i);
+            event_tool::instance()->handle_event(OT_CARD,static_cast<EVENT_TYPE>(i),id,0,0,false);
             m_event[i]=0;
         }
     }

+ 13 - 8
mine.h

@@ -17,17 +17,22 @@ struct card_location_base;
 struct mine_tool
 {
     mine_tool()
-		:m_over_speed_count(0)
-		,m_normal_speed_count(0)
-		,m_status_call(0)
-        ,m_is_attendance(false)
-		,m_attendance_start_time(std::chrono::seconds(0))
-		,m_is_overtime(false)
-		,m_overtime(std::chrono::seconds(0))
     {
-
+        clear();
     }
 
+    void clear()
+    {
+        m_over_speed_count=0;
+		m_over_speed_count=0;
+		m_normal_speed_count=0;
+		m_status_call=0;
+        m_is_attendance=false;
+		m_attendance_start_time=std::chrono::system_clock::time_point(std::chrono::seconds(0));
+		m_is_overtime=false;
+		m_overtime=std::chrono::system_clock::time_point(std::chrono::seconds(0));
+        
+    }
     int    m_over_speed_count;
     int    m_normal_speed_count;
     ///CALL_NONE(0):没有呼叫,CALL_ING(2):正在呼叫,CALL_SUCCESSED(1):呼叫成功

+ 20 - 2
module_service/area_business_count_checker.cpp

@@ -41,6 +41,8 @@ void area_business_count_checker::on_load_his(const std::shared_ptr<area_hover>&
     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)
 {
@@ -57,12 +59,16 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
         int aid=a->m_area->id();
 	    EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
         if(pc>limit_val){
+            lock();
 		    event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_person_count=true,DT_NORMAL);
+            unlock();
 		    log_info("person_count_enter:%d,v_count:%d limit:%d",aid,pc,limit_val);
         }
         if(pc_>limit_val){
+            lock();
 		    event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_person_show_count=true,DT_SPECIAL);
-		    log_info("person_count_enter_show:%d,v_count:%d limit:%d",aid,pc,limit_val);
+            unlock();
+		    log_info("person_count_enter_show:%d,v_count:%d limit:%d",aid,pc_,limit_val);
         }
 	}
 	else if (c->is_vehicle())
@@ -76,12 +82,16 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
         int aid=a->m_area->id();
 		EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
         if(vc>limit_val){
+            lock();
 		    event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,vc,a->m_area->m_event_vehicle_count=true,DT_NORMAL);
+            unlock();
 		    log_info("vehicle_count_enter:%d,v_count:%d limit:%d",aid,vc,limit_val);
         }
         if(vc_>limit_val){
+            lock();
 		    event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,vc_,a->m_area->m_event_vehicle_show_count=true,DT_SPECIAL);
-		    log_info("vehicle_count_enter_show:%d,v_count:%d limit:%d",aid,vc,limit_val);
+            unlock();
+		    log_info("vehicle_count_enter_show:%d,v_count:%d limit:%d",aid,vc_,limit_val);
         }
 	}
 }
@@ -107,11 +117,15 @@ void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
         int aid=a->m_area->id();
 	    EVENT_TYPE 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&& pc <= limit_val){
+            lock();
 			event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_person_count=false,DT_NORMAL);
+            unlock();
 		    log_info("person_count_leave:%d,v_count:%d limit:%d",aid,pc,limit_val);
         }
 		if(a->m_area->m_event_person_show_count&& pc_ <= limit_val){
+            lock();
 			event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_person_show_count=false,DT_SPECIAL);
+            unlock();
 		    log_info("person_count_leave_show:%d,v_count:%d limit:%d",aid,pc,limit_val);
         }
 	}
@@ -126,11 +140,15 @@ void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
         int aid=a->m_area->id();
 		EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
 		if(a->m_area->m_event_vehicle_count&& pc <= limit_val){
+            lock();
 			event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_vehicle_count=false,DT_NORMAL);
+            unlock();
 		    log_info("vehicle_count_leave:%d,v_count:%d limit:%d",aid,pc,limit_val);
         }
 		if(a->m_area->m_event_vehicle_show_count&& pc_ <= limit_val){
+            lock();
 			event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_vehicle_show_count=false,DT_SPECIAL);
+            unlock();
 		    log_info("vehicle_count_leave_show:%d,v_count:%d limit:%d",aid,pc,limit_val);
         }
 	}

+ 20 - 0
module_service/area_business_count_checker.h

@@ -2,6 +2,7 @@
 #define _area_business_count_checker_hpp_
 
 #include "area_business.h"
+#include "atomic"
 
 /*
 	判断当前区域a中的人数是否超过设定人数,超过后告警
@@ -10,6 +11,10 @@
 */
 struct area_business_count_checker:area_business
 {
+    area_business_count_checker()
+    {
+        m_mutex=0;
+    }
 	//服务器重启加载数据
 	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);
 	//增加计数,并进行判断
@@ -17,6 +22,21 @@ struct area_business_count_checker:area_business
 	void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
 	//减少计数
 	void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
+private:
+	std::atomic<int> m_mutex;
+	void lock()
+	{
+		int expected=0;
+		while(!m_mutex.compare_exchange_strong(expected,1))
+			expected=0;
+		assert(m_mutex.load()==1);
+	}
+
+	void unlock()
+	{
+		m_mutex.store(0);
+	}
+
 };
 
 

+ 2 - 53
module_service/area_business_person_attendance.cpp

@@ -54,8 +54,6 @@ void area_business_person_attendance::on_leave(const std::shared_ptr<area_hover>
     //作为一条结束考勤记录保存到数据库
     db_tool::save_attendance(card_ptr, area_hover_ptr);
 
-    auto per = std::dynamic_pointer_cast<person>(card_ptr);
-    per->clear();
 
 
 	YA::_CARD_POS_ cp;
@@ -77,6 +75,8 @@ void area_business_person_attendance::on_leave(const std::shared_ptr<area_hover>
         swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
     }
     
+    auto per = std::dynamic_pointer_cast<person>(card_ptr);
+    per->clear();
 }
 
 /**
@@ -170,54 +170,3 @@ void area_business_person_attendance::_to_json_card_up_one(std::shared_ptr<card_
     out_datas.PushBack(data, allocator);
 }
 
-
-/////升井或收到web的删除卡命令  site_ptr==nullptr表示收到web的删除卡命令
-///// 保存考勤记录,发升井json,清理卡
-//void area_business_person_attendance::up_mine(std::shared_ptr<card_location_base> card_ptr, bool is_web_delete)
-//{
-//    auto mine_tool_ptr = card_ptr->get_mine_tool();
-//    if(!mine_tool_ptr->m_is_attendance)
-//    {
-//        return;
-//    }
-
-//    //考勤结束
-//    mine_tool_ptr->m_is_attendance=false;
-
-//    //作为一条结束考勤记录保存到数据库
-//    db_tool::save_attendance(card_ptr);
-
-//    rapidjson::Document doc(rapidjson::kObjectType);
-//    rapidjson::Value datas(rapidjson::kArrayType);
-//    rapidjson::Document::AllocatorType& allocator=doc.GetAllocator();
-
-//    _to_json_card_up_one(card_ptr, datas, allocator);
-//    //module_meta_date_changed::clear_card(card_ptr);
-
-//    auto rea_tool = card_ptr->get_area_tool();
-//    rea_tool->on_leave(card_ptr);
-//    card_ptr->clear();
-
-//    //升井json发给web
-//    if(datas.Size() > 0)
-//    {
-//        doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_UP_MINE, allocator);
-//        //doc.AddMember(JSON_ROOT_KEY_VERSION,INTERFACE_VERSION, allocator);
-//        doc.AddMember(JSON_ROOT_KEY_DATA, datas, allocator);
-
-//        swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
-//    }
-
-////    if(is_web_delete)
-////    {
-////        log_info("人卡考勤结束:卡id=%d,卡type=%d,分站id=%d,分站reader_type_id=%d,stat_attendance=%d",
-////                 card_ptr->m_id, card_ptr->m_type,
-////                 site_ptr->m_id,site_ptr->m_reader_type_id,mine_tool_ptr->m_is_attendance);
-////    }
-////    else
-////    {
-////        log_info("收到web的删除卡命令,人卡考勤结束:卡id=%d,卡type=%d, stat_attendance=%d",
-////                 card_ptr->m_id, card_ptr->m_type, mine_tool_ptr->m_is_attendance);
-////    }
-//}
-

+ 2 - 2
module_service/area_business_person_dwell_checker.cpp

@@ -31,8 +31,8 @@ void area_business_person_dwell_checker::on_hover(const std::shared_ptr<area_hov
     if(!c->is_person()||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);
+	int limit_val = a->m_area->m_limit_person_min*60;
+	int cur_val = ( tool_time::now_to_seconds() - a->m_enter_time / 1000);
 	EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
 	if (limit_val < cur_val)
     {

+ 2 - 0
worker.cpp

@@ -102,6 +102,8 @@ struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
 	{
 		m_local_card_list.clear();
 		card_list::instance()->accept(*this);
+
+		log_info("update local cards,count=%d",m_local_card_list.size());
 	}
 
 	void do_task(task&t)