module_call_help.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #ifndef MODULE_CALL_HELP_H
  2. #define MODULE_CALL_HELP_H
  3. /**
  4. *@brief 呼救模块
  5. * 把呼救消息保存到数据库,同时推送给web
  6. * @author 戴月腾
  7. * @date 2018-08-09
  8. */
  9. #include <mutex>
  10. #include <map>
  11. #include <chrono>
  12. #include <boost/thread.hpp>
  13. #include <boost/enable_shared_from_this.hpp>
  14. #include "module_web.h"
  15. #include "module_const.h"
  16. /**
  17. * @brief 呼救类
  18. * 把呼救消息保存到数据库,同时推送给web, 单例
  19. */
  20. class module_call_help : public i_thread, public singleton_base<module_call_help>
  21. {
  22. private:
  23. friend class singleton_base<module_call_help>;
  24. module_call_help()
  25. {
  26. }
  27. public:
  28. /**
  29. * @brief 接收到呼救请求
  30. */
  31. void rev_help(std::shared_ptr<card> card_ptr)
  32. {
  33. if(ES_START != card_ptr->m_stat_call_help)
  34. {
  35. card_ptr->m_stat_call_help = ES_START;
  36. //保存到数据库
  37. auto ev_ptr = tool_other::create_event(OT_CARD, card_ptr->m_id, ET_CARD_HELP);
  38. tool_other::copy_event(card_ptr, ev_ptr);
  39. // ev_ptr->status = ES_START;
  40. // ev_ptr->cur_time = std::chrono::system_clock::now();
  41. //保存到数据库
  42. tool_db::save_event(ev_ptr);
  43. //转发给web
  44. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::ev_to_json(ev_ptr));
  45. std::lock_guard<std::mutex> lock(_mutex);
  46. tool_other::insert_event(ev_ptr, _map);
  47. }
  48. }
  49. /**
  50. * @brief 接收到web端发来的处理呼救请求
  51. * @param data_map
  52. */
  53. void accept_deal_help(std::map<std::string, sio::message::ptr> data_map)
  54. {
  55. uint32_t cardid = data_map[JSON_KEY_ID]->get_int();
  56. //uint64_t ev_id = data_map[JSON_KEY_EVENT_EVENT_ID]->get_int();
  57. auto card_ptr = card_list::instance()->get(tool_other::to_uint64_cardid(CT_PERSON, cardid));
  58. if(card_ptr)
  59. {
  60. card_ptr->m_stat_call_help = ES_DEAL_HELP;
  61. std::lock_guard<std::mutex> lock(_mutex);
  62. auto ev_ptr = tool_other::find_event(cardid, ET_CARD_HELP, _map);
  63. if(ev_ptr)
  64. {
  65. ev_ptr->m_status = ES_DEAL_HELP;
  66. tool_db::save_event(ev_ptr);
  67. }
  68. }
  69. // else
  70. // {
  71. // std::lock_guard<std::mutex> lock(_mutex);
  72. // _map.erase(ev_id);
  73. // }
  74. }
  75. /**
  76. * @brief web前端有用户登录时,反馈给web所有信息
  77. */
  78. std::string response_login()
  79. {
  80. std::vector<std::shared_ptr<ya_event>> arr;
  81. get_all_events(arr);
  82. if(!arr.empty())//发送给web端
  83. {
  84. return tool_json::evs_to_json(arr);
  85. }
  86. return "";
  87. }
  88. /**
  89. * @brief 读取数据库中的告警,初始化告警列表
  90. */
  91. void init()
  92. {}
  93. private:
  94. /**
  95. * @brief 线程函数
  96. */
  97. void run()
  98. {
  99. std::vector<std::shared_ptr<ya_event>> arr;
  100. get_all_events(arr);
  101. if(!arr.empty())//发送给web端
  102. {
  103. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::evs_to_json(arr));
  104. }
  105. }
  106. /**
  107. * @brief 获取所有的告警事件
  108. * @param out_data
  109. */
  110. void get_all_events(std::vector<std::shared_ptr<ya_event>>& arr)
  111. {
  112. {
  113. std::lock_guard<std::mutex> lock(_mutex);
  114. auto it_map = _map.begin();
  115. for(;it_map!=_map.end();++it_map)
  116. {
  117. arr.push_back(it_map->second);
  118. if(ES_DEAL_HELP== it_map->second->m_status)//删除掉已经处理的
  119. {
  120. _map.erase(it_map--);
  121. }
  122. }
  123. }
  124. }
  125. std::map<uint64_t, std::shared_ptr<ya_event>> _map;
  126. };
  127. #endif