Browse Source

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

researchman 5 years ago
parent
commit
32db1961b2
18 changed files with 114 additions and 84 deletions
  1. 6 0
      ant.cpp
  2. 1 0
      ant.h
  3. 10 2
      area.cpp
  4. 2 1
      area.h
  5. 2 2
      card.cpp
  6. 6 5
      card_base.cpp
  7. 2 1
      card_person.cpp
  8. 2 0
      db/db_api/CDBConnPool.cpp
  9. 24 13
      event.cpp
  10. 1 1
      main.cpp
  11. 6 5
      message.cpp
  12. 10 10
      module_service/module_meta_date_changed.cpp
  13. 1 1
      module_service/module_web.cpp
  14. 1 0
      monkey_car/monkeycar_person.cpp
  15. 36 41
      net-service.cpp
  16. 1 0
      net-service.h
  17. 1 1
      ya_setting.h
  18. 2 1
      znet.cpp

+ 6 - 0
ant.cpp

@@ -632,6 +632,12 @@ void site::create_area()
 {
     m_area=std::make_shared<area>(-m_id,0,0,m_scale,m_map_id,1<<7);
 }
+void site::clear_event()
+{
+    event_tool::instance()->handle_event(OT_DEVICE_READER,ET_READER_ERROR,id(),READER_TIMEOUT,0,false);
+    event_tool::instance()->handle_event(OT_DEVICE_READER,ET_READER_POWER_BY_BATTERY,id(),0,0,false);
+}
+
 /*
    处理分站供电状态,交流供电时,ac_down=false,直流供电时,ac_down=true
 

+ 1 - 0
ant.h

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

+ 10 - 2
area.cpp

@@ -403,6 +403,8 @@ std::shared_ptr<area>  area_list::create(int type,int id,int limit_count_person,
 		return std::make_shared<area>(id,limit_count_person,limit_time_person,scale,mapid,b_type);
 	}
 }
+#define PERSON_ATT_MASK 0X00000010
+#define CAR_ATT_MASK    0X00000020
 void area_list::init_from_db(int id/*=-1*/)
 {
 	do{
@@ -435,7 +437,8 @@ void area_list::init_from_db(int id/*=-1*/)
 			log_error("基础数据 增加或修改失败,数据库中找不到: area_id=%d:%s", id,sql.c_str());
 			break;
 		}
-
+        int downmine_index,patt_index,catt_index;
+        downmine_index=patt_index=catt_index=0;
 		std::unordered_map<int,std::shared_ptr<area>> map;
 		while ( DBRes.GetNextRecod(Error) )
 		{
@@ -491,7 +494,9 @@ void area_list::init_from_db(int id/*=-1*/)
 				ap->m_speed=std::move(map_);
 				ap->m_is_work_area = is_work_area;
                 ap->m_area_type=area_type_id;
-
+                if(area_type_id==AREA_TYPE_DOWNMINE)downmine_index++;
+                if(b_type&PERSON_ATT_MASK)patt_index++;
+                if(b_type&CAR_ATT_MASK)catt_index++;
 				ap->m_bound=init_path(path,area_id);
 				for(const auto &p : ap->m_bound)
 					log_info("point:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
@@ -535,6 +540,9 @@ void area_list::init_from_db(int id/*=-1*/)
 
 		if(-1 == id)
 		{
+            assert(downmine_index>0);
+            assert(patt_index==1);
+            assert(catt_index>0);
 			log_info( "init_area. The record count=%d\n", nCount );
 			area_list::instance()->add(map);
 		}

+ 2 - 1
area.h

@@ -48,7 +48,8 @@ struct area
     }
     bool is_mine()//是矿井区域
     {
-        return 0 == m_id;
+        return AREA_TYPE_DOWNMINE==m_area_type;
+        //return 0 == m_id;
     }
     //分站创建的区域 --- 分站创建的区域id = 0-分站id
     bool is_reader_area()

+ 2 - 2
card.cpp

@@ -321,7 +321,7 @@ void card_list::load_his_card_postion_staff()
             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;
-            log_info("person加载考勤,考勤开始时间:%s,卡id=%s areainfo=%s", start_time.c_str(), card_id.c_str(),strAreaInfo.c_str());
+            log_info("person加载考勤,考勤开始时间:%s,[%s]cur_time:%s 卡id=%s areainfo=%s",start_time.c_str(),tool_time::to_str(mine_tool_ptr->m_attendance_start_time).c_str(),cur_time.c_str(),card_id.c_str(),strAreaInfo.c_str());
 
             //分站设置
             auto area_tool=card_ptr->get_area_tool();
@@ -378,7 +378,7 @@ void card_list::on_message(zloop<task*> *loop, message_locinfo&loc,bool is_histo
 			loc.m_site_id,loc.m_ant_id,loc.m_card_type,loc.m_card_id,loc.m_card_ct,loc.m_tof,dist_tof,
 			(loc.m_card_type==1?loc.m_callinfo:loc.m_rav),
 			loc.m_acc,loc.m_rssi,loc.m_batty_status,loc.m_time_stamp);
-    if(loc.m_card_type != CT_PERSON && CYaSetting::m_sys_setting.test_rav(loc.m_card_type,loc.m_card_id))
+    if(loc.m_card_type != CT_PERSON && CYaSetting::m_sys_setting.check_rav(loc.m_card_type,loc.m_card_id))
         loc.set_rav(0);
     
 	c->on_message(loop,loc,is_history);

+ 6 - 5
card_base.cpp

@@ -118,12 +118,12 @@ void card_location_base::on_location(const std::vector<point>&vp,const std::vect
 
 		double acc = lm[0].m_acc;
         m_acc = lm[0].m_acc;
-		log_info("useful:type:%d,card_id:%d,site:%d,ct:%d,timestamp:%llu, loc_point,x:%f,y:%f acc:%.2f",m_type,m_id,sid,m_ct,m_time,x,y,acc);
+		log_info("useful:type=%d,card=%d,site=%d,ct=%d,timestamp=%llu, loc_point,x=%f,y=%f acc=%.2f",m_type,m_id,sid,m_ct,m_time,x,y,acc);
 		do_business(lm.front().m_sit, pt, acc);
 	}
 	else
 	{
-		log_warn("坐标不可用:site_id:%d,type:%d,card_id:%d,ct:%d,x:%f,y:%f",sid,m_type,m_id,m_ct,pt.x,pt.y);
+		log_warn("坐标不可用:site=%d,type=%d,card=%d,ct=%d,x=%f,y=%f",sid,m_type,m_id,m_ct,pt.x,pt.y);
 	}
 }
 
@@ -134,7 +134,7 @@ void card_location_base::on_message(zloop<task*> * loop,const message_locinfo&lo
 	auto site_ptr = sit_list::instance()->get(loc.m_site_id);
 	if(!site_ptr)
 	{
-		log_warn("接收到分站%d的数据,CARD=%d, CT=%d,但是分站未定义",loc.m_site_id,m_id,loc.m_card_ct);
+		log_warn("接收到分站的数据,site=%d,card=%d,ct=%d,但是分站未定义",loc.m_site_id,m_id,loc.m_card_ct);
 		return;
 	}
 
@@ -144,7 +144,7 @@ void card_location_base::on_message(zloop<task*> * loop,const message_locinfo&lo
 
 	if(site_ptr->is_up_site())
 	{
-        log_info("%d被井上分站[%d]收到",m_id,site_ptr->id());
+        log_info("card=%d被井上分站[site=%d]收到",m_id,site_ptr->id());
 		area_tool->on_point(shared_from_this(),point(1,1));
 		this->site_hover(loc.m_site_id);
 	}
@@ -152,7 +152,8 @@ void card_location_base::on_message(zloop<task*> * loop,const message_locinfo&lo
 	{
 		if(site_ptr->is_path_empty())
 		{
-			log_warn("接收到分站%d的数据,CT=%d,但是分站路径为空",site_ptr->id(),loc.m_card_ct);
+			log_warn("接收到分站的数据,site=%d,card=%d,ct=%d,但是分站路径为空",site_ptr->id(),m_id,loc.m_card_ct);
+			return;
 		}
 		m_message_handle->on_message(loop,loc,is_history);
 	}

+ 2 - 1
card_person.cpp

@@ -18,7 +18,7 @@
 #include "forbid_staff_down_mine.h"
 #include <config_file.h>
 #include "cardMgr.h"
-
+#include "card.h"
 extern config_file config;
 int person::m_limit_detained_time=-1;
 int person::m_auto_up_mine_time=-1;
@@ -231,6 +231,7 @@ point person::getSmoothPoint(uint64_t& t)
 			m_stat = 7;
 			pt = p->getPoint(t,m_speed);	
 			log_info("getpoint_oncar:%d,%lld,speed:%.2f",m_id,t,m_speed);
+            if(m_speed>1.85*3.6*2){log_error("monkey_speed_error...%d",m_id);m_speed=1.85*3.6;}
 		}
 	}
 	return pt;

+ 2 - 0
db/db_api/CDBConnPool.cpp

@@ -263,6 +263,8 @@ namespace YADB
 				sql_list.swap(g_sql_list);
 			}
 
+			logn_info(2,"sql_list size=%lld", sql_list.size());
+
 			for(auto pData:sql_list)
 			{
 				ExecAsyncSql(pData);

+ 24 - 13
event.cpp

@@ -265,7 +265,6 @@ void event_list::load_his_data_from_db(bool init /*=true*/)
             WHERE event_id IN (SELECT MAX(event_id) FROM his_event_data \
                                WHERE cur_time > (CASE obj_type_id \
                                                  WHEN 1 THEN DATE_SUB(NOW(),INTERVAL 2 DAY) \
-                                                 WHEN 2 THEN DATE_SUB(NOW(),INTERVAL 2 DAY)\
                                                  WHEN 4 THEN DATE_SUB(NOW(),INTERVAL 1 MONTH)\
                                                  WHEN 9 THEN DATE_SUB(NOW(),INTERVAL 2 DAY) \
                                                  WHEN 10 THEN DATE_SUB(NOW(),INTERVAL 2 DAY) \
@@ -273,7 +272,8 @@ void event_list::load_his_data_from_db(bool init /*=true*/)
                                AND cur_time < NOW()\
                                GROUP BY event_type_id, obj_id,dis_type) \
             AND  event_id NOT IN ( SELECT event_id FROM his_event_data WHERE  stat=100)\
-            AND event_type_id NOT IN (21,22,31,36);");
+            AND event_type_id NOT IN (21,22,31,36) and obj_type_id !=2;");
+
     if(!init)
         sql="SELECT event_id, id,stat,event_type_id,obj_type_id,obj_id,dis_type,map_id,area_id,limit_value,cur_value,x,y, cur_time FROM his_event_data WHERE cur_time > date_sub(NOW(),interval 20 second) and source=1 order by stat;";
     std::string Error;
@@ -329,7 +329,7 @@ void event_list::load_his_data_from_db(bool init /*=true*/)
 
             int stat  = 0;
             DBRes.GetField( "stat",stat, Error );
-
+            //增加虚拟告警处理逻辑
             std::shared_ptr<ya_event> ev=nullptr;
             bool flag=false;
             if(!init){
@@ -366,18 +366,29 @@ void event_list::load_his_data_from_db(bool init /*=true*/)
             if(ev->m_obj_type==OT_CARD){
                 uint64_t c_id= tool_other::card_id_to_u64(ev->m_obj_id);
                 if(auto c=card_list::instance()->get(c_id)){
-                    do{
-                        if(c->m_type==CT_PERSON){
-                            auto mine_tool_ptr = c->get_mine_tool();
-                            if(!mine_tool_ptr->m_is_attendance) break;
+                    if(c->m_type==CT_PERSON){
+                        auto mine_tool_ptr = c->get_mine_tool();
+                        if(!mine_tool_ptr->m_is_attendance) {
+                            log_warn("person_not_att:%s",obj_id.c_str());
+                            continue;
                         }
-                         c->set_event_flag(ev->m_ev_type);
-                    }while(0);
+                    }
+                    c->set_event_flag(ev->m_ev_type);
+                } else {
+                    log_warn("load_evnet_history:card_id:%s not exist...",obj_id.c_str());
+                    continue;
                 }
-            }
-            if(ev->m_ev_type==ET_READER_POWER_BY_BATTERY)
-                if(auto r=sit_list::instance()->get(std::stoi(obj_id)))
-                    r->m_power_ac_down=true;
+            }else if(ev->m_obj_type==OT_DEVICE_READER){ 
+                auto sit_ptr=sit_list::instance()->get(std::stoi(obj_id));
+                if(!sit_ptr){
+                    log_warn("load_evnet_history:site_id:%s not exist...",obj_id.c_str());
+                    continue;
+                }
+                if(ev->m_ev_type==ET_READER_POWER_BY_BATTERY)
+                    sit_ptr->m_power_ac_down=true;
+                if(ev->m_ev_type==ET_READER_ERROR)
+                    sit_ptr->m_time=tool_time::to_ms(ev->m_cur_time)/1000;
+            } 
             if(!flag) 
                 map.insert(std::make_pair(id, ev));
             log_info("event_list %lld,%lld,%d,%d,%d,%s,%d,%d,%d,%.2f,%.2f,%.2f,%.2f,%s"

+ 1 - 1
main.cpp

@@ -90,8 +90,8 @@ struct Init_Setting
         //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();
-        event_list::instance()->load_his_data_from_db();
         card_list::instance()->load_his_card_postion_from_db();
+        event_list::instance()->load_his_data_from_db();
         if(three_rates_flag){
             db_para dp;	
             dp.Host=DBSetting.Host;

+ 6 - 5
message.cpp

@@ -24,12 +24,10 @@ void message_locinfo::zero_this()
 
 task* message_locinfo::clone(message_locinfo* ml)
 {
-    log_info("clone: enter");
     task* t = task::alloc<message_locinfo>(); 
     message_locinfo& m = t->body<message_locinfo>(); 
     m.zero_this();
    
-    log_info("clone: begin copy");
     m.m_time_stamp = ml->m_time_stamp;
     m.m_site_time = ml->m_site_time;
     m.m_tof = ml->m_tof;
@@ -44,7 +42,6 @@ task* message_locinfo::clone(message_locinfo* ml)
     m.m_ant_id = ml->m_ant_id;
     m.m_sync_ct = ml->m_sync_ct;
     m.m_rssi = ml->m_rssi;
-    log_info("clone: end copy");
 	return std::move(t);
 }
 
@@ -55,8 +52,12 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	uint32_t i;
 	//卡类型、卡号、CT、电池状态
 	is>>b>>m_card_id>>m_card_ct>>m_batty_status;
+
+
+	m_card_id &= 0xFFFF; //卡号不会大于65535,分站上传数据的bug
+
 	m_card_type=b;
-	m_batty_status&=0x3;
+	m_batty_status&=0x03;
 
 	is>>b;
 	if(m_card_type==1)
@@ -95,7 +96,7 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	uint16_t sp1=0,sp2=0;
 	is>>sp1>>sp2;
 	m_rssi=10*log10(1.*sp1*(1<<17)/pow(sp2-64.,2))-121.74;
-	log_info("timestamp=%llu,type:%d,card_id:%d,site:%d,ct:%d,status:%d,acc=%d,tof=%llu,ant_id:%d,spq=%d",
+	log_info("timestamp=%llu,type=%d,card=%d,site=%d,ct=%d,status=%d,acc=%d,tof=%llu,ant_id=%d,spq=%d",
 			m_time_stamp,m_card_type,m_card_id,m_site_id,m_card_ct,m_batty_status,m_acc,m_tof,m_ant_id,m_rssi);
 }
 

+ 10 - 10
module_service/module_meta_date_changed.cpp

@@ -209,14 +209,11 @@ void module_meta_date_changed::deal_call_edit_card(std::string & id64, EDIT_TYPE
 void module_meta_date_changed::deal_call_edit_area(const std::string& id,EDIT_TYPE_ID edit_type_id)
 {
     int cid = std::stoi(id);
-    if(ET_INSERT == edit_type_id || ET_UPDATE == edit_type_id)
-    {
+    if(ET_INSERT == edit_type_id || ET_UPDATE == edit_type_id){
         area_list::instance()->init_from_db(cid);
-    }
-    else if(ET_DELETE == edit_type_id)
+    }else if(ET_DELETE == edit_type_id)
     {
-        if(auto area_ptr = area_list::instance()->get(cid))
-        {
+        if(auto area_ptr = area_list::instance()->get(cid)){
             log_info("区域删除:areaid=%d", cid);
             area_ptr->clear();
             area_list::instance()->remove(cid);
@@ -228,11 +225,14 @@ void module_meta_date_changed::deal_call_edit_reader(const std::string &ids, EDI
 {
     if(ET_INSERT == edit_type_id || ET_UPDATE == edit_type_id){
         sit_list::instance()->init_site(ids);
-    }
-    else if(ET_DELETE == edit_type_id){
+    }else if(ET_DELETE == edit_type_id){
         int id =std::stoi(ids);
-        sit_list::instance()->remove(id);
-        card_path::init();
+        if(auto sit_ptr=sit_list::instance()->get(id)){
+            log_info("分站删除:sid=%d", id);
+            sit_ptr->clear_event();
+            sit_list::instance()->remove(id);
+            card_path::init();
+        }
     }
 }
 

+ 1 - 1
module_service/module_web.cpp

@@ -124,7 +124,7 @@ void module_web::_get_all_events(std::vector<std::shared_ptr<ya_event>>& arr,boo
     auto it_map = _map.begin();
     for(;it_map!=_map.end();++it_map)
     {
-        if(f && it_map->second->m_is_sent)continue;
+        if(f && it_map->second->m_is_sent && !it_map->second->is_end())continue;
         else it_map->second->m_is_sent=true;
         arr.push_back(it_map->second);
     }

+ 1 - 0
monkey_car/monkeycar_person.cpp

@@ -132,6 +132,7 @@ point_2 monkey_person::get_position(double &speedx)
 	if (m_cur_distance < ZERO_)
 	{
 		m_cur_distance = 0;
+        speedx=0;
 	}
 	else if (m_cur_distance >=total_length)
 	{

+ 36 - 41
net-service.cpp

@@ -40,6 +40,37 @@ void net_service::on_connect(const std::shared_ptr<client>& clt)
 {
      
 }
+
+static bool check_message_time(const std::shared_ptr<client> &clt, const std::shared_ptr<site> &site_ptr, struct tm*p_site_tm, int site_ct, int power)
+{
+	bool result=true;
+
+	char timebuf[64]{0};
+	strftime(timebuf,64,"%F %T",p_site_tm);
+
+	logn_info(1,"分站数据信息:net=%s,site=%d,tm=%s,sct=%d,power=%s", clt->name().c_str(), site_ptr->m_id,timebuf,
+			site_ct, site_ptr->m_power_check_enable?((power&1)?"ac":"dc"):"??");
+
+	time_t site_time=mktime(p_site_tm);
+	double diff=difftime(site_time, site_ptr->last_site_time());
+	if(diff<-3) //允许2秒的时间抖动
+	{
+		logn_error(1,"分站时间回退,数据将被丢弃:net=%s,site=%d,diff=%d",clt->name().c_str(),site_ptr->m_id,(int)diff);
+		result=false;
+	}
+
+	diff=difftime(site_time, time(nullptr));
+	if(fabs(diff)>3) 
+	{
+		logn_error(1,"分站时间与服务器时间相差太大:%s,site=%d,diff=%d",clt->name().c_str(),site_ptr->m_id,(int)diff);
+		result=false;
+	}
+
+	site_ptr->set_site_time(site_time);
+
+	return result;
+}
+
 void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,size_t len)
 {
 	bool message_handled=true;
@@ -68,7 +99,7 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 					const auto &site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
 					if(!site_ptr)
 					{
-						logn_error(1,"在全局分站列表中找不到分站:%s,%d", clt->name().c_str(), site_id);
+						logn_error(1,"未定义分站:net=%s,site=%d", clt->name().c_str(), site_id);
 						break;
 					}
 
@@ -78,21 +109,7 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                         break;
                     }
 
-					{
-						char timebuf[64]{0};
-						strftime(timebuf,64,"%F %T",&site_tm);
-						logn_info(1,"分站数据信息:net=%s,sid=%d,tm=%s,sct=%d,power=%s", clt->name().c_str(), site_id,timebuf,
-										site_ct, site_ptr->m_power_check_enable?((power&1)?"ac":"dc"):"??");
-
-						time_t site_time=mktime(&site_tm);
-						double diff=difftime(site_time, site_ptr->last_site_time());
-						if(diff<-3) //允许2秒的时间抖动
-						{
-							logn_error(1,"分站时间回退,数据将被丢弃:%s,diff=%d",clt->name().c_str(),(int)diff);
-						}
-
-						site_ptr->set_site_time(site_time);
-					}
+					check_message_time(clt,site_ptr,&site_tm,site_ct,power);
 
                     if(clt->type()!=2){
 					    site_ptr->set_client(clt);
@@ -146,31 +163,9 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                         break;
                     }
 
-					{
-						char timebuf[64]{0};
-						struct tm site_tm={0};
-						localtime_r(&site_time, &site_tm);
-
-						strftime(timebuf,64,"%F %T",&site_tm);
-						const char*power_flag="??";
-						if(site_ptr->m_power_check_enable)
-						{
-							if(power==1)
-								power_flag="dc";
-							if(power==2)
-								power_flag="ac";
-						}
-
-						logn_info(1,"分站数据信息:net=%s,sid=%d,tm=%s,sct=%d,power=%s", clt->name().c_str(), site_id,timebuf, site_ct, power_flag);
-
-						double diff=difftime(site_time, site_ptr->last_site_time());
-						if(diff<-3) //允许2秒的时间抖动
-						{
-							logn_error(1,"分站时间回退,数据将被丢弃:%s,diff=%d",clt->name().c_str(),(int)diff);
-						}
-
-						site_ptr->set_site_time(site_time);
-					}
+					struct tm site_tm={0};
+					localtime_r(&site_time, &site_tm);
+					check_message_time(clt,site_ptr,&site_tm,site_ct,power);
 
                     if(clt->type()!=2){
 					    site_ptr->set_client(clt);

+ 1 - 0
net-service.h

@@ -14,6 +14,7 @@ struct net_service:service_callback
 
 	net_service();
 	~net_service();
+
 	void on_message(const std::shared_ptr<client> &clt,const char*data,size_t len);
 	void on_timer();
     void on_connect(const std::shared_ptr<client> &clt);

+ 1 - 1
ya_setting.h

@@ -28,7 +28,7 @@ struct  SSys_setting // system_limit_setting
     {
         init();
     }
-    bool test_rav(uint8_t type,uint32_t id)
+    bool check_rav(uint8_t type,uint32_t id)
     {
         bool f = false;
         std::string cardid=tool_other::type_id_to_str(type,id);

+ 2 - 1
znet.cpp

@@ -440,13 +440,14 @@ struct sock_client:fd_io,client_ex
 				if(m_clen<msg_len)
 					break;
 
-				logn_bin(1,name().c_str(),m_b,msg_len);//输出二进制日志
 				if(check_crc(m_b,msg_len))
 				{
 					on_message(m_b,msg_len);
+					logn_bin(1,name().c_str(),m_b,msg_len);//输出二进制日志
 				}
 				else
 				{
+					logn_bin(1,name().c_str(),m_b,msg_len);//输出二进制日志
 					logn_error(1,"check_crc_error,close socket. site=%s.",m_name.c_str());
 					return -1;
 				}