Browse Source

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

chensongchao 6 years ago
parent
commit
021ebe3924

+ 22 - 15
area.cpp

@@ -74,7 +74,7 @@ area::area(int id,int limit_count_person, int limit_time_person,double scale,int
      ,m_person_count(0)
      ,m_vehicle_count(0)
     {
-		m_area_business_list=area_business::get_instance_list(m_area_type);
+		m_area_business_list=area_business::get_instance_list(m_area_type,id);
 		m_event_person_count = false;
 		m_event_vehicle_count = false;
     }
@@ -232,11 +232,11 @@ void area_list::init_monkeycar_area(int id)
         {
             std::shared_ptr<db_area>  da = std::make_shared<db_area>();
             da->m_default_speed = monkeycar_speed;
-            da->m_point = init_path(monkeycar_coor);
+            da->m_point = init_path(monkeycar_coor,area_id);
             std::shared_ptr<area> ap = std::make_shared<monkey_area>(da,area_id,over_count_person, over_time_person,scale,map_id,b_type);
             ap->update(over_count_person, over_time_person,scale,map_id,area_type_id, over_count_vehicle,over_time_vehicle);
 
-            ap->m_bound=init_path(path);
+            ap->m_bound=init_path(path,area_id);
             for(const auto &p : ap->m_bound)
               log_info("point:monkey:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
             for(const auto &p : da->m_point)
@@ -249,14 +249,14 @@ void area_list::init_monkeycar_area(int id)
 			//这里后续需要把猴车得信息传递过去
             std::shared_ptr<db_area>  da = std::make_shared<db_area>();
             da->m_default_speed = monkeycar_speed;
-            da->m_point = init_path(monkeycar_coor);
+            da->m_point = init_path(monkeycar_coor,area_id);
 			std::shared_ptr<area> ap = std::make_shared<monkey_area>(da,area_id,over_count_person, over_time_person,scale,map_id,b_type);
 			if(auto area_=area_list::instance()->get(id))
 				area_=ap;
 			else
 				area_list::instance()->add(area_id,ap);
 
-            ap->m_bound=init_path(path);
+            ap->m_bound=init_path(path,area_id);
             ap->update(over_count_person, over_time_person,scale,map_id,area_type_id, over_count_vehicle,over_time_vehicle);
             for(const auto &p : ap->m_bound)
               log_info("point:monkey:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
@@ -349,7 +349,7 @@ void area_list::init_from_db(int id/*=-1*/)
         int over_time_vehicle = 0;
         DBRes.GetField( "over_time_vehicle",over_time_vehicle, Error );
 
-        double over_speed_vehicle=0;
+        std::string over_speed_vehicle;
         DBRes.GetField( "over_speed_vehicle",over_speed_vehicle, Error );
 
         std::string path;
@@ -364,17 +364,20 @@ void area_list::init_from_db(int id/*=-1*/)
         int is_work_area = 0;
         DBRes.GetField( "is_work_area",is_work_area, Error );
 
-        log_info("init_area : id:%d,path:%s",area_id, path.c_str());
-
+        log_info("init_area : id:%d,path:%s..speed:%s",area_id, path.c_str(),over_speed_vehicle.c_str());
+        std::map<int,double> map_;
+        auto vp=init_path(over_speed_vehicle,area_id);
+        for(const auto &v:vp)
+            map_.insert({v.x,v.y});
         if(-1 == id)
         {
             std::shared_ptr<area> ap = create(area_type_id,area_id,over_count_person,over_time_person, scale,map_id,b_type);
             ap->m_limit_vehicle_second = over_time_vehicle;
             ap->m_limit_vehicle_count = over_count_vehicle;
-            ap->m_over_speed_vehicle = over_speed_vehicle;
+            ap->m_speed=std::move(map_);
             ap->m_is_work_area = is_work_area;
 
-            ap->m_bound=init_path(path);
+            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);
             map.insert({area_id,ap});
@@ -388,8 +391,8 @@ void area_list::init_from_db(int id/*=-1*/)
                 area_list::instance()->add(id, tmp_ptr);
             }
             tmp_ptr->update(over_count_person, over_time_person,scale,map_id,area_type_id, over_count_vehicle,over_time_vehicle);
-            tmp_ptr->m_bound=init_path(path);
-            tmp_ptr->m_over_speed_vehicle = over_speed_vehicle;
+            tmp_ptr->m_speed=std::move(map_);
+            tmp_ptr->m_bound=init_path(path,area_id);
             tmp_ptr->m_is_work_area = is_work_area;
             for(const auto &p : tmp_ptr->m_bound)
                 log_info("point:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
@@ -409,10 +412,12 @@ void area_list::init_from_db(int id/*=-1*/)
     init_monkeycar_area(id);
 }
 
-std::vector<point> area_list::init_path(std::string &str)
+std::vector<point> area_list::init_path(std::string &str,int area_id)
 {
 	if(str.empty())
-	  log_error("area path empty()...");
+	{
+	  log_error("area path is empty,area_id=%d.",area_id);
+	}
 	std::vector<point> vp;
 	std::vector<std::string> vs;
 	std::vector<std::string> vs1;
@@ -423,7 +428,9 @@ std::vector<point> area_list::init_path(std::string &str)
 		  continue;
 		boost::split(vs1,s,boost::is_any_of(","));
 		if(vs1.size()!=2)
-		  log_error("area path data Error.pls check data table.");
+		{
+		  log_error("area path data Error.pls check data table,area_id=%d",area_id);
+		}
 		vp.emplace_back(atof(vs1[0].c_str()),atof(vs1[1].c_str()));
 	}
 	return std::move(vp);

+ 3 - 3
area.h

@@ -49,7 +49,7 @@ struct area
     }
     virtual ~area()
     {}
-
+    double get_speed(int vehicle_category_id) {return m_speed[vehicle_category_id];}
     void  update(int limit_count_person, int limit_time_person,double scale,int32_t mapid,
                      int32_t type,int limit_count_vehicle, int limit_time_vehicle)
     {
@@ -102,7 +102,7 @@ public:
 
 
     //区域速度门限
-    double m_over_speed_vehicle;
+    std::map<int,double> m_speed;
 
     //是否是工作区域(0:不是、1:是)
     int m_is_work_area=0;
@@ -114,7 +114,7 @@ struct area_list:single_base<area_list,int,std::shared_ptr<area>>
 
 	//根据分站、所在点找出所在区域列表
 	std::vector<std::shared_ptr<area>> get_area(const std::shared_ptr<site>& s,const std::shared_ptr<card_location_base> &c,const point&pt,int &);
-    std::vector<point> init_path(std::string  &str);
+    std::vector<point> init_path(std::string  &str,int area_id);
     ///id=-1为初始化所有
     void init_from_db(int id=-1);
     void init_monkeycar_area(int id=-1);

+ 17 - 10
area_business.cpp

@@ -1,5 +1,6 @@
 
 #include <assert.h>
+#include "log.h"
 #include "area_business.h"
 #include "area_business_car_attendance.h"
 #include "area_business_card_enter_or_leave.h"
@@ -29,7 +30,7 @@ struct area_business_factory
 		m_check_list[type].reset(ab);
 	}
 
-	std::vector<area_business*> get_check_list(int business_type)
+	std::vector<area_business*> get_check_list(int business_type,int area_id)
 	{
 		std::vector<area_business*> check_list;
 		for(int i=0;i<32;i++)
@@ -38,13 +39,19 @@ struct area_business_factory
 				break;
 
 			if((business_type&1)==0)
-            {
-                business_type >>= 1;
+			{
+				business_type >>= 1;
 				continue;
-            }
+			}
 
 			business_type >>= 1;
 
+			if(!m_check_list[i])
+			{
+				log_error("区域业务项目不存在:%d,area_id=%d",i,area_id);
+				continue;
+			}
+
 			check_list.push_back(m_check_list[i].get());
 		}
 
@@ -56,7 +63,7 @@ struct area_business_factory
 		static area_business_factory _instance;
 		return _instance;
 	}
-private:
+	private:
 	std::vector<std::unique_ptr<area_business>> m_check_list;
 	area_business_factory()
 	{
@@ -70,15 +77,15 @@ private:
 		//regist(8,new area_business_monkey_area);
 		regist(9,new area_business_card_enter_or_leave);
 
-        regist(10, new area_business_motionless_persion);
-        regist(11, new area_business_geofault);
-        regist(12, new area_business_work_rate);
+		regist(10, new area_business_motionless_persion);
+		regist(11, new area_business_geofault);
+		regist(12, new area_business_work_rate);
 	}
 
 };
 
-std::vector<area_business*> area_business::get_instance_list(int business_type)
+std::vector<area_business*> area_business::get_instance_list(int business_type,int area_id)
 {
-	return area_business_factory::instance().get_check_list(business_type);
+	return area_business_factory::instance().get_check_list(business_type,area_id);
 }
 

+ 1 - 1
area_business.h

@@ -22,7 +22,7 @@ struct area_business
 
 	virtual ~area_business(){};
 
-	static std::vector<area_business*> get_instance_list(int business_type);
+	static std::vector<area_business*> get_instance_list(int business_type,int area_id);
 };
 #endif
 

+ 4 - 8
card_base.h

@@ -4,6 +4,7 @@
 #include <vector>
 #include <memory>
 #include "point.h"
+#include "common.h"
 
 #define CARD_LOST_TIME_OUT (30*1000)
 
@@ -26,14 +27,6 @@ struct area_tool;
 
 namespace YA{struct _CARD_POS_;}
 
-//m_is_attendance 井上井下状态  0初始状态 1 井上 2 井下 
-enum EAttendanceState
-{
-	 Init 	  = 0,	//0初始状态
-	 MineUp   = 1,	//井上
-	 MineDown = 2	//井下
-};
-
 struct card:point
 {
 	card(uint32_t id,uint16_t dis,uint64_t type,int32_t deptid,int32_t level_id,uint32_t cid)
@@ -71,6 +64,7 @@ struct card:point
 struct card_location_base:card,std::enable_shared_from_this<card_location_base>
 {
 	uint64_t m_timeval=0;
+    std::uint8_t m_event[CARD_EVENT_COUNT_MAX]{0};
     std::unique_ptr<select_tool> m_sel_tool;
     std::unique_ptr<smooth_tool> m_smo_tool;
 	std::unique_ptr<card_message_handle> m_message_handle;
@@ -100,6 +94,8 @@ 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 &);
+    void set_event_flag(EVENT_TYPE et,std::uint8_t f=1){m_event[et]=f;}
+    bool get_event_flag(EVENT_TYPE et){return m_event[et];}
 
     bool is_person() const;
     bool is_vehicle() const;

+ 9 - 1
card_person.cpp

@@ -34,8 +34,16 @@ void person::clear()
 {
 	m_area_tool.reset(new area_tool);
 	m_mine_tool.reset(new mine_tool);
-
 	card_location_base::clear();
+    uint64_t id = tool_other::type_id_to_u64(m_type,m_id);
+    for(std::uint8_t i=0;i<CARD_EVENT_COUNT_MAX;i++)
+    {
+        if(m_event[i]!=0)
+        {
+            event_tool::instance()->handle_event(OT_CARD,static_cast<EVENT_TYPE>(i),id,0,0,true);
+            m_event[i]=0;
+        }
+    }
 }
 
 void person::set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)

+ 50 - 0
common.h

@@ -74,4 +74,54 @@ enum AREA_TYPE
 	AREA_TYPE_SPECIAL = 1001	// 特殊区域,只给你前端用来标识是否显示图标,胶轮车硐室
 };
 
+enum EVENT_STATUS
+{
+    ///事件开始
+    ES_START = 0,
+    ///呼救已处理状态
+    ES_DEAL_HELP = 1,
+    ///事件结束
+    ES_END = 100
+};
+
+
+enum OBJECT_TYPE
+{
+    ///矿井
+    OT_MINE = 1,
+    ///区域
+    OT_AREA = 2,
+    ///分站
+    OT_DEVICE_READER = 4,
+    ///标识卡,包括人员、车辆、自组网等
+    OT_CARD = 9,
+};
+
+enum EVENT_TYPE{ // 事件类型
+    ET_OVER_COUNT_PERSON = 1,       // 井下人员超员
+    ET_OVER_COUNT_VEHICLE = 2,      // 井下车辆超员
+    ET_AREA_OVER_COUNT_PERSON = 3,	// 区域人员超员
+    ET_AREA_OVER_COUNT_VEHICLE = 4,	// 区域车辆超员
+    ET_READER_ERROR = 6,
+    ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
+    ET_CARD_OVER_TIME_PERSON = 13, // 人员井下超时
+    ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时
+    ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
+    ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
+
+    ET_CARD_AREA_FORBIDDEN_PERSON = 19,  // 人员进入禁止区域
+    ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
+    ET_CARD_OVER_SPEED = 21, // 车辆超速
+    ET_CARD_AREA_OVER_SPEED = 22, // 车辆区域超速
+    ET_CARD_HELP = 24, // 人员呼救
+
+    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
+};
+
+
 #endif

+ 1 - 1
db/db_tool.cpp

@@ -61,7 +61,7 @@ namespace db_tool
 
         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(),
-                card_ptr->m_id, start_str.c_str(), end_str.c_str(),
+                card_ptr->m_cid, start_str.c_str(), end_str.c_str(),
                 landmarkid, landmarkdirect, landmarkdist);
 
         log_info("attendance():%s",sql);

+ 1 - 50
event.h

@@ -9,56 +9,7 @@
 #include<rapidjson/prettywriter.h>
 
 #include<write-copy.h>
-
-enum EVENT_STATUS
-{
-    ///事件开始
-    ES_START = 0,
-    ///呼救已处理状态
-    ES_DEAL_HELP = 1,
-    ///事件结束
-    ES_END = 100
-};
-
-
-enum OBJECT_TYPE
-{
-    ///矿井
-    OT_MINE = 1,
-    ///区域
-    OT_AREA = 2,
-    ///分站
-    OT_DEVICE_READER = 4,
-    ///标识卡,包括人员、车辆、自组网等
-    OT_CARD = 9,
-};
-
-enum EVENT_TYPE{ // 事件类型
-    ET_OVER_COUNT_PERSON = 1,       // 井下人员超员
-    ET_OVER_COUNT_VEHICLE = 2,      // 井下车辆超员
-    ET_AREA_OVER_COUNT_PERSON = 3,	// 区域人员超员
-    ET_AREA_OVER_COUNT_VEHICLE = 4,	// 区域车辆超员
-    ET_READER_ERROR = 6,
-    ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
-    ET_CARD_OVER_TIME_PERSON = 13, // 人员井下超时
-    ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时
-    ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
-    ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
-
-    ET_CARD_AREA_FORBIDDEN_PERSON = 19,  // 人员进入禁止区域
-    ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
-    ET_CARD_OVER_SPEED = 21, // 车辆超速
-    ET_CARD_AREA_OVER_SPEED = 22, // 车辆区域超速
-    ET_CARD_HELP = 24, // 人员呼救
-
-    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
-};
-
+#include "common.h"
 struct ya_event
 {
 private:

+ 1 - 1
mine_business.cpp

@@ -394,7 +394,7 @@ void card_sensor_mgr::for_each()
         int nCount = DBRes.GetRecordCount( Error );
         if (nCount < 1)
         {
-            log_error("load_sensor_data..failed[%s]", strsql);
+            log_warn("load_sensor_data..failed[%s]", strsql);
             continue;
         }
 

+ 14 - 9
module_service/area_business_card_enter_or_leave.cpp

@@ -18,11 +18,12 @@ void area_business_card_enter_or_leave::on_enter(const std::shared_ptr<area_hove
                                                  const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
     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);
+    std::string start_time = tool_time::to_str(a->m_enter_time/1000);
     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);
+    snprintf(sql,LENGTH_SQL,"INSERT INTO his_location_area (obj_id,card_type_id,ident,area_id,map_id,enter_time,start_point) \
+	                         VALUES ('%d','%lu','%d',%d,%d,'%s','%.2f,%.2f');",
+				c->m_cid,c->m_type,c->m_id, a->id(),a->mapid(),start_time.c_str(),p.x,p.y);
+
     db_tool::PushAsync(sql);
 }
 
@@ -36,12 +37,16 @@ void area_business_card_enter_or_leave::on_leave(const std::shared_ptr<area_hove
                                                  const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
     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);
+    std::string start_time = tool_time::to_str(a->m_enter_time/1000);
+    std::string end_time = tool_time::to_str(a->m_last_time/1000);
+//    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());
+    snprintf(sql,LENGTH_SQL,"UPDATE his_location_area SET leave_time='%s',end_point='%.2f,%.2f' \
+	                         WHERE  enter_time='%s' AND obj_id=%d AND area_id=%d;",
+                end_time.c_str(),ep.x,ep.y,
+				start_time.c_str(),c->m_cid,a->id());
+
     log_info("card_enter_leave:%s",sql);
     db_tool::PushAsync(sql);
 }
+

+ 10 - 14
module_service/area_business_forbid.cpp

@@ -6,20 +6,21 @@
 #include"area.h"
 #include "card.h"
 #include "module_call.h"
-
+//删除区域,区域上的告警事件如何清除
 //记录进入时间等信息,生成告警
+
+void area_business_forbid::on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
+{
+    EVENT_TYPE ev_type = c->is_vehicle()?ET_CARD_AREA_FORBIDDEN_VEHICLE:ET_CARD_AREA_FORBIDDEN_PERSON;
+    c->set_event_flag(ev_type);
+}
 void area_business_forbid::on_enter(const std::shared_ptr<area_hover>&a,
                                     const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
 {
-    EVENT_TYPE ev_type = ET_CARD_AREA_FORBIDDEN_PERSON;
-    if(card_ptr->is_vehicle())
-    {
-        ev_type = ET_CARD_AREA_FORBIDDEN_VEHICLE;
-    }
-
+    EVENT_TYPE ev_type = card_ptr->is_vehicle()?ET_CARD_AREA_FORBIDDEN_VEHICLE:ET_CARD_AREA_FORBIDDEN_PERSON;
     uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
     event_tool::instance()->handle_event(OT_CARD, ev_type, id, 0, 0, true);
-
+    
     //呼叫
     module_call::instance()->system_call_apoint(card_ptr->m_id,card_ptr->m_type);
 }
@@ -33,12 +34,7 @@ void area_business_forbid::on_hover(const std::shared_ptr<area_hover>&a,const st
 void area_business_forbid::on_leave(const std::shared_ptr<area_hover>&a,
                                     const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data> ptr)
 {
-    EVENT_TYPE ev_type = ET_CARD_AREA_FORBIDDEN_PERSON;
-    if(card_ptr->is_vehicle())
-    {
-        ev_type = ET_CARD_AREA_FORBIDDEN_VEHICLE;
-    }
-
+    EVENT_TYPE ev_type = card_ptr->is_vehicle()?ET_CARD_AREA_FORBIDDEN_VEHICLE:ET_CARD_AREA_FORBIDDEN_PERSON;
     uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
     event_tool::instance()->handle_event(OT_CARD, ev_type, id, 0, 0, false);
 

+ 1 - 1
module_service/area_business_forbid.h

@@ -10,7 +10,7 @@ public:
     {
         return 7;
     }
-
+    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);
     //记录进入时间等信息,生成告警
     void on_enter(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);

+ 0 - 1
module_service/area_business_motionless_persion.cpp

@@ -53,7 +53,6 @@ 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());

+ 7 - 4
module_service/area_business_person_attendance.cpp

@@ -4,6 +4,7 @@
 #include"db/db_api/CDBSingletonDefine.h"
 #include"log.h"
 #include"card.h"
+#include "card_person.h"
 #include"area.h"
 #include"common_tool.h"
 #include"mine.h"
@@ -38,8 +39,7 @@ void area_business_person_attendance::on_hover(const std::shared_ptr<area_hover>
 
 }
 //记录离开考勤区域信息,开始考勤
-void area_business_person_attendance::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)
+void area_business_person_attendance::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(!card_ptr->is_person())
         return;
@@ -53,6 +53,10 @@ void area_business_person_attendance::on_leave(const std::shared_ptr<area_hover>
     //作为一条结束考勤记录保存到数据库
     db_tool::save_attendance(card_ptr, area_hover_ptr);
 
+    auto per = std::dynamic_pointer_cast<person>(card_ptr);
+    per->clear();
+
+
 	YA::_CARD_POS_ cp;
 	cp.Type=card_ptr->m_type;
 	cp.ID = card_ptr->m_id;
@@ -69,10 +73,9 @@ void area_business_person_attendance::on_leave(const std::shared_ptr<area_hover>
         doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_UP_MINE, allocator);
         //doc.AddMember(JSON_ROOT_KEY_VERSION,INTERFACE_VERSION, allocator);
         doc.AddMember(JSON_ROOT_KEY_DATA, datas, allocator);
-
         swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
     }
-
+    
 }
 
 /**

+ 9 - 31
module_service/area_business_person_dwell_checker.cpp

@@ -6,38 +6,21 @@
 #include "common_tool.h"
 #include "log.h"
 #include "area_business_person_dwell_checker.h"
-/*
-	判断当前区域a中的人卡停留时间
-	人员进入区域时间存储在area_hover对象中,在当前类on_enter/on_leave中进行更新
-	人员&车辆的代码重用,请自行设计
-*/
 
-struct SPersonDwellChecker : business_data
-{
-    bool m_send_event;  // 是否发生告警 ture=已发生告警 false=没有
-    SPersonDwellChecker()
-    {
-        m_send_event = false;
-    }
-};
-//服务器重启加载数据
 void area_business_person_dwell_checker::on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
     if(!c->is_person())
       return;
-    std::shared_ptr<SPersonDwellChecker> p = std::make_shared<SPersonDwellChecker>();
-    ptr = p;
     EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
     auto ev_ptr_temp = event_list::instance()->get_event_card(c->m_id,c->m_type,evType);
     if (ev_ptr_temp && !ev_ptr_temp->is_end())
-        p->m_send_event = true;
+        c->set_event_flag(evType);
 }
 
 //进入区域,记录进入时间
 void area_business_person_dwell_checker::on_enter(const std::shared_ptr<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
-    ptr = std::make_shared<SPersonDwellChecker>();
     log_info("area_business_person_dwell_checker::on_enter : In Area=%d Card = %d  ",a->m_area->id(),c->m_id);
 }
 
@@ -45,19 +28,17 @@ void area_business_person_dwell_checker::on_enter(const std::shared_ptr<area_hov
 void area_business_person_dwell_checker::on_hover(const std::shared_ptr<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-    if(!c->is_person())
+    if(!c->is_person()||a->m_enter_time==0)
       return;
-    auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
-    if(nullptr == ptr_temp || a->m_enter_time == 0)
-        return ;
 
 	double limit_val = a->m_area->m_limit_person_second;
 	double cur_val = ( tool_time::now_to_seconds() - a->m_enter_time / 1000);
-	if (!ptr_temp->m_send_event && limit_val < cur_val)
+	EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+	if (!c->get_event_flag(evType) && limit_val < cur_val)
     {
-	    EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+        c->set_event_flag(evType);
         uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id);
-        event_tool::instance()->handle_event(OT_CARD,evType,id,limit_val,cur_val,ptr_temp->m_send_event = true);
+        event_tool::instance()->handle_event(OT_CARD,evType,id,limit_val,cur_val,true);
     }
 
 }
@@ -69,13 +50,10 @@ void area_business_person_dwell_checker::on_leave(const std::shared_ptr<area_hov
 {
     if(!c->is_person())
       return;
-    auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
-    if(nullptr == ptr_temp)
-        return ;
-    if(ptr_temp->m_send_event)
+    EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON:EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+    if(c->get_event_flag(evType))
     {
-        ptr_temp->m_send_event = false;
-        EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON:EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+        c->set_event_flag(evType,0);
         uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id);
         event_tool::instance()->handle_event(OT_CARD, evType, id, 0, 0, false);
     }

+ 1 - 0
module_service/area_business_person_dwell_checker.h

@@ -22,6 +22,7 @@ struct area_business_person_dwell_checker:area_business
 	void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
 	//如果有超时告警,取消超时告警
 	void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
+
 };
 
 

+ 38 - 121
module_service/area_business_speed_checker.cpp

@@ -8,8 +8,6 @@
 #include"area.h"
 #include "card.h"
 
-std::unordered_map<int,double> area_business_speed_checker::_vehicle_category_map;
-
 struct over_speed_data:business_data
 {
     over_speed_data()
@@ -25,64 +23,40 @@ struct over_speed_data:business_data
     double m_limit_speed;
     bool m_is_warning;
 };
-area_business_speed_checker::area_business_speed_checker()
-{
-}
 
 void area_business_speed_checker::on_load_his(const std::shared_ptr<area_hover>&area_hover_ptr,
                                             const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
-{
-    on_enter(area_hover_ptr, card_ptr, ptr);
-}
-
-void area_business_speed_checker::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_vehicle())
-    {
         return;
-    }
+    on_enter(area_hover_ptr, card_ptr, ptr);
 
-    auto ptr_temp = std::make_shared<over_speed_data>();
-    ptr = ptr_temp;
+    EVENT_TYPE ev_type =area_hover_ptr->m_area->is_mine()?ET_CARD_OVER_SPEED: ET_CARD_AREA_OVER_SPEED;
+    auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ev_type);
+    auto ptr_temp = std::dynamic_pointer_cast<over_speed_data>(ptr);
+    ptr_temp->m_is_warning = (ev_ptr_temp && !ev_ptr_temp->is_end());
+    if(ptr_temp->m_is_warning)
+        card_ptr->set_event_flag(ev_type);
 
-    double limit = area_hover_ptr->m_area->m_over_speed_vehicle;
-    if(area_hover_ptr->m_area->is_mine())
-    {
-        limit = _get_mine_limit_speed(card_ptr->get_vehicle_category_id());
-    }
+}
 
-    if(limit < 0.01)
-    {
+void area_business_speed_checker::on_enter(const std::shared_ptr<area_hover>&a,
+                                           const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&p)
+{
+    if(!c->is_vehicle())
         return;
-    }
-
-    ptr_temp ->m_limit_speed = limit;
-    if(limit < card_ptr->m_speed)
-    {
-        ptr_temp->m_over_speed_count++;
-    }
-    else
-    {
-        ptr_temp->m_normal_speed_count++;
-    }
-
-    EVENT_TYPE ev_type = ET_CARD_AREA_OVER_SPEED;
-    if(area_hover_ptr->m_area->is_mine())
-    {
-        ev_type = ET_CARD_OVER_SPEED;
-    }
-    auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ev_type);
-    ptr_temp->m_is_warning = (nullptr != ev_ptr_temp && !ev_ptr_temp->is_end());
+    auto ptr_temp = std::make_shared<over_speed_data>();
+    p = ptr_temp;
+    double limit = a->m_area->get_speed(c->get_vehicle_category_id());
+    ptr_temp->m_limit_speed = limit;
+    log_info("[speed_checker:on_enter]%d,%f",c->m_id,limit);
 }
 
 void area_business_speed_checker::on_hover(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_vehicle())
-    {
         return;
-    }
     if(nullptr == ptr)
     {
         log_error("area_business_speed_checker::on_hover:nullptr == ptr");
@@ -90,65 +64,43 @@ void area_business_speed_checker::on_hover(const std::shared_ptr<area_hover>&are
     }
 
     auto ptr_temp = static_cast<over_speed_data*>(ptr.get());
-    double limit = ptr_temp ->m_limit_speed;
-    if(limit < 0.01)
-    {
-        return;
-    }
+    double limit = ptr_temp->m_limit_speed;
 
     if(limit < card_ptr->m_speed)//超速
     {
-        ptr_temp->m_over_speed_count++;
         ptr_temp->m_normal_speed_count=0;
-    }
-    else//速度正常
-    {
-        ptr_temp->m_normal_speed_count++;
-        ptr_temp->m_over_speed_count=0;
-    }
-
-    EVENT_TYPE ev_type = ET_CARD_AREA_OVER_SPEED;
-    if(area_hover_ptr->m_area->is_mine())
-    {
-        ev_type = ET_CARD_OVER_SPEED;
-    }
-
-    //确定告警
-    if(SPEED_COUNT_LIMIT <= ptr_temp->m_over_speed_count)
-    {
-        ptr_temp->m_over_speed_count=SPEED_COUNT_LIMIT;
-
-        if(!ptr_temp->m_is_warning)
+        if(!ptr_temp->m_is_warning && ++ptr_temp->m_over_speed_count>=SPEED_COUNT_LIMIT)
         {
+            EVENT_TYPE ev_type =area_hover_ptr->m_area->is_mine()?ET_CARD_OVER_SPEED: ET_CARD_AREA_OVER_SPEED;
             ptr_temp->m_is_warning = true;
-
+            card_ptr->set_event_flag(ev_type);
             uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
             event_tool::instance()->handle_event(OT_CARD, ev_type, id, limit, card_ptr->m_speed, true);
+            log_info("[speed_checker:on_hover_true]%d",card_ptr->m_id);
         }
-    }
 
-    //确定正常
-    if(SPEED_COUNT_LIMIT <= ptr_temp->m_normal_speed_count)
+    }
+    else//速度正常
     {
-        ptr_temp->m_normal_speed_count=SPEED_COUNT_LIMIT;
-
-        if(ptr_temp->m_is_warning)
+        ptr_temp->m_over_speed_count=0;
+        if(ptr_temp->m_is_warning && ++ptr_temp->m_normal_speed_count>=SPEED_COUNT_LIMIT)
         {
-            ptr_temp->m_is_warning=false;
-
+            EVENT_TYPE ev_type =area_hover_ptr->m_area->is_mine()?ET_CARD_OVER_SPEED: ET_CARD_AREA_OVER_SPEED;
+            ptr_temp->m_is_warning = false;
+            card_ptr->set_event_flag(ev_type,0);
             uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
             event_tool::instance()->handle_event(OT_CARD, ev_type, id, limit, card_ptr->m_speed, false);
+            log_info("[speed_checker:on_hover_false]%d",card_ptr->m_id);
         }
     }
+
 }
 
 void area_business_speed_checker::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(!card_ptr->is_vehicle())
-    {
         return;
-    }
     if(nullptr == ptr)
     {
         log_error("area_business_speed_checker::on_leave:nullptr == ptr");
@@ -156,49 +108,14 @@ void area_business_speed_checker::on_leave(const std::shared_ptr<area_hover>&are
     }
 
     auto ptr_temp = static_cast<over_speed_data*>(ptr.get());
-    double limit = ptr_temp ->m_limit_speed;
-
-    EVENT_TYPE ev_type = ET_CARD_AREA_OVER_SPEED;
-    if(area_hover_ptr->m_area->is_mine())
+    if(ptr_temp->m_is_warning)
     {
-        ev_type = ET_CARD_OVER_SPEED;
+        EVENT_TYPE ev_type =area_hover_ptr->m_area->is_mine()?ET_CARD_OVER_SPEED: ET_CARD_AREA_OVER_SPEED;
+        card_ptr->set_event_flag(ev_type,0);
+        double limit = ptr_temp ->m_limit_speed;
+        uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
+        event_tool::instance()->handle_event(OT_CARD, ev_type, id, limit, card_ptr->m_speed, ptr_temp->m_is_warning=false);
+        log_info("[speed_checker:on_leave_false]%d",card_ptr->m_id);
     }
-
-    uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
-    event_tool::instance()->handle_event(OT_CARD, ev_type, id, limit, card_ptr->m_speed, false);
 }
 
-void area_business_speed_checker::init_vehicle_category_from_db()
-{
-    const char *sql = "SELECT vehicle_category_id, over_speed FROM dat_vehicle_category;";
-    std::string Error;
-    YADB::CDBResultSet DBRes;
-    sDBConnPool.Query(sql,DBRes,Error);
-    if(!Error.empty())
-        log_error("init_vehicle_category Error,%s",Error.c_str());
-    int64_t nCount = DBRes.GetRecordCount( Error );
-    if (nCount < 1)
-    {
-        log_error("错误,init_vehicle_category. The record count=%ld\n", nCount );
-        return;
-    }
-
-    log_info( "init_vehicle_category. The record count=%ld\n", nCount );
-
-    _vehicle_category_map.clear();
-    while ( DBRes.GetNextRecod(Error) )
-    {
-        int vehicle_category_id  = 0;
-        DBRes.GetField( "vehicle_category_id",vehicle_category_id, Error );
-
-        double over_speed = 0;
-        DBRes.GetField( "over_speed",over_speed, Error );
-
-        _vehicle_category_map.insert({vehicle_category_id,over_speed});
-    }
-
-    for(const auto &p : _vehicle_category_map)
-        std_debug("dat_vehicle_category:category_id:%d--over_speed:%.2f",p.first,p.second);
-}
-
-

+ 0 - 20
module_service/area_business_speed_checker.h

@@ -7,35 +7,15 @@
 class area_business_speed_checker : public area_business
 {
 public:
-    area_business_speed_checker();
-
     virtual int area_business_type()
     {
         return 4;
     }
 
     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);
-
     void on_enter(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);
-
-    static void init_vehicle_category_from_db();
-
-private:
-    static double _get_mine_limit_speed(int category_id)
-    {
-        auto serch = _vehicle_category_map.find(category_id);
-        if(serch == _vehicle_category_map.end())
-        {
-            return 0;
-        }
-
-        return serch->second;
-    }
-
-private:
-    static std::unordered_map<int,double> _vehicle_category_map;
 };
 
 #endif // AREA_BUSINESS_SPEED_CHECKER_H

+ 0 - 1
module_service/module_mgr.cpp

@@ -31,7 +31,6 @@ void module_mgr::init(config_file& config, std::map<std::string, YA::MSG_HANDLE_
 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();
 
     module_web::instance()->start();