parkspace_manager.cpp 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938
  1. /*
  2. * @Description: 车位分配算法模块,使用单例模式,接收外部请求并通过调用通信块接口发送反馈
  3. * @Author: yct
  4. * @Date: 2020-07-10 11:02:40
  5. * @LastEditTime: 2020-08-06 10:32:28
  6. * @LastEditors: yct
  7. */
  8. #include "parkspace_manager.h"
  9. #include "parkspace_communicator.h"
  10. Parkspace_manager::Parkspace_manager()
  11. {
  12. }
  13. Parkspace_manager::~Parkspace_manager()
  14. {
  15. parkspace_manager_uninit();
  16. }
  17. //初始化
  18. Error_manager Parkspace_manager::parkspace_manager_init(int threads_size)
  19. {
  20. // 初始化任务处理线程池
  21. m_thread_pool.thread_pool_init(threads_size);
  22. m_parkspace_manager_satus = eParkspace_manager_normal;
  23. return Error_code::SUCCESS;
  24. }
  25. //反初始化
  26. Error_manager Parkspace_manager::parkspace_manager_uninit()
  27. {
  28. m_thread_pool.thread_pool_uninit();
  29. m_parkspace_manager_satus = eParkspace_manager_unknown;
  30. return Error_code::SUCCESS;
  31. }
  32. //检查执行者的状态, 判断能否处理这条消息,
  33. Error_manager Parkspace_manager::check_status()
  34. {
  35. if(get_parkspace_manage_status() != eParkspace_manager_normal)
  36. {
  37. return Error_manager(Error_code::DB_MANAGER_STATUS_ERROR, Error_level::MAJOR_ERROR,
  38. " Parkspace_manager::check_executer error ");
  39. }
  40. return SUCCESS;
  41. }
  42. //处理消息的执行函数
  43. Error_manager Parkspace_manager::execute_msg(Communication_message* p_msg)
  44. {
  45. if ( p_msg == nullptr )
  46. {
  47. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  48. " POINTER IS NULL ");
  49. }
  50. switch ( p_msg->get_message_type() )
  51. {
  52. ///车位分配请求消息
  53. case Communication_message::eParkspace_allocation_request_msg:
  54. {
  55. message::Parkspace_allocation_request_msg request;
  56. bool result = request.ParseFromString(p_msg->get_message_buf());
  57. LOG(INFO)<<"allocation request, car license: "<<request.car_info().license();
  58. if(!result)
  59. {
  60. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_MSG_PARSE_ERROR, Error_level::MINOR_ERROR,
  61. " message::Parkspace_allocation_request_msg ParseFromString error ");
  62. }
  63. // std::cout<<"分配:"<<request.DebugString()<<std::endl;
  64. //往线程池添加执行任务, 之后会唤醒一个线程去执行他.
  65. m_thread_pool.enqueue(&Parkspace_manager::execute_for_allocate, this,
  66. request.car_info(), request.terminal_id(), request.command_key());
  67. return SUCCESS;
  68. }
  69. // 车位查询请求消息
  70. case Communication_message::eParkspace_search_request_msg:
  71. {
  72. message::Parkspace_search_request_msg request;
  73. bool result = request.ParseFromString(p_msg->get_message_buf());
  74. LOG(INFO)<<"search request, car license: "<<request.car_info().license();
  75. if(!result)
  76. {
  77. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_MSG_PARSE_ERROR, Error_level::MINOR_ERROR,
  78. " message::Parkspace_search_request_msg ParseFromString error ");
  79. }
  80. //往线程池添加执行任务, 之后会唤醒一个线程去执行他.
  81. // std::cout<<"查询:"<<request.DebugString()<<std::endl;
  82. m_thread_pool.enqueue(&Parkspace_manager::execute_for_search, this, request.car_info(), request.command_key());
  83. return SUCCESS;
  84. }
  85. // 车位释放请求消息
  86. case Communication_message::eParkspace_release_request_msg:
  87. {
  88. message::Parkspace_release_request_msg request;
  89. bool result = request.ParseFromString(p_msg->get_message_buf());
  90. LOG(INFO)<<"release request ";
  91. if(!result)
  92. {
  93. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_MSG_PARSE_ERROR, Error_level::MINOR_ERROR,
  94. " message::Parkspace_release_request_msg ParseFromString error ");
  95. }
  96. //往线程池添加执行任务, 之后会唤醒一个线程去执行他.
  97. // std::cout<<"释放:"<<request.DebugString()<<std::endl;
  98. m_thread_pool.enqueue(&Parkspace_manager::execute_for_release, this, request.release_parkspace_info(), request.command_key());
  99. return SUCCESS;
  100. }
  101. // 车位手动更新请求消息
  102. case Communication_message::eParkspace_force_update_request_msg:
  103. {
  104. message::Parkspace_force_update_request_msg request;
  105. bool result = request.ParseFromString(p_msg->get_message_buf());
  106. LOG(INFO)<<"force update request, parkspace id: "<<request.manual_parkspace_info().parkingspace_index_id();
  107. if(!result)
  108. {
  109. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_MSG_PARSE_ERROR, Error_level::MINOR_ERROR,
  110. " message::Parkspace_force_update_request_msg ParseFromString error ");
  111. }
  112. //往线程池添加执行任务, 之后会唤醒一个线程去执行他.
  113. // std::cout<<"手动:"<<request.DebugString()<<std::endl;
  114. m_thread_pool.enqueue(&Parkspace_manager::execute_for_force_update, this, request.manual_parkspace_info(), request.command_key());
  115. return SUCCESS;
  116. }
  117. // 车位确认占用请求消息
  118. case Communication_message::eParkspace_confirm_alloc_request_msg:
  119. {
  120. message::Parkspace_confirm_alloc_request_msg request;
  121. bool result = request.ParseFromString(p_msg->get_message_buf());
  122. LOG(INFO)<<"confirm alloc request ";
  123. if(!result)
  124. {
  125. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_MSG_PARSE_ERROR, Error_level::MINOR_ERROR,
  126. " message::Parkspace_force_update_request_msg ParseFromString error ");
  127. }
  128. m_thread_pool.enqueue(&Parkspace_manager::execute_for_confirm_alloc, this, request);
  129. return SUCCESS;
  130. }
  131. //车位数据刷新请求
  132. case Communication_message::eParkspace_refresh_request_msg:
  133. {
  134. return send_parkspace_data();
  135. }
  136. }
  137. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_MSG_REQUEST_TYPE_ERROR, Error_level::MINOR_ERROR,
  138. " fun error ");
  139. }
  140. Error_manager Parkspace_manager::encapsulating_heartbeat_messages()
  141. {
  142. //封装心跳消息
  143. Database_controller::Database_controller_status t_database_controller_status;
  144. Parkspace_manager::Parkspace_manager_satus t_parkspace_manager_satus;
  145. t_database_controller_status = Database_controller::get_instance_pointer()->get_database_controller_status();
  146. t_parkspace_manager_satus = Parkspace_manager::get_instance_pointer()->get_parkspace_manage_status();
  147. //车位信息消息赋值
  148. message::Parkspace_allocation_status_msg t_parkspace_status_msg;
  149. message::Base_info t_base_info;
  150. message::Error_manager t_error;
  151. t_base_info.set_msg_type(message::Message_type::eParkspace_allocation_status_msg);
  152. t_base_info.set_timeout_ms(5000);
  153. t_base_info.set_sender(message::Communicator::eParkspace);
  154. t_base_info.set_receiver(message::Communicator::eMain);
  155. t_error.set_error_code(0);
  156. t_parkspace_status_msg.mutable_base_info()->CopyFrom(t_base_info);
  157. t_parkspace_status_msg.mutable_error_manager()->CopyFrom(t_error);
  158. t_parkspace_status_msg.set_database_controller_status((message::Database_controller_status)t_database_controller_status);
  159. t_parkspace_status_msg.set_parkspace_manager_satus((message::Parkspace_manager_satus)t_parkspace_manager_satus);
  160. return Parkspace_communicator::get_instance_references().encapsulate_msg(t_parkspace_status_msg.SerializeAsString());
  161. }
  162. //判断是否为待机,如果已经准备好,则可以执行任务。
  163. bool Parkspace_manager::is_ready()
  164. {
  165. if ( m_parkspace_manager_satus == eParkspace_manager_normal && m_thread_pool.thread_is_full_load() == false )
  166. {
  167. return true;
  168. }
  169. else
  170. {
  171. return false;
  172. }
  173. }
  174. Parkspace_manager::Parkspace_manager_satus Parkspace_manager::get_parkspace_manage_status()
  175. {
  176. return m_parkspace_manager_satus;
  177. }
  178. // 检查车辆是否已存在,通常分配前调用
  179. bool Parkspace_manager::check_car_existence(std::string license)
  180. {
  181. message::Parkspace_info parkspaceInfo;
  182. //获取车辆状态
  183. Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_license(license,parkspaceInfo);
  184. //如果车辆处于停车中或者已入库 则车辆已存在
  185. if(!parkspaceInfo.has_car_info())
  186. {
  187. return false;
  188. }
  189. return true;
  190. }
  191. Error_manager Parkspace_manager::send_parkspace_data()
  192. {
  193. message::Parkspace_allocation_data_msg all_parkspace_data;
  194. Error_manager t_error=m_parkspace_operating_function.get_all_parkspace_info(all_parkspace_data);
  195. if(t_error != SUCCESS)
  196. {
  197. return t_error;
  198. }
  199. message::Base_info t_base_info;
  200. message::Error_manager error;
  201. t_base_info.set_msg_type(message::Message_type::eParkspace_allocation_data_msg);
  202. t_base_info.set_timeout_ms(5000);
  203. t_base_info.set_sender(message::Communicator::eParkspace);
  204. t_base_info.set_receiver(message::Communicator::eMain);
  205. all_parkspace_data.mutable_base_info()->CopyFrom(t_base_info);
  206. error.set_error_code(0);
  207. all_parkspace_data.mutable_error_manager()->CopyFrom(error);
  208. return Parkspace_communicator::get_instance_references().encapsulate_msg(all_parkspace_data.SerializeAsString());
  209. }
  210. //找到一个最优车位---方案一
  211. Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id)
  212. {
  213. //车辆高大于1550mm分在四楼以下,小于1550mm分在四楼以上
  214. /*
  215. * K=j%15
  216. * P=i%6
  217. * S=15*d-(j%15)*(2*d-1)+[6*d-(i%6)(2*d-1)]*W W>1
  218. */
  219. float time_min=0;
  220. int parkingspace_index_id=-1;
  221. //判断是否是左半库
  222. if ( terminal_id<=3 && terminal_id>=0 )
  223. {
  224. LOG(INFO) << " 左半库 车牌号:"<<car_info.license()<<" 车高:"<<car_info.car_height();
  225. //如果是小车 (低于1.55米属于小车)
  226. if ( car_info.car_height() <= MIN_CAR_HIGH )
  227. {
  228. //获取所有小型车位信息
  229. message::Parkspace_allocation_data_msg all_min_parkspace_data;
  230. Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE);
  231. if (t_error != SUCCESS)
  232. {
  233. return t_error;
  234. }
  235. //遍历所有小型车位
  236. int i = 0;
  237. while (i < all_min_parkspace_data.parkspace_info_size())
  238. {
  239. int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id();
  240. //筛选出一号车库的小型车位(第一优先级)的空车位
  241. if (room_id %15 <= 7 && room_id %15 >= 1
  242. && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  243. {
  244. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  245. float time = (terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  246. (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  247. (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  248. if (time_min == 0)
  249. {
  250. time_min = time;
  251. parkingspace_index_id = i;
  252. }
  253. else
  254. {
  255. if ( time < time_min )
  256. {
  257. time_min = time;
  258. parkingspace_index_id = i;
  259. }
  260. }
  261. }
  262. ++i;
  263. }
  264. //判断小车车位(第一优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  265. if ( time_min!=0 && parkingspace_index_id!=-1 )
  266. {
  267. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id));
  268. parkspace_info.set_path_estimate_time(time_min);
  269. parkspace_info.set_parkspace_path(message::OPTIMAL_PATH);
  270. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  271. return Error_code::SUCCESS;
  272. }
  273. else
  274. {
  275. LOG(INFO) << " 小车车位未找到合适车位 "<< this;
  276. }
  277. }
  278. if ( car_info.car_height() <= MID_CAR_HIGH )
  279. {
  280. //第二优先级(中型车位)
  281. //获取中型车位
  282. message::Parkspace_allocation_data_msg all_mid_parkspace_data;
  283. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE);
  284. if(t_error != SUCCESS)
  285. {
  286. return t_error;
  287. }
  288. int i=0;
  289. while(i<all_mid_parkspace_data.parkspace_info_size())
  290. {
  291. //三楼的中型车位有单独的中跑车停车 且机械臂可以直接抓车到三楼
  292. int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
  293. if ( room_id >= 19 && room_id <= 22)
  294. {
  295. //只需计算端口到车位的距离
  296. // 三楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  297. float t_min=abs( room_id%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  298. if ( time_min == 0 )
  299. {
  300. time_min=t_min;
  301. parkingspace_index_id=i;
  302. }
  303. else
  304. {
  305. if ( t_min<time_min )
  306. {
  307. time_min=t_min;
  308. parkingspace_index_id=i;
  309. }
  310. }
  311. }
  312. //如果是六楼的中型车位
  313. if ( room_id <= 67 && room_id >=61
  314. && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  315. {
  316. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  317. float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  318. (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  319. all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  320. if ( time_min == 0 )
  321. {
  322. time_min=time;
  323. parkingspace_index_id=i;
  324. }
  325. else
  326. {
  327. if ( time<time_min )
  328. {
  329. time_min=time;
  330. parkingspace_index_id=i;
  331. }
  332. }
  333. }
  334. ++i;
  335. }
  336. //判断中型车位(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
  337. if ( time_min!=0 && parkingspace_index_id!=-1 )
  338. {
  339. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
  340. parkspace_info.set_path_estimate_time(time_min);
  341. parkspace_info.set_parkspace_path(message::OPTIMAL_PATH);
  342. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  343. return Error_code::SUCCESS;
  344. }
  345. else
  346. {
  347. LOG(INFO) << " 中车车位未找到合适车位 "<< this;
  348. }
  349. }
  350. if ( car_info.car_height() <= BIG_CAR_HIGH )
  351. {
  352. //第三优先级(大型车位)
  353. //获取大型车位
  354. message::Parkspace_allocation_data_msg all_big_parkspace_data;
  355. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
  356. if(t_error != SUCCESS)
  357. {
  358. return t_error;
  359. }
  360. int i=0;
  361. while(i<all_big_parkspace_data.parkspace_info_size())
  362. {
  363. int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
  364. //筛选出一号车库的大型车位
  365. if ( room_id%15 <= 7 && room_id %15 >=1
  366. && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  367. {
  368. //如果是二楼车 则特殊处理
  369. if ( all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id() == 2 )
  370. {
  371. // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  372. float t_min=abs( room_id%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width() - (terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  373. if ( time_min == 0 )
  374. {
  375. time_min=t_min;
  376. parkingspace_index_id=i;
  377. }
  378. else
  379. {
  380. if ( t_min<time_min )
  381. {
  382. time_min=t_min;
  383. parkingspace_index_id=i;
  384. }
  385. }
  386. }
  387. else
  388. {
  389. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  390. float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  391. (all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_big_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  392. all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  393. if ( time_min == 0 )
  394. {
  395. time_min=time;
  396. parkingspace_index_id=i;
  397. }
  398. else
  399. {
  400. if ( time<time_min )
  401. {
  402. time_min=time;
  403. parkingspace_index_id=i;
  404. }
  405. }
  406. }
  407. }
  408. ++i;
  409. }
  410. //判断大型车位(第三优先级)是否有找到合适的空车位 如果找到了 直接返回
  411. if ( time_min!=0 && parkingspace_index_id!=-1 )
  412. {
  413. parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info(parkingspace_index_id));
  414. parkspace_info.set_path_estimate_time(time_min);
  415. parkspace_info.set_parkspace_path(message::OPTIMAL_PATH);
  416. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  417. return Error_code::SUCCESS;
  418. }
  419. else
  420. {
  421. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::MINOR_ERROR,
  422. " query_the_optimal_parkspace_serverA error ");
  423. }
  424. }
  425. }
  426. //判断是否是右半库
  427. else if(terminal_id<=6 && terminal_id>=4)
  428. {
  429. //如果是小车 (低于1.55米属于小车)
  430. if ( car_info.car_height() <= MIN_CAR_HIGH )
  431. {
  432. //获取所有小型车位信息
  433. message::Parkspace_allocation_data_msg all_min_parkspace_data;
  434. Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE);
  435. if (t_error != SUCCESS)
  436. {
  437. return t_error;
  438. }
  439. //遍历所有小型车位
  440. int i = 0;
  441. while (i < all_min_parkspace_data.parkspace_info_size())
  442. {
  443. int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id();
  444. //筛选出一号车库的小型车位(第一优先级)的空车位
  445. if (room_id <= 165 && room_id >= 53
  446. && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  447. {
  448. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  449. float time = (6-terminal_id+2)* TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  450. (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  451. ( (15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15)==15?0:(15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) ) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  452. if (time_min == 0)
  453. {
  454. time_min = time;
  455. parkingspace_index_id = i;
  456. }
  457. else
  458. {
  459. if ( time < time_min )
  460. {
  461. time_min = time;
  462. parkingspace_index_id = i;
  463. }
  464. }
  465. }
  466. ++i;
  467. }
  468. //判断小车车位(第一优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  469. if ( time_min!=0 && parkingspace_index_id!=-1 )
  470. {
  471. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id));
  472. parkspace_info.set_path_estimate_time(time_min);
  473. parkspace_info.set_parkspace_path(message::OPTIMAL_PATH);
  474. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  475. return Error_code::SUCCESS;
  476. }
  477. }
  478. if ( car_info.car_height() <= MID_CAR_HIGH )
  479. {
  480. //第二优先级(中型车位)
  481. //获取中型车位
  482. message::Parkspace_allocation_data_msg all_mid_parkspace_data;
  483. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE);
  484. if(t_error != SUCCESS)
  485. {
  486. return t_error;
  487. }
  488. int i=0;
  489. while(i<all_mid_parkspace_data.parkspace_info_size())
  490. {
  491. int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
  492. //三楼的中型车位有单独的中跑车停车 且机械臂可以直接抓车到三楼
  493. if ( room_id >= 23 && room_id <= 27 )
  494. {
  495. //只需计算端口到车位的距离
  496. // 三楼中型车位用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  497. float t_min=abs( ((15-room_id%15)==15?0:(15-room_id%15))*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()-(6-terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  498. if ( time_min == 0 )
  499. {
  500. time_min=t_min;
  501. parkingspace_index_id=i;
  502. }
  503. else
  504. {
  505. if ( t_min<time_min )
  506. {
  507. time_min=t_min;
  508. parkingspace_index_id=i;
  509. }
  510. }
  511. }
  512. if ( room_id <= 75 && room_id >= 68
  513. && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  514. {
  515. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  516. float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  517. (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  518. ( ((15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15) ==15?0:(15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)) )*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  519. if ( time_min == 0 )
  520. {
  521. time_min=time;
  522. parkingspace_index_id=i;
  523. }
  524. else
  525. {
  526. if ( time<time_min )
  527. {
  528. time_min=time;
  529. parkingspace_index_id=i;
  530. }
  531. }
  532. }
  533. ++i;
  534. }
  535. //判断中型车位(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
  536. if ( time_min!=0 && parkingspace_index_id!=-1 )
  537. {
  538. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
  539. parkspace_info.set_path_estimate_time(time_min);
  540. parkspace_info.set_parkspace_path(message::OPTIMAL_PATH);
  541. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  542. return Error_code::SUCCESS;
  543. }
  544. }
  545. if ( car_info.car_height() <= BIG_CAR_HIGH )
  546. {
  547. //第三优先级(大型车位)
  548. //获取大型车位
  549. message::Parkspace_allocation_data_msg all_big_parkspace_data;
  550. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
  551. if(t_error != SUCCESS)
  552. {
  553. return t_error;
  554. }
  555. int i=0;
  556. while(i<all_big_parkspace_data.parkspace_info_size())
  557. {
  558. int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
  559. //筛选出二号车库的大型车位的空车位
  560. if ( room_id %15 >=8 && room_id %15 <=14 || room_id %15 == 0
  561. && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  562. {
  563. //如果是二楼车 则特殊处理
  564. if ( all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id() == 2 )
  565. {
  566. // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  567. float t_min=abs( ((15-room_id%15)==15?0:(15-room_id%15))*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-(6-terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  568. if ( time_min == 0 )
  569. {
  570. time_min=t_min;
  571. parkingspace_index_id=i;
  572. }
  573. else
  574. {
  575. if ( t_min<time_min )
  576. {
  577. time_min=t_min;
  578. parkingspace_index_id=i;
  579. }
  580. }
  581. }
  582. else
  583. {
  584. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  585. float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  586. (all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_big_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  587. ( ((15-all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15) ==15?0:(15-all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)) )*all_big_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  588. if ( time_min == 0 )
  589. {
  590. time_min=time;
  591. parkingspace_index_id=i;
  592. }
  593. else
  594. {
  595. if ( time<time_min )
  596. {
  597. time_min=time;
  598. parkingspace_index_id=i;
  599. }
  600. }
  601. }
  602. }
  603. ++i;
  604. }
  605. //判断大型车位(第三优先级)是否有找到合适的空车位 如果找到了 直接返回
  606. if ( time_min!=0 && parkingspace_index_id!=-1 )
  607. {
  608. parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info(parkingspace_index_id));
  609. parkspace_info.set_path_estimate_time(time_min);
  610. parkspace_info.set_parkspace_path(message::OPTIMAL_PATH);\
  611. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  612. return Error_code::SUCCESS;
  613. }
  614. else
  615. {
  616. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::MINOR_ERROR,
  617. " query_the_optimal_parkspace_serverA error ");
  618. }
  619. }
  620. }
  621. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::MINOR_ERROR,
  622. "query_the_optimal_parkspace_serverA error ");
  623. }
  624. //找到一个最优车位---方案二
  625. //找左侧车位
  626. Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id)
  627. {
  628. //车辆高大于1550mm分在四楼以下,小于1550mm分在四楼以上
  629. /*
  630. * K=j%15
  631. * P=i%6
  632. * S=15*d-(j%15)*(2*d-1)+[6*d-(i%6)(2*d-1)]*W W>1
  633. */
  634. float time_min=0;
  635. int parkingspace_index_id=-1;
  636. //找左侧车位
  637. //如果是小车 (低于1.55米属于小车)
  638. if ( car_info.car_height() <= MIN_CAR_HIGH )
  639. {
  640. //获取所有小型车位信息
  641. message::Parkspace_allocation_data_msg all_min_parkspace_data;
  642. Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE);
  643. if (t_error != SUCCESS)
  644. {
  645. return t_error;
  646. }
  647. //遍历所有小型车位
  648. int i = 0;
  649. while (i < all_min_parkspace_data.parkspace_info_size())
  650. {
  651. int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id();
  652. //筛选出小型车位的中间部分(第一优先级)的空车位
  653. if (room_id % 15 <= 7 && room_id % 15 >= 4
  654. && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  655. {
  656. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  657. float time = (terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  658. (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  659. (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  660. if (time_min == 0)
  661. {
  662. time_min = time;
  663. parkingspace_index_id = i;
  664. }
  665. else
  666. {
  667. if ( time<time_min )
  668. {
  669. time_min=time;
  670. parkingspace_index_id=i;
  671. }
  672. }
  673. }
  674. ++i;
  675. }
  676. //判断小车车位中间部分(第一优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  677. if ( time_min!=0 && parkingspace_index_id!=-1 )
  678. {
  679. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id));
  680. parkspace_info.set_path_estimate_time(time_min);
  681. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  682. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  683. return Error_code::SUCCESS;
  684. }
  685. else
  686. {
  687. //如果没找到则找小车车位第二优先级 (侧边)
  688. int i = 0;
  689. while (i < all_min_parkspace_data.parkspace_info_size())
  690. {
  691. int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id();
  692. if (room_id % 15 <= 3 && room_id % 15 >= 1
  693. && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  694. {
  695. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  696. float time = (terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  697. (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  698. (all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  699. if (time_min == 0)
  700. {
  701. time_min = time;
  702. parkingspace_index_id = i;
  703. }
  704. else
  705. {
  706. if ( time < time_min )
  707. {
  708. time_min = time;
  709. parkingspace_index_id = i;
  710. }
  711. }
  712. }
  713. ++i;
  714. }
  715. //判断小车车位侧边部分(第二优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  716. if ( time_min!=0 && parkingspace_index_id!=-1 )
  717. {
  718. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id));
  719. parkspace_info.set_path_estimate_time(time_min);
  720. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  721. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  722. return Error_code::SUCCESS;
  723. }
  724. }
  725. }
  726. if ( car_info.car_height() <= MID_CAR_HIGH )
  727. {
  728. //找中型车位
  729. //获取中型车位
  730. message::Parkspace_allocation_data_msg all_mid_parkspace_data;
  731. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE);
  732. if(t_error != SUCCESS)
  733. {
  734. return t_error;
  735. }
  736. int i=0;
  737. while(i<all_mid_parkspace_data.parkspace_info_size())
  738. {
  739. int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
  740. //如果是六楼的中型车位的中间部分(第一优先级)
  741. if ( room_id >=64 && room_id <= 67
  742. && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  743. {
  744. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  745. float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  746. (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  747. (all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  748. if ( time_min == 0 )
  749. {
  750. time_min=time;
  751. parkingspace_index_id=i;
  752. }
  753. else
  754. {
  755. if ( time<time_min )
  756. {
  757. time_min=time;
  758. parkingspace_index_id=i;
  759. }
  760. }
  761. }
  762. ++i;
  763. }
  764. //判断中型车位的中间部分(第一优先级)是否有找到合适的空车位 如果找到了 直接返回
  765. if ( time_min!=0 && parkingspace_index_id!=-1 )
  766. {
  767. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
  768. parkspace_info.set_path_estimate_time(time_min);
  769. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  770. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  771. return Error_code::SUCCESS;
  772. }
  773. else
  774. {
  775. //如果没找到则找侧边中型车位(第二优先级)
  776. int i=0;
  777. while(i<all_mid_parkspace_data.parkspace_info_size())
  778. {
  779. int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
  780. //如果是六楼的中型车位的侧边(第二优先级)
  781. if ( room_id >=61 && room_id <= 63
  782. && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  783. {
  784. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  785. float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  786. (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  787. all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  788. if ( time_min == 0 )
  789. {
  790. time_min=time;
  791. parkingspace_index_id=i;
  792. }
  793. else
  794. {
  795. if ( time<time_min )
  796. {
  797. time_min=time;
  798. parkingspace_index_id=i;
  799. }
  800. }
  801. }
  802. ++i;
  803. }
  804. //判断中型车位侧边(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
  805. if ( time_min!=0 && parkingspace_index_id!=-1 )
  806. {
  807. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
  808. parkspace_info.set_path_estimate_time(time_min);
  809. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  810. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  811. return Error_code::SUCCESS;
  812. }
  813. }
  814. }
  815. if ( car_info.car_height() <= BIG_CAR_HIGH )
  816. {
  817. //找大型车位
  818. //获取大型车位
  819. message::Parkspace_allocation_data_msg all_big_parkspace_data;
  820. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
  821. if(t_error != SUCCESS)
  822. {
  823. return t_error;
  824. }
  825. int i=0;
  826. while(i<all_big_parkspace_data.parkspace_info_size())
  827. {
  828. int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
  829. //筛选出一号车库的小型车位的靠近电梯的左侧三排(第二优先级)的空车位
  830. if ( room_id %15 == 1 || room_id %15 == 2 || room_id %15 == 3 || room_id>=34 && room_id<=37
  831. && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  832. {
  833. //如果是二楼车 则特殊处理
  834. if ( all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id() == 2 )
  835. {
  836. // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  837. float t_min=abs( room_id%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  838. if ( time_min == 0 )
  839. {
  840. time_min=t_min;
  841. parkingspace_index_id=i;
  842. }
  843. else
  844. {
  845. if ( t_min<time_min )
  846. {
  847. time_min=t_min;
  848. parkingspace_index_id=i;
  849. }
  850. }
  851. }
  852. else
  853. {
  854. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  855. float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  856. (all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_big_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  857. all_big_parkspace_data.parkspace_info(i).parkingspace_index_id()%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  858. if ( time_min == 0 )
  859. {
  860. time_min=time;
  861. parkingspace_index_id=i;
  862. }
  863. else
  864. {
  865. if ( time<time_min )
  866. {
  867. time_min=time;
  868. parkingspace_index_id=i;
  869. }
  870. }
  871. }
  872. }
  873. ++i;
  874. }
  875. //判断大型车位是否有找到合适的空车位 如果找到了 直接返回
  876. if ( time_min!=0 && parkingspace_index_id!=-1 )
  877. {
  878. parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info(parkingspace_index_id));
  879. parkspace_info.set_path_estimate_time(time_min);
  880. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  881. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  882. return Error_code::SUCCESS;
  883. }
  884. else
  885. {
  886. //如果没找到则代表左侧没找到合适车位
  887. parkspace_info.set_parkingspace_index_id(-1);
  888. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  889. "无合适车位分配! query_the_optimal_parkspace_serverB1 error ");
  890. }
  891. }
  892. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  893. "无合适车位分配! query_the_optimal_parkspace_serverB1 error ");
  894. }
  895. //找右侧车位
  896. Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB2(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id)
  897. {
  898. //车辆高大于1550mm分在四楼以下,小于1550mm分在四楼以上
  899. /*
  900. * K=j%15
  901. * P=i%6
  902. * S=15*d-(j%15)*(2*d-1)+[6*d-(i%6)(2*d-1)]*W W>1
  903. */
  904. float time_min=0;
  905. int parkingspace_index_id=-1;
  906. //找右侧车位
  907. //如果是小车 (低于1.55米属于小车)
  908. if ( car_info.car_height() <= MIN_CAR_HIGH )
  909. {
  910. //获取所有小型车位信息
  911. message::Parkspace_allocation_data_msg all_min_parkspace_data;
  912. Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE);
  913. if (t_error != SUCCESS)
  914. {
  915. return t_error;
  916. }
  917. //遍历所有小型车位
  918. int i = 0;
  919. while (i < all_min_parkspace_data.parkspace_info_size())
  920. {
  921. int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id();
  922. //筛选出小型车位的中间部分(第一优先级)的空车位
  923. if (room_id % 15 >= 8 && room_id % 15 <= 12
  924. && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  925. {
  926. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  927. float time = (6-terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  928. (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  929. ( (15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15)==15?0:(15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) ) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  930. if (time_min == 0)
  931. {
  932. time_min = time;
  933. parkingspace_index_id = i;
  934. }
  935. else
  936. {
  937. if ( time<time_min )
  938. {
  939. time_min=time;
  940. parkingspace_index_id=i;
  941. }
  942. }
  943. }
  944. ++i;
  945. }
  946. //判断小车车位中间部分(第一优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  947. if ( time_min!=0 && parkingspace_index_id!=-1 )
  948. {
  949. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id));
  950. parkspace_info.set_path_estimate_time(time_min);
  951. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  952. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  953. return Error_code::SUCCESS;
  954. }
  955. else
  956. {
  957. //如果没找到则找小车车位第二优先级 (侧边)
  958. int i = 0;
  959. while (i < all_min_parkspace_data.parkspace_info_size())
  960. {
  961. int room_id=all_min_parkspace_data.parkspace_info(i).parkingspace_index_id();
  962. //筛选出一号车库的小型车位的中间部分(第一优先级)的空车位
  963. if (room_id % 15 == 13 || room_id % 15 == 14 || room_id % 15 == 0
  964. && all_min_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  965. {
  966. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  967. float time = (6-terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  968. (all_min_parkspace_data.parkspace_info(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  969. ( (15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15)==15?0:(15-all_min_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) ) *all_min_parkspace_data.parkspace_info(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  970. if (time_min == 0)
  971. {
  972. time_min = time;
  973. parkingspace_index_id = i;
  974. }
  975. else
  976. {
  977. if ( time < time_min )
  978. {
  979. time_min = time;
  980. parkingspace_index_id = i;
  981. }
  982. }
  983. }
  984. ++i;
  985. }
  986. //判断小车车位侧边部分(第二优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  987. if ( time_min!=0 && parkingspace_index_id!=-1 )
  988. {
  989. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info(parkingspace_index_id));
  990. parkspace_info.set_path_estimate_time(time_min);
  991. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  992. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  993. return Error_code::SUCCESS;
  994. }
  995. }
  996. }
  997. if ( car_info.car_height() <= MID_CAR_HIGH )
  998. {
  999. //找中型车位
  1000. //获取中型车位
  1001. message::Parkspace_allocation_data_msg all_mid_parkspace_data;
  1002. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE);
  1003. if(t_error != SUCCESS)
  1004. {
  1005. return t_error;
  1006. }
  1007. int i=0;
  1008. while(i<all_mid_parkspace_data.parkspace_info_size())
  1009. {
  1010. int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
  1011. //如果是六楼的中型车位的中间部分(第一优先级)
  1012. if ( room_id >= 68 && room_id <= 72
  1013. && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  1014. {
  1015. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  1016. float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  1017. (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  1018. ( ((15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15) ==15?0:(15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)) )*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  1019. if ( time_min == 0 )
  1020. {
  1021. time_min=time;
  1022. parkingspace_index_id=i;
  1023. }
  1024. else
  1025. {
  1026. if ( time<time_min )
  1027. {
  1028. time_min=time;
  1029. parkingspace_index_id=i;
  1030. }
  1031. }
  1032. }
  1033. ++i;
  1034. }
  1035. //判断中型车位的中间部分(第一优先级)是否有找到合适的空车位 如果找到了 直接返回
  1036. if ( time_min!=0 && parkingspace_index_id!=-1 )
  1037. {
  1038. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
  1039. parkspace_info.set_path_estimate_time(time_min);
  1040. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  1041. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  1042. return Error_code::SUCCESS;
  1043. }
  1044. else
  1045. {
  1046. //如果没找到则找侧边中型车位(第二优先级)
  1047. int i=0;
  1048. while(i<all_mid_parkspace_data.parkspace_info_size())
  1049. {
  1050. int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
  1051. //如果是六楼的中型车位的侧边(第二优先级)
  1052. if ( room_id >=73 && room_id <= 75
  1053. && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  1054. {
  1055. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  1056. float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  1057. (all_mid_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  1058. ( ((15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15) ==15?0:(15-all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id()%15)) )*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  1059. if ( time_min == 0 )
  1060. {
  1061. time_min=time;
  1062. parkingspace_index_id=i;
  1063. }
  1064. else
  1065. {
  1066. if ( time<time_min )
  1067. {
  1068. time_min=time;
  1069. parkingspace_index_id=i;
  1070. }
  1071. }
  1072. }
  1073. ++i;
  1074. }
  1075. //判断中型车位侧边(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
  1076. if ( time_min!=0 && parkingspace_index_id!=-1 )
  1077. {
  1078. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
  1079. parkspace_info.set_path_estimate_time(time_min);
  1080. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  1081. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  1082. return Error_code::SUCCESS;
  1083. }
  1084. }
  1085. }
  1086. if ( car_info.car_height() <= BIG_CAR_HIGH )
  1087. {
  1088. //找大型车位
  1089. //获取大型车位
  1090. message::Parkspace_allocation_data_msg all_big_parkspace_data;
  1091. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
  1092. if(t_error != SUCCESS)
  1093. {
  1094. return t_error;
  1095. }
  1096. int i=0;
  1097. while(i<all_big_parkspace_data.parkspace_info_size())
  1098. {
  1099. int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
  1100. //筛选出大型车位的靠近电梯的右侧三排(第二优先级)的空车位
  1101. if ( room_id %15 == 13 || room_id %15 == 14 || room_id %15 == 0|| room_id>=38 && room_id<=42
  1102. && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  1103. {
  1104. //如果是二楼车 则特殊处理
  1105. if ( all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id() == 2 )
  1106. {
  1107. // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  1108. float t_min=abs( ((15-room_id%15)==15?0:(15-room_id%15))*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-(6-terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  1109. if ( time_min == 0 )
  1110. {
  1111. time_min=t_min;
  1112. parkingspace_index_id=i;
  1113. }
  1114. else
  1115. {
  1116. if ( t_min<time_min )
  1117. {
  1118. time_min=t_min;
  1119. parkingspace_index_id=i;
  1120. }
  1121. }
  1122. }
  1123. else
  1124. {
  1125. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  1126. float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  1127. (all_big_parkspace_data.parkspace_info(i).parkingspace_floor_id()-2)*all_big_parkspace_data.parkspace_info(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  1128. ( (15-all_big_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15)==15?0:(15-all_big_parkspace_data.parkspace_info(i).parkingspace_index_id() % 15) )*all_big_parkspace_data.parkspace_info(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  1129. if ( time_min == 0 )
  1130. {
  1131. time_min=time;
  1132. parkingspace_index_id=i;
  1133. }
  1134. else
  1135. {
  1136. if ( time<time_min )
  1137. {
  1138. time_min=time;
  1139. parkingspace_index_id=i;
  1140. }
  1141. }
  1142. }
  1143. }
  1144. ++i;
  1145. }
  1146. //判断大型车位是否有找到合适的空车位 如果找到了 直接返回
  1147. if ( time_min!=0 && parkingspace_index_id!=-1 )
  1148. {
  1149. parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info(parkingspace_index_id));
  1150. parkspace_info.set_path_estimate_time(time_min);
  1151. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  1152. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  1153. return Error_code::SUCCESS;
  1154. }
  1155. else
  1156. {
  1157. //如果没找到则代表右侧没找到合适车位
  1158. parkspace_info.set_parkingspace_index_id(-1);
  1159. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  1160. "无合适车位分配! query_the_optimal_parkspace_serverB2 error ");
  1161. }
  1162. }
  1163. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  1164. " 无合适车位分配! query_the_optimal_parkspace_serverB2 error ");
  1165. }
  1166. //找缓存区车位
  1167. Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB3(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id)
  1168. {
  1169. //车辆高大于1550mm分在四楼以下,小于1550mm分在四楼以上
  1170. /*
  1171. * K=j%15
  1172. * P=i%6
  1173. * S=15*d-(j%15)*(2*d-1)+[6*d-(i%6)(2*d-1)]*W W>1
  1174. */
  1175. float time_min=0;
  1176. int parkingspace_index_id=-1;
  1177. //找缓存区车位 缓冲区只有中型车位和大型车位
  1178. if ( car_info.car_height() <= MID_CAR_HIGH )
  1179. {
  1180. message::Parkspace_allocation_data_msg all_mid_parkspace_data;
  1181. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE);
  1182. if(t_error != SUCCESS)
  1183. {
  1184. return t_error;
  1185. }
  1186. int i=0;
  1187. while (i < all_mid_parkspace_data.parkspace_info_size())
  1188. {
  1189. //筛选中型车位缓冲区
  1190. int room_id=all_mid_parkspace_data.parkspace_info(i).parkingspace_index_id();
  1191. if ( room_id >= 19 && room_id <= 27
  1192. && all_mid_parkspace_data.parkspace_info(i).parkingspace_status() == message::eParkspace_empty)
  1193. {
  1194. //只需计算端口到车位的距离
  1195. // 三楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  1196. float t_min=abs( room_id%15*all_mid_parkspace_data.parkspace_info(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  1197. if ( time_min == 0 )
  1198. {
  1199. time_min=t_min;
  1200. parkingspace_index_id=i;
  1201. }
  1202. else
  1203. {
  1204. if ( t_min<time_min )
  1205. {
  1206. time_min=t_min;
  1207. parkingspace_index_id=i;
  1208. }
  1209. }
  1210. }
  1211. ++i;
  1212. }
  1213. //判断缓冲区的中型车位是否有找到合适的空车位 如果找到了 直接返回
  1214. if ( time_min!=0 && parkingspace_index_id!=-1 )
  1215. {
  1216. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info(parkingspace_index_id));
  1217. parkspace_info.set_path_estimate_time(time_min);
  1218. parkspace_info.set_parkspace_path(message::TEMPORARY_CACHE_PATH);
  1219. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  1220. return Error_code::SUCCESS;
  1221. }
  1222. }
  1223. if( car_info.car_height() <= BIG_CAR_HIGH )
  1224. {
  1225. message::Parkspace_allocation_data_msg all_big_parkspace_data;
  1226. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
  1227. if(t_error != SUCCESS)
  1228. {
  1229. return t_error;
  1230. }
  1231. int i=0;
  1232. while (i < all_big_parkspace_data.parkspace_info_size())
  1233. {
  1234. //筛选中型车位缓冲区
  1235. int room_id=all_big_parkspace_data.parkspace_info(i).parkingspace_index_id();
  1236. if ( room_id >= 4 && room_id <= 12
  1237. && all_big_parkspace_data.parkspace_info(i).parkingspace_status() == message::eParkspace_empty)
  1238. {
  1239. //只需计算端口到车位的距离
  1240. // 二楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  1241. float t_min=abs( room_id%15*all_big_parkspace_data.parkspace_info(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  1242. if ( time_min == 0 )
  1243. {
  1244. time_min=t_min;
  1245. parkingspace_index_id=i;
  1246. }
  1247. else
  1248. {
  1249. if ( t_min<time_min )
  1250. {
  1251. time_min=t_min;
  1252. parkingspace_index_id=i;
  1253. }
  1254. }
  1255. }
  1256. ++i;
  1257. }
  1258. //判断缓冲区的中型车位是否有找到合适的空车位 如果找到了 直接返回
  1259. if ( time_min!=0 && parkingspace_index_id!=-1 )
  1260. {
  1261. parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info(parkingspace_index_id));
  1262. parkspace_info.set_path_estimate_time(time_min);
  1263. parkspace_info.set_parkspace_path(message::TEMPORARY_CACHE_PATH);
  1264. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  1265. return Error_code::SUCCESS;
  1266. }
  1267. else
  1268. {
  1269. //如果没找到则代表缓冲区没找到合适车位
  1270. parkspace_info.set_parkingspace_index_id(-1);
  1271. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  1272. "无合适车位分配! query_the_optimal_parkspace_serverB3 error ");
  1273. }
  1274. }
  1275. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  1276. " 无合适车位分配! query_the_optimal_parkspace_serverB3 error ");
  1277. }
  1278. //分配车位线程函数
  1279. void Parkspace_manager:: execute_for_allocate(message::Car_info car_info, int terminal_id, std::string command_key)
  1280. {
  1281. LOG(INFO) << "分配车位 " << "牌号:" << car_info.license() << " 车高:" << car_info.car_height()
  1282. << " command_key=" << command_key;
  1283. //根据请求的信息反馈分配的车位,并封装发送
  1284. message::Parkspace_allocation_response_msg response_msg;
  1285. message::Base_info t_response_header;
  1286. t_response_header.set_msg_type(message::Message_type::eParkspace_allocation_response_msg);
  1287. t_response_header.set_timeout_ms(1000);
  1288. t_response_header.set_sender(message::Communicator::eParkspace);
  1289. t_response_header.set_receiver(message::Communicator::eMain);
  1290. message::Error_manager t_error;
  1291. //方案A的车位
  1292. message::Parkspace_info t_allocated_space;
  1293. //方案B的车位
  1294. message::Parkspace_info t_allocated_space_left;
  1295. message::Parkspace_info t_allocated_space_rigth;
  1296. message::Parkspace_info t_allocated_space_temporary;
  1297. Error_manager error_A;
  1298. Error_manager error_B1;
  1299. Error_manager error_B2;
  1300. Error_manager error_B3;
  1301. //分配之前查询车辆是否已经存在
  1302. if (check_car_existence(car_info.license()))
  1303. {
  1304. t_error.set_error_code(PARKSPACE_ALLOCATOR_CAR_ALREADY_EXIST);
  1305. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  1306. t_error.set_error_description("车辆已存在");
  1307. LOG(ERROR) << car_info.license() << " 车辆已存在";
  1308. }
  1309. else
  1310. {
  1311. m_parkspace_lock.lock();
  1312. if (!PLAN)
  1313. {
  1314. // 如果车辆不存在 则找到一个最优车位(方案A)----车库分为两个独立部分,左库和右库如果1~3号终端来车 则在左库分配车位,4~号终端来车 则在右库分配车位
  1315. LOG(INFO) << " 方案A---------分配车位中---------- " ;
  1316. error_A = query_the_optimal_parkspace_serverA(t_allocated_space, car_info, terminal_id);
  1317. if (error_A != Error_code::SUCCESS)
  1318. {
  1319. t_error.set_error_code(error_A.get_error_code());
  1320. t_error.set_error_level((message::Error_level) error_A.get_error_level());
  1321. t_error.set_error_description(error_A.get_error_description());
  1322. LOG(ERROR) << car_info.license() << " 获取空车位失败 " << error_A.to_string();
  1323. }
  1324. else
  1325. {
  1326. //修改车位状态为锁定
  1327. t_allocated_space.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
  1328. t_allocated_space.mutable_car_info()->CopyFrom(car_info);
  1329. // 分配车位后更新数据库中车位状态
  1330. error_A = m_parkspace_operating_function.update_parkspace_data(t_allocated_space);
  1331. if (error_A != SUCCESS)
  1332. {
  1333. //若更新车位数据失败会直接返回,不要进行回退操作
  1334. t_error.set_error_code(error_A.get_error_code());
  1335. t_error.set_error_level((message::Error_level) error_A.get_error_level());
  1336. t_error.set_error_description(error_A.get_error_description());
  1337. LOG(ERROR) << car_info.license() << " 更新车位数据失败 " << error_A.to_string();
  1338. }
  1339. else
  1340. {
  1341. t_error.set_error_code(SUCCESS);
  1342. t_error.set_error_level(message::Error_level::NORMAL);
  1343. LOG(INFO) << "方案A --- 分配车位成功 " << "车位ID:" << t_allocated_space.parkingspace_index_id()
  1344. << " 车牌号:" << t_allocated_space.car_info().license();
  1345. response_msg.mutable_allocated_parkspace_info()->CopyFrom(t_allocated_space);
  1346. }
  1347. }
  1348. }
  1349. else
  1350. {
  1351. // 如果车辆不存在 则找到一个最优车位(方案B)----分配三个车位 左边分配一个 右边分配一个 缓冲区分配一个 最后使用那个由调度决定
  1352. LOG(INFO) << " 方案B---------分配车位中---------- " << this;
  1353. //获取左侧车位
  1354. error_B1 = query_the_optimal_parkspace_serverB1(t_allocated_space_left, car_info, terminal_id);
  1355. if (error_B1 != Error_code::SUCCESS)
  1356. {
  1357. LOG(ERROR) << car_info.license() << " 获取左侧车位失败 " << error_B1.to_string();
  1358. }
  1359. else
  1360. {
  1361. t_allocated_space_left.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
  1362. t_allocated_space_left.mutable_car_info()->CopyFrom(car_info);
  1363. // 分配车位后更新数据库中车位状态--左车位
  1364. error_B1 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_left);
  1365. if (error_B1 != SUCCESS)
  1366. {
  1367. LOG(ERROR) << car_info.license() << " 左车位更新数据失败 " << error_B1.to_string();
  1368. }
  1369. else
  1370. {
  1371. response_msg.add_allocated_parkspace_info_ex()->CopyFrom(t_allocated_space_left);
  1372. LOG(INFO) << " ----- 左 车 位ID: " << t_allocated_space_left.parkingspace_index_id() << "-----";
  1373. }
  1374. }
  1375. //获取右侧车位
  1376. error_B2 = query_the_optimal_parkspace_serverB2(t_allocated_space_rigth, car_info, terminal_id);
  1377. if (error_B2 != Error_code::SUCCESS)
  1378. {
  1379. LOG(ERROR) << car_info.license() << " 获取右侧车位失败 " << error_B2.to_string();
  1380. }
  1381. else
  1382. {
  1383. t_allocated_space_rigth.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
  1384. t_allocated_space_rigth.mutable_car_info()->CopyFrom(car_info);
  1385. // 分配车位后更新数据库中车位状态--右车位
  1386. error_B2 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_rigth);
  1387. if (error_B2 != SUCCESS)
  1388. {
  1389. LOG(ERROR) << car_info.license() << " 右车位更新数据失败 " << error_B2.to_string();
  1390. }
  1391. else
  1392. {
  1393. response_msg.add_allocated_parkspace_info_ex()->CopyFrom(t_allocated_space_rigth);
  1394. LOG(INFO) << " ----- 右 车 位ID: " << t_allocated_space_rigth.parkingspace_index_id() << "-----";
  1395. }
  1396. }
  1397. //获取缓冲区车位
  1398. error_B3 = query_the_optimal_parkspace_serverB3(t_allocated_space_temporary, car_info, terminal_id);
  1399. if (error_B3 != Error_code::SUCCESS)
  1400. {
  1401. LOG(ERROR) << car_info.license() << " 获取缓冲区车位失败 " << error_B3.to_string();
  1402. }
  1403. else
  1404. {
  1405. t_allocated_space_temporary.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
  1406. t_allocated_space_temporary.mutable_car_info()->CopyFrom(car_info);
  1407. // 分配车位后更新数据库中车位状态--缓冲车位
  1408. error_B3 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_temporary);
  1409. if (error_B3 != SUCCESS)
  1410. {
  1411. LOG(ERROR) << car_info.license() << " 缓冲车位更新数据失败 " << error_B3.to_string();
  1412. }
  1413. else
  1414. {
  1415. response_msg.add_allocated_parkspace_info_ex()->CopyFrom(t_allocated_space_temporary);
  1416. LOG(INFO) << " -----缓冲车位车位ID: " << t_allocated_space_temporary.parkingspace_index_id() << "-----";
  1417. }
  1418. }
  1419. Error_manager error_total;
  1420. error_total.compare_and_cover_error(error_B1);
  1421. error_total.compare_and_cover_error(error_B2);
  1422. error_total.compare_and_cover_error(error_B3);
  1423. if ( error_B1==SUCCESS || error_B2==SUCCESS || error_B3==SUCCESS )
  1424. {
  1425. t_error.set_error_code(SUCCESS);
  1426. t_error.set_error_level(message::Error_level::NORMAL);
  1427. LOG(INFO) << " 分配车位成功! ";
  1428. }
  1429. else
  1430. {
  1431. t_error.set_error_code(PARKSPACE_ALLOCATOR_ALLOCATE_FAILED);
  1432. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  1433. t_error.set_error_description(error_total.get_error_description());
  1434. LOG(INFO) << " 分配车位失败,无车位! ";
  1435. }
  1436. }
  1437. m_parkspace_lock.unlock();
  1438. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1439. response_msg.set_command_key(command_key);
  1440. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1441. Communication_message response = Communication_message();
  1442. response.reset(t_response_header, response_msg.SerializeAsString());
  1443. Parkspace_communicator::get_instance_references().send_response(&response);
  1444. send_parkspace_data();
  1445. std::cout << std::endl;
  1446. }
  1447. }
  1448. //确认分配车位线程函数
  1449. void Parkspace_manager::execute_for_confirm_alloc(message::Parkspace_confirm_alloc_request_msg request)
  1450. {
  1451. message::Parkspace_confirm_alloc_response_msg response_msg;
  1452. message::Base_info t_response_header;
  1453. t_response_header.set_msg_type(message::eParkspace_confirm_alloc_response_msg);
  1454. t_response_header.set_sender(message::eParkspace);
  1455. t_response_header.set_receiver(message::eMain);
  1456. t_response_header.set_timeout_ms(1000);
  1457. message::Error_manager t_error;
  1458. t_error.set_error_code(Error_code::SUCCESS);
  1459. t_error.set_error_level(message::Error_level::NORMAL);
  1460. //确认分配车位
  1461. message::Parkspace_info confirm_alloc_parkspace_info;
  1462. //释放车位
  1463. message::Parkspace_info release_alloc_space_info;
  1464. if ( !PLAN )
  1465. {
  1466. Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_parkspace_id(request.confirm_parkspace_info().parkingspace_index_id(),confirm_alloc_parkspace_info);
  1467. if ( error != SUCCESS )
  1468. {
  1469. t_error.set_error_code(error.get_error_code());
  1470. t_error.set_error_level((message::Error_level)error.get_error_level());
  1471. t_error.set_error_description(error.get_error_description());
  1472. }
  1473. if ( confirm_alloc_parkspace_info.parkingspace_status() != message::eParkspace_locked )
  1474. {
  1475. t_error.set_error_code(PARKSPACE_ALLOCATOR_CONFIRM_ALLOC_ERROR);
  1476. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  1477. t_error.set_error_description("该车位已被占用");
  1478. }
  1479. else
  1480. {
  1481. LOG(INFO) << "方案A---------确认分配 " << "牌号:" << request.confirm_parkspace_info().car_info().license() ;
  1482. error=confirm_alloc_function(request.confirm_parkspace_info(),confirm_alloc_parkspace_info);
  1483. if ( error != SUCCESS )
  1484. {
  1485. t_error.set_error_code(error.get_error_code());
  1486. t_error.set_error_level((message::Error_level)error.get_error_level());
  1487. t_error.set_error_description(error.get_error_description());
  1488. }
  1489. else
  1490. {
  1491. response_msg.mutable_confirm_alloc_parkspace_info()->CopyFrom(confirm_alloc_parkspace_info);
  1492. }
  1493. }
  1494. }
  1495. else
  1496. {
  1497. Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_parkspace_id(request.confirm_parkspace_info().parkingspace_index_id(),confirm_alloc_parkspace_info);
  1498. if ( error != SUCCESS )
  1499. {
  1500. t_error.set_error_code(error.get_error_code());
  1501. t_error.set_error_level((message::Error_level)error.get_error_level());
  1502. t_error.set_error_description(error.get_error_description());
  1503. }
  1504. if ( confirm_alloc_parkspace_info.parkingspace_status() != message::eParkspace_empty )
  1505. {
  1506. t_error.set_error_code(PARKSPACE_ALLOCATOR_CONFIRM_ALLOC_ERROR);
  1507. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  1508. t_error.set_error_description("该车位已被占用");
  1509. }
  1510. else
  1511. {
  1512. for (int i = 0; i < request.confirm_parkspace_info_ex().size(); ++i)
  1513. {
  1514. if ( request.confirm_parkspace_info_ex(i).parkspace_status_target() == message::eParkspace_occupied )
  1515. {
  1516. LOG(INFO) << "方案B---------确认分配 " << "牌号:" << request.confirm_parkspace_info_ex(i).car_info().license() ;
  1517. Error_manager error=confirm_alloc_function(request.confirm_parkspace_info_ex(i),confirm_alloc_parkspace_info);
  1518. if ( error != SUCCESS )
  1519. {
  1520. t_error.set_error_code(error.get_error_code());
  1521. t_error.set_error_level((message::Error_level)error.get_error_level());
  1522. t_error.set_error_description(error.get_error_description());
  1523. }
  1524. else
  1525. {
  1526. response_msg.add_confirm_parkspace_info_ex()->CopyFrom(confirm_alloc_parkspace_info);
  1527. }
  1528. }
  1529. else if ( request.confirm_parkspace_info_ex(i).parkspace_status_target() == message::eParkspace_empty )
  1530. {
  1531. Error_manager error=release_parkspace_function(request.confirm_parkspace_info_ex(i),release_alloc_space_info,false);
  1532. }
  1533. }
  1534. }
  1535. }
  1536. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1537. response_msg.set_command_key(request.command_key());
  1538. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1539. Communication_message response=Communication_message();
  1540. response.reset(t_response_header, response_msg.SerializeAsString());
  1541. Parkspace_communicator::get_instance_references().send_response(&response);
  1542. send_parkspace_data();
  1543. std::cout<<std::endl;
  1544. }
  1545. //查询车位线程函数
  1546. void Parkspace_manager::execute_for_search(message::Car_info car_info,std::string command_key)
  1547. {
  1548. LOG(INFO) << "查询车位 "<<"牌号:"<<car_info.license()<<" command_key="<<command_key;
  1549. //根据车辆凭证信息查询车辆位置
  1550. message::Parkspace_search_response_msg response_msg;
  1551. message::Base_info t_response_header;
  1552. message::Error_manager t_error;
  1553. t_response_header.set_msg_type(message::Message_type::eParkspace_search_response_msg);
  1554. t_response_header.set_timeout_ms(1000);
  1555. t_response_header.set_sender(message::Communicator::eParkspace);
  1556. t_response_header.set_receiver(message::Communicator::eMain);
  1557. //查询车辆位置
  1558. message::Parkspace_info parkspace_info;
  1559. Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_license(car_info.license(),parkspace_info);
  1560. if ( error != SUCCESS )
  1561. {
  1562. t_error.set_error_code(error.get_error_code());
  1563. t_error.set_error_level((message::Error_level)error.get_error_level());
  1564. t_error.set_error_description(error.get_error_description());
  1565. LOG(ERROR) << "查询车位失败 "<<error.to_string();
  1566. }
  1567. else
  1568. {
  1569. t_error.set_error_code(SUCCESS);
  1570. t_error.set_error_level(message::Error_level::NORMAL);
  1571. LOG(INFO) << "车辆"<<parkspace_info.car_info().license()<<" 在"<<parkspace_info.parkingspace_index_id()<<"号车位上";
  1572. }
  1573. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1574. response_msg.set_command_key(command_key);
  1575. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1576. response_msg.mutable_query_parkspace_info()->CopyFrom(parkspace_info);
  1577. Communication_message response=Communication_message();
  1578. response.reset(t_response_header, response_msg.SerializeAsString());
  1579. Parkspace_communicator::get_instance_references().send_response(&response);
  1580. std::cout<<std::endl;
  1581. }
  1582. //释放车位线程函数
  1583. void Parkspace_manager::execute_for_release(message::Parkspace_info space_info, std::string command_key)
  1584. {
  1585. LOG(INFO) << "释放车位 "<<"牌号:"<<space_info.car_info().license()<<" command_key="<<command_key;
  1586. //根据车位信息定位待释放车位位置,车辆凭证号用于校验
  1587. message::Parkspace_release_response_msg response_msg;
  1588. message::Base_info t_response_header;
  1589. t_response_header.set_msg_type(message::eParkspace_release_response_msg);
  1590. t_response_header.set_sender(message::eParkspace);
  1591. t_response_header.set_receiver(message::eMain);
  1592. t_response_header.set_timeout_ms(1000);
  1593. message::Error_manager t_error;
  1594. t_error.set_error_code(Error_code::SUCCESS);
  1595. t_error.set_error_level(message::Error_level::NORMAL);
  1596. message::Parkspace_info t_release_space;
  1597. Error_manager error=release_parkspace_function(space_info,t_release_space,true);
  1598. if ( error != SUCCESS )
  1599. {
  1600. t_error.set_error_code(error.get_error_code());
  1601. t_error.set_error_level((message::Error_level)error.get_error_level());
  1602. t_error.set_error_description(error.get_error_description());
  1603. }
  1604. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1605. response_msg.set_command_key(command_key);
  1606. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1607. response_msg.mutable_release_parkspace_info()->CopyFrom(t_release_space);
  1608. Communication_message response=Communication_message();
  1609. response.reset(t_response_header, response_msg.SerializeAsString());
  1610. Parkspace_communicator::get_instance_references().send_response(&response);
  1611. send_parkspace_data();
  1612. std::cout<<std::endl;
  1613. }
  1614. //强制更新车位信息线程函数
  1615. void Parkspace_manager::execute_for_force_update(message::Parkspace_info space_info, std::string command_key)
  1616. {
  1617. LOG(INFO) << "手动 "<<"牌号:"<<space_info.car_info().license()<<" command_key="<<command_key;
  1618. //根据车位信息定位待释放车位位置,车辆凭证号用于校验
  1619. //!!!!!此处跳过外部处理与调用的过程,直接在内部调用,发送分配结果用于测试,目前一直发布第一个车位
  1620. message::Parkspace_force_update_response_msg response_msg;
  1621. message::Base_info t_response_header;
  1622. t_response_header.set_msg_type(message::eParkspace_force_update_response_msg);
  1623. t_response_header.set_sender(message::eParkspace);
  1624. t_response_header.set_receiver(message::eMain);
  1625. t_response_header.set_timeout_ms(1000);
  1626. message::Error_manager t_error;
  1627. message::Parkspace_info t_update_space;
  1628. Error_manager error;
  1629. // id 9999为特殊情况,复位所有车位状态
  1630. if (space_info.parkingspace_index_id() == 9999)
  1631. {
  1632. // 复位所有车位状态
  1633. error=m_parkspace_operating_function.clear_all_parkspace_info();
  1634. if( error != SUCCESS)
  1635. {
  1636. t_error.set_error_code(error.get_error_code());
  1637. t_error.set_error_level((message::Error_level) error.get_error_level());
  1638. LOG(INFO) << "手动更新所有车位失败 "<<error.to_string();
  1639. }
  1640. else
  1641. {
  1642. t_error.set_error_code(SUCCESS);
  1643. t_error.set_error_level(message::Error_level::NORMAL);
  1644. LOG(INFO) << "所有车位已手动更新 ";
  1645. }
  1646. }
  1647. else
  1648. {
  1649. //手动修改车位信息
  1650. error = m_parkspace_operating_function.update_parkspace_data(t_update_space);
  1651. if (error != SUCCESS)
  1652. {
  1653. t_error.set_error_code(error.get_error_code());
  1654. t_error.set_error_level((message::Error_level)error.get_error_level());
  1655. LOG(INFO) << "手动 数据库更新车位失败 "<<error.to_string();
  1656. }
  1657. else
  1658. {
  1659. t_error.set_error_code(SUCCESS);
  1660. t_error.set_error_level(message::Error_level::NORMAL);
  1661. LOG(INFO) << "第" << t_update_space.parkingspace_index_id() << "号位已手动更新";
  1662. }
  1663. }
  1664. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1665. response_msg.set_command_key(command_key);
  1666. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1667. response_msg.mutable_manual_parkspace_info()->CopyFrom(t_update_space);
  1668. Communication_message response=Communication_message();
  1669. response.reset(t_response_header, response_msg.SerializeAsString());
  1670. Parkspace_communicator::get_instance_references().send_response(&response);
  1671. send_parkspace_data();
  1672. }
  1673. //确认分配操作函数、
  1674. Error_manager Parkspace_manager::confirm_alloc_function(message::Parkspace_info space_info,message::Parkspace_info& t_confirm_space)
  1675. {
  1676. //根据车位信息定位待确认占用车位
  1677. Error_manager error;
  1678. //记录当前传入车辆的状态 为后续回退操作服务
  1679. message::Parkspace_status t_parkingspace_status=space_info.parkingspace_status();
  1680. if (!space_info.has_car_info())
  1681. {
  1682. LOG(WARNING) << "传入待确认车位无车辆信息";
  1683. return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
  1684. " 确认分配车位传入参数无车辆信息! ");
  1685. }
  1686. t_confirm_space.CopyFrom(space_info);
  1687. if(!PLAN)
  1688. {
  1689. //方案一传入的车辆只有一个 状态为锁定 需要手动修改成占用后才能进行写入数据库
  1690. if (t_confirm_space.parkingspace_status() != message::Parkspace_status::eParkspace_locked)
  1691. {
  1692. LOG(ERROR) << "确认分配校验车位状态错误!" ;
  1693. return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
  1694. " 确认分配校验车位状态错误! ");
  1695. }
  1696. else
  1697. {
  1698. t_confirm_space.set_parkingspace_status(message::eParkspace_occupied);
  1699. t_confirm_space.set_parkspace_status_target(message::eParkspace_occupied);
  1700. }
  1701. }
  1702. if(t_confirm_space.parkspace_status_target() == message::eParkspace_occupied && space_info.has_car_info())
  1703. {
  1704. //更新车位数据1
  1705. t_confirm_space.set_parkingspace_status(message::eParkspace_occupied);
  1706. error = m_parkspace_operating_function.update_parkspace_data(t_confirm_space);
  1707. if (error != SUCCESS)
  1708. {
  1709. LOG(INFO) << "确认分配 数据库更新车位数据失败 " << error.to_string();
  1710. return error;
  1711. }
  1712. else
  1713. {
  1714. //修改车辆状态为已入库
  1715. message::Vehicle_status t_vehicle_status = message::Vehicle_status::eVehicle_in_garage;
  1716. error = m_parkspace_operating_function.update_vehicle_with_parkspace(t_confirm_space, t_vehicle_status);
  1717. if (error != SUCCESS)
  1718. {
  1719. //此处操作不成功就需要回退 因为前一步骤更改了车位表信息导致二表不统一
  1720. LOG(ERROR) << "确认分配 更新数据库车辆数据失败 进行回退---" << error.to_string();
  1721. t_confirm_space.set_parkingspace_status(t_parkingspace_status);
  1722. t_confirm_space.set_parkspace_status_target(t_parkingspace_status);
  1723. for (int i = 1; i < 4; ++i)
  1724. {
  1725. Error_manager e = m_parkspace_operating_function.update_parkspace_data(t_confirm_space);
  1726. if (e != SUCCESS)
  1727. {
  1728. LOG(INFO) << "回退第"<<i<<"次 失败! " << e.to_string();
  1729. continue;
  1730. }
  1731. else
  1732. {
  1733. LOG(INFO) << " 回退成功! ";
  1734. return e;
  1735. }
  1736. }
  1737. //如果流程进行到这里说明回退三次都失败 需要报三级故障
  1738. return Error_manager(Error_code::DB_UPDATE_FAILED, Error_level::MAJOR_ERROR,
  1739. " update database error ");
  1740. }
  1741. error.set_error_code(SUCCESS);
  1742. error.set_error_level_location(Error_level::NEGLIGIBLE_ERROR);
  1743. LOG(INFO) << "第:" << t_confirm_space.parkingspace_index_id() << "号位 车辆: " << t_confirm_space.car_info().license()<< " 确认占用成功";
  1744. //插入停车记录
  1745. time_t tt = time(NULL);
  1746. tm *t = localtime(&tt);
  1747. char my_time_buf[255];
  1748. memset(my_time_buf, 0, 255);
  1749. sprintf(my_time_buf, "%d-%02d-%02d %02d:%02d:%02d",
  1750. t->tm_year + 1900,
  1751. t->tm_mon + 1,
  1752. t->tm_mday,
  1753. t->tm_hour,
  1754. t->tm_min,
  1755. t->tm_sec);
  1756. t_confirm_space.set_entry_time(my_time_buf);
  1757. error = m_parkspace_operating_function.insert_parking_record(t_confirm_space);
  1758. if ( error != SUCCESS )
  1759. {
  1760. LOG(ERROR) << "插入停车记录失败: " << error.to_string();
  1761. }
  1762. //查询停车记录的ID
  1763. int t_record_id;
  1764. error = m_parkspace_operating_function.query_parking_record(t_confirm_space,t_record_id);
  1765. if ( error != SUCCESS )
  1766. {
  1767. LOG(ERROR) << "查询停车记录ID失败: " << error.to_string();
  1768. }
  1769. //更新停车记录ID
  1770. error = m_parkspace_operating_function.update_record_id(t_confirm_space.car_info().license(),t_record_id);
  1771. if ( error != SUCCESS )
  1772. {
  1773. LOG(ERROR) << "更新停车记录ID失败: " << error.to_string();
  1774. }
  1775. }
  1776. }
  1777. return error;
  1778. }
  1779. //释放车位操作函数
  1780. Error_manager Parkspace_manager::release_parkspace_function(message::Parkspace_info target_space_info,message::Parkspace_info& release_parkspace_info,bool flag)
  1781. {
  1782. Error_manager error;if(!target_space_info.has_car_info())
  1783. {
  1784. LOG(WARNING) << "传入待释放车位无车辆信息";
  1785. return error;
  1786. }
  1787. release_parkspace_info.CopyFrom(target_space_info);
  1788. if ( !PLAN )
  1789. {
  1790. if ( release_parkspace_info.parkingspace_status() == message::eParkspace_occupied ||
  1791. release_parkspace_info.parkingspace_status() == message::eParkspace_locked )
  1792. {
  1793. release_parkspace_info.set_parkingspace_status(message::eParkspace_empty);
  1794. release_parkspace_info.set_parkspace_status_target(message::eParkspace_empty);
  1795. }
  1796. else
  1797. {
  1798. LOG(ERROR) << "释放车位校验状态失败!" ;
  1799. return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
  1800. " 释放车位校验状态失败! ");
  1801. }
  1802. }
  1803. if(release_parkspace_info.parkspace_status_target() == message::eParkspace_empty && release_parkspace_info.has_car_info())
  1804. {
  1805. release_parkspace_info.set_parkingspace_status(message::eParkspace_empty);
  1806. error = m_parkspace_operating_function.update_parkspace_data(release_parkspace_info);
  1807. if (error != SUCCESS)
  1808. {
  1809. LOG(ERROR) << "释放车位 更新数据库车位数据失败 " << error.to_string();
  1810. return error;
  1811. }
  1812. else
  1813. {
  1814. if ( flag == false )
  1815. {
  1816. error.set_error_code(SUCCESS);
  1817. error.set_error_level_location(Error_level::NORMAL);
  1818. LOG(INFO) << "不更新车辆表释放 --- 第:" << release_parkspace_info.parkingspace_index_id() << "号位 车辆: " << release_parkspace_info.car_info().license()
  1819. << " 释放成功";
  1820. }
  1821. else
  1822. {
  1823. message::Vehicle_status t_vehicle_status;
  1824. //获取预约ID
  1825. int t_park_record_id;
  1826. error = m_parkspace_operating_function.query_vehicle(release_parkspace_info.car_info().license(),
  1827. t_vehicle_status, t_park_record_id);
  1828. if (error != SUCCESS)
  1829. {
  1830. LOG(ERROR) << "释放车位 数据库查询车辆信息失败 " << error.to_string();
  1831. }
  1832. t_vehicle_status=message::eVehicle_idle;
  1833. error = m_parkspace_operating_function.update_vehicle_with_parkspace(release_parkspace_info, t_vehicle_status);
  1834. if (error != SUCCESS)
  1835. {
  1836. LOG(ERROR) << "释放车位 更新数据库车辆数据失败 " << error.to_string();
  1837. return error;
  1838. }
  1839. error.set_error_code(SUCCESS);
  1840. error.set_error_level_location(Error_level::NORMAL);
  1841. LOG(INFO) << "更新车辆表--- 第:" << release_parkspace_info.parkingspace_index_id() << "号位 车辆: " << release_parkspace_info.car_info().license()
  1842. << " 释放成功";
  1843. time_t tt = time(NULL);
  1844. tm *t = localtime(&tt);
  1845. char my_time_buf[255];
  1846. memset(my_time_buf, 0, 255);
  1847. sprintf(my_time_buf, "%d-%02d-%02d %02d:%02d:%02d",
  1848. t->tm_year + 1900,
  1849. t->tm_mon + 1,
  1850. t->tm_mday,
  1851. t->tm_hour,
  1852. t->tm_min,
  1853. t->tm_sec);
  1854. release_parkspace_info.set_leave_time(my_time_buf);
  1855. error = m_parkspace_operating_function.update_parking_record(release_parkspace_info, t_park_record_id);
  1856. if (error != SUCCESS)
  1857. {
  1858. LOG(ERROR) << "更新停车记录失败: " << error.to_string();
  1859. }
  1860. }
  1861. }
  1862. }
  1863. return error;
  1864. }