Procházet zdrojové kódy

his_location_area拆分多出his_location_reader(分站区域进出入记录)

chensongchao před 5 roky
rodič
revize
962200a398

+ 7 - 1
area.h

@@ -46,10 +46,16 @@ struct area
     {
         return m_scale;
     }
-        bool is_mine()//是矿井区域
+    bool is_mine()//是矿井区域
     {
         return 0 == m_id;
     }
+    //分站创建的区域 --- 分站创建的区域id = 0-分站id
+    bool is_reader_area()
+    {
+        return m_id < 0;
+    }
+
     virtual ~area()
     {}
     double get_speed(int vehicle_category_id) {return m_speed[vehicle_category_id];}

+ 1 - 1
forbid_staff_down_mine.cpp

@@ -16,7 +16,7 @@ void forbid_staff_down_mine::init_forbid_staff(int id /* = -1*/,int etype)
     int nCount = DBRes.GetRecordCount( Error );
     if (nCount < 1)
     {
-        log_info("增加或修改失败,数据库中没有记录: sql=%s", sql.c_str());
+        //log_info("增加或修改失败,数据库中没有记录: sql=%s", sql.c_str());
         return ;
     }
     while ( DBRes.GetNextRecod(Error) )

+ 28 - 17
module_service/area_business_card_enter_or_leave.cpp

@@ -6,6 +6,17 @@
 #include"db/db_tool.h"
 #include"log.h"
 
+const char * get_area_table_name(const std::shared_ptr<area_hover>&a)
+{
+    static const char * g_sz_area_name = "his_location_area";
+    // 分站定位数据保存(进入分站,离开分站保存记录)
+    static const char * g_sz_reader_area_name = "his_location_reader";
+    if (a->m_area->is_reader_area())
+    {
+        return  g_sz_reader_area_name;
+    }
+    return g_sz_area_name;
+}
 
 void area_business_card_enter_or_leave::on_load_his(const std::shared_ptr<area_hover>&area_hover_ptr,
                                             const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
@@ -20,27 +31,29 @@ void area_business_card_enter_or_leave::on_enter(const std::shared_ptr<area_hove
     char sql[LENGTH_SQL]{0};
     std::string start_time = tool_time::to_str(a->m_enter_time/1000);
     const auto &p=a->m_enter_point;
-    // 根据区域无法区分是否井上分站[分站创建的区域没有代入区域类型-导致都是井上区域] 只能通过分站区分
+
+    // 根据区域无法区分是否井上区域[分站创建的区域没有代入区域类型-导致都是井上区域] 只能通过分站区分
     if (nullptr == c->get_area_tool()->m_site || !c->get_area_tool()->m_site->is_up_site())
     {
-        snprintf(sql, LENGTH_SQL, "INSERT INTO his_location_area (obj_id,card_type_id,ident,area_id,map_id,enter_time,start_point) \
-	                         VALUES ('%d','%lu','%d',%d,%d,'%s','%.2f,%.2f');",
-                 c->m_cid, c->m_type, c->m_id, a->id(), a->mapid(), start_time.c_str(), p.x, p.y);
+        snprintf(sql, LENGTH_SQL, "INSERT INTO %s (obj_id,card_type_id,ident,area_id,map_id,enter_time,start_point) \
+	                         VALUES ('%d','%lu','%d',%d,%d,'%s','%.2f,%.2f');",get_area_table_name(a)
+	                         ,c->m_cid, c->m_type, c->m_id, a->id(), a->mapid(), start_time.c_str(), p.x, p.y);
     }
     else
     {
         // 井上分站时,插入时把离开时间也写入 防止员工出井后最后一个区域没有leave_time
-        snprintf(sql, LENGTH_SQL, "INSERT INTO his_location_area (obj_id,card_type_id,ident,area_id,map_id,enter_time,leave_time,start_point) \
-	                         VALUES ('%d','%lu','%d',%d,%d,'%s','%s','%.2f,%.2f');",
-                 c->m_cid, c->m_type, c->m_id, a->id(), a->mapid(), start_time.c_str(),start_time.c_str(), p.x, p.y);
+        snprintf(sql, LENGTH_SQL, "INSERT INTO %s (obj_id,card_type_id,ident,area_id,map_id,enter_time,leave_time,start_point) \
+	                         VALUES ('%d','%lu','%d',%d,%d,'%s','%s','%.2f,%.2f');",get_area_table_name(a)
+	                         ,c->m_cid, c->m_type, c->m_id, a->id(), a->mapid(), start_time.c_str(),start_time.c_str(), p.x, p.y);
     }
     db_tool::PushAsync(sql);
+    std_info("card:%d Enter Area:%d ",c->m_cid,a->id());
 }
 
 void area_business_card_enter_or_leave::on_hover(const std::shared_ptr<area_hover>&a,
                                                  const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-    // 根据区域无法区分是否井上分站[分站创建的区域没有代入区域类型-导致都是井上区域] 只能通过分站区分
+    // 根据区域无法区分是否井上区域[分站创建的区域没有代入区域类型-导致都是井上区域] 只能通过分站区分
     if (nullptr != c->get_area_tool()->m_site && c->get_area_tool()->m_site->is_up_site())
     {
         // 井上分站时,员工在行走过程中更新时间
@@ -48,10 +61,9 @@ void area_business_card_enter_or_leave::on_hover(const std::shared_ptr<area_hove
         std::string start_time = tool_time::to_str(a->m_enter_time/1000);
         std::string end_time = tool_time::to_str(tool_time::now_to_seconds());
         const auto &ep=a->m_last_point;
-        snprintf(sql,LENGTH_SQL,"UPDATE his_location_area SET leave_time='%s',end_point='%.2f,%.2f' \
-	                         WHERE  enter_time='%s' AND obj_id=%d AND area_id=%d;",
-                 end_time.c_str(),ep.x,ep.y,
-                 start_time.c_str(),c->m_cid,a->id());
+        snprintf(sql,LENGTH_SQL,"UPDATE %s SET leave_time='%s',end_point='%.2f,%.2f'"
+                                " WHERE  enter_time='%s' AND obj_id=%d AND area_id=%d;"
+                                ,get_area_table_name(a),end_time.c_str(),ep.x,ep.y,start_time.c_str(),c->m_cid,a->id());
 
         db_tool::PushAsync(sql);
     }
@@ -65,13 +77,12 @@ void area_business_card_enter_or_leave::on_leave(const std::shared_ptr<area_hove
     std::string end_time = tool_time::to_str(a->m_last_time/1000);
 //    std::string card_id = tool_other::type_id_to_str(c->m_type,c->m_id);
     const auto &ep=a->m_last_point;
-    snprintf(sql,LENGTH_SQL,"UPDATE his_location_area SET leave_time='%s',end_point='%.2f,%.2f' \
-	                         WHERE  enter_time='%s' AND obj_id=%d AND area_id=%d;",
-                end_time.c_str(),ep.x,ep.y,
-				start_time.c_str(),c->m_cid,a->id());
+    snprintf(sql,LENGTH_SQL,"UPDATE %s SET leave_time='%s',end_point='%.2f,%.2f' \
+	                         WHERE  enter_time='%s' AND obj_id=%d AND area_id=%d;"
+	                         ,get_area_table_name(a),end_time.c_str(),ep.x,ep.y,start_time.c_str(),c->m_cid,a->id());
 
     log_info("card_enter_leave:%s",sql);
-
+    std_info("card:%d leave Area:%d ",c->m_cid,a->id());
     db_tool::PushAsync(sql);
 }
 

+ 2 - 2
module_service/area_business_count_checker.cpp

@@ -153,14 +153,14 @@ void area_business_count_checker::_add_person_count_event(const std::shared_ptr<
     int pc = a->m_area->m_person_count.load();
     int pc_ = a->m_area->m_person_show_count.load();
     EVENT_TYPE ev = a->m_area->is_mine() ? EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON;
-    if(pc > limit_val )
+    if(pc >= limit_val )
     {
         lock();
         event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_person_count=true,DT_NORMAL);
         unlock();
         log_info("%s:%d,v_count:%d limit:%d",desc.c_str(),aid,pc,limit_val);
     }
-    if(pc_ > limit_val )
+    if(pc_ >= limit_val )
     {
         lock();
         event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_person_show_count=true,DT_SPECIAL);