module_web.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. }
  107. //所有红绿灯信息
  108. /*str = traffic_light_manager::instance()->get_light_state();
  109. if(!str.empty()){
  110. tool_json::push_back(nodes, str, allocator);
  111. }*/
  112. // 防碰撞告警
  113. /*str = module_call::instance()->get_json_anti_collision();
  114. if(!str.empty()){
  115. tool_json::push_back(nodes, str, allocator);
  116. }*/
  117. if(nodes.Size()>0)
  118. {
  119. doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_RESPONSE_ALL_DATA, allocator);
  120. doc.AddMember(JSON_ROOT_KEY_VERSION, INTERFACE_VERSION, allocator);
  121. doc.AddMember(JSON_ROOT_KEY_DATA, nodes, allocator);
  122. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
  123. }
  124. }
  125. /*
  126. * @brief 构造事件列表,并发送给请求端
  127. * @param 无
  128. * @return 无
  129. * @note
  130. * @warning
  131. * @bug
  132. * */
  133. void module_web::run()
  134. {
  135. std::vector<std::shared_ptr<ya_event>> arr;
  136. _get_all_events(arr);
  137. if(!arr.empty())//发送给web端
  138. {
  139. _delete_end(arr);
  140. std::string tmp = event_list::evs_to_json(arr);
  141. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tmp);
  142. }
  143. // 向web端发送呼救数据
  144. /*std::string help = module_call_help::get_json_help();
  145. if(!help.empty())
  146. {
  147. swsClientMgr.send(JSON_CMD_VALUE_PUSH, help);
  148. }*/
  149. }
  150. /*
  151. * @brief 获得所有未发送的系统事件
  152. * @param [in] std::vector<std::shared_ptr<ya_event>>& arr 事件数组
  153. * @param [in] bool f 是否需要加入事件列表标志
  154. * @return 无
  155. * @note
  156. * @warning
  157. * @bug
  158. * */
  159. void module_web::_get_all_events(std::vector<std::shared_ptr<ya_event>>& arr,bool f)
  160. {
  161. auto _map = event_list::instance()->m_map;
  162. auto it_map = _map.begin();
  163. for(;it_map!=_map.end();++it_map)
  164. {
  165. //if(f && it_map->second->m_is_sent && !it_map->second->is_end())
  166. if(f && !it_map->second->is_end())
  167. continue;
  168. else
  169. it_map->second->m_is_sent=true;
  170. arr.push_back(it_map->second);
  171. }
  172. }
  173. /*
  174. * @brief 在全局列表中删除已经处理或结束了的告警
  175. * @param std::vector<std::shared_ptr<ya_event>>& arr 事件数组
  176. * @return 无
  177. * @note
  178. * @warning
  179. * @bug
  180. * */
  181. void module_web::_delete_end(std::vector<std::shared_ptr<ya_event>>& arr)
  182. {
  183. std::vector<uint64_t> todelete;
  184. auto arr_iter = arr.begin();
  185. for(;arr_iter!=arr.end();++arr_iter)
  186. if((*arr_iter)->is_end())//删除掉已经处理的
  187. todelete.push_back((*arr_iter)->get_list_id());
  188. if(!todelete.empty())
  189. event_list::instance()->remove(todelete);
  190. }