|
@@ -243,7 +243,7 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
//判断是否是左半库
|
|
|
if ( terminal_id<=3 && terminal_id>=0 )
|
|
|
{
|
|
|
- LOG(INFO) << " 左半库 车牌号:"<<car_info.license()<<" 车高:"<<car_info.car_height()<< this;
|
|
|
+ LOG(INFO) << " 左半库 车牌号:"<<car_info.license()<<" 车高:"<<car_info.car_height();
|
|
|
//如果是小车 (低于1.55米属于小车)
|
|
|
if ( car_info.car_height() <= MIN_CAR_HIGH )
|
|
|
{
|
|
@@ -647,7 +647,7 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverA(message::Pa
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::MINOR_ERROR,
|
|
|
"query_the_optimal_parkspace_serverA error ");
|
|
|
}
|
|
|
//找到一个最优车位---方案二
|
|
@@ -926,7 +926,7 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB1(message::P
|
|
|
"无合适车位分配! query_the_optimal_parkspace_serverB1 error ");
|
|
|
}
|
|
|
}
|
|
|
- return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
|
|
|
"无合适车位分配! query_the_optimal_parkspace_serverB1 error ");
|
|
|
|
|
|
}
|
|
@@ -1205,7 +1205,7 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB2(message::P
|
|
|
"无合适车位分配! query_the_optimal_parkspace_serverB2 error ");
|
|
|
}
|
|
|
}
|
|
|
- return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
|
|
|
" 无合适车位分配! query_the_optimal_parkspace_serverB2 error ");
|
|
|
}
|
|
|
//找缓存区车位
|
|
@@ -1318,11 +1318,11 @@ Error_manager Parkspace_manager::query_the_optimal_parkspace_serverB3(message::P
|
|
|
"无合适车位分配! query_the_optimal_parkspace_serverB3 error ");
|
|
|
}
|
|
|
}
|
|
|
- return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ return Error_manager(Error_code::PARKSPACE_ALLOCATOR_ALLOCATE_FAILED, Error_level::NEGLIGIBLE_ERROR,
|
|
|
" 无合适车位分配! query_the_optimal_parkspace_serverB3 error ");
|
|
|
}
|
|
|
//分配车位线程函数
|
|
|
-void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int terminal_id, std::string command_key)
|
|
|
+void Parkspace_manager:: execute_for_allocate(message::Car_info car_info, int terminal_id, std::string command_key)
|
|
|
{
|
|
|
LOG(INFO) << "分配车位 " << "牌号:" << car_info.license() << " 车高:" << car_info.car_height()
|
|
|
<< " command_key=" << command_key;
|
|
@@ -1342,7 +1342,11 @@ void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int ter
|
|
|
message::Parkspace_info t_allocated_space_rigth;
|
|
|
message::Parkspace_info t_allocated_space_temporary;
|
|
|
|
|
|
- Error_manager error;
|
|
|
+ Error_manager error_A;
|
|
|
+
|
|
|
+ Error_manager error_B1;
|
|
|
+ Error_manager error_B2;
|
|
|
+ Error_manager error_B3;
|
|
|
//分配之前查询车辆是否已经存在
|
|
|
if (check_car_existence(car_info.license()))
|
|
|
{
|
|
@@ -1357,52 +1361,38 @@ void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int ter
|
|
|
if (!PLAN)
|
|
|
{
|
|
|
// 如果车辆不存在 则找到一个最优车位(方案A)----车库分为两个独立部分,左库和右库如果1~3号终端来车 则在左库分配车位,4~号终端来车 则在右库分配车位
|
|
|
- LOG(INFO) << " 方案A---------分配车位中---------- " << this;
|
|
|
- error = query_the_optimal_parkspace_serverA(t_allocated_space, car_info, terminal_id);
|
|
|
- if (error != Error_code::SUCCESS)
|
|
|
+ LOG(INFO) << " 方案A---------分配车位中---------- " ;
|
|
|
+ error_A = query_the_optimal_parkspace_serverA(t_allocated_space, car_info, terminal_id);
|
|
|
+ if (error_A != Error_code::SUCCESS)
|
|
|
{
|
|
|
- t_error.set_error_code(error.get_error_code());
|
|
|
- t_error.set_error_level((message::Error_level) error.get_error_level());
|
|
|
- t_error.set_error_description(error.get_error_description());
|
|
|
- LOG(ERROR) << car_info.license() << " 获取空车位失败 " << error.to_string();
|
|
|
+ t_error.set_error_code(error_A.get_error_code());
|
|
|
+ t_error.set_error_level((message::Error_level) error_A.get_error_level());
|
|
|
+ t_error.set_error_description(error_A.get_error_description());
|
|
|
+ LOG(ERROR) << car_info.license() << " 获取空车位失败 " << error_A.to_string();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- //尚未加入操作回退步骤
|
|
|
-
|
|
|
//修改车位状态为锁定
|
|
|
t_allocated_space.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
|
|
|
t_allocated_space.mutable_car_info()->CopyFrom(car_info);
|
|
|
// 分配车位后更新数据库中车位状态
|
|
|
- error = m_parkspace_operating_function.update_parkspace_data(t_allocated_space);
|
|
|
- if (error != SUCCESS)
|
|
|
+ error_A = m_parkspace_operating_function.update_parkspace_data(t_allocated_space);
|
|
|
+ if (error_A != SUCCESS)
|
|
|
{
|
|
|
- t_error.set_error_code(error.get_error_code());
|
|
|
- t_error.set_error_level((message::Error_level) error.get_error_level());
|
|
|
- t_error.set_error_description(error.get_error_description());
|
|
|
- LOG(ERROR) << car_info.license() << " 更新车位数据失败 " << error.to_string();
|
|
|
+ //若更新车位数据失败会直接返回,不要进行回退操作
|
|
|
+ t_error.set_error_code(error_A.get_error_code());
|
|
|
+ t_error.set_error_level((message::Error_level) error_A.get_error_level());
|
|
|
+ t_error.set_error_description(error_A.get_error_description());
|
|
|
+ LOG(ERROR) << car_info.license() << " 更新车位数据失败 " << error_A.to_string();
|
|
|
+
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- //修改车辆状态为停车中
|
|
|
- message::Vehicle_status t_vehicle_status = message::Vehicle_status::eVehicle_parking;
|
|
|
- error = m_parkspace_operating_function.update_vehicle_with_parkspace(t_allocated_space,
|
|
|
- t_vehicle_status);
|
|
|
- if (error != SUCCESS)
|
|
|
- {
|
|
|
- t_error.set_error_code(error.get_error_code());
|
|
|
- t_error.set_error_level((message::Error_level) error.get_error_level());
|
|
|
- t_error.set_error_description(error.get_error_description());
|
|
|
- LOG(ERROR) << car_info.license() << " 更新车辆数据失败 " << error.to_string();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- t_error.set_error_code(SUCCESS);
|
|
|
- t_error.set_error_level(message::Error_level::NORMAL);
|
|
|
- LOG(INFO) << "方案A --- 分配车位成功 " << "车位ID:" << t_allocated_space.parkingspace_index_id()
|
|
|
+ t_error.set_error_code(SUCCESS);
|
|
|
+ t_error.set_error_level(message::Error_level::NORMAL);
|
|
|
+ LOG(INFO) << "方案A --- 分配车位成功 " << "车位ID:" << t_allocated_space.parkingspace_index_id()
|
|
|
<< " 车牌号:" << t_allocated_space.car_info().license();
|
|
|
- response_msg.mutable_allocated_parkspace_info()->CopyFrom(t_allocated_space);
|
|
|
- }
|
|
|
+ response_msg.mutable_allocated_parkspace_info()->CopyFrom(t_allocated_space);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1410,36 +1400,21 @@ void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int ter
|
|
|
{
|
|
|
// 如果车辆不存在 则找到一个最优车位(方案B)----分配三个车位 左边分配一个 右边分配一个 缓冲区分配一个 最后使用那个由调度决定
|
|
|
LOG(INFO) << " 方案B---------分配车位中---------- " << this;
|
|
|
-//
|
|
|
- error = query_the_optimal_parkspace_serverB1(t_allocated_space_left, car_info, terminal_id);
|
|
|
- if (error != Error_code::SUCCESS)
|
|
|
- {
|
|
|
- LOG(ERROR) << car_info.license() << " 获取左侧车位失败 " << error.to_string();
|
|
|
- }
|
|
|
-
|
|
|
- error = query_the_optimal_parkspace_serverB2(t_allocated_space_rigth, car_info, terminal_id);
|
|
|
- if (error != Error_code::SUCCESS)
|
|
|
- {
|
|
|
- LOG(ERROR) << car_info.license() << " 获取右侧车位失败 " << error.to_string();
|
|
|
- }
|
|
|
-
|
|
|
- error = query_the_optimal_parkspace_serverB3(t_allocated_space_temporary, car_info, terminal_id);
|
|
|
- if (error != Error_code::SUCCESS)
|
|
|
+ //获取左侧车位
|
|
|
+ error_B1 = query_the_optimal_parkspace_serverB1(t_allocated_space_left, car_info, terminal_id);
|
|
|
+ if (error_B1 != Error_code::SUCCESS)
|
|
|
{
|
|
|
- LOG(ERROR) << car_info.license() << " 获取缓冲区车位失败 " << error.to_string();
|
|
|
+ LOG(ERROR) << car_info.license() << " 获取左侧车位失败 " << error_B1.to_string();
|
|
|
}
|
|
|
- if (t_allocated_space_left.parkingspace_index_id() != -1)
|
|
|
+ else
|
|
|
{
|
|
|
t_allocated_space_left.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
|
|
|
t_allocated_space_left.mutable_car_info()->CopyFrom(car_info);
|
|
|
// 分配车位后更新数据库中车位状态--左车位
|
|
|
- error = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_left);
|
|
|
- if (error != SUCCESS)
|
|
|
+ error_B1 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_left);
|
|
|
+ if (error_B1 != SUCCESS)
|
|
|
{
|
|
|
- t_error.set_error_code(error.get_error_code());
|
|
|
- t_error.set_error_level((message::Error_level) error.get_error_level());
|
|
|
- t_error.set_error_description(error.get_error_description());
|
|
|
- LOG(ERROR) << car_info.license() << " 左车位更新数据失败 " << error.to_string();
|
|
|
+ LOG(ERROR) << car_info.license() << " 左车位更新数据失败 " << error_B1.to_string();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -1447,18 +1422,21 @@ void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int ter
|
|
|
LOG(INFO) << " ----- 左 车 位ID: " << t_allocated_space_left.parkingspace_index_id() << "-----";
|
|
|
}
|
|
|
}
|
|
|
- if (t_allocated_space_rigth.parkingspace_index_id() != -1)
|
|
|
+ //获取右侧车位
|
|
|
+ error_B2 = query_the_optimal_parkspace_serverB2(t_allocated_space_rigth, car_info, terminal_id);
|
|
|
+ if (error_B2 != Error_code::SUCCESS)
|
|
|
+ {
|
|
|
+ LOG(ERROR) << car_info.license() << " 获取右侧车位失败 " << error_B2.to_string();
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
t_allocated_space_rigth.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
|
|
|
t_allocated_space_rigth.mutable_car_info()->CopyFrom(car_info);
|
|
|
// 分配车位后更新数据库中车位状态--右车位
|
|
|
- error = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_rigth);
|
|
|
- if (error != SUCCESS)
|
|
|
+ error_B2 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_rigth);
|
|
|
+ if (error_B2 != SUCCESS)
|
|
|
{
|
|
|
- t_error.set_error_code(error.get_error_code());
|
|
|
- t_error.set_error_level((message::Error_level) error.get_error_level());
|
|
|
- t_error.set_error_description(error.get_error_description());
|
|
|
- LOG(ERROR) << car_info.license() << " 右车位更新数据失败 " << error.to_string();
|
|
|
+ LOG(ERROR) << car_info.license() << " 右车位更新数据失败 " << error_B2.to_string();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -1466,18 +1444,21 @@ void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int ter
|
|
|
LOG(INFO) << " ----- 右 车 位ID: " << t_allocated_space_rigth.parkingspace_index_id() << "-----";
|
|
|
}
|
|
|
}
|
|
|
- if (t_allocated_space_temporary.parkingspace_index_id() != -1)
|
|
|
+ //获取缓冲区车位
|
|
|
+ error_B3 = query_the_optimal_parkspace_serverB3(t_allocated_space_temporary, car_info, terminal_id);
|
|
|
+ if (error_B3 != Error_code::SUCCESS)
|
|
|
+ {
|
|
|
+ LOG(ERROR) << car_info.license() << " 获取缓冲区车位失败 " << error_B3.to_string();
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
t_allocated_space_temporary.set_parkingspace_status(message::Parkspace_status::eParkspace_locked);
|
|
|
t_allocated_space_temporary.mutable_car_info()->CopyFrom(car_info);
|
|
|
// 分配车位后更新数据库中车位状态--缓冲车位
|
|
|
- error = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_temporary);
|
|
|
- if (error != SUCCESS)
|
|
|
+ error_B3 = m_parkspace_operating_function.update_parkspace_data(t_allocated_space_temporary);
|
|
|
+ if (error_B3 != SUCCESS)
|
|
|
{
|
|
|
- t_error.set_error_code(error.get_error_code());
|
|
|
- t_error.set_error_level((message::Error_level) error.get_error_level());
|
|
|
- t_error.set_error_description(error.get_error_description());
|
|
|
- LOG(ERROR) << car_info.license() << " 缓冲车位更新数据失败 " << error.to_string();
|
|
|
+ LOG(ERROR) << car_info.license() << " 缓冲车位更新数据失败 " << error_B3.to_string();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -1485,9 +1466,12 @@ void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int ter
|
|
|
LOG(INFO) << " -----缓冲车位车位ID: " << t_allocated_space_temporary.parkingspace_index_id() << "-----";
|
|
|
}
|
|
|
}
|
|
|
- if (error == SUCCESS)
|
|
|
+ Error_manager error_total;
|
|
|
+ error_total.compare_and_cover_error(error_B1);
|
|
|
+ error_total.compare_and_cover_error(error_B2);
|
|
|
+ error_total.compare_and_cover_error(error_B3);
|
|
|
+ if ( error_B1==SUCCESS || error_B2==SUCCESS || error_B3==SUCCESS )
|
|
|
{
|
|
|
-
|
|
|
t_error.set_error_code(SUCCESS);
|
|
|
t_error.set_error_level(message::Error_level::NORMAL);
|
|
|
LOG(INFO) << " 分配车位成功! ";
|
|
@@ -1496,12 +1480,12 @@ void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int ter
|
|
|
{
|
|
|
t_error.set_error_code(PARKSPACE_ALLOCATOR_ALLOCATE_FAILED);
|
|
|
t_error.set_error_level(message::Error_level::MINOR_ERROR);
|
|
|
- t_error.set_error_description("分配失败 无车位!");
|
|
|
+ t_error.set_error_description(error_total.get_error_description());
|
|
|
LOG(INFO) << " 分配车位失败,无车位! ";
|
|
|
}
|
|
|
|
|
|
- m_parkspace_lock.unlock();
|
|
|
}
|
|
|
+ m_parkspace_lock.unlock();
|
|
|
response_msg.mutable_base_info()->CopyFrom(t_response_header);
|
|
|
response_msg.set_command_key(command_key);
|
|
|
response_msg.mutable_error_manager()->CopyFrom(t_error);
|
|
@@ -1516,7 +1500,6 @@ void Parkspace_manager::execute_for_allocate(message::Car_info car_info, int ter
|
|
|
void Parkspace_manager::execute_for_confirm_alloc(message::Parkspace_confirm_alloc_request_msg request)
|
|
|
{
|
|
|
|
|
|
-
|
|
|
message::Parkspace_confirm_alloc_response_msg response_msg;
|
|
|
message::Base_info t_response_header;
|
|
|
t_response_header.set_msg_type(message::eParkspace_confirm_alloc_response_msg);
|
|
@@ -1542,7 +1525,7 @@ void Parkspace_manager::execute_for_confirm_alloc(message::Parkspace_confirm_all
|
|
|
t_error.set_error_level((message::Error_level)error.get_error_level());
|
|
|
t_error.set_error_description(error.get_error_description());
|
|
|
}
|
|
|
- if ( confirm_alloc_parkspace_info.parkingspace_status() != message::eParkspace_empty )
|
|
|
+ if ( confirm_alloc_parkspace_info.parkingspace_status() != message::eParkspace_locked )
|
|
|
{
|
|
|
t_error.set_error_code(PARKSPACE_ALLOCATOR_CONFIRM_ALLOC_ERROR);
|
|
|
t_error.set_error_level(message::Error_level::MINOR_ERROR);
|
|
@@ -1762,6 +1745,8 @@ Error_manager Parkspace_manager::confirm_alloc_function(message::Parkspace_info
|
|
|
{
|
|
|
//根据车位信息定位待确认占用车位
|
|
|
Error_manager error;
|
|
|
+ //记录当前传入车辆的状态 为后续回退操作服务
|
|
|
+ message::Parkspace_status t_parkingspace_status=space_info.parkingspace_status();
|
|
|
if (!space_info.has_car_info())
|
|
|
{
|
|
|
LOG(WARNING) << "传入待确认车位无车辆信息";
|
|
@@ -1801,8 +1786,27 @@ Error_manager Parkspace_manager::confirm_alloc_function(message::Parkspace_info
|
|
|
error = m_parkspace_operating_function.update_vehicle_with_parkspace(t_confirm_space, t_vehicle_status);
|
|
|
if (error != SUCCESS)
|
|
|
{
|
|
|
- LOG(ERROR) << "确认分配 更新数据库车辆数据失败 " << error.to_string();
|
|
|
- return error;
|
|
|
+ //此处操作不成功就需要回退 因为前一步骤更改了车位表信息导致二表不统一
|
|
|
+ LOG(ERROR) << "确认分配 更新数据库车辆数据失败 进行回退---" << error.to_string();
|
|
|
+ t_confirm_space.set_parkingspace_status(t_parkingspace_status);
|
|
|
+ t_confirm_space.set_parkspace_status_target(t_parkingspace_status);
|
|
|
+ for (int i = 1; i < 4; ++i)
|
|
|
+ {
|
|
|
+ Error_manager e = m_parkspace_operating_function.update_parkspace_data(t_confirm_space);
|
|
|
+ if (e != SUCCESS)
|
|
|
+ {
|
|
|
+ LOG(INFO) << "回退第"<<i<<"次 失败! " << e.to_string();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG(INFO) << " 回退成功! ";
|
|
|
+ return e;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果流程进行到这里说明回退三次都失败 需要报三级故障
|
|
|
+ return Error_manager(Error_code::DB_UPDATE_FAILED, Error_level::MAJOR_ERROR,
|
|
|
+ " update database error ");
|
|
|
}
|
|
|
error.set_error_code(SUCCESS);
|
|
|
error.set_error_level_location(Error_level::NEGLIGIBLE_ERROR);
|
|
@@ -1853,16 +1857,18 @@ Error_manager Parkspace_manager::release_parkspace_function(message::Parkspace_i
|
|
|
release_parkspace_info.CopyFrom(target_space_info);
|
|
|
if ( !PLAN )
|
|
|
{
|
|
|
- if ( release_parkspace_info.parkingspace_status() != message::eParkspace_locked )
|
|
|
+ if ( release_parkspace_info.parkingspace_status() == message::eParkspace_occupied ||
|
|
|
+ release_parkspace_info.parkingspace_status() == message::eParkspace_locked )
|
|
|
{
|
|
|
- LOG(ERROR) << "释放车位校验状态失败!" ;
|
|
|
- return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
- " 释放车位校验状态失败! ");
|
|
|
+
|
|
|
+ release_parkspace_info.set_parkingspace_status(message::eParkspace_empty);
|
|
|
+ release_parkspace_info.set_parkspace_status_target(message::eParkspace_empty);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- release_parkspace_info.set_parkingspace_status(message::eParkspace_empty);
|
|
|
- release_parkspace_info.set_parkspace_status_target(message::eParkspace_empty);
|
|
|
+ LOG(ERROR) << "释放车位校验状态失败!" ;
|
|
|
+ return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
|
|
|
+ " 释放车位校验状态失败! ");
|
|
|
}
|
|
|
}
|
|
|
if(release_parkspace_info.parkspace_status_target() == message::eParkspace_empty && release_parkspace_info.has_car_info())
|
|
@@ -1880,7 +1886,7 @@ Error_manager Parkspace_manager::release_parkspace_function(message::Parkspace_i
|
|
|
{
|
|
|
error.set_error_code(SUCCESS);
|
|
|
error.set_error_level_location(Error_level::NORMAL);
|
|
|
- LOG(INFO) << "方案A --- 第:" << release_parkspace_info.parkingspace_index_id() << "号位 车辆: " << release_parkspace_info.car_info().license()
|
|
|
+ LOG(INFO) << "不更新车辆表释放 --- 第:" << release_parkspace_info.parkingspace_index_id() << "号位 车辆: " << release_parkspace_info.car_info().license()
|
|
|
<< " 释放成功";
|
|
|
}
|
|
|
else
|
|
@@ -1904,7 +1910,7 @@ Error_manager Parkspace_manager::release_parkspace_function(message::Parkspace_i
|
|
|
}
|
|
|
error.set_error_code(SUCCESS);
|
|
|
error.set_error_level_location(Error_level::NORMAL);
|
|
|
- LOG(INFO) << "方案B --- 第:" << release_parkspace_info.parkingspace_index_id() << "号位 车辆: " << release_parkspace_info.car_info().license()
|
|
|
+ LOG(INFO) << "更新车辆表--- 第:" << release_parkspace_info.parkingspace_index_id() << "号位 车辆: " << release_parkspace_info.car_info().license()
|
|
|
<< " 释放成功";
|
|
|
|
|
|
time_t tt = time(NULL);
|