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