Browse Source

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

chensongchao 6 years ago
parent
commit
67e3bd4f46

File diff suppressed because it is too large
+ 0 - 1469
Makefile


+ 6 - 3
Makefile.am

@@ -5,9 +5,12 @@ SRC_MONKEYCAR= monkey_car/monkeycar_area.cpp monkey_car/monkeycar_bus.cpp monkey
 
 SRC_MODULE_SERVICE= module_service/area_business_car_attendance.cpp module_service/area_business_card_enter_or_leave.cpp \
 					module_service/area_business_count_checker.cpp module_service/area_business_forbid.cpp \
-					module_service/area_business_person_dwell_checker.cpp module_service/area_business_post_area.cpp \
-					module_service/module_call.cpp module_service/module_meta_date_changed.cpp module_service/module_web.cpp \
-					module_service/area_business_speed_checker.cpp
+					module_service/area_business_geofault.cpp module_service/area_business_motionless_persion.cpp \
+					module_service/area_business_person_attendance.cpp module_service/area_business_person_dwell_checker.cpp \
+					module_service/area_business_post_area.cpp module_service/area_business_speed_checker.cpp \
+					module_service/module_meta_date_changed.cpp module_service/module_web.cpp \
+					module_service/module_call.cpp module_service/module_call_help.cpp module_service/module_mgr.cpp module_service/module_other_alarm.cpp
+
 
 SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp mine_business.cpp card_area.cpp card_base.cpp card_car.cpp \
     	  card.cpp card_message_handle.cpp cardMgr.cpp card_path.cpp card_person.cpp crc.cpp geo_hash.cpp \

File diff suppressed because it is too large
+ 0 - 1469
Makefile.in


+ 5 - 32
ant.cpp

@@ -28,36 +28,9 @@ const algo_config&site::config()const
 
 bool visit_site_status::visit(std::shared_ptr<site> s)
 {
-	time_t now = time(0);
-	int diff = now - s->m_time;
-	if(diff > READER_TIMEOUT)	
-	{
-        auto ev_ptr = event_list::instance()->get_event_reader(s->m_id,ET_READER_ERROR);
-		if(!ev_ptr)
-		{
-			auto ev_ptr = event_list::create_event_reader(s->m_id,ET_READER_ERROR);
-            event_list::copy_event(s, ev_ptr);
-            ev_ptr->m_limit_value = READER_TIMEOUT;
-            ev_ptr->m_cur_value = diff;
-            //保存到数据库
-            event_list::save_event(ev_ptr);
-			event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr);
-			log_info("reader_error_create: %d,diff:%d",s->m_id,diff);
-		}
-	}
-	else
-	{
-        auto ev_ptr = event_list::instance()->get_event_reader(s->m_id,ET_READER_ERROR);
-        if(ev_ptr && !ev_ptr->is_end())
-		{
-			event_list::copy_event(s, ev_ptr);
-			ev_ptr->m_cur_value = diff;
-			ev_ptr->m_status = ES_END;
-            //保存到数据库
-            event_list::save_event(ev_ptr);
-			log_info("reader_error_delete: %d,diff:%d",s->m_id,diff);
-		}
-	}
+	time_t now=time(0);
+	int diff = now-s->m_time;
+	event_tool::instance()->handle_event(OT_DEVICE_READER,ET_READER_ERROR,s->m_id,READER_TIMEOUT,diff,[diff](){return diff>READER_TIMEOUT;});
 	return true;
 }
 
@@ -374,8 +347,8 @@ void site::on_power_status(bool ac_down)//电源状态
 	
 	if(ac_down == m_power_ac_down)
 		return;
-	
-	if(m_power_ac_down=ac_down)
+	m_power_ac_down=ac_down;
+	if(m_power_ac_down)
 	{
 		//掉电告警
 	

+ 2 - 1
ant.h

@@ -154,7 +154,8 @@ struct site:point,std::enable_shared_from_this<site>
 	}
     void set_client(std::shared_ptr<client>& clt)
     {
-        m_clt = clt;
+		if(m_clt != clt)
+			m_clt = clt;
 		m_time=time(0);
     }
 

+ 6 - 6
area.cpp

@@ -70,7 +70,8 @@ void area::on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<ca
 {
  	for(const auto &i:m_area_business_list)
 	{
-		i->on_hover(a,c,a->get_business_data(i->area_business_type()));
+		auto x=a->get_business_data(i->area_business_type());
+		i->on_hover(a,c,x);
 	}
 }
 
@@ -79,7 +80,8 @@ void area::on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<ca
 	log_info("on_enter..%d  areaId:%d",c->m_id,m_id);
  	for(const auto &i:m_area_business_list)
 	{
-		i->on_enter(a,c,a->get_business_data(i->area_business_type()));
+		auto x=a->get_business_data(i->area_business_type());
+		i->on_enter(a,c,x);
 	}
 }
 
@@ -88,7 +90,8 @@ void area::on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<ca
 	log_info("on_leave..%d  areaId:%d",c->m_id,m_id);
  	for(const auto &i:m_area_business_list)
 	{
-		i->on_leave(a,c,a->get_business_data(i->area_business_type()));
+		auto x=a->get_business_data(i->area_business_type());
+		i->on_leave(a,c,x);
 	}
 }
 
@@ -340,8 +343,6 @@ void area_list::init_from_db(int id/*=-1*/)
             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});
-
-//            CheckAreaType(ap,area_type_id,0);
         }
         else
         {
@@ -356,7 +357,6 @@ void area_list::init_from_db(int id/*=-1*/)
             tmp_ptr->m_over_speed_vehicle = over_speed_vehicle;
             for(const auto &p : tmp_ptr->m_bound)
                 log_info("point:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
-//               CheckAreaType(tmp_ptr,area_type_id,tmp_ptr->m_area_type);
 
             log_info("基础数据 增加或修改区域成功:区域id:%d,over_count_person:%d over_time_person:%d,scale:%.2f,map_id:%d\
                      ,area_type_id:%d,over_count_vehicle:%d,over_time_vehicle:%d",

+ 2 - 6
area.h

@@ -39,11 +39,7 @@ struct area
     {
         return m_scale;
     }
-    bool special()const
-    {
-        return m_area_type == AREA_TYPE_NO_COVER;
-    }
-    bool is_mine()//是矿井区域
+        bool is_mine()//是矿井区域
     {
         return 0 == m_id;
     }
@@ -144,7 +140,7 @@ struct area_hover
         landmark_dis=0;
     }
 
-	std::shared_ptr<business_data> &get_business_data(int type)
+	std::shared_ptr<business_data>&get_business_data(int type)
 	{
 		if(type>=(int)m_data.size())
 		{

+ 0 - 15
area_business.cpp

@@ -128,9 +128,6 @@ struct area_business_restricted:area_business
     }
 };
 #endif
-//#include "card_base.h"
-//#include "area.h"
-//#include "card.h"
 
 #include "area_business_car_attendance.h"
 #include "area_business_card_enter_or_leave.h"
@@ -141,18 +138,6 @@ struct area_business_restricted:area_business
 #include "area_business_post_area.h"
 #include "area_business_speed_checker.h"
 
-/*
-	猴车区域
-*/
-struct area_business_monkey_area:area_business
-{
-	virtual int area_business_type()
-	{
-		return 8;
-	}
-};
-
-
 struct area_business_factory
 {
 	void regist(int type,area_business* ab)

+ 2 - 2
area_business.h

@@ -13,13 +13,13 @@ struct area_hover;
 struct card_location_base;
 struct area_business
 {
-	virtual int area_business_type();
+	virtual int area_business_type()=0;
 
 	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_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
 
-	virtual ~area_business(){}
+	virtual ~area_business(){};
 
 	static std::vector<area_business*> get_instance_list(int business_type);
 };

+ 4 - 4
card.cpp

@@ -125,17 +125,17 @@ void card_list::load_his_card_postion_from_db()
             //还在考勤中表示,还在井下(初始化话数据)
             if(card_ptr->is_person())
             {
-                CMineCardManager::instance()->OnPersonDown(card_ptr,true);
+                //CMineCardManager::instance()->OnPersonDown(card_ptr,true);
             }
             if(card_ptr->is_vehicle())
             {
-                CMineCardManager::instance()->OnVehicleDown(card_ptr,true);
+                //CMineCardManager::instance()->OnVehicleDown(card_ptr,true);
             }
         }
     }
     //初始化后检查是否超员
-    CMineCardManager::instance()->OnPersonOvercrowdingWarning();
-    CMineCardManager::instance()->OnVehicleOvercrowdingWarning();
+    //CMineCardManager::instance()->OnPersonOvercrowdingWarning();
+    //CMineCardManager::instance()->OnVehicleOvercrowdingWarning();
 
     auto area_map = area_list::instance()->m_map;
     for(auto&iter: area_map)

+ 2 - 2
card_base.h

@@ -54,7 +54,7 @@ struct card:point
 	uint64_t time_(){return m_time;}
 	uint32_t m_id;				//卡号
 	uint32_t m_cid;				//标识id 人staff_id 车 vehicle_id
-	uint64_t  m_type;			//类型
+	uint64_t m_type;			//类型
 	uint16_t m_display;			//1显示0不显示,往前端推送
 	double   m_speed;			//速度
 	int      m_is_attendance;	//井上井下状态  0初始状态 1 井上 2 井下
@@ -63,7 +63,7 @@ struct card:point
     uint64_t m_time;			//时间戳 ms
 	int32_t  m_deptid;			//部门编号
 	int32_t  m_level_id;		//部门级别
-	int m_biz_stat;
+	int		 m_biz_stat;
     ///人卡(加速度状态),其值就是0和1,掘进机和采煤机,其值就是0~255,车辆,其值就需要乘以0.01,用于表示加速度值
     double m_acc =0;
 };

+ 2 - 2
card_person.cpp

@@ -115,8 +115,8 @@ void person::handle_three_rates(const point & pt)
 	cp.biz_stat = m_biz_stat;
 	cp.x=pt.x;cp.y=pt.y;cp.z=pt.z;	
 	const auto lm = m_area_tool->getLandmark();
-//	cp.enter_time = std::get<0>(lm)*1000;
-//	cp.area_id = std::get<3>(lm);
+	cp.enter_time = std::get<0>(lm)*1000;
+	cp.area_id = std::get<3>(lm);
 	put_three_rates(cp);
 }
 

+ 1 - 1
db/db_tool.cpp

@@ -40,7 +40,7 @@ namespace db_tool
 
         auto start = mine_tool_ptr->m_attendance_start_time;
         auto end = mine_tool_ptr->m_attendance_start_time;
-        if(!mine_tool_ptr->is_attendance())//考勤结束时间
+        if(!mine_tool_ptr->m_is_attendance)//考勤结束时间
         {
             end = std::chrono::system_clock::now();
         }

+ 0 - 2
event.cpp

@@ -385,7 +385,5 @@ void event_list::_ev_to_node(std::shared_ptr<ya_event> ev_ptr,
 
     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>();

+ 7 - 7
event.h

@@ -138,13 +138,13 @@ public:
 class Event;
 struct event_tool
 {
-    template <class UnaryPredicate>
-    void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,UnaryPredicate p)
-    {
-        handle_event(ot,et,id,limit_value,cur_value,p());
-    }
-    void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f);
-    static event_tool * instance();
+	template <class UnaryPredicate>
+	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,UnaryPredicate p)
+	{
+		handle_event(ot,et,id,limit_value,cur_value,p());
+	}
+	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f);
+	static event_tool * instance();
 private:
     event_tool()
     {

+ 1 - 2
message.cpp

@@ -58,8 +58,7 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	if(m_card_type == 1 || m_card_type==4 || m_card_type==5)
 		m_acc=b;
 	else
-		m_acc =b*0.01;
-		//m_acc=((b&0x80)?-1.:1.)*(b&0x7f)*98;
+		m_acc=((b&0x80)?-1.:1.)*(b&0x7f)*0.01;
 
 	//TOF
 	is>>b>>i; 	

+ 2 - 1
mine_business.cpp

@@ -13,7 +13,8 @@
 #include "ant.h"
 #include "ya_setting.h"
 #include "card_path.h"
-#include "card.h"
+#include "card_base.h"
+
 struct card_sensor
 {
 	card_sensor(int32_t wid,const point &p,const std::string &cid)

+ 3 - 1
mine_module/MineCardManager.cpp

@@ -15,6 +15,9 @@ std::shared_ptr<mine_card_info> CMineCardManager::GetMineCards()
     return m_minecards;
 }
 
+ /**
+ * @brief 获取事件ID
+ **/
 bool CMineCardManager::Exist(SET_CARDID &list,uint64_t id)
 {
     return !(list.end() == list.find(id));
@@ -78,7 +81,6 @@ void CMineCardManager::OnPersonUp(std::shared_ptr<card> card)
     if (max_person != 0 && (int)m_minecards->m_down_person.size() < max_person )
     {
         event_tool::instance()->handle_event(OT_MINE,EVENT_TYPE::ET_OVER_COUNT_PERSON,0,max_person,(int)m_minecards->m_down_person.size(),false);
-        //this->CancelEvent(EVENT_TYPE::ET_OVER_COUNT_PERSON,(int)m_minecards->m_down_person.size());
     }
     
 }

+ 1 - 3
mine_module/MineCardManager.h

@@ -7,15 +7,13 @@
 
 #include "minestruct.h"
 #include "card.h"
-#include "module_service/module_singleton_base.h"
 
 //井下警告类型数量
 #define MAX_MINE_EVENT_NUM 3
 
-class CMineCardManager : public singleton_base<CMineCardManager>
+class CMineCardManager 
 {
 private:
-    friend class singleton_base<CMineCardManager>;
     CMineCardManager();
 
 private:

+ 4 - 3
module_service/area_business_car_attendance.cpp

@@ -91,12 +91,11 @@ void area_business_car_attendance::on_leave(const std::shared_ptr<area_hover>&a,
     //        db_tool::save_attendance(card_ptr, ptr_temp->m_is_attendance, ptr_temp->m_attendance_start_time);
     //    }
 }
+#if 0
 
 //void area_business_car_attendance::init_attendance_area_from_db()
 //{
-//    const char *sql = "select a.area_id, a.att_rule_id,  vt.vehicle_type_id \
-//            from dat_att_rule_area a, dat_att_rule_vehicle_type  vt, dat_att_rule r\
-//            where a.att_rule_id=vt.att_rule_id and a.att_rule_id=r.att_rule_id;";
+//    const char *sql = "select a.area_id, a.att_rule_id,  vt.vehicle_type_id \ from dat_att_rule_area a, dat_att_rule_vehicle_type  vt, dat_att_rule r\ where a.att_rule_id=vt.att_rule_id and a.att_rule_id=r.att_rule_id;";
 //    std::string Error;
 //    YADB::CDBResultSet DBRes;
 //    sDBConnPool.Query(sql,DBRes,Error);
@@ -126,6 +125,8 @@ void area_business_car_attendance::on_leave(const std::shared_ptr<area_hover>&a,
 //    }
 //}
 
+#endif
+
 ///area_hover_ptr==nullptr 表示接收到 web的删除卡命令
 void area_business_car_attendance::save_attendance(const std::shared_ptr<card_location_base>& card_ptr,
                                                   const std::shared_ptr<area_hover> area_hover_ptr)

+ 3 - 0
module_service/area_business_geofault.cpp

@@ -23,6 +23,9 @@ struct geofault_data:business_data
     int m_far_geofault_count;
 };
 
+std::unordered_map<int, std::vector<point>> area_business_geofault::_area_geofault_map;
+int area_business_geofault::_geofault_count_limit;
+
 void area_business_geofault::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)
 {

+ 2 - 0
module_service/area_business_motionless_persion.cpp

@@ -24,6 +24,8 @@ struct motionless_data:business_data
 //    time_t m_acc_start_time;
 };
 
+int area_business_motionless_persion::_acc_0count_limit;
+
 void area_business_motionless_persion::on_enter(const std::shared_ptr<area_hover>&a,
                                  const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
 {

+ 4 - 8
module_service/area_business_person_attendance.cpp

@@ -10,6 +10,7 @@
 #include"websocket/constdef.h"
 #include "websocket/wsClientMgr.h"
 #include"tool_time.h"
+#include "module_meta_date_changed.h"
 
 struct person_attendance_data:business_data
 {
@@ -193,14 +194,9 @@ void area_business_person_attendance::handle_up_mine(sio::message::ptr const& da
             //检查井下是否超员--是否需要取消
             //CMineCardManager::instance()->OnPersonUp(card_ptr);
 
-            auto area_hover_ptr = card_ptr->get_area_hover();
-            if(area_hover_ptr && 0!=area_hover_ptr->id() && 0!=area_hover_ptr->mapid())
-            {
-                module_area::on_leave(card_ptr->m_id, area_hover_ptr, card_ptr->m_type);
-            }
-
-            _to_json_card_up_one(card_ptr, datas, allocator);
-            module_meta_date_changed::clear_card(card_ptr);
+            auto rea_tool = card_ptr->get_area_tool();
+			rea_tool->on_leave(card_ptr);
+			card_ptr->clear();
         }
         else
         {

+ 4 - 0
module_service/area_business_speed_checker.cpp

@@ -8,6 +8,8 @@
 #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()
@@ -170,5 +172,7 @@ void area_business_speed_checker::init_vehicle_category_from_db()
         std_debug("dat_vehicle_category:category_id:%d--over_speed:%.2f",p.first,p.second);
 }
 
+std::unordered_map<int,double> area_business_speed_checker::_vehicle_category_map;
+
 
 

+ 70 - 0
module_service/area_business_work_rate.cpp

@@ -0,0 +1,70 @@
+#include"area_business_work_rate.h"
+
+#include<memory>
+#include<string>
+
+#include"log.h"
+#include"card.h"
+#include"struct_def.h"
+#include"three_rates.h"
+#include"area.h"
+#include"card.h"
+#include"tool_time.h"
+
+struct work_rate_data:business_data
+{
+    work_rate_data()
+    {
+    }
+};
+
+void area_business_work_rate::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
+                                       const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>& ptr)
+{
+    if(!card_ptr->is_person())
+    {
+        return;
+    }
+
+    auto card = std::make_shared<card_pos>();
+    card->id = card_ptr->m_id;
+    card->type = card_ptr->m_type;
+    //card->work_line =
+    //card->identifier_id
+
+    auto area = std::make_shared<area_data>();
+    area->area_id = area_hover_ptr->id();
+    //area->is_work_area = area_hover_ptr->m_area->
+    area->enter_time = tool_time::now_to_seconds();
+
+    three_rates::get_instance()->enter_area(card, area);
+}
+
+void area_business_work_rate::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)
+{
+}
+
+
+void area_business_work_rate::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;
+    }
+
+    auto card = std::make_shared<card_pos>();
+    card->id = card_ptr->m_id;
+    card->type = card_ptr->m_type;
+    //card->work_line =
+    //card->identifier_id
+
+    auto area = std::make_shared<area_data>();
+    area->area_id = area_hover_ptr->id();
+    //area->is_work_area = area_hover_ptr->m_area->
+    area->leave_time = tool_time::now_to_seconds();
+
+    three_rates::get_instance()->leave_area(card, area);
+}
+

+ 22 - 0
module_service/area_business_work_rate.h

@@ -0,0 +1,22 @@
+#ifndef AREA_BUSINESS_WORK_RATE
+#define AREA_BUSINESS_WORK_RATE
+
+#include<area_business.h>
+
+/**
+ * @brief 工时利用率
+ */
+class area_business_work_rate:public area_business
+{
+public:
+    int area_business_type()
+    {
+        return 13;
+    }
+
+    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);
+};
+
+#endif // AREA_BUSINESS_WORK_RATE

+ 338 - 0
ya_event.h

@@ -0,0 +1,338 @@
+#ifndef YA_EVENT_H
+#define YA_EVENT_H
+
+/**
+ * @brief 告警事件类型
+ * @author 戴月腾
+ * @date 2018-09-24
+ */
+
+#include<map>
+#include<chrono>
+#include<memory>
+#include"write-copy.h"
+#include"log.h"
+#include "db_api/CDBSingletonDefine.h"
+#include "card.h"
+#include"common_tool.h"
+#include "tool_time.h"
+#include "db_tool.h"
+#include <area.h>
+#include "ant.h"
+
+/**
+ * @brief 事件状态
+ */
+enum EVENT_STATUS
+{
+    ///事件开始
+    ES_START = 0,
+    ///呼救已处理状态
+    ES_DEAL_HELP = 1,
+    ///事件结束
+    ES_END = 100
+};
+
+enum EVENT_TYPE{ // 事件类型
+    ET_UNKNOWN = 0,
+	ET_OVER_COUNT_PERSON = 1, // 井下人员超员pit_module/CPicardmanager
+	ET_OVER_COUNT_VEHICLE = 2,    // 井下车辆超员pit_module/CPicardmanager
+
+    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, // 人员井下超时pit_module/CPicardmanager
+	ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时pit_module/CPicardmanager
+
+    ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
+    ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
+    ET_CARD_AREA_LIMIT_PERSON = 17, // 人员进入限制区域
+    ET_CARD_AREA_LIMIT_VEHICLE = 18, // 车辆进入限制区域
+    ET_CARD_AREA_FORBIDDEN_PERSON = 19,  // 人员进入禁止区域
+    ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
+    ET_CARD_OVER_SPEED = 21, // 车辆超速
+    ET_CARD_HELP = 24, // 人员呼救
+
+    CARD_EVENT_COUNT_MAX,
+};
+
+/**
+ * @brief 对象类型
+ */
+enum OBJECT_TYPE
+{
+    ///矿井
+    OT_MINE = 1,
+    ///区域
+    OT_AREA = 2,
+    ///分站
+    OT_DEVICE_READER = 4,
+    ///标识卡,包括人员、车辆、自组网等
+    OT_CARD = 9,
+};
+
+/**
+ * @brief 告警事件
+ */
+struct ya_event
+{
+private:
+    uint64_t m_ev_id;
+public:
+    ya_event(uint64_t e_id):m_cur_time(std::chrono::system_clock::now())
+    {
+        m_ev_id = e_id;
+
+        m_obj_id = "";
+        m_map_id = 0;
+        m_area_id = 0;
+        x = 0;
+        y = 0;
+        m_limit_value = 0;
+        m_cur_value = 0;
+        m_desc = "";
+        m_landmarkid = 0;
+        m_landmarkdirect = 0;
+        m_landmarkdist = 0;
+
+        m_status=ES_START;
+        m_is_display=true;
+    }
+    ~ya_event(){}
+public:
+    ///告警状态,开始、结束
+    EVENT_STATUS m_status;
+
+    ///告警类型
+    EVENT_TYPE m_ev_type;
+    ///告警对象类型
+    OBJECT_TYPE m_obj_type;
+    /// 告警对象编号,与告警对象类型对应,如告警对象类型为分站,此字段为分站编号
+    std::string m_obj_id;
+    ///当前时间,为告警事件的触发时间,如果状态为开始,则表示开始时间,否则为结束时间
+    std::chrono::system_clock::time_point m_cur_time;
+
+    ///告警所在地图
+    int m_map_id;
+    ///告警所在区域
+    int m_area_id;
+    ///位置
+    double x;
+    ///位置
+    double y;
+    ///告警阈值
+    double m_limit_value;
+    ///当前值
+    double m_cur_value;
+    ///描述
+    std::string m_desc;
+
+    /// 地标信息
+    int m_landmarkid;
+    /// 与地标的距离
+    double m_landmarkdist;
+    /// 所处地标的方向
+    int m_landmarkdirect;
+
+    bool m_is_display;
+
+    bool is_end()
+    {
+        return ES_END == m_status;
+    }
+
+    ///作为事件map列表的id,方便查找;(obj_type<<32| obj_id)
+    uint64_t get_list_id();
+
+    uint64_t get_id(){return m_ev_id;}
+};
+typedef std::shared_ptr<ya_event> event_ptr;
+typedef std::map<uint64_t, std::shared_ptr<ya_event>> event_map;
+typedef std::shared_ptr<event_map> event_map_ptr;
+
+
+struct event_list:single_base<event_list,uint64_t,std::shared_ptr<ya_event>>
+{
+public:
+    ///作为事件map列表的id,方便查找;(ev_type<<48 | obj_type<<40 |  obj_id_type<<32 | obj_id)
+    static uint64_t to_list_id(EVENT_TYPE ev_type, OBJECT_TYPE obj_type, int obj_id_type, uint32_t obj_id)
+    {
+        return (static_cast<uint64_t>(ev_type)<<48)|(static_cast<uint64_t>(obj_type)<<40)
+                |(static_cast<uint64_t>(obj_id_type)<<32)|static_cast<uint64_t>(obj_id);
+    }
+    ///创建井下警告
+    static event_ptr create_event_mine(int objid, EVENT_TYPE ev_type)
+    {
+        return create_event(OT_MINE, objid, 0, ev_type);
+    } 
+    ///创建区域警告
+    static event_ptr create_event_area(int area_id, EVENT_TYPE ev_type)
+    {
+        return create_event(OT_AREA, area_id, 0, ev_type);
+    }
+
+    static event_ptr create_event_reader(int reader_id, EVENT_TYPE ev_type)
+    {
+        return create_event(OT_DEVICE_READER, reader_id, 0, ev_type);
+    }
+    ///创建与卡有关的警告,需要卡类型
+    static event_ptr create_event_card(uint32_t card_id, int32_t card_type, EVENT_TYPE ev_type)
+    {
+        return create_event(OT_CARD, static_cast<int32_t>(card_id), card_type, ev_type);
+    }
+
+    static void copy_event(const std::shared_ptr<card_location_base> card_ptr, event_ptr ev_ptr)
+    {
+        ev_ptr->x = card_ptr->x;
+        ev_ptr->y = card_ptr->y;
+        ev_ptr->m_cur_time = std::chrono::system_clock::now();
+        ev_ptr->m_is_display = card_ptr->m_display;
+
+        auto hover = card_ptr->get_area_hover();
+        if(nullptr!=hover)
+        {
+            ev_ptr->m_area_id =  hover->m_area->id();
+            ev_ptr->m_map_id = hover->m_area->mapid();
+
+            ev_ptr->m_landmarkid = hover->landmark_dir;
+            ev_ptr->m_landmarkdist = hover->landmark_dis;
+            ev_ptr->m_landmarkdirect = hover->landmark_dir;
+        }
+    }
+
+    static void copy_event(const std::shared_ptr<area> area_ptr, event_ptr ev_ptr)
+    {
+        ev_ptr->m_cur_time = std::chrono::system_clock::now();
+        ev_ptr->m_is_display = true;
+
+        ev_ptr->m_area_id =  area_ptr->id();
+        ev_ptr->m_map_id = area_ptr->mapid();
+    }
+    static void copy_event(const std::shared_ptr<site> site_ptr, event_ptr ev_ptr)
+    {
+        ev_ptr->m_cur_time = std::chrono::system_clock::now();
+        ev_ptr->m_is_display = true;
+
+        ev_ptr->m_area_id =  site_ptr->m_area_id;
+        ev_ptr->m_map_id = site_ptr->m_map_id;
+        ev_ptr->x = site_ptr->x;
+        ev_ptr->y = site_ptr->y;
+    }
+
+
+    std::shared_ptr<ya_event> get_event_card(uint32_t card_id, int card_type, EVENT_TYPE ev_type)
+    {
+        return base::get(to_list_id(ev_type, OT_CARD, card_type, card_id));
+    }
+
+    std::shared_ptr<ya_event> get_event_area(int32_t area_id, EVENT_TYPE ev_type)
+    {
+        return base::get(to_list_id(ev_type, OT_AREA, 0, static_cast<uint32_t>(area_id)));
+    }
+
+    std::shared_ptr<ya_event> get_event_reader(int32_t reader_id, EVENT_TYPE ev_type)
+    {
+        return base::get(to_list_id(ev_type,OT_DEVICE_READER, 0, static_cast<uint32_t>(reader_id)));
+    }
+    void load_his_data_from_db();
+
+    static void save_event(const event_ptr ev_ptr)
+    {
+        char sql[LENGTH_SQL] = {'\0'};
+
+        std::string _time = tool_time::to_str_ex(ev_ptr->m_cur_time);
+
+        sprintf(sql,
+                "INSERT IGNORE INTO his_event_data(event_id, stat, event_type_id, obj_type_id, obj_id, \
+                map_id, area_id, limit_value, cur_value, x, y, cur_time, description, \
+                landmark_id, landmark_dist,direction_mapper_id )\
+                VALUES(%ld, %d, %d, %d, %s, %d, %d, %.2f, %.2f, %f, %f, '%s', '%s', %d, %10.3f, %d);",
+        ev_ptr->get_id(), ev_ptr->m_status, ev_ptr->m_ev_type, ev_ptr->m_obj_type, ev_ptr->m_obj_id.c_str(),
+                ev_ptr->m_map_id, ev_ptr->m_area_id, ev_ptr->m_limit_value, ev_ptr->m_cur_value, ev_ptr->x, ev_ptr->y,
+                _time.c_str(), ev_ptr->m_desc.c_str(),
+                ev_ptr->m_landmarkid, ev_ptr->m_landmarkdist, ev_ptr->m_landmarkdirect);
+
+        db_tool::PushAsync(sql);
+    }
+
+    ~event_list(){}
+
+    static std::string ev_to_json(std::shared_ptr<ya_event> ev_ptr)
+    {
+        std::vector<std::shared_ptr<ya_event>> evs;
+        evs.push_back(ev_ptr);
+        return evs_to_json(evs);
+    }
+
+    static std::string evs_to_json(std::vector<std::shared_ptr<ya_event>> arr)
+    {
+        rapidjson::Document doc(rapidjson::kObjectType);
+        rapidjson::Value data(rapidjson::kArrayType);
+        rapidjson::Document::AllocatorType& allocator=doc.GetAllocator();
+
+        auto it=arr.begin();
+        for(;it!=arr.end();++it)
+        {
+            if((*it)->m_is_display)
+            {
+                ev_to_node(*it, allocator, data);
+            }
+        }
+
+        doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_EVENT, allocator);
+        doc.AddMember(JSON_ROOT_KEY_VERSION,INTERFACE_VERSION, allocator);
+        doc.AddMember(JSON_ROOT_KEY_DATA,data, allocator);
+
+        rapidjson::StringBuffer sb;
+        rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
+        doc.Accept(writer);
+
+        return sb.GetString();
+    }
+
+private:
+    static void ev_to_node(std::shared_ptr<ya_event> ev_ptr,
+                           rapidjson::Document::AllocatorType& allocator,
+                           rapidjson::Value& out_data)
+    {
+        rapidjson::Value ev(rapidjson::kObjectType);
+
+        ev.AddMember(JSON_KEY_EVENT_EVENT_ID,ev_ptr->get_id(), allocator);
+        ev.AddMember(JSON_KEY_EVENT_STATUS,ev_ptr->m_status, allocator);
+
+        ev.AddMember(JSON_KEY_EVENT_TYPE_ID,ev_ptr->m_ev_type, allocator);
+        ev.AddMember(JSON_KEY_EVENT_OBJ_TYPE_ID,ev_ptr->m_obj_type, allocator);
+
+        tool_json::add_member(ev, JSON_KEY_EVENT_OBJ_ID, ev_ptr->m_obj_id, allocator);
+        ev.AddMember(JSON_KEY_EVENT_MAP_ID,ev_ptr->m_map_id, allocator);
+        ev.AddMember(JSON_KEY_EVENT_AREA_ID,ev_ptr->m_area_id, allocator);
+        ev.AddMember(JSON_KEY_EVENT_X,ev_ptr->x, allocator);
+        ev.AddMember(JSON_KEY_EVENT_Y,ev_ptr->y, allocator);
+
+        ev.AddMember(JSON_KEY_EVENT_LIMIT_VALUE,ev_ptr->m_limit_value, allocator);
+        ev.AddMember(JSON_KEY_EVENT_CUR_VALUE,ev_ptr->m_cur_value, allocator);
+        ev.AddMember(JSON_KEY_EVENT_CUR_TIME,tool_time::to_ms(ev_ptr->m_cur_time), allocator);
+
+        ev.AddMember(JSON_KEY_EVENT_LANDMARK_ID,ev_ptr->m_landmarkid, allocator);
+        ev.AddMember(JSON_KEY_EVENT_LANDMARK_DIRECTION,ev_ptr->m_landmarkdirect, allocator);
+        ev.AddMember(JSON_KEY_EVENT_LANDMARK_DISTANCE,ev_ptr->m_landmarkdist, allocator);
+
+        out_data.PushBack(ev, allocator);
+    }
+
+private:
+    static event_ptr create_event(OBJECT_TYPE obj_type, int obj_id, int type, EVENT_TYPE ev_type)
+    {
+        auto ev_ptr = std::make_shared<ya_event>(tool_time::now_to_us());
+
+        ev_ptr->m_ev_type = ev_type;
+        ev_ptr->m_obj_type = obj_type;
+        ev_ptr->m_obj_id = tool_other::type_id_to_str(type, obj_id);
+
+        return ev_ptr;
+    }
+};
+
+#endif // YA_EVENT_H