jsonBuilder.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. #include "jsonBuilder.h"
  2. #include <cstdlib>
  3. #include <rapidjson/writer.h>
  4. #include <rapidjson/stringbuffer.h>
  5. #include <rapidjson/prettywriter.h>
  6. #include "constdef.h"
  7. namespace YA
  8. {
  9. jsonBuilder::jsonBuilder()
  10. {
  11. }
  12. jsonBuilder::~jsonBuilder()
  13. {
  14. }
  15. std::string jsonBuilder::__FmtCardID( const _BASE_CARD_ & CardPos )
  16. {
  17. char szID[32] = { 0 };
  18. sprintf( szID, "%03d%.10d", CardPos.Type, CardPos.ID );
  19. return szID;
  20. }
  21. void jsonBuilder::__AddVersion( rapidjson::Value& root, rapidjson::Document::AllocatorType& Allocator )
  22. {
  23. rapidjson::Value value( rapidjson::kStringType );
  24. value.SetString( INTERFACE_VERSION_1_4, Allocator );
  25. root.AddMember( JSON_ROOT_KEY_VERSION, value, Allocator );
  26. }
  27. void jsonBuilder::__SetCmd( const char* szCmd, rapidjson::Value & root, rapidjson::Document::AllocatorType & Allocator )
  28. {
  29. rapidjson::Value value( rapidjson::kStringType );
  30. value.SetString( szCmd, Allocator );
  31. root.AddMember( JSON_ROOT_KEY_CMD, value, Allocator );
  32. }
  33. #if 0
  34. detail=
  35. [
  36. //0 卡号
  37. //1 x坐标
  38. //2 y坐标
  39. //3 入井时间戳
  40. //4 接收时间戳
  41. //5 工作时长
  42. //6 地图编号
  43. //7 部门编号
  44. //8 状态
  45. //9 运行状态
  46. //10 业务状态
  47. //11 速度
  48. //12 area_info_array
  49. ]
  50. area_info_array=[
  51. area_info,
  52. area_info,
  53. area_info,
  54. area_info
  55. ]
  56. area_info=[
  57. //0 区域编号
  58. //1 地标编号
  59. //2 地标方向
  60. //3 距离地标的距离
  61. //4 进入区域时间戳
  62. ]
  63. #endif
  64. bool jsonBuilder::__BuildDetail( const _CARD_POS_ & CardPos, rapidjson::Document::AllocatorType& Allocator, rapidjson::Value & DetailItem )
  65. {
  66. rapidjson::Value Array( rapidjson::kArrayType );
  67. rapidjson::Value tmp_object( rapidjson::kObjectType );
  68. //0 ID
  69. tmp_object.SetString( __FmtCardID( CardPos ).c_str(), Allocator );
  70. Array.PushBack( tmp_object, Allocator );
  71. //1 x
  72. tmp_object.SetDouble( CardPos.x );
  73. Array.PushBack( tmp_object, Allocator );
  74. //2 y
  75. tmp_object.SetDouble( CardPos.y );
  76. Array.PushBack( tmp_object, Allocator );
  77. //3 入井时间戳
  78. tmp_object.SetDouble( CardPos.down_time );
  79. Array.PushBack( tmp_object, Allocator );
  80. //4 进入区域时间戳
  81. tmp_object.SetDouble( CardPos.enter_area_time );
  82. Array.PushBack( tmp_object, Allocator );
  83. //5 最后接收时间戳
  84. //tmp_object.SetDouble( CardPos.rec_time );
  85. //Array.PushBack( tmp_object, Allocator );
  86. //6 工作时长
  87. tmp_object.SetDouble( CardPos.work_time );
  88. Array.PushBack( tmp_object, Allocator );
  89. //7 地图编号
  90. tmp_object.SetInt( CardPos.map_id );
  91. Array.PushBack( tmp_object, Allocator );
  92. //8 区域编号
  93. //tmp_object.SetInt( CardPos.area_id );
  94. //Array.PushBack( tmp_object, Allocator );
  95. //9 部门编号
  96. tmp_object.SetInt( CardPos.dept_id );
  97. Array.PushBack( tmp_object, Allocator );
  98. //10 状态
  99. tmp_object.SetInt( CardPos.stat );
  100. Array.PushBack( tmp_object, Allocator );
  101. //11 运行状态
  102. tmp_object.SetInt( CardPos.running_stat );
  103. Array.PushBack( tmp_object, Allocator );
  104. //12 业务状态
  105. tmp_object.SetInt( CardPos.biz_stat );
  106. Array.PushBack( tmp_object, Allocator );
  107. //13 速度
  108. tmp_object.SetDouble( CardPos.speed );
  109. Array.PushBack( tmp_object, Allocator );
  110. //14 地标编号
  111. //tmp_object.SetInt( CardPos.landmark_id );
  112. //Array.PushBack( tmp_object, Allocator );
  113. //15 地标方向
  114. //tmp_object.SetInt( CardPos.lm_direction );
  115. //Array.PushBack( tmp_object, Allocator );
  116. //16 距离地标的距离
  117. //tmp_object.SetDouble( CardPos.landmark_dis );
  118. //Array.PushBack( tmp_object, Allocator );
  119. //17 级别编号
  120. tmp_object.SetInt( CardPos.level_id );
  121. Array.PushBack( tmp_object, Allocator );
  122. //18 车辆当天出勤的标识
  123. tmp_object.SetInt( CardPos.is_on_duty );
  124. Array.PushBack( tmp_object, Allocator );
  125. rapidjson::Value Array_1( rapidjson::kArrayType );
  126. for(const auto &a:CardPos.area_info)
  127. {
  128. rapidjson::Value _DetailItem;
  129. rapidjson::Value Array_2( rapidjson::kArrayType );
  130. const auto lm = a.second;
  131. //8 区域编号
  132. tmp_object.SetInt(std::get<0>(lm));
  133. Array_2.PushBack( tmp_object, Allocator );
  134. //14 地标编号
  135. tmp_object.SetInt(std::get<1>(lm));
  136. Array_2.PushBack( tmp_object, Allocator );
  137. //15 地标方向
  138. tmp_object.SetInt(std::get<2>(lm));
  139. Array_2.PushBack( tmp_object, Allocator );
  140. //16 距离地标的距离
  141. tmp_object.SetDouble(std::get<3>(lm));
  142. Array_2.PushBack( tmp_object, Allocator );
  143. //5 最后接收时间戳
  144. tmp_object.SetDouble(std::get<4>(lm));
  145. Array_2.PushBack( tmp_object, Allocator );
  146. _DetailItem=Array_2;
  147. Array_1.PushBack(_DetailItem, Allocator);
  148. }
  149. DetailItem = Array_1;
  150. Array.PushBack(DetailItem, Allocator );
  151. DetailItem = Array;
  152. return true;
  153. }
  154. bool jsonBuilder::__BuildDept( const std::map<int, _STAT_DEPT_ITEM_>& dept_map, rapidjson::Document::AllocatorType & Allocator, rapidjson::Value & Dept )
  155. {
  156. std::map<int, _STAT_DEPT_ITEM_>::const_iterator mit_dept;
  157. for ( mit_dept = dept_map.begin(); mit_dept != dept_map.end(); mit_dept++ )
  158. {
  159. rapidjson::Value DeptItem( rapidjson::kObjectType );
  160. __BuildDeptItem( mit_dept->second, Allocator, DeptItem );
  161. rapidjson::Value dept_id( rapidjson::kObjectType );
  162. char szNum[20] = { 0 };
  163. //itoa( mit_dept->second.DeptID, szNum, 10 );
  164. sprintf(szNum,"%d",mit_dept->second.DeptID);
  165. dept_id.SetString( szNum, strlen( szNum ), Allocator );
  166. Dept.AddMember( dept_id, DeptItem, Allocator );
  167. }
  168. return true;
  169. }
  170. void jsonBuilder::__BuildDeptItem( const _STAT_DEPT_ITEM_ & st_dept_item, rapidjson::Document::AllocatorType & Allocator, rapidjson::Value & DeptItem )
  171. {
  172. //Area
  173. __BuildIDSumMap( st_dept_item.Area, JSON_ROOT_KEY_STATISTIC_AREA, Allocator, DeptItem );
  174. //Dept
  175. __BuildIDSumMap( st_dept_item.Dept, JSON_ROOT_KEY_STATISTIC_DEPT, Allocator, DeptItem );
  176. //occupation_level
  177. __BuildIDSumMap( st_dept_item.OcptLvl, JSON_ROOT_KEY_STATISTIC_LEVEL, Allocator, DeptItem );
  178. //sum
  179. rapidjson::Value Sum( rapidjson::kObjectType );
  180. Sum.SetInt( st_dept_item.Sum );
  181. DeptItem.AddMember( JSON_ROOT_KEY_STATISTIC_SUM, Sum, Allocator );
  182. }
  183. void jsonBuilder::__BuildBaseCardItem( const _BASE_CARD_ & Card, rapidjson::Document::AllocatorType & Allocator, rapidjson::Value & CardItem )
  184. {
  185. rapidjson::Value TmpObj( rapidjson::kObjectType );
  186. rapidjson::Value CardObj( rapidjson::kArrayType );
  187. //0 卡号
  188. TmpObj.SetString( __FmtCardID( Card ).c_str(), Allocator );
  189. CardObj.PushBack( TmpObj, Allocator );
  190. //1 x坐标
  191. TmpObj.SetDouble( Card.x );
  192. CardObj.PushBack( TmpObj, Allocator );
  193. //2 y坐标
  194. TmpObj.SetDouble( Card.y );
  195. CardObj.PushBack( TmpObj, Allocator );
  196. //3 入井时间戳
  197. TmpObj.SetDouble( Card.down_time );
  198. CardObj.PushBack( TmpObj, Allocator );
  199. //4 进入区域时间戳
  200. TmpObj.SetDouble( Card.enter_area_time );
  201. CardObj.PushBack( TmpObj, Allocator );
  202. //5 接收时间戳
  203. TmpObj.SetDouble( Card.rec_time );
  204. CardObj.PushBack( TmpObj, Allocator );
  205. //6 工作时长
  206. TmpObj.SetDouble( Card.work_time );
  207. CardObj.PushBack( TmpObj, Allocator );
  208. //7 地图编号
  209. TmpObj.SetInt( Card.map_id );
  210. CardObj.PushBack( TmpObj, Allocator );
  211. //8 区域编号
  212. TmpObj.SetInt( Card.area_id );
  213. CardObj.PushBack( TmpObj, Allocator );
  214. //9 部门编号
  215. TmpObj.SetInt( Card.dept_id );
  216. CardObj.PushBack( TmpObj, Allocator );
  217. //10 状态
  218. TmpObj.SetInt( Card.stat );
  219. CardObj.PushBack( TmpObj, Allocator );
  220. //11 运行状态
  221. TmpObj.SetInt( Card.running_stat );
  222. CardObj.PushBack( TmpObj, Allocator );
  223. //12 业务状态
  224. TmpObj.SetInt( Card.biz_stat );
  225. CardObj.PushBack( TmpObj, Allocator );
  226. //13 速度
  227. TmpObj.SetDouble( Card.speed );
  228. CardObj.PushBack( TmpObj, Allocator );
  229. CardItem = CardObj;
  230. }
  231. void jsonBuilder::__CreateDeptMap( const _CARD_POS_ & CardPos, std::map<int, _STAT_DEPT_ITEM_>& DeptMap )
  232. {
  233. std::map<int, _STAT_DEPT_ITEM_>::iterator mit_dept_map;
  234. mit_dept_map = DeptMap.find( CardPos.dept_id );
  235. if ( mit_dept_map == DeptMap.end() )
  236. {
  237. _STAT_DEPT_ITEM_ sdItem;
  238. sdItem.DeptID = CardPos.dept_id;
  239. for(const auto &a:CardPos.area_info)
  240. sdItem.Area.insert( std::make_pair(a.first, 1 ) );
  241. sdItem.Dept.insert( std::make_pair( CardPos.dept_id, 1 ) );
  242. sdItem.OcptLvl.insert( std::make_pair( CardPos.level_id, 1 ) );
  243. sdItem.Sum = 1;
  244. DeptMap.insert( std::make_pair( sdItem.DeptID, sdItem ) );
  245. }
  246. else
  247. {
  248. __CreateDeptItem( CardPos, mit_dept_map->second );
  249. }
  250. }
  251. void jsonBuilder::__CreateDeptItem( const _CARD_POS_ & CardPos, _STAT_DEPT_ITEM_ & DeptItem )
  252. {
  253. std::map<int, int>::iterator mit_id_sum;
  254. //area
  255. for(const auto &a:CardPos.area_info)
  256. {
  257. int areaid = a.first;
  258. mit_id_sum = DeptItem.Area.find(areaid);
  259. if ( mit_id_sum == DeptItem.Area.end() )
  260. {
  261. DeptItem.Area.insert( std::make_pair(areaid, 1 ) );
  262. }
  263. else
  264. {
  265. mit_id_sum->second++;
  266. }
  267. }
  268. //Dept
  269. mit_id_sum = DeptItem.Dept.find( CardPos.dept_id );
  270. if ( mit_id_sum == DeptItem.Dept.end() )
  271. {
  272. DeptItem.Dept.insert( std::make_pair( CardPos.dept_id, 1 ) );
  273. }
  274. else
  275. {
  276. mit_id_sum->second++;
  277. }
  278. //occupation_level
  279. mit_id_sum = DeptItem.OcptLvl.find( CardPos.level_id );
  280. if ( mit_id_sum == DeptItem.OcptLvl.end() )
  281. {
  282. DeptItem.OcptLvl.insert( std::make_pair( CardPos.level_id, 1 ) );
  283. }
  284. else
  285. {
  286. mit_id_sum->second++;
  287. }
  288. //Sum
  289. DeptItem.Sum++;
  290. }
  291. void jsonBuilder::__BuildIDSumMap( const std::map<int, int>& id_sum_map, const char* szName, rapidjson::Document::AllocatorType & Allocator, rapidjson::Value & Parent )
  292. {
  293. rapidjson::Value Array( rapidjson::kArrayType );
  294. std::map<int, int>::const_iterator mit_id_sum;
  295. for ( mit_id_sum = id_sum_map.begin(); mit_id_sum != id_sum_map.end(); mit_id_sum++ )
  296. {
  297. rapidjson::Value Item( rapidjson::kArrayType );
  298. rapidjson::Value tmpobj( rapidjson::kObjectType );
  299. tmpobj.SetInt( mit_id_sum->first );
  300. Item.PushBack( tmpobj, Allocator );
  301. tmpobj.SetInt( mit_id_sum->second );
  302. Item.PushBack( tmpobj, Allocator );
  303. Array.PushBack( Item, Allocator );
  304. }
  305. Parent.AddMember( rapidjson::StringRef( szName ), Array, Allocator );
  306. }
  307. std::string jsonBuilder::BuildLogin( const _JS_LOGIN_& Login )
  308. {
  309. rapidjson::StringBuffer sb;
  310. rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
  311. rapidjson::Document doc;
  312. rapidjson::Document::AllocatorType& Allocator = doc.GetAllocator();
  313. rapidjson::Value root( rapidjson::kObjectType );
  314. rapidjson::Value child( rapidjson::kObjectType );
  315. rapidjson::Value value( rapidjson::kStringType );
  316. __SetCmd( JSON_CMD_VALUE_LOGIN, root, Allocator );
  317. value.SetString( Login.user_name.c_str(), Allocator );
  318. child.AddMember( JSON_KEY_USERNAME, value, Allocator );
  319. value.SetString( Login.user_password.c_str(), Allocator );
  320. child.AddMember( JSON_KEY_PASSWORD, value, Allocator );
  321. root.AddMember( JSON_ROOT_KEY_DATA, child, Allocator );
  322. root.Accept( writer );
  323. return sb.GetString();
  324. }
  325. std::string jsonBuilder::BuildCardPos( const std::map<uint64_t, _CARD_POS_>& CardPosList )
  326. {
  327. rapidjson::StringBuffer sb;
  328. rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
  329. rapidjson::Document doc;
  330. rapidjson::Document::AllocatorType& Allocator = doc.GetAllocator();
  331. rapidjson::Value root( rapidjson::kObjectType );
  332. __SetCmd( JSON_CMD_VALUE_POS_MAP, root, Allocator );
  333. rapidjson::Value s( rapidjson::kObjectType );
  334. rapidjson::Value v( rapidjson::kObjectType );
  335. rapidjson::Value s_Detail( rapidjson::kArrayType );
  336. rapidjson::Value v_Detail( rapidjson::kArrayType );
  337. rapidjson::Value s_dept( rapidjson::kObjectType );
  338. rapidjson::Value v_dept( rapidjson::kObjectType );
  339. std::map<int, _STAT_DEPT_ITEM_> s_dept_map;
  340. std::map<int, _STAT_DEPT_ITEM_> v_dept_map;
  341. _STAT_DEPT_ITEM_ s_glbl_item;
  342. _STAT_DEPT_ITEM_ v_glbl_item;
  343. std::map<uint64_t, _CARD_POS_>::const_iterator mit_card;
  344. for ( mit_card = CardPosList.begin(); mit_card != CardPosList.end(); mit_card++ )
  345. {
  346. //不显示的卡不往前端推送
  347. if ( !mit_card->second.display )
  348. {
  349. continue;
  350. }
  351. rapidjson::Value DetailItem;
  352. if ( !__BuildDetail( mit_card->second, Allocator, DetailItem ) )
  353. {
  354. continue;
  355. }
  356. if( mit_card->second.Type == 1)
  357. {
  358. s_Detail.PushBack( DetailItem, Allocator );
  359. __CreateDeptMap( mit_card->second, s_dept_map );
  360. __CreateDeptItem( mit_card->second, s_glbl_item );
  361. }
  362. else //车卡、采煤机等等
  363. {
  364. v_Detail.PushBack( DetailItem, Allocator );
  365. __CreateDeptMap( mit_card->second, v_dept_map );
  366. __CreateDeptItem( mit_card->second, v_glbl_item );
  367. }
  368. }
  369. s.AddMember( JSON_ROOT_KEY_STATISTIC_DETAIL, s_Detail, Allocator );
  370. v.AddMember( JSON_ROOT_KEY_STATISTIC_DETAIL, v_Detail, Allocator );
  371. //stat
  372. rapidjson::Value s_stat( rapidjson::kObjectType );
  373. rapidjson::Value v_stat( rapidjson::kObjectType );
  374. if ( __BuildDept( s_dept_map, Allocator, s_dept ) )
  375. {
  376. s_stat.AddMember( JSON_ROOT_KEY_STATISTIC_DEPT, s_dept, Allocator );
  377. }
  378. if ( __BuildDept( v_dept_map, Allocator, v_dept ) )
  379. {
  380. v_stat.AddMember( JSON_ROOT_KEY_STATISTIC_DEPT, v_dept, Allocator );
  381. }
  382. //glbl
  383. rapidjson::Value s_glbl( rapidjson::kObjectType );
  384. rapidjson::Value v_glbl( rapidjson::kObjectType );
  385. __BuildDeptItem( s_glbl_item, Allocator, s_glbl );
  386. __BuildDeptItem( v_glbl_item, Allocator, v_glbl );
  387. //s.AddMember( JSON_ROOT_KEY_STATISTIC_GLOBAL, s_glbl, Allocator );
  388. //v.AddMember( JSON_ROOT_KEY_STATISTIC_GLOBAL, v_glbl, Allocator );
  389. s_stat.AddMember( JSON_ROOT_KEY_STATISTIC_GLOBAL, s_glbl, Allocator );
  390. v_stat.AddMember( JSON_ROOT_KEY_STATISTIC_GLOBAL, v_glbl, Allocator );
  391. s.AddMember( JSON_ROOT_KEY_STATISTIC_STAT, s_stat, Allocator );
  392. v.AddMember( JSON_ROOT_KEY_STATISTIC_STAT, v_stat, Allocator );
  393. rapidjson::Value Data( rapidjson::kObjectType );
  394. Data.AddMember( JSON_ROOT_KEY_STATISTIC_STAFF_DATA, s, Allocator );
  395. Data.AddMember( JSON_ROOT_KEY_STATISTIC_VEHICLE_DATA, v, Allocator );
  396. root.AddMember( JSON_ROOT_KEY_DATA, Data, Allocator );
  397. __AddVersion( root, Allocator );
  398. root.Accept( writer );
  399. return sb.GetString();
  400. }
  401. std::string jsonBuilder::BuildSpecialAreaProcess( const _BASE_CARD_ & stCard )
  402. {
  403. rapidjson::StringBuffer sb;
  404. rapidjson::Writer<rapidjson::StringBuffer> writer( sb );
  405. rapidjson::Document doc;
  406. rapidjson::Document::AllocatorType& Allocator = doc.GetAllocator();
  407. rapidjson::Value root( rapidjson::kObjectType );
  408. __SetCmd( JSON_CMD_VALUE_SPECIAL_AREA_UP_MINE, root, Allocator );
  409. rapidjson::Value CardItem( rapidjson::kObjectType );
  410. rapidjson::Value CardList( rapidjson::kArrayType );
  411. __BuildBaseCardItem( stCard, Allocator, CardItem );
  412. CardList.PushBack( CardItem, Allocator );
  413. root.AddMember( JSON_ROOT_KEY_DATA, CardList, Allocator );
  414. root.Accept( writer );
  415. return sb.GetString();
  416. }
  417. bool jsonBuilder::ParseCall_Card_Req( const std::string& JasonText, _JS_CALL_CARD_REQ_& CallCardReq, std::string& Error )
  418. {
  419. rapidjson::Document doc;
  420. if ( doc.Parse( JasonText.c_str() ).HasParseError() )
  421. {
  422. Error = "Failed to parse jason text!";
  423. return false;
  424. }
  425. rapidjson::Value::MemberIterator itValue;
  426. itValue = doc.FindMember( "data" );
  427. if ( itValue == doc.MemberEnd() )
  428. {
  429. Error = "Failed to find member: data!";
  430. return false;
  431. }
  432. rapidjson::Value Data;
  433. rapidjson::Document::AllocatorType allocator;
  434. Data.CopyFrom( itValue->value, allocator );
  435. if ( !Data.HasMember( JSON_KEY_CALL_CARD_CALL_TYPE ) )
  436. {
  437. Error = "Failed to find value: ";
  438. Error += JSON_KEY_CALL_CARD_CALL_TYPE;
  439. return false;
  440. }
  441. CallCardReq.call_type_id = Data[JSON_KEY_CALL_CARD_CALL_TYPE].GetInt();
  442. if ( !Data.HasMember( JSON_KEY_CALL_CARD_CALL_TIME_OUT ) )
  443. {
  444. Error = "Failed to find value: ";
  445. Error += JSON_KEY_CALL_CARD_CALL_TIME_OUT;
  446. return false;
  447. }
  448. CallCardReq.call_time_out = Data[JSON_KEY_CALL_CARD_CALL_TIME_OUT].GetInt();
  449. if ( !Data.HasMember( JSON_KEY_CALL_CARD_CALL_LEVEL ) )
  450. {
  451. Error = "Failed to find value: ";
  452. Error += JSON_KEY_CALL_CARD_CALL_LEVEL;
  453. return false;
  454. }
  455. CallCardReq.call_time_interval = Data[JSON_KEY_CALL_CARD_CALL_LEVEL].GetInt();
  456. if ( !Data.HasMember( JSON_KEY_CALL_CARD_USER_NAME ) )
  457. {
  458. Error = "Failed to find value: ";
  459. Error += JSON_KEY_CALL_CARD_USER_NAME;
  460. return false;
  461. }
  462. CallCardReq.user_name = Data[JSON_KEY_CALL_CARD_USER_NAME].GetString();
  463. //data::stations
  464. if ( !Data.HasMember( JSON_KEY_CALL_CARD_STATIONS ) )
  465. {
  466. Error = "Failed to find value: ";
  467. Error += JSON_KEY_CALL_CARD_STATIONS;
  468. return false;
  469. }
  470. rapidjson::Value & stations = Data[JSON_KEY_CALL_CARD_STATIONS];
  471. if ( !stations.IsArray() )
  472. {
  473. Error = "data::stations is not a valid array!";
  474. return false;
  475. }
  476. for ( int i = 0; i < (int)stations.Size(); ++i )
  477. {
  478. rapidjson::Value & v = stations[i];
  479. if ( !v.IsObject() )
  480. {
  481. char szError[1024] = { 0 };
  482. sprintf( szError, "data::stations[%d] is not a object!", i );
  483. Error = szError;
  484. return false;
  485. }
  486. _JS_STATION_ Station;
  487. if ( !v.HasMember( JSON_KEY_CALL_CARD_STATION_ID ) && v[JSON_KEY_CALL_CARD_STATION_ID].IsInt() )
  488. {
  489. Error = "Error, failed to found value: ";
  490. Error += JSON_KEY_CALL_CARD_STATION_ID;
  491. return false;
  492. }
  493. Station.stationid = v[JSON_KEY_CALL_CARD_STATION_ID].GetInt();
  494. CallCardReq.stations.push_back( Station );
  495. }
  496. //data::cards
  497. if ( !Data.HasMember( JSON_KEY_CALL_CARD_CARDS ) )
  498. {
  499. Error = "Failed to find value: ";
  500. Error += JSON_KEY_CALL_CARD_CARDS;
  501. return false;
  502. }
  503. rapidjson::Value & cards = Data[JSON_KEY_CALL_CARD_CARDS];
  504. for ( int i = 0; i < (int)cards.Size(); ++i )
  505. {
  506. rapidjson::Value & v = cards[i];
  507. if ( !v.IsObject() )
  508. {
  509. char szError[1024] = { 0 };
  510. sprintf( szError, "data::cards[%d] is not a object!", i );
  511. Error = szError;
  512. return false;
  513. }
  514. _JS_CARD_ Card;
  515. if ( !v.HasMember( JSON_KEY_CALL_CARD_CARD_ID ) && v[JSON_KEY_CALL_CARD_CARD_ID].IsInt() )
  516. {
  517. Error = "Error, failed to found value: ";
  518. Error += JSON_KEY_CALL_CARD_CARD_ID;
  519. return false;
  520. }
  521. Card.cardid = v[JSON_KEY_CALL_CARD_CARD_ID].GetInt();
  522. if ( !v.HasMember( JSON_KEY_CALL_CARD_CARD_TYPE_ID ) && v[JSON_KEY_CALL_CARD_CARD_TYPE_ID].IsInt() )
  523. {
  524. Error = "Error, failed to found value: ";
  525. Error += JSON_KEY_CALL_CARD_CARD_TYPE_ID;
  526. return false;
  527. }
  528. Card.cardtype = v[JSON_KEY_CALL_CARD_CARD_TYPE_ID].GetInt();
  529. CallCardReq.cards.push_back( Card );
  530. }
  531. return true;
  532. }
  533. }