card.cpp 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295
  1. #include <memory>
  2. #include <log.h>
  3. #include <zloop.h>
  4. #include "select_tool.h"
  5. #include "loc_tool.h"
  6. #include <area.h>
  7. #include <site_area.h>
  8. #include <card.h>
  9. #include "config_file.h"
  10. #include "db_api/CDBSingletonDefine.h"
  11. #include "websocket/wsTimerThread.h"
  12. #include "websocket/wsClientMgr.h"
  13. #include "timestamp.h"
  14. #include "monkey_car/monkeycar_area.h"
  15. #include "monkey_car/monkeycar_person.h"
  16. #include "special_area.h"
  17. #include "cardMgr.h"
  18. #include "ant.h"
  19. #include "mine.h"
  20. #include "module_service/module_mgr.h"
  21. #include "visit.h"
  22. #include "his_location.h"
  23. #include "three_rates.h"
  24. #include "mine_module/MineCardManager.h"
  25. extern config_file config;
  26. //一张卡一个ct的所有不同天线的信息
  27. struct one_ct_message_handle
  28. {
  29. static loc_tool_main m_loc_tool;
  30. ev::timer m_min_timer,m_max_timer;
  31. //loc_message.
  32. std::vector<loc_message> m_msg_list;
  33. card_location_base*m_card;
  34. const algo_config*m_ac=nullptr;
  35. int m_ct;
  36. bool m_min_timeout=false;
  37. ev::dynamic_loop * m_loop = nullptr;
  38. one_ct_message_handle(card_location_base*card)
  39. {
  40. m_card=card;
  41. m_ct=-1;
  42. }
  43. void reset()
  44. {
  45. m_ct=-1;
  46. m_min_timeout=false;
  47. m_msg_list.clear();
  48. }
  49. void on_min_timer()
  50. {
  51. m_min_timer.stop();
  52. if((int)m_msg_list.size()>=m_ac->best_msg_cnt)
  53. {
  54. m_max_timer.stop();
  55. calc_location();
  56. return;
  57. }
  58. m_min_timeout=true;
  59. }
  60. void on_max_timer()
  61. {
  62. m_max_timer.stop();
  63. calc_location();
  64. }
  65. void set(ev::dynamic_loop * loop)
  66. {
  67. m_loop = loop;
  68. m_min_timer.set(*m_loop);
  69. m_min_timer.set<one_ct_message_handle,&one_ct_message_handle::on_min_timer>(this);
  70. m_max_timer.set(*m_loop);
  71. m_max_timer.set<one_ct_message_handle,&one_ct_message_handle::on_max_timer>(this);
  72. }
  73. void on_message(ev::dynamic_loop *loop,const message_locinfo&loc)
  74. {
  75. if(m_loop == nullptr && loop!=nullptr)
  76. set(loop);
  77. else if(loop == nullptr)
  78. return;
  79. if(!m_msg_list.empty()&& m_ct!=loc.m_card_ct)
  80. {
  81. m_msg_list.clear();
  82. }
  83. auto sitPtr = sit_list::instance()->get(loc.m_site_id);
  84. if(sitPtr==nullptr)
  85. {
  86. log_warn("分站信息缺失,SitId:%d",loc.m_site_id);
  87. return;
  88. }
  89. const site &s=*(sit_list::instance()->get(loc.m_site_id));
  90. if(m_msg_list.empty())
  91. {
  92. m_ct=loc.m_card_ct;
  93. m_ac=&s.config();
  94. m_min_timeout=false;
  95. //这里构造loc_message 保存数据
  96. m_msg_list.push_back(loc_message(s,loc.m_tof,loc.m_time_stamp,loc.m_card_id,
  97. loc.m_card_ct,loc.m_card_type,loc.m_ant_id,loc.m_rav,loc.m_acc,
  98. loc.m_sync_ct,loc.m_rssi));
  99. //启动本CT的最小、最大两个定时器
  100. m_min_timer.start(m_ac->min_wait_time);
  101. m_max_timer.start(m_ac->min_wait_time);
  102. return;
  103. }
  104. m_msg_list.push_back(loc_message(s,loc.m_tof,loc.m_time_stamp,loc.m_card_id,
  105. loc.m_card_ct,loc.m_card_type,loc.m_ant_id,loc.m_rav,loc.m_acc,
  106. loc.m_sync_ct,loc.m_rssi));
  107. if(m_min_timeout && (int)m_msg_list.size()>=m_ac->best_msg_cnt)
  108. {
  109. calc_location();
  110. m_max_timer.stop();
  111. }
  112. }
  113. void calc_location()
  114. {
  115. log_info("calc_location:%d begin",m_card->m_id);
  116. auto v = m_msg_list;
  117. std::vector<point> rc=std::move(m_loc_tool.calc_location(v));
  118. if(!rc.empty()) m_card->on_location(std::move(rc),v);
  119. reset();
  120. log_info("calc_location:%d end",m_card->m_id);
  121. }
  122. };
  123. struct card_message_handle
  124. {
  125. card_location_base*m_card;
  126. std::array<one_ct_message_handle*,16> m_ct_list;
  127. card_message_handle(card_location_base*card)
  128. {
  129. m_card=card;
  130. for(size_t i=0;i<m_ct_list.size();i++)
  131. {
  132. m_ct_list[i]=new one_ct_message_handle(card);
  133. }
  134. }
  135. ~card_message_handle()
  136. {
  137. for(auto&it:m_ct_list)
  138. {
  139. delete it;
  140. }
  141. }
  142. void on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history)
  143. {
  144. if(is_history)
  145. {
  146. log_warn("%s","当前代码没有处理历史消息记录。");
  147. return;
  148. }
  149. //
  150. m_card->site_hover(loc.m_site_id);
  151. if(loc.m_batty_status == 2)
  152. {
  153. m_card->do_status(STATUS_POWER_LOWER_SERIOUS);
  154. }
  155. else
  156. {
  157. m_card->do_status(STATUS_POWER_NOMARL);
  158. }
  159. if(loc.m_callinfo & 0x80)
  160. {
  161. m_card->do_status(STATUS_HELP);
  162. }
  163. if((loc.m_callinfo & 0x01) || (loc.m_callinfo & 0x02))
  164. {
  165. m_card->do_status(STATUS_CALL);
  166. }
  167. m_ct_list[loc.m_card_ct&(m_ct_list.size()-1)]->on_message(loop,loc);
  168. }
  169. };
  170. struct card_area
  171. {
  172. card_area()
  173. {
  174. m_site_area.reset(new site_area_hover);
  175. m_area_tool.reset(new area_tool);
  176. m_mine_tool.reset(new mine_tool);
  177. }
  178. std::shared_ptr<site_area_hover> m_site_area=nullptr;
  179. std::shared_ptr<area_tool> m_area_tool=nullptr;
  180. std::shared_ptr<mine_tool> m_mine_tool=nullptr;
  181. };
  182. struct person:card_location_base, card_area
  183. {
  184. std::weak_ptr<monkey_person> m_monkeyPerson;
  185. int m_workLine=0;
  186. person(std::string type,uint32_t cardid,uint16_t needdisplay,int16_t t,int32_t deptid,int32_t level_id,uint32_t cid,int wl)
  187. :card_location_base(type,cardid,needdisplay,t,deptid,level_id,cid)
  188. ,m_workLine(wl)
  189. {
  190. m_message_handle.reset(new card_message_handle(this));
  191. m_his_location_card.reset(new location_staff(m_id,m_type));
  192. }
  193. void on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history)
  194. {
  195. m_message_handle->on_message(loop,loc,is_history);
  196. }
  197. void clear()
  198. {
  199. //m_site_area.reset(new site_area_hover);
  200. m_area_tool.reset(new area_tool);
  201. m_mine_tool.reset(new mine_tool);
  202. card_location_base::clear();
  203. }
  204. virtual void site_hover(int sid)
  205. {
  206. if(m_time<=0)
  207. {
  208. return;
  209. }
  210. log_info("__thread_id site_hover:%d,%x [%x]",m_id,std::this_thread::get_id(),m_site_area.get());
  211. m_site_area->on_point(m_id,sid,nullptr, m_type);
  212. }
  213. virtual std::shared_ptr<area_hover> get_area_hover()
  214. {
  215. return m_area_tool->m_area_hover;
  216. }
  217. virtual std::shared_ptr<mine_tool> get_mine_tool()
  218. {
  219. return m_mine_tool;
  220. }
  221. virtual std::shared_ptr<site_area_hover> get_site_area()
  222. {
  223. return m_site_area;
  224. }
  225. virtual void do_business(const point &pt,double acc)
  226. {
  227. m_area_tool->on_point(m_id,pt,m_speed,m_type);
  228. m_site_area->on_point(m_id,0,this, m_type);
  229. handle_three_rates(pt);
  230. }
  231. void reset(std::shared_ptr<monkey_person> mp)
  232. {
  233. m_monkeyPerson = mp;
  234. }
  235. ~person(){}
  236. private:
  237. void handle_three_rates(const point & pt)
  238. {
  239. card_pos cp;
  240. cp.work_line=m_workLine;
  241. cp.biz_stat = get_stat();
  242. cp.x=pt.x;cp.y=pt.y;cp.z=pt.z;
  243. const auto lm = m_area_tool->getLandmark();
  244. cp.enter_time = std::get<0>(lm)*1000;
  245. cp.area_id = std::get<3>(lm);
  246. put_three_rates(cp);
  247. }
  248. void on_timer()
  249. {
  250. if(!m_mine_tool->is_attendance())
  251. return;
  252. YA::_CARD_POS_ cp;
  253. uint64_t _time=0;
  254. point pt = getSmoothPoint(_time);
  255. const auto lm = m_area_tool->getLandmark();
  256. cp.enter_area_time = std::get<0>(lm)*1000;
  257. cp.rec_time = std::get<1>(lm);
  258. int32_t map_id = std::get<2>(lm);
  259. int32_t area_id = std::get<3>(lm);
  260. cp.map_id=map_id;cp.area_id=area_id;
  261. cp.landmark_id = std::get<4>(lm);
  262. cp.lm_direction = std::get<5>(lm);
  263. cp.landmark_dis=std::get<6>(lm);
  264. cp.biz_stat = get_stat();
  265. cp.down_time = m_mine_tool->get_down_time();
  266. cp.work_time = m_mine_tool->get_work_time();
  267. cp.is_on_duty= m_mine_tool->is_on_duty();
  268. log_info("on_timer here ...%d,%lld,%.2f,%.2f,%d,%d",m_id,_time,pt.x,pt.y,area_id,map_id);
  269. m_his_location_card->push(_time,pt,area_id,map_id);
  270. upt_card_pos(cp,pt);
  271. }
  272. point getSmoothPoint(uint64_t& t)
  273. {
  274. point pt;
  275. loc_point lp = m_smo_tool->smooth_strategy();
  276. m_speed = lp.m_speed;
  277. m_stat = lp.m_stat;
  278. pt.x = lp.x;
  279. pt.y = -lp.y;
  280. t=lp.m_time;
  281. if(auto p = m_monkeyPerson.lock() )
  282. {
  283. if(p->is_on_bus())
  284. {
  285. m_stat = 7;
  286. pt = p->getPoint(t);
  287. log_info("getpoint_oncar:%d,%lld",m_id,t);
  288. }
  289. }
  290. return pt;
  291. }
  292. };
  293. struct car:card_location_base,card_area
  294. {
  295. int m_vehicle_category_id=0;
  296. int m_vehicle_type_id=0;
  297. double m_acc =0;
  298. car(std::string type,uint32_t cardid,uint16_t needdisplay,int16_t t,int32_t deptid,
  299. int32_t categoryid, int type_id,int32_t level_id,uint32_t cid)
  300. :card_location_base(type,cardid,needdisplay,t,deptid,level_id,cid)
  301. ,m_vehicle_category_id(categoryid)
  302. ,m_vehicle_type_id(type_id)
  303. {
  304. m_message_handle.reset(new card_message_handle(this));
  305. m_his_location_card.reset(new location_vehicle(m_id,m_type));
  306. }
  307. virtual void site_hover(int sid)
  308. {
  309. if(m_time<=0)
  310. {
  311. return;
  312. }
  313. m_site_area->on_point(m_id,sid,0, m_type);
  314. }
  315. virtual std::shared_ptr<area_hover> get_area_hover()
  316. {
  317. return m_area_tool->m_area_hover;
  318. }
  319. virtual std::shared_ptr<mine_tool> get_mine_tool()
  320. {
  321. return m_mine_tool;
  322. }
  323. virtual std::shared_ptr<site_area_hover> get_site_area()
  324. {
  325. return m_site_area;
  326. }
  327. virtual void do_business(const point &pt,double acc)
  328. {
  329. m_acc=acc;
  330. m_area_tool->on_point(m_id,pt,m_speed,m_type);
  331. m_site_area->on_point(m_id,0,this, m_type);
  332. m_mine_tool->on_point(m_id, m_type, m_vehicle_category_id);
  333. handle_three_rates(pt);
  334. }
  335. int get_vehicle_type_id()
  336. {
  337. return m_vehicle_type_id;
  338. }
  339. ~car(){}
  340. private:
  341. void handle_three_rates(const point &pt)
  342. {
  343. card_pos cp;
  344. cp.biz_stat = get_stat();
  345. cp.x=pt.x;cp.y=pt.y;cp.z=pt.z;
  346. const auto lm = m_area_tool->getLandmark();
  347. cp.enter_time = std::get<0>(lm)*1000;
  348. cp.area_id = std::get<3>(lm);
  349. cp.map_id = std::get<2>(lm);
  350. cp.vibration=m_acc;
  351. put_three_rates(cp);
  352. }
  353. void on_timer()
  354. {
  355. make_package();
  356. }
  357. int statbiz(int32_t special_id)
  358. {
  359. int status = get_stat();
  360. if(status == STATUS_LOST)
  361. {
  362. if(!m_area_tool->special_area())
  363. {
  364. special_id = special_area_list::instance()->get_special_id(m_id,*this,m_vehicle_category_id);
  365. log_info("enter_special_area:%.2f,%2.f,id:%d,special_area_id:%d",x,y,m_id,special_id);
  366. if(special_id != -1)
  367. m_area_tool->change_area(m_id,m_speed,m_type,special_id);//自动拖车
  368. }
  369. }
  370. return status;
  371. }
  372. void make_package()
  373. {
  374. int32_t special_id=-1;
  375. YA::_CARD_POS_ cp;
  376. loc_point pt = getSmoothPoint();
  377. const auto lm = m_area_tool->getLandmark();
  378. cp.enter_area_time = std::get<0>(lm);
  379. cp.rec_time = std::get<1>(lm);
  380. uint32_t map_id = std::get<2>(lm);
  381. uint32_t area_id = std::get<3>(lm);
  382. cp.map_id =map_id;cp.area_id=area_id;
  383. cp.landmark_id = std::get<4>(lm);
  384. cp.lm_direction = std::get<5>(lm);
  385. cp.landmark_dis=std::get<6>(lm);
  386. int32_t biz_stat=statbiz(special_id);
  387. cp.biz_stat=biz_stat;
  388. cp.down_time = m_mine_tool->get_down_time();
  389. cp.work_time = m_mine_tool->get_work_time();
  390. //for now
  391. cp.is_on_duty=m_mine_tool->is_on_duty();
  392. upt_card_pos(cp,pt);
  393. m_his_location_card->push(pt.m_time,pt,area_id,map_id);
  394. if(biz_stat==STATUS_LOST && special_id != -1 && m_display==1)
  395. {
  396. cp.area_id = special_id;
  397. swsClientMgr.SendSpecialAreaProcess(cp);
  398. }
  399. }
  400. loc_point getSmoothPoint()
  401. {
  402. loc_point lp = m_smo_tool->smooth_strategy();
  403. m_speed = lp.m_speed;
  404. m_stat = lp.m_stat;
  405. lp.y = -lp.y;
  406. return lp;
  407. }
  408. };
  409. loc_tool_main one_ct_message_handle::m_loc_tool;
  410. uint64_t card_list::getId(uint32_t cardid,uint64_t type)
  411. {
  412. return type<<32|cardid;
  413. }
  414. void card_list::init_staffer(int64_t id64)
  415. {
  416. std::string strategy = config.get("person.strategy","person1");
  417. std::string sql = "SELECT staff_id, s.card_id, c.card_type_id, s.dept_id, s.group_id, s.occupation_id, \
  418. ol.occupation_level_id,s.worktype_id,s.need_display,s.work_line\
  419. FROM dat_staff_extend s \
  420. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  421. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  422. LEFT JOIN dat_occupation_level ol ON ol.occupation_level_id = o.occupation_level_id \
  423. WHERE s.duty_id = 0 AND c.state_id = 0";
  424. std::string card_id_str = tool_other::to13str(id64);
  425. if(-1 == id64)
  426. {
  427. sql.append(";");
  428. }
  429. else
  430. {
  431. sql.append(" AND s.card_id = '");
  432. sql.append(card_id_str);
  433. sql.append("';");
  434. std_debug("基础数据 增加或修改人卡 sql=%s", sql.c_str());
  435. log_info("基础数据 增加或修改人卡 sql=%s", sql.c_str());
  436. }
  437. std::string Error;
  438. YADB::CDBResultSet DBRes;
  439. sDBConnPool.Query(sql.c_str(),DBRes,Error);
  440. int nCount = DBRes.GetRecordCount( Error );
  441. if (nCount < 1)
  442. {
  443. log_error("增加或修改失败,数据库中找不到: card_id=%s", card_id_str.c_str());
  444. return ;
  445. }
  446. std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
  447. while ( DBRes.GetNextRecod(Error) )
  448. {
  449. unsigned int staff_id = 0;
  450. DBRes.GetField( "staff_id",staff_id, Error );
  451. std::string card_id;
  452. DBRes.GetField( "card_id",card_id, Error );
  453. uint32_t vsid = atoi(card_id.substr(3).c_str());
  454. unsigned int card_type_id = 0;
  455. DBRes.GetField( "card_type_id",card_type_id, Error );
  456. int dept_id = 0;
  457. DBRes.GetField( "dept_id",dept_id, Error );
  458. int group_id = 0;
  459. DBRes.GetField( "group_id",group_id, Error );
  460. int occupation_id = 0;
  461. DBRes.GetField( "occupation_id",occupation_id, Error );
  462. int occupation_level_id = 0;
  463. DBRes.GetField( "occupation_level_id",occupation_level_id, Error );
  464. int need_display = 0;
  465. DBRes.GetField( "need_display",need_display, Error );
  466. int work_line = 0;
  467. DBRes.GetField( "work_line",work_line, Error );
  468. //for now;
  469. //staff_id = vsid;
  470. if(-1 == id64)
  471. {
  472. std::shared_ptr<card_location_base> clb =
  473. std::make_shared<person>(strategy,vsid,need_display,card_type_id,dept_id,occupation_level_id,staff_id,work_line);
  474. uint64_t cardid = getId(vsid,card_type_id);
  475. log_info("cardId:%llu,id:%d dept_id:%d,need_display:%d,card:%s:work_line:%d,staff_id:%d,type:%d",
  476. cardid,vsid,dept_id,need_display,card_id.c_str(),work_line,staff_id,card_type_id);
  477. map.insert({cardid,clb});
  478. }
  479. else
  480. {
  481. auto card_id64 = card_list::to_id64(card_type_id, tool_other::id64_to_id(card_id));
  482. auto card_ptr = card_list::instance()->get(card_id64);
  483. if(card_ptr)
  484. {
  485. person* tmp_ptr= static_cast<person*>(card_ptr.get());
  486. tmp_ptr->m_display = static_cast<uint16_t>(need_display);
  487. tmp_ptr->m_deptid = dept_id;
  488. //group_id
  489. //occ_id
  490. tmp_ptr->m_level_id = occupation_level_id;
  491. //worktype_id
  492. }
  493. else
  494. {
  495. auto clb = std::make_shared<person>(strategy,vsid,need_display,card_type_id,dept_id,occupation_level_id,staff_id,work_line);
  496. card_list::instance()->add(card_id64, clb);
  497. }
  498. log_info("基础数据 增加或修改人卡成功:卡id:%ld, dept_id:%d,need_display:%d,occupation_level_id:%d",
  499. id64,dept_id,need_display,occupation_level_id);
  500. std_debug("基础数据 增加或修改人卡成功:卡id:%ld, dept_id:%d,need_display:%d,occupation_level_id:%d",
  501. id64,dept_id,need_display,occupation_level_id);
  502. }
  503. }
  504. if(-1 == id64)
  505. {
  506. log_info( "init_staffer. The record count=%d\n", nCount );
  507. card_list::instance()->add(map);
  508. }
  509. }
  510. void card_list::init_vehicle(int64_t id64)
  511. {
  512. std::string strategy = config.get("car.strategy","car1");
  513. std::string sql = "SELECT ve.vehicle_id, ve.card_id, c.card_type_id, \
  514. ve.dept_id, ve.group_id, v.vehicle_type_id, vt.vehicle_level_id, \
  515. vt.is_railroad AS vt_is_railroad,ve.need_display ,ve.power_alarm,\
  516. vt.vehicle_category_id,v.bigger_car_flag,vc.over_speed \
  517. FROM dat_vehicle_extend ve \
  518. LEFT JOIN dat_vehicle v ON ve.vehicle_id = v.vehicle_id \
  519. LEFT JOIN dat_card c ON ve.card_id = c.card_id \
  520. LEFT JOIN dat_dept d ON ve.dept_id = d.dept_id \
  521. LEFT JOIN dat_group g ON ve.group_id = g.group_id \
  522. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  523. LEFT JOIN dat_vehicle_category vc ON vc.vehicle_category_id = vt.vehicle_category_id \
  524. WHERE c.state_id = 0";
  525. std::string card_id_str = tool_other::to13str(id64);
  526. if(-1 == id64)
  527. {
  528. sql.append(";");
  529. }
  530. else
  531. {
  532. sql.append(" AND ve.card_id ='");
  533. sql.append(card_id_str);
  534. sql.append("';");
  535. std_debug("基础数据 增加或修改车卡 sql=%s", sql.c_str());
  536. log_info("基础数据 增加或修改车卡 sql=%s", sql.c_str());
  537. }
  538. std::string Error;
  539. YADB::CDBResultSet DBRes;
  540. sDBConnPool.Query(sql.c_str(),DBRes,Error);
  541. int nCount = DBRes.GetRecordCount( Error );
  542. if (nCount < 1)
  543. {
  544. log_error("增加或修改失败,数据库中找不到: card_id=%s", card_id_str.c_str());
  545. return ;
  546. }
  547. std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
  548. while ( DBRes.GetNextRecod(Error) )
  549. {
  550. unsigned int vehicle_id = 0;
  551. DBRes.GetField( "vehicle_id",vehicle_id, Error );
  552. std::string card_id;
  553. DBRes.GetField( "card_id",card_id, Error );
  554. uint32_t vsid = atoi(card_id.substr(3).c_str());
  555. unsigned int card_type_id = 0;
  556. DBRes.GetField( "card_type_id",card_type_id, Error );
  557. int dept_id = 0;
  558. DBRes.GetField( "dept_id",dept_id, Error );
  559. int group_id = 0;
  560. DBRes.GetField( "group_id",group_id, Error );
  561. int vehicle_type_id = 0;
  562. DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
  563. int vehicle_level_id = 0;
  564. DBRes.GetField( "vehicle_level_id",vehicle_level_id, Error );
  565. int need_display = 0;
  566. DBRes.GetField( "need_display",need_display, Error );
  567. int power_alarm = 0;
  568. DBRes.GetField( "power_alarm",power_alarm, Error );
  569. int vehicle_category_id = 0;
  570. DBRes.GetField( "vehicle_category_id",vehicle_category_id, Error );
  571. int bigger_car_flag= 0;
  572. DBRes.GetField( "bigger_car_flag",bigger_car_flag, Error );
  573. double over_speed= 0;
  574. DBRes.GetField( "over_speed",over_speed, Error );
  575. //for now
  576. //vehicle_id = vsid;
  577. if(-1 == id64)
  578. {
  579. auto clb = std::make_shared<car>(strategy,vsid,need_display,card_type_id,
  580. dept_id,vehicle_category_id, vehicle_type_id,vehicle_level_id,vehicle_id);
  581. uint64_t cardid = getId(vsid,card_type_id);
  582. log_info("cardId:%llu,id:%d dept_id:%d,need_display:%d-cardid:%s,categoryid:%d,vchile_id:%d,type:%d",
  583. cardid,vsid,dept_id,need_display,card_id.c_str(),vehicle_category_id,vehicle_id,card_type_id);
  584. map.insert({cardid,clb});
  585. }
  586. else
  587. {
  588. auto card_id64 = card_list::to_id64(card_type_id, tool_other::id64_to_id(card_id));
  589. auto card_ptr = card_list::instance()->get(card_id64);
  590. if(card_ptr)
  591. {
  592. car* tmp_ptr= static_cast<car*>(card_ptr.get());
  593. tmp_ptr->m_display = static_cast<uint16_t>(need_display);
  594. tmp_ptr->m_deptid = dept_id;
  595. tmp_ptr->m_vehicle_category_id = vehicle_category_id;
  596. tmp_ptr->m_vehicle_type_id = vehicle_type_id;
  597. tmp_ptr->m_level_id = vehicle_level_id;
  598. }
  599. else
  600. {
  601. auto clb = std::make_shared<car>(strategy,vsid,need_display,card_type_id,dept_id,
  602. vehicle_category_id, vehicle_type_id,vehicle_level_id,vehicle_id);
  603. card_list::instance()->add(card_id64, clb);
  604. }
  605. log_info("基础数据 增加或修改车卡成功:卡id:%ld, dept_id:%d,need_display:%d,categoryid:%d",
  606. id64,dept_id,need_display,vehicle_category_id);
  607. std_debug("基础数据 增加或修改车卡成功:卡id:%ld, dept_id:%d,need_display:%d,categoryid:%d",
  608. id64,dept_id,need_display,vehicle_category_id);
  609. }
  610. }
  611. if(-1 == id64)
  612. {
  613. log_info( "init_vehicle. The record count=%d\n", nCount );
  614. card_list::instance()->add(map);
  615. }
  616. }
  617. #if 0
  618. void card_list::init_vehicle()
  619. {
  620. std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
  621. std::string strategy = config.get("car.strategy","car1");
  622. const char *sql = "SELECT ve.vehicle_id, ve.card_id, c.card_type_id, \
  623. ve.dept_id, ve.group_id, v.vehicle_type_id, vt.vehicle_level_id, \
  624. vt.is_railroad AS vt_is_railroad,ve.need_display ,ve.power_alarm,\
  625. vt.vehicle_category_id,v.bigger_car_flag,vc.over_speed \
  626. FROM dat_vehicle_extend ve \
  627. LEFT JOIN dat_vehicle v ON ve.vehicle_id = v.vehicle_id \
  628. LEFT JOIN dat_card c ON ve.card_id = c.card_id \
  629. LEFT JOIN dat_dept d ON ve.dept_id = d.dept_id \
  630. LEFT JOIN dat_group g ON ve.group_id = g.group_id \
  631. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  632. LEFT JOIN dat_vehicle_category vc ON vc.vehicle_category_id = vt.vehicle_category_id \
  633. WHERE c.card_type_id = 2 AND c.state_id = 0;";
  634. std::string Error;
  635. YADB::CDBResultSet DBRes;
  636. sDBConnPool.Query(sql,DBRes,Error);
  637. int nCount = DBRes.GetRecordCount( Error );
  638. if (nCount > 0)
  639. {
  640. log_info( "init_vehicle. The record count=%d\n", nCount );
  641. while ( DBRes.GetNextRecod(Error) )
  642. {
  643. unsigned int vehicle_id = 0;
  644. DBRes.GetField( "vehicle_id",vehicle_id, Error );
  645. std::string card_id;
  646. DBRes.GetField( "card_id",card_id, Error );
  647. uint32_t vsid = atoi(card_id.substr(3).c_str());
  648. unsigned int card_type_id = 0;
  649. DBRes.GetField( "card_type_id",card_type_id, Error );
  650. int dept_id = 0;
  651. DBRes.GetField( "dept_id",dept_id, Error );
  652. int group_id = 0;
  653. DBRes.GetField( "group_id",group_id, Error );
  654. int vehicle_type_id = 0;
  655. DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
  656. int vehicle_level_id = 0;
  657. DBRes.GetField( "vehicle_level_id",vehicle_level_id, Error );
  658. int need_display = 0;
  659. DBRes.GetField( "need_display",need_display, Error );
  660. int power_alarm = 0;
  661. DBRes.GetField( "power_alarm",power_alarm, Error );
  662. int vehicle_category_id = 0;
  663. DBRes.GetField( "vehicle_category_id",vehicle_category_id, Error );
  664. int bigger_car_flag= 0;
  665. DBRes.GetField( "bigger_car_flag",bigger_car_flag, Error );
  666. double over_speed= 0;
  667. DBRes.GetField( "over_speed",over_speed, Error );
  668. //for now
  669. vehicle_id = vsid;
  670. std::shared_ptr<card_location_base> clb = std::make_shared<car>(strategy,vehicle_id,
  671. need_display,card_type_id,dept_id,vehicle_category_id, vehicle_type_id,vehicle_level_id);
  672. uint64_t cardid = getId(vehicle_id,2);
  673. log_info("cardId:%llu,vehicle_id:%d dept_id:%d,need_display:%d---cardid:%s,categoryid:%d",cardid,vehicle_id,dept_id,need_display,card_id.c_str(),vehicle_category_id);
  674. map.insert({cardid,clb});
  675. }
  676. }
  677. card_list::instance()->add(map);
  678. }
  679. void card_list::init_staffer()
  680. {
  681. std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
  682. std::string strategy = config.get("person.strategy","person1");
  683. const char *sql = "SELECT staff_id, s.card_id, c.card_type_id, s.dept_id, s.group_id, s.occupation_id, \
  684. ol.occupation_level_id,s.worktype_id,s.need_display \
  685. FROM dat_staff_extend s \
  686. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  687. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  688. LEFT JOIN dat_occupation_level ol ON ol.occupation_level_id = o.occupation_level_id \
  689. WHERE c.card_type_id = 1 AND s.duty_id = 0 AND c.state_id = 0;";
  690. std::string Error;
  691. YADB::CDBResultSet DBRes;
  692. sDBConnPool.Query(sql,DBRes,Error);
  693. int nCount = DBRes.GetRecordCount( Error );
  694. if (nCount > 0)
  695. {
  696. log_info( "init_staffer. The record count=%d\n", nCount );
  697. while ( DBRes.GetNextRecod(Error) )
  698. {
  699. unsigned int staff_id = 0;
  700. DBRes.GetField( "staff_id",staff_id, Error );
  701. std::string card_id;
  702. DBRes.GetField( "card_id",card_id, Error );
  703. uint32_t vsid = atoi(card_id.substr(3).c_str());
  704. unsigned int card_type_id = 0;
  705. DBRes.GetField( "card_type_id",card_type_id, Error );
  706. int dept_id = 0;
  707. DBRes.GetField( "dept_id",dept_id, Error );
  708. int group_id = 0;
  709. DBRes.GetField( "group_id",group_id, Error );
  710. int occupation_id = 0;
  711. DBRes.GetField( "occupation_id",occupation_id, Error );
  712. int occupation_level_id = 0;
  713. DBRes.GetField( "occupation_level_id",occupation_level_id, Error );
  714. int need_display = 0;
  715. DBRes.GetField( "need_display",need_display, Error );
  716. //for now;
  717. staff_id = vsid;
  718. std::shared_ptr<card_location_base> clb = std::make_shared<person>(strategy,staff_id,need_display,card_type_id,dept_id,occupation_level_id);
  719. uint64_t cardid = getId(staff_id,1);
  720. log_info("cardId:%llu,staff_id:%d dept_id:%d,need_display:%d--c-ard:%s",cardid,staff_id,dept_id,need_display,card_id.c_str());
  721. map.insert({cardid,clb});
  722. }
  723. }
  724. card_list::instance()->add(map);
  725. }
  726. #endif
  727. void card_list::init_card_from_db()
  728. {
  729. init_staffer(-1);
  730. init_vehicle(-1);
  731. }
  732. void card_list::load_his_card_postion_from_db()
  733. {
  734. load_his_card_postion_vehicle();
  735. load_his_card_postion_staff();
  736. run();
  737. for(auto&iter: m_map)
  738. {
  739. auto card_ptr = iter.second;
  740. auto mine_tool_ptr = card_ptr->get_mine_tool();
  741. if(mine_tool_ptr->is_attendance())
  742. {
  743. auto str = tool_time::to_str_ex( tool_time::to_ms(mine_tool_ptr->m_attendance_start_time));
  744. std_debug("加载考勤,考勤开始时间: %s, 卡id=%d,卡type=%d", str.c_str(), card_ptr->m_id, card_ptr->m_type);
  745. log_info("加载考勤,考勤开始时间: %s, 卡id=%d,卡type=%d", str.c_str(), card_ptr->m_id, card_ptr->m_type);
  746. //还在考勤中表示,还在井下(初始化话数据)
  747. if(card_ptr->is_person())
  748. {
  749. CMineCardManager::instance()->OnPersonDown(card_ptr,true);
  750. }
  751. if(card_ptr->is_vehicle())
  752. {
  753. CMineCardManager::instance()->OnVehicleDown(card_ptr,true);
  754. }
  755. }
  756. }
  757. //初始化后检查是否超员
  758. CMineCardManager::instance()->OnPersonOvercrowdingWarning();
  759. CMineCardManager::instance()->OnVehicleOvercrowdingWarning();
  760. auto area_map = area_list::instance()->m_map;
  761. for(auto&iter: area_map)
  762. {
  763. auto area_ptr = iter.second;
  764. if(area_ptr->m_person_count)
  765. {
  766. std_debug("加载区域人数: 区域id=%d,区域人数=%d",area_ptr->m_id, area_ptr->m_person_count.load());
  767. log_info("加载区域人数: 区域id=%d,区域人数=%d",area_ptr->m_id, area_ptr->m_person_count.load());
  768. }
  769. if(area_ptr->m_vehicle_count)
  770. {
  771. std_debug("加载区域车数: 区域id=%d,区域车数=%d",area_ptr->m_id, area_ptr->m_vehicle_count.load());
  772. log_info("加载区域车数: 区域id=%d,区域车数=%d",area_ptr->m_id, area_ptr->m_vehicle_count.load());
  773. }
  774. }
  775. }
  776. void card_list::load_his_card_postion_vehicle()
  777. {
  778. const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.map_id, la.area_id, l.state, \
  779. case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
  780. l.mileage, la.enter_time, att.start_time, \
  781. att.end_time, \
  782. l.landmark_id, l.direction_mapper_id, l.landmark_dist \
  783. from rt_location l, rt_location_area la, rt_att_vehicle att, dat_card c, dat_vehicle_extend v \
  784. where l.card_id = c.card_id and l.card_id = la.card_id and l.card_id = att.card_id and l.card_id=v.card_id \
  785. and c.state_id=0;";
  786. std::string Error;
  787. YADB::CDBResultSet DBRes;
  788. sDBConnPool.Query(sql,DBRes,Error);
  789. if(!Error.empty())
  790. log_error("load_his_card_postion_vehicle列表 Error,%s",Error.c_str());
  791. uint64_t nCount = DBRes.GetRecordCount( Error );
  792. if (nCount > 0)
  793. {
  794. log_info( "load_his_card_postion_vehicle. The record count=%ld\n", nCount );
  795. while ( DBRes.GetNextRecod(Error) )
  796. {
  797. std::string card_id = "";
  798. DBRes.GetField( "card_id",card_id, Error );
  799. uint32_t id = tool_other::id64_to_id(card_id);
  800. int type = tool_other::id64_to_type(card_id);
  801. auto temp_ptr = card_list::instance()->get(card_list::to_id64(type, id));
  802. if(!temp_ptr || !temp_ptr->is_vehicle())
  803. {
  804. log_error("全局卡列表中找不到卡,卡id=%d,卡type=%d", id, type);
  805. continue;
  806. }
  807. auto card_ptr = static_cast<car*>(temp_ptr.get());
  808. double x = 0;
  809. DBRes.GetField( "x",x, Error );
  810. double y = 0;
  811. DBRes.GetField( "y",y, Error );
  812. double z = 0;
  813. DBRes.GetField( "z",z, Error );
  814. int map_id = 0;
  815. DBRes.GetField( "map_id",map_id, Error );
  816. int area_id = 0;
  817. DBRes.GetField( "area_id",area_id, Error );
  818. int state = 0;
  819. DBRes.GetField( "state",state, Error );
  820. double speed = 0;
  821. DBRes.GetField( "speed",speed, Error );
  822. std::string enter_time = "";
  823. DBRes.GetField( "enter_time",enter_time, Error );
  824. std::string start_time = "";
  825. DBRes.GetField( "start_time",start_time, Error );
  826. std::string end_time = "";
  827. DBRes.GetField( "end_time",end_time, Error );
  828. int landmark_id = 0;
  829. DBRes.GetField( "landmark_id",landmark_id, Error );
  830. int direction_mapper_id = 0;
  831. DBRes.GetField( "direction_mapper_id",direction_mapper_id, Error );
  832. double landmark_dist = 0;
  833. DBRes.GetField( "landmark_dist",landmark_dist, Error );
  834. card_ptr->x = x;
  835. card_ptr->y = y;
  836. card_ptr->z = z;
  837. auto area = area_list::instance()->get(area_id);
  838. if(area == nullptr)
  839. {
  840. log_error("load_vehicle...area_list 找不到区域:区域id=%d", area_id);
  841. continue;
  842. }
  843. area->m_vehicle_count++;
  844. point pt = *card_ptr;
  845. card_ptr->m_area_tool->m_area_hover = std::make_shared<area_hover>( area, pt,speed);
  846. auto area_hover_ptr = card_ptr->get_area_hover();
  847. auto e_t = tool_time::to_time_ex(enter_time);
  848. area_hover_ptr->m_enter_time = std::chrono::system_clock::to_time_t(e_t);
  849. //int map_id = 0;
  850. //int state = 0;
  851. card_ptr->m_speed = speed;
  852. if(end_time.empty())
  853. {
  854. auto mine_tool_ptr = card_ptr->get_mine_tool();
  855. mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
  856. mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
  857. }
  858. area_hover_ptr->landmark_id = landmark_id;
  859. area_hover_ptr->landmark_dir = direction_mapper_id;
  860. area_hover_ptr->landmark_dis = landmark_dist;
  861. card_ptr->m_time = tool_time::now_to_ms();
  862. }
  863. }
  864. }
  865. void card_list::load_his_card_postion_staff()
  866. {
  867. const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.map_id, la.area_id, l.state, \
  868. case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
  869. l.mileage, la.enter_time, att.start_time, \
  870. att.end_time, \
  871. l.landmark_id, l.direction_mapper_id, l.landmark_dist \
  872. from rt_location l, rt_location_area la, rt_att_staff att, dat_card c, dat_staff_extend s \
  873. where l.card_id = c.card_id and l.card_id = la.card_id and l.card_id = att.card_id and l.card_id=s.card_id\
  874. and c.state_id=0;";
  875. std::string Error;
  876. YADB::CDBResultSet DBRes;
  877. sDBConnPool.Query(sql,DBRes,Error);
  878. if(!Error.empty())
  879. log_error("load_his_card_postion_staff列表 Error,%s",Error.c_str());
  880. uint64_t nCount = DBRes.GetRecordCount( Error );
  881. if (nCount > 0)
  882. {
  883. log_info( "load_his_card_postion_staff. The record count=%ld\n", nCount );
  884. while ( DBRes.GetNextRecod(Error) )
  885. {
  886. std::string end_time = "";
  887. DBRes.GetField( "end_time",end_time, Error );
  888. if(!end_time.empty()) // 已升井,不再读入
  889. {
  890. continue;
  891. }
  892. std::string card_id = "";
  893. DBRes.GetField( "card_id",card_id, Error );
  894. uint32_t id = tool_other::id64_to_id(card_id);
  895. int type = tool_other::id64_to_type(card_id);
  896. auto temp_ptr = card_list::instance()->get(card_list::to_id64(type, id));
  897. if(!temp_ptr || !temp_ptr->is_person())
  898. {
  899. log_error("全局卡列表中找不到卡,卡id=%d,卡type=%d", id, type);
  900. continue;
  901. }
  902. auto card_ptr = static_cast<car*>(temp_ptr.get());
  903. double x = 0;
  904. DBRes.GetField( "x",x, Error );
  905. double y = 0;
  906. DBRes.GetField( "y",y, Error );
  907. double z = 0;
  908. DBRes.GetField( "z",z, Error );
  909. int map_id = 0;
  910. DBRes.GetField( "map_id",map_id, Error );
  911. int area_id = 0;
  912. DBRes.GetField( "area_id",area_id, Error );
  913. int state = 0;
  914. DBRes.GetField( "state",state, Error );
  915. double speed = 0;
  916. DBRes.GetField( "speed",speed, Error );
  917. std::string enter_time = "";
  918. DBRes.GetField( "enter_time",enter_time, Error );
  919. std::string start_time = "";
  920. DBRes.GetField( "start_time",start_time, Error );
  921. int landmark_id = 0;
  922. DBRes.GetField( "landmark_id",landmark_id, Error );
  923. int direction_mapper_id = 0;
  924. DBRes.GetField( "direction_mapper_id",direction_mapper_id, Error );
  925. double landmark_dist = 0;
  926. DBRes.GetField( "landmark_dist",landmark_dist, Error );
  927. card_ptr->x = x;
  928. card_ptr->y = y;
  929. card_ptr->z = z;
  930. auto area = area_list::instance()->get(area_id);
  931. if(area == nullptr)
  932. {
  933. log_error("area_list 找不到区域:区域id=%d", area_id);
  934. continue;
  935. }
  936. area->m_person_count++;
  937. point pt = *card_ptr;
  938. card_ptr->m_area_tool->m_area_hover = std::make_shared<area_hover>(area,pt,speed);
  939. auto area_hover_ptr = card_ptr->get_area_hover();
  940. auto e_t = tool_time::to_time_ex(enter_time);
  941. area_hover_ptr->m_enter_time = std::chrono::system_clock::to_time_t(e_t);
  942. log_info("load_staff...%d,areaid:%d,mapid:%d",id,area->id(),area->mapid());
  943. //int map_id = 0;
  944. //int state = 0;
  945. card_ptr->m_speed = speed;
  946. if(end_time.empty())
  947. {
  948. auto mine_tool_ptr = card_ptr->get_mine_tool();
  949. mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
  950. mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
  951. }
  952. area_hover_ptr->landmark_id = landmark_id;
  953. area_hover_ptr->landmark_dir = direction_mapper_id;
  954. area_hover_ptr->landmark_dis = landmark_dist;
  955. card_ptr->m_time = tool_time::now_to_ms();
  956. }
  957. }
  958. }
  959. void card_list::on_message(zloop<task*> *loop,const message_locinfo&loc,bool is_history)
  960. {
  961. //std::shared_ptr<card_location_base>c=get(loc.m_card_id);
  962. uint64_t cardid = getId(loc.m_card_id,loc.m_card_type);
  963. const auto c=get(cardid);
  964. if(c==nullptr)
  965. {
  966. log_warn("数据库中未定义该卡的信息,card_id=%d, card_type=%d", loc.m_card_id, loc.m_card_type);
  967. return;
  968. }
  969. log_info("card message:site=%d,ant=%d,card=%d,tof=%lld,rav=%02X,acc=%02X,rssi=%d,stamp=%llu",
  970. loc.m_site_id,loc.m_ant_id,loc.m_card_id,loc.m_tof,loc.m_rav,loc.m_acc,loc.m_rssi,loc.m_time_stamp);
  971. c->on_message(loop,loc,is_history);
  972. }
  973. struct local_visit:visitor<std::shared_ptr<card_location_base>>
  974. {
  975. bool visit(std::shared_ptr<card_location_base> c)
  976. {
  977. c->on_timer();
  978. return true;
  979. }
  980. };
  981. // TODO : 停止进程
  982. void card_list::onStopRun()
  983. {
  984. card_list::instance()->m_bflag = true;
  985. card_list::instance()->m_pThread->join();
  986. }
  987. void card_list::onTimer()
  988. {
  989. local_visit lv;
  990. while(!m_bflag)
  991. {
  992. card_list::instance()->accept(lv);
  993. std::this_thread::sleep_for(std::chrono::seconds(1));
  994. }
  995. }
  996. //-----------------card_location_base..
  997. card_location_base::card_location_base(std::string type,uint32_t id,uint16_t dis,int16_t t,int32_t deptid,int32_t level_id,uint32_t cid)
  998. :card(id,dis,t,deptid,level_id,cid)
  999. {
  1000. select_tool_manage::instance()->create_tool(type,m_sel_tool,m_smo_tool);
  1001. }
  1002. void card_location_base::do_status(STATUS_CARD st)
  1003. {
  1004. module_mgr::do_status(st, m_id, m_type);
  1005. }
  1006. void card_location_base::on_location(const std::vector<point>&vp,const std::vector<loc_message> &lm )
  1007. {
  1008. //ct timestamp;
  1009. //m_ct = lm[0].m_card_ct;
  1010. //m_time = lm[0].m_loc_time;
  1011. loc_point pt = m_sel_tool->select_solution(vp,lm);
  1012. pt.y=-pt.y;
  1013. if(pt.m_useless)
  1014. {
  1015. x = pt.x;
  1016. y = pt.y;
  1017. //Msg m;
  1018. //m.type=m_type;m.x=(int)x;m.y=(int)y;m.cmd=CMD_HANDLE;m.cardid=m_type<<32|m_id;
  1019. //cardMgr::instance()->tryPut(m);
  1020. double acc = lm[0].m_acc;
  1021. log_info("useful:card_id:%d,ct:%d,timestamp:%llu, loc_point,x:%.2f,y:%.2f acc:%.2f",m_id,m_ct,m_time,pt.x,pt.y,acc);
  1022. do_business(pt,acc);
  1023. }
  1024. }
  1025. void card_location_base::on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history)
  1026. {
  1027. m_ct = loc.m_card_ct;
  1028. m_time = loc.m_time_stamp;
  1029. m_message_handle->on_message(loop,loc,is_history);
  1030. }
  1031. //前端推送位置函数
  1032. void card_location_base::upt_card_pos(YA::_CARD_POS_ &cp,const point &pt)
  1033. {
  1034. cp.x = pt.x;
  1035. cp.y = pt.y;
  1036. cp.z = pt.z;
  1037. cp.Type=m_type;
  1038. cp.ID = m_id;
  1039. cp.speed = abs(ceil(m_speed));
  1040. cp.running_stat = m_stat;
  1041. cp.dept_id = m_deptid;
  1042. cp.display=m_display;
  1043. cp.rec_time=m_time;
  1044. cp.level_id = m_level_id;
  1045. swsTimerThrd.upt_card_pos(cp);
  1046. }
  1047. void card_location_base::del_card_pos()
  1048. {
  1049. YA::_CARD_POS_ cp;
  1050. cp.ID = m_id;
  1051. cp.Type=m_type;
  1052. swsTimerThrd.del_card_pos(cp);
  1053. }
  1054. int card_location_base::get_stat()
  1055. {
  1056. //盲区>呼救>呼叫>超时>超速>正常
  1057. uint64_t now = time(0)*1000;
  1058. if(now-m_time>CARD_LOST_TIME_OUT)
  1059. {
  1060. return STATUS_LOST;
  1061. }
  1062. else if(auto ev_ptr = event_list::instance()->get_event_card(m_id, m_type, ET_CARD_HELP))
  1063. {
  1064. return (ES_DEAL_HELP == ev_ptr->m_status) ? STATUS_HELP_DEALED : STATUS_HELP;
  1065. }
  1066. else if(CALL_NONE != get_mine_tool()->m_status_call)
  1067. {
  1068. return STATUS_CALL;
  1069. }
  1070. else if(event_list::instance()->get_event_card(m_id, m_type,
  1071. is_person()? ET_CARD_AREA_OVER_TIME_PERSON: ET_CARD_AREA_OVER_TIME_VEHICLE))
  1072. {
  1073. return STATUS_AREA_OVER_TIME;
  1074. }
  1075. else if(event_list::instance()->get_event_card(m_id, m_type, ET_CARD_OVER_SPEED))
  1076. {
  1077. return STATUS_OVER_SPEED;
  1078. }
  1079. return STATUS_NORMAL;
  1080. }
  1081. void card_location_base::clear()
  1082. {
  1083. // uint16_t m_display; //1显示0不显示,往前端推送
  1084. m_speed=0; //速度
  1085. m_is_attendance=0; //井上井下状态 0初始状态 1 井上 2 井下
  1086. m_stat=0; //运动静止状态
  1087. //m_ct; //ct
  1088. m_time=0; //时间戳
  1089. }
  1090. void card_location_base::put_three_rates(card_pos & cp)
  1091. {
  1092. cp.rec_time=m_time;cp.type=m_type;cp.id=m_id;
  1093. cp.identifier_id=m_cid;cp.running_stat=m_stat;cp.final_v=m_speed;
  1094. log_info("three_rates:type:%d,id:%d,cid:%d",cp.type,cp.id,cp.identifier_id);
  1095. three_rates::get_instance()->put(cp);
  1096. }
  1097. bool card_location_base::is_person() const
  1098. {
  1099. return tool_other::is_person(m_type);
  1100. }
  1101. bool card_location_base::is_vehicle() const
  1102. {
  1103. return tool_other::is_vehicle(m_type);
  1104. }
  1105. card_location_base::~card_location_base()
  1106. {
  1107. }
  1108. template<> std::shared_ptr<card_list>
  1109. single_base<card_list, uint64_t, std::shared_ptr<card_location_base>>::m_instance=std::make_shared<card_list>();