bindmorecard.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. #pragma once
  2. #include <iostream>
  3. #include <time.h>
  4. //#include <sys/time.h>
  5. #include <thread>
  6. #include <chrono>
  7. #include <functional>
  8. #include <unordered_map>
  9. #include <mutex>
  10. #include "geo_hash.h"
  11. #include <sstream>
  12. #include "car.h"
  13. #include <map>
  14. #include "zlist.h"
  15. #include "confstruct.h"
  16. NAMESPACE_POINT_BEGIN(NAMESPACE_POINT)
  17. //extern ConfStruct g_cs;
  18. struct MyHash
  19. {
  20. typedef uint64_t result_type;
  21. result_type operator ()(std::pair<std::string,std::string> p) const
  22. {
  23. std::hash<std::string> hs;
  24. result_type st1 = hs(p.first);
  25. result_type st2 = hs(p.second);
  26. return st1^(st2);
  27. }
  28. };
  29. struct Data
  30. {
  31. Data(uint64_t ct)
  32. {
  33. m_index = 0;
  34. m_ct.fill(0);
  35. m_totaldistance = 0;
  36. m_timestamp = ct;
  37. m_flag = false;
  38. }
  39. void reset()
  40. {
  41. m_index = 0;
  42. m_ct.fill(0);
  43. m_totaldistance = 0;
  44. //m_timestamp = time(NULL);
  45. m_flag = false;
  46. }
  47. void increase(const int index)
  48. {
  49. m_ct[index]++;
  50. }
  51. uint32_t m_index;
  52. std::array<uint16_t,2> m_ct;
  53. double m_totaldistance;
  54. uint64_t m_timestamp;
  55. bool m_flag;
  56. };
  57. struct TcardInterface
  58. {
  59. // TcardInterface()=default;
  60. TcardInterface(std::pair<std::string,std::string> sp,uint64_t ct,uint64_t owner,int size)
  61. :m_cardid(sp)
  62. ,m_timestamp(ct)
  63. ,m_owner(owner)
  64. ,SIZE(size)
  65. {}
  66. //tsp timestamp
  67. std::tuple<bool,std::string> setindex(uint64_t tsp,const std::string &cardid,const double d=0,bool ctflag =false)
  68. {
  69. bool flag = false;
  70. assert(m_timestamp != 0||tsp != 0);
  71. std::tuple<bool,std::string> stp(flag,std::string(""));
  72. //get ct index..first === 0 second == 1
  73. int arrindex = getstrindex(cardid);
  74. if(arrindex == -1)
  75. return stp;
  76. if (empty())
  77. grow(tsp);
  78. //uint64_t tmp_tsp_min = m_timestamp + ((empty()?1:size())-1)*ConfStruct::getCs().split_win_minsec;
  79. //uint64_t tmp_tsp_max = m_timestamp + (empty()?1:size())*ConfStruct::getCs().split_win_minsec;
  80. uint64_t tmp_tsp_min = back(0).m_timestamp;
  81. uint64_t tmp_tsp_max = back(0).m_timestamp + ConfStruct::getCs().split_win_minsec;
  82. //assert(tsp >= tmp_tsp_min);
  83. do
  84. {
  85. if(tsp>=tmp_tsp_min && tsp < tmp_tsp_max)
  86. {
  87. //if(empty())
  88. //grow();
  89. if(!ctflag)
  90. {
  91. back(0).m_index++;
  92. back(0).m_totaldistance+=d;
  93. }
  94. else
  95. back(0).increase(arrindex);
  96. break;
  97. }
  98. else
  99. {
  100. if(timeout())
  101. {
  102. auto tp = get();
  103. //查看是否可以告警
  104. stp = check(std::get<0>(tp),std::get<1>(tp));
  105. skip(1);
  106. }
  107. grow(tsp);
  108. tmp_tsp_min = back(0).m_timestamp;
  109. tmp_tsp_max = back(0).m_timestamp + ConfStruct::getCs().split_win_minsec;
  110. }
  111. }while(1);
  112. return stp;
  113. }
  114. std::tuple<bool,std::string> checkLast()
  115. {
  116. std::tuple<bool,std::string> stp(false,std::string(""));
  117. if (!timeout() && size()>=ConfStruct::getCs().remote_slot)
  118. {
  119. auto tp = get();
  120. //查看是否可以告警
  121. stp = check(std::get<0>(tp),std::get<1>(tp));
  122. }
  123. return stp;
  124. }
  125. void skip(int count)
  126. {
  127. for(int i =0;i<count&&i<size();i++)
  128. m_arr.pop_front();
  129. }
  130. bool empty()
  131. {
  132. return m_arr.empty();
  133. }
  134. int size()
  135. {
  136. return m_arr.size();
  137. }
  138. void grow(uint64_t ct)
  139. {
  140. Data d(ct);
  141. d.reset();
  142. m_arr.push_back(d);
  143. }
  144. Data &back(int index)
  145. {
  146. assert(index<(int)size() && index >= 0);
  147. return m_arr.at(size()-index-1);
  148. }
  149. std::tuple<int,int,double> get()
  150. {
  151. int total_ix=0,total_ct=0;
  152. double dis = 0;
  153. std::for_each(m_arr.begin(),m_arr.end(),[&total_ix,&total_ct,&dis](const Data &d){total_ix += d.m_index;total_ct+=(d.m_ct[0]+d.m_ct[1]);dis+=d.m_totaldistance;});
  154. return std::make_tuple(total_ix,total_ct,dis);
  155. }
  156. bool timeout()
  157. {
  158. return size() == SIZE-1;
  159. }
  160. std::string getInfo_1()
  161. {
  162. std::stringstream ss;
  163. ss<<m_cardid.first<<"&"<<m_cardid.second<<","<<m_arr[0].m_timestamp/1000<<","<<(back(0).m_timestamp+ConfStruct::getCs().split_win_minsec)/1000 <<",";
  164. std::for_each(m_arr.begin(),m_arr.end(),[&ss](Data& d){
  165. if (!d.m_flag)
  166. {
  167. ss<<d.m_timestamp/1000<<"&"<<d.m_totaldistance<<"&"<<d.m_index<<",";
  168. d.m_flag = true;
  169. }
  170. });
  171. return ss.str();
  172. }
  173. std::string getInfo()
  174. {
  175. auto tp = get();
  176. std::stringstream ss;
  177. ss<<"{T:"<<std::get<0>(tp)<<","<<std::get<1>(tp)<<","<<std::get<2>(tp)<<"}";
  178. //ss<<"{Total index:"<<std::get<0>(tp)<<","<<std::get<1>(tp)<<"},";
  179. //m_arr.for_each([&ss](const Data&x){
  180. // ss<<"["<<x.m_index<<","<<x.m_ct[0]+x.m_ct[1]<<"]";
  181. //});
  182. return std::move(ss.str());
  183. }
  184. inline std::tuple<bool,std::string> check(int index,int ct)
  185. {
  186. if(index*1.0/ct>=0.72)
  187. {
  188. std::string s = getInfo_1();
  189. return std::make_tuple(true,s);
  190. }
  191. return std::make_tuple(false,std::string(""));
  192. }
  193. inline int getstrindex(const std::string cardid)
  194. {
  195. if(m_cardid.first == cardid)
  196. return 0;
  197. else
  198. return 1;
  199. return -1;
  200. }
  201. public:
  202. std::pair<std::string,std::string> m_cardid;
  203. uint64_t m_timestamp;
  204. uint64_t m_owner;
  205. std::deque<Data> m_arr;
  206. int SIZE;
  207. virtual ~TcardInterface(){}
  208. };
  209. struct CardFactory
  210. {
  211. typedef std::vector<std::string>::iterator iter;
  212. typedef std::map<std::string,std::shared_ptr<card_interface>> Mapdef;
  213. void erase(std::pair<std::string,std::string> p,base_card_list &m)
  214. {
  215. {
  216. auto it = m[p.first];
  217. if(it != nullptr)
  218. {
  219. std::shared_ptr<card_interface> bc = it->m_card;
  220. bc->m_v.erase(std::remove(bc->m_v.begin(),bc->m_v.end(),p.second),bc->m_v.end());
  221. }
  222. }
  223. auto it = m[p.second];
  224. if(it != nullptr)
  225. {
  226. std::shared_ptr<card_interface> bc = it->m_card;
  227. bc->m_v.erase(std::remove(bc->m_v.begin(),bc->m_v.end(),p.first),bc->m_v.end());
  228. }
  229. }
  230. void erase(const uint64_t s,base_card_list &m)
  231. {
  232. std::lock_guard<std::mutex> lck(m_mtx);
  233. auto iter = m_map.find(s);
  234. if(iter != m_map.end())
  235. {
  236. std::pair<std::string,std::string> p = iter->second->m_cardid;
  237. erase(p,m);
  238. m_map.erase(iter);
  239. }
  240. }
  241. std::map<uint64_t,std::string> erase(const std::shared_ptr<card_interface>&bc,base_card_list &m,std::vector<std::string>&v)
  242. {
  243. std::map<uint64_t,std::string> tmpvec;
  244. std::string s =bc->cardId();
  245. MyHash mh;
  246. for(const auto str: v)
  247. {
  248. std::lock_guard<std::mutex> lck(m_mtx);
  249. uint64_t t = mh(std::make_pair(str,s));
  250. auto iter = m_map.find(t);
  251. if(iter != m_map.end())
  252. {
  253. auto bs = checkLast(iter->second);
  254. if (std::get<0>(bs))
  255. {
  256. tmpvec.insert(std::make_pair(t,std::get<1>(bs)));
  257. }
  258. std::pair<std::string,std::string> p = iter->second->m_cardid;
  259. erase(p,m);
  260. m_map.erase(iter);
  261. }
  262. }
  263. return std::move(tmpvec);
  264. }
  265. std::map<uint64_t,std::string> setCT(std::shared_ptr<card_interface>&bc)
  266. {
  267. std::map<uint64_t,std::string> tmpvec;
  268. std::string str = bc->cardId();
  269. uint64_t cttime = bc->CtTime();
  270. std::shared_ptr<TcardInterface> ptr = nullptr;
  271. std::vector<std::string> vec = bc->m_v;
  272. MyHash mh;
  273. for(auto it = vec.begin();it != vec.end();it ++)
  274. {
  275. uint64_t s = mh(std::make_pair(*it,str));
  276. std::lock_guard<std::mutex> lck(m_mtx);
  277. auto iter = m_map.find(s);
  278. if(iter != m_map.end())
  279. {
  280. ptr = iter->second;
  281. auto sp = ptr->setindex(cttime,str,0,true);
  282. if (std::get<0>(sp))
  283. {
  284. tmpvec.insert(std::make_pair(s,std::get<1>(sp)));
  285. }
  286. }
  287. }
  288. return std::move(tmpvec);
  289. }
  290. std::map<uint64_t,std::string> handlecard(const std::vector<std::string>&& vec,std::shared_ptr<card_interface>&bc, base_card_list &m)
  291. {
  292. std::map<uint64_t,std::string> tempvec;
  293. std::string str =bc->cardId();
  294. uint64_t cttime = bc->CtTime();
  295. int x = bc->getX();
  296. int y = bc->getY();
  297. std::shared_ptr<TcardInterface> ptr = nullptr;
  298. MyHash mh;
  299. double dis = 0;
  300. for(auto it = vec.begin();it != vec.end();it ++)
  301. {
  302. uint64_t s = mh(std::make_pair(*it,str));
  303. auto iter = m_map.find(s);
  304. if(iter != m_map.end())
  305. {
  306. ptr = iter->second;
  307. }
  308. else
  309. {
  310. ptr = getPtr(*it,str,cttime,s);
  311. std::lock_guard<std::mutex> lck(m_mtx);
  312. m_map.insert(std::make_pair(s,ptr));
  313. backup(bc,*it,m);
  314. }
  315. //do card message..
  316. if(ptr == nullptr)
  317. continue;
  318. //dis
  319. auto cd = m[*it];
  320. if (cd !=nullptr)
  321. {
  322. int x1 = cd->m_card->getX();
  323. int y1 = cd->m_card->getY();
  324. dis = sqrt(pow(x-x1,2)+pow(y-y1,2));
  325. }
  326. auto sp = ptr->setindex(cttime,str,dis);
  327. if (std::get<0>(sp))
  328. {
  329. tempvec.insert(std::make_pair(s,std::get<1>(sp)));
  330. }
  331. }
  332. return std::move(tempvec);
  333. }
  334. inline std::string InfoMessage()
  335. {
  336. std::stringstream ss;
  337. ss<<"S: "<<m_map.size();
  338. for(auto it : m_map)
  339. {
  340. //ss<< " hash info["<<it.first <<"]first cardid:["<<it.second->m_cardid.first<<"]second cardid:["<<it.second->m_cardid.second<<"]Info:{total_size:"<<it.second->size()<<","<<it.second->getInfo()<<"}";
  341. ss<< "["<<it.second->m_cardid.first<<"]["<<it.second->m_cardid.second<<"]{s:"<<it.second->size()<<","<<it.second->getInfo()<<"}";
  342. }
  343. return std::move(ss.str());
  344. }
  345. virtual std::map<uint64_t,std::string> selectcard(const iter ib,const iter ie,std::shared_ptr<card_interface>& c,base_card_list & m) = 0;
  346. virtual std::shared_ptr<TcardInterface> getPtr(const std::string str1,const std::string &str2,const uint64_t ctime,uint64_t) = 0;
  347. virtual void backup (std::shared_ptr<card_interface>&bc,const std::string str, base_card_list &m)= 0;
  348. virtual std::tuple<bool,std::string> checkLast(std::shared_ptr<TcardInterface> &ti)=0;
  349. virtual ~CardFactory(){}
  350. public:
  351. std::unordered_map<uint64_t,std::shared_ptr<TcardInterface>> m_map;
  352. std::mutex m_mtx;
  353. };
  354. struct CloserCardFactory : CardFactory
  355. {
  356. /*
  357. * 选卡,选出不满足如下条件的卡:
  358. * a.
  359. */
  360. std::map<uint64_t,std::string> selectcard(const iter ib,const iter ie,std::shared_ptr<card_interface>& bc, base_card_list &m)
  361. {
  362. std::vector<std::string> rc(ib,ie);
  363. rc.erase(std::remove_if(rc.begin(),rc.end(),[&](const std::string &s){
  364. if(!(*bc)[s])
  365. return true;
  366. auto it = m[s];
  367. if(it==nullptr)
  368. return true;
  369. if(bc->cardId() == s)
  370. return true;
  371. uint64_t ct1 = it->m_card->CtTime();
  372. uint64_t ct2 = bc->CtTime();
  373. uint64_t ct3 = ct1>ct2?ct1-ct2:ct2-ct1;
  374. return ct3 > ConfStruct::getCs().limit_sec*1000;
  375. }),rc.end());
  376. auto vec = handlecard(std::move(rc),bc,m);
  377. return std::move(vec);
  378. }
  379. void backup (std::shared_ptr<card_interface>&bc,const std::string str, base_card_list &m)
  380. {
  381. bc->m_v.push_back(str);
  382. std::string s = bc->cardId();
  383. auto it = m[str];
  384. if (it != nullptr)
  385. it->m_card->m_v.push_back(s);
  386. }
  387. std::shared_ptr<TcardInterface> getPtr(const std::string str1,const std::string &str2,const uint64_t ctime,uint64_t owner)
  388. {
  389. return std::make_shared<TcardInterface>(std::make_pair(str1,str2),ctime,owner,ConfStruct::getCs().closer_slot);
  390. }
  391. std::tuple<bool,std::string> checkLast(std::shared_ptr<TcardInterface> &ti)
  392. {
  393. return ti->checkLast();
  394. }
  395. };
  396. struct RemoteCardFactory : CardFactory
  397. {
  398. std::map<uint64_t,std::string> selectcard(const iter ib,const iter ie,std::shared_ptr<card_interface>& bc, base_card_list &m)
  399. {
  400. std::sort(bc->m_v.begin(),bc->m_v.end());
  401. std::sort(ib,ie);
  402. std::vector<std::string> v(ie-ib+bc->m_v.size());
  403. auto it = std::set_difference(bc->m_v.begin(),bc->m_v.end(),ib,ie,v.begin());
  404. v.resize(it-v.begin());
  405. v.erase(std::remove_if(v.begin(),v.end(),[&](std::string& s){
  406. auto it = m[s];
  407. if(it == nullptr)
  408. return true;
  409. uint64_t ct1 = it->m_card->CtTime();
  410. uint64_t ct2 = bc->CtTime();
  411. uint64_t ct3 = ct1>ct2?ct1-ct2:ct2-ct1;
  412. return ct3 > ConfStruct::getCs().limit_sec*1000;
  413. }),v.end());
  414. auto vec = handlecard(std::move(v),bc,m);
  415. return std::move(vec);
  416. }
  417. void backup (std::shared_ptr<card_interface>&bc,const std::string str, base_card_list &m){}
  418. std::shared_ptr<TcardInterface> getPtr(const std::string str1,const std::string &str2,const uint64_t ctime,uint64_t owner)
  419. {
  420. return std::make_shared<TcardInterface>(std::make_pair(str1,str2),ctime,owner,ConfStruct::getCs().remote_slot);
  421. }
  422. std::tuple<bool,std::string> checkLast(std::shared_ptr<TcardInterface> &ti)
  423. {
  424. return std::make_tuple(false,std::string(""));
  425. }
  426. };
  427. NAMESPACE_POINT_END(NAMESPACE_POINT)