module_web.cpp 6.2 KB

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