module_web.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #include "module_web.h"
  2. #include "module_call_help.h"
  3. #include "module_call.h"
  4. #include "area_business_person_attendance.h"
  5. #include "module_meta_data_changed.h"
  6. #include "common_tool.h"
  7. #include "event.h"
  8. #include "log.h"
  9. #include "module_traffic_light_manager.h"
  10. #include "websocket/wsTimerThread.h"
  11. #include "load_raw.h"
  12. static std::string s_file_path;
  13. // 只支持记录导入,不补报警等信息。
  14. void *callback(void* arg)
  15. {
  16. load_raw loader;
  17. loader.load_file(s_file_path.c_str());
  18. swsTimerThrd.upt_load_history_completed();
  19. return NULL;
  20. }
  21. /*
  22. * @brief 处理请求端的请求类型,根据不同请求类型调用不同的业务模块处理
  23. * @param int ID 回调函数id
  24. * @param std::string const& name 请求命令字
  25. * @param sio::message::ptr const& data json数据字符串
  26. * @param bool need_ack 是否响应
  27. * @param sio::message::list& ack_resp 响应状态
  28. * @return 无
  29. * @note
  30. * @warning
  31. * @bug
  32. * */
  33. void module_web::accept( int ID, std::string const& name,
  34. sio::message::ptr const& data, bool need_ack, sio::message::list &ack_resp )
  35. {
  36. try
  37. {
  38. if (data->get_flag() != sio::message::flag_object)
  39. {
  40. log_error("web发来的数据不是对象");
  41. return;
  42. }
  43. log_info("web_data:%s", data->to_string().c_str());
  44. std::string cmd = "";
  45. if (!tool_map::try_get_value(cmd, JSON_ROOT_KEY_CMD, data) || cmd.empty())
  46. {
  47. log_error("web发来的数据cmd字段为空");
  48. return;
  49. }
  50. log_info("web发来的数据 cmd=%s", cmd.c_str());
  51. if (JSON_CMD_VALUE_CLEAR_CARD == cmd)
  52. {
  53. // 手动升井
  54. area_business_person_attendance::handle_up_mine(data);
  55. }
  56. else if (JSON_CMD_VALUE_REQUEST_ALL_DATA == cmd)
  57. {
  58. // web登录请求所有信息
  59. module_web::instance()->response_login();
  60. }
  61. else if (JSON_CMD_REQ_ALL_PERSON_ON_CAR == cmd)
  62. {
  63. // 人上车数据
  64. }
  65. else if (JSON_CMD_VALUE_LIGHTS_CTRL_REQUEST == cmd) {
  66. // 红绿灯手动控制
  67. traffic_light_manager::instance()->manual_ctrl(data);
  68. }
  69. else if (JSON_CMD_VALUE_LOAD_HISTORY_REQUEST == cmd) {
  70. // 导入历史数据
  71. std::map<std::string, sio::message::ptr> mp = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
  72. log_info("[load_history] map's size=%d", mp.size());
  73. s_file_path = mp["file_path"]->get_string();
  74. pthread_t tid;
  75. pthread_create(&tid, NULL, callback, NULL); //callback 是一个回调函数
  76. }
  77. else
  78. {
  79. sio::message::ptr data_value;
  80. if (!tool_map::try_get_value(data_value, JSON_ROOT_KEY_DATA, data))
  81. {
  82. log_error("web发来的 %s 数据data字段格式不对, 不是map", cmd.c_str());
  83. return;
  84. }
  85. if (JSON_CMD_VALUE_META_DATA_CHANGED == cmd)///基础数据
  86. {
  87. module_meta_data_changed::instance()->accept(data_value);
  88. }
  89. else if (JSON_CMD_VALUE_DEAL_HELP == cmd) // 处理呼救信息
  90. {
  91. module_call_help::instance()->accept_web_deal_help(data_value);
  92. }
  93. else if (JSON_CMD_VALUE_CALL_CARD_REQUEST == cmd)//呼叫
  94. {
  95. module_call::instance()->accept_call(data_value);
  96. }
  97. else if (JSON_CMD_VALUE_CALL_CARD_CANCEL_REQUEST == cmd)//取消呼叫
  98. {
  99. module_call::instance()->accept_cancel(data_value);
  100. }
  101. }
  102. }
  103. catch (...)
  104. {
  105. log_error("web发来的数据data字段格式不对");
  106. }
  107. }
  108. /*
  109. * @brief 客户端发起请求所有数据请求,采集构造相关事件数据并发送给请求端
  110. * @param 无
  111. * @return 无
  112. * @note
  113. * 1.增加红绿灯告警 2021/03/05
  114. * 2.增加人车防碰撞告警 2021/03/16
  115. * @warning
  116. * @bug
  117. * */
  118. void module_web::response_login()
  119. {
  120. rapidjson::Document doc(rapidjson::kObjectType);
  121. auto& allocator = doc.GetAllocator();
  122. rapidjson::Value nodes(rapidjson::kArrayType);
  123. //所有的呼叫信息
  124. std::string str=module_call::instance()->accept_login();
  125. if(!str.empty())
  126. {
  127. tool_json::push_back(nodes, str, allocator);
  128. }
  129. //所有告警
  130. std::vector<std::shared_ptr<ya_event>> arr;
  131. _get_all_events(arr);
  132. if(!arr.empty())
  133. {
  134. tool_json::push_back(nodes, event_list::evs_to_json(arr), allocator);
  135. tool_json::push_back(nodes, event_list::evs_to_json_v(arr), allocator);
  136. }
  137. //所有红绿灯信息
  138. /*str = traffic_light_manager::instance()->get_light_state();
  139. if(!str.empty()){
  140. tool_json::push_back(nodes, str, allocator);
  141. }*/
  142. // 防碰撞告警
  143. /*str = module_call::instance()->get_json_anti_collision();
  144. if(!str.empty()){
  145. tool_json::push_back(nodes, str, allocator);
  146. }*/
  147. if(nodes.Size()>0)
  148. {
  149. doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_RESPONSE_ALL_DATA, allocator);
  150. doc.AddMember(JSON_ROOT_KEY_VERSION, INTERFACE_VERSION, allocator);
  151. doc.AddMember(JSON_ROOT_KEY_DATA, nodes, allocator);
  152. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
  153. }
  154. }
  155. /*
  156. * @brief 构造事件列表,并发送给web端
  157. * 将所有事件包括:红绿灯失联、基站失联、超速、人车防碰撞告警发送给web端
  158. * @param 无
  159. * @return 无
  160. * @note
  161. * @warning
  162. * @bug
  163. * */
  164. void module_web::run()
  165. {
  166. std::vector<std::shared_ptr<ya_event>> arr;
  167. _get_all_events(arr);
  168. if(!arr.empty())//发送给web端
  169. {
  170. _delete_end(arr);
  171. std::string tmp = event_list::evs_to_json(arr);
  172. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tmp);
  173. tmp = event_list::evs_to_json_v(arr);
  174. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tmp);
  175. }
  176. // 向web端发送呼救数据
  177. /*std::string help = module_call_help::get_json_help();
  178. if(!help.empty())
  179. {
  180. swsClientMgr.send(JSON_CMD_VALUE_PUSH, help);
  181. }*/
  182. }
  183. /*
  184. * @brief 获得所有未发送的系统事件
  185. * @param [in] std::vector<std::shared_ptr<ya_event>>& arr 事件数组
  186. * @param [in] bool f 是否需要加入事件列表标志
  187. * @return 无
  188. * @note
  189. * @warning
  190. * @bug
  191. * */
  192. void module_web::_get_all_events(std::vector<std::shared_ptr<ya_event>>& arr,bool f)
  193. {
  194. auto _map = event_list::instance()->m_map;
  195. auto it_map = _map.begin();
  196. for(;it_map!=_map.end();++it_map)
  197. {
  198. //if(f && it_map->second->m_is_sent && !it_map->second->is_end())
  199. if(f && !it_map->second->is_end())
  200. continue;
  201. else
  202. it_map->second->m_is_sent=true;
  203. arr.push_back(it_map->second);
  204. }
  205. }
  206. /*
  207. * @brief 在全局列表中删除已经处理或结束了的告警
  208. * @param std::vector<std::shared_ptr<ya_event>>& arr 事件数组
  209. * @return 无
  210. * @note
  211. * @warning
  212. * @bug
  213. * */
  214. void module_web::_delete_end(std::vector<std::shared_ptr<ya_event>>& arr)
  215. {
  216. std::vector<uint64_t> todelete;
  217. auto arr_iter = arr.begin();
  218. for(;arr_iter!=arr.end();++arr_iter)
  219. if((*arr_iter)->is_end())//删除掉已经处理的
  220. todelete.push_back((*arr_iter)->get_list_id());
  221. if(!todelete.empty())
  222. event_list::instance()->remove(todelete);
  223. }