Browse Source

区域人员人数统计根据display得配置,进行实时变更

lixioayao 5 years ago
parent
commit
9272ec4161
7 changed files with 85 additions and 12 deletions
  1. 2 1
      ant.cpp
  2. 22 2
      card.cpp
  3. 1 0
      card_base.cpp
  4. 3 0
      card_base.h
  5. 43 8
      module_service/area_business_count_checker.cpp
  6. 9 0
      worker.cpp
  7. 5 1
      worker.h

+ 2 - 1
ant.cpp

@@ -537,7 +537,8 @@ void sit_list::init_site(int id)
          DBRes.GetField( "x",x, Error );
          DBRes.GetField( "y",y, Error );
 
-		 log_info ("site-position:site=%d,x=%.2lf,y=%.2lf",reader_id,x,y);
+		 log_info ("site_position:site=%d,x=%.2lf,y=%.2lf,%d",reader_id,x,y,area_id);
+
      }
 }
 

+ 22 - 2
card.cpp

@@ -16,9 +16,21 @@
 #include "area.h"
 #include "card.h"
 #include "mine_business.h"
+#include "worker.h"
 
 extern config_file config;
 int three_rates_flag=0;
+static void request(uint64_t id,uint32_t hash_id,uint16_t dis)
+{
+     task * t  = task::alloc<message_change_card_display>();
+	 auto&mcb=t->body<message_change_card_display>();
+     t->m_hash_id=hash_id;
+     t->m_cmd_code=0x10002;
+     mcb.m_card_id=id;
+     mcb.m_display=dis;
+     worker::instance()->request(t);
+
+}
 void card_list::init_staffer(const std::string & lszId64)
 {
     std::string strategy = config.get("person.strategy","PS_1");
@@ -53,11 +65,15 @@ void card_list::init_staffer(const std::string & lszId64)
             //group_id
             //occ_id
             tmp_ptr->m_level_id = db_person_ptr->m_level_id;
-            tmp_ptr->m_display = db_person_ptr->m_display;
+    //        tmp_ptr->m_display = db_person_ptr->m_display;
             tmp_ptr->m_workLine = db_person_ptr->m_workLine;
             tmp_ptr->m_stafferName = db_person_ptr->m_stafferName;
             tmp_ptr->m_deptName = db_person_ptr->m_deptName;
             tmp_ptr->m_worktype_id = db_person_ptr->m_worktype_id;
+            if(db_person_ptr->m_display!=tmp_ptr->m_display){
+                request(id64,tmp_ptr->m_id,db_person_ptr->m_display);
+            }
+            
 		}
 		else
 		{
@@ -94,11 +110,15 @@ void card_list::init_vehicle(const std::string & lszId64)
 		if(card_ptr)
 		{
 			car* tmp_ptr= static_cast<car*>(card_ptr.get());
-			tmp_ptr->m_display = static_cast<uint16_t>(db_car->m_display);
+			//tmp_ptr->m_display = static_cast<uint16_t>(db_car->m_display);
 			tmp_ptr->m_deptid = db_car->m_deptid;
 			tmp_ptr->m_vehicle_category_id = db_car->m_vehicle_category_id;
 			tmp_ptr->m_vehicle_type_id = db_car->m_vehicle_type_id;
 			tmp_ptr->m_level_id = db_car->m_level_id;
+            if(db_car->m_display!=tmp_ptr->m_display){
+                request(id64,tmp_ptr->m_id,db_car->m_display);
+            }
+
 		}
 		else
 		{

+ 1 - 0
card_base.cpp

@@ -22,6 +22,7 @@
 extern config_file config;
 card_location_base::card_location_base(const std::string&type,uint32_t id,uint16_t dis,int16_t t,int32_t deptid,int32_t level_id,uint32_t cid)
 	:card(id,dis,t,deptid,level_id,cid)
+    ,m_display_old(dis)
 {
     select_tool_manage::instance()->create_tool(type,m_sel_tool,m_smo_tool);
 	m_his_location_card.reset(new location_card(m_id,m_type,cid));

+ 3 - 0
card_base.h

@@ -65,6 +65,9 @@ struct card:point
 struct card_location_base:card,std::enable_shared_from_this<card_location_base>
 {
 	uint64_t m_timeval=0;
+	uint16_t m_display_old{0};			//1显示0不显示,往前端推送
+    void update_display(){m_display_old=m_display;}
+    bool eq_display(){return m_display_old==m_display;}
     std::uint8_t m_event[CARD_EVENT_COUNT_MAX]{0};
     std::unique_ptr<select_tool> m_sel_tool;
     std::unique_ptr<smooth_tool> m_smo_tool;

+ 43 - 8
module_service/area_business_count_checker.cpp

@@ -57,7 +57,11 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
             log_warn("on_enter_area_id:%d,limit_person_count is 0.so should not run area_business_count_checker...",aid);
             return;
         }
-		a->m_area->m_person_count ++ ;
+        if(!ptr)
+        {
+		    log_info("person_count_enter[ptr is nulll....]:%d,v_count: limit:%d",aid,limit_val);
+		    a->m_area->m_person_count ++;
+        }
         if(c->m_display)
 		    a->m_area->m_person_show_count ++ ;
         int pc=a->m_area->m_person_count.load();
@@ -85,7 +89,8 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
             log_warn("on_enter_area_id:%d,limit_vehicle_count is 0.so should not run area_business_count_checker...",aid);
             return;
         }
-		a->m_area->m_vehicle_count ++ ;
+        if(!ptr)
+		    a->m_area->m_vehicle_count ++ ;
         if(c->m_display)
 		    a->m_area->m_vehicle_show_count ++ ;
         int vc=a->m_area->m_vehicle_count.load();
@@ -104,23 +109,48 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
 		    log_info("vehicle_count_enter_show:%d,v_count:%d limit:%d",aid,vc_,limit_val);
         }
 	}
+    c->update_display();
 }
 void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
                                            const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
+    if(!c->eq_display())
+    {
+        ptr=std::make_shared<business_data>();
+        if(c->m_display==1)
+          on_enter(a,c,ptr);
+        else if(c->m_display==0)
+          on_leave(a,c,ptr);
+        c->update_display();
+        ptr=nullptr;
+    }
 }
 
 //减少计数
 void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
                                            const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-	if (nullptr == a->m_area )
-		return ;
+	if (nullptr == a->m_area )return ;
+    int flag=c->m_display;
+    if(!ptr){
+        if(!c->eq_display()){
+            c->update_display(); 
+            //从0 变成1 之前是0 m_show_count没加1 这里不需要减一
+            if(c->m_display==1)flag=0;
+            //从1 变成 0 之前是加1了。 这里需要减去
+            if(c->m_display==0)flag=1;
+        }
+    }
 	if (c->is_person())
 	{
-		a->m_area->m_person_count -- ;
-        if(c->m_display)
+        if(ptr)
 		    a->m_area->m_person_show_count -- ;
+        else{
+		    a->m_area->m_person_count -- ;
+            //if(c->m_display)
+            if(flag)
+		        a->m_area->m_person_show_count -- ;
+        }
         int pc=a->m_area->m_person_count.load();
         int pc_=a->m_area->m_person_show_count.load();
         int limit_val=a->m_area->m_limit_person_count;
@@ -141,9 +171,14 @@ void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
 	}
 	else if (c->is_vehicle())
 	{
-        a->m_area->m_vehicle_count -- ;
-        if(c->m_display)
+        if(ptr)
 		    a->m_area->m_vehicle_show_count -- ;
+        else{
+            a->m_area->m_vehicle_count -- ;
+            //if(c->m_display)
+            if(flag)
+		        a->m_area->m_vehicle_show_count -- ;
+        }
         int pc=a->m_area->m_vehicle_count.load();
         int pc_=a->m_area->m_vehicle_show_count.load();
         int limit_val=a->m_area->m_limit_vehicle_count;

+ 9 - 0
worker.cpp

@@ -166,7 +166,16 @@ struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
 				{
 					t.destroy();
 				}
+                break;
 			}
+			case 0x10002://区域业务类型修改
+            {
+				auto&mcb=t.body<message_change_card_display>();
+                auto c = card_list::instance()->get(mcb.m_card_id);
+                c->m_display=mcb.m_display;
+				t.destroy();
+                break;
+            }
 		}
 	}
 

+ 5 - 1
worker.h

@@ -48,7 +48,11 @@ struct message_change_business:task
 	std::atomic<int> ref_count;
 	std::vector<area_business*> del_list,add_list,new_list;
 };
-
+struct message_change_card_display:task
+{
+    uint64_t m_card_id;
+    uint16_t m_display;
+};
 struct worker
 {
 	virtual void stop()=0;