Quellcode durchsuchen

check car existence before alloc.
fixed command info assign bug

youchen vor 4 Jahren
Ursprung
Commit
4fa6b6ee66

+ 14 - 14
CMakeLists.txt

@@ -61,20 +61,20 @@ target_link_libraries(parkspace_test
         /usr/local/lib/libgflags.a
         libmysqlcppconn.so
         )
-add_executable(parkspace_client
-        ./test/parkspace_client.cpp
-        ${error_src}
-        ${message_src}
-        ${TOOL_SRC}
-        ${COMMUNICATION_SRC}
-        )
-target_link_libraries(parkspace_client
-        nnxx
-        nanomsg
-        ${PROTOBUF_LIBRARIES}
-        /usr/local/lib/libglog.a
-        /usr/local/lib/libgflags.a
-        )
+# add_executable(parkspace_client
+#         ./test/parkspace_client.cpp
+#         ${error_src}
+#         ${message_src}
+#         ${TOOL_SRC}
+#         ${COMMUNICATION_SRC}
+#         )
+# target_link_libraries(parkspace_client
+#         nnxx
+#         nanomsg
+#         ${PROTOBUF_LIBRARIES}
+#         /usr/local/lib/libglog.a
+#         /usr/local/lib/libgflags.a
+#         )
 
 # db test
 add_executable(db_test

+ 1 - 0
error_code/error_code.h

@@ -298,6 +298,7 @@ enum Error_code
     PARKSPACE_ALLOCATOR_FORCE_UPDATE_FAILED,        //手动更新失败,未找到匹配车位
     PARKSPACE_ALLOCATOR_PARAM_ERROR,                //传入参数错误,内部无车辆信息
     PARKSPACE_ALLOCATOR_CONFIRM_ALLOC_ERROR,        //确认分配车位错误
+    PARKSPACE_ALLOCATOR_CAR_ALREADY_EXIST,          //车辆已存在
 
     // 数据库操作
     DB_ERROR_BASE                                   = 0x20020000,

+ 6 - 6
message/message_base.pb.cc

@@ -410,15 +410,15 @@ void AddDescriptorsImpl() {
       "\010*#\n\005Event\022\014\n\010eStoring\020\001\022\014\n\010ePicking\020\002*e"
       "\n\013Error_level\022\n\n\006NORMAL\020\000\022\024\n\020NEGLIGIBLE_"
       "ERROR\020\001\022\017\n\013MINOR_ERROR\020\002\022\017\n\013MAJOR_ERROR\020"
-      "\003\022\022\n\016CRITICAL_ERROR\020\004*\210\001\n\020Parkspace_stat"
+      "\003\022\022\n\016CRITICAL_ERROR\020\004*\207\001\n\020Parkspace_stat"
       "us\022\024\n\020eParkspace_empty\020\000\022\027\n\023eParkspace_o"
-      "ccupied\020\001\022\030\n\024eParkspace_reserverd\020\002\022\025\n\021e"
-      "Parkspace_locked\020\003\022\024\n\020eParkspace_error\020\004"
-      "*(\n\tDirection\022\014\n\010eForward\020\001\022\r\n\teBackward"
-      "\020\002"
+      "ccupied\020\001\022\027\n\023eParkspace_reserved\020\002\022\025\n\021eP"
+      "arkspace_locked\020\003\022\024\n\020eParkspace_error\020\004*"
+      "(\n\tDirection\022\014\n\010eForward\020\001\022\r\n\teBackward\020"
+      "\002"
   };
   ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
-      descriptor, 2282);
+      descriptor, 2281);
   ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
     "message_base.proto", &protobuf_RegisterTypes);
 }

+ 1 - 1
message/message_base.pb.h

@@ -201,7 +201,7 @@ inline bool Error_level_Parse(
 enum Parkspace_status {
   eParkspace_empty = 0,
   eParkspace_occupied = 1,
-  eParkspace_reserverd = 2,
+  eParkspace_reserved = 2,
   eParkspace_locked = 3,
   eParkspace_error = 4
 };

+ 1 - 1
message/message_base.proto

@@ -141,7 +141,7 @@ enum Parkspace_status
 {
     eParkspace_empty            = 0;         //空闲,可分配
     eParkspace_occupied         = 1;         //被占用,不可分配
-    eParkspace_reserverd        = 2;         //被预约,预约车辆可分配
+    eParkspace_reserved        = 2;         //被预约,预约车辆可分配
     eParkspace_locked           = 3;         //临时锁定,不可分配
     eParkspace_error            = 4;         //车位机械结构或硬件故障   
 }

+ 30 - 7
parkspace_allocation/parkspace_allocator.cpp

@@ -2,7 +2,7 @@
  * @Description: 车位分配算法模块,使用单例模式,接收外部请求并通过调用通信块接口发送反馈
  * @Author: yct
  * @Date: 2020-07-10 11:02:40
- * @LastEditTime: 2020-08-05 17:10:58
+ * @LastEditTime: 2020-08-06 10:32:28
  * @LastEditors: yct
  */ 
 
@@ -177,6 +177,23 @@ Parkspace_allocator::parkspace_allocator_status Parkspace_allocator::get_parkspa
 	return m_current_status;
 }
 
+// 检查车辆是否已存在,通常分配前调用
+bool Parkspace_allocator::check_car_existence(std::string license, message::Parkspace_allocation_status_msg status_msg)
+{
+    for (size_t i = 0; i < status_msg.parkspace_info_size(); i++)
+    {
+        // 找到相同号牌,且车位状态锁定或占用
+        if(status_msg.parkspace_info(i).has_car_info() 
+            && status_msg.parkspace_info(i).car_info().license() == license
+            && (status_msg.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_locked || 
+            status_msg.parkspace_info(i).parkspace_status() == message::Parkspace_status::eParkspace_occupied))
+        {   
+            return true;
+        }
+    }
+    return false;
+}
+
 //分配车位线程函数
 void Parkspace_allocator::execute_for_allocate(message::Car_info car_info, int terminal_id, message::Command_info command_info)
 {
@@ -200,8 +217,14 @@ void Parkspace_allocator::execute_for_allocate(message::Car_info car_info, int t
         t_error.set_error_level(message::Error_level::MAJOR_ERROR);
         LOG(ERROR) << "无车位";
     }
-    else
+    else if(check_car_existence(car_info.license(), t_current_parkspace_status))
     {
+        t_error.set_error_code(PARKSPACE_ALLOCATOR_CAR_ALREADY_EXIST);
+        t_error.set_error_level(message::Error_level::MAJOR_ERROR);
+        LOG(ERROR) << "车辆已存在";
+    }
+    else
+    {   
         for (size_t i = 0; i < t_current_parkspace_status.parkspace_info_size(); i++)
         {
             // 找到高于车高且空闲车位,则分配
@@ -246,7 +269,7 @@ void Parkspace_allocator::execute_for_allocate(message::Car_info car_info, int t
         }
     }
     response_msg.mutable_base_info()->CopyFrom(t_response_header);
-    response_msg.CopyFrom(command_info);
+    response_msg.mutable_command_info()->CopyFrom(command_info);
     response_msg.mutable_error_manager()->CopyFrom(t_error);
     response_msg.mutable_allocated_space_info()->CopyFrom(t_allocated_space);
     Communication_message response=Communication_message();
@@ -306,7 +329,7 @@ void Parkspace_allocator::execute_for_search(message::Car_info car_info, message
         }
     }
     response_msg.mutable_base_info()->CopyFrom(t_response_header);
-    response_msg.CopyFrom(command_info);
+    response_msg.mutable_command_info()->CopyFrom(command_info);
     response_msg.mutable_error_manager()->CopyFrom(t_error);
     response_msg.mutable_car_position()->CopyFrom(t_car_position);
     Communication_message response=Communication_message();
@@ -415,7 +438,7 @@ void Parkspace_allocator::execute_for_release(message::Parkspace_info space_info
         }
     }
     response_msg.mutable_base_info()->CopyFrom(t_response_header);
-    response_msg.CopyFrom(command_info);
+    response_msg.mutable_command_info()->CopyFrom(command_info);
     response_msg.mutable_error_manager()->CopyFrom(t_error);
     response_msg.mutable_release_space_info()->CopyFrom(t_release_space);
     Communication_message response=Communication_message();
@@ -479,7 +502,7 @@ void Parkspace_allocator::execute_for_force_update(message::Parkspace_info space
         }
     }
     response_msg.mutable_base_info()->CopyFrom(t_response_header);
-    response_msg.CopyFrom(command_info);
+    response_msg.mutable_command_info()->CopyFrom(command_info);
     response_msg.mutable_error_manager()->CopyFrom(t_error);
     response_msg.mutable_update_space_info()->CopyFrom(t_update_space);
     Communication_message response=Communication_message();
@@ -575,7 +598,7 @@ void Parkspace_allocator::execute_for_confirm_alloc(message::Parkspace_info spac
         }
     }
     response_msg.mutable_base_info()->CopyFrom(t_response_header);
-    response_msg.CopyFrom(command_info);
+    response_msg.mutable_command_info()->CopyFrom(command_info);
     response_msg.mutable_error_manager()->CopyFrom(t_error);
     response_msg.mutable_confirm_alloc_space_info()->CopyFrom(t_confirm_space);
     Communication_message response=Communication_message();

+ 4 - 1
parkspace_allocation/parkspace_allocator.h

@@ -2,7 +2,7 @@
  * @Description: 车位分配算法模块,使用单例模式,接收外部请求并通过调用通信块接口发送反馈
  * @Author: yct
  * @Date: 2020-07-10 09:25:56
- * @LastEditTime: 2020-08-05 17:02:02
+ * @LastEditTime: 2020-08-06 10:18:56
  * @LastEditors: yct
  */ 
 
@@ -53,6 +53,9 @@ public://API functions
     // 获取模块状态
     parkspace_allocator_status get_parkspace_allocator_status();
 
+    // 检查车辆是否已存在,通常分配前调用
+    bool check_car_existence(std::string license, message::Parkspace_allocation_status_msg status_msg);
+
 public://execute_msg创建各线程进行处理
 	//分配车位线程函数
     void execute_for_allocate(message::Car_info car_info, int terminal_id, message::Command_info command_info);