MineCardManager.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #include "MineCardManager.h"
  2. #include "ya_setting.h"
  3. #include "common_tool.h"
  4. #include "mine.h"
  5. CMineCardManager::CMineCardManager()
  6. {
  7. m_minecards = std::make_shared<mine_card_info>();
  8. }
  9. std::shared_ptr<mine_card_info> CMineCardManager::GetMineCards()
  10. {
  11. return m_minecards;
  12. }
  13. /**
  14. * @brief 获取事件ID
  15. **/
  16. uint64_t CMineCardManager::GetMineEventId(int evType)
  17. {
  18. return event_list::to_list_id(static_cast<EVENT_TYPE>(evType),OT_MINE,0,0);
  19. }
  20. bool CMineCardManager::Exist(SET_CARDID &list,uint64_t id)
  21. {
  22. if (list.find(id) == list.end())
  23. {
  24. return false;
  25. }
  26. return true;
  27. }
  28. bool CMineCardManager::Exist(SET_CARDID &list,int card_id,int card_type)
  29. {
  30. return Exist(list,tool_other::type_id_to_u64(card_type,card_id));
  31. }
  32. /**
  33. * @brief 创建警告开始事件
  34. * @param evType 警告类型
  35. * @param limitVal 限制数据(阀门值)
  36. * @param curVal 当前数据
  37. **/
  38. void CMineCardManager::StartEvent(int evType,int limitVal,int curVal)
  39. {
  40. int oldState = EVENT_STATUS::ES_END;
  41. uint64_t evid = this->GetMineEventId(evType);
  42. auto ev_ptr = event_list::instance()->get(evid);
  43. if (nullptr != ev_ptr)
  44. {
  45. oldState = ev_ptr->m_status;
  46. }
  47. else
  48. {
  49. ev_ptr = event_list::instance()->create_event_mine(0,(EVENT_TYPE)evType);
  50. if (nullptr == ev_ptr)
  51. {
  52. //打印日志
  53. log_error("CMineCardManager::StartEvent: Create Event Fail.evid=%%llu evType=%d,evState=ES_START ",evid,evType);
  54. return ;
  55. }
  56. ev_ptr->m_obj_id = "0";
  57. event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr);
  58. }
  59. ev_ptr->m_status = EVENT_STATUS::ES_START;
  60. ev_ptr->m_cur_value= curVal;
  61. ev_ptr->m_limit_value = limitVal;
  62. ev_ptr->m_is_display = false;
  63. ev_ptr->m_cur_time = std::chrono::system_clock::now();;
  64. if (oldState == EVENT_STATUS::ES_END)
  65. {
  66. event_list::instance()->save_event(ev_ptr);
  67. }
  68. if (evType < MAX_MINE_EVENT_NUM)
  69. {
  70. m_evlist[evType] = evid;
  71. }
  72. log_info("CMineCardManager::StartEvent: Create Success .id=%%llu -%%llu evType=%d,evState=ES_START ",evid,ev_ptr->get_list_id(),evType);
  73. }
  74. /**
  75. * @brief 取消警告事件
  76. * @param evType 警告类型
  77. * @param curVal 当前数据
  78. **/
  79. void CMineCardManager::CancelEvent(int evType,int curVal)
  80. {
  81. uint64_t evid = this->GetMineEventId(evType);
  82. auto ev_ptr = event_list::instance()->get(evid);
  83. if (nullptr == ev_ptr)
  84. {
  85. //打印日志
  86. log_errno("CMineCardManager::CancelEvent: Not Find Event.id=%%llu evType=%d,evState=ES_END ",evid,evType);
  87. return ;
  88. }
  89. if (ev_ptr->m_status == EVENT_STATUS::ES_END)
  90. {
  91. return ;
  92. }
  93. ev_ptr->m_status = EVENT_STATUS::ES_END;
  94. ev_ptr->m_cur_value= curVal;
  95. ev_ptr->m_is_display = false;
  96. ev_ptr->m_cur_time = std::chrono::system_clock::now();;
  97. event_list::instance()->save_event(ev_ptr);
  98. if (evType < MAX_MINE_EVENT_NUM)
  99. {
  100. m_evlist[evType] = 0;
  101. }
  102. log_info("CMineCardManager::CancelEvent: Success .id=%%llu evType=%d,evState=ES_END ",evid,evType);
  103. }
  104. /**
  105. * @brief 人员下井
  106. * @param card 卡
  107. **/
  108. void CMineCardManager::OnPersonDown(std::shared_ptr<card> card,bool bInit/* = false*/)
  109. {
  110. if (nullptr == card)
  111. {
  112. return ;
  113. }
  114. //设置卡的状态
  115. card->m_is_attendance = EAttendanceState::MineDown;
  116. uint64_t key = tool_other::type_id_to_u64(card->m_id,card->m_type);
  117. if (this->Exist(m_minecards->m_down_person,key))
  118. {
  119. return ;
  120. }
  121. //移除升井中的状态
  122. m_minecards->m_up_person.erase(key);
  123. //加入到井下列表中
  124. m_minecards->m_down_person.insert(key);
  125. if(!bInit)
  126. {
  127. //井下超员判断
  128. this->OnPersonOvercrowdingWarning();
  129. }
  130. }
  131. /**
  132. * @brief 人员升井
  133. * @param card 卡
  134. **/
  135. void CMineCardManager::OnPersonUp(std::shared_ptr<card> card)
  136. {
  137. if (nullptr == card)
  138. {
  139. return ;
  140. }
  141. card->m_is_attendance = EAttendanceState::MineUp;
  142. uint64_t key = tool_other::type_id_to_u64(card->m_id,card->m_type);
  143. if (this->Exist(m_minecards->m_up_person,key))
  144. {
  145. return ;
  146. }
  147. //移除井下列表
  148. m_minecards->m_down_person.erase(key);
  149. //加入到升井列表中
  150. m_minecards->m_up_person.insert(key);
  151. int max_person = CYaSetting::m_sys_setting.over_count_person;
  152. //井下超员判断--取消
  153. if (max_person != 0 && (int)m_minecards->m_down_person.size() < max_person )
  154. {
  155. this->CancelEvent(EVENT_TYPE::ET_OVER_COUNT_PERSON,(int)m_minecards->m_down_person.size());
  156. }
  157. }
  158. /**
  159. * @brief 人员超员警告
  160. **/
  161. void CMineCardManager::OnPersonOvercrowdingWarning()
  162. {
  163. int max_person = CYaSetting::m_sys_setting.over_count_person;
  164. //井下超员判断
  165. if (max_person != 0 && (int)m_minecards->m_down_person.size() > max_person )
  166. {
  167. std::string log = "";
  168. for (uint64_t id : m_minecards->m_down_person)
  169. {
  170. std::shared_ptr<card_location_base> pitcard = card_list::instance()->get(id);
  171. if (nullptr != pitcard)
  172. {
  173. log += tool_other::type_id_to_str(pitcard->m_type,pitcard->m_id);
  174. log += "&";
  175. }
  176. }
  177. //打印日志
  178. log_info("[lemon mp_card_list_down_person:]:%s",log.c_str());
  179. this->StartEvent(EVENT_TYPE::ET_OVER_COUNT_PERSON,max_person,(int)m_minecards->m_down_person.size());
  180. }
  181. }
  182. /**
  183. * @brief 人员井下超时
  184. **/
  185. void CMineCardManager::OnPersonInMineOverTime(int card_id,int card_type)
  186. {
  187. std::shared_ptr<card_location_base> card = card_list::instance()->get(tool_other::type_id_to_u64(card_type, card_id));
  188. if (nullptr == card)
  189. {
  190. return ;
  191. }
  192. std::shared_ptr<mine_tool> mine = card->get_mine_tool();
  193. if(nullptr == mine )
  194. {
  195. return ;
  196. }
  197. int sec= tool_time::to_ms(std::chrono::system_clock::now()) - mine->get_work_time();
  198. if (!mine->m_is_overtime && sec > (int)CYaSetting::m_sys_setting.over_time_person)
  199. {
  200. //人员超时
  201. mine->m_is_overtime = true;
  202. mine->m_overtime = std::chrono::system_clock::now();
  203. }
  204. else if (mine->m_is_overtime && sec < (int)CYaSetting::m_sys_setting.over_time_person)
  205. {
  206. mine->m_is_overtime = false;
  207. mine->m_overtime = std::chrono::system_clock::now();
  208. }
  209. else
  210. {
  211. return ;
  212. }
  213. // 发送警告
  214. event_ptr evPtr = event_list::instance()->get_event_card(card->m_id,card->m_type,ET_CARD_OVER_TIME_PERSON);
  215. if (nullptr == evPtr)
  216. {
  217. event_ptr evPtr = event_list::create_event_card(card->m_id, card->m_type, ET_CARD_OVER_TIME_PERSON);
  218. event_list::instance()->copy_event(card, evPtr);
  219. event_list::instance()->add(evPtr->get_list_id(), evPtr);
  220. }
  221. evPtr->m_limit_value = 0;
  222. evPtr->m_cur_value = 0;
  223. evPtr->m_is_display = false;
  224. evPtr->m_status = mine->m_is_overtime ? ES_START : ES_END;
  225. evPtr->m_cur_time = std::chrono::system_clock::now();
  226. event_list::save_event(evPtr);
  227. log_info("OnPersonInMineOverTime: send Event=ET_CARD_OVER_TIME_PERSON card=id,eventState=%d",card->m_id,evPtr->m_status);
  228. }
  229. /**
  230. * @brief 车下井
  231. * @param card 卡
  232. **/
  233. void CMineCardManager::OnVehicleDown(std::shared_ptr<card> card,bool bInit/* = false*/)
  234. {
  235. if (nullptr == card)
  236. {
  237. return ;
  238. }
  239. }
  240. /**
  241. * @brief 车升井
  242. * @param card 卡
  243. **/
  244. void CMineCardManager::OnVehicleUp(std::shared_ptr<card> card)
  245. {
  246. if (nullptr == card)
  247. {
  248. return ;
  249. }
  250. }
  251. /**
  252. * @brief 车辆超员警告
  253. **/
  254. void CMineCardManager::OnVehicleOvercrowdingWarning()
  255. {
  256. }