Jelajahi Sumber

加载车卡、人卡的所有历史信息,初始化相关业务逻辑变量

daiyueteng 6 tahun lalu
induk
melakukan
538f6ec7ec
6 mengubah file dengan 335 tambahan dan 57 penghapusan
  1. 271 2
      card.cpp
  2. 6 1
      card.h
  3. 1 0
      main.cpp
  4. 12 10
      module_service/module_area_timeout.h
  5. 43 43
      module_service/module_mgr.h
  6. 2 1
      ya_event.h

+ 271 - 2
card.cpp

@@ -192,7 +192,7 @@ struct card_area
     std::shared_ptr<mine_tool> m_mine_tool=nullptr;
 };
 
-struct person:card_location_base,private card_area
+struct person:card_location_base, card_area
 {
 	std::weak_ptr<monkey_person> m_monkeyPerson;
 
@@ -314,7 +314,7 @@ private:
 	}
 };
 
-struct car:card_location_base,private card_area
+struct car:card_location_base,card_area
 {
 	int m_vehicle_category_id=0;
     int m_vehicle_type_id=0;
@@ -592,6 +592,275 @@ void card_list::init_card_from_db()
 	init_vehicle();
 }
 
+void card_list::load_his_card_postion_from_db()
+{
+    load_his_card_postion_vehicle();
+    load_his_card_postion_staff();
+
+    for(auto&iter: m_map)
+    {
+        auto card_ptr = iter.second;
+        auto mine_tool_ptr = card_ptr->get_mine_tool();
+        if(mine_tool_ptr->is_attendance())
+        {
+            auto str = tool_time::to_str_ex( tool_time::to_ms(mine_tool_ptr->m_attendance_start_time));
+            std_debug("加载考勤,考勤开始时间: %s, 卡id=%d,卡type=%d", str.c_str(), card_ptr->m_id, card_ptr->m_type);
+            log_info("加载考勤,考勤开始时间: %s, 卡id=%d,卡type=%d", str.c_str(), card_ptr->m_id, card_ptr->m_type);
+        }
+    }
+
+    auto area_map = area_list::instance()->m_map;
+    for(auto&iter: area_map)
+    {
+        auto area_ptr = iter.second;
+        if(area_ptr->m_person_count)
+        {
+            std_debug("加载区域人数: 区域id=%d,区域人数=%d",area_ptr->m_id, area_ptr->m_person_count.load());
+            log_info("加载区域人数: 区域id=%d,区域人数=%d",area_ptr->m_id, area_ptr->m_person_count.load());
+        }
+
+        if(area_ptr->m_vehicle_count)
+        {
+            std_debug("加载区域车数: 区域id=%d,区域车数=%d",area_ptr->m_id, area_ptr->m_vehicle_count.load());
+            log_info("加载区域车数: 区域id=%d,区域车数=%d",area_ptr->m_id, area_ptr->m_vehicle_count.load());
+        }
+    }
+}
+
+void card_list::load_his_card_postion_vehicle()
+{
+    const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.map_id, la.area_id, l.state, \
+            case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
+            l.mileage, la.enter_time, att.start_time, \
+            att.end_time, \
+            l.landmark_id, l.direction_mapper_id, l.landmark_dist \
+            from rt_location l, rt_location_area la, rt_att_vehicle att, dat_card c, dat_vehicle_extend v \
+            where l.card_id = c.card_id and l.card_id = la.card_id and l.card_id = att.card_id and l.card_id=v.card_id \
+            and c.state_id=0;";
+    std::string Error;
+    YADB::CDBResultSet DBRes;
+    sDBConnPool.Query(sql,DBRes,Error);
+    if(!Error.empty())
+        log_error("load_his_card_postion_vehicle列表 Error,%s",Error.c_str());
+    uint64_t nCount = DBRes.GetRecordCount( Error );
+    if (nCount > 0)
+    {
+        log_info( "load_his_card_postion_vehicle. The record count=%ld\n", nCount );
+
+        while ( DBRes.GetNextRecod(Error) )
+        {
+            std::string card_id  = "";
+            DBRes.GetField( "card_id",card_id, Error );
+
+            uint32_t id = tool_other::id64_to_id(card_id);
+            int type = tool_other::id64_to_type(card_id);
+
+            auto temp_ptr = card_list::instance()->get(card_list::to_id64(type, id));
+            if(!temp_ptr || !temp_ptr->is_vehicle())
+            {
+                log_error("全局卡列表中找不到卡,卡id=%d,卡type=%d", id, type);
+                continue;
+            }
+
+            auto card_ptr = static_cast<car*>(temp_ptr.get());
+
+            double x = 0;
+            DBRes.GetField( "x",x, Error );
+
+            double y = 0;
+            DBRes.GetField( "y",y, Error );
+
+            double z = 0;
+            DBRes.GetField( "z",z, Error );
+
+            int map_id  = 0;
+            DBRes.GetField( "map_id",map_id, Error );
+
+            int area_id  = 0;
+            DBRes.GetField( "area_id",area_id, Error );
+
+            int state  = 0;
+            DBRes.GetField( "state",state, Error );
+
+            double speed = 0;
+            DBRes.GetField( "speed",speed, Error );
+
+            std::string enter_time  = "";
+            DBRes.GetField( "enter_time",enter_time, Error );
+
+            std::string start_time  = "";
+            DBRes.GetField( "start_time",start_time, Error );
+
+            std::string end_time  = "";
+            DBRes.GetField( "end_time",end_time, Error );
+
+            int landmark_id  = 0;
+            DBRes.GetField( "landmark_id",landmark_id, Error );
+
+            int direction_mapper_id  = 0;
+            DBRes.GetField( "direction_mapper_id",direction_mapper_id, Error );
+
+            double landmark_dist = 0;
+            DBRes.GetField( "landmark_dist",landmark_dist, Error );
+
+            card_ptr->x = x;
+            card_ptr->y = y;
+            card_ptr->z = z;
+
+            auto area = area_list::instance()->get(area_id);
+            if(area == nullptr)
+            {
+                log_error("area_list 找不到区域:区域id=%d", area_id);
+                continue;
+            }
+            area->m_vehicle_count++;
+
+            point pt = *card_ptr;
+            card_ptr->m_area_tool->m_area_hover = std::make_shared<area_hover>( area, pt,speed);
+            auto area_hover_ptr = card_ptr->get_area_hover();
+
+            auto e_t = tool_time::to_time_ex(enter_time);
+            area_hover_ptr->m_enter_time = std::chrono::system_clock::to_time_t(e_t);
+
+            //int map_id  = 0;
+            //int state  = 0;
+            card_ptr->m_speed = speed;
+
+            if(end_time.empty())
+            {
+                auto mine_tool_ptr = card_ptr->get_mine_tool();
+                mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
+                mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
+            }
+
+            area_hover_ptr->landmark_id = landmark_id;
+            area_hover_ptr->landmark_dir = direction_mapper_id;
+            area_hover_ptr->landmark_dis = landmark_dist;
+
+            card_ptr->m_time = tool_time::now_to_ms();
+        }
+    }
+}
+
+void card_list::load_his_card_postion_staff()
+{
+    const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.map_id, la.area_id, l.state, \
+            case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \
+            l.mileage, la.enter_time, att.start_time, \
+            att.end_time, \
+            l.landmark_id, l.direction_mapper_id, l.landmark_dist \
+            from rt_location l, rt_location_area la, rt_att_staff att, dat_card c, dat_staff_extend s \
+            where l.card_id = c.card_id and l.card_id = la.card_id and l.card_id = att.card_id and l.card_id=s.card_id\
+            and c.state_id=0;";
+    std::string Error;
+    YADB::CDBResultSet DBRes;
+    sDBConnPool.Query(sql,DBRes,Error);
+    if(!Error.empty())
+        log_error("load_his_card_postion_vehicle列表 Error,%s",Error.c_str());
+    uint64_t nCount = DBRes.GetRecordCount( Error );
+    if (nCount > 0)
+    {
+        log_info( "load_his_card_postion_vehicle. The record count=%ld\n", nCount );
+
+        while ( DBRes.GetNextRecod(Error) )
+        {
+            std::string end_time  = "";
+            DBRes.GetField( "end_time",end_time, Error );
+            if(!end_time.empty()) // 已升井,不再读入
+            {
+                continue;
+            }
+
+            std::string card_id  = "";
+            DBRes.GetField( "card_id",card_id, Error );
+
+            uint32_t id = tool_other::id64_to_id(card_id);
+            int type = tool_other::id64_to_type(card_id);
+
+            auto temp_ptr = card_list::instance()->get(card_list::to_id64(type, id));
+            if(!temp_ptr || !temp_ptr->is_person())
+            {
+                log_error("全局卡列表中找不到卡,卡id=%d,卡type=%d", id, type);
+                continue;
+            }
+
+            auto card_ptr = static_cast<car*>(temp_ptr.get());
+
+            double x = 0;
+            DBRes.GetField( "x",x, Error );
+
+            double y = 0;
+            DBRes.GetField( "y",y, Error );
+
+            double z = 0;
+            DBRes.GetField( "z",z, Error );
+
+            int map_id  = 0;
+            DBRes.GetField( "map_id",map_id, Error );
+
+            int area_id  = 0;
+            DBRes.GetField( "area_id",area_id, Error );
+
+            int state  = 0;
+            DBRes.GetField( "state",state, Error );
+
+            double speed = 0;
+            DBRes.GetField( "speed",speed, Error );
+
+            std::string enter_time  = "";
+            DBRes.GetField( "enter_time",enter_time, Error );
+
+            std::string start_time  = "";
+            DBRes.GetField( "start_time",start_time, Error );
+
+            int landmark_id  = 0;
+            DBRes.GetField( "landmark_id",landmark_id, Error );
+
+            int direction_mapper_id  = 0;
+            DBRes.GetField( "direction_mapper_id",direction_mapper_id, Error );
+
+            double landmark_dist = 0;
+            DBRes.GetField( "landmark_dist",landmark_dist, Error );
+
+            card_ptr->x = x;
+            card_ptr->y = y;
+            card_ptr->z = z;
+
+            auto area = area_list::instance()->get(area_id);
+            if(area == nullptr)
+            {
+                log_error("area_list 找不到区域:区域id=%d", area_id);
+                continue;
+            }
+            area->m_person_count++;
+
+            point pt = *card_ptr;
+            card_ptr->m_area_tool->m_area_hover = std::make_shared<area_hover>(area,pt,speed);
+            auto area_hover_ptr = card_ptr->get_area_hover();
+
+            auto e_t = tool_time::to_time_ex(enter_time);
+            area_hover_ptr->m_enter_time = std::chrono::system_clock::to_time_t(e_t);
+
+            //int map_id  = 0;
+            //int state  = 0;
+            card_ptr->m_speed = speed;
+
+            if(end_time.empty())
+            {
+                auto mine_tool_ptr = card_ptr->get_mine_tool();
+                mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
+                mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
+            }
+
+            area_hover_ptr->landmark_id = landmark_id;
+            area_hover_ptr->landmark_dir = direction_mapper_id;
+            area_hover_ptr->landmark_dis = landmark_dist;
+
+            card_ptr->m_time = tool_time::now_to_ms();
+        }
+    }
+}
+
 void card_list::on_message(zloop<task*> *loop,const message_locinfo&loc,bool is_history)
 {
 	//std::shared_ptr<card_location_base>c=get(loc.m_card_id);

+ 6 - 1
card.h

@@ -40,7 +40,8 @@ struct card:point
 	int      m_is_attendance;	//井上井下状态  0初始状态 1 井上 2 井下
 	int		 m_stat;			//运动静止状态
 	uint16_t m_ct;				//ct
-	uint64_t m_time;			//时间戳
+    ///时间戳 ms
+    uint64_t m_time;
 	int32_t  m_deptid;			//部门编号
 };
 struct card_location_base:card
@@ -91,6 +92,10 @@ struct card_list:single_base<card_list,uint64_t,std::shared_ptr<card_location_ba
     void on_message(zloop<task*> *loop,const message_locinfo&loc,bool is_history);
     void init_card_from_db();
 
+    void load_his_card_postion_vehicle();
+    void load_his_card_postion_staff();
+    void load_his_card_postion_from_db();
+
     /// (类型<<32)|卡号
     static uint64_t to_id64(int32_t type, uint32_t id)
     {

+ 1 - 0
main.cpp

@@ -60,6 +60,7 @@ struct Init_Setting
 		auto s = special_area_list::instance()->get_special_id(1013,point(4727,-254),2);
 		std_info("test special_area:%d",s);
 
+        card_list::instance()->load_his_card_postion_from_db();
         event_list::instance()->load_his_data_from_db();
 	}
 

+ 12 - 10
module_service/module_area_timeout.h

@@ -27,16 +27,18 @@ private:
 public:
     void on_enter(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
     {
-        EVENT_TYPE ev_type = card_ptr->is_person() ? ET_CARD_AREA_OVER_TIME_PERSON : ET_AREA_OVER_COUNT_VEHICLE;
-        //中途服务器宕机处理
-        if(auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ev_type))
-        {
-            c->m_enter_time = std::chrono::system_clock::to_time_t(ev_ptr->m_cur_time);
-        }
-        else
-        {
-            std::time(&c->m_enter_time);
-        }
+        c->m_enter_time = card_ptr->m_time/1000;
+
+//        EVENT_TYPE ev_type = card_ptr->is_person() ? ET_CARD_AREA_OVER_TIME_PERSON : ET_AREA_OVER_COUNT_VEHICLE;
+//        //中途服务器宕机处理
+//        if(auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ev_type))
+//        {
+//            c->m_enter_time = std::chrono::system_clock::to_time_t(ev_ptr->m_cur_time);
+//        }
+//        else
+//        {
+//            std::time(&c->m_enter_time);
+//        }
     }
 
     void on_hover(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)

+ 43 - 43
module_service/module_mgr.h

@@ -40,7 +40,7 @@ public:
     static void start()
     {
         module_over_speed_vehicle::instance()->init_vehicle_category_from_db();
-        init_attendance_from_db();
+        //init_attendance_from_db();
         module_attendance_vehicle::instance()->init_attendance_area_from_db();
 
         module_web::instance()->start();
@@ -75,48 +75,48 @@ public:
         }
     }
 
-private:
-    static void init_attendance_from_db()
-    {
-        const char *sql = "select card_id, start_time, end_time from rt_att_staff;";
-        std::string Error;
-        YADB::CDBResultSet DBRes;
-        sDBConnPool.Query(sql,DBRes,Error);
-        int nCount = DBRes.GetRecordCount( Error );
-        if (nCount > 0)
-        {
-            log_info( "init_attendance. The record count=%d\n", nCount );
-
-            while ( DBRes.GetNextRecod(Error) )
-            {
-                std::string card_id;
-                DBRes.GetField( "card_id",card_id, Error );
-
-                std::string end_time;
-                DBRes.GetField( "end_time",end_time, Error );
-
-                if(end_time.empty())
-                {
-                    uint32_t id = tool_other::id64_to_id(card_id);
-                    int32_t type = tool_other::id64_to_type(card_id);
-
-                    auto card_ptr = card_list::instance()->get(card_list::to_id64(type, id));
-                    if(card_ptr)
-                    {
-                        std::string start_time;
-                        DBRes.GetField( "start_time",start_time, Error );
-
-                        auto mine_tool_ptr = card_ptr->get_mine_tool();
-
-                        mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
-                        mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
-                        //std_debug("%s",
-                        //   tool_time::to_str_ex(tool_time::to_ms(site_area_ptr->m_attendance_start_time)).c_str());
-                    }
-                }
-            }
-        }
-    }
+//private:
+//    static void init_attendance_from_db()
+//    {
+//        const char *sql = "select card_id, start_time, end_time from rt_att_staff;";
+//        std::string Error;
+//        YADB::CDBResultSet DBRes;
+//        sDBConnPool.Query(sql,DBRes,Error);
+//        uint64_t nCount = DBRes.GetRecordCount( Error );
+//        if (nCount > 0)
+//        {
+//            log_info( "init_attendance. The record count=%d\n", nCount );
+
+//            while ( DBRes.GetNextRecod(Error) )
+//            {
+//                std::string card_id;
+//                DBRes.GetField( "card_id",card_id, Error );
+
+//                std::string end_time;
+//                DBRes.GetField( "end_time",end_time, Error );
+
+//                if(end_time.empty())
+//                {
+//                    uint32_t id = tool_other::id64_to_id(card_id);
+//                    int32_t type = tool_other::id64_to_type(card_id);
+
+//                    auto card_ptr = card_list::instance()->get(card_list::to_id64(type, id));
+//                    if(card_ptr)
+//                    {
+//                        std::string start_time;
+//                        DBRes.GetField( "start_time",start_time, Error );
+
+//                        auto mine_tool_ptr = card_ptr->get_mine_tool();
+
+//                        mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
+//                        mine_tool_ptr->m_stat_attendance = AS_ATTENDANCE;
+//                        //std_debug("%s",
+//                        //   tool_time::to_str_ex(tool_time::to_ms(site_area_ptr->m_attendance_start_time)).c_str());
+//                    }
+//                }
+//            }
+//        }
+//    }
 };
 
 #endif // MODULE_MGR_H

+ 2 - 1
ya_event.h

@@ -163,7 +163,8 @@ public:
     {
         ev_ptr->x = card_ptr->x;
         ev_ptr->y = card_ptr->y;
-        ev_ptr->m_cur_time = std::chrono::system_clock::now();
+        ev_ptr->m_cur_time = std::chrono::system_clock::time_point(std::chrono::milliseconds(card_ptr->m_time));
+                //std::chrono::system_clock::now();
         ev_ptr->m_is_display = card_ptr->m_display;
 
         auto hover = card_ptr->get_area_hover();