parkspace_manager.cpp 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470
  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, 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 ";
  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, 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. message::Parkspace_allocation_data_msg parkspaceAllocationDataMsg;
  161. m_parkspace_operating_function.get_specify_the_type_parkspace_info(parkspaceAllocationDataMsg,message::Parkspace_type::MIN_PARKINGSPACE);
  162. t_parkspace_status_msg.set_small_parkspace_remaining_number(parkspaceAllocationDataMsg.parkspace_info_ex_size());
  163. parkspaceAllocationDataMsg.clear_parkspace_info_ex();
  164. m_parkspace_operating_function.get_specify_the_type_parkspace_info(parkspaceAllocationDataMsg,message::Parkspace_type::MID_PARKINGSPACE);
  165. t_parkspace_status_msg.set_small_parkspace_remaining_number(parkspaceAllocationDataMsg.parkspace_info_ex_size());
  166. parkspaceAllocationDataMsg.clear_parkspace_info_ex();
  167. m_parkspace_operating_function.get_specify_the_type_parkspace_info(parkspaceAllocationDataMsg,message::Parkspace_type::BIG_PARKINGSPACE);
  168. t_parkspace_status_msg.set_small_parkspace_remaining_number(parkspaceAllocationDataMsg.parkspace_info_ex_size());
  169. parkspaceAllocationDataMsg.clear_parkspace_info_ex();
  170. return Parkspace_communicator::get_instance_references().encapsulate_msg(t_parkspace_status_msg.SerializeAsString());
  171. }
  172. //判断是否为待机,如果已经准备好,则可以执行任务。
  173. bool Parkspace_manager::is_ready()
  174. {
  175. if ( m_parkspace_manager_satus == eParkspace_manager_normal && m_thread_pool.thread_is_full_load() == false )
  176. {
  177. return true;
  178. }
  179. else
  180. {
  181. return false;
  182. }
  183. }
  184. Parkspace_manager::Parkspace_manager_satus Parkspace_manager::get_parkspace_manage_status()
  185. {
  186. return m_parkspace_manager_satus;
  187. }
  188. // 检查车辆是否已存在,通常分配前调用
  189. bool Parkspace_manager::check_car_existence(std::string license)
  190. {
  191. message::Parkspace_info parkspaceInfo;
  192. //获取车辆状态
  193. Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_license(license,parkspaceInfo);
  194. //如果车辆处于停车中或者已入库 则车辆已存在
  195. if(!parkspaceInfo.has_car_info())
  196. {
  197. return false;
  198. }
  199. return true;
  200. }
  201. Error_manager Parkspace_manager::send_parkspace_data()
  202. {
  203. message::Parkspace_allocation_data_msg all_parkspace_data;
  204. Error_manager t_error=m_parkspace_operating_function.get_all_parkspace_info(all_parkspace_data);
  205. if(t_error != SUCCESS)
  206. {
  207. return t_error;
  208. }
  209. message::Base_info t_base_info;
  210. message::Error_manager error;
  211. t_base_info.set_msg_type(message::Message_type::eParkspace_allocation_data_msg);
  212. t_base_info.set_timeout_ms(5000);
  213. t_base_info.set_sender(message::Communicator::eParkspace);
  214. t_base_info.set_receiver(message::Communicator::eMain);
  215. all_parkspace_data.mutable_base_info()->CopyFrom(t_base_info);
  216. error.set_error_code(0);
  217. all_parkspace_data.mutable_error_manager()->CopyFrom(error);
  218. return Parkspace_communicator::get_instance_references().encapsulate_msg(all_parkspace_data.SerializeAsString());
  219. }
  220. //
  221. //找到一个最优车位---方案二
  222. //找左侧车位
  223. Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id)
  224. {
  225. //车辆高大于1550mm分在四楼以下,小于1550mm分在四楼以上
  226. /*
  227. * K=j%15
  228. * P=i%6
  229. * S=15*d-(j%15)*(2*d-1)+[6*d-(i%6)(2*d-1)]*W W>1
  230. */
  231. float time_min=0;
  232. int parkingspace_index_id=-1;
  233. //找左侧车位
  234. //如果是小车 (低于1.55米属于小车)
  235. if ( car_info.car_height() <= MIN_CAR_HIGH )
  236. {
  237. //获取所有小型车位信息
  238. message::Parkspace_allocation_data_msg all_min_parkspace_data;
  239. Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE);
  240. if (t_error != SUCCESS)
  241. {
  242. return t_error;
  243. }
  244. //遍历所有小型车位
  245. int i = 0;
  246. while (i < all_min_parkspace_data.parkspace_info_ex_size())
  247. {
  248. int room_id=all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  249. //筛选出小型车位的中间部分(第一优先级)的空车位
  250. if (room_id % 15 >= 4 && room_id % 15 <= 12
  251. && all_min_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  252. {
  253. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  254. float time = (terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  255. (all_min_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info_ex(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  256. (all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id() % 15) *all_min_parkspace_data.parkspace_info_ex(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  257. if (time_min == 0)
  258. {
  259. time_min = time;
  260. parkingspace_index_id = i;
  261. }
  262. else
  263. {
  264. if ( time<time_min )
  265. {
  266. time_min=time;
  267. parkingspace_index_id=i;
  268. }
  269. }
  270. }
  271. ++i;
  272. }
  273. //判断小车车位中间部分(第一优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  274. if ( time_min!=0 && parkingspace_index_id!=-1 )
  275. {
  276. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  277. parkspace_info.set_path_estimate_time(time_min);
  278. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  279. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  280. return Error_code::SUCCESS;
  281. }
  282. else
  283. {
  284. //如果没找到则找小车车位第二优先级 (侧边)
  285. int i = 0;
  286. while (i < all_min_parkspace_data.parkspace_info_ex_size())
  287. {
  288. int room_id=all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  289. if ( (room_id % 15 >= 1 && room_id % 15 <= 3 || room_id % 15 == 13 || room_id % 15 ==14 || room_id % 15 ==0 )
  290. && all_min_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  291. {
  292. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  293. float time = (terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  294. (all_min_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info_ex(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  295. (all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id() % 15) *all_min_parkspace_data.parkspace_info_ex(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  296. if (time_min == 0)
  297. {
  298. time_min = time;
  299. parkingspace_index_id = i;
  300. }
  301. else
  302. {
  303. if ( time < time_min )
  304. {
  305. time_min = time;
  306. parkingspace_index_id = i;
  307. }
  308. }
  309. }
  310. ++i;
  311. }
  312. //判断小车车位侧边部分(第二优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  313. if ( time_min!=0 && parkingspace_index_id!=-1 )
  314. {
  315. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  316. parkspace_info.set_path_estimate_time(time_min);
  317. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  318. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  319. return Error_code::SUCCESS;
  320. }
  321. }
  322. }
  323. if ( car_info.car_height() <= MID_CAR_HIGH )
  324. {
  325. //找中型车位
  326. //获取中型车位
  327. message::Parkspace_allocation_data_msg all_mid_parkspace_data;
  328. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE);
  329. if(t_error != SUCCESS)
  330. {
  331. return t_error;
  332. }
  333. int i=0;
  334. while(i<all_mid_parkspace_data.parkspace_info_ex_size())
  335. {
  336. int room_id=all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  337. //如果是六楼的中型车位的中间部分(第一优先级)
  338. if ( room_id >=64 && room_id <= 72
  339. && all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  340. {
  341. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  342. float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  343. (all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  344. (all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id()%15)*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  345. if ( time_min == 0 )
  346. {
  347. time_min=time;
  348. parkingspace_index_id=i;
  349. }
  350. else
  351. {
  352. if ( time<time_min )
  353. {
  354. time_min=time;
  355. parkingspace_index_id=i;
  356. }
  357. }
  358. }
  359. ++i;
  360. }
  361. //判断中型车位的中间部分(第一优先级)是否有找到合适的空车位 如果找到了 直接返回
  362. if ( time_min!=0 && parkingspace_index_id!=-1 )
  363. {
  364. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  365. parkspace_info.set_path_estimate_time(time_min);
  366. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  367. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  368. return Error_code::SUCCESS;
  369. }
  370. else
  371. {
  372. //如果没找到则找侧边中型车位(第二优先级)
  373. int i=0;
  374. while(i<all_mid_parkspace_data.parkspace_info_ex_size())
  375. {
  376. int room_id=all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  377. //如果是六楼的中型车位的侧边(第二优先级)
  378. if ( (room_id >=61 && room_id <= 63 || room_id % 15 == 13 || room_id % 15 ==14 || room_id % 15 ==0 )
  379. && all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  380. {
  381. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  382. float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  383. (all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  384. all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id()%15*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  385. if ( time_min == 0 )
  386. {
  387. time_min=time;
  388. parkingspace_index_id=i;
  389. }
  390. else
  391. {
  392. if ( time<time_min )
  393. {
  394. time_min=time;
  395. parkingspace_index_id=i;
  396. }
  397. }
  398. }
  399. ++i;
  400. }
  401. //判断中型车位侧边(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
  402. if ( time_min!=0 && parkingspace_index_id!=-1 )
  403. {
  404. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  405. parkspace_info.set_path_estimate_time(time_min);
  406. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  407. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  408. return Error_code::SUCCESS;
  409. }
  410. }
  411. }
  412. if ( car_info.car_height() <= BIG_CAR_HIGH )
  413. {
  414. //找大型车位
  415. //获取大型车位
  416. message::Parkspace_allocation_data_msg all_big_parkspace_data;
  417. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
  418. if(t_error != SUCCESS)
  419. {
  420. return t_error;
  421. }
  422. int i=0;
  423. while(i<all_big_parkspace_data.parkspace_info_ex_size())
  424. {
  425. int room_id=all_big_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  426. //筛选出一号车库的小型车位的靠近电梯的左侧三排(第二优先级)的空车位
  427. if ( ( (room_id %15 >= 1 && room_id %15 <= 3) || (room_id>=34 && room_id<=42) || room_id % 15 == 13 || room_id % 15 ==14 || room_id % 15 ==0 )
  428. && all_big_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  429. {
  430. //如果是二楼车 则特殊处理
  431. if ( all_big_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id() == 2 )
  432. {
  433. // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  434. float t_min=abs( room_id%15*all_big_parkspace_data.parkspace_info_ex(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  435. if ( time_min == 0 )
  436. {
  437. time_min=t_min;
  438. parkingspace_index_id=i;
  439. }
  440. else
  441. {
  442. if ( t_min<time_min )
  443. {
  444. time_min=t_min;
  445. parkingspace_index_id=i;
  446. }
  447. }
  448. }
  449. else
  450. {
  451. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  452. float time=(terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  453. (all_big_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id()-2)*all_big_parkspace_data.parkspace_info_ex(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  454. all_big_parkspace_data.parkspace_info_ex(i).parkingspace_index_id()%15*all_big_parkspace_data.parkspace_info_ex(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  455. if ( time_min == 0 )
  456. {
  457. time_min=time;
  458. parkingspace_index_id=i;
  459. }
  460. else
  461. {
  462. if ( time<time_min )
  463. {
  464. time_min=time;
  465. parkingspace_index_id=i;
  466. }
  467. }
  468. }
  469. }
  470. ++i;
  471. }
  472. //判断大型车位是否有找到合适的空车位 如果找到了 直接返回
  473. if ( time_min!=0 && parkingspace_index_id!=-1 )
  474. {
  475. parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  476. parkspace_info.set_path_estimate_time(time_min);
  477. parkspace_info.set_parkspace_path(message::LEFT_PATH);
  478. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  479. return Error_code::SUCCESS;
  480. }
  481. else
  482. {
  483. //如果没找到则代表左侧没找到合适车位
  484. parkspace_info.set_parkingspace_index_id(-1);
  485. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  486. "无合适车位分配! query_the_optimal_parkspace_serverB1 error ");
  487. }
  488. }
  489. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  490. "无合适车位分配! query_the_optimal_parkspace_serverB1 error ");
  491. }
  492. //找右侧车位
  493. Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB2(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id)
  494. {
  495. //车辆高大于1550mm分在四楼以下,小于1550mm分在四楼以上
  496. /*
  497. * K=j%15
  498. * P=i%6
  499. * S=15*d-(j%15)*(2*d-1)+[6*d-(i%6)(2*d-1)]*W W>1
  500. */
  501. float time_min=0;
  502. int parkingspace_index_id=-1;
  503. //找右侧车位
  504. //如果是小车 (低于1.55米属于小车)
  505. if ( car_info.car_height() <= MIN_CAR_HIGH )
  506. {
  507. //获取所有小型车位信息
  508. message::Parkspace_allocation_data_msg all_min_parkspace_data;
  509. Error_manager t_error = m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_min_parkspace_data, message::Parkspace_type::MIN_PARKINGSPACE);
  510. if (t_error != SUCCESS)
  511. {
  512. return t_error;
  513. }
  514. //遍历所有小型车位
  515. int i = 0;
  516. while (i < all_min_parkspace_data.parkspace_info_ex_size())
  517. {
  518. int room_id=all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  519. //筛选出小型车位的中间部分(第一优先级)的空车位
  520. if (room_id % 15 >= 4 && room_id % 15 <= 12
  521. && all_min_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  522. {
  523. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  524. float time = (6-terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  525. (all_min_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info_ex(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  526. ( (15-all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id() % 15)==15?0:(15-all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id() % 15) ) *all_min_parkspace_data.parkspace_info_ex(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  527. if (time_min == 0)
  528. {
  529. time_min = time;
  530. parkingspace_index_id = i;
  531. }
  532. else
  533. {
  534. if ( time<time_min )
  535. {
  536. time_min=time;
  537. parkingspace_index_id=i;
  538. }
  539. }
  540. }
  541. ++i;
  542. }
  543. //判断小车车位中间部分(第一优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  544. if ( time_min!=0 && parkingspace_index_id!=-1 )
  545. {
  546. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  547. parkspace_info.set_path_estimate_time(time_min);
  548. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  549. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  550. return Error_code::SUCCESS;
  551. }
  552. else
  553. {
  554. //如果没找到则找小车车位第二优先级 (侧边)
  555. int i = 0;
  556. while (i < all_min_parkspace_data.parkspace_info_ex_size())
  557. {
  558. int room_id=all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  559. //筛选出一号车库的小型车位的中间部分(第一优先级)的空车位
  560. if ((room_id % 15 >= 1 && room_id % 15 <= 3 || room_id % 15 == 13 || room_id % 15 ==14 || room_id % 15 ==0 )
  561. && all_min_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty)
  562. {
  563. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  564. float time = (6-terminal_id+2) * TERMINAL_SPACING / MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  565. (all_min_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id() - 2) *all_min_parkspace_data.parkspace_info_ex(i).parkingspace_height() /THE_ELEVATOR_SPEED +ELEVATOR_MOVEMENT_TIME +
  566. ( (15-all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id() % 15)==15?0:(15-all_min_parkspace_data.parkspace_info_ex(i).parkingspace_index_id() % 15) ) *all_min_parkspace_data.parkspace_info_ex(i).parkingspace_width() / MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  567. if (time_min == 0)
  568. {
  569. time_min = time;
  570. parkingspace_index_id = i;
  571. }
  572. else
  573. {
  574. if ( time < time_min )
  575. {
  576. time_min = time;
  577. parkingspace_index_id = i;
  578. }
  579. }
  580. }
  581. ++i;
  582. }
  583. //判断小车车位侧边部分(第二优先级)是否有找到合适的空车位 如果找到了 则不需要继续比较 直接返回
  584. if ( time_min!=0 && parkingspace_index_id!=-1 )
  585. {
  586. parkspace_info.CopyFrom(all_min_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  587. parkspace_info.set_path_estimate_time(time_min);
  588. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  589. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  590. return Error_code::SUCCESS;
  591. }
  592. }
  593. }
  594. if ( car_info.car_height() <= MID_CAR_HIGH )
  595. {
  596. //找中型车位
  597. //获取中型车位
  598. message::Parkspace_allocation_data_msg all_mid_parkspace_data;
  599. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE);
  600. if(t_error != SUCCESS)
  601. {
  602. return t_error;
  603. }
  604. int i=0;
  605. while(i<all_mid_parkspace_data.parkspace_info_ex_size())
  606. {
  607. int room_id=all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  608. //如果是六楼的中型车位的中间部分(第一优先级)
  609. if ( room_id >= 64 && room_id <= 72
  610. && all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  611. {
  612. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  613. float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  614. (all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  615. ( ((15-all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id()%15) ==15?0:(15-all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id()%15)) )*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  616. if ( time_min == 0 )
  617. {
  618. time_min=time;
  619. parkingspace_index_id=i;
  620. }
  621. else
  622. {
  623. if ( time<time_min )
  624. {
  625. time_min=time;
  626. parkingspace_index_id=i;
  627. }
  628. }
  629. }
  630. ++i;
  631. }
  632. //判断中型车位的中间部分(第一优先级)是否有找到合适的空车位 如果找到了 直接返回
  633. if ( time_min!=0 && parkingspace_index_id!=-1 )
  634. {
  635. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  636. parkspace_info.set_path_estimate_time(time_min);
  637. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  638. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  639. return Error_code::SUCCESS;
  640. }
  641. else
  642. {
  643. //如果没找到则找侧边中型车位(第二优先级)
  644. int i=0;
  645. while(i<all_mid_parkspace_data.parkspace_info_ex_size())
  646. {
  647. int room_id=all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  648. //如果是六楼的中型车位的侧边(第二优先级)
  649. if ( (room_id >=61 && room_id <= 63 || room_id % 15 == 13 || room_id % 15 ==14 || room_id % 15 ==0 )
  650. && all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  651. {
  652. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  653. float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  654. (all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id()-2)*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  655. ( ((15-all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id()%15) ==15?0:(15-all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id()%15)) )*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  656. if ( time_min == 0 )
  657. {
  658. time_min=time;
  659. parkingspace_index_id=i;
  660. }
  661. else
  662. {
  663. if ( time<time_min )
  664. {
  665. time_min=time;
  666. parkingspace_index_id=i;
  667. }
  668. }
  669. }
  670. ++i;
  671. }
  672. //判断中型车位侧边(第二优先级)是否有找到合适的空车位 如果找到了 直接返回
  673. if ( time_min!=0 && parkingspace_index_id!=-1 )
  674. {
  675. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  676. parkspace_info.set_path_estimate_time(time_min);
  677. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  678. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  679. return Error_code::SUCCESS;
  680. }
  681. }
  682. }
  683. if ( car_info.car_height() <= BIG_CAR_HIGH )
  684. {
  685. //找大型车位
  686. //获取大型车位
  687. message::Parkspace_allocation_data_msg all_big_parkspace_data;
  688. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
  689. if(t_error != SUCCESS)
  690. {
  691. return t_error;
  692. }
  693. int i=0;
  694. while(i<all_big_parkspace_data.parkspace_info_ex_size())
  695. {
  696. int room_id=all_big_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  697. //筛选出大型车位的靠近电梯的右侧三排(第二优先级)的空车位
  698. if ( ( (room_id %15 >= 1 && room_id %15 <= 3) || (room_id>=34 && room_id<=42) || room_id % 15 == 13 || room_id % 15 ==14 || room_id % 15 ==0 )
  699. && all_big_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::Parkspace_status::eParkspace_empty )
  700. {
  701. //如果是二楼车 则特殊处理
  702. if ( all_big_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id() == 2 )
  703. {
  704. // 二楼用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  705. float t_min=abs( ((15-room_id%15)==15?0:(15-room_id%15))*all_big_parkspace_data.parkspace_info_ex(i).parkingspace_width()-(6-terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  706. if ( time_min == 0 )
  707. {
  708. time_min=t_min;
  709. parkingspace_index_id=i;
  710. }
  711. else
  712. {
  713. if ( t_min<time_min )
  714. {
  715. time_min=t_min;
  716. parkingspace_index_id=i;
  717. }
  718. }
  719. }
  720. else
  721. {
  722. //用时=目标终端到电梯口的距离/中跑车速度+(目标车位楼层-2)*楼层高度/电梯速度+电梯口到目标车位的距离/中跑车速度
  723. float time=(6-terminal_id+2)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME +
  724. (all_big_parkspace_data.parkspace_info_ex(i).parkingspace_floor_id()-2)*all_big_parkspace_data.parkspace_info_ex(i).parkingspace_height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME +
  725. ( (15-all_big_parkspace_data.parkspace_info_ex(i).parkingspace_index_id() % 15)==15?0:(15-all_big_parkspace_data.parkspace_info_ex(i).parkingspace_index_id() % 15) )*all_big_parkspace_data.parkspace_info_ex(i).parkingspace_width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME;
  726. if ( time_min == 0 )
  727. {
  728. time_min=time;
  729. parkingspace_index_id=i;
  730. }
  731. else
  732. {
  733. if ( time<time_min )
  734. {
  735. time_min=time;
  736. parkingspace_index_id=i;
  737. }
  738. }
  739. }
  740. }
  741. ++i;
  742. }
  743. //判断大型车位是否有找到合适的空车位 如果找到了 直接返回
  744. if ( time_min!=0 && parkingspace_index_id!=-1 )
  745. {
  746. parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  747. parkspace_info.set_path_estimate_time(time_min);
  748. parkspace_info.set_parkspace_path(message::RIGHT_PATH);
  749. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  750. return Error_code::SUCCESS;
  751. }
  752. else
  753. {
  754. //如果没找到则代表右侧没找到合适车位
  755. parkspace_info.set_parkingspace_index_id(-1);
  756. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  757. "无合适车位分配! query_the_optimal_parkspace_serverB2 error ");
  758. }
  759. }
  760. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  761. " 无合适车位分配! query_the_optimal_parkspace_serverB2 error ");
  762. }
  763. //找缓存区车位
  764. Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB3(message::Parkspace_info &parkspace_info,message::Car_info car_info,int terminal_id)
  765. {
  766. //车辆高大于1550mm分在四楼以下,小于1550mm分在四楼以上
  767. /*
  768. * K=j%15
  769. * P=i%6
  770. * S=15*d-(j%15)*(2*d-1)+[6*d-(i%6)(2*d-1)]*W W>1
  771. */
  772. float time_min=0;
  773. int parkingspace_index_id=-1;
  774. //找缓存区车位 缓冲区只有中型车位和大型车位
  775. if ( car_info.car_height() <= MID_CAR_HIGH )
  776. {
  777. message::Parkspace_allocation_data_msg all_mid_parkspace_data;
  778. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_mid_parkspace_data,message::Parkspace_type::MID_PARKINGSPACE);
  779. if(t_error != SUCCESS)
  780. {
  781. return t_error;
  782. }
  783. int i=0;
  784. while (i < all_mid_parkspace_data.parkspace_info_ex_size())
  785. {
  786. //筛选中型车位缓冲区
  787. int room_id=all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  788. if ( room_id >= 19 && room_id <= 27
  789. && all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::eParkspace_empty)
  790. {
  791. //只需计算端口到车位的距离
  792. // 三楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  793. float t_min=abs( room_id%15*all_mid_parkspace_data.parkspace_info_ex(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  794. if ( time_min == 0 )
  795. {
  796. time_min=t_min;
  797. parkingspace_index_id=i;
  798. }
  799. else
  800. {
  801. if ( t_min<time_min )
  802. {
  803. time_min=t_min;
  804. parkingspace_index_id=i;
  805. }
  806. }
  807. }
  808. ++i;
  809. }
  810. //判断缓冲区的中型车位是否有找到合适的空车位 如果找到了 直接返回
  811. if ( time_min!=0 && parkingspace_index_id!=-1 )
  812. {
  813. parkspace_info.CopyFrom(all_mid_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  814. parkspace_info.set_path_estimate_time(time_min);
  815. parkspace_info.set_parkspace_path(message::TEMPORARY_CACHE_PATH);
  816. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  817. return Error_code::SUCCESS;
  818. }
  819. }
  820. if( car_info.car_height() <= BIG_CAR_HIGH )
  821. {
  822. message::Parkspace_allocation_data_msg all_big_parkspace_data;
  823. Error_manager t_error=m_parkspace_operating_function.get_specify_the_type_parkspace_info(all_big_parkspace_data,message::Parkspace_type::BIG_PARKINGSPACE);
  824. if(t_error != SUCCESS)
  825. {
  826. return t_error;
  827. }
  828. int i=0;
  829. while (i < all_big_parkspace_data.parkspace_info_ex_size())
  830. {
  831. //筛选中型车位缓冲区
  832. int room_id=all_big_parkspace_data.parkspace_info_ex(i).parkingspace_index_id();
  833. if ( room_id >= 4 && room_id <= 12
  834. && all_big_parkspace_data.parkspace_info_ex(i).parkingspace_status() == message::eParkspace_empty)
  835. {
  836. //只需计算端口到车位的距离
  837. // 二楼中型用时=| 目标车位到电梯的距离 - 终端到电梯的距离 | / 中跑车速度
  838. float t_min=abs( room_id%15*all_big_parkspace_data.parkspace_info_ex(i).parkingspace_width()-(terminal_id+2)*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  839. if ( time_min == 0 )
  840. {
  841. time_min=t_min;
  842. parkingspace_index_id=i;
  843. }
  844. else
  845. {
  846. if ( t_min<time_min )
  847. {
  848. time_min=t_min;
  849. parkingspace_index_id=i;
  850. }
  851. }
  852. }
  853. ++i;
  854. }
  855. //判断缓冲区的中型车位是否有找到合适的空车位 如果找到了 直接返回
  856. if ( time_min!=0 && parkingspace_index_id!=-1 )
  857. {
  858. parkspace_info.CopyFrom(all_big_parkspace_data.parkspace_info_ex(parkingspace_index_id));
  859. parkspace_info.set_path_estimate_time(time_min);
  860. parkspace_info.set_parkspace_path(message::TEMPORARY_CACHE_PATH);
  861. parkspace_info.set_parkspace_status_target(message::eParkspace_locked);
  862. return Error_code::SUCCESS;
  863. }
  864. else
  865. {
  866. //如果没找到则代表缓冲区没找到合适车位
  867. parkspace_info.set_parkingspace_index_id(-1);
  868. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  869. "无合适车位分配! query_the_optimal_parkspace_serverB3 error ");
  870. }
  871. }
  872. return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
  873. " 无合适车位分配! query_the_optimal_parkspace_serverB3 error ");
  874. }
  875. //分配车位线程函数
  876. void Parkspace_manager:: execute_for_allocate(message::Car_info car_info, int terminal_id, std::string command_key)
  877. {
  878. LOG(INFO) << "分配车位 " << "牌号:" << car_info.license() << " 车高:" << car_info.car_height()
  879. << " command_key=" << command_key;
  880. //根据请求的信息反馈分配的车位,并封装发送
  881. message::Parkspace_allocation_response_msg response_msg;
  882. message::Base_info t_response_header;
  883. t_response_header.set_msg_type(message::Message_type::eParkspace_allocation_response_msg);
  884. t_response_header.set_timeout_ms(1000);
  885. t_response_header.set_sender(message::Communicator::eParkspace);
  886. t_response_header.set_receiver(message::Communicator::eMain);
  887. message::Error_manager t_error;
  888. //方案B的车位
  889. message::Parkspace_info t_allocated_space_left;
  890. message::Parkspace_info t_allocated_space_rigth;
  891. message::Parkspace_info t_allocated_space_temporary;
  892. Error_manager error_B1;
  893. Error_manager error_B2;
  894. Error_manager error_B3;
  895. message::Car_type t_cartype;
  896. if ( car_info.car_height() <= message::Car_type::MIN_CAR )
  897. {
  898. t_cartype = message::Car_type::MIN_CAR;
  899. }
  900. else if ( car_info.car_height() > message::Car_type::MIN_CAR && car_info.car_height() <= message::Car_type::MID_CAR )
  901. {
  902. t_cartype = message::Car_type::MID_CAR;
  903. }
  904. else
  905. {
  906. t_cartype = message::Car_type::BIG_CAR;
  907. }
  908. //分配之前查询车辆是否已经存在
  909. if (check_car_existence(car_info.license()))
  910. {
  911. t_error.set_error_code(PARKSPACE_ALLOCATOR_CAR_ALREADY_EXIST);
  912. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  913. t_error.set_error_description(" The vehicle already exists error");
  914. LOG(ERROR) << car_info.license() << " 车辆已存在";
  915. }
  916. else
  917. {
  918. m_parkspace_lock.lock();
  919. // 如果车辆不存在 则找到一个最优车位(方案B)----分配三个车位 左边分配一个 右边分配一个 缓冲区分配一个 最后使用那个由调度决定
  920. LOG(INFO) << " 方案B---------分配车位中---------- " << this;
  921. //获取左侧车位
  922. error_B1 = query_the_optimal_parkspace_serverB1(t_allocated_space_left, car_info, terminal_id);
  923. if (error_B1 != Error_code::SUCCESS)
  924. {
  925. LOG(ERROR) << car_info.license() << " 获取左侧车位失败 " << error_B1.to_string();
  926. }
  927. else
  928. {
  929. t_allocated_space_left.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
  930. t_allocated_space_left.mutable_car_info()->CopyFrom(car_info);
  931. t_allocated_space_left.set_car_type(t_cartype);
  932. // 分配车位后更新数据库中车位状态--左车位
  933. error_B1 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_left);
  934. if (error_B1 != SUCCESS)
  935. {
  936. LOG(ERROR) << car_info.license() << " 左车位更新数据失败 " << error_B1.to_string();
  937. }
  938. else
  939. {
  940. response_msg.add_allocated_parkspace_info_ex()->CopyFrom(t_allocated_space_left);
  941. LOG(INFO) << " ----- 左 车 位ID: " << t_allocated_space_left.parkingspace_index_id() << "-----";
  942. }
  943. }
  944. //获取右侧车位
  945. error_B2 = query_the_optimal_parkspace_serverB2(t_allocated_space_rigth, car_info, terminal_id);
  946. if (error_B2 != Error_code::SUCCESS)
  947. {
  948. LOG(ERROR) << car_info.license() << " 获取右侧车位失败 " << error_B2.to_string();
  949. }
  950. else
  951. {
  952. t_allocated_space_rigth.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
  953. t_allocated_space_rigth.mutable_car_info()->CopyFrom(car_info);
  954. t_allocated_space_rigth.set_car_type(t_cartype);
  955. // 分配车位后更新数据库中车位状态--右车位
  956. error_B2 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_rigth);
  957. if (error_B2 != SUCCESS)
  958. {
  959. LOG(ERROR) << car_info.license() << " 右车位更新数据失败 " << error_B2.to_string();
  960. }
  961. else
  962. {
  963. response_msg.add_allocated_parkspace_info_ex()->CopyFrom(t_allocated_space_rigth);
  964. LOG(INFO) << " ----- 右 车 位ID: " << t_allocated_space_rigth.parkingspace_index_id() << "-----";
  965. }
  966. }
  967. //获取缓冲区车位
  968. error_B3 = query_the_optimal_parkspace_serverB3(t_allocated_space_temporary, car_info, terminal_id);
  969. if (error_B3 != Error_code::SUCCESS)
  970. {
  971. LOG(ERROR) << car_info.license() << " 获取缓冲区车位失败 " << error_B3.to_string();
  972. }
  973. else
  974. {
  975. t_allocated_space_temporary.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
  976. t_allocated_space_temporary.mutable_car_info()->CopyFrom(car_info);
  977. t_allocated_space_temporary.set_car_type(t_cartype);
  978. // 分配车位后更新数据库中车位状态--缓冲车位
  979. error_B3 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_temporary);
  980. if (error_B3 != SUCCESS)
  981. {
  982. LOG(ERROR) << car_info.license() << " 缓冲车位更新数据失败 " << error_B3.to_string();
  983. }
  984. else
  985. {
  986. response_msg.add_allocated_parkspace_info_ex()->CopyFrom(t_allocated_space_temporary);
  987. LOG(INFO) << " -----缓冲车位车位ID: " << t_allocated_space_temporary.parkingspace_index_id() << "-----";
  988. }
  989. }
  990. Error_manager error_total;
  991. error_total.compare_and_cover_error(error_B1);
  992. error_total.compare_and_cover_error(error_B2);
  993. error_total.compare_and_cover_error(error_B3);
  994. if ( error_B1==SUCCESS || error_B2==SUCCESS || error_B3==SUCCESS )
  995. {
  996. t_error.set_error_code(SUCCESS);
  997. t_error.set_error_level(message::Error_level::NORMAL);
  998. LOG(INFO) << " 分配车位成功! ";
  999. }
  1000. else
  1001. {
  1002. t_error.set_error_code(PARKSPACE_ALLOCATOR_ALLOCATE_FAILED);
  1003. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  1004. t_error.set_error_description(error_total.get_error_description());
  1005. LOG(INFO) << " 分配车位失败,无车位! ";
  1006. }
  1007. }
  1008. m_parkspace_lock.unlock();
  1009. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1010. response_msg.set_command_key(command_key);
  1011. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1012. response_msg.set_car_type(t_cartype);
  1013. Communication_message response = Communication_message();
  1014. response.reset(t_response_header, response_msg.SerializeAsString());
  1015. Parkspace_communicator::get_instance_references().send_response(&response);
  1016. send_parkspace_data();
  1017. std::cout << std::endl;
  1018. }
  1019. //确认分配车位线程函数
  1020. void Parkspace_manager::execute_for_confirm_alloc(message::Parkspace_confirm_alloc_request_msg request)
  1021. {
  1022. LOG(INFO) << "确认分配 "<< this;
  1023. message::Parkspace_confirm_alloc_response_msg response_msg;
  1024. message::Base_info t_response_header;
  1025. t_response_header.set_msg_type(message::eParkspace_confirm_alloc_response_msg);
  1026. t_response_header.set_sender(message::eParkspace);
  1027. t_response_header.set_receiver(message::eMain);
  1028. t_response_header.set_timeout_ms(1000);
  1029. message::Error_manager t_error;
  1030. t_error.set_error_code(Error_code::SUCCESS);
  1031. t_error.set_error_level(message::Error_level::NORMAL);
  1032. //确认的车位
  1033. message::Parkspace_info confirm_alloc_space_info;
  1034. //释放的车位
  1035. message::Parkspace_info release_alloc_space_info;
  1036. for (int i = 0; i < request.confirm_parkspace_info_ex().size(); ++i)
  1037. {
  1038. //核对确认车位信息
  1039. m_parkspace_operating_function.query_one_parkspace_with_parkspace_id(request.confirm_parkspace_info_ex(i).parkingspace_index_id(),confirm_alloc_space_info);
  1040. if ( request.confirm_parkspace_info_ex(i).parkspace_status_target() == message::eParkspace_occupied && \
  1041. confirm_alloc_space_info.parkingspace_status() == message::Parkspace_status::eParkspace_locked )
  1042. {
  1043. LOG(INFO) << "方案B---------确认分配 车位id:" <<request.confirm_parkspace_info_ex(i).parkingspace_index_id()<< " 车牌号:" << request.confirm_parkspace_info_ex(i).car_info().license() ;
  1044. Error_manager error=confirm_alloc_function(request.confirm_parkspace_info_ex(i),confirm_alloc_space_info);
  1045. if ( error != SUCCESS )
  1046. {
  1047. t_error.set_error_code(error.get_error_code());
  1048. t_error.set_error_level((message::Error_level)error.get_error_level());
  1049. t_error.set_error_description(error.get_error_description());
  1050. }
  1051. else
  1052. {
  1053. response_msg.add_confirm_parkspace_info_ex()->CopyFrom(confirm_alloc_space_info);
  1054. }
  1055. }
  1056. else if ( request.confirm_parkspace_info_ex(i).parkspace_status_target() == message::eParkspace_empty && \
  1057. confirm_alloc_space_info.parkingspace_status() == message::Parkspace_status::eParkspace_locked )
  1058. {
  1059. Error_manager error=release_parkspace_function(request.confirm_parkspace_info_ex(i),release_alloc_space_info,false);
  1060. if ( error != SUCCESS )
  1061. {
  1062. t_error.set_error_code(error.get_error_code());
  1063. t_error.set_error_level((message::Error_level)error.get_error_level());
  1064. t_error.set_error_description(error.get_error_description());
  1065. }
  1066. }
  1067. else
  1068. {
  1069. t_error.set_error_code(PARKSPACE_ALLOCATOR_PARAM_ERROR);
  1070. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  1071. t_error.set_error_description("Parking information does not match or the target status of the parking space is wrong error!");
  1072. LOG(INFO) << "确认分配失败 车位信息不匹配或目标车位状态错误错误! id:"<<request.confirm_parkspace_info_ex(i).parkingspace_index_id()<<" 数据库车位状态:"<<confirm_alloc_space_info.parkingspace_status()<<" 号牌:"<<request.confirm_parkspace_info_ex(i).car_info().license()<<" "<< this;
  1073. }
  1074. }
  1075. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1076. response_msg.set_command_key(request.command_key());
  1077. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1078. response_msg.set_car_type(request.car_type());
  1079. Communication_message response=Communication_message();
  1080. response.reset(t_response_header, response_msg.SerializeAsString());
  1081. Parkspace_communicator::get_instance_references().send_response(&response);
  1082. send_parkspace_data();
  1083. std::cout<<std::endl;
  1084. }
  1085. //查询车位线程函数
  1086. void Parkspace_manager::execute_for_search(message::Car_info car_info,std::string command_key)
  1087. {
  1088. LOG(INFO) << "查询车位 "<<"牌号:"<<car_info.license()<<" command_key="<<command_key;
  1089. //根据车辆凭证信息查询车辆位置
  1090. message::Parkspace_search_response_msg response_msg;
  1091. message::Base_info t_response_header;
  1092. message::Error_manager t_error;
  1093. t_response_header.set_msg_type(message::Message_type::eParkspace_search_response_msg);
  1094. t_response_header.set_timeout_ms(1000);
  1095. t_response_header.set_sender(message::Communicator::eParkspace);
  1096. t_response_header.set_receiver(message::Communicator::eMain);
  1097. //查询车辆位置
  1098. message::Parkspace_info parkspace_info;
  1099. Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_license(car_info.license(),parkspace_info);
  1100. if ( error != SUCCESS )
  1101. {
  1102. t_error.set_error_code(error.get_error_code());
  1103. t_error.set_error_level((message::Error_level)error.get_error_level());
  1104. t_error.set_error_description(error.get_error_description());
  1105. LOG(ERROR) << "查询车位失败 "<<error.to_string();
  1106. }
  1107. else
  1108. {
  1109. t_error.set_error_code(SUCCESS);
  1110. t_error.set_error_level(message::Error_level::NORMAL);
  1111. LOG(INFO) << "车辆"<<parkspace_info.car_info().license()<<" 在"<<parkspace_info.parkingspace_index_id()<<"号车位上";
  1112. }
  1113. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1114. response_msg.set_command_key(command_key);
  1115. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1116. response_msg.mutable_query_parkspace_info_ex()->Add()->CopyFrom(parkspace_info);
  1117. Communication_message response=Communication_message();
  1118. response.reset(t_response_header, response_msg.SerializeAsString());
  1119. Parkspace_communicator::get_instance_references().send_response(&response);
  1120. std::cout<<std::endl;
  1121. }
  1122. //释放车位线程函数
  1123. void Parkspace_manager::execute_for_release(message::Parkspace_release_request_msg release_msg, std::string command_key)
  1124. {
  1125. LOG(INFO) << "释放车位 ";
  1126. //根据车位信息定位待释放车位位置,车辆凭证号用于校验
  1127. message::Parkspace_release_response_msg response_msg;
  1128. message::Base_info t_response_header;
  1129. t_response_header.set_msg_type(message::eParkspace_release_response_msg);
  1130. t_response_header.set_sender(message::eParkspace);
  1131. t_response_header.set_receiver(message::eMain);
  1132. t_response_header.set_timeout_ms(1000);
  1133. message::Error_manager t_error;
  1134. t_error.set_error_code(Error_code::SUCCESS);
  1135. t_error.set_error_level(message::Error_level::NORMAL);
  1136. message::Parkspace_info t_release_space;
  1137. for (int i = 0; i < release_msg.release_parkspace_info_ex_size(); ++i)
  1138. {
  1139. //将传入数据与数据库数据进行核对
  1140. m_parkspace_operating_function.query_one_parkspace_with_parkspace_id(release_msg.release_parkspace_info_ex(i).parkingspace_index_id(),t_release_space);
  1141. if ( !release_msg.release_parkspace_info_ex(i).has_car_info() || \
  1142. t_release_space.car_info().license() != release_msg.release_parkspace_info_ex(i).car_info().license() )
  1143. {
  1144. t_error.set_error_code(PARKSPACE_ALLOCATOR_PARAM_ERROR);
  1145. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  1146. t_error.set_error_description(" Incoming parking space data to be released does not match the database data error");
  1147. LOG(INFO) << "释放车位失败 传入待释放车位数据与数据库数据不匹配 "<< this;
  1148. }
  1149. else
  1150. {
  1151. Error_manager error=release_parkspace_function(release_msg.release_parkspace_info_ex(i),t_release_space,true);
  1152. if ( error != SUCCESS )
  1153. {
  1154. t_error.set_error_code(error.get_error_code());
  1155. t_error.set_error_level((message::Error_level)error.get_error_level());
  1156. t_error.set_error_description(error.get_error_description());
  1157. }
  1158. }
  1159. }
  1160. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1161. response_msg.set_command_key(command_key);
  1162. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1163. response_msg.mutable_release_parkspace_info_ex()->Add()->CopyFrom(t_release_space);
  1164. Communication_message response=Communication_message();
  1165. response.reset(t_response_header, response_msg.SerializeAsString());
  1166. Parkspace_communicator::get_instance_references().send_response(&response);
  1167. send_parkspace_data();
  1168. std::cout<<std::endl;
  1169. }
  1170. //强制更新车位信息线程函数
  1171. void Parkspace_manager::execute_for_force_update(message::Parkspace_force_update_request_msg space_info, std::string command_key)
  1172. {
  1173. LOG(INFO) << "手动 "<<"牌号:"<<space_info.manual_parkspace_info_ex(0).car_info().license()<<" command_key="<<command_key;
  1174. //根据车位信息定位待释放车位位置,车辆凭证号用于校验
  1175. //!!!!!此处跳过外部处理与调用的过程,直接在内部调用,发送分配结果用于测试,目前一直发布第一个车位
  1176. message::Parkspace_force_update_response_msg response_msg;
  1177. message::Base_info t_response_header;
  1178. t_response_header.set_msg_type(message::eParkspace_force_update_response_msg);
  1179. t_response_header.set_sender(message::eParkspace);
  1180. t_response_header.set_receiver(message::eMain);
  1181. t_response_header.set_timeout_ms(1000);
  1182. message::Error_manager t_error;
  1183. message::Parkspace_info t_update_space;
  1184. Error_manager error;
  1185. // id 9999为特殊情况,复位所有车位状态
  1186. if (space_info.manual_parkspace_info_ex(0).parkingspace_index_id() == 9999)
  1187. {
  1188. // 复位所有车位状态
  1189. error=m_parkspace_operating_function.clear_all_parkspace_info();
  1190. if( error != SUCCESS)
  1191. {
  1192. t_error.set_error_code(error.get_error_code());
  1193. t_error.set_error_level((message::Error_level) error.get_error_level());
  1194. LOG(INFO) << "手动更新所有车位失败 "<<error.to_string();
  1195. }
  1196. else
  1197. {
  1198. t_error.set_error_code(SUCCESS);
  1199. t_error.set_error_level(message::Error_level::NORMAL);
  1200. LOG(INFO) << "所有车位已手动更新 ";
  1201. }
  1202. }
  1203. else
  1204. {
  1205. //手动修改车位信息
  1206. error = m_parkspace_operating_function.update_parkspace_data(t_update_space);
  1207. if (error != SUCCESS)
  1208. {
  1209. t_error.set_error_code(error.get_error_code());
  1210. t_error.set_error_level((message::Error_level)error.get_error_level());
  1211. LOG(INFO) << "手动 数据库更新车位失败 "<<error.to_string();
  1212. }
  1213. else
  1214. {
  1215. t_error.set_error_code(SUCCESS);
  1216. t_error.set_error_level(message::Error_level::NORMAL);
  1217. LOG(INFO) << "第" << t_update_space.parkingspace_index_id() << "号位已手动更新";
  1218. }
  1219. }
  1220. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  1221. response_msg.set_command_key(command_key);
  1222. response_msg.mutable_error_manager()->CopyFrom(t_error);
  1223. response_msg.mutable_manual_parkspace_info_ex()->Add()->CopyFrom(t_update_space);
  1224. Communication_message response=Communication_message();
  1225. response.reset(t_response_header, response_msg.SerializeAsString());
  1226. Parkspace_communicator::get_instance_references().send_response(&response);
  1227. send_parkspace_data();
  1228. }
  1229. //确认分配操作函数、
  1230. Error_manager Parkspace_manager::confirm_alloc_function(message::Parkspace_info space_info,message::Parkspace_info& t_confirm_space)
  1231. {
  1232. //根据车位信息定位待确认占用车位
  1233. Error_manager error;
  1234. //记录当前传入车辆的状态 为后续回退操作服务
  1235. message::Parkspace_status t_parkingspace_status=space_info.parkingspace_status();
  1236. if (!space_info.has_car_info())
  1237. {
  1238. LOG(WARNING) << "传入待确认车位无车辆信息";
  1239. return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
  1240. " 确认分配车位传入参数无车辆信息! ");
  1241. }
  1242. t_confirm_space.CopyFrom(space_info);
  1243. if(t_confirm_space.parkspace_status_target() == message::eParkspace_occupied && space_info.has_car_info())
  1244. {
  1245. //更新车位数据1
  1246. t_confirm_space.set_parkingspace_status(message::eParkspace_occupied);
  1247. error = m_parkspace_operating_function.update_parkspace_data(t_confirm_space);
  1248. if (error != SUCCESS)
  1249. {
  1250. LOG(INFO) << "确认分配 数据库更新车位数据失败 " << error.to_string();
  1251. return error;
  1252. }
  1253. else
  1254. {
  1255. //修改车辆状态为已入库
  1256. message::Vehicle_status t_vehicle_status = message::Vehicle_status::eVehicle_in_garage;
  1257. error = m_parkspace_operating_function.update_vehicle_with_parkspace(t_confirm_space, t_vehicle_status);
  1258. if (error != SUCCESS)
  1259. {
  1260. //此处操作不成功就需要回退 因为前一步骤更改了车位表信息导致二表不统一
  1261. LOG(ERROR) << "确认分配 更新数据库车辆数据失败 进行回退---" << error.to_string();
  1262. t_confirm_space.set_parkingspace_status(t_parkingspace_status);
  1263. t_confirm_space.set_parkspace_status_target(t_parkingspace_status);
  1264. for (int i = 1; i < 4; ++i)
  1265. {
  1266. Error_manager e = m_parkspace_operating_function.update_parkspace_data(t_confirm_space);
  1267. if (e != SUCCESS)
  1268. {
  1269. LOG(INFO) << "回退第"<<i<<"次 失败! " << e.to_string();
  1270. continue;
  1271. }
  1272. else
  1273. {
  1274. LOG(INFO) << " 回退成功! ";
  1275. return e;
  1276. }
  1277. }
  1278. //如果流程进行到这里说明回退三次都失败 需要报三级故障
  1279. return Error_manager(Error_code::DB_UPDATE_FAILED, Error_level::MAJOR_ERROR,
  1280. " update database error ");
  1281. }
  1282. error.set_error_code(SUCCESS);
  1283. error.set_error_level_location(Error_level::NEGLIGIBLE_ERROR);
  1284. LOG(INFO) << "第:" << t_confirm_space.parkingspace_index_id() << "号位 车辆: " << t_confirm_space.car_info().license()<< " 确认占用成功";
  1285. //插入停车记录
  1286. time_t tt = time(NULL);
  1287. tm *t = localtime(&tt);
  1288. char my_time_buf[255];
  1289. memset(my_time_buf, 0, 255);
  1290. sprintf(my_time_buf, "%d-%02d-%02d %02d:%02d:%02d",
  1291. t->tm_year + 1900,
  1292. t->tm_mon + 1,
  1293. t->tm_mday,
  1294. t->tm_hour,
  1295. t->tm_min,
  1296. t->tm_sec);
  1297. t_confirm_space.set_entry_time(my_time_buf);
  1298. error = m_parkspace_operating_function.insert_parking_record(t_confirm_space);
  1299. if ( error != SUCCESS )
  1300. {
  1301. LOG(ERROR) << "插入停车记录失败: " << error.to_string();
  1302. }
  1303. //查询停车记录的ID
  1304. int t_record_id;
  1305. error = m_parkspace_operating_function.query_parking_record(t_confirm_space,t_record_id);
  1306. if ( error != SUCCESS )
  1307. {
  1308. LOG(ERROR) << "查询停车记录ID失败: " << error.to_string();
  1309. }
  1310. //更新停车记录ID
  1311. error = m_parkspace_operating_function.update_record_id(t_confirm_space.car_info().license(),t_record_id);
  1312. if ( error != SUCCESS )
  1313. {
  1314. LOG(ERROR) << "更新停车记录ID失败: " << error.to_string();
  1315. }
  1316. }
  1317. }
  1318. return error;
  1319. }
  1320. //释放车位操作函数
  1321. Error_manager Parkspace_manager::release_parkspace_function(message::Parkspace_info target_space_info,message::Parkspace_info& release_parkspace_info,bool flag)
  1322. {
  1323. Error_manager error;
  1324. if(!target_space_info.has_car_info())
  1325. {
  1326. LOG(WARNING) << "传入待释放车位无车辆信息";
  1327. return error;
  1328. }
  1329. release_parkspace_info.CopyFrom(target_space_info);
  1330. if(release_parkspace_info.parkspace_status_target() == message::eParkspace_empty && release_parkspace_info.has_car_info())
  1331. {
  1332. release_parkspace_info.set_parkingspace_status(message::eParkspace_empty);
  1333. error = m_parkspace_operating_function.update_parkspace_data(release_parkspace_info);
  1334. if (error != SUCCESS)
  1335. {
  1336. LOG(ERROR) << "释放车位 更新数据库车位数据失败 " << error.to_string();
  1337. return error;
  1338. }
  1339. else
  1340. {
  1341. if ( flag == false )
  1342. {
  1343. error.set_error_code(SUCCESS);
  1344. error.set_error_level_location(Error_level::NORMAL);
  1345. LOG(INFO) << "不更新车辆表释放 --- 第:" << release_parkspace_info.parkingspace_index_id() << "号位 车辆: " << release_parkspace_info.car_info().license()
  1346. << " 释放成功";
  1347. }
  1348. else
  1349. {
  1350. message::Vehicle_status t_vehicle_status;
  1351. //获取预约ID
  1352. int t_park_record_id;
  1353. error = m_parkspace_operating_function.query_vehicle(release_parkspace_info.car_info().license(),
  1354. t_vehicle_status, t_park_record_id);
  1355. if (error != SUCCESS)
  1356. {
  1357. LOG(ERROR) << "释放车位 数据库查询车辆信息失败 " << error.to_string();
  1358. }
  1359. t_vehicle_status=message::eVehicle_idle;
  1360. error = m_parkspace_operating_function.update_vehicle_with_parkspace(release_parkspace_info, t_vehicle_status);
  1361. if (error != SUCCESS)
  1362. {
  1363. LOG(ERROR) << "释放车位 更新数据库车辆数据失败 " << error.to_string();
  1364. return error;
  1365. }
  1366. error.set_error_code(SUCCESS);
  1367. error.set_error_level_location(Error_level::NORMAL);
  1368. LOG(INFO) << "更新车辆表--- 第:" << release_parkspace_info.parkingspace_index_id() << "号位 车辆: " << release_parkspace_info.car_info().license()
  1369. << " 释放成功";
  1370. time_t tt = time(NULL);
  1371. tm *t = localtime(&tt);
  1372. char my_time_buf[255];
  1373. memset(my_time_buf, 0, 255);
  1374. sprintf(my_time_buf, "%d-%02d-%02d %02d:%02d:%02d",
  1375. t->tm_year + 1900,
  1376. t->tm_mon + 1,
  1377. t->tm_mday,
  1378. t->tm_hour,
  1379. t->tm_min,
  1380. t->tm_sec);
  1381. release_parkspace_info.set_leave_time(my_time_buf);
  1382. error = m_parkspace_operating_function.update_parking_record(release_parkspace_info, t_park_record_id);
  1383. if (error != SUCCESS)
  1384. {
  1385. LOG(ERROR) << "更新停车记录失败: " << error.to_string();
  1386. }
  1387. }
  1388. }
  1389. }
  1390. return error;
  1391. }