Browse Source

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

zzj 6 years ago
parent
commit
f9c8be31c7

+ 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;

+ 0 - 3
area.cpp

@@ -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);
 }

+ 4 - 1
area.h

@@ -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)

+ 2 - 1
card_base.cpp

@@ -18,7 +18,7 @@
 #include "common_tool.h"
 #include "ant.h"
 #include "area.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)
@@ -44,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);

+ 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);
-////    }
-//}
-