Przeglądaj źródła

增加流程日志文件记录功能

zx 4 lat temu
rodzic
commit
5cece55163

+ 1 - 1
cmake-build-release/setting/system_setting.prototxt

@@ -1,4 +1,4 @@
-bind_ip:"192.168.2.183"
+bind_ip:"192.168.2.185"
 bind_port:30000
 entrance_num:6
 export_num:6

+ 1 - 0
main.cpp

@@ -30,6 +30,7 @@ Error_manager init_communicators();
 int main(int argc,char* argv[])
 {
     init_glog();
+
     Error_manager code=init_communicators();
 	if(code!=SUCCESS)
     {

Plik diff jest za duży
+ 2826 - 0
message/log_process.pb.cc


Plik diff jest za duży
+ 3369 - 0
message/log_process.pb.h


+ 69 - 0
message/log_process.proto

@@ -0,0 +1,69 @@
+syntax = "proto2";
+package message;
+import "message_base.proto";
+import "parkspace_allocation_message.proto";    //数据库消息
+import "measure_message.proto";                 //测量消息
+import "dispatch_message.proto";                //调度消息
+import "central_control_message.proto";         //手动操作消息
+
+
+//车位数据节点日志
+message Parkspace_data
+{
+    optional    Parkspace_allocation_request_msg    alloc_request=1;
+    optional    Parkspace_allocation_response_msg   alloc_response=2;
+    optional    Parkspace_search_request_msg        search_request=3;
+    optional    Parkspace_search_response_msg       search_response=4;
+
+    optional    Parkspace_release_request_msg       release_request=5;
+    optional    Parkspace_release_response_msg      release_response=6;
+
+    optional    Parkspace_confirm_alloc_request_msg     confirm_request=7;
+    optional    Parkspace_confirm_alloc_response_msg    confirm_response=8;
+    optional    string                      description=9;
+}
+
+message Measure_data
+{
+    optional    Measure_request_msg                 request=1;
+    optional    Measure_response_msg                response=2;
+    optional    string                              description=3;
+}
+
+message Dispatch_data
+{
+    optional    Dispatch_request_msg                request=1;
+    optional    Dispatch_response_msg               response=2;
+    optional    string                              description=3;
+}
+
+
+message Manual_operation_data
+{
+    required    Process_manual_operation_msg        manual_operation=1;
+    optional    string                              description=2;
+}
+
+message Log_data
+{
+    enum Severity
+    {
+        INFO=0;
+        WARNING=1;
+        ERROR=2;
+    }
+    required Severity      log_severity=1;
+    oneof    data               {
+            string          str_log=2;
+            Parkspace_data  parkspace_log=3;
+            Measure_data    measure_log=4;
+            Dispatch_data   dispatch_log=5;
+            Manual_operation_data   manual_operator_log=6;
+    }
+}
+
+message Process_log
+{
+    required Process_type       process_type=1;
+    repeated Log_data           log_data=2;
+}

+ 1 - 0
proto.sh

@@ -5,6 +5,7 @@ protoc -I=./message terminal_message.proto --cpp_out=./message
 protoc -I=./message process_message.proto --cpp_out=./message
 protoc -I=./message dispatch_message.proto --cpp_out=./message
 protoc -I=./message central_control_message.proto --cpp_out=./message
+protoc -I=./message log_process.proto --cpp_out=./message
 
 protoc -I=./communication communication.proto --cpp_out=./communication
 protoc -I=./system system_setting.proto --cpp_out=./system

+ 52 - 1
system/PickupProcessTask.cpp

@@ -14,12 +14,17 @@
 PickupProcessTask::PickupProcessTask(unsigned int terminal_id,message::Car_info car_info)
        :Process_task(terminal_id,car_info)
 {
+    m_process_log.set_process_type(message::ePicking);
 }
 PickupProcessTask::~PickupProcessTask()
 {
 }
 Error_manager PickupProcessTask::init_task()
 {
+    char log[255]={0};
+    sprintf(log,"来自终端 %d 的取车指令:\n %s",m_terminor_id,m_car_info.DebugString().c_str());
+    ALOG(INFO)<<log;
+
     reset_msg();
 
     //设置状态消息,基本信息
@@ -108,6 +113,12 @@ Error_manager PickupProcessTask::search_space_step()
 
     code = Parkspace_excutor::get_instance_pointer()->search_request(m_search_request_msg,
             m_search_response_msg,m_cancel_condition);
+
+    message::Parkspace_data search_data;
+    search_data.mutable_search_request()->CopyFrom(m_search_request_msg);
+    search_data.mutable_search_response()->CopyFrom(m_search_response_msg);
+    ALOG(INFO)<<search_data;
+
     return code;
 }
 
@@ -116,6 +127,7 @@ Error_manager PickupProcessTask::search_space_step()
  */
 Error_manager PickupProcessTask::back_search_space_step()
 {
+    ALOG(INFO)<<"回退查询车位";
     return SUCCESS;
 }
 
@@ -157,6 +169,7 @@ Error_manager PickupProcessTask::next_step()
             LOG(ERROR)<<"-------  取  ------- 下一步失败,当前步骤未知: "<<message::Step_type_Name(m_current_step_type);
             break;
     }
+    ALOG(INFO)<<"进入下一步:"<<message::Step_type_Name(m_current_step_type);
     return SUCCESS;
 }
 
@@ -182,6 +195,8 @@ void PickupProcessTask::Main()
 
             LOG_IF(ERROR, code != SUCCESS) << "-------  取  -------查询失败,取车终端:"<<m_terminor_id
                                            <<", 车牌号:"<<m_car_info.license()<<code.get_error_description();
+            ALOG_IF(ERROR, code != SUCCESS) << "-------  取  -------查询失败,取车终端:"<<m_terminor_id
+                                           <<", 车牌号:"<<m_car_info.license()<<code.get_error_description();
         }
 
         if(m_current_step_type== message::eDispatch_step)
@@ -197,6 +212,13 @@ void PickupProcessTask::Main()
                                            <<", 车牌号:"<<m_car_info.license()
                                            <<", 库内车牌号:"<<m_search_response_msg.car_position().car_info().license()
                                            <<code.get_error_description();
+            ALOG_IF(ERROR, code != SUCCESS) << "-------  取  -------取车调度失败,取车终端:"<<m_terminor_id
+                                           <<", 车位id:"<<m_search_response_msg.car_position().parkspace_id()
+                                           <<", 车位楼层:"<<m_search_response_msg.car_position().floor()
+                                           <<", 车位序号:"<<m_search_response_msg.car_position().index()
+                                           <<", 车牌号:"<<m_car_info.license()
+                                           <<", 库内车牌号:"<<m_search_response_msg.car_position().car_info().license()
+                                           <<code.get_error_description();
         }
         if(m_current_step_type== message::eWait_step)
         {
@@ -205,6 +227,8 @@ void PickupProcessTask::Main()
             code!=SUCCESS?updata_step_statu(message::eError):updata_step_statu(message::eFinished);
             LOG_IF(ERROR, code != SUCCESS) << "-------  取  -------等待车辆离开失败,取车终端:"<<m_terminor_id
                                            <<", 车牌号:"<<m_car_info.license();
+            ALOG_IF(ERROR, code != SUCCESS) << "-------  取  -------等待车辆离开失败,取车终端:"<<m_terminor_id
+                                           <<", 车牌号:"<<m_car_info.license();
         }
         if(m_current_step_type== message::eRelease_step)
         {
@@ -216,6 +240,7 @@ void PickupProcessTask::Main()
             {
                 //提升错误等级为三级
                 LOG(ERROR)<<"-------  取  -------  释放车位失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
+                ALOG(ERROR)<<"-------  取  -------  释放车位失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
                 Exception_solver::get_instance_pointer()->solve_exception(Error_manager(code.get_error_code(),MAJOR_ERROR,code.get_error_description()),this);
                 continue;
             }
@@ -238,6 +263,7 @@ void PickupProcessTask::Main()
             {
                 //提升错误等级为四级
                 LOG(ERROR)<<"-------  取  -------  回退等待失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
+                ALOG(ERROR)<<"-------  取  -------  回退等待失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
                 Exception_solver::get_instance_pointer()->solve_exception(code,this);
                 continue;
             }
@@ -251,6 +277,7 @@ void PickupProcessTask::Main()
             {
                 //提升错误等级为四级
                 LOG(ERROR)<<"-------  取  -------  回退调度失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
+                ALOG(ERROR)<<"-------  取  -------  回退调度失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
                 Exception_solver::get_instance_pointer()->solve_exception(code,this);
                 continue;
             }
@@ -264,6 +291,7 @@ void PickupProcessTask::Main()
             {
                 //提升错误等级为四级
                 LOG(ERROR)<<"-------  取  -------  回退调度失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
+                ALOG(ERROR)<<"-------  取  -------  回退调度失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
                 Exception_solver::get_instance_pointer()->solve_exception(code,this);
                 continue;
             }
@@ -283,6 +311,8 @@ void PickupProcessTask::Main()
     if(m_cancel_condition.wait_for_millisecond(1)==true) {
         LOG(ERROR) << "-------  取  -------取车任务被强制取消,车牌号:" << m_car_info.license()
                    << ",  终端号:" << m_terminor_id;
+        ALOG(ERROR) << "-------  取  -------取车任务被强制取消,车牌号:" << m_car_info.license()
+                   << ",  终端号:" << m_terminor_id;
         usleep(1000*500);
         return ;
     }
@@ -293,6 +323,8 @@ void PickupProcessTask::Main()
         usleep(1000*500);
         LOG(ERROR)<<"-------  取  -------异常取车,回退结束"<<"车牌号:"<<m_car_info.license()
                   <<",xxxxxxxxxxxxxx  终端:"<<m_terminor_id<<"  xxxxxxxxxxxxxx";
+        ALOG(ERROR)<<"-------  取  -------异常取车,回退结束"<<"车牌号:"<<m_car_info.license()
+                  <<",xxxxxxxxxxxxxx  终端:"<<m_terminor_id<<"  xxxxxxxxxxxxxx";
     }
     if(m_current_step_type== message::eComplete)
     {
@@ -300,8 +332,10 @@ void PickupProcessTask::Main()
         usleep(1000*500);
         LOG(INFO)<<"-------  取  -------取车结束,"<<"车牌号:"<<m_car_info.license()
                  <<",--------------  终端:"<<m_terminor_id<<"  --------------";
+        ALOG(INFO)<<"-------  取  -------取车结束,"<<"车牌号:"<<m_car_info.license()
+                 <<",--------------  终端:"<<m_terminor_id<<"  --------------";
     }
-
+    return Process_task::Main();
 }
 
 /*
@@ -335,6 +369,11 @@ Error_manager PickupProcessTask::dispatch_step()
     m_dispatch_request_msg.set_terminal_id(m_terminor_id);
 
     code=Dispatch_excutor::get_instance_pointer()->dispatch_request(m_dispatch_request_msg,m_dispatch_response_msg,m_cancel_condition);
+    message::Dispatch_data dispatch_data;
+    dispatch_data.mutable_request()->CopyFrom(m_dispatch_request_msg);
+    dispatch_data.mutable_response()->CopyFrom(m_dispatch_response_msg);
+    ALOG(INFO)<<dispatch_data;
+
     if(code!=SUCCESS)
         return code;
 
@@ -357,6 +396,7 @@ Error_manager PickupProcessTask::back_dispatch_step()
     int k=rand()%10;
     if(k==0)
         return Error_manager(ERROR,MINOR_ERROR,"手动制造错误");*/
+    ALOG(INFO)<<"回退调度";
     return SUCCESS;
 }
 
@@ -369,6 +409,7 @@ Error_manager PickupProcessTask::wait_for_leave_step()
     /*int k=rand()%10;
     if(k==0)
         return Error_manager(ERROR,MINOR_ERROR,"手动制造错误");*/
+    ALOG(INFO)<<"等待离开";
     return SUCCESS;
 }
 
@@ -413,6 +454,11 @@ Error_manager PickupProcessTask::release_space_step()
     m_release_request_msg.mutable_release_space_info()->CopyFrom(space_info);
 
     code=Parkspace_excutor::get_instance_pointer()->release_request(m_release_request_msg,m_release_response_msg,m_cancel_condition);
+    message::Parkspace_data release_data;
+    release_data.mutable_release_request()->CopyFrom(m_release_request_msg);
+    release_data.mutable_release_response()->CopyFrom(m_release_response_msg);
+    ALOG(INFO)<<release_data;
+
     if(code!=SUCCESS)
         return code;
 
@@ -439,6 +485,11 @@ void PickupProcessTask::publish_step_status() {
      */
 void PickupProcessTask::updata_step_statu(message::Step_statu statu)
 {
+    if(m_current_step_statu!=statu)
+    {
+        ALOG(INFO) << "切换当前步骤状态:" << message::Step_statu_Name(m_current_step_statu)
+                   << " -->" << message::Step_statu_Name(statu);
+    }
     m_current_step_statu=statu;
     std::lock_guard<std::mutex>         lock(m_process_msg_lock);
     switch (m_current_step_type) {

+ 83 - 10
system/StoreProcessTask.cpp

@@ -2,6 +2,7 @@
 // Created by zx on 2020/7/7.
 //
 
+#include <glog/logging.h>
 #include <parkspace_excutor.h>
 #include <dispatch_message.pb.h>
 #include "dispatch_excutor.h"
@@ -15,6 +16,7 @@
 StoreProcessTask::StoreProcessTask(unsigned int terminor_id,message::Car_info car_info)
     :Process_task(terminor_id,car_info)
 {
+    m_process_log.set_process_type(message::eStoring);
 }
 
 StoreProcessTask::~StoreProcessTask()
@@ -23,6 +25,11 @@ StoreProcessTask::~StoreProcessTask()
 
 Error_manager StoreProcessTask::init_task(message::Locate_information locate_info)
 {
+
+    char log[255]={0};
+    sprintf(log,"来自终端 %d 的停车指令:\n %s",m_terminor_id,locate_info.DebugString().c_str());
+    ALOG(INFO)<<log;
+
     reset_msg();
     m_locate_info=locate_info;
 
@@ -65,6 +72,11 @@ Error_manager StoreProcessTask::locate_step() {
 
     code=Measure_excutor::get_instance_pointer()->locate_request(m_measure_request_msg,
             m_measure_response_msg,m_cancel_condition);
+    message::Measure_data measure_data;
+    measure_data.mutable_request()->CopyFrom(m_measure_request_msg);
+    measure_data.mutable_response()->CopyFrom(m_measure_response_msg);
+    ALOG(INFO)<<measure_data;
+
     if(code!=SUCCESS)
         return code;
 
@@ -86,6 +98,7 @@ Error_manager StoreProcessTask::back_locate_step()
 {
     m_measure_request_msg=message::Measure_request_msg();
     m_measure_response_msg=message::Measure_response_msg();
+    ALOG(INFO)<<"回退测量";
     return SUCCESS;
 }
 
@@ -101,6 +114,7 @@ Error_manager StoreProcessTask::compare_step()
  */
 Error_manager StoreProcessTask::back_compare_step()
 {
+    ALOG(INFO)<<" 回退compare";
     return SUCCESS;
 }
 
@@ -140,6 +154,12 @@ Error_manager StoreProcessTask::dispatch_step()
 
     code=Dispatch_excutor::get_instance_pointer()->dispatch_request(m_dispatch_request_msg,
             m_dispatch_response_msg,m_cancel_condition);
+    //记录
+    message::Dispatch_data dispatch_data;
+    dispatch_data.mutable_request()->CopyFrom(m_dispatch_request_msg);
+    dispatch_data.mutable_response()->CopyFrom(m_dispatch_response_msg);
+    ALOG(INFO)<<dispatch_data;
+
     if(code!=SUCCESS)
         return code;
 
@@ -163,6 +183,8 @@ Error_manager StoreProcessTask::back_dispatch_step()
     m_dispatch_request_msg=message::Dispatch_request_msg();
     m_dispatch_response_msg=message::Dispatch_response_msg();
 
+    ALOG(INFO)<<" 回退调度 ";
+
     return SUCCESS;
 }
 
@@ -203,6 +225,7 @@ Error_manager StoreProcessTask::alloc_space_step()
      * 检查车位管理模块是否正常
      */
     Error_manager code=Parkspace_excutor::get_instance_pointer()->check_statu();
+
     if(code!=SUCCESS)
     {
         return code;
@@ -223,6 +246,12 @@ Error_manager StoreProcessTask::alloc_space_step()
     code=Parkspace_excutor::get_instance_pointer()->alloc_request(m_alloc_request_msg,
             m_parcspace_alloc_response_msg,m_cancel_condition);
 
+    //记录日志
+    message::Parkspace_data parkspace_data;
+    parkspace_data.mutable_alloc_request()->CopyFrom(m_alloc_request_msg);
+    parkspace_data.mutable_alloc_response()->CopyFrom(m_parcspace_alloc_response_msg);
+    ALOG(INFO)<<parkspace_data;
+
     if(code!=SUCCESS)
     {
         return code;
@@ -272,6 +301,12 @@ Error_manager StoreProcessTask::confirm_space_step()
 
     message::Parkspace_confirm_alloc_response_msg confirm_response;
     code=Parkspace_excutor::get_instance_pointer()->confirm_request(request,confirm_response,m_cancel_condition);
+    //记录日志
+    message::Parkspace_data confirm_data;
+    confirm_data.mutable_confirm_request()->CopyFrom(request);
+    confirm_data.mutable_confirm_response()->CopyFrom(confirm_response);
+    ALOG(INFO)<<confirm_data;
+
     if(code!=SUCCESS)
         return code;
 
@@ -331,6 +366,14 @@ Error_manager StoreProcessTask::back_alloc_space_step()
 
     message::Parkspace_release_response_msg release_response;
     code=Parkspace_excutor::get_instance_pointer()->release_request(request,release_response,m_cancel_condition);
+
+    //记录
+    message::Parkspace_data release_data;
+    release_data.mutable_release_request()->CopyFrom(request);
+    release_data.mutable_release_response()->CopyFrom(release_response);
+    release_data.set_description("回退分配步骤,释放车位");
+    ALOG(INFO)<<release_data;
+
     if(code!=SUCCESS)
         return Error_manager(code.get_error_code(),MAJOR_ERROR,code.get_error_description());
 
@@ -394,6 +437,7 @@ Error_manager StoreProcessTask::next_step()
         case message::eBackComplete:
             break;
     }
+    ALOG(INFO)<<"进入下一步:"<<message::Step_type_Name(m_current_step_type);
     return SUCCESS;
 }
 
@@ -413,8 +457,12 @@ void StoreProcessTask::Main()
         //分配车位
         if(m_current_step_type == message::eAlloc_step)
         {
+
+            //跟新状态
             updata_step_statu(message::eWorking);
+            //执行步骤
             code=alloc_space_step();
+
             //发送反馈
             message::Error_manager error_msg;
             error_msg.set_error_code(code.get_error_code());
@@ -423,6 +471,7 @@ void StoreProcessTask::Main()
             Communication_message msg;
             msg.reset(m_command_response_msg.base_info(),m_command_response_msg.SerializeAsString());
             Message_communicator::get_instance_pointer()->send_msg(&msg);
+            ALOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 分配失败:" <<m_car_info.license()<< code.get_error_description();
             LOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 分配失败:" <<m_car_info.license()<< code.get_error_description();
         }
 
@@ -433,6 +482,7 @@ void StoreProcessTask::Main()
             updata_step_statu(message::eWorking);
             code = locate_step();
             usleep(1000 * 500 );
+            ALOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 测量失败:" <<m_car_info.license()<< code.get_error_description();
             LOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 测量失败:" <<m_car_info.license()<< code.get_error_description();
         }
         if(m_current_step_type== message::eCompare_step)
@@ -440,6 +490,7 @@ void StoreProcessTask::Main()
             updata_step_statu(message::eWorking);
             code=compare_step();
             usleep(500*1000);
+            ALOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 检验失败:"<<m_car_info.license() << code.get_error_description();
             LOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 检验失败:"<<m_car_info.license() << code.get_error_description();
         }
         //调度
@@ -449,6 +500,7 @@ void StoreProcessTask::Main()
             updata_step_statu(message::eWorking);
             code = dispatch_step();
             usleep(1000 * 500 );
+            ALOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 调度失败:"<<m_car_info.license() << code.get_error_description();
             LOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 调度失败:"<<m_car_info.license() << code.get_error_description();
         }
         //占据车位
@@ -457,10 +509,14 @@ void StoreProcessTask::Main()
             updata_step_statu(message::eWorking);
             code = confirm_space_step();
             usleep(1000 * 200);
-            LOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 占据车位失败,终端号:" << m_terminor_id << "停车流程:" << code.get_error_description() <<
+            ALOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 占据车位失败,终端号:" << m_terminor_id << "停车流程:" << code.get_error_description() <<
                                            " 车位id :"
                                            << m_parcspace_alloc_response_msg.allocated_space_info().parkspace_id()
                                            << ",车牌:" << m_car_info.license()<<code.to_string();
+            LOG_IF(WARNING, code != SUCCESS) << "------  停  ------- 占据车位失败,终端号:" << m_terminor_id << "停车流程:" << code.get_error_description() <<
+                                              " 车位id :"
+                                              << m_parcspace_alloc_response_msg.allocated_space_info().parkspace_id()
+                                              << ",车牌:" << m_car_info.license()<<code.to_string();
         }
         //完成,退出循环
         if (m_current_step_type ==  message::eComplete)
@@ -484,8 +540,10 @@ void StoreProcessTask::Main()
             updata_step_statu(message::eWorking);
             code=back_dispatch_step();
             usleep(1000*500);
-            LOG_IF(WARNING,code!=SUCCESS)<<" ------  停  ------- 回退调度失败 ------进入异常处理,  车牌号:"
+            ALOG_IF(WARNING,code!=SUCCESS)<<" ------  停  ------- 回退调度失败 ------进入异常处理,  车牌号:"
                                             <<m_car_info.license();
+            LOG_IF(WARNING,code!=SUCCESS)<<" ------  停  ------- 回退调度失败 ------进入异常处理,  车牌号:"
+                                          <<m_car_info.license();
         }
 
         if(m_current_step_type== message::eBack_compare_step)
@@ -493,11 +551,8 @@ void StoreProcessTask::Main()
             updata_step_statu(message::eWorking);
             code=back_compare_step();
             usleep(1000*200);
-
+            ALOG_IF(WARNING,code!=SUCCESS)<<" ------  停  ------- 回退对比失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
             LOG_IF(WARNING,code!=SUCCESS)<<" ------  停  ------- 回退对比失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
-
-            LOG(WARNING)<<" 手动处理 结果对比,  继续 ..........车牌:"<<m_car_info.license();
-
         }
 
         if(m_current_step_type== message::eBackMeasure_step)
@@ -506,8 +561,10 @@ void StoreProcessTask::Main()
             code=back_locate_step();
             usleep(1000*200);
 
-            LOG_IF(WARNING,code!=SUCCESS)
+            ALOG_IF(WARNING,code!=SUCCESS)
                 <<" ------  停  ------- 回退测量失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
+            LOG_IF(WARNING,code!=SUCCESS)
+                    <<" ------  停  ------- 回退测量失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
 
         }
         if(m_current_step_type== message::eBackAlloc_step)
@@ -515,8 +572,10 @@ void StoreProcessTask::Main()
             updata_step_statu(message::eWorking);
             code=back_alloc_space_step();
 
-            LOG_IF(WARNING,code!=SUCCESS)
+            ALOG_IF(WARNING,code!=SUCCESS)
                 <<" ------  停  ------- 回退分配车位失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
+            LOG_IF(WARNING,code!=SUCCESS)
+                    <<" ------  停  ------- 回退分配车位失败 ------进入异常处理,  车牌号:"<<m_car_info.license();
 
         }
         if(m_current_step_type== message::eBackComplete)
@@ -549,8 +608,10 @@ void StoreProcessTask::Main()
     publish_step_status();
 
     if(m_cancel_condition.wait_for_millisecond(1)==true) {
-        LOG(ERROR) << "------  停  ------- 停车任务被强制取消,车牌号:" << m_car_info.license()
+        ALOG(ERROR) << "------  停  ------- 停车任务被强制取消,车牌号:" << m_car_info.license()
                    << ",  终端号:" << m_terminor_id;
+        LOG(ERROR) << "------  停  ------- 停车任务被强制取消,车牌号:" << m_car_info.license()
+                              << ",  终端号:" << m_terminor_id;
         usleep(1000*200);
         return ;
     }
@@ -559,16 +620,23 @@ void StoreProcessTask::Main()
     {
         //异常结束
         usleep(1000*200);
-        LOG(WARNING)<<"------  停  ------- 异常停车,回退结束"<<"车牌号:"<<m_car_info.license()
+        ALOG(WARNING)<<"------  停  ------- 异常停车,回退结束"<<"车牌号:"<<m_car_info.license()
             <<",xxxxxxxxxxxxxx  终端:"<<m_terminor_id<<"  xxxxxxxxxxxxxx";
+        LOG(WARNING)<<"------  停  ------- 异常停车,回退结束"<<"车牌号:"<<m_car_info.license()
+                               <<",xxxxxxxxxxxxxx  终端:"<<m_terminor_id<<"  xxxxxxxxxxxxxx";
     }
     if(m_current_step_type== message::eComplete)
     {
         //正常结束
         usleep(1000*200);
+        ALOG(INFO)<<"------  停  ------- 停车结束,"<<"车牌号:"<<m_car_info.license()
+            <<",--------------  终端:"<<m_terminor_id<<"  --------------";
         LOG(INFO)<<"------  停  ------- 停车结束,"<<"车牌号:"<<m_car_info.license()
             <<",--------------  终端:"<<m_terminor_id<<"  --------------";
     }
+
+    return Process_task::Main();
+
 }
 
 
@@ -587,6 +655,11 @@ void StoreProcessTask::publish_step_status() {
      */
 void StoreProcessTask::updata_step_statu(message::Step_statu statu)
 {
+    if(m_current_step_statu!=statu)
+    {
+        ALOG(INFO) << "切换当前步骤状态:" << message::Step_statu_Name(m_current_step_statu)
+                               << " -->" << message::Step_statu_Name(statu);
+    }
     m_current_step_statu=statu;
     std::lock_guard<std::mutex>         lock(m_process_msg_lock);
     switch (m_current_step_type) {

+ 113 - 1
system/process_task.cpp

@@ -1,14 +1,18 @@
 //
 // Created by zx on 2020/8/26.
 //
-
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/text_format.h>
 #include "process_task.h"
+#include "pathcreator.h"
 
 Process_task::Process_task(unsigned int terminal_id,message::Car_info car_info)
         :m_publish_statu_thread(nullptr)
 {
     m_terminor_id=terminal_id;
     m_car_info=car_info;
+    m_step_index=0;
 }
 Process_task::~Process_task()
 {
@@ -32,6 +36,7 @@ void Process_task::Cancel()
 {
     m_current_step_type= message::eBackComplete;
     m_cancel_condition.set_pass_ever(true);
+    ALOG(WARNING)<<"取消当前任务";
     tq::BaseTask::Cancel();
 }
 
@@ -55,4 +60,111 @@ void Process_task::publish_thread_func(Process_task* ptask)
 bool Process_task::is_canceled()
 {
     return m_cancel_condition.wait_for_millisecond(1);
+}
+
+#include<fcntl.h>
+
+//普通日志
+void Process_task::add_log(int severity,std::string log)
+{
+    message::Log_data log_data;
+    log_data.set_log_severity(message::Log_data_Severity (severity));
+    log_data.set_str_log(log);
+    m_process_log.mutable_log_data()->Add(std::move(log_data));
+}
+//以下是节点日志
+void Process_task::add_log(int severity,const message::Parkspace_data& data)
+{
+    message::Log_data log_data;
+    log_data.set_log_severity(message::Log_data_Severity(severity));
+    log_data.mutable_parkspace_log()->CopyFrom(data);
+    m_process_log.mutable_log_data()->Add(std::move(log_data));
+}
+void Process_task::add_log(int severity,const message::Measure_data& data)
+{
+    message::Log_data log_data;
+    log_data.set_log_severity(message::Log_data_Severity(severity));
+    log_data.mutable_measure_log()->CopyFrom(data);
+    m_process_log.mutable_log_data()->Add(std::move(log_data));
+}
+void Process_task::add_log(int severity,const message::Dispatch_data& data)
+{
+    message::Log_data log_data;
+    log_data.set_log_severity(message::Log_data_Severity(severity));
+    log_data.mutable_dispatch_log()->CopyFrom(data);
+    m_process_log.mutable_log_data()->Add(std::move(log_data));
+}
+void Process_task::add_log(int severity,const message::Manual_operation_data& data)
+{
+    message::Log_data log_data;
+    log_data.set_log_severity(message::Log_data_Severity(severity));
+    log_data.mutable_manual_operator_log()->CopyFrom(data);
+    m_process_log.mutable_log_data()->Add(std::move(log_data));
+}
+
+void Process_task::Main()
+{
+    //保存日志记录
+    time_t tt;
+    time( &tt );
+    tt = tt + 8*3600;  // transform the time zone
+    tm* t= gmtime( &tt );
+
+    char buf[255]={0};
+    getcwd(buf,255);
+    char strdir[255]={0};
+    sprintf(strdir,"%s/process_log/%d/%02d/%02d",
+            buf,t->tm_year + 1900,
+            t->tm_mon + 1,
+            t->tm_mday);
+    PathCreator creator;
+    creator.Mkdir(strdir);
+
+    char filename[255]={0};
+    std::string type=m_process_log.process_type()==message::eStoring?"停":"取";
+    sprintf(filename,"%02d%02d%02d-%s-%s.proto",
+            t->tm_hour,
+            t->tm_min,
+            t->tm_sec,
+            m_car_info.license().c_str(),
+            type.c_str());
+
+    char logPath[255] = { 0 };
+    sprintf(logPath, "%s/%s", strdir,filename);
+    to_proto(logPath);
+    /*for(int i=0;i<m_process_log.log_data_size();++i)
+    {
+        message::Log_data data=m_process_log.log_data(i);
+        if(data.data_case()==message::Log_data::kStrLog)
+        {
+            std::cout<<" strlog:"<<data.str_log()<<std::endl;
+        }
+    }*/
+}
+
+void Process_task::to_proto(std::string proto_file)
+{
+    /*using google::protobuf::io::FileInputStream;
+    using google::protobuf::io::FileOutputStream;
+    using google::protobuf::io::ZeroCopyInputStream;
+    using google::protobuf::io::CodedInputStream;
+    using google::protobuf::io::ZeroCopyOutputStream;
+    using google::protobuf::io::CodedOutputStream;
+    using google::protobuf::Message;
+
+
+    int fd = open(proto_file.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644);
+    FileOutputStream* output = new FileOutputStream(fd);
+    CHECK(google::protobuf::TextFormat::Print(m_process_log, output));
+    delete output;
+    close(fd);*/
+
+    int file=open(proto_file.c_str(),O_CREAT|O_TRUNC|O_RDWR,0644);
+    if(-1!=file)
+    {
+        if(m_process_log.SerializeToFileDescriptor(file))
+            return ;
+    }
+    LOG(WARNING)<<" process log ToProto failed :"<<proto_file;
+
 }

+ 117 - 1
system/process_task.h

@@ -4,17 +4,22 @@
 
 #ifndef NNXX_TESTS_PROCESS_TASK_H
 #define NNXX_TESTS_PROCESS_TASK_H
-
 #include <error_code.h>
+#include <iostream>
 #include "thread_condition.h"
 #include "TaskQueue/BaseTask.h"
 #include "process_message.pb.h"
+#include "log_process.pb.h"
 #include <glog/logging.h>
+
 /*
  * 停取车流程基类, 包括任务创建, 状态消息发布线程启动, 任务取消等公共功能
  * 该类继承自tq::BaseTask类, 可放入 tq 线程池, 执行虚函数 Main
  * 派生出 停车任务类(StoreProcessTask)与取车任务类(PickupProcessTask)
  */
+
+
+
 class Process_task : public tq::BaseTask{
 
 public:
@@ -31,6 +36,7 @@ public:
     // 获取任务类型
     virtual message::Process_type get_process_type() const=0;
 
+
     /*
      * 取消任务
      */
@@ -49,13 +55,119 @@ public:
         return ERROR;};
 
     virtual void updata_step_statu(message::Step_statu statu)=0;
+
+    /*
+     * 记录流程信息
+     */
+    virtual void to_proto(std::string proto_file);
+
+
+
 protected:
+    virtual void Main();
+
     /*
      * 发布进度消息
      */
     static void publish_thread_func(Process_task* ptask);
     virtual void publish_step_status()=0;
 
+    /*
+     * 添加日志相关
+     */
+    class Log_container
+    {
+     public:
+        Log_container(int severity,Process_task* process,bool condition=true){
+            m_str="";
+            m_process=process;
+            m_severity=severity;
+            m_condition=condition;
+        }
+        ~Log_container()
+        {
+            if(m_process&& m_str.length()>0)
+            {
+                m_process->add_log(m_severity,m_str);
+            }
+        }
+        Log_container& operator<<(const std::string& data) {
+            m_str+=data;
+            return *this;
+        }
+
+        Log_container& operator<<(int data) {
+            char buf[64]={0};
+            sprintf(buf,"%d",data);
+            m_str+=buf;
+            return *this;
+        }
+        Log_container& operator<<(const message::Parkspace_data& data) {
+            if(m_process)
+                m_process->add_log(m_severity,data);
+            return *this;
+        }
+        Log_container& operator<<(const message::Measure_data& data) {
+            if(m_process)
+                m_process->add_log(m_severity,data);
+            return *this;
+        }
+        Log_container& operator<<(const message::Dispatch_data& data) {
+            if(m_process)
+                m_process->add_log(m_severity,data);
+            return *this;
+        }
+        Log_container& operator<<(const message::Manual_operation_data& data) {
+            if(m_process)
+                m_process->add_log(m_severity,data);
+            return *this;
+        }
+     protected:
+        Log_container(){}
+        bool                        m_condition;
+        Process_task*               m_process;
+        int                         m_severity;
+        std::string                 m_str;
+    };
+    class Log_container_INFO :public Log_container
+    {
+     public:
+        Log_container_INFO(Process_task* process,bool condition=true){
+            m_process=process;
+            m_severity=message::Log_data_Severity_INFO;
+            m_condition=condition;
+        }
+    };
+    class Log_container_WARNING :public Log_container
+    {
+     public:
+        Log_container_WARNING(Process_task* process,bool condition=true){
+            m_process=process;
+            m_severity=message::Log_data_Severity_WARNING;
+            m_condition=condition;
+        }
+    };
+    class Log_container_ERROR :public Log_container
+    {
+     public:
+        Log_container_ERROR(Process_task* process,bool condition=true){
+            m_process=process;
+            m_severity=message::Log_data_Severity_ERROR;
+            m_condition=condition;
+        }
+    };
+
+
+    //普通日志
+    void add_log(int severity,std::string log);
+    //以下是节点日志
+    void add_log(int severity,const message::Parkspace_data& data);
+    void add_log(int severity,const message::Measure_data& data);
+    void add_log(int severity,const message::Dispatch_data& data);
+    void add_log(int severity,const message::Manual_operation_data& data);
+
+#define ALOG(severity)    Log_container_##severity(this)
+#define ALOG_IF(severity,condition)  Log_container_##severity(this,condition)
 
 protected:
     unsigned int                            m_terminor_id;
@@ -67,6 +179,10 @@ protected:
     Thread_condition				        m_publish_exit_condition;			//发送的条件变量
     Thread_condition                        m_cancel_condition;                 //取消任务标志位
     std::mutex                              m_process_msg_lock;                 //状态消息锁
+
+    message::Process_log                    m_process_log;                      //流程日志数据
+    int                                     m_step_index;                       //记录当前步骤的序号
+
 };
 
 

+ 4 - 3
test/terminal_client.cpp

@@ -80,7 +80,7 @@ void init_glog()
 
 int main() {
     init_glog();
-    Terminal_communication::get_instance_pointer()->communication_connect("tcp://192.168.2.183:30000");
+    Terminal_communication::get_instance_pointer()->communication_connect("tcp://192.168.2.185:30000");
     Terminal_communication::get_instance_pointer()->communication_run();
     usleep(2000*1000);
     threadsafe_queue<message::Car_info> input_queue;
@@ -108,10 +108,11 @@ int main() {
     bool run = true;
     Error_manager code;
     char c=0;
-    int license_id = 11700;
+    int license_id = rand()%90000+10000;
     while (c!='q') {
 
-
+        std::cout<<" press any key to send command"<<std::endl;
+        std::cin>>c;
 
         char C=rand()%10+'A';
         char license[255] = {0};