Browse Source

人员升井时,补全历史轨迹

lixioayao 5 years ago
parent
commit
f132e641a2

+ 2 - 2
card_base.cpp

@@ -77,11 +77,11 @@ void card_location_base::do_status(int st)
 
     module_mgr::do_status((STATUS_CARD)st, m_id, m_type);
 }
-void card_location_base::make_his_location(uint64_t t,const point & pt)
+void card_location_base::make_his_location(uint64_t t,const point & pt,bool bclose /*= false*/)
 {
      int sid=0,mapid=0;
 	if(auto site_ptr=get_area_tool()->m_site){sid=site_ptr->m_area_id;mapid=site_ptr->m_map_id;}
-    m_his_location_card->push(t,pt,sid,mapid);
+    m_his_location_card->push(t,pt,sid,mapid,bclose);
 }
 
 void card_location_base::on_location(const std::vector<point>&vp,const std::vector<loc_message> &lm )

+ 2 - 2
card_base.h

@@ -52,7 +52,7 @@ struct card:point
 	uint32_t m_id;				//卡号
 	uint32_t m_cid;				//标识id 人staff_id 车 vehicle_id
 	int32_t  m_deptid;			//部门编号
-	int32_t  m_level_id;		//部门级别
+	int32_t  m_level_id;		//职务级别
 	int		 m_stat;			//运动静止状态
 	int		 m_biz_stat;
 	uint16_t m_display;			//1显示0不显示,往前端推送
@@ -102,7 +102,7 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
 	virtual void get_card(bool f)=0;
 	virtual void site_hover(int sid){}
 
-    void make_his_location(uint64_t t,const point & pt);
+    void make_his_location(uint64_t t,const point & pt,bool bclose = false);
     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 );
     void do_status(int st);

+ 1 - 1
card_path.cpp

@@ -221,7 +221,7 @@ struct handle_path :visitor<std::shared_ptr<site>>
 			return false;
         if(s[0].size()<2)
 			return false;
-        line_v l000 = s[0][0][0];
+        line_v l000 = s[0][0][0]; //天线->分站天线路径集合->路径
         line_v l010 = s[0][1][0];
         if(l000.is_same(l010))
         {

+ 4 - 0
card_person.cpp

@@ -6,6 +6,7 @@
 #include "area.h"
 #include "mine.h"
 #include "his_location.h"
+#include "tool_time.h"
 #include "three_rates.h"
 #include "select_tool.h"
 #include "monkey_car/monkeycar_person.h"
@@ -43,6 +44,8 @@ person::~person()
 }
 void person::clear()
 {
+    make_his_location(m_time,*this,true);
+
     m_mine_tool->clear();
     m_area_tool->clear();
     //清除部分信息
@@ -64,6 +67,7 @@ void person::clear()
     	m.cmd=CMD_CLEAR;m.cardid=m_type<<32|m_id;
     	cardMgr::instance()->tryPut(m);
     }
+
 }
 
 void person::set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)

+ 1 - 1
common.h

@@ -122,7 +122,7 @@ enum EVENT_TYPE{ // 事件类型
     ET_CARD_AREA_OVER_SPEED = 22, // 车辆区域超速
     ET_CARD_HELP = 24, // 人员呼救
     ET_CARD_DRIVINGFACE_WARNING_AREA = 28, //掘进面靠近预警区域告警
-    ET_UWB_MORE_CARD=31,
+    ET_UWB_MORE_CARD=31, //一人多卡
     ET_CARD_MOTIONLESS=32,//静止不动告警
     ET_READER_POWER_BY_BATTERY=33,//分站电池:1为电池供电,0为交流电供电,当电池供电需要告警
 	ET_VEHICLE_REAR_END=36,//车辆防追尾告警

+ 288 - 1
his_location.cpp

@@ -1,6 +1,10 @@
 #include "his_location.h"
-
+#include "log.h"
+#include "tool_time.h"
+#include "card_path.h"
+#include "db_api/CDBSingletonDefine.h"
 #include <config_file.h>
+
 extern config_file config;
 uint32_t  location_card::m_difftime=0;
 int  location_card::m_distance=-1;
@@ -19,3 +23,286 @@ location_card::location_card(uint32_t id,uint64_t type,uint32_t objid)
     }
 }
 
+void location_card::init()
+{
+    m_areaid=-1;
+    m_mapid=-1;
+    m_timestamp=0;
+    m_p.set(0,0);
+    std::queue<mini_data> tmp;
+    m_d.swap(tmp);
+    m_direct_index=0;
+    last_timestamp=0;
+    set_invalid();
+}
+void location_card::init_att(const point &pt,uint64_t time)
+{
+    std::queue<mini_data> tmp;
+    m_d.swap(tmp);
+    m_d.emplace(pt,time);
+}
+void location_card::set_invalid()
+{
+    m_arg=0x12345678;
+}
+bool location_card::is_valid()
+{
+    return m_arg!=0x12345678;
+}
+double location_card::make_arg(const point &pt,const point &p)
+{
+    log_info("his_location arg[%d],(%.2f,%.2f)--->(%.2f,%.2f)---->(%.2f,%.2f)",m_cardid,m_p.x,m_p.y,p.x,p.y,pt.x,pt.y);
+    return  std::arg(std::complex<double>(pt.x,pt.y)-std::complex<double>(p.x,p.y));
+}
+void location_card::set(const point &pt,uint64_t time)
+{
+    m_timestamp=time;
+    m_p.set(pt);
+    init_att(pt,time);
+}
+bool location_card::line_changed(const point &pt)//,int &df)
+{
+    if(!is_valid())
+        return false;
+    point p;
+    if(m_d.empty())p=m_p;  else p=m_d.back().p;
+
+    if(point::eq(p.x,pt.x,0.2) && point::eq(p.y,pt.y,0.2)) return false;
+    double dis1=m_p.dist(pt);
+    if(dis1<2)return false;
+    //double dis = p.dist(pt);
+    double dis = m_p.dist(pt);
+    double arg = make_arg(pt,m_p);
+    //查看路径方向是否改变
+    bool change_flag=(arg-m_arg > -1e-10 && arg-m_arg<1e-10);
+    //change_flag为true,标识没有发生变化
+    // if(change_flag)m_direct_index=0;
+    log_info("his_location:line_changed:%d,%f,m_arg:%f,%s,%f,%f",m_cardid,arg,m_arg, change_flag?"same":"not same",m_arg-arg,dis);
+    //if(dis<0.5 && fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
+    //   return false;
+    //判断10次反向才做下一步动作
+    // if(fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
+    // {
+    //     if(++m_direct_index<=10)
+    //     {
+    //         df=1;return false;
+    //     }
+    // }
+    //return !point::eq(arg,m_arg,1e-10);
+    return !change_flag;
+}
+bool location_card::is_speed_changed(const point& pt,uint64_t time)
+{
+    bool flag = false;
+    double v=0.0;
+    point ps=m_d.back().p;
+    if(ps.dist(pt)<0.1)return  flag;
+    if(m_d.size()>=4)
+    {
+        mini_data d1 = m_d.front();
+        double dist = d1.p.dist(pt);
+        double t = time-d1.time;
+        v = dist/t*1000;
+        m_d.pop();
+    }
+    m_d.emplace(pt,time);
+    if(v<=0.1)
+        return flag;
+    double dist = m_p.dist(pt);
+    double t	= time - m_timestamp;
+    double avge_speed= dist/t*1000;
+    log_info("his_location cardid:%d:v:%.2f,avge_v:%.2f,(%.2f--%.2f)",m_cardid,v,avge_speed,0.7*avge_speed,1.3*avge_speed);
+    if(v<(1-0.3)*avge_speed || v>(1+0.3)*avge_speed)
+        flag=true;
+
+    return flag;
+}
+bool location_card::time_out(const point &p,uint64_t time)
+{
+    uint64_t t=last_timestamp==0?m_timestamp:last_timestamp;
+    if(time-t>=30*1000 && m_p.dist(p)>0.1)
+        return true;
+    return false;
+}
+bool location_card::is_area_changed(int new_areaid)
+{
+    bool flag =false;
+    if(m_areaid != new_areaid)
+    {
+        m_areaid = new_areaid;
+        flag=true;
+    }
+    return flag;
+}
+bool location_card::is_map_changed(int new_mapid)
+{
+    bool flag =false;
+    if(m_mapid != new_mapid)
+    {
+        m_mapid = new_mapid;
+        flag=true;
+    }
+    return flag;
+}
+void location_card::push(uint64_t timestamp,const point & p,int32_t areaid,int32_t mapid,bool bclose/* = false*/)
+{
+    if (bclose) //卡移除后直接更新his_location
+    {
+        update(p,timestamp);
+        return;
+    }
+    if(m_p.empty() || m_timestamp==0||m_areaid<0||m_mapid<0)
+    {
+        set(p,timestamp);
+        m_areaid=areaid;m_mapid=mapid;
+        m_d.emplace(p,timestamp);
+        return ;
+    }
+
+    if(!is_valid())
+    {
+        //if(p==m_p)
+        if(point::eq(p.x,m_p.x,0.2) && point::eq(p.y,m_p.y,0.2))
+        {
+            set(p,timestamp);
+            log_info("his_location:%d New Point Too close.Point[%.2f,%.2f]",m_cardid,p.x,p.y);
+            return ;
+        }
+        auto v=find_path(m_p,p);
+        if(v.empty())
+            m_arg=make_arg(p,m_p);
+        else
+        {
+            log_info("his_location:more_abnormal_point....%d,(%.2f,%.2f)---(%.2f,%.2f)",m_cardid,m_p.x,m_p.y,p.x,p.y);
+            handle_path(v,timestamp,true);
+            set_invalid();
+            return;
+        }
+        log_info("his_location:%d arg:%f",m_cardid,m_arg);
+        insert();
+        return;
+    }
+
+    bool flag=false;
+    int  iflag=0;
+    //判断是否路径发生了变化
+    //这里现在又判断,如果反向了也会返回true.但是不运作,依然走下面的逻辑就会有问题
+    //比如速度
+    flag=handle_message(p,timestamp);
+    if(time_out(p,timestamp))
+        if(!flag)iflag=1;
+    if(is_speed_changed(p,timestamp))
+        if(!flag)iflag=2;
+    if(is_area_changed(areaid))
+        if(!flag)iflag=3;
+    if(is_map_changed(mapid))
+        if(!flag)iflag=4;
+    log_info("his_location cardid:%d:%d",m_cardid,iflag);
+    if(iflag)
+    {
+        update(p,timestamp,iflag);
+        //set_invalid();
+        if(iflag>1){
+            set(p,timestamp);
+            insert();
+        }
+    }
+}
+void location_card::insert()
+{
+    //std::string tabName=getTabName();
+    char nsql[512]={0};
+    const char * sql = "replace into his_location (obj_id,card_type_id,ident,begin_time,map_id,area_id,begin_pt,direction)"
+                       "values(%d,%d,%d,'%s',%d,%d,'%.2f,%.2f',%f);";
+    snprintf(nsql,512,sql,m_objid,m_type,m_cardid,tool_time::to_str(m_timestamp/1000).c_str(),m_mapid,m_areaid,m_p.x,m_p.y,m_arg);
+    log_info("his_location[%d,%lu]:%s",m_cardid,m_timestamp,nsql);
+    sDBConnPool.PushAsync(nsql);
+}
+void location_card::update(const point &p,uint64_t timestamp,int flag/*=0*/,int dflag/*=0*/)
+{
+    //std::string tabName=getTabName();
+    char nsql[512]={0};
+    const char * sql = "update his_location set last_time='%s',speed=%.3f,direction=%f,location_flag=%d where obj_id=%d and begin_time='%s' and last_time is null;";
+    double dist = m_p.dist(p);
+    double t	= (timestamp - m_timestamp)/1000;
+    double avge_speed= dist/t;
+    if(std::isnan(avge_speed)|| std::isinf(avge_speed))avge_speed=0;
+
+    log_info("his_location_time[%d]:%d[%lu,%lu,%lu]",m_cardid,flag,last_timestamp,timestamp,m_timestamp);
+    if(last_timestamp != 0)
+    {
+        const char * ss = "update his_location set last_time='%s',speed=%.3f,direction=%f,location_flag=%d where obj_id=%d and begin_time='%s' and last_time = '%s';";
+        snprintf(nsql,512,ss,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_arg,dflag,m_objid,tool_time::to_str(m_timestamp/1000).c_str(),tool_time::to_str(last_timestamp/1000).c_str());
+    }
+    else
+        snprintf(nsql,512,sql,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_arg,dflag,m_objid,tool_time::to_str(m_timestamp/1000).c_str());
+    if(flag==1) last_timestamp=timestamp;
+    else last_timestamp=0;
+
+    log_info("his_location[%d]:%s[%lu,%lu]",m_cardid,nsql,timestamp,m_timestamp);
+    sDBConnPool.PushAsync(nsql);
+}
+
+std::vector<point> location_card::find_path(const point &p1,const point &p2)
+{
+    std::vector<point> rc=card_path::inst().find_path(point(p1.x,-p1.y),point(p2.x,-p2.y));
+    return std::move(rc);
+}
+//virtual bool  handle_message(const point &p,uint64_t timestamp)=0;
+bool  location_card::handle_message(const point &p,uint64_t timestamp)
+{
+    bool flag = false;
+    //int df=0;
+    if(line_changed(p))//,df))
+    {
+        flag = true;
+        //std::vector<point> rc=find_path(m_d.back().p,p);
+        std::vector<point> rc=find_path(m_p,p);
+        if(rc.empty())
+        {
+            log_info("his_location:line_changed rc.empty() %d",m_cardid);
+            update(m_d.back().p,m_d.back().time);
+            set(m_d.back().p,m_d.back().time);
+        }
+        else
+        {
+            if(handle_path(rc,timestamp,false))
+                return true;
+        }
+        //置m_arg非法
+        set_invalid();
+    }
+    //if(df==1)flag=true;
+    return flag;
+}
+bool location_card::handle_path(std::vector<point> &rc,uint64_t timestamp,bool flag)
+{
+    double dis=0;point _p=m_p;
+    std::for_each(rc.begin(),rc.end(),[&dis,&_p](point &pt){
+        pt.y=-pt.y;dis+=_p.dist(pt);_p=pt;
+    });
+    uint64_t t=timestamp/1000 - m_timestamp/1000;
+    if(t==0||dis<0.1)return true;
+    double avge_speed= dis/t;
+    //有拐点  盲区时间差 距离
+    uint64_t difftime=t;int dflag=0;
+    if(!m_d.empty()) difftime=timestamp/1000-(m_d.back().time)/1000;
+    if(difftime>=location_card::m_difftime && dis>location_card::m_distance)
+    {
+        log_info("his_location[%d]:abnormal_line difftime:%lu,ltime:%u,dis:%.2f,limit_dis:%d",m_cardid,difftime,location_card::m_difftime,dis,location_card::m_distance);
+        dflag=1;
+    }
+    for(const point & pp:rc)
+    {
+        m_arg=make_arg(pp,m_p);
+        if(flag)insert();
+
+        log_info("his_location[%d]:line_changed_x point(%.2f,%.2f)--circle point(%.2f,%.2f),speed:%.2f",m_cardid,m_p.x,m_p.y,pp.x,pp.y,avge_speed);
+        double dist=m_p.dist(pp);uint64_t tt=dist/avge_speed*1000;
+        uint64_t etime=m_timestamp+tt;
+        update(pp,etime,0,dflag);
+        set(pp,etime);
+        flag=true;
+    }
+    return false;
+}

+ 29 - 273
his_location.h

@@ -3,10 +3,6 @@
 #include <complex>
 #include <queue>
 #include "point.h"
-#include "log.h"
-#include "tool_time.h"
-#include "card_path.h"
-#include "db_api/CDBSingletonDefine.h"
 //速度
 //区域 地图变换
 //运动方向
@@ -24,6 +20,7 @@ struct location_card
 	point		m_p;//入库后的点
     int         m_direct_index;
     uint64_t    last_timestamp;
+    bool 		m_isInsert ;	//是否
     static uint32_t  m_difftime;//进入盲区得时长限制 时长 
     static int  m_distance;//进入盲区后,第一个点与之前得距离  像素距离
 	struct mini_data
@@ -36,279 +33,38 @@ struct location_card
 		uint64_t time;
 	};
 	std::queue<mini_data> m_d;
-	void init()
-	{
-		m_areaid=-1;
-		m_mapid=-1;
-		m_timestamp=0;
-		m_p.set(0,0);
-		std::queue<mini_data> tmp;
-		m_d.swap(tmp);
-        m_direct_index=0;
-        last_timestamp=0;
-	}
-	void init_att(const point &pt,uint64_t time)
-	{
-		std::queue<mini_data> tmp;
-		m_d.swap(tmp);
-        m_d.emplace(pt,time);
-	}
-	void set_invalid()
-	{
-		m_arg=0x12345678;
-	}
-	bool is_valid()
-	{
-		return m_arg!=0x12345678;
-	}
-	double make_arg(const point &pt,const point &p)
-	{
-		log_info("his_location arg[%d],(%.2f,%.2f)--->(%.2f,%.2f)---->(%.2f,%.2f)",m_cardid,m_p.x,m_p.y,p.x,p.y,pt.x,pt.y);
-		return  std::arg(std::complex<double>(pt.x,pt.y)-std::complex<double>(p.x,p.y));
-	}
-	void set(const point &pt,uint64_t time)
-	{
-		m_timestamp=time;
-		m_p.set(pt);
-        init_att(pt,time);
-	}
-	bool line_changed(const point &pt)//,int &df)
-	{
-		if(!is_valid())
-		  return false;
-        point p;
-        if(m_d.empty())p=m_p;  else p=m_d.back().p;
+	void init();
+	void init_att(const point &pt,uint64_t time);
 
-		if(point::eq(p.x,pt.x,0.2) && point::eq(p.y,pt.y,0.2)) return false;
-        double dis1=m_p.dist(pt);
-        if(dis1<2)return false;
-        //double dis = p.dist(pt);
-        double dis = m_p.dist(pt);
-		double arg = make_arg(pt,m_p);
-        //查看路径方向是否改变
-        bool change_flag=(arg-m_arg > -1e-10 && arg-m_arg<1e-10);
-        //change_flag为true,标识没有发生变化
-       // if(change_flag)m_direct_index=0;
-		log_info("his_location:line_changed:%d,%f,m_arg:%f,%s,%f,%f",m_cardid,arg,m_arg, change_flag?"same":"not same",m_arg-arg,dis);
-        //if(dis<0.5 && fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
-         //   return false;
-        //判断10次反向才做下一步动作
-       // if(fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
-       // {
-       //     if(++m_direct_index<=10)
-       //     {
-       //         df=1;return false;
-       //     }
-       // }
-		//return !point::eq(arg,m_arg,1e-10);
-		return !change_flag;
-	}
-	bool is_speed_changed(const point& pt,uint64_t time)
-	{
-		bool flag = false;
-		double v=0.0;
-        point ps=m_d.back().p;
-        if(ps.dist(pt)<0.1)return  flag;
-		if(m_d.size()>=4)
-		{
-			mini_data d1 = m_d.front();
-			double dist = d1.p.dist(pt);
-			double t = time-d1.time;
-			v = dist/t*1000;
-			m_d.pop();
-		}
-		m_d.emplace(pt,time);
-		if(v<=0.1)
-		  return flag;
-		double dist = m_p.dist(pt);
-		double t	= time - m_timestamp;
-		double avge_speed= dist/t*1000;
-		log_info("his_location cardid:%d:v:%.2f,avge_v:%.2f,(%.2f--%.2f)",m_cardid,v,avge_speed,0.7*avge_speed,1.3*avge_speed);
-		if(v<(1-0.3)*avge_speed || v>(1+0.3)*avge_speed)
-		  flag=true;
-		  
-		return flag;
-	}
-	bool time_out(const point &p,uint64_t time)
-	{
-        uint64_t t=last_timestamp==0?m_timestamp:last_timestamp;
-		if(time-t>=30*1000 && m_p.dist(p)>0.1)
-			return true;
-		return false;
-	}
-	bool is_area_changed(int new_areaid)
-	{
-		bool flag =false;
-		if(m_areaid != new_areaid)
-		{
-			m_areaid = new_areaid;
-			flag=true;
-		}
-		return flag;
-	}
-	bool is_map_changed(int new_mapid)	
-	{
-		bool flag =false;
-		if(m_mapid != new_mapid)
-		{
-			m_mapid = new_mapid;
-			flag=true;
-		}
-		return flag;
-	}
-	void push(uint64_t timestamp,const point & p,int32_t areaid,int32_t mapid)
-	{
-		if(m_p.empty() || m_timestamp==0||m_areaid<0||m_mapid<0)	
-		{
-		  set(p,timestamp);
-		  m_areaid=areaid;m_mapid=mapid;
-		  m_d.emplace(p,timestamp);
-		  return;
-		}
-		
-		if(!is_valid())
-		{
-            //if(p==m_p)
-		    if(point::eq(p.x,m_p.x,0.2) && point::eq(p.y,m_p.y,0.2))
-            {
-		        set(p,timestamp);
-			    return ;
-            }
-            auto v=find_path(m_p,p);
-            if(v.empty())
-		        m_arg=make_arg(p,m_p);
-            else
-            {
-                log_info("his_location:more_abnormal_point....%d,(%.2f,%.2f)---(%.2f,%.2f)",m_cardid,m_p.x,m_p.y,p.x,p.y);
-                handle_path(v,timestamp,true);
-                set_invalid();
-                return;
-            }
-		    log_info("his_location:%d arg:%f",m_cardid,m_arg);
-		    insert();
-            return;
-		}
-		bool flag=false;
-		int  iflag=0;
-        //判断是否路径发生了变化
-        //这里现在又判断,如果反向了也会返回true.但是不运作,依然走下面的逻辑就会有问题
-        //比如速度
-		flag=handle_message(p,timestamp);
-		if(time_out(p,timestamp))
-			if(!flag)iflag=1;
-		if(is_speed_changed(p,timestamp))
-			if(!flag)iflag=2;
-		if(is_area_changed(areaid))
-			if(!flag)iflag=3;
-		if(is_map_changed(mapid))
-			if(!flag)iflag=4;
-		log_info("his_location cardid:%d:%d",m_cardid,iflag);
-		if(iflag)
-		{
-			update(p,timestamp,iflag);
-			//set_invalid();	
-            if(iflag>1){
-			    set(p,timestamp);
-			    insert();
-            }
-		}
-	}
-	void insert()
-	{
-		//std::string tabName=getTabName();
-		char nsql[512]={0};
-		const char * sql = "replace into his_location (obj_id,card_type_id,ident,begin_time,map_id,area_id,begin_pt,direction)"
-		                   "values(%d,%d,%d,'%s',%d,%d,'%.2f,%.2f',%f);";
-		snprintf(nsql,512,sql,m_objid,m_type,m_cardid,tool_time::to_str(m_timestamp/1000).c_str(),m_mapid,m_areaid,m_p.x,m_p.y,m_arg);
-		log_info("his_location[%d,%lu]:%s",m_cardid,m_timestamp,nsql);
-		sDBConnPool.PushAsync(nsql);
-	}
-	void update(const point &p,uint64_t timestamp,int flag=0,int dflag=0)
-	{
-		//std::string tabName=getTabName();
-		char nsql[512]={0};
-		const char * sql = "update his_location set last_time='%s',speed=%.3f,direction=%f,location_flag=%d where obj_id=%d and begin_time='%s' and last_time is null;";
-		double dist = m_p.dist(p);
-		double t	= (timestamp - m_timestamp)/1000;
-		double avge_speed= dist/t;
-		if(std::isnan(avge_speed)|| std::isinf(avge_speed))avge_speed=0;
+	void set_invalid();
+    //当前m_arg运动方向角度值 是否有效 0x12345678无效
+	bool is_valid();
+    //计算运动方向角度值
+	double make_arg(const point &pt,const point &p);
 
-		log_info("his_location_time[%d]:%d[%lu,%lu,%lu]",m_cardid,flag,last_timestamp,timestamp,m_timestamp);
-        if(last_timestamp != 0) 
-        {
-		    const char * ss = "update his_location set last_time='%s',speed=%.3f,direction=%f,location_flag=%d where obj_id=%d and begin_time='%s' and last_time = '%s';";
-		    snprintf(nsql,512,ss,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_arg,dflag,m_objid,tool_time::to_str(m_timestamp/1000).c_str(),tool_time::to_str(last_timestamp/1000).c_str());
-        }
-        else
-		    snprintf(nsql,512,sql,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_arg,dflag,m_objid,tool_time::to_str(m_timestamp/1000).c_str());
-        if(flag==1) last_timestamp=timestamp;
-        else last_timestamp=0;
+	void set(const point &pt,uint64_t time);
+    // 是否在路径上改变方向
+	bool line_changed(const point &pt);//,int &df)
+    // 判断速度变化
+	bool is_speed_changed(const point& pt,uint64_t time);
+    // 超时
+	bool time_out(const point &p,uint64_t time);
+    // 区域变化
+	bool is_area_changed(int new_areaid);
+    // 地图变化
+	bool is_map_changed(int new_mapid);
+    // 计算当前点是否需要记录到DB中
+	void push(uint64_t timestamp,const point & p,int32_t areaid,int32_t mapid,bool bclose = false);
 
-		log_info("his_location[%d]:%s[%lu,%lu]",m_cardid,nsql,timestamp,m_timestamp);
-		sDBConnPool.PushAsync(nsql);
-	}
-    std::vector<point> find_path(const point &p1,const point &p2)
-    {
-        std::vector<point> rc=card_path::inst().find_path(point(p1.x,-p1.y),point(p2.x,-p2.y));
-        return std::move(rc);
-    }
-	//virtual bool  handle_message(const point &p,uint64_t timestamp)=0;
-	bool  handle_message(const point &p,uint64_t timestamp)
-    {
-		bool flag = false;
-        //int df=0;
-		if(line_changed(p))//,df))
-        {
-            flag = true;
-            //std::vector<point> rc=find_path(m_d.back().p,p);
-            std::vector<point> rc=find_path(m_p,p);
-            if(rc.empty())
-            {
-			    log_info("his_location:line_changed rc.empty() %d",m_cardid);
-			    update(m_d.back().p,m_d.back().time);
-			    set(m_d.back().p,m_d.back().time);
-            }
-            else
-            {
-                if(handle_path(rc,timestamp,false))
-                  return true;
-            }
-            //置m_arg非法
-            set_invalid();
-        }
-        //if(df==1)flag=true;
-        return flag;
-    }
-    bool handle_path(std::vector<point> &rc,uint64_t timestamp,bool flag)
-    {
-        double dis=0;point _p=m_p;
-        std::for_each(rc.begin(),rc.end(),[&dis,&_p](point &pt){
-                    pt.y=-pt.y;dis+=_p.dist(pt);_p=pt;
-                    });
-		uint64_t t=timestamp/1000 - m_timestamp/1000;
-        if(t==0||dis<0.1)return true;
-		double avge_speed= dis/t;
-        //有拐点  盲区时间差 距离
-        uint64_t difftime=t;int dflag=0;
-        if(!m_d.empty()) difftime=timestamp/1000-(m_d.back().time)/1000;
-        if(difftime>=location_card::m_difftime && dis>location_card::m_distance)
-        {
-		    log_info("his_location[%d]:abnormal_line difftime:%lu,ltime:%u,dis:%.2f,limit_dis:%d",m_cardid,difftime,location_card::m_difftime,dis,location_card::m_distance);
-            dflag=1;
-        }
-        for(const point & pp:rc)
-        {
-            m_arg=make_arg(pp,m_p);
-            if(flag)insert();
+	void insert();
 
-		    log_info("his_location[%d]:line_changed_x point(%.2f,%.2f)--circle point(%.2f,%.2f),speed:%.2f",m_cardid,m_p.x,m_p.y,pp.x,pp.y,avge_speed);
-            double dist=m_p.dist(pp);uint64_t tt=dist/avge_speed*1000;
-            uint64_t etime=m_timestamp+tt;
-			update(pp,etime,0,dflag);set(pp,etime);
-            flag=true;
-        }
-        return false;
-    }
+	void update(const point &p,uint64_t timestamp,int flag=0,int dflag=0);
+    // 操作路径上点的集合
+    std::vector<point> find_path(const point &p1,const point &p2);
 
+	//virtual bool  handle_message(const point &p,uint64_t timestamp)=0;
+	bool  handle_message(const point &p,uint64_t timestamp);
+    // 处理获取到点的集合,在路径上
+    bool handle_path(std::vector<point> &rc,uint64_t timestamp,bool flag);
 };
 #endif

+ 1 - 0
module_service/area_business_person_attendance.cpp

@@ -13,6 +13,7 @@
 #include "websocket/wsTimerThread.h"
 #include"tool_time.h"
 #include "module_meta_date_changed.h"
+#include "his_location.h"
 //记录进入时间等信息,结束考勤,根据离开的时间和距离,判断是否记录一条新的考勤记录
 void area_business_person_attendance::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)

+ 1 - 1
module_service/module_meta_date_changed.cpp

@@ -33,7 +33,7 @@ void module_meta_date_changed::accept(sio::message::ptr const& data)
     tool_map::try_get_value(op_type, JSON_KEY_OP_TYPE, data);
 
     log_info("web发来数据:JSON_CMD_VALUE_META_DATA_CHANGED,%s---%s",szParam.c_str(),op_type.c_str());
-    if(!szParam.empty() && !op_type.empty())
+    if(szParam != "0" && op_type != "")
     {
         EDIT_TYPE_ID edit_type_id;
         if(!try_get_edit_type_id(op_type, edit_type_id))