lixioayao 6 years ago
parent
commit
323560252a

+ 30 - 9
area.cpp

@@ -6,6 +6,8 @@
 #include <area.h>
 #include "point.h"
 #include "tool_time.h"
+#include "common_tool.h"
+#include "db_tool.h"
 #include "monkey_car/monkeycar_area.h"
 #include "landmark.h"
 #include "area_business.h"
@@ -102,6 +104,18 @@ void area::on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<ca
 	}
 }
 
+void area::on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
+{
+    log_info("on_load_his..%d  areaId:%d",c->m_id,m_id);
+    //a->m_last_time=tool_time::now_to_ms();
+    a->m_last_point=*c;
+    for(const auto &i:m_area_business_list)
+    {
+        auto &x=a->get_business_data(i->area_business_type());
+        i->on_load_his(a,c,x);
+    }
+}
+
 void area::on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
 {
 	log_info("on_leave..%d  areaId:%d",c->m_id,m_id);
@@ -113,15 +127,6 @@ void area::on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<ca
 		i->on_leave(a,c,x);
 	}
 }
-
-void area::on_load(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
-{
-    for(const auto &i:m_area_business_list)
-	{
-		auto &x=a->get_business_data(i->area_business_type());
-		i->on_load(a,c,x);
-	}
-}
 bool area::in_area(const std::shared_ptr<site>&s,const std::shared_ptr<card_location_base>&c, const point & p,int & sarid)
 {
 	if(m_bound.empty())
@@ -506,6 +511,22 @@ void area_tool::on_point(const std::shared_ptr<site>&s,const std::shared_ptr<car
 	}
 
 	m_hover_list=std::move(nlist);
+
+    //更新到数据库
+    std::string strAreaInfo = "";
+    for (std::vector<std::shared_ptr<area_hover>>::iterator itvec = m_hover_list.begin(); itvec != m_hover_list.end(); ++itvec)
+    {
+        if ((*itvec)->id() >= 0)
+        {
+            char tmpArea[128] = {0};
+            snprintf(tmpArea, 128, "%d,%lu|", (*itvec)->id(), (*itvec)->m_enter_time);
+            strAreaInfo += tmpArea;
+        }
+    }
+    char sql[1024] = {0};
+    snprintf(sql, 1024, "REPLACE INTO rt_location (card_id, site_id, x, y, z, state, area_info) VALUES (%lu, %d, %lf, %lf, %lf, 0, '%s');",
+        tool_other::type_id_to_u64(c->m_type, c->m_id), s->id(), pt.x, pt.y, pt.z, strAreaInfo.c_str());
+    db_tool::PushAsync(sql);
 }
 
 void area_tool::on_leave(const std::shared_ptr<card_location_base>& c)

+ 1 - 1
area.h

@@ -27,7 +27,7 @@ struct area
   	virtual void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
 	virtual	void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
 	virtual	void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
-	virtual	void on_load(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
+    virtual	void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
 
     virtual bool in_area(const std::shared_ptr<site>&s,const std::shared_ptr<card_location_base>&c, const point & p,int &);
     int id()const

+ 1 - 1
area_business.h

@@ -15,10 +15,10 @@ struct area_business
 {
 	virtual int area_business_type()=0;
 
+	virtual void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr){}
 	virtual void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr){}
 	virtual void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
 	virtual void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
-	virtual void on_load(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
 
 	virtual ~area_business(){};
 

+ 79 - 122
card.cpp

@@ -161,13 +161,10 @@ void card_list::load_his_card_postion_from_db()
 
 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 \
+    const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.area_info, l.state, \
+            att.start_time, att.end_time \
+            from rt_location l, rt_att_vehicle att, dat_card c, dat_vehicle_extend v \
+            where l.card_id = c.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;
@@ -181,12 +178,10 @@ void card_list::load_his_card_postion_vehicle()
 
         while ( DBRes.GetNextRecod(Error) )
         {
-            std::string card_id  = "";
+             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(tool_other::type_id_to_u64(type, id));
             if(!temp_ptr || !temp_ptr->is_vehicle())
             {
@@ -205,11 +200,8 @@ void card_list::load_his_card_postion_vehicle()
             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 );
+            std::string strAreaInfo = "";
+            DBRes.GetField( "area_info",strAreaInfo, Error );
 
             int state  = 0;
             DBRes.GetField( "state",state, Error );
@@ -217,77 +209,61 @@ void card_list::load_his_card_postion_vehicle()
             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)
+            //解析area_info
+            const char * split = "|";
+            char *p = strtok(const_cast<char *>(strAreaInfo.c_str()), split);
+            while (p != NULL)
             {
-                log_error("load_vehicle...area_list 找不到区域:区域id=%d", area_id);
-                continue;
+                int area_id = 0;
+                uint64_t enter_time = 0; 
+                sscanf(p, "%d,%lu", &area_id, &enter_time);
+                p = strtok(NULL, split);
+                if (area_id < 0)
+                    continue;
+
+                auto area = area_list::instance()->get(area_id);
+                if(area == nullptr)
+                {
+                    log_error("load_vehicle...area_list 找不到区域:区域id=%d", area_id);
+                    continue;
+                }
+
+                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_is_attendance = true;
+                }
+
+                card_ptr->m_time = tool_time::now_to_ms();
+
+                //要放到最后
+                auto area_hover_ptr = std::make_shared<area_hover>();
+                area_hover_ptr->m_area = area;
+                area_hover_ptr->m_enter_time = enter_time;
+                card_ptr->m_area_tool->m_hover_list.push_back(area_hover_ptr);
+                area_hover_ptr->m_area->on_load_his(area_hover_ptr, temp_ptr);
             }
-            area->m_vehicle_count++;
-
-            //point pt = *card_ptr;
-			//m_area_hover = std::make_shared<area_hover>( area, pt,speed);
-            //auto area_hover_ptr = card_ptr->get_area_hover();
-
-            //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_is_attendance = true;
-            }
-
-            //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();
-
-            //要放到最后
-            auto e_t = tool_time::to_time_ex(enter_time);
-            auto area_hover_ptr = std::make_shared<area_hover>();
-            area_hover_ptr->m_area = area;
-            area_hover_ptr->m_enter_time = tool_time::to_ms(e_t);
-            card_ptr->m_area_tool->m_hover_list.push_back(area_hover_ptr);
-            area_hover_ptr->m_area->on_enter(area_hover_ptr, temp_ptr);
         }
     }
 }
 
 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\
+    const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.area_info, l.state, \
+            att.start_time, att.end_time \
+            from rt_location l, rt_att_staff att, dat_card c, dat_staff_extend s \
+            where l.card_id = c.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;
@@ -310,10 +286,8 @@ void card_list::load_his_card_postion_staff()
 
             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(tool_other::type_id_to_u64(type, id));
             if(!temp_ptr || !temp_ptr->is_person())
             {
@@ -332,11 +306,8 @@ void card_list::load_his_card_postion_staff()
             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 );
+            std::string strAreaInfo = "";
+            DBRes.GetField( "area_info",strAreaInfo, Error );
 
             int state  = 0;
             DBRes.GetField( "state",state, Error );
@@ -344,62 +315,48 @@ void card_list::load_his_card_postion_staff()
             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)
+            //解析area_info
+            const char * split = "|";
+            char *p = strtok(const_cast<char *>(strAreaInfo.c_str()), split);
+            while (p != NULL)
             {
-                log_error("area_list 找不到区域:区域id=%d", area_id);
-                continue;
+                int area_id = 0;
+                uint64_t enter_time = 0; 
+                sscanf(p, "%d,%lu", &area_id, &enter_time);
+                p = strtok(NULL, split);
+                if (area_id < 0)
+                    continue;
+
+                auto area = area_list::instance()->get(area_id);
+                if(area == nullptr)
+                {
+                    log_error("area_list 找不到区域:区域id=%d", area_id);
+                    continue;
+                }
+
+                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_is_attendance = true;
+                }
+
+                card_ptr->m_time = tool_time::now_to_ms();
+
+                //要放到最后
+                auto area_hover_ptr = std::make_shared<area_hover>();
+                area_hover_ptr->m_area = area;
+                area_hover_ptr->m_enter_time = enter_time;
+                card_ptr->m_area_tool->m_hover_list.push_back(area_hover_ptr);
+                area_hover_ptr->m_area->on_load_his(area_hover_ptr, temp_ptr);
             }
-            area->m_person_count++;
-
-            //point pt = *card_ptr;
-//			m_area_hover = std::make_shared<area_hover>(area,pt,speed);
-
-			log_info("load_staff...%d,areaid:%d,mapid:%d",id,area->id(),area->mapid());
-
-            //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_is_attendance = true;
-            }
-
-            //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();
-
-            //要放到最后
-            auto e_t = tool_time::to_time_ex(enter_time);
-            auto area_hover_ptr = std::make_shared<area_hover>();
-            area_hover_ptr->m_area = area;
-            area_hover_ptr->m_enter_time = tool_time::to_ms(e_t);
-            card_ptr->m_area_tool->m_hover_list.push_back(area_hover_ptr);
-            area_hover_ptr->m_area->on_enter(area_hover_ptr, temp_ptr);
         }
     }
 }

+ 1 - 0
card.h

@@ -2,6 +2,7 @@
 #define _CARD_HPP_
 #include <thread>
 #include <ev++.h>
+
 #include "card_base.h"
 #include "write-copy.h"
 

+ 8 - 1
module_service/area_business_car_attendance.cpp

@@ -24,6 +24,11 @@ area_business_car_attendance::area_business_car_attendance()
 {
 }
 
+void area_business_car_attendance::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)
+{
+
+}
 
 //记录进入时间等信息,结束考勤,根据离开的时间和距离,判断是否记录一条新的考勤记录
 void area_business_car_attendance::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
@@ -79,7 +84,9 @@ void area_business_car_attendance::on_leave(const std::shared_ptr<area_hover>&ar
     {
         //考勤开始
         mine_tool_ptr->m_is_attendance = true;
-        mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
+        //mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
+        mine_tool_ptr->m_attendance_start_time=
+                std::chrono::system_clock::time_point(std::chrono::milliseconds(area_hover_ptr->m_last_time));
 
         //作为一条开始考勤记录保存到数据库
         db_tool::save_attendance(card_ptr, area_hover_ptr);

+ 3 - 0
module_service/area_business_car_attendance.h

@@ -15,6 +15,9 @@ public:
     {
         return 6;
     }
+
+    void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
+
     //记录进入时间等信息,结束考勤,根据离开的时间和距离,判断是否记录一条新的考勤记录
     void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
     void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);

+ 6 - 0
module_service/area_business_card_enter_or_leave.cpp

@@ -7,6 +7,12 @@
 #include"log.h"
 
 
+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)
+{
+
+}
+
 //进入区域则入库操作
 void area_business_card_enter_or_leave::on_enter(const std::shared_ptr<area_hover>&a,
                                                  const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)

+ 2 - 0
module_service/area_business_card_enter_or_leave.h

@@ -10,6 +10,8 @@ struct area_business_card_enter_or_leave:area_business
 		return 9;
 	}
 
+    void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
+
 	//进入区域则入库操作
 	void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
 	void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);

+ 1 - 0
module_service/area_business_forbid.h

@@ -10,6 +10,7 @@ public:
     {
         return 7;
     }
+
     //记录进入时间等信息,生成告警
     void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
     void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);

+ 6 - 0
module_service/area_business_geofault.cpp

@@ -31,6 +31,12 @@ struct geofault_data:business_data
 std::unordered_map<int, std::vector<point>> area_business_geofault::_area_geofault_map;
 int area_business_geofault::_geofault_count_limit;
 
+void area_business_geofault::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)
+{
+    on_enter(area_hover_ptr, card_ptr, ptr);
+}
+
 void area_business_geofault::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
                                       const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>& ptr)
 {

+ 2 - 0
module_service/area_business_geofault.h

@@ -26,6 +26,8 @@ public:
         return 11;
     }
 
+    void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
+
     void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
     void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
     void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);

+ 6 - 0
module_service/area_business_motionless_persion.cpp

@@ -37,6 +37,12 @@ void area_business_motionless_persion::init(config_file& config)
     //        _acc_seconds_limit = std::stoi(config.get("service.motionless_acc_seconds_limit","120"));
 }
 
+void area_business_motionless_persion::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)
+{
+    on_enter(area_hover_ptr, card_ptr, ptr);
+}
+
 void area_business_motionless_persion::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
                                                 const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
 {

+ 2 - 0
module_service/area_business_motionless_persion.h

@@ -47,6 +47,8 @@ public:
     }
     static void init(config_file& config);
 
+    void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
+
     void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
     void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
     void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);

+ 8 - 1
module_service/area_business_person_attendance.cpp

@@ -29,6 +29,11 @@ area_business_person_attendance::area_business_person_attendance()
 {
 }
 
+void area_business_person_attendance::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)
+{
+
+}
 
 //记录进入时间等信息,结束考勤,根据离开的时间和距离,判断是否记录一条新的考勤记录
 void area_business_person_attendance::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
@@ -44,7 +49,9 @@ void area_business_person_attendance::on_enter(const std::shared_ptr<area_hover>
     {
         //考勤开始
         mine_tool_ptr->m_is_attendance=true;
-        mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
+        //mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
+        mine_tool_ptr->m_attendance_start_time=
+                std::chrono::system_clock::time_point(std::chrono::milliseconds(area_hover_ptr->m_enter_time));
 
         //作为一条开始考勤记录保存到数据库
         db_tool::save_attendance(card_ptr, area_hover_ptr);

+ 2 - 0
module_service/area_business_person_attendance.h

@@ -16,6 +16,8 @@ struct area_business_person_attendance:area_business
         return 5;
     }
 
+    void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
+
     //记录进入时间等信息,开始考勤
     void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
 

+ 6 - 0
module_service/area_business_speed_checker.cpp

@@ -29,6 +29,12 @@ area_business_speed_checker::area_business_speed_checker()
 {
 }
 
+void area_business_speed_checker::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)
+{
+    on_enter(area_hover_ptr, card_ptr, ptr);
+}
+
 void area_business_speed_checker::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
                                            const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
 {

+ 2 - 0
module_service/area_business_speed_checker.h

@@ -14,6 +14,8 @@ public:
         return 4;
     }
 
+    void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
+
     void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
     void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
     void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);

+ 8 - 2
module_service/area_business_work_rate.cpp

@@ -18,6 +18,12 @@ struct work_rate_data:business_data
     }
 };
 
+void area_business_work_rate::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)
+{
+
+}
+
 void area_business_work_rate::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
                                        const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>& ptr)
 {
@@ -35,7 +41,7 @@ void area_business_work_rate::on_enter(const std::shared_ptr<area_hover>&area_ho
     auto area = std::make_shared<area_data>();
     area->area_id = area_hover_ptr->id();
     area->is_work_area = area_hover_ptr->m_area->m_is_work_area;
-    area->enter_time = tool_time::now_to_seconds();
+    area->enter_time = area_hover_ptr->m_enter_time/1000;
 
     three_rates::get_instance()->enter_area(card, area);
 }
@@ -63,7 +69,7 @@ void area_business_work_rate::on_leave(const std::shared_ptr<area_hover>&area_ho
     auto area = std::make_shared<area_data>();
     area->area_id = area_hover_ptr->id();
     area->is_work_area = area_hover_ptr->m_area->m_is_work_area;
-    area->leave_time = tool_time::now_to_seconds();
+    area->leave_time = area_hover_ptr->m_last_time/1000;
 
     three_rates::get_instance()->leave_area(card, area);
 }

+ 2 - 0
module_service/area_business_work_rate.h

@@ -14,6 +14,8 @@ public:
         return 12;
     }
 
+    void on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
+
     void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr);
     void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);
     void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr);

+ 76 - 71
net-service.cpp

@@ -47,83 +47,88 @@ void net_service::on_timer()
 
 void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t len)
 {
-	logn_bin(1,clt->name().c_str(),data,len);//输出二进制日志
-
-	zistream is(data,len-2);
-	uint16_t cmd;
-	is>>skip(2)>>cmd;
-	switch(cmd)
+	try
 	{
-		case CHAR_LOCATEDATA_TOF_EXTEND://tof-扩展
-			{
-				uint32_t site_id;
-				uint8_t  power;
-				is>>site_id>>skip(11)>>power;
-                auto site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
-                if(!site_ptr)
-                {
-                    log_error("在全局分站列表中找不到分站:分站id=%d", site_id);
-                    break;
-                }
-                site_ptr->set_client(clt);
-                site_ptr->on_power_status((power&1)==0);
-
-				struct timeval tv;
-				gettimeofday(&tv,NULL);
-				uint64_t t = tv.tv_sec*1000 + tv.tv_usec/1000;
-				int index=0;
-				while(!is.eof())
+		zistream is(data,len-2);
+		uint16_t cmd;
+		is>>skip(2)>>cmd;
+		switch(cmd)
+		{
+			case CHAR_LOCATEDATA_TOF_EXTEND://tof-扩展
 				{
-					uint64_t tstamp = t -1000 + 50 + index* 45;
-					index++;
-					task*t=task::alloc<message_locinfo>();
-					message_locinfo&m=t->body<message_locinfo>();
-					m.load(is,false);
-					m.m_time_stamp=tstamp;
-					m.m_site_id=site_id;
-					//t_site->m_site_data = 0;
+					uint32_t site_id;
+					uint8_t  power;
+					is>>site_id>>skip(11)>>power;
+					auto site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
+					if(!site_ptr)
+					{
+						log_error("在全局分站列表中找不到分站:分站id=%d", site_id);
+						break;
+					}
+					site_ptr->set_client(clt);
+					site_ptr->on_power_status((power&1)==0);
 
-					t->m_cmd_code=cmd;
-					t->m_hash_id=m.m_card_id;
-					m_loc_worker->request(t);
-					if(m.m_card_type==5)
-						mine_business::inst()->make_reverse_condition(m.m_card_type,m.m_card_id,m.m_ant_id,m.m_card_ct,m.m_tof,m.m_site_id);
+					struct timeval tv;
+					gettimeofday(&tv,NULL);
+					uint64_t t = tv.tv_sec*1000 + tv.tv_usec/1000;
+					int index=0;
+					while(!is.eof())
+					{
+						uint64_t tstamp = t -1000 + 50 + index* 45;
+						index++;
+						task*t=task::alloc<message_locinfo>();
+						message_locinfo&m=t->body<message_locinfo>();
+						m.load(is,false);
+						m.m_time_stamp=tstamp;
+						m.m_site_id=site_id;
+						//t_site->m_site_data = 0;
+
+						t->m_cmd_code=cmd;
+						t->m_hash_id=m.m_card_id;
+						m_loc_worker->request(t);
+						if(m.m_card_type==5)
+							mine_business::inst()->make_reverse_condition(m.m_card_type,m.m_card_id,m.m_ant_id,m.m_card_ct,m.m_tof,m.m_site_id);
+					}
+				}
+				break;
+			case CHAR_LOCATEDATA_TDOA_EXTEND://tdoa
+				{
+					uint32_t site_id;
+					is>>site_id>>skip(12);
+					while(!is.eof())
+					{
+						task*t=task::alloc<message_locinfo>();
+						message_locinfo&m=t->body<message_locinfo>();
+						m.load(is,true);
+						m.m_site_id=site_id;
+						t->m_cmd_code=cmd;
+						t->m_hash_id=m.m_card_id;
+						m_sync_worker->translate(m);
+						m_loc_worker->request(t);
+					}
 				}
-			}
-			break;
-		case CHAR_LOCATEDATA_TDOA_EXTEND://tdoa
-			{
-				uint32_t site_id;
-				is>>site_id>>skip(12);
-				while(!is.eof())
+				break;
+			case CHAR_TDOA_READER_SYNC_TIME://time sync
 				{
-					task*t=task::alloc<message_locinfo>();
-					message_locinfo&m=t->body<message_locinfo>();
-					m.load(is,true);
-					m.m_site_id=site_id;
-					t->m_cmd_code=cmd;
-					t->m_hash_id=m.m_card_id;
-					m_sync_worker->translate(m);
-					m_loc_worker->request(t);
+					message_tdoasync m;
+					m.load(is);
+					m_sync_worker->on_message(m);
 				}
-			}
-			break;
-		case CHAR_TDOA_READER_SYNC_TIME://time sync
-			{
-				message_tdoasync m;
-				m.load(is);
-				m_sync_worker->on_message(m);
-			}
-			//site_message::on_sync(this,t.m_param1);
-			break;
-		case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
-		case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
-			break;
-		case CHAR_CTRL_READER_CMD://ctrl site message
-			break;
-		case CHAR_ADHOC://自组网数据
-			break;
+				//site_message::on_sync(this,t.m_param1);
+				break;
+			case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
+			case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
+				break;
+			case CHAR_CTRL_READER_CMD://ctrl site message
+				break;
+			case CHAR_ADHOC://自组网数据
+				break;
+		}
+	}
+	catch(const std::exception&e)
+	{
+		log_error("parse site message error,will close the connection:%s",clt->name().c_str());
+		clt->close();
 	}
 }
 
-

+ 17 - 2
znet.cpp

@@ -18,6 +18,8 @@
 #include <worker.h>
 
 #include "config_file.h"
+#include "crc.h"
+
 extern config_file config;
 struct client_ex:client
 {
@@ -332,10 +334,16 @@ struct sock_client:fd_io,client_ex
 			if(m_clen<msg_len)
 				break;
 
+			logn_bin(1,name().c_str(),m_b,msg_len);//输出二进制日志
 			if(check_crc(m_b,msg_len))
+			{
 				on_message(m_b,msg_len);
+			}
 			else
-				log_errno("check_crc_error.");
+			{
+				log_errno("check_crc_error,socket close... site=%s.",m_name.c_str());
+				return -1;
+			}
 
 			memmove(m_b,&m_b[msg_len],m_clen-msg_len);
 			m_clen-=msg_len;
@@ -431,7 +439,14 @@ struct sock_client:fd_io,client_ex
 
 	bool check_crc(const char*b,size_t mlen)
 	{
-		return true;
+		uint16_t crc=b[mlen-2];
+		crc<<=8;
+		crc|=b[mlen-1];
+
+		if(do_crc((unsigned char*)b,mlen)==crc)
+			return true;
+
+		return false;
 	}
 
 	void on_message(const char*m,int mlen)