ya_event.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. #ifndef YA_EVENT_H
  2. #define YA_EVENT_H
  3. /**
  4. * @brief 告警事件类型
  5. * @author 戴月腾
  6. * @date 2018-09-24
  7. */
  8. #include<map>
  9. #include<chrono>
  10. #include<memory>
  11. #include"write-copy.h"
  12. #include"log.h"
  13. #include "db_api/CDBSingletonDefine.h"
  14. #include"card.h"
  15. #include"common_tool.h"
  16. #include "tool_time.h"
  17. #include "db_tool.h"
  18. #include <area.h>
  19. #include "ant.h"
  20. /**
  21. * @brief 事件状态
  22. */
  23. enum EVENT_STATUS
  24. {
  25. ///事件开始
  26. ES_START = 0,
  27. ///呼救已处理状态
  28. ES_DEAL_HELP = 1,
  29. ///事件结束
  30. ES_END = 100
  31. };
  32. enum EVENT_TYPE{ // 事件类型
  33. ET_UNKNOWN = 0,
  34. ET_OVER_COUNT_PERSON = 1, // 井下人员超员pit_module/CPicardmanager
  35. ET_OVER_COUNT_VEHICLE = 2, // 井下车辆超员pit_module/CPicardmanager
  36. ET_AREA_OVER_COUNT_PERSON = 3, // 区域人员超员
  37. ET_AREA_OVER_COUNT_VEHICLE = 4, // 区域车辆超员
  38. ET_READER_ERROR = 6,
  39. ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
  40. ET_CARD_OVER_TIME_PERSON = 13, // 人员井下超时pit_module/CPicardmanager
  41. ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时pit_module/CPicardmanager
  42. ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
  43. ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
  44. ET_CARD_AREA_LIMIT_PERSON = 17, // 人员进入限制区域
  45. ET_CARD_AREA_LIMIT_VEHICLE = 18, // 车辆进入限制区域
  46. ET_CARD_AREA_FORBIDDEN_PERSON = 19, // 人员进入禁止区域
  47. ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
  48. ET_CARD_OVER_SPEED = 21, // 车辆超速
  49. ET_CARD_HELP = 24, // 人员呼救
  50. ET_READER_POWER_BY_BATTERY=33, //分站电池:1为电池供电,0为交流电供电,当电池供电需要告警
  51. CARD_EVENT_COUNT_MAX,
  52. };
  53. /**
  54. * @brief 对象类型
  55. */
  56. enum OBJECT_TYPE
  57. {
  58. ///矿井
  59. OT_MINE = 1,
  60. ///区域
  61. OT_AREA = 2,
  62. ///分站
  63. OT_DEVICE_READER = 4,
  64. ///标识卡,包括人员、车辆、自组网等
  65. OT_CARD = 9,
  66. };
  67. /**
  68. * @brief 告警事件
  69. */
  70. struct ya_event
  71. {
  72. private:
  73. uint64_t m_ev_id;
  74. public:
  75. ya_event(uint64_t e_id):m_cur_time(std::chrono::system_clock::now())
  76. {
  77. m_ev_id = e_id;
  78. m_obj_id = "";
  79. m_map_id = 0;
  80. m_area_id = 0;
  81. x = 0;
  82. y = 0;
  83. m_limit_value = 0;
  84. m_cur_value = 0;
  85. m_desc = "";
  86. m_landmarkid = 0;
  87. m_landmarkdirect = 0;
  88. m_landmarkdist = 0;
  89. m_status=ES_START;
  90. m_is_display=true;
  91. }
  92. ~ya_event(){}
  93. public:
  94. ///告警状态,开始、结束
  95. EVENT_STATUS m_status;
  96. ///告警类型
  97. EVENT_TYPE m_ev_type;
  98. ///告警对象类型
  99. OBJECT_TYPE m_obj_type;
  100. /// 告警对象编号,与告警对象类型对应,如告警对象类型为分站,此字段为分站编号
  101. std::string m_obj_id;
  102. ///当前时间,为告警事件的触发时间,如果状态为开始,则表示开始时间,否则为结束时间
  103. std::chrono::system_clock::time_point m_cur_time;
  104. ///告警所在地图
  105. int m_map_id;
  106. ///告警所在区域
  107. int m_area_id;
  108. ///位置
  109. double x;
  110. ///位置
  111. double y;
  112. ///告警阈值
  113. double m_limit_value;
  114. ///当前值
  115. double m_cur_value;
  116. ///描述
  117. std::string m_desc;
  118. /// 地标信息
  119. int m_landmarkid;
  120. /// 与地标的距离
  121. double m_landmarkdist;
  122. /// 所处地标的方向
  123. int m_landmarkdirect;
  124. bool m_is_display;
  125. bool is_end()
  126. {
  127. return ES_END == m_status;
  128. }
  129. ///作为事件map列表的id,方便查找;(obj_type<<32| obj_id)
  130. uint64_t get_list_id();
  131. uint64_t get_id(){return m_ev_id;}
  132. };
  133. typedef std::shared_ptr<ya_event> event_ptr;
  134. typedef std::map<uint64_t, std::shared_ptr<ya_event>> event_map;
  135. typedef std::shared_ptr<event_map> event_map_ptr;
  136. struct event_list:single_base<event_list,uint64_t,std::shared_ptr<ya_event>>
  137. {
  138. public:
  139. ///作为事件map列表的id,方便查找;(ev_type<<48 | obj_type<<40 | obj_id_type<<32 | obj_id)
  140. static uint64_t to_list_id(EVENT_TYPE ev_type, OBJECT_TYPE obj_type, int obj_id_type, uint32_t obj_id)
  141. {
  142. return (static_cast<uint64_t>(ev_type)<<48)|(static_cast<uint64_t>(obj_type)<<40)
  143. |(static_cast<uint64_t>(obj_id_type)<<32)|static_cast<uint64_t>(obj_id);
  144. }
  145. ///创建井下警告
  146. static event_ptr create_event_mine(int objid, EVENT_TYPE ev_type)
  147. {
  148. return create_event(OT_MINE, objid, 0, ev_type);
  149. }
  150. ///创建区域警告
  151. static event_ptr create_event_area(int area_id, EVENT_TYPE ev_type)
  152. {
  153. return create_event(OT_AREA, area_id, 0, ev_type);
  154. }
  155. static event_ptr create_event_reader(int reader_id, EVENT_TYPE ev_type)
  156. {
  157. return create_event(OT_DEVICE_READER, reader_id, 0, ev_type);
  158. }
  159. ///创建与卡有关的警告,需要卡类型
  160. static event_ptr create_event_card(uint32_t card_id, int32_t card_type, EVENT_TYPE ev_type)
  161. {
  162. return create_event(OT_CARD, static_cast<int32_t>(card_id), card_type, ev_type);
  163. }
  164. static void copy_event(const std::shared_ptr<card_location_base> card_ptr, event_ptr ev_ptr)
  165. {
  166. ev_ptr->x = card_ptr->x;
  167. ev_ptr->y = card_ptr->y;
  168. ev_ptr->m_cur_time = std::chrono::system_clock::now();
  169. ev_ptr->m_is_display = card_ptr->m_display;
  170. auto hover = card_ptr->get_area_hover();
  171. if(nullptr!=hover)
  172. {
  173. ev_ptr->m_area_id = hover->m_area->id();
  174. ev_ptr->m_map_id = hover->m_area->mapid();
  175. ev_ptr->m_landmarkid = hover->landmark_dir;
  176. ev_ptr->m_landmarkdist = hover->landmark_dis;
  177. ev_ptr->m_landmarkdirect = hover->landmark_dir;
  178. }
  179. }
  180. static void copy_event(const std::shared_ptr<area> area_ptr, event_ptr ev_ptr)
  181. {
  182. ev_ptr->m_cur_time = std::chrono::system_clock::now();
  183. ev_ptr->m_is_display = true;
  184. ev_ptr->m_area_id = area_ptr->id();
  185. ev_ptr->m_map_id = area_ptr->mapid();
  186. }
  187. static void copy_event(const std::shared_ptr<site> site_ptr, event_ptr ev_ptr)
  188. {
  189. ev_ptr->m_cur_time = std::chrono::system_clock::now();
  190. ev_ptr->m_is_display = true;
  191. ev_ptr->m_area_id = site_ptr->m_area_id;
  192. ev_ptr->m_map_id = site_ptr->m_map_id;
  193. ev_ptr->x = site_ptr->x;
  194. ev_ptr->y = site_ptr->y;
  195. }
  196. std::shared_ptr<ya_event> get_event_card(uint32_t card_id, int card_type, EVENT_TYPE ev_type)
  197. {
  198. return base::get(to_list_id(ev_type, OT_CARD, card_type, card_id));
  199. }
  200. std::shared_ptr<ya_event> get_event_area(int32_t area_id, EVENT_TYPE ev_type)
  201. {
  202. return base::get(to_list_id(ev_type, OT_AREA, 0, static_cast<uint32_t>(area_id)));
  203. }
  204. std::shared_ptr<ya_event> get_event_reader(int32_t reader_id, EVENT_TYPE ev_type)
  205. {
  206. return base::get(to_list_id(ev_type,OT_DEVICE_READER, 0, static_cast<uint32_t>(reader_id)));
  207. }
  208. void load_his_data_from_db();
  209. static void save_event(const event_ptr ev_ptr)
  210. {
  211. char sql[LENGTH_SQL] = {'\0'};
  212. std::string _time = tool_time::to_str_ex(ev_ptr->m_cur_time);
  213. sprintf(sql,
  214. "INSERT IGNORE INTO his_event_data(event_id, stat, event_type_id, obj_type_id, obj_id, \
  215. map_id, area_id, limit_value, cur_value, x, y, cur_time, description, \
  216. landmark_id, landmark_dist,direction_mapper_id )\
  217. VALUES(%ld, %d, %d, %d, %s, %d, %d, %.2f, %.2f, %f, %f, '%s', '%s', %d, %10.3f, %d);",
  218. 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(),
  219. 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,
  220. _time.c_str(), ev_ptr->m_desc.c_str(),
  221. ev_ptr->m_landmarkid, ev_ptr->m_landmarkdist, ev_ptr->m_landmarkdirect);
  222. db_tool::PushAsync(sql);
  223. }
  224. ~event_list(){}
  225. static std::string ev_to_json(std::shared_ptr<ya_event> ev_ptr)
  226. {
  227. std::vector<std::shared_ptr<ya_event>> evs;
  228. evs.push_back(ev_ptr);
  229. return evs_to_json(evs);
  230. }
  231. static std::string evs_to_json(std::vector<std::shared_ptr<ya_event>> arr)
  232. {
  233. rapidjson::Document doc(rapidjson::kObjectType);
  234. rapidjson::Value data(rapidjson::kArrayType);
  235. rapidjson::Document::AllocatorType& allocator=doc.GetAllocator();
  236. auto it=arr.begin();
  237. for(;it!=arr.end();++it)
  238. {
  239. if((*it)->m_is_display)
  240. {
  241. ev_to_node(*it, allocator, data);
  242. }
  243. }
  244. doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_EVENT, allocator);
  245. doc.AddMember(JSON_ROOT_KEY_VERSION,INTERFACE_VERSION, allocator);
  246. doc.AddMember(JSON_ROOT_KEY_DATA,data, allocator);
  247. rapidjson::StringBuffer sb;
  248. rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
  249. doc.Accept(writer);
  250. return sb.GetString();
  251. }
  252. private:
  253. static void ev_to_node(std::shared_ptr<ya_event> ev_ptr,
  254. rapidjson::Document::AllocatorType& allocator,
  255. rapidjson::Value& out_data)
  256. {
  257. rapidjson::Value ev(rapidjson::kObjectType);
  258. ev.AddMember(JSON_KEY_EVENT_EVENT_ID,ev_ptr->get_id(), allocator);
  259. ev.AddMember(JSON_KEY_EVENT_STATUS,ev_ptr->m_status, allocator);
  260. ev.AddMember(JSON_KEY_EVENT_TYPE_ID,ev_ptr->m_ev_type, allocator);
  261. ev.AddMember(JSON_KEY_EVENT_OBJ_TYPE_ID,ev_ptr->m_obj_type, allocator);
  262. tool_json::add_member(ev, JSON_KEY_EVENT_OBJ_ID, ev_ptr->m_obj_id, allocator);
  263. ev.AddMember(JSON_KEY_EVENT_MAP_ID,ev_ptr->m_map_id, allocator);
  264. ev.AddMember(JSON_KEY_EVENT_AREA_ID,ev_ptr->m_area_id, allocator);
  265. ev.AddMember(JSON_KEY_EVENT_X,ev_ptr->x, allocator);
  266. ev.AddMember(JSON_KEY_EVENT_Y,ev_ptr->y, allocator);
  267. ev.AddMember(JSON_KEY_EVENT_LIMIT_VALUE,ev_ptr->m_limit_value, allocator);
  268. ev.AddMember(JSON_KEY_EVENT_CUR_VALUE,ev_ptr->m_cur_value, allocator);
  269. ev.AddMember(JSON_KEY_EVENT_CUR_TIME,tool_time::to_ms(ev_ptr->m_cur_time), allocator);
  270. ev.AddMember(JSON_KEY_EVENT_LANDMARK_ID,ev_ptr->m_landmarkid, allocator);
  271. ev.AddMember(JSON_KEY_EVENT_LANDMARK_DIRECTION,ev_ptr->m_landmarkdirect, allocator);
  272. ev.AddMember(JSON_KEY_EVENT_LANDMARK_DISTANCE,ev_ptr->m_landmarkdist, allocator);
  273. out_data.PushBack(ev, allocator);
  274. }
  275. private:
  276. static event_ptr create_event(OBJECT_TYPE obj_type, int obj_id, int type, EVENT_TYPE ev_type)
  277. {
  278. auto ev_ptr = std::make_shared<ya_event>(tool_time::now_to_us());
  279. ev_ptr->m_ev_type = ev_type;
  280. ev_ptr->m_obj_type = obj_type;
  281. ev_ptr->m_obj_id = tool_other::type_id_to_str(type, obj_id);
  282. return ev_ptr;
  283. }
  284. };
  285. #endif // YA_EVENT_H