parkspace_manager.cpp 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  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, parkspace id: "<<request.release_space_info().parkspace_id();
  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_space_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.update_space_info().parkspace_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.update_space_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, parkspace id: "<<request.confirm_space_info().parkspace_id();
  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.confirm_space_info(), request.command_key());
  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(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. message::Parkspace_allocation_data_msg all_parkspace_data;
  220. Error_manager t_error=m_parkspace_operating_function.get_all_parkspace_info(all_parkspace_data);
  221. if(t_error != SUCCESS)
  222. {
  223. return t_error;
  224. }
  225. int time_min=0;
  226. int parkspace_id=0;
  227. if( car_info.car_height() > CAR_HIGH_STANDARDS )
  228. {
  229. //计算四楼以下最优车位
  230. int i=0;
  231. while (i<=all_parkspace_data.parkspace_info_size())
  232. {
  233. //筛选出空车位
  234. if ( all_parkspace_data.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_empty )
  235. {
  236. //二楼所有车位统一处理
  237. if ( all_parkspace_data.parkspace_info(i).floor() == 2 )
  238. {
  239. int t_min=abs( i%15*all_parkspace_data.parkspace_info(i).width()-terminal_id%6*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  240. if ( time_min == 0 )
  241. {
  242. time_min=t_min;
  243. parkspace_id=i;
  244. }
  245. else
  246. {
  247. time_min=t_min<time_min?t_min:time_min;
  248. parkspace_id=i;
  249. }
  250. }
  251. else if( all_parkspace_data.parkspace_info(i).floor() == 3 )
  252. {
  253. //三楼以上车位单独处理两侧位置车位
  254. if ( i%15==1 || i%15==2 || i%15==14 || i%15==0 )
  255. {
  256. //因机械手可以抓车到三楼所以三楼电梯高度减少一个楼层
  257. int t_min=terminal_id%6*TERMINAL_SPACING/MEDIUM_CAR_SPEED + (all_parkspace_data.parkspace_info(i).floor()-1)*all_parkspace_data.parkspace_info(i).height()/THE_ELEVATOR_SPEED+DOWNSTAIRS_SPORTS_TIME+ELEVATOR_MOVEMENT_TIME;
  258. if ( time_min == 0 )
  259. {
  260. time_min=t_min;
  261. parkspace_id=i;
  262. }
  263. else
  264. {
  265. time_min=t_min<time_min?t_min:time_min;
  266. parkspace_id=i;
  267. }
  268. }
  269. else
  270. {
  271. int t_min=abs( i%15*all_parkspace_data.parkspace_info(i).width()-terminal_id%6*TERMINAL_SPACING )/MEDIUM_CAR_SPEED+DOWNSTAIRS_SPORTS_TIME;
  272. if ( time_min == 0 )
  273. {
  274. time_min=t_min;
  275. parkspace_id=i;
  276. }
  277. else
  278. {
  279. time_min=t_min<time_min?t_min:time_min;
  280. parkspace_id=i;
  281. }
  282. }
  283. }
  284. else if(all_parkspace_data.parkspace_info(i).floor() == 4)
  285. {
  286. if ( i%15==1 || i%15==2 || i%15==14 || i%15==0 )
  287. {
  288. int t_min=terminal_id%6*TERMINAL_SPACING/MEDIUM_CAR_SPEED + all_parkspace_data.parkspace_info(i).floor()*all_parkspace_data.parkspace_info(i).height()/THE_ELEVATOR_SPEED+DOWNSTAIRS_SPORTS_TIME+ELEVATOR_MOVEMENT_TIME;
  289. if ( time_min == 0 )
  290. {
  291. time_min=t_min;
  292. parkspace_id=i;
  293. }
  294. else
  295. {
  296. time_min=t_min<time_min?t_min:time_min;
  297. parkspace_id=i;
  298. }
  299. }
  300. else
  301. {
  302. //用时=电梯口到目标车位的距离/中跑车速度+目标终端到电梯口的距离/中跑车速度+目标车位楼层*楼层高度/电梯速度
  303. int time_left= i%15*all_parkspace_data.parkspace_info(i).width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME + \
  304. terminal_id%6*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + \
  305. all_parkspace_data.parkspace_info(i).floor()*all_parkspace_data.parkspace_info(i).height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME;
  306. int time_right=(15-i%15)*all_parkspace_data.parkspace_info(i).width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME + \
  307. (6-terminal_id%6)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + \
  308. all_parkspace_data.parkspace_info(i).floor()*all_parkspace_data.parkspace_info(i).height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME;
  309. time_min=time_left;
  310. parkspace_id=i;
  311. if ( time_left <= time_right )
  312. {
  313. if ( time_min>time_left )
  314. {
  315. time_min=time_left;
  316. parkspace_id=i;
  317. }
  318. }
  319. else
  320. {
  321. if ( time_min>time_right )
  322. {
  323. time_min=time_right;
  324. parkspace_id=i;
  325. }
  326. }
  327. }
  328. }
  329. }
  330. ++i;
  331. }
  332. }
  333. else if ( car_info.car_height() <= CAR_HIGH_STANDARDS )
  334. {
  335. //计算四楼以上最优车位
  336. int i=0;
  337. while (i<=all_parkspace_data.parkspace_info_size())
  338. {
  339. if(all_parkspace_data.parkspace_info(i).floor()>4 \
  340. && all_parkspace_data.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_empty)
  341. {
  342. if ( i%15==1 || i%15==2 || i%15==14 || i%15==0 )
  343. {
  344. int t_min=terminal_id%6*TERMINAL_SPACING/MEDIUM_CAR_SPEED + all_parkspace_data.parkspace_info(i).floor()*all_parkspace_data.parkspace_info(i).height()/THE_ELEVATOR_SPEED+DOWNSTAIRS_SPORTS_TIME+ELEVATOR_MOVEMENT_TIME;
  345. if ( time_min == 0 )
  346. {
  347. time_min=t_min;
  348. parkspace_id=i;
  349. }
  350. else
  351. {
  352. time_min=t_min<time_min?t_min:time_min;
  353. parkspace_id=i;
  354. }
  355. }
  356. else
  357. {
  358. //用时=电梯口到目标车位的距离/中跑车速度+目标终端到电梯口的距离/中跑车速度+目标车位楼层*楼层高度/电梯速度
  359. int time_left= i%15*all_parkspace_data.parkspace_info(i).width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME + \
  360. terminal_id%6*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + \
  361. all_parkspace_data.parkspace_info(i).floor()*all_parkspace_data.parkspace_info(i).height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME;
  362. int time_right=(15-i%15)*all_parkspace_data.parkspace_info(i).width()/MEDIUM_CAR_SPEED + UPSTAIRS_SPORTS_TIME + \
  363. (6-terminal_id%6)*TERMINAL_SPACING/MEDIUM_CAR_SPEED + DOWNSTAIRS_SPORTS_TIME + \
  364. all_parkspace_data.parkspace_info(i).floor()*all_parkspace_data.parkspace_info(i).height()/THE_ELEVATOR_SPEED + ELEVATOR_MOVEMENT_TIME;
  365. time_min=time_left;
  366. parkspace_id=i;
  367. if ( time_left <= time_right )
  368. {
  369. if ( time_min>time_left )
  370. {
  371. time_min=time_left;
  372. parkspace_id=i;
  373. }
  374. }
  375. else
  376. {
  377. if ( time_min>time_right )
  378. {
  379. time_min=time_right;
  380. parkspace_id=i;
  381. }
  382. }
  383. }
  384. }
  385. ++i;
  386. }
  387. }
  388. parkspace_info.CopyFrom(all_parkspace_data.parkspace_info(parkspace_id));
  389. return t_error;
  390. }
  391. //分配车位线程函数
  392. void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int terminal_id, std::string command_key)
  393. {
  394. LOG(INFO) << "分配车位 "<<"牌号:"<<car_info.license()<<" command_key="<<command_key; //huli printf command_key
  395. //根据请求的信息反馈分配的车位,并封装发送
  396. message::Parkspace_allocation_response_msg response_msg;
  397. message::Base_info t_response_header;
  398. t_response_header.set_msg_type(message::Message_type::eParkspace_allocation_response_msg);
  399. t_response_header.set_timeout_ms(1000);
  400. t_response_header.set_sender(message::Communicator::eParkspace);
  401. t_response_header.set_receiver(message::Communicator::eMain);
  402. message::Error_manager t_error;
  403. message::Parkspace_info t_allocated_space;
  404. Error_manager error;
  405. //分配之前查询车辆是否已经存在
  406. if(check_car_existence(car_info.license()))
  407. {
  408. t_error.set_error_code(PARKSPACE_ALLOCATOR_CAR_ALREADY_EXIST);
  409. t_error.set_error_level(message::Error_level::MAJOR_ERROR);
  410. t_error.set_error_description("车辆已存在");
  411. LOG(ERROR) << car_info.license()<<" 车辆已存在";
  412. }
  413. else
  414. {
  415. //如果车辆不存在 则找到一个最优车位
  416. // error=query_the_optimal_parkspace(t_allocated_space,car_info,terminal_id);
  417. //如果车辆不存在则获取一个空车位
  418. error=m_parkspace_operating_function.query_one_empty_parkspace(t_allocated_space);
  419. if ( error != Error_code::SUCCESS )
  420. {
  421. t_error.set_error_code(error.get_error_code());
  422. t_error.set_error_level((message::Error_level)error.get_error_level());
  423. t_error.set_error_description(error.get_error_description());
  424. LOG(ERROR) << car_info.license()<<" 获取空车位失败 "<<error.to_string();
  425. }
  426. else
  427. {
  428. //修改车为状态为锁定
  429. t_allocated_space.set_parkspace_status(message::Parkspace_status::eParkspace_locked);
  430. t_allocated_space.mutable_car_info()->CopyFrom(car_info);
  431. // 分配车位后更新车位状态
  432. error=m_parkspace_operating_function.update_parkspace_data(t_allocated_space);
  433. if ( error != SUCCESS )
  434. {
  435. t_error.set_error_code(error.get_error_code());
  436. t_error.set_error_level((message::Error_level)error.get_error_level());
  437. t_error.set_error_description(error.get_error_description());
  438. LOG(ERROR) << car_info.license()<<" 更新车位数据失败 "<<error.to_string();
  439. }
  440. else
  441. {
  442. //修改车辆状态为停车中
  443. message::Vehicle_status t_vehicle_status = message::Vehicle_status::eVehicle_parking;
  444. error=m_parkspace_operating_function.update_vehicle_with_parkspace(t_allocated_space,t_vehicle_status);
  445. if ( error != SUCCESS )
  446. {
  447. t_error.set_error_code(error.get_error_code());
  448. t_error.set_error_level((message::Error_level)error.get_error_level());
  449. t_error.set_error_description(error.get_error_description());
  450. LOG(ERROR) << car_info.license()<<" 更新车辆数据失败 "<<error.to_string();
  451. }
  452. else
  453. {
  454. t_error.set_error_code(SUCCESS);
  455. t_error.set_error_level(message::Error_level::NORMAL);
  456. LOG(INFO) <<"分配车位成功 "<<"车位ID:"<<t_allocated_space.parkspace_id()<<" 车牌号:"<<t_allocated_space.car_info().license();
  457. }
  458. }
  459. }
  460. }
  461. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  462. response_msg.set_command_key(command_key);
  463. response_msg.mutable_error_manager()->CopyFrom(t_error);
  464. response_msg.mutable_allocated_space_info()->CopyFrom(t_allocated_space);
  465. Communication_message response=Communication_message();
  466. response.reset(t_response_header, response_msg.SerializeAsString());
  467. Parkspace_communicator::get_instance_references().send_response(&response);
  468. send_parkspace_data();
  469. }
  470. //查询车位线程函数
  471. void Parkspace_manager::execute_for_search(message::Car_info car_info,std::string command_key)
  472. {
  473. LOG(INFO) << "查询车位 "<<"牌号:"<<car_info.license()<<" command_key="<<command_key; //huli printf command_key
  474. //根据车辆凭证信息查询车辆位置
  475. message::Parkspace_search_response_msg response_msg;
  476. message::Base_info t_response_header;
  477. message::Error_manager t_error;
  478. message::Parkspace_info t_car_position;
  479. t_response_header.set_msg_type(message::Message_type::eParkspace_search_response_msg);
  480. t_response_header.set_timeout_ms(1000);
  481. t_response_header.set_sender(message::Communicator::eParkspace);
  482. t_response_header.set_receiver(message::Communicator::eMain);
  483. //查询车辆位置
  484. message::Parkspace_info parkspace_info;
  485. Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_license(car_info.license(),parkspace_info);
  486. if ( error != SUCCESS )
  487. {
  488. t_error.set_error_code(error.get_error_code());
  489. t_error.set_error_level((message::Error_level)error.get_error_level());
  490. t_error.set_error_description(error.get_error_description());
  491. LOG(ERROR) << "查询车位失败 "<<error.to_string();
  492. }
  493. else
  494. {
  495. t_error.set_error_code(SUCCESS);
  496. t_error.set_error_level(message::Error_level::NORMAL);
  497. LOG(INFO) << "车辆"<<parkspace_info.car_info().license()<<" 在"<<parkspace_info.parkspace_id()<<"号车位上";
  498. }
  499. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  500. response_msg.set_command_key(command_key);
  501. response_msg.mutable_error_manager()->CopyFrom(t_error);
  502. response_msg.mutable_car_position()->CopyFrom(t_car_position);
  503. Communication_message response=Communication_message();
  504. response.reset(t_response_header, response_msg.SerializeAsString());
  505. Parkspace_communicator::get_instance_references().send_response(&response);
  506. }
  507. //释放车位线程函数
  508. void Parkspace_manager::execute_for_release(message::Parkspace_info space_info, std::string command_key)
  509. {
  510. LOG(INFO) << "释放车位 "<<"牌号:"<<space_info.car_info().license()<<" command_key="<<command_key;
  511. //根据车位信息定位待释放车位位置,车辆凭证号用于校验
  512. message::Parkspace_release_response_msg response_msg;
  513. message::Base_info t_response_header;
  514. t_response_header.set_msg_type(message::eParkspace_release_response_msg);
  515. t_response_header.set_sender(message::eParkspace);
  516. t_response_header.set_receiver(message::eMain);
  517. t_response_header.set_timeout_ms(1000);
  518. message::Error_manager t_error;
  519. message::Parkspace_info t_release_space;
  520. //找到待释放的车位
  521. Error_manager error=m_parkspace_operating_function.query_one_parkspace_with_parkspace_id(space_info.parkspace_id(),t_release_space);
  522. if ( error != SUCCESS )
  523. {
  524. t_error.set_error_code(error.get_error_code());
  525. t_error.set_error_level((message::Error_level)error.get_error_level());
  526. t_error.set_error_description(error.get_error_description());
  527. LOG(ERROR) << "释放车位失败 "<<error.to_string();
  528. }
  529. else if(!t_release_space.has_car_info())
  530. {
  531. t_error.set_error_code(PARKSPACE_ALLOCATOR_RELEASE_FAILED);
  532. t_error.set_error_level(message::Error_level::MAJOR_ERROR);
  533. LOG(WARNING) << "传入待释放车位无车辆信息";
  534. }
  535. else
  536. {
  537. t_release_space.set_parkspace_status(message::Parkspace_status::eParkspace_empty);
  538. error = m_parkspace_operating_function.update_parkspace_data(t_release_space);
  539. if (error != SUCCESS)
  540. {
  541. t_error.set_error_code(error.get_error_code());
  542. t_error.set_error_level((message::Error_level) error.get_error_level());
  543. t_error.set_error_description(error.get_error_description());
  544. LOG(ERROR) << "释放车位 更新数据库车位数据失败 " << error.to_string();
  545. }
  546. else
  547. {
  548. message::Vehicle_status t_vehicle_status = message::Vehicle_status::eVehicle_idle;
  549. error = m_parkspace_operating_function.update_vehicle_with_parkspace(t_release_space, t_vehicle_status);
  550. if (error != SUCCESS)
  551. {
  552. t_error.set_error_code(error.get_error_code());
  553. t_error.set_error_level((message::Error_level) error.get_error_level());
  554. t_error.set_error_description(error.get_error_description());
  555. LOG(ERROR) << "释放车位 更新数据库车辆数据失败 " << error.to_string();
  556. }
  557. else
  558. {
  559. t_error.set_error_code(SUCCESS);
  560. t_error.set_error_level(message::Error_level::NORMAL);
  561. LOG(INFO) << "第:" << t_release_space.parkspace_id() << "号位 车辆: " << t_release_space.car_info().license()
  562. << " 释放成功";
  563. //获取预约ID
  564. int t_park_record_id;
  565. error = m_parkspace_operating_function.query_vehicle(t_release_space.car_info().license(),
  566. t_vehicle_status, t_park_record_id);
  567. if (error != SUCCESS)
  568. {
  569. t_error.set_error_code(error.get_error_code());
  570. t_error.set_error_level((message::Error_level) error.get_error_level());
  571. t_error.set_error_description(error.get_error_description());
  572. LOG(ERROR) << "释放车位 数据库查询车辆信息失败 " << error.to_string();
  573. }
  574. else if (t_vehicle_status == message::Vehicle_status::eVehicle_idle)
  575. {
  576. time_t tt = time(NULL);
  577. tm *t = localtime(&tt);
  578. char my_time_buf[255];
  579. memset(my_time_buf, 0, 255);
  580. sprintf(my_time_buf, "%d-%02d-%02d %02d:%02d:%02d",
  581. t->tm_year + 1900,
  582. t->tm_mon + 1,
  583. t->tm_mday,
  584. t->tm_hour,
  585. t->tm_min,
  586. t->tm_sec);
  587. t_release_space.set_leave_time(my_time_buf);
  588. error = m_parkspace_operating_function.update_parking_record(t_release_space, t_park_record_id);
  589. if (error != SUCCESS)
  590. {
  591. t_error.set_error_code(error.get_error_code());
  592. t_error.set_error_level((message::Error_level) error.get_error_level());
  593. t_error.set_error_description(error.get_error_description());
  594. LOG(ERROR) << "更新停车记录失败: " << error.to_string();
  595. }
  596. }
  597. }
  598. }
  599. }
  600. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  601. response_msg.set_command_key(command_key);
  602. response_msg.mutable_error_manager()->CopyFrom(t_error);
  603. response_msg.mutable_release_space_info()->CopyFrom(t_release_space);
  604. Communication_message response=Communication_message();
  605. response.reset(t_response_header, response_msg.SerializeAsString());
  606. Parkspace_communicator::get_instance_references().send_response(&response);
  607. send_parkspace_data();
  608. }
  609. //强制更新车位信息线程函数
  610. void Parkspace_manager::execute_for_force_update(message::Parkspace_info space_info, std::string command_key)
  611. {
  612. LOG(INFO) << "手动 "<<"牌号:"<<space_info.car_info().license()<<" command_key="<<command_key;
  613. //根据车位信息定位待释放车位位置,车辆凭证号用于校验
  614. //!!!!!此处跳过外部处理与调用的过程,直接在内部调用,发送分配结果用于测试,目前一直发布第一个车位
  615. message::Parkspace_force_update_response_msg response_msg;
  616. message::Base_info t_response_header;
  617. t_response_header.set_msg_type(message::eParkspace_force_update_response_msg);
  618. t_response_header.set_sender(message::eParkspace);
  619. t_response_header.set_receiver(message::eMain);
  620. t_response_header.set_timeout_ms(1000);
  621. message::Error_manager t_error;
  622. message::Parkspace_info t_update_space;
  623. Error_manager error;
  624. // id 9999为特殊情况,复位所有车位状态
  625. if (space_info.parkspace_id() == 9999)
  626. {
  627. // 复位所有车位状态
  628. error=m_parkspace_operating_function.clear_all_parkspace_info();
  629. if( error != SUCCESS)
  630. {
  631. t_error.set_error_code(error.get_error_code());
  632. t_error.set_error_level((message::Error_level) error.get_error_level());
  633. LOG(INFO) << "手动更新所有车位失败 "<<error.to_string();
  634. }
  635. else
  636. {
  637. t_error.set_error_code(SUCCESS);
  638. t_error.set_error_level(message::Error_level::NORMAL);
  639. LOG(INFO) << "所有车位已手动更新 ";
  640. }
  641. }
  642. else
  643. {
  644. //手动修改车位信息
  645. error = m_parkspace_operating_function.update_parkspace_data(t_update_space);
  646. if (error != SUCCESS)
  647. {
  648. t_error.set_error_code(error.get_error_code());
  649. t_error.set_error_level((message::Error_level)error.get_error_level());
  650. LOG(INFO) << "手动 数据库更新车位失败 "<<error.to_string();
  651. }
  652. else
  653. {
  654. t_error.set_error_code(SUCCESS);
  655. t_error.set_error_level(message::Error_level::NORMAL);
  656. LOG(INFO) << "第" << t_update_space.parkspace_id() << "号位已手动更新";
  657. }
  658. }
  659. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  660. response_msg.set_command_key(command_key);
  661. response_msg.mutable_error_manager()->CopyFrom(t_error);
  662. response_msg.mutable_update_space_info()->CopyFrom(t_update_space);
  663. Communication_message response=Communication_message();
  664. response.reset(t_response_header, response_msg.SerializeAsString());
  665. Parkspace_communicator::get_instance_references().send_response(&response);
  666. send_parkspace_data();
  667. }
  668. //确认分配车位线程函数
  669. void Parkspace_manager::execute_for_confirm_alloc(message::Parkspace_info space_info, std::string command_key)
  670. {
  671. LOG(INFO) << "确认分配 " << "牌号:" << space_info.car_info().license() << " command_key=" << command_key;
  672. //根据车位信息定位待确认占用车位
  673. message::Parkspace_confirm_alloc_response_msg response_msg;
  674. message::Base_info t_response_header;
  675. t_response_header.set_msg_type(message::eParkspace_confirm_alloc_response_msg);
  676. t_response_header.set_sender(message::eParkspace);
  677. t_response_header.set_receiver(message::eMain);
  678. t_response_header.set_timeout_ms(1000);
  679. message::Error_manager t_error;
  680. message::Parkspace_info t_confirm_space;
  681. Error_manager error;
  682. //获取确认分配的车位
  683. error = m_parkspace_operating_function.query_one_parkspace_with_parkspace_id(space_info.parkspace_id(),
  684. t_confirm_space);
  685. if (error != SUCCESS)
  686. {
  687. t_error.set_error_code(error.get_error_code());
  688. t_error.set_error_level((message::Error_level) error.get_error_level());
  689. t_error.set_error_description(error.get_error_description());
  690. LOG(ERROR) << "确认分配 查询车位信息失败 " << error.to_string();
  691. }
  692. else if (!t_confirm_space.has_car_info())
  693. {
  694. t_error.set_error_code(PARKSPACE_ALLOCATOR_RELEASE_FAILED);
  695. t_error.set_error_level(message::Error_level::MAJOR_ERROR);
  696. LOG(WARNING) << "传入待确认车位无车辆信息";
  697. }
  698. else
  699. {
  700. //校验车位状态是否为被锁定
  701. if (t_confirm_space.parkspace_status() != message::Parkspace_status::eParkspace_locked)
  702. {
  703. t_error.set_error_code(DB_QUERY_DATA_FAILED);
  704. t_error.set_error_level(message::Error_level::MINOR_ERROR);
  705. t_error.set_error_description("查询车位状态错误");
  706. LOG(ERROR) << "确认分配 查询车位状态错误 " << error.to_string();
  707. }
  708. else
  709. {
  710. //修改车位状态为占用
  711. t_confirm_space.set_parkspace_status(message::Parkspace_status::eParkspace_occupied);
  712. error = m_parkspace_operating_function.update_parkspace_data(t_confirm_space);
  713. if (error != SUCCESS)
  714. {
  715. t_error.set_error_code(error.get_error_code());
  716. t_error.set_error_level((message::Error_level) error.get_error_level());
  717. LOG(INFO) << "确认分配 数据库更新车位失败 " << error.to_string();
  718. }
  719. else
  720. {
  721. //修改车辆状态为已入库
  722. message::Vehicle_status t_vehicle_status = message::Vehicle_status::eVehicle_in_garage;
  723. error = m_parkspace_operating_function.update_vehicle_with_parkspace(t_confirm_space, t_vehicle_status);
  724. if (error != SUCCESS)
  725. {
  726. t_error.set_error_code(error.get_error_code());
  727. t_error.set_error_level((message::Error_level) error.get_error_level());
  728. t_error.set_error_description(error.get_error_description());
  729. LOG(ERROR) << "确认分配 更新数据库车辆数据失败 " << error.to_string();
  730. }
  731. t_error.set_error_code(SUCCESS);
  732. t_error.set_error_level(message::Error_level::NORMAL);
  733. LOG(INFO) << "第:" << t_confirm_space.parkspace_id() << "号位 车辆: " << t_confirm_space.car_info().license()<< " 确认占用成功";
  734. //插入停车记录
  735. time_t tt = time(NULL);
  736. tm *t = localtime(&tt);
  737. char my_time_buf[255];
  738. memset(my_time_buf, 0, 255);
  739. sprintf(my_time_buf, "%d-%02d-%02d %02d:%02d:%02d",
  740. t->tm_year + 1900,
  741. t->tm_mon + 1,
  742. t->tm_mday,
  743. t->tm_hour,
  744. t->tm_min,
  745. t->tm_sec);
  746. t_confirm_space.set_entry_time(my_time_buf);
  747. error = m_parkspace_operating_function.insert_parking_record(t_confirm_space);
  748. if ( error != SUCCESS )
  749. {
  750. t_error.set_error_code(error.get_error_code());
  751. t_error.set_error_level((message::Error_level) error.get_error_level());
  752. LOG(ERROR) << "插入停车记录失败: " << error.to_string();
  753. }
  754. //查询停车记录的ID
  755. int t_record_id;
  756. error = m_parkspace_operating_function.query_parking_record(t_confirm_space,t_record_id);
  757. if ( error != SUCCESS )
  758. {
  759. t_error.set_error_code(error.get_error_code());
  760. t_error.set_error_level((message::Error_level) error.get_error_level());
  761. LOG(ERROR) << "查询停车记录ID失败: " << error.to_string();
  762. }
  763. //更新停车记录ID
  764. error = m_parkspace_operating_function.update_record_id(t_confirm_space.car_info().license(),t_record_id);
  765. if ( error != SUCCESS )
  766. {
  767. t_error.set_error_code(error.get_error_code());
  768. t_error.set_error_level((message::Error_level) error.get_error_level());
  769. LOG(ERROR) << "更新停车记录ID失败: " << error.to_string();
  770. }
  771. }
  772. }
  773. }
  774. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  775. response_msg.set_command_key(command_key);
  776. response_msg.mutable_error_manager()->CopyFrom(t_error);
  777. response_msg.mutable_confirm_alloc_space_info()->CopyFrom(t_confirm_space);
  778. Communication_message response=Communication_message();
  779. response.reset(t_response_header, response_msg.SerializeAsString());
  780. Parkspace_communicator::get_instance_references().send_response(&response);
  781. send_parkspace_data();
  782. }