123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- #ifndef MODULE_ATTENDANCE_VEHICLE_H
- #define MODULE_ATTENDANCE_VEHICLE_H
- /**
- *@brief 车辆考勤模块
- *车辆进入某些特定区域,结束考勤;从特定区域进入其他区域,开始考勤
- *@author 戴月腾
- *@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"
- /**
- * @brief 车辆进入某些特定区域,结束考勤;从特定区域进入其他区域,开始考勤, 单例
- */
- class module_attendance_vehicle:public singleton_base<module_attendance_vehicle>
- {
- private:
- friend class singleton_base<module_attendance_vehicle>;
- module_attendance_vehicle()
- {
- }
- 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();
- //作为一条开始考勤记录保存到数据库
- tool_db::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_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 );
- 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的删除卡命令
- 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;
- //作为一条结束考勤记录保存到数据库
- tool_db::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);
- }
- }
- private:
- bool is_not_attendance_area(int area_id, int vehicle_type_id)
- {
- return m_map.end() != m_map.find(to_list_id(area_id, vehicle_type_id));
- }
- uint64_t to_list_id(int area_id, int vehicle_type_id)
- {
- return (static_cast<uint64_t>(area_id)<<32) | static_cast<uint64_t>(vehicle_type_id);
- }
- ///area_id<<32| vehicle_type_id; att_rule_id
- std::unordered_map<uint64_t, int> m_map;
- };
- #endif // MODULE_ATTENDANCE_VEHICLE_H
|