card.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  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/CDBConnPool.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 "mine.h"
  18. #include "module_service/module_mgr.h"
  19. extern config_file config;
  20. //一张卡一个ct的所有不同天线的信息
  21. struct one_ct_message_handle
  22. {
  23. static loc_tool_main m_loc_tool;
  24. ev::timer m_min_timer,m_max_timer;
  25. //loc_message.
  26. std::vector<loc_message> m_msg_list;
  27. card_location_base*m_card;
  28. const algo_config*m_ac=nullptr;
  29. int m_ct;
  30. bool m_min_timeout=false;
  31. ev::dynamic_loop * m_loop = nullptr;
  32. one_ct_message_handle(card_location_base*card)
  33. {
  34. m_card=card;
  35. m_ct=-1;
  36. }
  37. void reset()
  38. {
  39. m_ct=-1;
  40. m_min_timeout=false;
  41. m_msg_list.clear();
  42. }
  43. void on_min_timer()
  44. {
  45. m_min_timer.stop();
  46. if((int)m_msg_list.size()>=m_ac->best_msg_cnt)
  47. {
  48. m_max_timer.stop();
  49. calc_location();
  50. return;
  51. }
  52. m_min_timeout=true;
  53. }
  54. void on_max_timer()
  55. {
  56. m_max_timer.stop();
  57. calc_location();
  58. }
  59. void set(ev::dynamic_loop * loop)
  60. {
  61. m_loop = loop;
  62. m_min_timer.set(*m_loop);
  63. m_min_timer.set<one_ct_message_handle,&one_ct_message_handle::on_min_timer>(this);
  64. m_max_timer.set(*m_loop);
  65. m_max_timer.set<one_ct_message_handle,&one_ct_message_handle::on_max_timer>(this);
  66. }
  67. void on_message(ev::dynamic_loop *loop,const message_locinfo&loc)
  68. {
  69. if(m_loop == nullptr && loop!=nullptr)
  70. set(loop);
  71. else if(loop == nullptr)
  72. return;
  73. if(!m_msg_list.empty()&& m_ct!=loc.m_card_ct)
  74. {
  75. m_msg_list.clear();
  76. }
  77. auto sitPtr = sit_list::instance()->get(loc.m_site_id);
  78. if(sitPtr==nullptr)
  79. {
  80. log_warn("分站信息缺失,SitId:%d",loc.m_site_id);
  81. return;
  82. }
  83. const site &s=*(sit_list::instance()->get(loc.m_site_id));
  84. if(m_msg_list.empty())
  85. {
  86. m_ct=loc.m_card_ct;
  87. m_ac=&s.config();
  88. m_min_timeout=false;
  89. //这里构造loc_message 保存数据
  90. m_msg_list.push_back(loc_message(s,loc.m_tof,loc.m_time_stamp,loc.m_card_id,
  91. loc.m_card_ct,loc.m_card_type,loc.m_ant_id,loc.m_rav,loc.m_acc,
  92. loc.m_sync_ct,loc.m_rssi));
  93. //启动本CT的最小、最大两个定时器
  94. m_min_timer.start(m_ac->min_wait_time);
  95. m_max_timer.start(m_ac->min_wait_time);
  96. return;
  97. }
  98. m_msg_list.push_back(loc_message(s,loc.m_tof,loc.m_time_stamp,loc.m_card_id,
  99. loc.m_card_ct,loc.m_card_type,loc.m_ant_id,loc.m_rav,loc.m_acc,
  100. loc.m_sync_ct,loc.m_rssi));
  101. if(m_min_timeout && (int)m_msg_list.size()>=m_ac->best_msg_cnt)
  102. {
  103. calc_location();
  104. m_max_timer.stop();
  105. }
  106. }
  107. void calc_location()
  108. {
  109. auto v = m_msg_list;
  110. std::vector<point> rc=std::move(m_loc_tool.calc_location(v));
  111. if(!rc.empty()) m_card->on_location(std::move(rc),v);
  112. reset();
  113. }
  114. };
  115. struct card_message_handle
  116. {
  117. card_location_base*m_card;
  118. std::array<one_ct_message_handle*,16> m_ct_list;
  119. card_message_handle(card_location_base*card)
  120. {
  121. m_card=card;
  122. for(size_t i=0;i<m_ct_list.size();i++)
  123. {
  124. m_ct_list[i]=new one_ct_message_handle(card);
  125. }
  126. }
  127. ~card_message_handle()
  128. {
  129. for(auto&it:m_ct_list)
  130. {
  131. delete it;
  132. }
  133. }
  134. void on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history)
  135. {
  136. if(is_history)
  137. {
  138. log_warn("%s","当前代码没有处理历史消息记录。");
  139. return;
  140. }
  141. //
  142. m_card->site_hover(loc.m_site_id);
  143. if(loc.m_batty_status == 2)
  144. {
  145. m_card->do_status(STATUS_POWER_LOWER_SERIOUS);
  146. }
  147. else
  148. {
  149. m_card->do_status(STATUS_POWER_NOMARL);
  150. }
  151. if(loc.m_callinfo & 0x80)
  152. {
  153. m_card->do_status(STATUS_HELP);
  154. }
  155. if((loc.m_callinfo & 0x01) || (loc.m_callinfo & 0x02))
  156. {
  157. m_card->do_status(STATUS_CALL);
  158. }
  159. m_ct_list[loc.m_card_ct&(m_ct_list.size()-1)]->on_message(loop,loc);
  160. }
  161. };
  162. struct card_area
  163. {
  164. card_area()
  165. {
  166. m_site_area.reset(new site_area_hover);
  167. m_area_tool.reset(new area_tool);
  168. m_mine_tool.reset(new mine_tool);
  169. }
  170. std::shared_ptr<site_area_hover> m_site_area=nullptr;
  171. std::shared_ptr<area_tool> m_area_tool=nullptr;
  172. std::shared_ptr<mine_tool> m_mine_tool=nullptr;
  173. };
  174. struct person:card_location_base, card_area
  175. {
  176. std::weak_ptr<monkey_person> m_monkeyPerson;
  177. person(std::string type,uint32_t cardid,uint16_t needdisplay,int16_t t,int32_t deptid)
  178. :card_location_base(type,cardid,needdisplay,t,deptid)
  179. {
  180. m_message_handle = new card_message_handle(this);
  181. }
  182. void on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history)
  183. {
  184. m_message_handle->on_message(loop,loc,is_history);
  185. }
  186. void clear()
  187. {
  188. //清除定时器
  189. m_timer.stop();
  190. m_loop = nullptr;
  191. m_site_area.reset(new site_area_hover);
  192. m_area_tool.reset(new area_tool);
  193. m_mine_tool.reset(new mine_tool);
  194. card_location_base::clear();
  195. }
  196. virtual void site_hover(int sid)
  197. {
  198. if(m_time<=0)
  199. {
  200. return;
  201. }
  202. m_site_area->on_point(m_id,sid,nullptr, m_type);
  203. }
  204. virtual std::shared_ptr<area_hover> get_area_hover()
  205. {
  206. return m_area_tool->m_area_hover;
  207. }
  208. virtual std::shared_ptr<mine_tool> get_mine_tool()
  209. {
  210. return m_mine_tool;
  211. }
  212. virtual std::shared_ptr<site_area_hover> get_site_area()
  213. {
  214. return m_site_area;
  215. }
  216. virtual void do_business(const point &pt)
  217. {
  218. //区域
  219. m_area_tool->on_point(m_id,pt,m_speed,m_type);
  220. //考勤
  221. m_site_area->on_point(m_id,0,this, m_type);
  222. //
  223. }
  224. //人卡升井后该线程要停掉
  225. //手动升级需要补全区域得同时,需要进区域走区域业务
  226. void set(ev::dynamic_loop * loop)
  227. {
  228. log_info("cardid_id %d",m_id);
  229. m_loop = loop;
  230. m_timer.set(*m_loop);
  231. m_timer.set<person,&person::on_timer>(this);
  232. m_timer.start(1,1);
  233. }
  234. void reset(std::shared_ptr<monkey_person> mp)
  235. {
  236. m_monkeyPerson = mp;
  237. }
  238. ~person(){}
  239. private:
  240. void on_timer()
  241. {
  242. YA::_CARD_POS_ cp;
  243. point pt = getSmoothPoint();
  244. const auto lm = m_area_tool->getLandmark();
  245. cp.enter_area_time = std::get<0>(lm);
  246. cp.rec_time = std::get<1>(lm);
  247. cp.map_id = std::get<2>(lm);
  248. cp.area_id = std::get<3>(lm);
  249. cp.landmark_id = std::get<4>(lm);
  250. cp.lm_direction = std::get<5>(lm);
  251. cp.landmark_dis=std::get<6>(lm);
  252. cp.biz_stat = state();
  253. upt_card_pos(cp,pt);
  254. }
  255. int state()
  256. {
  257. int status = get_stat();
  258. if(status == STATUS_NORMAL)
  259. {
  260. //超时
  261. }
  262. return status;
  263. }
  264. point getSmoothPoint()
  265. {
  266. point pt;
  267. loc_point lp = m_smo_tool->smooth_strategy();
  268. m_speed = lp.m_speed;
  269. m_stat = lp.m_stat;
  270. pt.x = lp.x;
  271. pt.y = -lp.y;
  272. if(auto p = m_monkeyPerson.lock() )
  273. {
  274. if(p->is_on_bus())
  275. {
  276. m_stat = 7;
  277. pt = p->getPoint();
  278. }
  279. }
  280. return pt;
  281. }
  282. };
  283. struct car:card_location_base,card_area
  284. {
  285. int m_vehicle_category_id=0;
  286. int m_vehicle_type_id=0;
  287. car(std::string type,uint32_t cardid,uint16_t needdisplay,int16_t t,int32_t deptid,
  288. int32_t categoryid, int type_id)
  289. :card_location_base(type,cardid,needdisplay,t,deptid)
  290. ,m_vehicle_category_id(categoryid)
  291. ,m_vehicle_type_id(type_id)
  292. {
  293. m_message_handle=new card_message_handle(this);
  294. }
  295. virtual void site_hover(int sid)
  296. {
  297. if(m_time<=0)
  298. {
  299. return;
  300. }
  301. m_site_area->on_point(m_id,sid,0, m_type);
  302. }
  303. virtual std::shared_ptr<area_hover> get_area_hover()
  304. {
  305. return m_area_tool->m_area_hover;
  306. }
  307. virtual std::shared_ptr<mine_tool> get_mine_tool()
  308. {
  309. return m_mine_tool;
  310. }
  311. virtual std::shared_ptr<site_area_hover> get_site_area()
  312. {
  313. return m_site_area;
  314. }
  315. virtual void do_business(const point &pt)
  316. {
  317. m_area_tool->on_point(m_id,pt,m_speed,m_type);
  318. m_site_area->on_point(m_id,0,this, m_type);
  319. m_mine_tool->on_point(m_id, m_type, m_vehicle_category_id);
  320. }
  321. void set(ev::dynamic_loop * loop)
  322. {
  323. log_info("cardid_id %d",m_id);
  324. m_loop = loop;
  325. m_timer.set(*m_loop);
  326. m_timer.set<car,&car::on_timer>(this);
  327. m_timer.start(1,1);
  328. }
  329. int get_vehicle_type_id()
  330. {
  331. return m_vehicle_type_id;
  332. }
  333. ~car(){}
  334. private:
  335. void on_timer()
  336. {
  337. make_package();
  338. }
  339. int statbiz(int32_t special_id)
  340. {
  341. int status = get_stat();
  342. if(status==STATUS_NORMAL)
  343. {
  344. //超速
  345. //超时
  346. //顺序不能变
  347. }
  348. if(status == STATUS_LOST)
  349. {
  350. if(!m_area_tool->special_area())
  351. {
  352. special_id = special_area_list::instance()->get_special_id(m_id,*this,m_vehicle_category_id);
  353. log_info("enter_special_area:%.2f,%2.f,id:%d,special_area_id:%d",x,y,m_id,special_id);
  354. if(special_id != -1)
  355. m_area_tool->change_area(m_id,m_speed,m_type,special_id);//自动拖车
  356. }
  357. }
  358. return status;
  359. }
  360. void make_package()
  361. {
  362. int32_t special_id=-1;
  363. YA::_CARD_POS_ cp;
  364. point pt = getSmoothPoint();
  365. const auto lm = m_area_tool->getLandmark();
  366. cp.enter_area_time = std::get<0>(lm);
  367. cp.rec_time = std::get<1>(lm);
  368. cp.map_id = std::get<2>(lm);
  369. cp.area_id = std::get<3>(lm);
  370. cp.landmark_id = std::get<4>(lm);
  371. cp.lm_direction = std::get<5>(lm);
  372. cp.landmark_dis=std::get<6>(lm);
  373. int32_t biz_stat=statbiz(special_id);
  374. cp.biz_stat=biz_stat;
  375. //cp.down_time
  376. //cp.work_time;
  377. //cp.level_id;
  378. //for now
  379. cp.is_on_duty=1;
  380. upt_card_pos(cp,pt);
  381. if(biz_stat==STATUS_LOST && special_id != -1 && m_display==1)
  382. {
  383. cp.area_id = special_id;
  384. swsClientMgr.SendSpecialAreaProcess(cp);
  385. }
  386. }
  387. point getSmoothPoint()
  388. {
  389. loc_point lp = m_smo_tool->smooth_strategy();
  390. m_speed = lp.m_speed;
  391. m_stat = lp.m_stat;
  392. lp.y = -lp.y;
  393. return lp;
  394. }
  395. };
  396. loc_tool_main one_ct_message_handle::m_loc_tool;
  397. uint64_t card_list::getId(uint32_t cardid,uint64_t type)
  398. {
  399. return type<<32|cardid;
  400. }
  401. void card_list::init_vehicle()
  402. {
  403. std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
  404. std::string strategy = config.get("person.strategy","car1");
  405. const char *sql = "SELECT ve.vehicle_id, ve.card_id, c.card_type_id, \
  406. ve.dept_id, ve.group_id, v.vehicle_type_id, vt.vehicle_level_id, \
  407. vt.is_railroad AS vt_is_railroad,ve.need_display ,ve.power_alarm,\
  408. vt.vehicle_category_id,v.bigger_car_flag,vc.over_speed \
  409. FROM dat_vehicle_extend ve \
  410. LEFT JOIN dat_vehicle v ON ve.vehicle_id = v.vehicle_id \
  411. LEFT JOIN dat_card c ON ve.card_id = c.card_id \
  412. LEFT JOIN dat_dept d ON ve.dept_id = d.dept_id \
  413. LEFT JOIN dat_group g ON ve.group_id = g.group_id \
  414. LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
  415. LEFT JOIN dat_vehicle_category vc ON vc.vehicle_category_id = vt.vehicle_category_id \
  416. WHERE c.card_type_id = 2 AND c.state_id = 0;";
  417. std::string Error;
  418. YADB::CDBResultSet DBRes;
  419. sDBConnPool.Query(sql,DBRes,Error);
  420. int nCount = DBRes.GetRecordCount( Error );
  421. if (nCount > 0)
  422. {
  423. log_info( "init_staffer. The record count=%d\n", nCount );
  424. while ( DBRes.GetNextRecod(Error) )
  425. {
  426. unsigned int vehicle_id = 0;
  427. DBRes.GetField( "vehicle_id",vehicle_id, Error );
  428. std::string card_id;
  429. DBRes.GetField( "card_id",card_id, Error );
  430. uint32_t vsid = atoi(card_id.substr(3).c_str());
  431. unsigned int card_type_id = 0;
  432. DBRes.GetField( "card_type_id",card_type_id, Error );
  433. int dept_id = 0;
  434. DBRes.GetField( "dept_id",dept_id, Error );
  435. int group_id = 0;
  436. DBRes.GetField( "group_id",group_id, Error );
  437. int vehicle_type_id = 0;
  438. DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
  439. int vehicle_level_id = 0;
  440. DBRes.GetField( "vehicle_level_id",vehicle_level_id, Error );
  441. int need_display = 0;
  442. DBRes.GetField( "need_display",need_display, Error );
  443. int power_alarm = 0;
  444. DBRes.GetField( "power_alarm",power_alarm, Error );
  445. int vehicle_category_id = 0;
  446. DBRes.GetField( "vehicle_category_id",vehicle_category_id, Error );
  447. int bigger_car_flag= 0;
  448. DBRes.GetField( "bigger_car_flag",bigger_car_flag, Error );
  449. double over_speed= 0;
  450. DBRes.GetField( "over_speed",over_speed, Error );
  451. //for now
  452. vehicle_id = vsid;
  453. std::shared_ptr<card_location_base> clb = std::make_shared<car>(strategy,vehicle_id,
  454. need_display,card_type_id,dept_id,vehicle_category_id, vehicle_type_id);
  455. uint64_t cardid = getId(vehicle_id,2);
  456. 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);
  457. map.insert({cardid,clb});
  458. }
  459. }
  460. card_list::instance()->add(map);
  461. }
  462. void card_list::init_staffer()
  463. {
  464. std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
  465. std::string strategy = config.get("person.strategy","person1");
  466. const char *sql = "SELECT staff_id, s.card_id, c.card_type_id, s.dept_id, s.group_id, s.occupation_id, \
  467. ol.occupation_level_id,s.worktype_id,s.need_display \
  468. FROM dat_staff_extend s \
  469. LEFT JOIN dat_card c ON s.card_id = c.card_id \
  470. LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
  471. LEFT JOIN dat_occupation_level ol ON ol.occupation_level_id = o.occupation_level_id \
  472. WHERE c.card_type_id = 1 AND s.duty_id = 0 AND c.state_id = 0;";
  473. std::string Error;
  474. YADB::CDBResultSet DBRes;
  475. sDBConnPool.Query(sql,DBRes,Error);
  476. int nCount = DBRes.GetRecordCount( Error );
  477. if (nCount > 0)
  478. {
  479. log_info( "init_staffer. The record count=%d\n", nCount );
  480. while ( DBRes.GetNextRecod(Error) )
  481. {
  482. unsigned int staff_id = 0;
  483. DBRes.GetField( "staff_id",staff_id, Error );
  484. std::string card_id;
  485. DBRes.GetField( "card_id",card_id, Error );
  486. uint32_t vsid = atoi(card_id.substr(3).c_str());
  487. unsigned int card_type_id = 0;
  488. DBRes.GetField( "card_type_id",card_type_id, Error );
  489. int dept_id = 0;
  490. DBRes.GetField( "dept_id",dept_id, Error );
  491. int group_id = 0;
  492. DBRes.GetField( "group_id",group_id, Error );
  493. int occupation_id = 0;
  494. DBRes.GetField( "occupation_id",occupation_id, Error );
  495. int occupation_level_id = 0;
  496. DBRes.GetField( "occupation_level_id",occupation_level_id, Error );
  497. int need_display = 0;
  498. DBRes.GetField( "need_display",need_display, Error );
  499. //for now;
  500. staff_id = vsid;
  501. std::shared_ptr<card_location_base> clb = std::make_shared<person>(strategy,staff_id,need_display,card_type_id,dept_id);
  502. uint64_t cardid = getId(staff_id,1);
  503. 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());
  504. map.insert({cardid,clb});
  505. }
  506. }
  507. card_list::instance()->add(map);
  508. }
  509. void card_list::init_card_from_db()
  510. {
  511. init_staffer();
  512. init_vehicle();
  513. }
  514. void card_list::load_his_card_postion_from_db()
  515. {
  516. load_his_card_postion_vehicle();
  517. load_his_card_postion_staff();
  518. for(auto&iter: m_map)
  519. {
  520. auto card_ptr = iter.second;
  521. auto mine_tool_ptr = card_ptr->get_mine_tool();
  522. if(mine_tool_ptr->is_attendance())
  523. {
  524. auto str = tool_time::to_str_ex( tool_time::to_ms(mine_tool_ptr->m_attendance_start_time));
  525. std_debug("加载考勤,考勤开始时间: %s, 卡id=%d,卡type=%d", str.c_str(), card_ptr->m_id, card_ptr->m_type);
  526. log_info("加载考勤,考勤开始时间: %s, 卡id=%d,卡type=%d", str.c_str(), card_ptr->m_id, card_ptr->m_type);
  527. }
  528. }
  529. auto area_map = area_list::instance()->m_map;
  530. for(auto&iter: area_map)
  531. {
  532. auto area_ptr = iter.second;
  533. if(area_ptr->m_person_count)
  534. {
  535. std_debug("加载区域人数: 区域id=%d,区域人数=%d",area_ptr->m_id, area_ptr->m_person_count.load());
  536. log_info("加载区域人数: 区域id=%d,区域人数=%d",area_ptr->m_id, area_ptr->m_person_count.load());
  537. }
  538. if(area_ptr->m_vehicle_count)
  539. {
  540. std_debug("加载区域车数: 区域id=%d,区域车数=%d",area_ptr->m_id, area_ptr->m_vehicle_count.load());
  541. log_info("加载区域车数: 区域id=%d,区域车数=%d",area_ptr->m_id, area_ptr->m_vehicle_count.load());
  542. }
  543. }
  544. }
  545. void card_list::load_his_card_postion_vehicle()
  546. {
  547. const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.map_id, la.area_id, l.state, \
  548. case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
  549. l.mileage, la.enter_time, att.start_time, \
  550. att.end_time, \
  551. l.landmark_id, l.direction_mapper_id, l.landmark_dist \
  552. from rt_location l, rt_location_area la, rt_att_vehicle att, dat_card c, dat_vehicle_extend v \
  553. 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 \
  554. and c.state_id=0;";
  555. std::string Error;
  556. YADB::CDBResultSet DBRes;
  557. sDBConnPool.Query(sql,DBRes,Error);
  558. if(!Error.empty())
  559. log_error("load_his_card_postion_vehicle列表 Error,%s",Error.c_str());
  560. uint64_t nCount = DBRes.GetRecordCount( Error );
  561. if (nCount > 0)
  562. {
  563. log_info( "load_his_card_postion_vehicle. The record count=%ld\n", nCount );
  564. while ( DBRes.GetNextRecod(Error) )
  565. {
  566. std::string card_id = "";
  567. DBRes.GetField( "card_id",card_id, Error );
  568. uint32_t id = tool_other::id64_to_id(card_id);
  569. int type = tool_other::id64_to_type(card_id);
  570. auto temp_ptr = card_list::instance()->get(card_list::to_id64(type, id));
  571. if(!temp_ptr || !temp_ptr->is_vehicle())
  572. {
  573. log_error("全局卡列表中找不到卡,卡id=%d,卡type=%d", id, type);
  574. continue;
  575. }
  576. auto card_ptr = static_cast<car*>(temp_ptr.get());
  577. double x = 0;
  578. DBRes.GetField( "x",x, Error );
  579. double y = 0;
  580. DBRes.GetField( "y",y, Error );
  581. double z = 0;
  582. DBRes.GetField( "z",z, Error );
  583. int map_id = 0;
  584. DBRes.GetField( "map_id",map_id, Error );
  585. int area_id = 0;
  586. DBRes.GetField( "area_id",area_id, Error );
  587. int state = 0;
  588. DBRes.GetField( "state",state, Error );
  589. double speed = 0;
  590. DBRes.GetField( "speed",speed, Error );
  591. std::string enter_time = "";
  592. DBRes.GetField( "enter_time",enter_time, Error );
  593. std::string start_time = "";
  594. DBRes.GetField( "start_time",start_time, Error );
  595. std::string end_time = "";
  596. DBRes.GetField( "end_time",end_time, Error );
  597. int landmark_id = 0;
  598. DBRes.GetField( "landmark_id",landmark_id, Error );
  599. int direction_mapper_id = 0;
  600. DBRes.GetField( "direction_mapper_id",direction_mapper_id, Error );
  601. double landmark_dist = 0;
  602. DBRes.GetField( "landmark_dist",landmark_dist, Error );
  603. card_ptr->x = x;
  604. card_ptr->y = y;
  605. card_ptr->z = z;
  606. auto area = area_list::instance()->get(area_id);
  607. if(area == nullptr)
  608. {
  609. log_error("area_list 找不到区域:区域id=%d", area_id);
  610. continue;
  611. }
  612. area->m_vehicle_count++;
  613. point pt = *card_ptr;
  614. card_ptr->m_area_tool->m_area_hover = std::make_shared<area_hover>( area, pt,speed);
  615. auto area_hover_ptr = card_ptr->get_area_hover();
  616. auto e_t = tool_time::to_time_ex(enter_time);
  617. area_hover_ptr->m_enter_time = std::chrono::system_clock::to_time_t(e_t);
  618. //int map_id = 0;
  619. //int state = 0;
  620. card_ptr->m_speed = speed;
  621. if(end_time.empty())
  622. {
  623. auto mine_tool_ptr = card_ptr->get_mine_tool();
  624. mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
  625. mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
  626. }
  627. area_hover_ptr->landmark_id = landmark_id;
  628. area_hover_ptr->landmark_dir = direction_mapper_id;
  629. area_hover_ptr->landmark_dis = landmark_dist;
  630. card_ptr->m_time = tool_time::now_to_ms();
  631. }
  632. }
  633. }
  634. void card_list::load_his_card_postion_staff()
  635. {
  636. const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.map_id, la.area_id, l.state, \
  637. case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
  638. l.mileage, la.enter_time, att.start_time, \
  639. att.end_time, \
  640. l.landmark_id, l.direction_mapper_id, l.landmark_dist \
  641. from rt_location l, rt_location_area la, rt_att_staff att, dat_card c, dat_staff_extend s \
  642. 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\
  643. and c.state_id=0;";
  644. std::string Error;
  645. YADB::CDBResultSet DBRes;
  646. sDBConnPool.Query(sql,DBRes,Error);
  647. if(!Error.empty())
  648. log_error("load_his_card_postion_vehicle列表 Error,%s",Error.c_str());
  649. uint64_t nCount = DBRes.GetRecordCount( Error );
  650. if (nCount > 0)
  651. {
  652. log_info( "load_his_card_postion_vehicle. The record count=%ld\n", nCount );
  653. while ( DBRes.GetNextRecod(Error) )
  654. {
  655. std::string end_time = "";
  656. DBRes.GetField( "end_time",end_time, Error );
  657. if(!end_time.empty()) // 已升井,不再读入
  658. {
  659. continue;
  660. }
  661. std::string card_id = "";
  662. DBRes.GetField( "card_id",card_id, Error );
  663. uint32_t id = tool_other::id64_to_id(card_id);
  664. int type = tool_other::id64_to_type(card_id);
  665. auto temp_ptr = card_list::instance()->get(card_list::to_id64(type, id));
  666. if(!temp_ptr || !temp_ptr->is_person())
  667. {
  668. log_error("全局卡列表中找不到卡,卡id=%d,卡type=%d", id, type);
  669. continue;
  670. }
  671. auto card_ptr = static_cast<car*>(temp_ptr.get());
  672. double x = 0;
  673. DBRes.GetField( "x",x, Error );
  674. double y = 0;
  675. DBRes.GetField( "y",y, Error );
  676. double z = 0;
  677. DBRes.GetField( "z",z, Error );
  678. int map_id = 0;
  679. DBRes.GetField( "map_id",map_id, Error );
  680. int area_id = 0;
  681. DBRes.GetField( "area_id",area_id, Error );
  682. int state = 0;
  683. DBRes.GetField( "state",state, Error );
  684. double speed = 0;
  685. DBRes.GetField( "speed",speed, Error );
  686. std::string enter_time = "";
  687. DBRes.GetField( "enter_time",enter_time, Error );
  688. std::string start_time = "";
  689. DBRes.GetField( "start_time",start_time, Error );
  690. int landmark_id = 0;
  691. DBRes.GetField( "landmark_id",landmark_id, Error );
  692. int direction_mapper_id = 0;
  693. DBRes.GetField( "direction_mapper_id",direction_mapper_id, Error );
  694. double landmark_dist = 0;
  695. DBRes.GetField( "landmark_dist",landmark_dist, Error );
  696. card_ptr->x = x;
  697. card_ptr->y = y;
  698. card_ptr->z = z;
  699. auto area = area_list::instance()->get(area_id);
  700. if(area == nullptr)
  701. {
  702. log_error("area_list 找不到区域:区域id=%d", area_id);
  703. continue;
  704. }
  705. area->m_person_count++;
  706. point pt = *card_ptr;
  707. card_ptr->m_area_tool->m_area_hover = std::make_shared<area_hover>(area,pt,speed);
  708. auto area_hover_ptr = card_ptr->get_area_hover();
  709. auto e_t = tool_time::to_time_ex(enter_time);
  710. area_hover_ptr->m_enter_time = std::chrono::system_clock::to_time_t(e_t);
  711. //int map_id = 0;
  712. //int state = 0;
  713. card_ptr->m_speed = speed;
  714. if(end_time.empty())
  715. {
  716. auto mine_tool_ptr = card_ptr->get_mine_tool();
  717. mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
  718. mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
  719. }
  720. area_hover_ptr->landmark_id = landmark_id;
  721. area_hover_ptr->landmark_dir = direction_mapper_id;
  722. area_hover_ptr->landmark_dis = landmark_dist;
  723. card_ptr->m_time = tool_time::now_to_ms();
  724. }
  725. }
  726. }
  727. void card_list::on_message(zloop<task*> *loop,const message_locinfo&loc,bool is_history)
  728. {
  729. //std::shared_ptr<card_location_base>c=get(loc.m_card_id);
  730. uint64_t cardid = getId(loc.m_card_id,loc.m_card_type);
  731. const auto c=get(cardid);
  732. if(c==nullptr)
  733. {
  734. log_warn("数据库中未定义该卡的信息,card_id=%d", loc.m_card_id);
  735. return;
  736. }
  737. log_info("card message:site=%d,ant=%d,card=%d,tof=%lld,rav=%02X,acc=%02X,rssi=%d,stamp=%llu",
  738. 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);
  739. c->on_message(loop,loc,is_history);
  740. }
  741. //-----------------card_location_base..
  742. card_location_base::card_location_base(std::string type,uint32_t id,uint16_t dis,int16_t t,int32_t deptid)
  743. :card(id,dis,t,deptid)
  744. {
  745. select_tool_manage::instance()->create_tool(type,m_sel_tool,m_smo_tool);
  746. }
  747. void card_location_base::do_status(STATUS_CARD st)
  748. {
  749. module_mgr::do_status(st, m_id, m_type);
  750. }
  751. void card_location_base::on_location(const std::vector<point>&vp,const std::vector<loc_message> &lm )
  752. {
  753. //ct timestamp;
  754. m_ct = lm[0].m_card_ct;
  755. m_time = lm[0].m_loc_time;
  756. loc_point pt = m_sel_tool->select_solution(vp,lm);
  757. pt.y=-pt.y;
  758. if(pt.m_useless)
  759. {
  760. x = pt.x;
  761. y = pt.y;
  762. log_info("card_id:%d,ct:%d,timestamp:%llu, loc_point,x:%.2f,y:%.2f ",m_id,m_ct,m_time,pt.x,pt.y);
  763. do_business(pt);
  764. }
  765. }
  766. void card_location_base::on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history)
  767. {
  768. if(m_loop == nullptr && loop != nullptr)
  769. set(loop);
  770. m_message_handle->on_message(loop,loc,is_history);
  771. }
  772. //前端推送位置函数
  773. void card_location_base::upt_card_pos(YA::_CARD_POS_ &cp,const point &pt)
  774. {
  775. cp.x = pt.x;
  776. cp.y = pt.y;
  777. cp.z = pt.z;
  778. cp.Type=m_type;
  779. cp.ID = m_id;
  780. cp.speed = abs(ceil(m_speed));
  781. cp.running_stat = m_stat;
  782. cp.dept_id = m_deptid;
  783. cp.display=m_display;
  784. cp.rec_time=m_time;
  785. swsTimerThrd.upt_card_pos(cp);
  786. }
  787. int card_location_base::get_stat()
  788. {
  789. //盲区>呼救>呼叫>超时>超速>正常
  790. uint64_t now = time(0)*1000;
  791. if(now-m_time>CARD_LOST_TIME_OUT)
  792. {
  793. return STATUS_LOST;
  794. }
  795. else if(auto ev_ptr = event_list::instance()->get_event_card(m_id, m_type, ET_CARD_HELP))
  796. {
  797. return (ES_DEAL_HELP == ev_ptr->m_status) ? STATUS_HELP_DEALED : STATUS_HELP;
  798. }
  799. else if(CALL_NONE != get_mine_tool()->m_status_call)
  800. {
  801. return STATUS_CALL;
  802. }
  803. else if(event_list::instance()->get_event_card(m_id, m_type,
  804. is_person()? ET_CARD_AREA_OVER_TIME_PERSON: ET_CARD_AREA_OVER_TIME_VEHICLE))
  805. {
  806. return STATUS_AREA_OVER_TIME;
  807. }
  808. else if(event_list::instance()->get_event_card(m_id, m_type, ET_CARD_OVER_SPEED))
  809. {
  810. return STATUS_OVER_SPEED;
  811. }
  812. return STATUS_NORMAL;
  813. }
  814. void card_location_base::clear()
  815. {
  816. // uint16_t m_display; //1显示0不显示,往前端推送
  817. m_speed=0; //速度
  818. m_is_attendance=0; //井上井下状态 0初始状态 1 井上 2 井下
  819. m_stat=0; //运动静止状态
  820. //m_ct; //ct
  821. m_time=0; //时间戳
  822. }
  823. card_location_base::~card_location_base()
  824. {
  825. }
  826. template<> std::shared_ptr<card_list>
  827. single_base<card_list, uint64_t, std::shared_ptr<card_location_base>>::m_instance=std::make_shared<card_list>();