1
0
Quellcode durchsuchen

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

chensongchao vor 6 Jahren
Ursprung
Commit
b6b8b1ffe1

+ 17 - 11
ant.cpp

@@ -5,8 +5,9 @@
 #include "db_api/CDBSingletonDefine.h"
 #include "db_api/CDBSingletonDefine.h"
 #include "event.h"
 #include "event.h"
 #include "tool_time.h"
 #include "tool_time.h"
-template<> std::shared_ptr<sit_list> 
-single_base<sit_list, int, std::shared_ptr<site>>::m_instance=std::make_shared<sit_list>();
+#include "area.h"
+//template<> std::shared_ptr<sit_list> single_base<sit_list, int, std::shared_ptr<site>>::m_instance=std::make_shared<sit_list>();
+
 int site::index()const
 int site::index()const
 {
 {
 	return m_algo+(m_num_dims<<1);
 	return m_algo+(m_num_dims<<1);
@@ -232,6 +233,7 @@ void sit_list::init_site(int id)
 
 
          site_ptr->m_dimension = dimension;
          site_ptr->m_dimension = dimension;
          site_ptr->m_scale = scale;
          site_ptr->m_scale = scale;
+         site_ptr->create_area();
      }
      }
 }
 }
 
 
@@ -293,14 +295,15 @@ void sit_list::read_sit_list(int id)
         if(-1 == id)
         if(-1 == id)
         {
         {
             std::shared_ptr<site> site_ptr=nullptr;
             std::shared_ptr<site> site_ptr=nullptr;
-            auto it = map.find(reader_id);
-            if(it==map.end())
-            {
-                site_ptr = std::make_shared<site>(reader_id);
-                map.insert({reader_id,site_ptr});
-            }
-            else
-              site_ptr=it->second;
+            site_ptr = sit_list::instance()->get(reader_id);
+            //auto it = map.find(reader_id);
+            //if(it==map.end())
+           // {
+            //    site_ptr = std::make_shared<site>(reader_id);
+             //   map.insert({reader_id,site_ptr});
+            //}
+            if(!site_ptr)
+              continue;
             site_ptr->m_ant[antid].m_id = antenna_id;
             site_ptr->m_ant[antid].m_id = antenna_id;
             site_ptr->m_ant[antid].set(x,-y);
             site_ptr->m_ant[antid].set(x,-y);
             log_info("reand_ant..%d,%d,%.2f,%.2f",reader_id,antid,x,y);
             log_info("reand_ant..%d,%d,%.2f,%.2f",reader_id,antid,x,y);
@@ -330,7 +333,10 @@ 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);
+}
 /*
 /*
    处理分站供电状态,交流供电时,ac_down=false,直流供电时,ac_down=true
    处理分站供电状态,交流供电时,ac_down=false,直流供电时,ac_down=true
 
 

+ 5 - 1
ant.h

@@ -18,6 +18,7 @@
 #include"net-service.h"
 #include"net-service.h"
 #include"common.h"
 #include"common.h"
 class client;
 class client;
+class area;
 struct path
 struct path
 {
 {
     std::array<line_v,2>	m_line;
     std::array<line_v,2>	m_line;
@@ -130,6 +131,7 @@ struct site:point,std::enable_shared_from_this<site>
     /// 指定分站定位类型:一维定位,二维定位,三维定位
     /// 指定分站定位类型:一维定位,二维定位,三维定位
     int m_dimension=0;
     int m_dimension=0;
     std::shared_ptr<client> m_clt=nullptr;
     std::shared_ptr<client> m_clt=nullptr;
+    std::shared_ptr<area> m_area=nullptr;
 
 
 
 
 	time_t m_time;
 	time_t m_time;
@@ -164,10 +166,12 @@ struct site:point,std::enable_shared_from_this<site>
         return m_clt;
         return m_clt;
     }
     }
 
 
-     bool is_up_site()
+    bool is_up_site()
     {
     {
         return READER_TYPE_ID_UP == m_reader_type_id;
         return READER_TYPE_ID_UP == m_reader_type_id;
     }
     }
+    void create_area();
+    const std::shared_ptr<area>& get_area()const{return m_area;}
     point get_dstp(const point pt) const
     point get_dstp(const point pt) const
     {
     {
         point tmp;
         point tmp;

+ 31 - 8
area.cpp

@@ -5,6 +5,9 @@
 
 
 #include <area.h>
 #include <area.h>
 #include "point.h"
 #include "point.h"
+#include "tool_time.h"
+#include "common_tool.h"
+#include "db_tool.h"
 #include "monkey_car/monkeycar_area.h"
 #include "monkey_car/monkeycar_area.h"
 #include "landmark.h"
 #include "landmark.h"
 #include "area_business.h"
 #include "area_business.h"
@@ -14,13 +17,13 @@
 
 
 #include "area_business.h"
 #include "area_business.h"
 #include "site_area.h"
 #include "site_area.h"
-#include"card.h"
+#include "card.h"
 #include "tool_time.h"
 #include "tool_time.h"
 #include "websocket/ws_common.h"
 #include "websocket/ws_common.h"
 #include "websocket/wsClientMgr.h"
 #include "websocket/wsClientMgr.h"
+#include "ant.h"
 
 
-template<> std::shared_ptr<area_list> 
-single_base<area_list, int, std::shared_ptr<area>>::m_instance=std::make_shared<area_list>();
+//template<> std::shared_ptr<area_list> single_base<area_list, int, std::shared_ptr<area>>::m_instance=std::make_shared<area_list>();
 
 
 struct underground_area:area
 struct underground_area:area
 {
 {
@@ -30,11 +33,7 @@ struct underground_area:area
 	}
 	}
     virtual bool in_area(const std::shared_ptr<site>&s,const std::shared_ptr<card_location_base>&c, const point & p,int &sarid)
     virtual bool in_area(const std::shared_ptr<site>&s,const std::shared_ptr<card_location_base>&c, const point & p,int &sarid)
 	{
 	{
-		bool f =false;
-		int id = c->get_area();
-		if(id!=-1)
-		  f=true;
-		return f;
+        return s&&!s->is_up_site();
 	}
 	}
 };
 };
 
 
@@ -83,6 +82,8 @@ area::area(int id,int limit_count_person, int limit_time_person,double scale,int
 
 
 void area::on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
 void area::on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
 {
 {
+	a->m_last_time=tool_time::now_to_ms();
+	a->m_last_point=*c;
  	for(const auto &i:m_area_business_list)
  	for(const auto &i:m_area_business_list)
 	{
 	{
 		auto &x=a->get_business_data(i->area_business_type());
 		auto &x=a->get_business_data(i->area_business_type());
@@ -93,6 +94,8 @@ void area::on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<ca
 void area::on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
 void area::on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
 {
 {
 	log_info("on_enter..%d  areaId:%d",c->m_id,m_id);
 	log_info("on_enter..%d  areaId:%d",c->m_id,m_id);
+	a->m_enter_time=tool_time::now_to_ms();
+	a->m_enter_point=*c;
  	for(const auto &i:m_area_business_list)
  	for(const auto &i:m_area_business_list)
 	{
 	{
 		auto &x=a->get_business_data(i->area_business_type());
 		auto &x=a->get_business_data(i->area_business_type());
@@ -103,6 +106,8 @@ void area::on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<ca
 void area::on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
 void area::on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
 {
 {
 	log_info("on_leave..%d  areaId:%d",c->m_id,m_id);
 	log_info("on_leave..%d  areaId:%d",c->m_id,m_id);
+	a->m_last_time=tool_time::now_to_ms();
+	a->m_last_point=*c;
  	for(const auto &i:m_area_business_list)
  	for(const auto &i:m_area_business_list)
 	{
 	{
 		auto &x=a->get_business_data(i->area_business_type());
 		auto &x=a->get_business_data(i->area_business_type());
@@ -422,6 +427,8 @@ std::vector<std::shared_ptr<area>> area_list::get_area(const std::shared_ptr<sit
 	for(const auto &a:map)
 	for(const auto &a:map)
 		if(a.second->in_area(s,c,pt,sarid))
 		if(a.second->in_area(s,c,pt,sarid))
 			ret.push_back(a.second);
 			ret.push_back(a.second);
+    if(s)
+        ret.push_back(s->get_area());
 	//区域覆盖不完全地图,很多车辆人行驶在地图外,如何确认.
 	//区域覆盖不完全地图,很多车辆人行驶在地图外,如何确认.
 	return std::move(ret);
 	return std::move(ret);
 }
 }
@@ -489,6 +496,22 @@ void area_tool::on_point(const std::shared_ptr<site>&s,const std::shared_ptr<car
 	}
 	}
 
 
 	m_hover_list=std::move(nlist);
 	m_hover_list=std::move(nlist);
+
+    //更新到数据库
+    std::string strAreaInfo = "";
+    for (std::vector<std::shared_ptr<area_hover>>::iterator itvec = m_hover_list.begin(); itvec != m_hover_list.end(); ++itvec)
+    {
+        if ((*itvec)->id() > 0)
+        {
+            char tmpArea[128] = {0};
+            snprintf(tmpArea, 128, "%d,%lu|", (*itvec)->id(), (*itvec)->m_enter_time);
+            strAreaInfo += tmpArea;
+        }
+    }
+    char sql[1024] = {0};
+    snprintf(sql, 1024, "call card_location(%lu, %d, %lf, %lf, %lf,d '%s');",
+        tool_other::type_id_to_u64(c->m_type, c->m_id), s->id(), pt.x, pt.y, pt.z, strAreaInfo.c_str());
+    db_tool::PushAsync(sql);
 }
 }
 
 
 void area_tool::on_leave(const std::shared_ptr<card_location_base>& c)
 void area_tool::on_leave(const std::shared_ptr<card_location_base>& c)

+ 1 - 0
area_business.h

@@ -15,6 +15,7 @@ struct area_business
 {
 {
 	virtual int area_business_type()=0;
 	virtual int area_business_type()=0;
 
 
+	virtual void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr){}
 	virtual void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr){}
 	virtual void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr){}
 	virtual void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
 	virtual void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
 	virtual void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
 	virtual void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}

+ 89 - 114
card.cpp

@@ -161,13 +161,11 @@ void card_list::load_his_card_postion_from_db()
 
 
 void card_list::load_his_card_postion_vehicle()
 void card_list::load_his_card_postion_vehicle()
 {
 {
-    const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.map_id, la.area_id, l.state, \
+    const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.area_info, l.state, \
             case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
             case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
-            l.mileage, la.enter_time, att.start_time, \
-            att.end_time, \
-            l.landmark_id, l.direction_mapper_id, l.landmark_dist \
-            from rt_location l, rt_location_area la, rt_att_vehicle att, dat_card c, dat_vehicle_extend v \
-            where l.card_id = c.card_id and l.card_id = la.card_id and l.card_id = att.card_id and l.card_id=v.card_id \
+            att.start_time, att.end_time
+            from rt_location l, rt_att_vehicle att, dat_card c, dat_vehicle_extend v \
+            where l.card_id = c.card_id and l.card_id = att.card_id and l.card_id=v.card_id \
             and c.state_id=0;";
             and c.state_id=0;";
     std::string Error;
     std::string Error;
     YADB::CDBResultSet DBRes;
     YADB::CDBResultSet DBRes;
@@ -181,16 +179,12 @@ void card_list::load_his_card_postion_vehicle()
 
 
         while ( DBRes.GetNextRecod(Error) )
         while ( DBRes.GetNextRecod(Error) )
         {
         {
-            std::string card_id  = "";
+            long long int card_id  = 0;
             DBRes.GetField( "card_id",card_id, Error );
             DBRes.GetField( "card_id",card_id, Error );
-
-            uint32_t id = tool_other::id64_to_id(card_id);
-            int type = tool_other::id64_to_type(card_id);
-
-            auto temp_ptr = card_list::instance()->get(tool_other::type_id_to_u64(type, id));
+            auto temp_ptr = card_list::instance()->get(card_id);
             if(!temp_ptr || !temp_ptr->is_vehicle())
             if(!temp_ptr || !temp_ptr->is_vehicle())
             {
             {
-                log_error("全局卡列表中找不到卡,卡id=%d,卡type=%d", id, type);
+                log_error("全局卡列表中找不到卡,卡id=%lu", card_id);
                 continue;
                 continue;
             }
             }
 
 
@@ -205,11 +199,8 @@ void card_list::load_his_card_postion_vehicle()
             double z = 0;
             double z = 0;
             DBRes.GetField( "z",z, Error );
             DBRes.GetField( "z",z, Error );
 
 
-            int map_id  = 0;
-            DBRes.GetField( "map_id",map_id, Error );
-
-            int area_id  = 0;
-            DBRes.GetField( "area_id",area_id, Error );
+            std::string strAreaInfo = "";
+            DBRes.GetField( "area_info",strAreaInfo, Error );
 
 
             int state  = 0;
             int state  = 0;
             DBRes.GetField( "state",state, Error );
             DBRes.GetField( "state",state, Error );
@@ -217,9 +208,6 @@ void card_list::load_his_card_postion_vehicle()
             double speed = 0;
             double speed = 0;
             DBRes.GetField( "speed",speed, Error );
             DBRes.GetField( "speed",speed, Error );
 
 
-            std::string enter_time  = "";
-            DBRes.GetField( "enter_time",enter_time, Error );
-
             std::string start_time  = "";
             std::string start_time  = "";
             DBRes.GetField( "start_time",start_time, Error );
             DBRes.GetField( "start_time",start_time, Error );
 
 
@@ -239,55 +227,54 @@ void card_list::load_his_card_postion_vehicle()
             card_ptr->y = y;
             card_ptr->y = y;
             card_ptr->z = z;
             card_ptr->z = z;
 
 
-            auto area = area_list::instance()->get(area_id);
-            if(area == nullptr)
-            {
-                log_error("load_vehicle...area_list 找不到区域:区域id=%d", area_id);
-                continue;
-            }
-            area->m_vehicle_count++;
-
-            //point pt = *card_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);
-            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;
-            card_ptr->m_speed = speed;
-
-            if(end_time.empty())
+            //解析area_info
+            const char * split = "|";
+            char *p = strtok(const_cast<char *>(strAreaInfo.c_str()), split);
+            while (p != NULL)
             {
             {
-                auto mine_tool_ptr = card_ptr->get_mine_tool();
-                mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
-                mine_tool_ptr->m_is_attendance = true;
+                int area_id = 0;
+                uint64_t enter_time = 0; 
+                sscanf(p, "%d,%lu", &area_id, &enter_time);
+                p = strtok(NULL, split);
+                if (area_id <= 0)
+                    continue;
+
+                auto area = area_list::instance()->get(area_id);
+                if(area == nullptr)
+                {
+                    log_error("load_vehicle...area_list 找不到区域:区域id=%d", area_id);
+                    continue;
+                }
+                area->m_vehicle_count++;
+                card_ptr->m_speed = speed;
+
+                if(end_time.empty())
+                {
+                    auto mine_tool_ptr = card_ptr->get_mine_tool();
+                    mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
+                    mine_tool_ptr->m_is_attendance = true;
+                }
+
+                card_ptr->m_time = tool_time::now_to_ms();
+
+                //要放到最后
+                auto area_hover_ptr = std::make_shared<area_hover>();
+                area_hover_ptr->m_area = area;
+                area_hover_ptr->m_enter_time = enter_time;
+                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);
             }
             }
-
-            //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();
         }
         }
     }
     }
 }
 }
 
 
 void card_list::load_his_card_postion_staff()
 void card_list::load_his_card_postion_staff()
 {
 {
-    const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.map_id, la.area_id, l.state, \
+    const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.area_info l.state, \
             case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
             case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
-            l.mileage, la.enter_time, att.start_time, \
-            att.end_time, \
-            l.landmark_id, l.direction_mapper_id, l.landmark_dist \
-            from rt_location l, rt_location_area la, rt_att_staff att, dat_card c, dat_staff_extend s \
-            where l.card_id = c.card_id and l.card_id = la.card_id and l.card_id = att.card_id and l.card_id=s.card_id\
+            att.start_time, att.end_time
+            from rt_location l, rt_att_staff att, dat_card c, dat_staff_extend s \
+            where l.card_id = c.card_id and l.card_id = att.card_id and l.card_id=s.card_id\
             and c.state_id=0;";
             and c.state_id=0;";
     std::string Error;
     std::string Error;
     YADB::CDBResultSet DBRes;
     YADB::CDBResultSet DBRes;
@@ -308,16 +295,12 @@ void card_list::load_his_card_postion_staff()
                 continue;
                 continue;
             }
             }
 
 
-            std::string card_id  = "";
+            long long int card_id  = 0;
             DBRes.GetField( "card_id",card_id, Error );
             DBRes.GetField( "card_id",card_id, Error );
-
-            uint32_t id = tool_other::id64_to_id(card_id);
-            int type = tool_other::id64_to_type(card_id);
-
-            auto temp_ptr = card_list::instance()->get(tool_other::type_id_to_u64(type, id));
+            auto temp_ptr = card_list::instance()->get(card_id);
             if(!temp_ptr || !temp_ptr->is_person())
             if(!temp_ptr || !temp_ptr->is_person())
             {
             {
-                log_error("全局卡列表中找不到卡,卡id=%d,卡type=%d", id, type);
+                log_error("全局卡列表中找不到卡,卡id=%lu", card_id);
                 continue;
                 continue;
             }
             }
 
 
@@ -332,11 +315,8 @@ void card_list::load_his_card_postion_staff()
             double z = 0;
             double z = 0;
             DBRes.GetField( "z",z, Error );
             DBRes.GetField( "z",z, Error );
 
 
-            int map_id  = 0;
-            DBRes.GetField( "map_id",map_id, Error );
-
-            int area_id  = 0;
-            DBRes.GetField( "area_id",area_id, Error );
+            std::string strAreaInfo = "";
+            DBRes.GetField( "area_info",strAreaInfo, Error );
 
 
             int state  = 0;
             int state  = 0;
             DBRes.GetField( "state",state, Error );
             DBRes.GetField( "state",state, Error );
@@ -344,9 +324,6 @@ void card_list::load_his_card_postion_staff()
             double speed = 0;
             double speed = 0;
             DBRes.GetField( "speed",speed, Error );
             DBRes.GetField( "speed",speed, Error );
 
 
-            std::string enter_time  = "";
-            DBRes.GetField( "enter_time",enter_time, Error );
-
             std::string start_time  = "";
             std::string start_time  = "";
             DBRes.GetField( "start_time",start_time, Error );
             DBRes.GetField( "start_time",start_time, Error );
 
 
@@ -363,44 +340,43 @@ void card_list::load_his_card_postion_staff()
             card_ptr->y = y;
             card_ptr->y = y;
             card_ptr->z = z;
             card_ptr->z = z;
 
 
-            auto area = area_list::instance()->get(area_id);
-            if(area == nullptr)
-            {
-                log_error("area_list 找不到区域:区域id=%d", area_id);
-                continue;
-            }
-            area->m_person_count++;
-
-            //point pt = *card_ptr;
-            //card_ptr->m_area_tool->init_area(area,pt,temp_ptr);
-//			m_area_hover = std::make_shared<area_hover>(area,pt,speed);
-
-            auto e_t = tool_time::to_time_ex(enter_time);
-
-            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;
-            //int state  = 0;
-            card_ptr->m_speed = speed;
-
-            if(end_time.empty())
+            //解析area_info
+            const char * split = "|";
+            char *p = strtok(const_cast<char *>(strAreaInfo.c_str()), split);
+            while (p != NULL)
             {
             {
-                auto mine_tool_ptr = card_ptr->get_mine_tool();
-                mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
-                mine_tool_ptr->m_is_attendance = true;
+                int area_id = 0;
+                uint64_t enter_time = 0; 
+                sscanf(p, "%d,%lu", &area_id, &enter_time);
+                p = strtok(NULL, split);
+                if (area_id <= 0)
+                    continue;
+
+                auto area = area_list::instance()->get(area_id);
+                if(area == nullptr)
+                {
+                    log_error("area_list 找不到区域:区域id=%d", area_id);
+                    continue;
+                }
+                area->m_person_count++;
+                card_ptr->m_speed = speed;
+
+                if(end_time.empty())
+                {
+                    auto mine_tool_ptr = card_ptr->get_mine_tool();
+                    mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
+                    mine_tool_ptr->m_is_attendance = true;
+                }
+
+                card_ptr->m_time = tool_time::now_to_ms();
+
+                //要放到最后
+                auto area_hover_ptr = std::make_shared<area_hover>();
+                area_hover_ptr->m_area = area;
+                area_hover_ptr->m_enter_time = enter_time;
+                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);
             }
             }
-
-            //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();
         }
         }
     }
     }
 }
 }
@@ -426,6 +402,5 @@ bool card_list_visit::visit(std::shared_ptr<card_location_base> c)
 	return true;	
 	return true;	
 }
 }
 
 
-template<> std::shared_ptr<card_list> 
-single_base<card_list, uint64_t, std::shared_ptr<card_location_base>>::m_instance=std::make_shared<card_list>();
+//template<> std::shared_ptr<card_list> single_base<card_list, uint64_t, std::shared_ptr<card_location_base>>::m_instance=std::make_shared<card_list>();
 
 

+ 1 - 1
card_base.h

@@ -89,7 +89,7 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
 	virtual void reset(std::shared_ptr<monkey_person> mp){}
 	virtual void reset(std::shared_ptr<monkey_person> mp){}
     virtual int get_vehicle_type_id(){return  0;}
     virtual int get_vehicle_type_id(){return  0;}
 	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)=0;
 	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)=0;
-	virtual int get_area()=0;
+	virtual int get_area(){return -1;}
     virtual std::shared_ptr<area_tool> get_area_tool()=0;
     virtual std::shared_ptr<area_tool> get_area_tool()=0;
     virtual int get_vehicle_category_id(){return -1;}
     virtual int get_vehicle_category_id(){return -1;}
     virtual int get_workline(){return -1;}
     virtual int get_workline(){return -1;}

+ 0 - 4
card_person.cpp

@@ -76,10 +76,6 @@ void person::IKSDK_DB(int sid)
 		}
 		}
 	}
 	}
 }
 }
-int person::get_area()
-{
-	return m_site_area->get_att_type();
-}
 std::shared_ptr<area_hover> person::get_area_hover()
 std::shared_ptr<area_hover> person::get_area_hover()
 {
 {
 	return m_area_tool->get_area_first();
 	return m_area_tool->get_area_first();

+ 0 - 1
card_person.h

@@ -28,7 +28,6 @@ struct person:card_location_base, card_area
     virtual std::shared_ptr<site_area_hover> get_site_area();
     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 void do_business(const std::shared_ptr<site>&site,const point &pt,double acc);
 	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type);
 	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()
     virtual std::shared_ptr<area_tool> get_area_tool()
     {
     {
         return m_area_tool;
         return m_area_tool;

+ 1 - 1
db/db_api/CDBConnPool.cpp

@@ -218,7 +218,7 @@ namespace YADB
 						if ( (my_ulonglong)-1 == llRes )
 						if ( (my_ulonglong)-1 == llRes )
 						{
 						{
 							//Execute failed, write log...
 							//Execute failed, write log...
-							printf( "Error,调用ExcuteRealSql失败,Err=%s\n", Error.c_str() );
+							printf( "Error,调用ExcuteRealSql失败,Err=%s,[%s]\n", Error.c_str(),pData->SQL.c_str());
 							//如果失败了看是不是数据库断开连接了,尝试重新连接一次
 							//如果失败了看是不是数据库断开连接了,尝试重新连接一次
 							if ( __pAsyncDBConn->ConnctionTest( Error ) != 0 )
 							if ( __pAsyncDBConn->ConnctionTest( Error ) != 0 )
 							{
 							{

+ 2 - 2
event.cpp

@@ -399,5 +399,5 @@ void event_list::_ev_to_node(std::shared_ptr<ya_event> ev_ptr,
 
 
     out_data.PushBack(ev, allocator);
     out_data.PushBack(ev, allocator);
 }
 }
-template<> std::shared_ptr<event_list>
-single_base<event_list, uint64_t, std::shared_ptr<ya_event>>::m_instance=std::make_shared<event_list>();
+
+//template<> std::shared_ptr<event_list> single_base<event_list, uint64_t, std::shared_ptr<ya_event>>::m_instance=std::make_shared<event_list>();

+ 1 - 1
main.cpp

@@ -149,7 +149,7 @@ void usage(char ** argv)
     }
     }
     else if(cmd == "--version" || cmd == "-v")
     else if(cmd == "--version" || cmd == "-v")
     {
     {
-        printf("yals (采集程序) 0.1.0\n");
+        printf("yals (采集程序) 2.0.0\n");
     }
     }
     else
     else
     {
     {

+ 0 - 1
mine_business.cpp

@@ -374,7 +374,6 @@ void reverse_alarm_business::run_sensor()
     if (t-time_interval>3*60)
     if (t-time_interval>3*60)
     {
     {
         time_interval =t;
         time_interval =t;
-        printf("reverse_alarm......\n");
         for(const auto &x:m_sensor_mgr)
         for(const auto &x:m_sensor_mgr)
           x.second->for_each();
           x.second->for_each();
     }
     }

+ 18 - 69
module_service/area_business_card_enter_or_leave.cpp

@@ -7,26 +7,17 @@
 #include"log.h"
 #include"log.h"
 
 
 
 
-struct enter_or_leave_data:business_data
-{
-    enter_or_leave_data()
-    {
-        m_enter_time_ms = tool_time::now_to_ms();
-    }
-
-    ///考勤开始时间
-    uint64_t m_enter_time_ms;
-};
-
 //进入区域则入库操作
 //进入区域则入库操作
-void area_business_card_enter_or_leave::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)
+void area_business_card_enter_or_leave::on_enter(const std::shared_ptr<area_hover>&a,
+                                                 const std::shared_ptr<card_location_base>&c,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);
+    char sql[LENGTH_SQL]{0};
+    std::string start_time = tool_time::to_str_ex(a->m_enter_time);
+    std::string card_id = tool_other::type_id_to_str(c->m_type,c->m_id);
+    const auto &p=a->m_enter_point;
+    snprintf(sql,LENGTH_SQL,"INSERT INTO his_location_area (card_id,area_id,map_id,enter_time,start_point)VALUES ('%s',%d,%d,'%s','%.2f,%.2f');",
+                card_id.c_str(),a->id(),a->mapid(),start_time.c_str(),p.x,p.y);
+    db_tool::PushAsync(sql);
 }
 }
 
 
 void area_business_card_enter_or_leave::on_hover(const std::shared_ptr<area_hover>&a,
 void area_business_card_enter_or_leave::on_hover(const std::shared_ptr<area_hover>&a,
@@ -35,57 +26,15 @@ void area_business_card_enter_or_leave::on_hover(const std::shared_ptr<area_hove
 
 
 }
 }
 //出区域则入库
 //出区域则入库
-void area_business_card_enter_or_leave::on_leave(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(nullptr == ptr)
-    {
-        log_error("出区域失败:nullptr == ptr");
-        return;
-    }
-    auto ptr_temp = dynamic_cast<enter_or_leave_data*>(ptr.get());
-    if (nullptr == ptr_temp)
-    {
-        return ;
-    }
-    save_his_area_location_leave(area_hover_ptr, card_ptr, ptr_temp->m_enter_time_ms);
-}
-
-///入库
-void area_business_card_enter_or_leave::save_his_area_location_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
-                                                                     const std::shared_ptr<card_location_base>&card_ptr,
-                                                                     uint64_t start_time_ms)
-{
-    char sql[LENGTH_SQL] = {0};
-
-    std::string call(card_ptr->is_vehicle()?"add_area_vehicle":"add_area_staff");
-
-    std::string start_str = tool_time::to_str_ex(start_time_ms);
-
-    sprintf(sql, "CALL %s(%s, %d, %d, %d, '%s','%s');", call.c_str(),
-            tool_other::type_id_to_str(card_ptr->m_type, card_ptr->m_id).c_str(),
-            card_ptr->m_id, area_hover_ptr->id(), area_hover_ptr->mapid(), start_str.c_str(), start_str.c_str());
-
-    db_tool::PushAsync(sql);
-}
-
-///入库
-void area_business_card_enter_or_leave::save_his_area_location_leave(const std::shared_ptr<area_hover>&area_hover_ptr,
-                                                                     const std::shared_ptr<card_location_base>&card_ptr,
-                                                                     uint64_t start_time_ms)
+void area_business_card_enter_or_leave::on_leave(const std::shared_ptr<area_hover>&a,
+                                                 const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
 {
-    char sql[LENGTH_SQL] = {0};
-
-    std::string call(card_ptr->is_vehicle()?"add_area_vehicle":"add_area_staff");
-
-    std::string start_str = tool_time::to_str_ex(start_time_ms);
-    std::string end_str = tool_time::to_str_ex(tool_time::now_to_ms());
-
-    sprintf(sql, "CALL %s(%s, %d, %d, %d, '%s','%s');", call.c_str(),
-            tool_other::type_id_to_str(card_ptr->m_type, card_ptr->m_id).c_str(),
-            card_ptr->m_id, area_hover_ptr->id(), area_hover_ptr->mapid(), start_str.c_str(), end_str.c_str());
-
+    char sql[LENGTH_SQL]{0};
+    std::string start_time = tool_time::to_str_ex(a->m_enter_time);
+    std::string end_time = tool_time::to_str_ex(a->m_last_time);
+    std::string card_id = tool_other::type_id_to_str(c->m_type,c->m_id);
+    const auto &ep=a->m_last_point;
+    snprintf(sql,LENGTH_SQL,"UPDATE his_location_area SET leave_time='%s',end_point='%.2f,%.2f' WHERE card_id = '%s' AND area_id=%d AND enter_time='%s';",
+                end_time.c_str(),ep.x,ep.y,card_id.c_str(),a->id(),start_time.c_str());
     db_tool::PushAsync(sql);
     db_tool::PushAsync(sql);
 }
 }
-
-

+ 0 - 10
module_service/area_business_card_enter_or_leave.h

@@ -15,16 +15,6 @@ struct area_business_card_enter_or_leave: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_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);
 	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 save_his_area_location_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
-                                             const std::shared_ptr<card_location_base>&card_ptr,
-                                             uint64_t start_time_ms);
-
-    ///入库
-    static void save_his_area_location_leave(const std::shared_ptr<area_hover>&area_hover_ptr,
-                                             const std::shared_ptr<card_location_base>&card_ptr,
-                                             uint64_t start_time_ms);
 };
 };
 
 
 #endif
 #endif

+ 0 - 12
module_service/area_business_post_area.cpp

@@ -6,28 +6,16 @@
 /*
 /*
 	确定推送人员信息时的区域,每一个明确需要推送的区域,都要推送
 	确定推送人员信息时的区域,每一个明确需要推送的区域,都要推送
 */
 */
-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,
 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)
 						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);
 	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)
 						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);
 	c->set_area_info(0,0,a->id(),a->m_enter_time,1);
 }
 }
 
 

+ 2 - 2
websocket/jsonBuilder.cpp

@@ -5,7 +5,7 @@
 #include <rapidjson/stringbuffer.h>
 #include <rapidjson/stringbuffer.h>
 #include <rapidjson/prettywriter.h>
 #include <rapidjson/prettywriter.h>
 #include "constdef.h"
 #include "constdef.h"
-
+#include "log.h"
 namespace YA
 namespace YA
 {
 {
 	jsonBuilder::jsonBuilder()
 	jsonBuilder::jsonBuilder()
@@ -155,7 +155,7 @@ namespace YA
 		//18 车辆当天出勤的标识
 		//18 车辆当天出勤的标识
 		tmp_object.SetInt( CardPos.is_on_duty );
 		tmp_object.SetInt( CardPos.is_on_duty );
 		Array.PushBack( tmp_object, Allocator );
 		Array.PushBack( tmp_object, Allocator );
-
+        log_info("websocket..%d",CardPos.area_info.size());
 		rapidjson::Value Array_1( rapidjson::kArrayType );
 		rapidjson::Value Array_1( rapidjson::kArrayType );
 		for(const auto &a:CardPos.area_info)	
 		for(const auto &a:CardPos.area_info)	
 		{
 		{

BIN
websocket/libwebsocket.a


+ 67 - 12
write-copy.h

@@ -1,6 +1,7 @@
 #ifndef _WRITE_COPY_HPP_
 #ifndef _WRITE_COPY_HPP_
 #define  _WRITE_COPY_HPP_
 #define  _WRITE_COPY_HPP_
 //add之前如果有数据,需要把运行中更改的数据进行保存。
 //add之前如果有数据,需要把运行中更改的数据进行保存。
+#include <assert.h>
 #include <unordered_map>
 #include <unordered_map>
 #include <algorithm>
 #include <algorithm>
 #include <memory>
 #include <memory>
@@ -115,54 +116,108 @@ private:
 	}
 	}
 };
 };
 
 
+template<typename T>
+struct safe_shared_ptr
+{
+	std::atomic<int> m_mutex;
+	std::shared_ptr<T> m_ptr;
+
+	safe_shared_ptr(std::shared_ptr<T> ptr)
+	{
+		m_mutex=0;
+		m_ptr=ptr;
+	}
+
+	safe_shared_ptr(safe_shared_ptr<T>&&ptr)
+	{
+		m_mutex.store(ptr.m_mutex.load());
+		m_ptr=std::move(ptr.get());
+	}
+
+
+	bool set(std::shared_ptr<T> ptr)
+	{
+		lock();
+		m_ptr=ptr;
+		unlock();
+
+		return true;
+	}
+
+	std::shared_ptr<T> get()
+	{
+		lock();
+		std::shared_ptr<T>  ret=m_ptr;
+		unlock();
+		return ret;
+	}
+
+private:
+	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);
+	}
+};
+
 template<typename T,typename K,typename V>
 template<typename T,typename K,typename V>
 struct single_base:write_copy_base<T,K,V>
 struct single_base:write_copy_base<T,K,V>
 {
 {
 	typedef write_copy_base<T,K,V> base;
 	typedef write_copy_base<T,K,V> base;
-	static std::shared_ptr<T> m_instance;
+
+	static safe_shared_ptr<T> m_instance;
+	std::mutex         m_mutex;
+
 	static std::shared_ptr<T> instance()
 	static std::shared_ptr<T> instance()
 	{
 	{
-		return m_instance;
+		return m_instance.get();
 	}
 	}
 
 
-	std::mutex m_mutex;
-
 	void add(K k,V c)
 	void add(K k,V c)
 	{
 	{
 		std::lock_guard<std::mutex> lock(m_mutex);
 		std::lock_guard<std::mutex> lock(m_mutex);
-		m_instance=std::move(base::clone_add(k,c));
+		m_instance.set(base::clone_add(k,c));
 	}
 	}
 
 
 	void add(const std::unordered_map<K,V>&c)
 	void add(const std::unordered_map<K,V>&c)
 	{
 	{
 		std::lock_guard<std::mutex> lock(m_mutex);
 		std::lock_guard<std::mutex> lock(m_mutex);
-		m_instance=std::move(base::clone_add(c));
+		m_instance.set(base::clone_add(c));
 	}
 	}
 	void remove(K k,V c)
 	void remove(K k,V c)
 	{
 	{
 		std::lock_guard<std::mutex> lock(m_mutex);
 		std::lock_guard<std::mutex> lock(m_mutex);
-		m_instance=std::move(base::clone_remove(k,c));
+		m_instance.set(base::clone_remove(k,c));
 	}
 	}
 
 
 	void remove(const std::unordered_map<K,V>&c)
 	void remove(const std::unordered_map<K,V>&c)
 	{
 	{
 		std::lock_guard<std::mutex> lock(m_mutex);
 		std::lock_guard<std::mutex> lock(m_mutex);
-		m_instance=std::move(base::clone_remove(c));
+		m_instance.set(base::clone_remove(c));
 	}
 	}
 
 
     void remove(const std::vector<K>&list)
     void remove(const std::vector<K>&list)
     {
     {
-        std::lock_guard<std::mutex> lock(m_mutex);
-        m_instance=std::move(base::clone_remove(list));
+		std::lock_guard<std::mutex> lock(m_mutex);
+		m_instance.set(base::clone_remove(list));
     }
     }
 
 
     void remove(K k)
     void remove(K k)
     {
     {
-        std::lock_guard<std::mutex> lock(m_mutex);
-        m_instance=std::move(base::clone_remove(k));
+		std::lock_guard<std::mutex> lock(m_mutex);
+		m_instance.set(base::clone_remove(k));
     }
     }
 };
 };
 
 
+template<typename T,typename K,typename V> safe_shared_ptr<T> single_base<T,K,V>::m_instance=std::make_shared<T>();
+
 #endif
 #endif