Browse Source

车辆考勤

daiyueteng 6 years ago
parent
commit
14376d1669
2 changed files with 176 additions and 103 deletions
  1. 165 0
      module_service/module_attendance_vehicle.cpp
  2. 11 103
      module_service/module_attendance_vehicle.h

+ 165 - 0
module_service/module_attendance_vehicle.cpp

@@ -0,0 +1,165 @@
+#include "module_attendance_vehicle.h"
+
+#include<memory>
+#include<string>
+
+#include"area_business.h"
+#include"event.h"
+#include"log.h"
+#include"common_tool.h"
+#include"area.h"
+#include"db/db_api/CDBSingletonDefine.h"
+#include"db/db_tool.h"
+#include"mine.h"
+
+
+struct attendance_vehicle_data:business_data
+{
+    attendance_vehicle_data():m_is_attendance(false)
+      ,m_attendance_start_time(std::chrono::seconds(0))
+    {
+    }
+
+    ///考勤状态  0初始状态 1 没在考勤 2 考勤;参看ATTENDANCE_STATUS
+    bool m_is_attendance;
+    ///考勤开始时间
+    std::chrono::system_clock::time_point m_attendance_start_time;
+};
+
+void module_attendance_vehicle::on_enter(std::shared_ptr<card_location_base> card_ptr, int index)
+{
+    auto area_hover_ptr = card_ptr->get_area_hover();
+    if(!area_hover_ptr)
+    {
+        log_error("if(!area_hover_ptr)==true");
+        return;
+    }
+
+    area_hover_ptr->m_data[index] = std::make_shared<attendance_vehicle_data>();
+    auto ptr = static_cast<attendance_vehicle_data*>(area_hover_ptr->m_data[index].get());
+
+    ptr->m_is_attendance=true;
+    ptr->m_attendance_start_time=std::chrono::system_clock::now();
+
+    //作为一条开始考勤记录保存到数据库
+    db_tool::save_attendance(card_ptr, ptr->m_is_attendance, ptr->m_attendance_start_time);
+}
+
+void module_attendance_vehicle::on_hover(std::shared_ptr<card_location_base> card_ptr, int index)
+{
+}
+
+
+void module_attendance_vehicle::on_leave(std::shared_ptr<card_location_base> card_ptr, int index)
+{
+    auto area_hover_ptr = card_ptr->get_area_hover();
+    if(!area_hover_ptr)
+    {
+        log_error("if(!area_hover_ptr)==true");
+        return;
+    }
+
+    area_hover_ptr->m_data[index] = std::make_shared<attendance_vehicle_data>();
+    auto ptr = static_cast<attendance_vehicle_data*>(area_hover_ptr->m_data[index].get());
+
+    if(ptr->m_is_attendance)
+    {
+        ptr->m_is_attendance=false;
+        //作为一条开始考勤记录保存到数据库
+        db_tool::save_attendance(card_ptr, ptr->m_is_attendance, ptr->m_attendance_start_time);
+    }
+}
+
+void module_attendance_vehicle::on_enter(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<area_hover>&c)
+{
+    auto area_ptr = c->m_area;
+
+    //从考勤状态转换为结束考勤
+    if(is_not_attendance_area(area_ptr->m_id, card_ptr->get_vehicle_type_id()))
+    {
+        save_attendance(card_ptr, area_ptr);
+    }
+    else//没在考勤状态转换为考勤状态
+    {
+        auto mine_tool_ptr = card_ptr->get_mine_tool();
+        if(!mine_tool_ptr->is_attendance())
+        {
+            //考勤开始
+            mine_tool_ptr->m_stat_attendance=AS_ATTENDANCE;
+            mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
+
+            //作为一条开始考勤记录保存到数据库
+            db_tool::save_attendance(card_ptr);
+
+            log_info("车卡考勤开始:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
+                     card_ptr->m_id, card_ptr->m_type,
+                     area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
+        }
+    }
+}
+
+void module_attendance_vehicle::init_attendance_area_from_db()
+{
+    const char *sql = "select a.area_id, a.att_rule_id,  vt.vehicle_type_id \
+            from dat_att_rule_area a, dat_att_rule_vehicle_type  vt, dat_att_rule r\
+            where a.att_rule_id=vt.att_rule_id and a.att_rule_id=r.att_rule_id;";
+    std::string Error;
+    YADB::CDBResultSet DBRes;
+    sDBConnPool.Query(sql,DBRes,Error);
+    if(!Error.empty())
+        log_error("初始化attendance_area Error,%s",Error.c_str());
+    uint64_t nCount = DBRes.GetRecordCount( Error );
+    if(int64_t(nCount) <= 0)
+    {
+        log_error("初始化attendance_area Error,%s",Error.c_str());
+    }
+
+    log_info( "init_attendance_area_from_db. The record count=%ld\n", nCount );
+
+    m_map.clear();
+    while ( DBRes.GetNextRecod(Error) )
+    {
+        int area_id  = 0;
+        DBRes.GetField( "area_id",area_id, Error );
+
+        int att_rule_id  = 0;
+        DBRes.GetField( "att_rule_id",att_rule_id, Error );
+
+        int vehicle_type_id  = 0;
+        DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
+
+        m_map.insert(std::make_pair(to_list_id(area_id, vehicle_type_id), att_rule_id));
+    }
+}
+
+///area_ptr==nullptr 表示接收到 web的删除卡命令
+void module_attendance_vehicle::save_attendance(std::shared_ptr<card_location_base>& card_ptr, std::shared_ptr<area> area_ptr)
+{
+    auto mine_tool_ptr = card_ptr->get_mine_tool();
+    if(!mine_tool_ptr->is_attendance())
+    {
+        return;
+    }
+
+    //考勤结束
+    mine_tool_ptr->m_stat_attendance=AS_NOT_ATTENDANCE;
+
+    //作为一条结束考勤记录保存到数据库
+    db_tool::save_attendance(card_ptr);
+
+    if(area_ptr)
+    {
+        log_info("车卡考勤结束:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
+                 card_ptr->m_id, card_ptr->m_type,
+                 area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
+    }
+    else
+    {
+        log_info("收到web的删除卡命令,车卡考勤结束:卡id=%d,卡type=%d,stat_attendance=%d",
+                 card_ptr->m_id, card_ptr->m_type,mine_tool_ptr->m_stat_attendance);
+    }
+}
+
+
+
+

+ 11 - 103
module_service/module_attendance_vehicle.h

@@ -8,17 +8,11 @@
   *@date 2018-08-07
 */
 
-#include <memory>
-#include <mutex>
-#include <map>
-#include <string>
-#include <chrono>
-#include <vector>
-#include <set>
-#include "module_const.h"
-#include "common_tool.h"
-#include"module_meta_date_changed.h"
-#include "db_tool.h"
+#include<unordered_map>
+#include "module_singleton_base.h"
+#include "card.h"
+#include"area.h"
+
 
 /**
  * @brief 车辆进入某些特定区域,结束考勤;从特定区域进入其他区域,开始考勤, 单例
@@ -32,102 +26,16 @@ private:
     }
 
 public:
-    void on_enter(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<area_hover>&c)
-    {
-        auto area_ptr = c->m_area;
-
-        //从考勤状态转换为结束考勤
-        if(is_not_attendance_area(area_ptr->m_id, card_ptr->get_vehicle_type_id()))
-        {
-            save_attendance(card_ptr, area_ptr);
-        }
-        else//没在考勤状态转换为考勤状态
-        {
-            auto mine_tool_ptr = card_ptr->get_mine_tool();
-            if(!mine_tool_ptr->is_attendance())
-            {
-                //考勤开始
-                mine_tool_ptr->m_stat_attendance=AS_ATTENDANCE;
-                mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
-
-                //作为一条开始考勤记录保存到数据库
-                db_tool::save_attendance(card_ptr);
-
-                log_info("车卡考勤开始:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
-                          card_ptr->m_id, card_ptr->m_type,
-                          area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
-            }
-        }
-    }
-
-//    void on_hover(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
-//    {
-//    }
-
+    void on_enter(std::shared_ptr<card_location_base> card_ptr, int index);
+    void on_hover(std::shared_ptr<card_location_base> card_ptr, int index);
+    void on_leave(std::shared_ptr<card_location_base> card_ptr, int index);
 
-//    void on_leave(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
-//    {
-//    }
-
-    void init_attendance_area_from_db()
-    {
-        const char *sql = "select a.area_id, a.att_rule_id,  vt.vehicle_type_id \
-                from dat_att_rule_area a, dat_att_rule_vehicle_type  vt, dat_att_rule r\
-                where a.att_rule_id=vt.att_rule_id and a.att_rule_id=r.att_rule_id;";
-        std::string Error;
-        YADB::CDBResultSet DBRes;
-        sDBConnPool.Query(sql,DBRes,Error);
-        if(!Error.empty())
-            log_error("初始化attendance_area Error,%s",Error.c_str());
-        uint64_t nCount = DBRes.GetRecordCount( Error );
-        if (nCount > 0)
-        {
-            log_info( "init_attendance_area_from_db. The record count=%ld\n", nCount );
+    void on_enter(std::shared_ptr<card_location_base> card_ptr, std::shared_ptr<area_hover>&c);
 
-            m_map.clear();
-            while ( DBRes.GetNextRecod(Error) )
-            {
-                int area_id  = 0;
-                DBRes.GetField( "area_id",area_id, Error );
-
-                int att_rule_id  = 0;
-                DBRes.GetField( "att_rule_id",att_rule_id, Error );
-
-                int vehicle_type_id  = 0;
-                DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
-
-                m_map.insert(std::make_pair(to_list_id(area_id, vehicle_type_id), att_rule_id));
-            }
-        }
-    }
+    void init_attendance_area_from_db();
 
     ///area_ptr==nullptr 表示接收到 web的删除卡命令
-    static void save_attendance(std::shared_ptr<card_location_base>& card_ptr, std::shared_ptr<area> area_ptr)
-    {
-        auto mine_tool_ptr = card_ptr->get_mine_tool();
-        if(!mine_tool_ptr->is_attendance())
-        {
-            return;
-        }
-
-        //考勤结束
-        mine_tool_ptr->m_stat_attendance=AS_NOT_ATTENDANCE;
-
-        //作为一条结束考勤记录保存到数据库
-        db_tool::save_attendance(card_ptr);
-
-        if(area_ptr)
-        {
-            log_info("车卡考勤结束:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
-                      card_ptr->m_id, card_ptr->m_type,
-                      area_ptr->m_id,mine_tool_ptr->m_stat_attendance);
-        }
-        else
-        {
-            log_info("收到web的删除卡命令,车卡考勤结束:卡id=%d,卡type=%d,stat_attendance=%d",
-                      card_ptr->m_id, card_ptr->m_type,mine_tool_ptr->m_stat_attendance);
-        }
-    }
+    static void save_attendance(std::shared_ptr<card_location_base>& card_ptr, std::shared_ptr<area> area_ptr);
 
 private:
     bool is_not_attendance_area(int area_id, int vehicle_type_id)