module_attendance_person.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #include"module_attendance_person.h"
  2. #include <chrono>
  3. //#include <vector>
  4. #include "websocket/wsClientMgr.h"
  5. #include"mine.h"
  6. #include "module_meta_date_changed.h"
  7. #include "module_mine.h"
  8. #include "common_tool.h"
  9. #include "module_area.h"
  10. #include"log.h"
  11. #include "mine_module/MineCardManager.h"
  12. #include"db/db_tool.h"
  13. /**
  14. * @brief 进入分站覆盖区域处理,考勤
  15. * @param card_ptr
  16. * @param site_ptr
  17. */
  18. void module_attendance_person::enter_site(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<site> site_ptr)
  19. {
  20. // 从井下切换到井上为考勤结束
  21. // 从井下切换到井上为考勤结束
  22. if(site_ptr->is_up_site())
  23. {
  24. up_mine(card_ptr, site_ptr);
  25. //检查井下是否超员--是否需要取消
  26. CMineCardManager::instance()->OnPersonUp(card_ptr);
  27. }
  28. else// 从井上切换到井下为考勤开始
  29. {
  30. auto mine_tool_ptr = card_ptr->get_mine_tool();
  31. if(!mine_tool_ptr->is_attendance())
  32. {
  33. //考勤开始
  34. mine_tool_ptr->m_stat_attendance=AS_ATTENDANCE;
  35. mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
  36. //作为一条开始考勤记录保存到数据库
  37. db_tool::save_attendance(card_ptr);
  38. log_info("人卡考勤开始:卡id=%d,卡type=%d,分站id=%d,分站reader_type_id=%d,stat_attendance=%d",
  39. card_ptr->m_id, card_ptr->m_type,
  40. site_ptr->m_id,site_ptr->m_reader_type_id,mine_tool_ptr->m_stat_attendance);
  41. }
  42. //检查井下是否超员
  43. CMineCardManager::instance()->OnPersonDown(card_ptr);
  44. }
  45. }
  46. /**
  47. * @brief 离开现有分站处理,记录现有分站的进出时间和地点
  48. * @param card_ptr
  49. * @param site_ptr
  50. */
  51. void module_attendance_person::leave_site(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<site> site_ptr)
  52. {
  53. }
  54. ///升井或收到web的删除卡命令 site_ptr==nullptr表示收到web的删除卡命令
  55. /// 保存考勤记录,发升井json,清理卡
  56. void module_attendance_person::up_mine(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<site> site_ptr)
  57. {
  58. auto mine_tool_ptr = card_ptr->get_mine_tool();
  59. if(!mine_tool_ptr->is_attendance())
  60. {
  61. return;
  62. }
  63. //考勤结束
  64. mine_tool_ptr->m_stat_attendance=AS_NOT_ATTENDANCE;
  65. //作为一条结束考勤记录保存到数据库
  66. db_tool::save_attendance(card_ptr);
  67. rapidjson::Document doc(rapidjson::kObjectType);
  68. rapidjson::Value datas(rapidjson::kArrayType);
  69. rapidjson::Document::AllocatorType& allocator=doc.GetAllocator();
  70. _to_json_card_up_one(card_ptr, datas, allocator);
  71. module_meta_date_changed::clear_card(card_ptr);
  72. //升井json发给web
  73. if(datas.Size() > 0)
  74. {
  75. doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_UP_MINE, allocator);
  76. //doc.AddMember(JSON_ROOT_KEY_VERSION,INTERFACE_VERSION, allocator);
  77. doc.AddMember(JSON_ROOT_KEY_DATA, datas, allocator);
  78. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
  79. }
  80. if(site_ptr)
  81. {
  82. log_info("人卡考勤结束:卡id=%d,卡type=%d,分站id=%d,分站reader_type_id=%d,stat_attendance=%d",
  83. card_ptr->m_id, card_ptr->m_type,
  84. site_ptr->m_id,site_ptr->m_reader_type_id,mine_tool_ptr->m_stat_attendance);
  85. }
  86. else
  87. {
  88. log_info("收到web的删除卡命令,人卡考勤结束:卡id=%d,卡type=%d, stat_attendance=%d",
  89. card_ptr->m_id, card_ptr->m_type, mine_tool_ptr->m_stat_attendance);
  90. }
  91. }
  92. /**
  93. * @brief 手工升井函数
  94. */
  95. void module_attendance_person::handle_up_mine(sio::message::ptr const& data)
  96. {
  97. std::vector<sio::message::ptr> card_vec;
  98. if(!tool_map::try_get_value(card_vec, JSON_ROOT_KEY_DATA, data) || card_vec.size() == 0)
  99. {
  100. log_error("手工升井,web发来的数据data字段为空 或者不是数组");
  101. return;
  102. }
  103. rapidjson::Document doc(rapidjson::kObjectType);
  104. rapidjson::Value datas(rapidjson::kArrayType);
  105. rapidjson::Document::AllocatorType& allocator=doc.GetAllocator();
  106. std::vector<sio::message::ptr>::const_iterator it_card = card_vec.begin();
  107. int type = 0;
  108. std::string s_card_id;
  109. for(; it_card != card_vec.end(); ++it_card)
  110. {
  111. if(!tool_map::try_get_value(s_card_id, JSON_KEY_CALL_CARD_CARD_ID, (*it_card))
  112. ||!tool_map::try_get_value(type, JSON_KEY_CALL_CARD_CARD_TYPE_ID, (*it_card)))
  113. {
  114. log_error("手工升井,web发来的数据 card_id 或 card_type格式不对");
  115. continue;
  116. }
  117. uint32_t id = tool_other::id64_to_id(s_card_id);
  118. auto card_ptr = card_list::instance()->get(tool_other::type_id_to_u64(type, id));
  119. if(card_ptr && card_ptr->is_person())
  120. {
  121. std_debug("手工升井,处理,卡id=%d,卡type=%d", id, type);
  122. log_info("手工升井,处理,卡id=%d,卡type=%d", id, type);
  123. auto mine_tool_ptr = card_ptr->get_mine_tool();
  124. if(mine_tool_ptr->is_attendance())
  125. {
  126. //考勤结束
  127. mine_tool_ptr->m_stat_attendance=AS_NOT_ATTENDANCE;
  128. //作为一条结束考勤记录保存到数据库
  129. db_tool::save_attendance(card_ptr);
  130. }
  131. //检查井下是否超员--是否需要取消
  132. CMineCardManager::instance()->OnPersonUp(card_ptr);
  133. auto area_hover_ptr = card_ptr->get_area_hover();
  134. if(area_hover_ptr && 0!=area_hover_ptr->id() && 0!=area_hover_ptr->mapid())
  135. {
  136. module_area::on_leave(card_ptr->m_id, area_hover_ptr, card_ptr->m_type);
  137. }
  138. _to_json_card_up_one(card_ptr, datas, allocator);
  139. module_meta_date_changed::clear_card(card_ptr);
  140. }
  141. else
  142. {
  143. log_error("手工升井,在全局列表中找不到卡,卡id=%d,卡type=%d", id, type);
  144. }
  145. }
  146. //升井json发给web
  147. if(datas.Size() > 0)
  148. {
  149. doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_UP_MINE, allocator);
  150. //doc.AddMember(JSON_ROOT_KEY_VERSION,INTERFACE_VERSION, allocator);
  151. doc.AddMember(JSON_ROOT_KEY_DATA, datas, allocator);
  152. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
  153. }
  154. }
  155. ///升井json
  156. void module_attendance_person::_to_json_card_up_one(std::shared_ptr<card_location_base> card_ptr,
  157. rapidjson::Value& out_datas, rapidjson::Document::AllocatorType& allocator)
  158. {
  159. auto site_area_ptr = card_ptr->get_site_area();
  160. if(!card_ptr->m_display || !site_area_ptr || site_area_ptr->is_invalid())
  161. {
  162. return;
  163. }
  164. auto mine_tool_ptr = card_ptr->get_mine_tool();
  165. rapidjson::Value data(rapidjson::kArrayType);
  166. //卡号
  167. std::string id = tool_other::type_id_to_str(card_ptr->m_type, card_ptr->m_id);
  168. tool_json::push_back(data, id, allocator);
  169. //x,y坐标
  170. data.PushBack(card_ptr->x, allocator);
  171. data.PushBack(card_ptr->y, allocator); //CFunctions::round(card->y_offset_after(),2)
  172. //入井时间戳
  173. uint64_t t = tool_time::to_ms(mine_tool_ptr->m_attendance_start_time); //转为ms
  174. data.PushBack(t, allocator);
  175. //进入区域时间戳
  176. data.PushBack(0, allocator);
  177. //接收时间戳
  178. data.PushBack(0, allocator);
  179. //工作时长
  180. t = tool_time::elapse_ms(mine_tool_ptr->m_attendance_start_time); //转为ms
  181. data.PushBack(t, allocator);
  182. //地图编号
  183. data.PushBack(0, allocator);
  184. //区域编号
  185. data.PushBack(0, allocator);
  186. //部门编号
  187. data.PushBack(card_ptr->m_deptid, allocator);
  188. //状态
  189. data.PushBack(0, allocator);
  190. //运行状态
  191. data.PushBack(card_ptr->m_stat, allocator);
  192. //业务状态
  193. data.PushBack(0, allocator);
  194. //速度
  195. data.PushBack(card_ptr->m_speed, allocator);
  196. out_datas.PushBack(data, allocator);
  197. }