|
@@ -72,6 +72,19 @@ event_tool * event_tool::instance()
|
|
|
{
|
|
|
return &et;
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * @brief
|
|
|
+ * 告警分类:一人带多卡告警、区域告警、基站告警、卡告警、红绿灯告警
|
|
|
+ * @param
|
|
|
+ * 无
|
|
|
+ * @return
|
|
|
+ * 无
|
|
|
+ * @note
|
|
|
+ * @warning
|
|
|
+ * @bug
|
|
|
+ *
|
|
|
+ * */
|
|
|
void event_tool::make_event_object()
|
|
|
{
|
|
|
m_map[OT_MORE_CARD] = std::make_shared<mine_event>();
|
|
@@ -81,7 +94,7 @@ void event_tool::make_event_object()
|
|
|
m_map[OT_DEVICE_LIGHT] = std::make_shared<light_event>();
|
|
|
}
|
|
|
|
|
|
-void event_tool::handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,EVENT_DIS_TYPE edt/*=DT_COMMON*/,const std::string &desc/*=""*/)
|
|
|
+void event_tool::handle_event(OBJECT_TYPE ot, EVENT_TYPE et, uint64_t id, double limit_value, double cur_value, bool f, EVENT_DIS_TYPE edt/*=DT_COMMON*/, const std::string &desc/*=""*/)
|
|
|
{
|
|
|
m_map[ot]->handle_alarm_event(et,id,limit_value,cur_value,f,edt,desc);
|
|
|
}
|
|
@@ -96,7 +109,11 @@ std::shared_ptr<ya_event> Event::create_event(const std::string&obj_id,EVENT_TYP
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * @breif 构建开始或者取消告警事件
|
|
|
+ * @breif 构建开始或者取消告警事件,
|
|
|
+ * 告警事件入口,生成事件对象,保存在内存中。
|
|
|
+ * end_time为零表示开始
|
|
|
+ * start_time为零表示结束
|
|
|
+ * 事件的唯一根据id判断。
|
|
|
* @param EVENT_TYPE et 事件设备类型
|
|
|
* @param uint64_t id
|
|
|
* @param double limit_value 阈值
|
|
@@ -109,10 +126,11 @@ std::shared_ptr<ya_event> Event::create_event(const std::string&obj_id,EVENT_TYP
|
|
|
* @bug
|
|
|
* @warning
|
|
|
* */
|
|
|
-void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,EVENT_DIS_TYPE edt,const std::string &desc)
|
|
|
+void Event::handle_alarm_event(EVENT_TYPE et, uint64_t id, double limit_value, double cur_value, bool f, EVENT_DIS_TYPE edt, const std::string &desc)
|
|
|
{
|
|
|
std::shared_ptr<ya_event> ev_ptr = nullptr;
|
|
|
- uint64_t eid = event_list::to_list_id(et,m_oid,id,edt);
|
|
|
+ uint64_t eid = event_list::to_list_id(et, m_oid, id, edt);
|
|
|
+ //eid是告警的唯一id,如果存在,查找eid来找到的已经存在的事件
|
|
|
auto event_ptr = event_list::instance()->get(eid);
|
|
|
if(f)
|
|
|
{
|
|
@@ -125,27 +143,27 @@ void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,doub
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- uint64_t _id=id;
|
|
|
+ uint64_t _id = id;
|
|
|
//log_info("Create_Event:desc[%s],id:%d,et:%d",desc.c_str(),id,et);
|
|
|
if((et == ET_UWB_MORE_CARD||et == ET_VEHICLE_REAR_END) && !desc.empty())//防追尾告警特殊处理
|
|
|
{
|
|
|
- std::string cardid = desc.substr(0,desc.find_first_of('&'));
|
|
|
+ std::string cardid = desc.substr(0, desc.find_first_of('&'));
|
|
|
_id = tool_other::card_id_to_u64(cardid);
|
|
|
}
|
|
|
- ev_ptr=on_message(et,_id,f);
|
|
|
+ ev_ptr = on_message(et,_id,f);
|
|
|
if(ev_ptr){
|
|
|
- ev_ptr->m_cur_value=cur_value;
|
|
|
- ev_ptr->m_limit_value=limit_value;
|
|
|
- ev_ptr->m_desc=desc;
|
|
|
- ev_ptr->m_id=eid;
|
|
|
- ev_ptr->m_dis_type=edt;
|
|
|
- if(et == ET_VEHICLE_REAR_END||et==ET_UWB_MORE_CARD)//一人多卡特殊处理
|
|
|
+ ev_ptr->m_cur_value = cur_value;
|
|
|
+ ev_ptr->m_limit_value = limit_value;
|
|
|
+ ev_ptr->m_desc = desc;
|
|
|
+ ev_ptr->m_id = eid;
|
|
|
+ ev_ptr->m_dis_type = edt;
|
|
|
+ if(et == ET_VEHICLE_REAR_END|| et == ET_UWB_MORE_CARD)//一人多卡特殊处理
|
|
|
{
|
|
|
- ev_ptr->m_obj_id=desc;
|
|
|
+ ev_ptr->m_obj_id = desc;
|
|
|
//ev_ptr->m_cur_time=std::chrono::system_clock::time_point(std::chrono::milliseconds((time_t)limit_value * 1000));
|
|
|
}
|
|
|
//保存告警信息
|
|
|
- event_list::instance()->add(eid,ev_ptr);
|
|
|
+ event_list::instance()->add(eid, ev_ptr);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -157,14 +175,26 @@ void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,doub
|
|
|
event_ptr->m_cur_time = std::chrono::system_clock::now();
|
|
|
event_ptr->m_status = ES_END;
|
|
|
event_ptr->m_cur_value = cur_value;
|
|
|
- event_ptr->m_desc=desc;
|
|
|
- event_ptr->m_is_sent=false;
|
|
|
+ event_ptr->m_desc = desc;
|
|
|
+ event_ptr->m_is_sent = false;
|
|
|
ev_ptr=event_ptr;
|
|
|
}
|
|
|
}
|
|
|
- if(ev_ptr)
|
|
|
+
|
|
|
+ if(ev_ptr)
|
|
|
{
|
|
|
- event_list::save_event(ev_ptr);
|
|
|
+ //event_list::save_event(ev_ptr);
|
|
|
+ //基站失联告警:人员和车辆都要有
|
|
|
+ if(ev_ptr->m_ev_type == 6){
|
|
|
+ event_list::save_event(ev_ptr);
|
|
|
+ event_list::save_event_v(ev_ptr);
|
|
|
+ }else if(ev_ptr->m_ev_type == 8 || ev_ptr->m_ev_type == 21 || ev_ptr->m_ev_type == 41){
|
|
|
+ // 红绿灯失联、人车防碰撞、超速告警这三类保存到his_event_data_v表中
|
|
|
+ event_list::save_event_v(ev_ptr);
|
|
|
+ }else{
|
|
|
+ //其他的人员相关报警保存到his_event_data表中
|
|
|
+ event_list::save_event(ev_ptr);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -307,6 +337,36 @@ void event_list::save_event(const std::shared_ptr<ya_event> &ev_ptr)
|
|
|
db_tool::PushAsync(sql);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * @brief
|
|
|
+ * 保存告警事件
|
|
|
+ * @param
|
|
|
+ * const std::shared_ptr<ya_event>& ev_ptr 告警对象
|
|
|
+ * int type 告警开始结束标志,开始为0,结束为1
|
|
|
+ * @return
|
|
|
+ * 无
|
|
|
+ * @note
|
|
|
+ * @warning
|
|
|
+ * @bug
|
|
|
+ * */
|
|
|
+void event_list::save_event_v(const std::shared_ptr<ya_event> &ev_ptr)
|
|
|
+{
|
|
|
+ char sql[LENGTH_SQL] = {0};
|
|
|
+ std::string _time = tool_time::to_str_ex(ev_ptr->m_cur_time);
|
|
|
+ switch(ev_ptr->m_status){
|
|
|
+ case 0:
|
|
|
+ sprintf(sql, "INSERT IGNORE INTO his_event_data_v(id, event_type_id, obj_id, x, y ,start_time) VALUES(%ld, %d, '%s', %.2f, %.2f, '%s');",
|
|
|
+ ev_ptr->m_ev_id, ev_ptr->m_ev_type, ev_ptr->m_obj_id.c_str(), ev_ptr->x, ev_ptr->y, _time.c_str());
|
|
|
+ break;
|
|
|
+ case 100:
|
|
|
+ sprintf(sql, "update his_event_data_v set end_time='%s' where id=%ld;", _time.c_str(), ev_ptr->m_ev_id);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ db_tool::PushAsync(sql);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void event_list::load_his_data_from_db(bool init /*=true*/)
|
|
|
{
|
|
|
static std::time_t s_last_time=0;
|
|
@@ -315,7 +375,8 @@ void event_list::load_his_data_from_db(bool init /*=true*/)
|
|
|
if(t-s_last_time<15)return;
|
|
|
s_last_time=t;
|
|
|
}
|
|
|
- std::unordered_map<uint64_t, std::shared_ptr<ya_event>> map;
|
|
|
+
|
|
|
+ std::unordered_map<uint64_t, std::shared_ptr<ya_event>> map;
|
|
|
std::string 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 event_id IN (SELECT MAX(event_id) FROM his_event_data \
|
|
@@ -460,6 +521,17 @@ void event_list::load_his_data_from_db(bool init /*=true*/)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * @brief
|
|
|
+ * 事件转为json
|
|
|
+ * @param
|
|
|
+ * std::vector<std::shared_ptr<ya_event>> arr 事件列表
|
|
|
+ * @return
|
|
|
+ * json字符串
|
|
|
+ * @note
|
|
|
+ * @warning
|
|
|
+ * @bug
|
|
|
+ * */
|
|
|
std::string event_list::evs_to_json(std::vector<std::shared_ptr<ya_event>> arr)
|
|
|
{
|
|
|
rapidjson::Document doc(rapidjson::kObjectType);
|
|
@@ -483,6 +555,40 @@ std::string event_list::evs_to_json(std::vector<std::shared_ptr<ya_event>> arr)
|
|
|
return sb.GetString();
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * @brief
|
|
|
+ * 构造alarm的json字符串
|
|
|
+ * @param
|
|
|
+ * std::vector<std::shared_ptr<ya_event>> arr 告警事件列表
|
|
|
+ * @return
|
|
|
+ * alarm的json字符串
|
|
|
+ * @note
|
|
|
+ * @warning
|
|
|
+ * @bug
|
|
|
+ *
|
|
|
+ * */
|
|
|
+std::string event_list::evs_to_json_v(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)
|
|
|
+ {
|
|
|
+ _ev_to_node_v(*it, allocator, data);
|
|
|
+ }
|
|
|
+
|
|
|
+ doc.AddMember(JSON_ROOT_KEY_CMD, "alarm", allocator);
|
|
|
+ doc.AddMember(JSON_ROOT_KEY_DATA, data, allocator);
|
|
|
+
|
|
|
+ rapidjson::StringBuffer sb;
|
|
|
+ rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
|
|
|
+ doc.Accept(writer);
|
|
|
+
|
|
|
+ return sb.GetString();
|
|
|
+}
|
|
|
+
|
|
|
void event_list::_ev_to_node(std::shared_ptr<ya_event> ev_ptr,
|
|
|
rapidjson::Document::AllocatorType& allocator,
|
|
|
rapidjson::Value& out_data)
|
|
@@ -510,4 +616,43 @@ void event_list::_ev_to_node(std::shared_ptr<ya_event> ev_ptr,
|
|
|
out_data.PushBack(ev, allocator);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * @brief
|
|
|
+ * 构造每个具体告警的数据
|
|
|
+ * @param
|
|
|
+ * std::shared_ptr<ya_event> ev_ptr //告警对象
|
|
|
+ * rapidjson::Document::AllocatorType& allocator //json的allocator
|
|
|
+ * rapidjson::Value& out_data //输出的json value对象
|
|
|
+ * @return
|
|
|
+ * @note
|
|
|
+ * @warning
|
|
|
+ * @bug
|
|
|
+ * */
|
|
|
+void event_list::_ev_to_node_v(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->m_id, allocator);
|
|
|
+ tool_json::add_member(ev, JSON_KEY_EVENT_EVENT_ID, std::to_string(ev_ptr->m_id), allocator);
|
|
|
+ ev.AddMember(JSON_KEY_EVENT_TYPE_ID,ev_ptr->m_ev_type, allocator);
|
|
|
+
|
|
|
+ tool_json::add_member(ev, JSON_KEY_EVENT_OBJ_ID, ev_ptr->m_obj_id, allocator);
|
|
|
+ ev.AddMember(JSON_KEY_EVENT_X,ev_ptr->x, allocator);
|
|
|
+ ev.AddMember(JSON_KEY_EVENT_Y,ev_ptr->y, allocator);
|
|
|
+
|
|
|
+ switch(ev_ptr->m_status){
|
|
|
+ case 0:
|
|
|
+ ev.AddMember("start_time", tool_time::to_ms(ev_ptr->m_cur_time), allocator);
|
|
|
+ break;
|
|
|
+ case 100:
|
|
|
+ ev.AddMember("end_time", tool_time::to_ms(ev_ptr->m_cur_time), allocator);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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>();
|