Browse Source

人员升井删除告警逻辑&&重写速度告警逻辑

lixioayao 6 years ago
parent
commit
e5efe95062

+ 8 - 5
area.cpp

@@ -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,14 +364,17 @@ 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);
+        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);
@@ -389,7 +392,7 @@ void area_list::init_from_db(int id/*=-1*/)
             }
             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_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);

+ 2 - 2
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;

+ 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 - 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
module_service/area_business_card_enter_or_leave.cpp

@@ -22,7 +22,7 @@ void area_business_card_enter_or_leave::on_enter(const std::shared_ptr<area_hove
 //    std::string card_id = tool_other::type_id_to_str(c->m_type,c->m_id);
     const auto &p=a->m_enter_point;
     snprintf(sql,LENGTH_SQL,"INSERT INTO his_location_area (obj_id,card_type_id,ident,area_id,map_id,enter_time,start_point) \
-	                         VALUES ('%d','%d','%d',%d,%d,'%s','%.2f,%.2f');",
+	                         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);

+ 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();