Browse Source

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

chensongchao 6 years ago
parent
commit
d180c7bc47

+ 1 - 4
Makefile.am

@@ -14,10 +14,6 @@ SRC_MODULE_SERVICE= module_service/area_business_car_attendance.cpp module_servi
 					module_service/module_other_alarm.cpp 
 
 
-
-#module_service/area_business_work_rate.cpp
-
-
 SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp mine_business.cpp card_area.cpp card_base.cpp card_car.cpp \
     	  card.cpp card_message_handle.cpp cardMgr.cpp card_path.cpp card_person.cpp crc.cpp geo_hash.cpp \
 		  landmark.cpp line_fit.cpp loc_point.cpp loc_tool.cpp message.cpp message_file.cpp mine.cpp \
@@ -33,6 +29,7 @@ AM_LDFLAGS=-Wall -pthread -m64 -g -O0 -std=c++11  -L${prefix}/lib  -L/usr/local/
 yals_SOURCES=${AM_SOURCES} main.cpp
 yals_CPPFLAGS=${AM_CPPFLAGS} 
 yals_LDFLAGS=${AM_LDFLAGS}  -lev -lzlog -lrt -lboost_chrono -lboost_system -lboost_thread -lmysqlclient -lthree_rates
+
 yals_LDADD=db/libyadb.a websocket/libwebsocket.a
 
 async_SOURCES=async.cpp

+ 49 - 8
area.cpp

@@ -15,6 +15,9 @@
 #include "area_business.h"
 #include "site_area.h"
 #include"card.h"
+#include "tool_time.h"
+#include "websocket/ws_common.h"
+#include "websocket/wsClientMgr.h"
 
 template<> std::shared_ptr<area_list> 
 single_base<area_list, int, std::shared_ptr<area>>::m_instance=std::make_shared<area_list>();
@@ -33,6 +36,14 @@ struct underground_area:area
 		  f=true;
 		return f;
 	}
+	//推入特殊区域的是否需要其他信息
+	virtual	void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
+	{
+		YA::_CARD_POS_ cp;
+		cp.area_id = m_id;
+        area::on_enter(a, c);
+		swsClientMgr.SendSpecialAreaProcess(cp);
+	}
 };
 
 struct special_area:area
@@ -413,11 +424,16 @@ std::vector<std::shared_ptr<area>> area_list::get_area(const std::shared_ptr<sit
 	//区域覆盖不完全地图,很多车辆人行驶在地图外,如何确认.
 	return std::move(ret);
 }
+area_hover::area_hover(std::shared_ptr<area>&area,const point&pt)
+	:m_area(area)
+{
+    m_enter_time=m_last_time=tool_time::now_to_ms();
+    m_enter_point=m_last_point=pt;
+}
 
 void area_tool::on_point(const std::shared_ptr<site>&s,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);
-	setLandmark(pt);
 	
 	int special_area=-1;
 	std::vector<std::shared_ptr<area>> areas=area_list::instance()->get_area(s,c, pt,special_area);
@@ -482,12 +498,37 @@ void area_tool::on_leave(const std::shared_ptr<card_location_base>& c)
     }
 }
 
-void area_hover::setLandmark(const point &pt)
+void area_tool::set_area_info(int mapid,double scale,int areaid,const point &pt,uint64_t t,int type)
+{
+	if(0==type)
+	{
+		m_mapid = mapid;
+		m_scale=scale;
+		set_area_info(mapid,areaid,pt,t);
+	}
+	else if(1==type)
+	{
+		set_area_info(mapid,areaid,pt,t);
+	}
+	else if(2==type)
+	{
+		auto it =m_area_info.find(areaid);
+		if(it != m_area_info.end())
+		  m_area_info.erase(it);
+	}
+	else
+	{
+		log_info("wrong type..");
+	}
+}
+void area_tool::set_area_info(int mapid,int areaid,const point &pt,uint64_t t)
 {
-	set(pt);
-	auto lm = Landmark_list::instance()->get(mapid(),id(),pt);
-	landmark_id = std::get<0>(lm);
-	landmark_dir = std::get<1>(lm);
-	landmark_dis = std::get<2>(lm)*scale();
-	log_info("landmark:%d %d %.2f,(%.2f,%.2f),%f",landmark_id,landmark_dir,landmark_dis,pt.x,pt.y,scale());
+	auto lm = Landmark_list::instance()->get(mapid,areaid,pt);
+	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);
 }
+

+ 12 - 49
area.h

@@ -9,6 +9,7 @@
 #include "common.h"
 #include <write-copy.h>
 #include <set>
+#include <map>
 
 struct area_hover;
 struct point;
@@ -122,13 +123,8 @@ private:
 struct area_hover
 {
     std::shared_ptr<area>  m_area;
-    time_t m_enter_time,m_last_time;
-    point  m_enter_point,m_last_point;
-
-    int landmark_id;
-    int landmark_dir;
-    double landmark_dis;
-
+    uint64_t m_enter_time,m_last_time;
+    point	 m_enter_point,m_last_point;
 	/*
 		记录该业务所关心的需持续使用的数据,每个业务一个指针
 		建议该数据项在on_enter时初始化,on_leave时清除
@@ -136,17 +132,8 @@ struct area_hover
 	std::vector<std::shared_ptr<business_data>> m_data;
 
     area_hover()=default;
-    area_hover(std::shared_ptr<area>&area,const point&pt)
-        :m_area(area)
-    {
-        m_enter_time=m_last_time=time(0);
-        m_enter_point=m_last_point=pt;
-        landmark_id=0;
-        landmark_dir=0;
-        landmark_dis=0;
-    }
-
-	std::shared_ptr<business_data>&get_business_data(int type)
+    area_hover(std::shared_ptr<area>&area,const point&pt);
+   	std::shared_ptr<business_data>&get_business_data(int type)
 	{
 		if(type>=(int)m_data.size())
 		{
@@ -177,11 +164,6 @@ struct area_hover
     {
         return m_area->id()<o.m_area->id();
     }
-    std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark()
-    {
-        return std::make_tuple(m_enter_time,m_last_time,mapid(),id(),landmark_id,landmark_dir,landmark_dis,scale());
-    }
-    void setLandmark(const point &pt);
     void set(const point&pt)
     {
         m_last_time=time(0);
@@ -198,8 +180,10 @@ struct area_tool
 	std::vector<std::shared_ptr<area_hover>> m_hover_list;
 
 	//推送卡位置时需要推送的所在区域id列表
-	std::vector<int> m_push_area_id_list;
-
+	std::map<int,std::tuple<int,int,int,double,uint64_t>> m_area_info;
+	int m_mapid=-1;
+	double m_scale=2.0;
+	//返回第一个,人卡第一个全部是井下0
 	std::shared_ptr<area_hover> get_area_first()const
 	{
 		if(m_hover_list.empty())
@@ -218,30 +202,9 @@ struct area_tool
 	void on_point(const std::shared_ptr<site>&s,const std::shared_ptr<card_location_base>& c,const point&pt);
     void on_leave(const std::shared_ptr<card_location_base>& c);
 
-    void setLandmark(const point &pt)
-    {
-		for(const auto & ha:m_hover_list)
-			ha->setLandmark(pt);
-    }
-    std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark()
-    {
-		double dis = DBL_MAX,d=0;
-		std::shared_ptr<area_hover> tmp=nullptr;
-		for(const auto & ha:m_hover_list)
-		{
-			d=ha->landmark_dis;
-			if(d<dis){
-				dis=d;tmp = ha;
-			}
-		}	
-		if(tmp)
-		  return tmp->getLandmark();
-		else
-          return std::make_tuple(0,0,0,0,0,0,0,0);
-
-    }
-
-	void change_area(uint32_t card_id,double speed,int16_t type,int32_t new_areaid)
+	void set_area_info(int mapid,double scale,int areaid,const point &pt,uint64_t t,int type);
+	void set_area_info(int mapid,int areaid,const point &pt,uint64_t t);
+   	void change_area(uint32_t card_id,double speed,int16_t type,int32_t new_areaid)
 	{
 #if 0
 		do_leave_biz(card_id,speed,type);

+ 37 - 23
card.cpp

@@ -43,13 +43,20 @@ void card_list::init_staffer(int64_t id64)
 		auto card_ptr = card_list::instance()->get(id64);
 		if(card_ptr)
 		{
-			person* tmp_ptr= static_cast<person*>(card_ptr.get());
-			tmp_ptr->m_display = static_cast<uint16_t>(db_person->m_display);
-			tmp_ptr->m_deptid = db_person->m_deptid;
-			//group_id
-			//occ_id
-			tmp_ptr->m_level_id = db_person->m_level_id;
-			//worktype_id
+            person* tmp_ptr= static_cast<person*>(card_ptr.get());
+            person* db_person_ptr= static_cast<person*>(db_person.get());
+
+            tmp_ptr->m_cid = db_person_ptr->m_cid;
+            tmp_ptr->m_type = db_person_ptr->m_type;
+            tmp_ptr->m_deptid = db_person_ptr->m_deptid;
+            //group_id
+            //occ_id
+            tmp_ptr->m_level_id = db_person_ptr->m_level_id;
+            tmp_ptr->m_display = db_person_ptr->m_display;
+            tmp_ptr->m_workLine = db_person_ptr->m_workLine;
+            tmp_ptr->m_stafferName = db_person_ptr->m_stafferName;
+            tmp_ptr->m_deptName = db_person_ptr->m_deptName;
+            tmp_ptr->m_worktype_id = db_person_ptr->m_worktype_id;
 		}
 		else
 		{
@@ -241,12 +248,16 @@ void card_list::load_his_card_postion_vehicle()
             area->m_vehicle_count++;
 
             point pt = *card_ptr;
-            card_ptr->m_area_tool->init_area(area,pt,temp_ptr);
+            //card_ptr->m_area_tool->init_area(area,pt,temp_ptr);
 			//m_area_hover = std::make_shared<area_hover>( area, pt,speed);
-            auto area_hover_ptr = card_ptr->get_area_hover();
+            //auto area_hover_ptr = card_ptr->get_area_hover();
 
             auto e_t = tool_time::to_time_ex(enter_time);
-            area_hover_ptr->m_enter_time = std::chrono::system_clock::to_time_t(e_t);
+            auto area_hover_ptr = std::make_shared<area_hover>();
+            area_hover_ptr->m_area = area;
+            area_hover_ptr->m_enter_time = tool_time::to_ms(e_t);
+            card_ptr->m_area_tool->m_hover_list.push_back(area_hover_ptr);
+            area_hover_ptr->m_area->on_enter(area_hover_ptr, temp_ptr);
 
             //int map_id  = 0;
             //int state  = 0;
@@ -259,9 +270,9 @@ void card_list::load_his_card_postion_vehicle()
                 mine_tool_ptr->m_is_attendance = true;
             }
 
-            area_hover_ptr->landmark_id = landmark_id;
-            area_hover_ptr->landmark_dir = direction_mapper_id;
-            area_hover_ptr->landmark_dis = landmark_dist;
+            //area_hover_ptr->landmark_id = landmark_id;
+            //area_hover_ptr->landmark_dir = direction_mapper_id;
+            //area_hover_ptr->landmark_dis = landmark_dist;
 
             card_ptr->m_time = tool_time::now_to_ms();
         }
@@ -310,7 +321,7 @@ void card_list::load_his_card_postion_staff()
                 continue;
             }
 
-            auto card_ptr = static_cast<car*>(temp_ptr.get());
+            auto card_ptr = static_cast<person*>(temp_ptr.get());
 
             double x = 0;
             DBRes.GetField( "x",x, Error );
@@ -361,13 +372,17 @@ void card_list::load_his_card_postion_staff()
             area->m_person_count++;
 
             point pt = *card_ptr;
-            card_ptr->m_area_tool->init_area(area,pt,temp_ptr);
-			
+            //card_ptr->m_area_tool->init_area(area,pt,temp_ptr);
 //			m_area_hover = std::make_shared<area_hover>(area,pt,speed);
-            auto area_hover_ptr = card_ptr->get_area_hover();
 
             auto e_t = tool_time::to_time_ex(enter_time);
-            area_hover_ptr->m_enter_time = std::chrono::system_clock::to_time_t(e_t);
+
+            auto area_hover_ptr = std::make_shared<area_hover>();
+            area_hover_ptr->m_area = area;
+            area_hover_ptr->m_enter_time = tool_time::to_ms(e_t);
+            card_ptr->m_area_tool->m_hover_list.push_back(area_hover_ptr);
+            area_hover_ptr->m_area->on_enter(area_hover_ptr, temp_ptr);
+
 			log_info("load_staff...%d,areaid:%d,mapid:%d",id,area->id(),area->mapid());
 
             //int map_id  = 0;
@@ -381,9 +396,9 @@ void card_list::load_his_card_postion_staff()
                 mine_tool_ptr->m_is_attendance = true;
             }
 
-            area_hover_ptr->landmark_id = landmark_id;
-            area_hover_ptr->landmark_dir = direction_mapper_id;
-            area_hover_ptr->landmark_dis = landmark_dist;
+            //area_hover_ptr->landmark_id = landmark_id;
+            //area_hover_ptr->landmark_dir = direction_mapper_id;
+            //area_hover_ptr->landmark_dis = landmark_dist;
 
             card_ptr->m_time = tool_time::now_to_ms();
         }
@@ -407,8 +422,7 @@ void card_list::on_message(zloop<task*> *loop,const message_locinfo&loc,bool is_
 
 bool card_list_visit::visit(std::shared_ptr<card_location_base> c)
 {
-//	if(c->on_timer())
-//		mine_business::inst()->put(c);
+	c->get_card();
 	return true;	
 }
 

+ 5 - 11
card_base.h

@@ -88,18 +88,12 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
     virtual void clear();
 	virtual void reset(std::shared_ptr<monkey_person> mp){}
     virtual int get_vehicle_type_id(){return  0;}
-    virtual std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark()=0;
+	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)=0;
 	virtual int get_area()=0;
     virtual std::shared_ptr<area_tool> get_area_tool()=0;
-    virtual int get_vehicle_category_id()
-    {
-        return -1;
-    }
-
-    virtual int get_workline()
-    {
-        return -1;
-    }
+    virtual int get_vehicle_category_id(){return -1;}
+    virtual int get_workline(){return -1;}
+	virtual void get_card(){};
 
     void on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history);
     void on_location(const std::vector<point>&vp,const std::vector<loc_message> &lm );
@@ -108,9 +102,9 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
 	void del_card_pos();
 	int	 get_stat();
 	void put_three_rates(card_pos &);
+
     bool is_person() const;
     bool is_vehicle() const;
-
 	virtual ~card_location_base();
 
     static std::shared_ptr<card_location_base> make_person(const std::string&type,uint32_t cardid,uint16_t needdisplay,int16_t t,

+ 26 - 24
card_car.cpp

@@ -9,7 +9,6 @@
 #include "select_tool.h"
 #include "websocket/ws_common.h"
 #include "special_area.h"
-#include "websocket/wsClientMgr.h"
 #include "common_tool.h"
 #include "tool_time.h"
 #include "mine_business.h"
@@ -45,6 +44,10 @@ std::shared_ptr<site_area_hover> car::get_site_area()
 {
 	return m_site_area;
 }
+void car::set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)
+{
+	m_area_tool->set_area_info(mapid,scale,areaid,*this,t,type);
+}
 
 void car::do_business(const std::shared_ptr<site>&site,const point &pt,double acc)
 {
@@ -69,10 +72,10 @@ void car::handle_three_rates(const point &pt)
 	m_biz_stat=get_stat();
 	cp.biz_stat = m_biz_stat;
 	cp.x=pt.x;cp.y=pt.y;cp.z=pt.z;	
-	const auto lm = m_area_tool->getLandmark();
+	//const auto lm = m_area_tool->getLandmark();
 //	cp.enter_time = std::get<0>(lm)*1000;
 //	cp.area_id = std::get<3>(lm);
-	cp.map_id = std::get<2>(lm);
+	cp.map_id = m_area_tool->m_mapid;
 	cp.vibration=m_acc;
 	put_three_rates(cp);
 }
@@ -97,24 +100,29 @@ void car::make_package()
 {
 	YA::_CARD_POS_ cp;
 	loc_point pt = getSmoothPoint();
+	//const auto lm = m_area_tool->getLandmark();
+	//cp.enter_area_time = std::get<0>(lm);
+	//cp.rec_time = std::get<1>(lm);
+	//uint32_t map_id = std::get<2>(lm);
+	//uint32_t area_id = std::get<3>(lm);
+	//cp.area_id=area_id;
+	//cp.landmark_id = std::get<4>(lm);
+	//cp.lm_direction = std::get<5>(lm);
+	//cp.landmark_dis=std::get<6>(lm);
+	cp.area_info=m_area_tool->m_area_info;	
+	cp.map_id =m_area_tool->m_mapid;
 
-	const auto lm = m_area_tool->getLandmark();
-	cp.enter_area_time = std::get<0>(lm);
-	cp.rec_time = std::get<1>(lm);
-	uint32_t map_id = std::get<2>(lm);
-	uint32_t area_id = std::get<3>(lm);
-	cp.map_id =map_id;cp.area_id=area_id;
-	cp.landmark_id = std::get<4>(lm);
-	cp.lm_direction = std::get<5>(lm);
-	cp.landmark_dis=std::get<6>(lm);
 	int32_t biz_stat=m_biz_stat;
-	
 	cp.biz_stat=biz_stat;
 	cp.down_time = m_mine_tool->get_down_time();
 	cp.work_time = m_mine_tool->get_work_time();
 	cp.is_on_duty=m_mine_tool->is_on_duty();
 	upt_card_pos(cp,pt);
-	m_his_location_card->push(pt.m_time,pt,area_id,map_id);
+	if(!cp.area_info.empty())
+	{
+		int areaid = cp.area_info.begin()->first;
+		m_his_location_card->push(pt.m_time,pt,areaid,cp.map_id);
+	}
 	uint64_t _now=tool_time::now_to_ms();
 	uint64_t t=_now>m_timeval?_now-m_timeval:m_timeval-_now;
 	if(t>10*1000)
@@ -129,11 +137,10 @@ void car::make_package()
 //		cp.area_id = special_id;
 //		swsClientMgr.SendSpecialAreaProcess(cp);
 //	}
-//	uint64_t _now=tool_time::now_to_ms();
-//	uint64_t t=_now>m_time?_now-m_time:m_time-_now;
-//	if(t<45*1000 && !empty())
-//	  f=true;
-//	return f;
+}
+void car::get_card()
+{
+	mine_business::inst()->put(shared_from_this());
 }
 loc_point car::getSmoothPoint()
 {
@@ -144,8 +151,3 @@ loc_point car::getSmoothPoint()
 	return lp;
 }
 
-std::tuple<time_t,time_t,int,int,int,int,double,double> car::getLandmark()
-{
-	return  m_area_tool->getLandmark();
-}
-

+ 2 - 3
card_car.h

@@ -19,7 +19,6 @@ struct car:card_location_base,card_area
 {
 	int m_vehicle_category_id=0;
     int m_vehicle_type_id=0;
-    //double m_acc =0;
 
 public:
 
@@ -44,14 +43,14 @@ public:
         return m_vehicle_category_id;
     }
 
+	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type);
+	virtual void get_card();
 private:
 	void handle_three_rates(const point &pt);
 	void on_timer();
 	//int statbiz(int32_t special_id);
 	void make_package();
 	loc_point getSmoothPoint();
-
-	virtual std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark();
 };
 
 

+ 21 - 20
card_person.cpp

@@ -40,6 +40,10 @@ void person::clear()
 	card_location_base::clear();
 }
 
+void person::set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)
+{
+	m_area_tool->set_area_info(mapid,scale,areaid,*this,t,type);
+}
 void person::site_hover(int sid)
 {
 	if(m_time<=0)
@@ -104,10 +108,6 @@ void person::reset(std::shared_ptr<monkey_person> mp)
 	m_monkeyPerson = mp;
 }
 
-std::tuple<time_t,time_t,int,int,int,int,double,double> person::getLandmark()
-{
-	return  m_area_tool->getLandmark();
-}
 void person::handle_three_rates(const point & pt)
 {
 	card_pos cp;
@@ -117,9 +117,6 @@ void person::handle_three_rates(const point & pt)
 	cp.biz_stat = m_biz_stat;
 	cp.x=pt.x;cp.y=pt.y;cp.z=pt.z;
 	cp.work_type_id=m_worktype_id;
-	const auto lm = m_area_tool->getLandmark();
-//	cp.enter_time = std::get<0>(lm)*1000;
-//	cp.area_id = std::get<3>(lm);
 	put_three_rates(cp);
 }
 
@@ -135,25 +132,29 @@ void person::on_timer()
 	  mine_business::inst()->fetch_add();
 	uint64_t _time=0;
 	point pt = getSmoothPoint(_time);
-	const auto lm = m_area_tool->getLandmark();
-
-	cp.enter_area_time = std::get<0>(lm)*1000;
-	cp.rec_time = std::get<1>(lm);
-
-	int32_t map_id = std::get<2>(lm);
-	int32_t area_id = std::get<3>(lm);
-	cp.map_id=map_id;cp.area_id=area_id;
-	cp.landmark_id = std::get<4>(lm);
-	cp.lm_direction = std::get<5>(lm);
-	cp.landmark_dis=std::get<6>(lm);
+//	const auto lm = m_area_tool->getLandmark();
+//	cp.enter_area_time = std::get<0>(lm)*1000;
+//	cp.rec_time = std::get<1>(lm);
+//	int32_t map_id = std::get<2>(lm);
+//	int32_t area_id = std::get<3>(lm);
+//	cp.map_id=map_id;cp.area_id=area_id;
+//	cp.landmark_id = std::get<4>(lm);
+//	cp.lm_direction = std::get<5>(lm);
+//	cp.landmark_dis=std::get<6>(lm);
+	cp.area_info=m_area_tool->m_area_info;	
+	cp.map_id =m_area_tool->m_mapid;
 
 	cp.biz_stat = m_biz_stat;
 	cp.down_time = m_mine_tool->get_down_time();
 	cp.work_time = m_mine_tool->get_work_time();
 	cp.is_on_duty= m_mine_tool->is_on_duty();
-	log_info("on_timer here ...%d,%lld,%.2f,%.2f,%d,%d",m_id,_time,pt.x,pt.y,area_id,map_id);
-	m_his_location_card->push(_time,pt,area_id,map_id);
 	upt_card_pos(cp,pt);
+	log_info("on_timer here ...%d,%lld,%.2f,%.2f,%d,%d--",m_id,_time,pt.x,pt.y,cp.map_id,cp.area_info.size());
+	if(!cp.area_info.empty())
+	{
+		int area_id = cp.area_info.begin()->first;
+		m_his_location_card->push(_time,pt,area_id,cp.map_id);
+	}
 	uint64_t _now=tool_time::now_to_ms();
 	uint64_t t=_now>m_timeval?_now-m_timeval:m_timeval-_now;
 	if(t>10*1000)

+ 1 - 1
card_person.h

@@ -27,7 +27,7 @@ struct person:card_location_base, card_area
     virtual std::shared_ptr<mine_tool> get_mine_tool();
     virtual std::shared_ptr<site_area_hover> get_site_area();
     virtual void do_business(const std::shared_ptr<site>&site,const point &pt,double acc);
-    virtual std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark();
+	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type);
     virtual int get_area();
     virtual std::shared_ptr<area_tool> get_area_tool()
     {

+ 1 - 1
db/Makefile.am

@@ -8,7 +8,7 @@ AM_CPPFLAGS=-Wall -pthread -m64 -std=c++11  -I${prefix}/include -I../../dist/inc
 AM_LDFLAGS =-Wall -pthread -m64 -std=c++11  -L${prefix}/lib  -L/usr/local/mysql/lib
 
 libyadb_a_SOURCES= db_card.cpp db_api/CDBResultSet.cpp db_api/CDBConnect.cpp \
-		db_api/CDBHelper.cpp db_api/CDBConnPool.cpp db_tool.cpp db_area.cpp db_history.cpp
+				   db_api/CDBHelper.cpp db_api/CDBConnPool.cpp db_tool.cpp db_area.cpp db_history.cpp
 
 DEFS= 
 EXTRA_DIST=

+ 0 - 1
db/db_api/CDBConnPool.cpp

@@ -384,4 +384,3 @@ namespace YADB
 		return nRet;
 	}
 }
-

+ 17 - 19
db/db_api/CDBConnPool.h

@@ -60,7 +60,6 @@ namespace YADB
 		* @return 返回创建的连接
 		* @return  >0   成功\n
 		* @return  ==0  失败\n
-
 		* @note
 
 		* @warning
@@ -85,7 +84,7 @@ namespace YADB
 		void __CreateAsyncThrdConn();
 		/**
 		* @brief
-		??????创建异步执行线程所用连接函数。
+		创建异步执行线程所用连接函数。
 
 		* @param  无\n
 
@@ -227,10 +226,9 @@ namespace YADB
 
 		* @param  [in] const std::string& strSQL  要执行的SQL语句\n
 
-		* @return  加入异步执行队列是否成功\n
-		* @return  true成功\n
-		* @return  false失败\n
-
+		* @return  加入异步执行队列是否成功
+		* @return  true成功
+		* @return  false失败
 		* @note
 
 		* @warning
@@ -243,13 +241,13 @@ namespace YADB
 		* @brief
 		执行SQL语句返回结果集函数。
 
-		* @param [in] const char *szSql  SQL语句\n
-		* @param [out] CDBResultSet& DBRes  结果集\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param [in] const char *szSql  SQL语句
+		* @param [out] CDBResultSet& DBRes  结果集
+		* @param [out] std::string& Error  错误信息
 
 		* @return 返回查询是否成功
-		* @return  true  成功\n
-		* @return  false  失败\n
+		* @return  true  成功
+		* @return  false  失败
 
 		* @note
 
@@ -264,12 +262,12 @@ namespace YADB
 		* @brief
 		执行SQL语句函数。
 
-		* @param [in] const char *szSql  SQL语句\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param [in] const char *szSql  SQL语句
+		* @param [out] std::string& Error  错误信息
 
 		* @return 返回影响到的记录数量
-		* @return  -1  失败\n
-		* @return  >=0  成功\n
+		* @return  -1  失败
+		* @return  >=0  成功
 
 		* @note
 
@@ -283,12 +281,12 @@ namespace YADB
 		* @brief
 		执行SQL语句并获得ID的函数。
 
-		* @param [in] const char *szSql  SQL语句\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param [in] const char *szSql  SQL语句
+		* @param [out] std::string& Error  错误信息
 
 		* @return 返回获得的ID
-		* @return  <=0  失败\n
-		* @return  >0   成功\n
+		* @return  <=0  失败
+		* @return  >0   成功
 
 		* @note
 

+ 0 - 489
db/db_api/mysqltest01.cpp

@@ -1,489 +0,0 @@
-#include <iostream>
-#include <mysql.h>
-#include <stdio.h>
-#include <mysql.h>
-#include <string>
-#include <time.h>
-#include <random>
-#include <thread>
-#include <chrono>
-#include <string.h>
-#include "CDBConnPool.h"
-#include "CDBHelper.h"
-
-void mysql_base_test()
-{
-	MYSQL conn;
-	int res = 0;
-	mysql_init(&conn);
-	if ( mysql_real_connect( &conn, "localhost", "root", "ok123", "yaxt", 0, NULL, CLIENT_FOUND_ROWS ) )
-	{
-		printf("connect success!\n");
-		res = mysql_query( &conn, "insert into test01(id,name,type,BirthDate) values(3,'user',2,'2018-1-2 12:13:14')" );
-		if ( res )
-		{
-			printf("error\n");
-        }
-	    else
-	    {
-		    printf("OK\n");
-	    }
-
-	    mysql_close(&conn);
-    }
-}
-
-void db_test_thread()
-{
-	std::cout << "db_test_thread begin:[" << std::this_thread::get_id() << "]" << std::endl;
-
-	//随机等待
-	std::default_random_engine e;
-	std::uniform_int_distribution<unsigned> u( 1, 9 );
-	int r = u( e );
-	std::this_thread::sleep_for( std::chrono::milliseconds( r * 100 ) );
-
-	std::string Error;
-	//从连接池中获得一个数据库连接
-	YADB::CDBConnect *pConn = sDBConnPool.GetDBConnect( Error );
-	if ( pConn )
-	{
-		//------------------------------------------------------
-		//操作test01表,基础功能测试
-		//------------------------------------------------------
-        //插入
-		char szInsert[1024] = { 0 };
-		//线程ID的hash值实在是没法看,所以用很蠢的办法把线程ID赋给记录ID
-		char szID[30] = { 0 };
-		sprintf( szID, "%d", std::this_thread::get_id() );
-		long long ID = atoll( szID );
-		std::string Name = "Tom.J";
-		int Type = 1;
-		std::string BirthDate = "2017-12-1 09:13:45";
-
-		my_ulonglong ullRes = 0;
-
-		//插入记录
-		sprintf( szInsert, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')",	ID, Name.c_str(), Type, BirthDate.c_str() );
-		ullRes = pConn->ExecuteRealSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "插入记录失败:%s!\n", Error.c_str() );
-			Error = pConn->GetLastError();
-		}
-		else
-		{
-			printf( "插入记录成功!\n" );
-		}
-
-		//查询
-		YADB::CDBResultSet *pRes = pConn->ExecuteQuery( "select * from test01", Error );
-		my_ulonglong ResCount = pRes->GetRecordCount( Error );
-		printf( "Record count = %lld\n", ResCount );
-
-		while ( pRes->GetNextRecod( Error ) )
-		{
-			long long ID = 0;
-			pRes->GetField( "ID", ID, Error );
-
-			std::string strName;
-			pRes->GetField( "Name", strName, Error );
-
-			char szName[100] = { 0 };
-			pRes->GetField( "Name", szName, sizeof( szName ), Error );
-
-			int Type = 0;
-			pRes->GetField( "Type", Type, Error );
-
-			std::string Birth;
-			pRes->GetField( "BirthDate", Birth, Error );
-
-			MYSQL_TIME dtBirth;
-			pRes->GetField( "BirthDate", dtBirth, Error );
-
-			printf( "ID=%lld Name=%s Type=%d BirthDate=%s\n", ID, strName.c_str(), Type, Birth.c_str() );
-		}
-
-		//修改
-		memset( szInsert , 0, sizeof( szInsert ) );
-		Name = "李明";
-		BirthDate = "2018-1-1 01:01:01";
-
-		sprintf( szInsert, "update test01 set Name='%s\',BirthDate ='%s\' where ID=%lld", Name.c_str(), BirthDate.c_str(), ID );
-		ullRes = pConn->ExecuteRealSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "更新记录失败:%s!\n", Error.c_str() );
-		}
-		else
-		{
-			printf( "更新记录成功!\n" );
-		}
-
-		//删除
-		memset( szInsert, 0, sizeof( szInsert ) );
-		sprintf( szInsert, "delete from test01 where ID=%lld", ID );
-		ullRes = pConn->ExecuteSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "删除记录失败:%s!\n", Error.c_str() );
-		}
-		else
-		{
-			printf( "删除记录成功!\n" );
-		}
-
-		//用预处理方式出入记录
-		long long LID = 100000000 + ID;
-		char name[20] = "Jarry";
-		long nameLen = strlen( name );
-		int type = 2;
-		MYSQL_TIME ts;
-		ts.year = 2018;
-		ts.month = 1;
-		ts.day = 13;
-		ts.hour = 13;
-		ts.minute = 15;
-		ts.second = 16;
-		ts.second_part = 0;
-		ts.time_type = MYSQL_TIMESTAMP_DATE;
-
-		MYSQL_BIND bindData[4];
-		memset( bindData, 0, sizeof( bindData ) );
-
-		bindData[0].buffer_type = MYSQL_TYPE_LONGLONG;
-		bindData[0].buffer = ( long long * ) &LID;
-		bindData[0].is_null = 0;
-
-		bindData[1].buffer_type = MYSQL_TYPE_STRING;
-		bindData[1].buffer = ( char * ) name;
-		bindData[1].buffer_length = nameLen;
-		bindData[1].is_null = 0;
-		bindData[1].length = ( unsigned long* ) &nameLen;
-
-		bindData[2].buffer_type = MYSQL_TYPE_LONG;
-		bindData[2].buffer = &type;
-		bindData[2].is_null = 0;
-
-		bindData[3].buffer_type = MYSQL_TYPE_DATETIME;
-		bindData[3].buffer = ( char * ) &ts;
-		bindData[3].is_null = 0;
-		bindData[3].length = 0;
-
-		if ( !pConn->stmtExcute( bindData, 0, Error ) )
-		{
-			printf( "执行预处理失败:%s!\n", Error.c_str() );
-		}
-		else
-		{
-			printf( "执行预处理成功!\n" );
-
-			//删除
-			memset( szInsert, 0, sizeof( szInsert ) );
-			sprintf( szInsert, "delete from test01 where ID=%lld", LID );
-			ullRes = pConn->ExecuteSql( szInsert, Error );
-			if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-			{
-				printf( "删除记录失败:%s!\n", Error.c_str() );
-			}
-			else
-			{
-				printf( "删除记录成功!\n" );
-			}
-		}
-
-		//------------------------------------------------------
-		//操作test02表,test02表的ID字段是自增的
-		//------------------------------------------------------
-		//插入记录
-		sprintf( szInsert, "insert into test02(Name,Type,BirthDate) values (\'%s\', %d,\'%s\')",	Name.c_str(), Type, BirthDate.c_str() );
-		ullRes = pConn->ExecuteRealSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "插入记录失败:%s!\n", Error.c_str() );
-			Error = pConn->GetLastError();
-		}
-		else
-		{
-			printf( "插入记录成功!\n" );
-		}
-
-		my_ulonglong InsertedID = pConn->GetLastInsertID( Error );
-		printf( "新插入ID:%lld!\n", InsertedID );
-
-		//删除
-		memset( szInsert, 0, sizeof( szInsert ) );
-		sprintf( szInsert, "delete from test02 where ID=%lld", InsertedID );
-		ullRes = pConn->ExecuteSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "删除记录失败:%s!\n", Error.c_str() );
-		}
-		else
-		{
-			printf( "删除记录成功!\n" );
-		}
-
-		//------------------------------------------------------
-		//操作test01表,事务测试
-		//------------------------------------------------------
-		pConn->AutoCommit( false, Error );//把自动提交设置成false
-		Name = "GuaGua";
-		LID = 900000000 + ID;
-		sprintf( szInsert, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')",	LID, Name.c_str(), Type, BirthDate.c_str() );
-		ullRes = pConn->ExecuteRealSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "插入记录失败:%s!\n", Error.c_str() );
-			Error = pConn->GetLastError();
-		}
-		else
-		{
-			printf( "插入记录成功!\n" );
-		}
-		//pConn->Commit( Error );//提交
-		pConn->RollBack( Error );//回滚
-		pConn->AutoCommit( true, Error );//把自动提交设置成true
-
-		//归还数据库连接
-		sDBConnPool.GiveBack( pConn );
-
-		//异步执行测试
-		printf( "异步执行测试开始!\n" );
-		char szSQL[1024] = { 0 };
-		//memset( szSQL, 0, sizeof( szSQL ) );
-		sprintf( szSQL, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')",	LID, "Mike", 3, "2000-1-1 12:13:14" );
-		sDBConnPool.PushAsync( szSQL );
-
-		memset( szSQL, 0, sizeof( szSQL ) );
-		sprintf( szSQL, "delete from test01 where ID=%lld",	LID );
-		sDBConnPool.PushAsync( szSQL );
-		printf( "异步执行测试结束!\n" );
-	}
-
-	//显示线程信息
-	std::cout << "[" << std::this_thread::get_id() << "]" << " db_test_thread end!\n" ;
-}
-
-//在多线程环境下测试
-void thread_db_class_test()
-{
-	printf( "----------------------------------------------------------------\n" );
-	printf( "                           多线程测试                             \n" );
-	printf( "----------------------------------------------------------------\n" );
-
-	YADB::_DB_POOL_SETTING_ DBSetting;
-	DBSetting.Host     = "localhost";
-	DBSetting.User     = "root";
-	DBSetting.PWD      = "ok123";
-	DBSetting.DBName   = "yaxt";
-	//DBSetting.CharSet  = "GB2312";
-	DBSetting.CharSet  = "utf8";
-	DBSetting.TimeOut  = 5;
-	DBSetting.PoolSize = 10;
-	DBSetting.stmtSQL  = "insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)";
-
-	std::string Error;
-
-	//创建连接池
-	if ( !sDBConnPool.Create( DBSetting, Error ) )
-	{
-		printf( "线程池创建失败,Err=%s\n", Error.c_str() );
-		return;
-	}
-
-	//多线程测试
-	int ThreadCount = 1;//线程数
-	for ( int i = 0; i < ThreadCount; i++ )
-	{
-		std::thread t( db_test_thread );
-		t.detach();
-	}
-
-	sDBConnPool.Close();
-}
-
-void simple_db_class_test()
-{
-	printf("----------------------------------------------------------------\n");
-	printf("                           简单测试                              \n");
-	printf("----------------------------------------------------------------\n");
-
-	YADB::_DB_POOL_SETTING_ DBSetting;
-	DBSetting.Host = "localhost";
-	DBSetting.User = "root";
-	DBSetting.PWD = "ok123";
-	DBSetting.DBName = "yaxt";
-	DBSetting.CharSet = "utf8";
-	DBSetting.TimeOut = 5;
-	DBSetting.PoolSize = 10;
-	DBSetting.stmtSQL =	"insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)";
-
-	std::string Error;
-
-	//创建连接池
-	if ( !sDBConnPool.Create( DBSetting, Error ) )
-	{
-		printf("线程池创建失败,Err=%s\n", Error.c_str());
-		return;
-	}
-
-	YADB::CDBHelper DBHelper;
-	YADB::CDBResultSet DBRes;
-	sDBConnPool.Query( "select * from test01", DBRes, Error );
-	int nCount = DBRes.GetRecordCount( Error );
-	if (nCount > 0)
-	{
-		printf( "The record count=%d\n", nCount );
-
-		while ( DBRes.GetNextRecod(Error) )
-		{
-			long long ID = 0;
-			DBRes.GetField( "ID", ID, Error );
-
-			char szName[100] = { 0 };
-			DBRes.GetField( "Name", szName, sizeof( szName ), Error );
-
-			std::string strName;
-			DBRes.GetField( "Name", strName, Error );
-
-			int Type = 0;
-			DBRes.GetField( "Type", Type, Error );
-
-			unsigned int uType = 0;
-			DBRes.GetField( "Type", uType, Error );
-
-			std::string Birth;
-			DBRes.GetField( "BirthDate", Birth, Error );
-
-			float fValue = 0.0;
-			DBRes.GetField( "FloatField", fValue, Error );
-
-			double dValue = 0.0;
-			DBRes.GetField( "DoubleField", dValue, Error );
-
-			bool bValue = false;
-			DBRes.GetField( "BoolField", bValue, Error );
-
-			MYSQL_TIME dtBirth;
-			DBRes.GetField( "DateTimeField", dtBirth, Error );
-			char szBirth[40] = { 0 };
-			DBHelper.DateTime2String( dtBirth, szBirth, sizeof( szBirth ) );
-
-			std::cout << "ID=" << ID << " ";
-			std::cout << "Name=" << szName << " ";
-			std::cout << "Name=" << strName.c_str() << " ";
-			std::cout << "Type=" << Type << " ";
-			std::cout << "Type=" << uType << " ";
-			std::cout << "BirthDate=" << Birth << " ";
-			std::cout << "FloatField=" << fValue << " ";
-			std::cout << "DoubleField=" << dValue << " ";
-			std::cout << "BoolField=" << bValue << " ";
-			std::cout << "DateTimeField=" << szBirth << " ";
-			std::cout << std::endl;
-		}
-	}
-
-	std::string strUptSQL;
-	strUptSQL = "update test01 set DoubleField=1.888888 where ID=1";
-	if ( sDBConnPool.ExecuteSql( strUptSQL.c_str(), Error ) < 0 )
-	{
-		printf( "Err,Failed to ExecuteSql:%s,Err=%s\n", strUptSQL.c_str(), Error.c_str() );
-	}
-}
-
-void stmt_test()
-{
-	printf("----------------------------------------------------------------\n");
-	printf("                          预处理测试                              \n");
-	printf("----------------------------------------------------------------\n");
-
-	YADB::_DB_POOL_SETTING_ DBSetting;
-	DBSetting.Host     = "localhost";
-	DBSetting.User     = "root";
-	DBSetting.PWD      = "ok123";
-	DBSetting.DBName   = "yaxt";
-	DBSetting.CharSet  = "utf8";
-	DBSetting.TimeOut  = 5;
-	DBSetting.PoolSize = 10;
-
-	std::string Error;
-
-	//创建连接池
-	if ( !sDBConnPool.Create( DBSetting, Error ) )
-	{
-		printf( "线程池创建失败,Err=%s\n", Error.c_str() );
-		return;
-	}
-
-	YADB::CDBConnect *pConn = sDBConnPool.GetDBConnect( Error );
-
-	//delete old record
-	pConn->ExecuteSql( "delete from test01 where ID >=10000", Error );
-
-	//insert new record bystmt
-	if ( !pConn->Preparestmt( "insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)", Error ) )
-	{
-		printf("Invoke Preparestmt失败,Err=%s\n", Error.c_str());
-		return;
-	}
-
-	for ( int i = 10000; i <= 10010000; i++ )
-	{
-		long long LID = i;
-		char name[20] = "Jarry";
-		long nameLen = strlen(name);
-		int type = 2;
-		MYSQL_TIME ts;
-		ts.year = 2018;
-		ts.month = 1;
-		ts.day = 13;
-		ts.hour = 13;
-		ts.minute = 15;
-		ts.second = 16;
-		ts.second_part = 0;
-		ts.time_type = MYSQL_TIMESTAMP_DATE;
-
-		MYSQL_BIND bindData[4];
-		memset(bindData, 0, sizeof(bindData));
-
-		bindData[0].buffer_type = MYSQL_TYPE_LONGLONG;
-		bindData[0].buffer = (long long *) &LID;
-		bindData[0].is_null = 0;
-
-		bindData[1].buffer_type = MYSQL_TYPE_STRING;
-		bindData[1].buffer = (char *) name;
-		bindData[1].buffer_length = nameLen;
-		bindData[1].is_null = 0;
-		bindData[1].length = (unsigned long*) &nameLen;
-
-		bindData[2].buffer_type = MYSQL_TYPE_LONG;
-		bindData[2].buffer = &type;
-		bindData[2].is_null = 0;
-
-		bindData[3].buffer_type = MYSQL_TYPE_DATETIME;
-		bindData[3].buffer = (char *) &ts;
-		bindData[3].is_null = 0;
-		bindData[3].length = 0;
-
-		if ( !pConn->stmtExcute( bindData, 0, Error ) )
-		{
-			printf("执行预处理失败:%s!\n", Error.c_str());
-		}
-	}
-	printf("预处理完成!\n");
-}
-
-int main()
-{
-	//mysql_base_test();
-	simple_db_class_test();
-	//thread_db_class_test();
-	//stmt_test();
-
-	printf( "Press Enter key to continue...\n" );
-	fgetc( stdin );
-
-	printf( "All Done!\n" );
-	return 0;
-}

+ 10 - 4
db/db_tool.cpp

@@ -48,10 +48,16 @@ namespace db_tool
 
         std::string start_str = tool_time::to_str(start);
         std::string end_str = tool_time::to_str(end);
-
-        int landmarkid = area_hover_ptr->landmark_id;
-        int landmarkdirect=area_hover_ptr->landmark_dir;
-        double landmarkdist=area_hover_ptr->landmark_dis;
+		auto map_area_info = card_ptr->get_area_tool()->m_area_info;
+        int landmarkid,landmarkdirect=0;
+        double landmarkdist=0;
+		if(!map_area_info.empty())
+		{
+			auto lm = map_area_info.begin()->second;
+			landmarkid = std::get<1>(lm);
+       		landmarkdirect=std::get<2>(lm);
+       		landmarkdist=std::get<3>(lm);
+		}
 
         sprintf(sql, "CALL %s(%s, %d, '%s', '%s', %d, %d, %.3f);", call.c_str(),
                type_id_to_str(card_ptr->m_type,card_ptr->m_id).c_str(),

+ 25 - 11
event.cpp

@@ -26,7 +26,7 @@ struct Event
     Event(OBJECT_TYPE oid)
         :m_oid(oid)
     {}
-    void handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f);
+    void handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,const std::string &desc="");
     virtual std::shared_ptr<ya_event> on_message(EVENT_TYPE et,uint64_t id,bool f)=0;
     std::shared_ptr<ya_event> create_event(std::string obj_id,EVENT_TYPE ev_type);
     virtual ~Event(){}
@@ -73,9 +73,9 @@ void event_tool::make_event_object()
     m_map[OT_CARD] = std::make_shared<card_event>();
 }
 
-void event_tool::handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f)
+void event_tool::handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,const std::string &desc/*=""*/)
 {
-    m_map[ot]->handle_alarm_event(et,id,limit_value,cur_value,f);
+    m_map[ot]->handle_alarm_event(et,id,limit_value,cur_value,f,desc);
 }
 
 std::shared_ptr<ya_event> Event::create_event(std::string obj_id,EVENT_TYPE ev_type)
@@ -87,7 +87,7 @@ std::shared_ptr<ya_event> Event::create_event(std::string obj_id,EVENT_TYPE ev_t
     return ev_ptr;
 }
 
-void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f)
+void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,const std::string &desc/*=""*/)
 {
     std::shared_ptr<ya_event> ev_ptr = nullptr;
     uint64_t eid = event_list::to_list_id(et,m_oid,id);
@@ -102,9 +102,17 @@ void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,doub
         }
         else
         {
-            ev_ptr=on_message(et,id,f);
+            uint64_t _id=id;
+            log_info("Create_Event:desc[%s],id:%d,et:%d",desc.c_str(),id,et);
+            if(et == ET_READER_LOCATION_REVERSAL&&!desc.empty())
+            {
+                std::string cardid = desc.substr(0,desc.find_first_of('&'));
+                _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;
             //保存告警信息
             event_list::instance()->add(eid,ev_ptr);
         }
@@ -117,6 +125,7 @@ void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,doub
             event_ptr->m_cur_time = std::chrono::system_clock::now();
             event_ptr->m_status = ES_END;
             event_ptr->m_cur_value = cur_value;
+            event_ptr->m_desc=desc;
             event_ptr->m_is_sent=false;
             ev_ptr=event_ptr;
         }
@@ -200,12 +209,17 @@ std::shared_ptr<ya_event> card_event::on_message(EVENT_TYPE et,uint64_t id,bool
         event_ptr->x = card_ptr->x;
         event_ptr->y = card_ptr->y;
         event_ptr->m_is_display = card_ptr->m_display;
-        const auto lm = card_ptr->getLandmark();
-        event_ptr->m_area_id = std::get<3>(lm);
-        event_ptr->m_map_id = std::get<2>(lm);
-        event_ptr->m_landmarkid = std::get<4>(lm);
-        event_ptr->m_landmarkdist = std::get<6>(lm);
-        event_ptr->m_landmarkdirect = std::get<5>(lm);
+
+        auto area_info_map = card_ptr->get_area_tool()->m_area_info;
+        if(!area_info_map.empty())
+        {
+            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;
 }

+ 5 - 4
event.h

@@ -53,8 +53,9 @@ enum EVENT_TYPE{ // 事件类型
 
     ET_CARD_MOTIONLESS=32,//静止不动告警
     ET_READER_POWER_BY_BATTERY=33,//分站电池:1为电池供电,0为交流电供电,当电池供电需要告警
+	ET_VEHICLE_REAR_END=36,
     ET_VEHICLE_NEAR_GEOFAULT=38,//靠近断层告警
-
+	ET_READER_LOCATION_REVERSAL=39,
     CARD_EVENT_COUNT_MAX
 };
 
@@ -140,11 +141,11 @@ class Event;
 struct event_tool
 {
 	template <class UnaryPredicate>
-	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,UnaryPredicate p)
+	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,UnaryPredicate p,const std::string &desc="")
 	{
-		handle_event(ot,et,id,limit_value,cur_value,p());
+		handle_event(ot,et,id,limit_value,cur_value,p(),desc);
 	}
-	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f);
+	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,const std::string &desc="");
 	static event_tool * instance();
 private:
     event_tool()

+ 30 - 32
main.cpp

@@ -35,7 +35,8 @@ struct Init_Setting
         std_info("json_interval:%d",send_interval);
         std::vector<std::string> url_list;
         url_list.push_back(url);
-        wsClientMgr_init(url_list,send_interval);//init websocket
+        if(!wsClientMgr_init(url_list,send_interval))
+		  exit(0);
         YADB::_DB_POOL_SETTING_ DBSetting;
 
         DBSetting.Host = config.get("db.host","127.0.0.1");
@@ -45,33 +46,25 @@ struct Init_Setting
         DBSetting.CharSet = config.get("db.charset","utf8");
         DBSetting.TimeOut = config.get("db.conn_timeout",5);
         DBSetting.PoolSize = config.get("db.pool_size",30);
-        _mysql_init(DBSetting);
+        if(!_mysql_init(DBSetting))
+		  exit(0);
 
 		CYaSetting::Init_sys_setting();
-
         sit_list::instance()->load_from_db();
-
         card_list::instance()->init_card_from_db();
-
-        std_info("here....");
         area_list::instance()->init_from_db();
-        std_info("here....");
-        //test
         //point pt(3348,100);
         //int id = area_list::instance()->get_area(pt)->id();
         //std_info("test area:%d",id);
         Landmark_list::instance()->init_from_db();
-
         //auto a = Landmark_list::instance()->get(5,id,pt);
         //std_info("test landmark:id:%d,dir:%d,dis:%.2f",std::get<0>(a),std::get<1>(a),std::get<2>(a));
         special_area_list::instance()->init_from_db();
         //auto s = special_area_list::instance()->get_special_id(1013,point(4727,-254),2);
         //std_info("test special_area:%d",s);
 		mine_business::inst()->load();
-
         card_list::instance()->load_his_card_postion_from_db();
         event_list::instance()->load_his_data_from_db();
-		
         db_para dp;	
         dp.Host=DBSetting.Host;
         dp.User=DBSetting.User;
@@ -92,45 +85,50 @@ struct Init_Setting
 		three_rates::get_instance()->init(ip,dbs);
 		three_rates::get_instance()->start();
 	}
-    void _mysql_init(YADB::_DB_POOL_SETTING_ &dps)
+    bool _mysql_init(YADB::_DB_POOL_SETTING_ &dps)
     {
         std::string szError = "";
-		//std::this_thread::sleep_for(std::chrono::seconds(2));
+		bool flag = true;
         //创建连接池
         if ( !sDBConnPool.Create( dps, szError ) )
         {
-            log_error("数据库线程池创建失败,Err=%s\n", szError.c_str());
+            log_error("数据库线程池创建失败,Err=%s", szError.c_str());
+            std_error("数据库线程池创建失败,Err=%s", szError.c_str());
+			flag = false;
         }
+		return flag;
     }
 
-    void wsClientMgr_init(const std::vector<std::string>&uri_list,int32_t st)
+    bool wsClientMgr_init(const std::vector<std::string>&uri_list,int32_t st)
     {
+		bool flag = true;
         std::map<std::string, YA::MSG_HANDLE_FUNC_TYPE> MsgFuncList;
 
-        //MsgFuncList.insert( std::make_pair( "req_all_data", On_req_all_data ) );
         //MsgFuncList.insert( std::make_pair( "req_all_person_on_car", On_req_all_person_on_car ) );
 
         module_mgr::init(config, MsgFuncList);
 
         swsClientMgr.Build( uri_list, MsgFuncList );
 
-        //连接服务器
-        if ( swsClientMgr.connect() != 0 )
-        {
-            log_error("web socket init failed.");
-            std_error("web socket init failed.");
-            return;
-        }
-
-        //登录
-        swsClientMgr.login();
-        //init thread...
-        YA::_THREAD_CONFIG_ Config;
-        Config.SendInterval = st;
-        swsTimerThrd.Init( Config );
-        swsTimerThrd.Start();
+		do{
+			//连接服务器
+			 if ( swsClientMgr.connect() != 0 )
+       		 {
+       		     log_error("web socket init failed.");
+       		     std_error("websocket 初始化失败....");
+	   		 	 flag =false;
+				 break;
+       		 }
+       		 //登录
+       		 swsClientMgr.login();
+       		 //init thread...
+       		 YA::_THREAD_CONFIG_ Config;
+       		 Config.SendInterval = st;
+       		 swsTimerThrd.Init( Config );
+       		 swsTimerThrd.Start();
+		}while(false);
+		return flag;
     }
-
 };
 
 

File diff suppressed because it is too large
+ 527 - 513
mine_business.cpp


+ 3 - 0
mine_business.h

@@ -10,6 +10,8 @@ class rear_end_collision_prevented_business;
 class card_location_base;
 struct mine_business
 {
+	mine_business(const mine_business&)=delete;
+	mine_business & operator=(const mine_business&)=delete;
 	static mine_business *inst();
 	void run_business();
 //人员数量曲线功能
@@ -20,6 +22,7 @@ struct mine_business
 //车辆防追尾告警
 	void put(const std::shared_ptr<card_location_base>&);
 	void make_arg(uint64_t cid,const point &p,uint64_t t);
+	void clear_vehicle();
 private:
 	mine_business();
 	void handle_reverse_alarm();

+ 35 - 78
module_service/area_business_car_attendance.cpp

@@ -34,8 +34,10 @@ void area_business_car_attendance::on_enter(const std::shared_ptr<area_hover>&ar
         return;
     }
 
+    //save_attendance(card_ptr, area_hover_ptr);
     auto mine_tool_ptr = card_ptr->get_mine_tool();
-    if(!mine_tool_ptr->m_is_attendance)
+    if(!mine_tool_ptr->m_is_attendance
+            || !is_attendance_area(area_hover_ptr->m_area->m_id, card_ptr->get_vehicle_type_id()))
     {
         return;
     }
@@ -72,7 +74,8 @@ void area_business_car_attendance::on_leave(const std::shared_ptr<area_hover>&ar
 
     //没在考勤状态转换为考勤状态
     auto mine_tool_ptr = card_ptr->get_mine_tool();
-    if(!mine_tool_ptr->m_is_attendance)
+    if(!mine_tool_ptr->m_is_attendance
+            && is_attendance_area(area_hover_ptr->m_area->m_id, card_ptr->get_vehicle_type_id()))
     {
         //考勤开始
         mine_tool_ptr->m_is_attendance = true;
@@ -85,87 +88,41 @@ void area_business_car_attendance::on_leave(const std::shared_ptr<area_hover>&ar
         //                         card_ptr->m_id, card_ptr->m_type,
         //                         area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
     }
+}
 
-    //    if(nullptr == ptr)
-    //    {
-    //        log_error("结束考勤失败:nullptr == ptr");
-    //        return;
-    //    }
+void area_business_car_attendance::init_attendance_area_from_db()
+{
+    const char *sql = "select a.area_id, a.att_rule_id,  vt.vehicle_type_id \
+            from dat_att_rule_area a, dat_att_rule_vehicle_type  vt, dat_att_rule r\
+            where a.att_rule_id=vt.att_rule_id and a.att_rule_id=r.att_rule_id;";
+    std::string Error;
+    YADB::CDBResultSet DBRes;
+    sDBConnPool.Query(sql,DBRes,Error);
+    if(!Error.empty())
+        log_error("初始化attendance_area Error,%s",Error.c_str());
+    uint64_t nCount = DBRes.GetRecordCount( Error );
+    if(int64_t(nCount) <= 0)
+    {
+        log_error("初始化attendance_area Error,%s",Error.c_str());
+    }
 
-    //    auto ptr_temp = static_cast<car_attendance_data*>(ptr.get());
+    log_info( "init_attendance_area_from_db. The record count=%ld\n", nCount );
 
-    //    if(ptr_temp->m_is_attendance)
-    //    {
-    //        ptr_temp->m_is_attendance = false;
+    m_map.clear();
+    while ( DBRes.GetNextRecod(Error) )
+    {
+        int area_id  = 0;
+        DBRes.GetField( "area_id",area_id, Error );
 
-    //        //作为一条开始考勤记录保存到数据库
-    //        db_tool::save_attendance(card_ptr, ptr_temp->m_is_attendance, ptr_temp->m_attendance_start_time);
-    //    }
-}
+        int att_rule_id  = 0;
+        DBRes.GetField( "att_rule_id",att_rule_id, Error );
 
-/////area_hover_ptr==nullptr 表示接收到 web的删除卡命令
-//void area_business_car_attendance::save_attendance(const std::shared_ptr<card_location_base>& card_ptr,
-//                                                  const std::shared_ptr<area_hover> area_hover_ptr)
-//{
-//    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);
-
-////    if(area_hover_ptr)
-////    {
-////        log_info("车卡考勤结束:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
-////                 card_ptr->m_id, card_ptr->m_type,
-////                 area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
-////    }
-////    else
-////    {
-////        log_info("收到web的删除卡命令,车卡考勤结束:卡id=%d,卡type=%d,stat_attendance=%d",
-////                 card_ptr->m_id, card_ptr->m_type,mine_tool_ptr->m_stat_attendance);
-////    }
-//}
-
-#if 0
-
-//void area_business_car_attendance::init_attendance_area_from_db()
-//{
-//    const char *sql = "select a.area_id, a.att_rule_id,  vt.vehicle_type_id \ from dat_att_rule_area a, dat_att_rule_vehicle_type  vt, dat_att_rule r\ where a.att_rule_id=vt.att_rule_id and a.att_rule_id=r.att_rule_id;";
-//    std::string Error;
-//    YADB::CDBResultSet DBRes;
-//    sDBConnPool.Query(sql,DBRes,Error);
-//    if(!Error.empty())
-//        log_error("初始化attendance_area Error,%s",Error.c_str());
-//    uint64_t nCount = DBRes.GetRecordCount( Error );
-//    if(int64_t(nCount) <= 0)
-//    {
-//        log_error("初始化attendance_area Error,%s",Error.c_str());
-//    }
-
-//    log_info( "init_attendance_area_from_db. The record count=%ld\n", nCount );
-
-//    m_map.clear();
-//    while ( DBRes.GetNextRecod(Error) )
-//    {
-//        int area_id  = 0;
-//        DBRes.GetField( "area_id",area_id, Error );
-
-//        int att_rule_id  = 0;
-//        DBRes.GetField( "att_rule_id",att_rule_id, Error );
-
-//        int vehicle_type_id  = 0;
-//        DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
-
-//        m_map.insert(std::make_pair(to_list_id(area_id, vehicle_type_id), att_rule_id));
-//    }
-//}
-
-#endif
+        int vehicle_type_id  = 0;
+        DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
 
+        m_map.insert(std::make_pair(to_list_id(area_id, vehicle_type_id), att_rule_id));
+    }
+}
 
+std::unordered_map<uint64_t, int> area_business_car_attendance::m_map;
 

+ 14 - 16
module_service/area_business_car_attendance.h

@@ -3,6 +3,7 @@
 
 
 #include"area_business.h"
+#include"unordered_map"
 
 
 class area_business_car_attendance:public area_business
@@ -20,24 +21,21 @@ public:
     //记录离开考勤区域信息,开始考勤
     void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
 
-//    static void init_attendance_area_from_db();
-//    ///area_hover_ptr==nullptr 表示接收到 web的删除卡命令
-//    static void save_attendance(const std::shared_ptr<card_location_base>& card_ptr, const std::shared_ptr<area_hover> area_hover_ptr);
+    //static void save_attendance(const std::shared_ptr<card_location_base>& card_ptr, const std::shared_ptr<area_hover> area_hover_ptr){}
+    static void init_attendance_area_from_db();
 
-//private:
-//    bool is_not_attendance_area(int area_id, int vehicle_type_id)
-//    {
-//        return  m_map.end() != m_map.find(to_list_id(area_id, vehicle_type_id));
-//    }
+private:
+    static bool is_attendance_area(int area_id, int vehicle_type_id)
+    {
+        return  m_map.end() != m_map.find(to_list_id(area_id, vehicle_type_id));
+    }
 
-//    uint64_t to_list_id(int area_id, int vehicle_type_id)
-//    {
-//        return (static_cast<uint64_t>(area_id)<<32) | static_cast<uint64_t>(vehicle_type_id);
-//    }
+    static uint64_t to_list_id(int area_id, int vehicle_type_id)
+    {
+        return (static_cast<uint64_t>(area_id)<<32) | static_cast<uint64_t>(vehicle_type_id);
+    }
 
-//    ///area_id<<32| vehicle_type_id; att_rule_id
-//    std::unordered_map<uint64_t, int> m_map;
+    ///area_id<<32| vehicle_type_id; att_rule_id
+    static std::unordered_map<uint64_t, int> m_map;
 };
-
-
 #endif // AREA_BUSINESS_CAR_ATTENDANCE_H

+ 2 - 0
module_service/area_business_card_enter_or_leave.cpp

@@ -23,7 +23,9 @@ void area_business_card_enter_or_leave::on_enter(const std::shared_ptr<area_hove
                                                  const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
 {
     auto ptr_temp = std::make_shared<enter_or_leave_data>();
+    ptr_temp->m_enter_time_ms = area_hover_ptr->m_enter_time;
     ptr = ptr_temp;
+    area_hover_ptr->m_data[area_business_type()] = ptr_temp;
     save_his_area_location_enter(area_hover_ptr, card_ptr, ptr_temp->m_enter_time_ms);
 }
 

+ 13 - 0
module_service/area_business_geofault.cpp

@@ -41,6 +41,7 @@ void area_business_geofault::on_enter(const std::shared_ptr<area_hover>&area_hov
 
     auto ptr_temp = std::make_shared<geofault_data>();
     ptr = ptr_temp;
+    area_hover_ptr->m_data[area_business_type()] = ptr_temp;
 
     double dist=0;
     if(_is_near(area_hover_ptr->m_area, card_ptr->x, card_ptr->y, dist))
@@ -64,6 +65,12 @@ void area_business_geofault::on_hover(const std::shared_ptr<area_hover>&area_hov
         return;
     }
 
+    if(nullptr == ptr)
+    {
+        log_error("area_business_geofault::on_hover:nullptr == ptr");
+        return;
+    }
+
     auto ptr_temp = static_cast<geofault_data*>(ptr.get());
 
     double dist=0;
@@ -116,6 +123,12 @@ void area_business_geofault::on_leave(const std::shared_ptr<area_hover>&area_hov
         return;
     }
 
+    if(nullptr == ptr)
+    {
+        log_error("area_business_geofault::on_leave:nullptr == ptr");
+        return;
+    }
+
     uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
     event_tool::instance()->handle_event(OT_CARD, ET_VEHICLE_NEAR_GEOFAULT, id, CYaSetting::m_sys_setting.geofault_warn_dis, 1000, false);
 }

+ 0 - 1
module_service/area_business_geofault.h

@@ -71,7 +71,6 @@ private:
 private:
     //area_id: points
     static std::unordered_map<int, std::vector<point>> _area_geofault_map;
-
     static int _geofault_count_limit;
 };
 

+ 14 - 1
module_service/area_business_motionless_persion.cpp

@@ -37,7 +37,7 @@ void area_business_motionless_persion::init(config_file& config)
     //        _acc_seconds_limit = std::stoi(config.get("service.motionless_acc_seconds_limit","120"));
 }
 
-void area_business_motionless_persion::on_enter(const std::shared_ptr<area_hover>&a,
+void area_business_motionless_persion::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
                                                 const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
 {
     if(!card_ptr->is_person())
@@ -47,6 +47,7 @@ void area_business_motionless_persion::on_enter(const std::shared_ptr<area_hover
 
     auto ptr_temp = std::make_shared<motionless_data>();
     ptr = ptr_temp;
+    area_hover_ptr->m_data[area_business_type()] = ptr_temp;
 
     auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ET_CARD_MOTIONLESS);
     ptr_temp->m_is_warning = (nullptr != ev_ptr_temp && !ev_ptr_temp->is_end());
@@ -60,6 +61,12 @@ void area_business_motionless_persion::on_hover(const std::shared_ptr<area_hover
         return;
     }
 
+    if(nullptr == ptr)
+    {
+        log_error("area_business_motionless_persion::on_hover:nullptr == ptr");
+        return;
+    }
+
     auto ptr_temp = static_cast<motionless_data*>(ptr.get());
 
     if(0 == static_cast<int>(card_ptr->m_acc))
@@ -100,6 +107,12 @@ void area_business_motionless_persion::on_leave(const std::shared_ptr<area_hover
         return;
     }
 
+    if(nullptr == ptr)
+    {
+        log_error("area_business_motionless_persion::on_leave:nullptr == ptr");
+        return;
+    }
+
     auto ptr_temp = static_cast<motionless_data*>(ptr.get());
     if(ptr_temp->m_is_warning)//如果正在告警,则发送取消告警的信息
     {

+ 17 - 6
module_service/area_business_post_area.cpp

@@ -1,30 +1,41 @@
 
 #include "area.h"
 #include "card_base.h"
-
+#include "tool_time.h"
 #include "area_business_post_area.h"
 /*
 	确定推送人员信息时的区域,每一个明确需要推送的区域,都要推送
 */
-
+struct pos_area:business_data
+{
+	pos_area(uint64_t t)
+	{
+		m_enter_time=t;
+	}
+	uint64_t m_enter_time=0;
+};
 //将推送区域信息加入人员数据
 void area_business_post_area::on_enter(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
-
+	//uint64_t t=tool_time::now_to_ms();
+	//ptr=std::make_shared<pos_area>(t);
+	c->set_area_info(a->mapid(),a->scale(),a->id(),a->m_enter_time,0);
 }
 
-void area_business_post_area::on_hover(const std::shared_ptr<area_hover>&a, \
+void area_business_post_area::on_hover(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-
+	//std::shared_ptr<pos_area> pa = std::dynamic_pointer_cast<pos_area>(ptr);
+	//uint64_t t = pa->m_enter_time;
+	c->set_area_info(0,0,a->id(),a->m_enter_time,1);
 }
 
 //从人员数据中清除区域信息
 void area_business_post_area::on_leave(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-
+	c->set_area_info(0,0,a->id(),0,2);
 }
 
 

+ 17 - 4
module_service/area_business_speed_checker.cpp

@@ -25,7 +25,6 @@ struct over_speed_data:business_data
     double m_limit_speed;
     bool m_is_warning;
 };
-
 area_business_speed_checker::area_business_speed_checker()
 {
 }
@@ -40,6 +39,7 @@ void area_business_speed_checker::on_enter(const std::shared_ptr<area_hover>&are
 
     auto ptr_temp = std::make_shared<over_speed_data>();
     ptr = ptr_temp;
+    area_hover_ptr->m_data[area_business_type()] = ptr_temp;
 
     double limit = area_hover_ptr->m_area->m_over_speed_vehicle;
     if(area_hover_ptr->m_area->is_mine())
@@ -78,11 +78,13 @@ void area_business_speed_checker::on_hover(const std::shared_ptr<area_hover>&are
     {
         return;
     }
-    auto ptr_temp = dynamic_cast<over_speed_data*>(ptr.get());
-    if (ptr_temp == nullptr)
+    if(nullptr == ptr)
     {
-        return ;
+        log_error("area_business_speed_checker::on_hover:nullptr == ptr");
+        return;
     }
+
+    auto ptr_temp = static_cast<over_speed_data*>(ptr.get());
     double limit = ptr_temp ->m_limit_speed;
     if(limit < 0.01)
     {
@@ -142,11 +144,22 @@ void area_business_speed_checker::on_leave(const std::shared_ptr<area_hover>&are
     {
         return;
     }
+<<<<<<< HEAD
     auto ptr_temp = dynamic_cast<over_speed_data*>(ptr.get());
     if (ptr_temp == nullptr)
     {
         return ;
     }
+=======
+
+    if(nullptr == ptr)
+    {
+        log_error("area_business_speed_checker::on_leave:nullptr == ptr");
+        return;
+    }
+
+    auto ptr_temp = static_cast<over_speed_data*>(ptr.get());
+>>>>>>> f3b13c3aeeb7bc3622df4964279da2e41ed23f17
     double limit = ptr_temp ->m_limit_speed;
 
     EVENT_TYPE ev_type = ET_CARD_AREA_OVER_SPEED;

+ 1 - 1
module_service/module_mgr.cpp

@@ -32,7 +32,7 @@ void module_mgr::start()
 {
     area_business_geofault::init_geofault_from_db();
     area_business_speed_checker::init_vehicle_category_from_db();
-    //area_business_car_attendance::init_attendance_area_from_db();
+    area_business_car_attendance::init_attendance_area_from_db();
 
     module_web::instance()->start();
     module_call::instance()->start();

+ 9 - 0
net-service.cpp

@@ -31,8 +31,17 @@ net_service::~net_service()
 
 void net_service::on_timer()
 {
+	static int version = -1;
 	visit_site_status vss;
 	sit_list::instance()->accept(vss);
+	int v = card_list::instance()->version();
+	if(v != version)
+	{
+		version=v;
+		mine_business::inst()->clear_vehicle();
+		card_list_visit clv;
+		card_list::instance()->accept(clv);
+	}
 	mine_business::inst()->run_business();
 }
 

BIN
path


+ 11 - 11
websocket/Makefile

@@ -109,11 +109,11 @@ distuninstallcheck_listfiles = find . -type f -print
 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
   | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
 distcleancheck_listfiles = find . -type f -print
-ACLOCAL = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run aclocal-1.12
+ACLOCAL = ${SHELL} /home/lemon/resource/ya-serv/missing --run aclocal-1.12
 AMTAR = $${TAR-tar}
-AUTOCONF = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run automake-1.12
+AUTOCONF = ${SHELL} /home/lemon/resource/ya-serv/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/lemon/resource/ya-serv/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/lemon/resource/ya-serv/missing --run automake-1.12
 AWK = gawk
 CC = gcc
 CCDEPMODE = depmode=gcc3
@@ -138,7 +138,7 @@ LDFLAGS =
 LIBOBJS = 
 LIBS = 
 LTLIBOBJS = 
-MAKEINFO = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run makeinfo
+MAKEINFO = ${SHELL} /home/lemon/resource/ya-serv/missing --run makeinfo
 MKDIR_P = /bin/mkdir -p
 OBJEXT = o
 PACKAGE = libwebsocket-a
@@ -154,10 +154,10 @@ SET_MAKE =
 SHELL = /bin/sh
 STRIP = 
 VERSION = 1.0
-abs_builddir = /home/zzj/ya-src/ya-serv/websocket
-abs_srcdir = /home/zzj/ya-src/ya-serv/websocket
-abs_top_builddir = /home/zzj/ya-src/ya-serv/websocket
-abs_top_srcdir = /home/zzj/ya-src/ya-serv/websocket
+abs_builddir = /home/lemon/resource/ya-serv/websocket
+abs_srcdir = /home/lemon/resource/ya-serv/websocket
+abs_top_builddir = /home/lemon/resource/ya-serv/websocket
+abs_top_srcdir = /home/lemon/resource/ya-serv/websocket
 ac_ct_CC = gcc
 ac_ct_CXX = g++
 am__include = include
@@ -177,7 +177,7 @@ host_alias =
 htmldir = ${docdir}
 includedir = ${prefix}/include
 infodir = ${datarootdir}/info
-install_sh = ${SHELL} /home/zzj/ya-src/ya-serv/install-sh
+install_sh = ${SHELL} /home/lemon/resource/ya-serv/install-sh
 libdir = ${exec_prefix}/lib
 libexecdir = ${exec_prefix}/libexec
 localedir = ${datarootdir}/locale
@@ -186,7 +186,7 @@ mandir = ${datarootdir}/man
 mkdir_p = $(MKDIR_P)
 oldincludedir = /usr/include
 pdfdir = ${docdir}
-prefix = /home/zzj/ya-src/ya-serv/websocket/../../dist
+prefix = /home/lemon/resource/ya-serv/websocket/../../dist
 program_transform_name = s,x,x,
 psdir = ${docdir}
 sbindir = ${exec_prefix}/sbin

+ 88 - 20
websocket/jsonBuilder.cpp

@@ -42,7 +42,39 @@ namespace YA
 		value.SetString( szCmd, Allocator );
 		root.AddMember( JSON_ROOT_KEY_CMD, value, Allocator );
 	}
-
+#if 0
+        detail=
+[
+            //0 卡号
+            //1 x坐标
+            //2 y坐标
+            //3 入井时间戳
+            //4 接收时间戳
+            //5 工作时长
+            //6 地图编号
+            //7 部门编号
+            //8 状态
+            //9 运行状态
+            //10 业务状态
+            //11 速度
+            //12 area_info_array
+        ]
+		        
+		        area_info_array=[
+				            area_info,
+						    area_info,
+							area_info,
+				            area_info
+							]
+
+				  area_info=[
+              //0 区域编号
+              //1 地标编号
+              //2 地标方向
+			//3 距离地标的距离
+			//4 进入区域时间戳
+		]
+#endif
 	bool jsonBuilder::__BuildDetail( const _CARD_POS_ & CardPos, rapidjson::Document::AllocatorType& Allocator, rapidjson::Value & DetailItem )
 	{
 		rapidjson::Value Array( rapidjson::kArrayType );
@@ -69,8 +101,8 @@ namespace YA
 		Array.PushBack( tmp_object, Allocator );
 
 		//5 最后接收时间戳
-		tmp_object.SetDouble( CardPos.rec_time );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetDouble( CardPos.rec_time );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//6 工作时长
 		tmp_object.SetDouble( CardPos.work_time );
@@ -81,8 +113,8 @@ namespace YA
 		Array.PushBack( tmp_object, Allocator );
 
 		//8 区域编号
-		tmp_object.SetInt( CardPos.area_id );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetInt( CardPos.area_id );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//9 部门编号
 		tmp_object.SetInt( CardPos.dept_id );
@@ -105,16 +137,16 @@ namespace YA
 		Array.PushBack( tmp_object, Allocator );
 
 		//14 地标编号
-		tmp_object.SetInt( CardPos.landmark_id );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetInt( CardPos.landmark_id );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//15 地标方向
-		tmp_object.SetInt( CardPos.lm_direction );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetInt( CardPos.lm_direction );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//16 距离地标的距离
-		tmp_object.SetDouble( CardPos.landmark_dis );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetDouble( CardPos.landmark_dis );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//17 级别编号
 		tmp_object.SetInt( CardPos.level_id );
@@ -124,6 +156,38 @@ namespace YA
 		tmp_object.SetInt( CardPos.is_on_duty );
 		Array.PushBack( tmp_object, Allocator );
 
+		rapidjson::Value Array_1( rapidjson::kArrayType );
+		for(const auto &a:CardPos.area_info)	
+		{
+			rapidjson::Value _DetailItem;
+			rapidjson::Value Array_2( rapidjson::kArrayType );
+			const auto lm = a.second;
+			//8 区域编号
+			tmp_object.SetInt(std::get<0>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			//14 地标编号
+			tmp_object.SetInt(std::get<1>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			//15 地标方向
+			tmp_object.SetInt(std::get<2>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			//16 距离地标的距离
+			tmp_object.SetDouble(std::get<3>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			//5 最后接收时间戳
+			tmp_object.SetDouble(std::get<4>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			_DetailItem=Array_2;
+			Array_1.PushBack(_DetailItem, Allocator);
+		}
+		
+		DetailItem = Array_1;
+		Array.PushBack(DetailItem, Allocator );
 		DetailItem = Array;
 		return true;
 	}
@@ -239,7 +303,8 @@ namespace YA
 		{
 			_STAT_DEPT_ITEM_ sdItem;
 			sdItem.DeptID = CardPos.dept_id;
-			sdItem.Area.insert( std::make_pair( CardPos.area_id, 1 ) );
+			for(const auto &a:CardPos.area_info)
+				sdItem.Area.insert( std::make_pair(a.first, 1 ) );
 			sdItem.Dept.insert( std::make_pair( CardPos.dept_id, 1 ) );
 			sdItem.OcptLvl.insert( std::make_pair( CardPos.level_id, 1 ) );
 			sdItem.Sum = 1;
@@ -257,16 +322,19 @@ namespace YA
 		std::map<int, int>::iterator mit_id_sum;
 
 		//area
-		mit_id_sum = DeptItem.Area.find( CardPos.area_id );
-		if ( mit_id_sum == DeptItem.Area.end() )
+		for(const auto &a:CardPos.area_info)
 		{
-			DeptItem.Area.insert( std::make_pair( CardPos.area_id, 1 ) );
-		}
-		else
-		{
-			mit_id_sum->second++;
+			int areaid = a.first;
+			mit_id_sum = DeptItem.Area.find(areaid);
+			if ( mit_id_sum == DeptItem.Area.end() )
+			{
+				DeptItem.Area.insert( std::make_pair(areaid, 1 ) );
+			}
+			else
+			{
+				mit_id_sum->second++;
+			}
 		}
-
 		//Dept
 		mit_id_sum = DeptItem.Dept.find( CardPos.dept_id );
 		if ( mit_id_sum == DeptItem.Dept.end() )

BIN
websocket/libwebsocket.a


+ 1 - 0
websocket/ws_common.h

@@ -93,6 +93,7 @@ namespace YA
 	*/
 	struct _CARD_POS_ : public _BASE_CARD_
 	{
+		std::map<int,std::tuple<int,int,int,double,uint64_t>> area_info;
 		int landmark_id;//地标编号
 		int lm_direction;//地标方向
 		int landmark_dis;//距离地标的距离