Bläddra i källkod

将area_business修改为非共享指针返回

zzj 6 år sedan
förälder
incheckning
d52334c65a

+ 5 - 6
Makefile.am

@@ -9,16 +9,15 @@ SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp card_area.cpp card_base.c
     	  card.cpp card_message_handle.cpp cardMgr.cpp card_path.cpp card_person.cpp crc.cpp geo_hash.cpp \
 		  landmark.cpp line_fit.cpp loc_point.cpp loc_tool.cpp message.cpp message_file.cpp mine.cpp \
 		  net-service.cpp point.cpp select_tool.cpp site_area.cpp special_area.cpp tdoa_sync.cpp visit.cpp \
-		  web-client.cpp worker.cpp ya_event.cpp znet.cpp 
+		  web-client.cpp worker.cpp ya_event.cpp znet.cpp ya_setting.cpp area_business.cpp
 
+SRC_MAIN_EVENT= mine_module/MineCardManager.cpp
 
-CXXFLAGS=-g
+AM_SOURCES=$(SRC_MONKEYCAR) $(SRC_MODULE_SERVICE) $(SRC_MAIN) $(SRC_MAIN_EVENT)
 
-AM_SOURCES=area_business.cpp $(SRC_MONKEYCAR) $(SRC_MODULE_SERVICE) $(SRC_MAIN)
+AM_CPPFLAGS=-Wall -pthread -m64 -g -std=c++11  -I${prefix}/include -I/usr/local/mysql/include -Iwebsocket -Iwebsocket/sio -I./db -I../dist/include -I../rapidjson/include
 
-AM_CPPFLAGS=-Wall -pthread -m64 -std=c++11  -I${prefix}/include -I/usr/local/mysql/include -Iwebsocket -Iwebsocket/sio -I./db 
-
-AM_LDFLAGS=-Wall -pthread -m64 -std=c++11  -L${prefix}/lib  -L/usr/local/mysql/lib
+AM_LDFLAGS=-Wall -pthread -m64 -g -std=c++11  -L${prefix}/lib  -L/usr/local/mysql/lib -L../dist/lib
 
 yals_SOURCES=${AM_SOURCES} main.cpp
 yals_CPPFLAGS=${AM_CPPFLAGS} 

+ 89 - 2
area.cpp

@@ -42,7 +42,7 @@ void area::on_hover(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_
 {
  	for(auto i:m_area_business_list)
 	{
-		i->on_hover(a,c,*a->get_business_data(i->business_type()));
+		i->on_hover(a,c,a->get_business_data(i->business_type()));
 	}
 }
 
@@ -60,7 +60,7 @@ void area::on_leave(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_
 	log_info("on_leave..%d  areaId:%d",c->m_id,m_id);
  	for(auto i:m_area_business_list)
 	{
-		i->on_leave(a,c,*a->get_business_data(i->business_type()));
+		i->on_leave(a,c,a->get_business_data(i->business_type()));
 	}
 }
 
@@ -375,12 +375,16 @@ void area_list::init_from_db(int id/*=-1*/)
               log_info("point:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
 
             map.insert({area_id,ap});
+
+            CheckAreaType(ap,area_type_id,0);
         }
         else
         {
             auto tmp_ptr = area_list::instance()->get(id);
             if(tmp_ptr)
             {
+                CheckAreaType(tmp_ptr,area_type_id,tmp_ptr->m_area_type);
+
                 tmp_ptr->update(over_count_person, over_time_person,scale,map_id,area_type_id,
                                 over_count_vehicle,over_time_vehicle);
                 tmp_ptr->m_bound=init_path(path);
@@ -398,6 +402,8 @@ void area_list::init_from_db(int id/*=-1*/)
                   log_info("point:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
 
                 area_list::instance()->add(id, ap);
+
+                CheckAreaType(ap,area_type_id,0);
             }
 
             log_info("基础数据 增加或修改区域成功:区域id:%d,over_count_person:%d over_time_person:%d,scale:%.2f,map_id:%d\
@@ -415,6 +421,87 @@ void area_list::init_from_db(int id/*=-1*/)
         init_monkeycar_area();
     }
 }
+
+
+//新画禁区功能-给禁区中的卡发送警告及呼叫
+void area_list::CheckAreaType(int area_id,int new_area_type,int old_area_type)
+{
+    auto area_ptr = area_list::instance()->get(area_id);
+    if (!area_ptr) {
+        log_info("区域已经删除:areaid=%d", area_id);
+        return;
+    }
+    CheckAreaType(area_ptr,new_area_type,old_area_type);
+}
+void area_list::CheckAreaType( std::shared_ptr<area> pArea,int new_area_type,int old_area_type)
+{
+    if (nullptr == pArea)
+    {
+        return ;
+    }
+    if (new_area_type != AREA_TYPE::AREA_TYPE_FORBIDDEN && old_area_type != AREA_TYPE::AREA_TYPE_FORBIDDEN)
+    {
+        return;
+    }
+
+    struct local_visit:visitor<std::shared_ptr<card_location_base>>
+    {
+        std::shared_ptr<area> m_area;
+        int m_old_area_type;
+        bool visit(std::shared_ptr<card_location_base> c)
+        {
+            //处理
+            point pt(c->x,c->y,c->z);
+            std::shared_ptr<area> point_area = area_list::instance()->get_area(pt);
+            if (point_area == nullptr)
+            {
+                return true;
+            }
+            //不在区域里
+            if (m_area->m_id != point_area->m_id)
+            {
+                return true;
+            }
+
+            if (m_area->m_area_type == AREA_TYPE::AREA_TYPE_FORBIDDEN)
+            {
+                //发送进入禁区的警告
+                //呼叫
+                std::shared_ptr<area_hover> _area_hover = c->get_area_hover();
+                if (nullptr != _area_hover)
+                {
+                    _area_hover->m_area = m_area;
+                    _area_hover->m_area->on_enter(_area_hover,c);
+                }
+            }
+            else
+            {
+                if (m_old_area_type == AREA_TYPE::AREA_TYPE_FORBIDDEN)
+                {
+                    //之前是禁区,改成非禁区
+                    //发送一个离开禁区的警告
+                    //停止呼叫
+                    std::shared_ptr<area_hover> _area_hover = c->get_area_hover();
+                    if (nullptr != _area_hover)
+                    {
+                        _area_hover->m_area->on_leave(_area_hover,c);
+                    }
+                }
+                else
+                {
+                    return  false;
+                }
+            }
+
+            return true;
+        }
+    };
+    local_visit lv;
+    lv.m_area = pArea;
+    lv.m_old_area_type = old_area_type;
+    card_list::instance()->accept(lv);
+}
+
 #if 0
 void area_list::init_from_db()
 {

+ 7 - 3
area.h

@@ -72,7 +72,7 @@ struct area
         m_limit_vehicle_second=limit_time_vehicle;
     }
 public:
-	std::vector<std::shared_ptr<area_business>> m_area_business_list;
+	std::vector<area_business*> m_area_business_list;
 public:
     std::vector<point> m_bound;
     //std::atomic<int> m_card_count;
@@ -121,6 +121,10 @@ struct area_list:single_base<area_list,int,std::shared_ptr<area>>
     void init_from_db(int id=-1);
     ///id=-1为初始化所有
     void init_monkeycar_area(int id=-1);
+private:
+    //禁区功能-给禁区中的卡发送警告及呼叫
+    void CheckAreaType(int area_id,int new_area_type,int old_area_type);
+    void CheckAreaType( std::shared_ptr<area> pArea,int new_area_type,int old_area_type);
 };
 
 struct area_hover
@@ -150,14 +154,14 @@ struct area_hover
         landmark_dis=0;
     }
 
-	std::shared_ptr<business_data>*get_business_data(int type)
+	std::shared_ptr<business_data> get_business_data(int type)
 	{
 		if(type>=(int)m_data.size())
 		{
 			m_data.resize(type+1);
 		}
 
-		return &m_data[type];
+		return m_data[type];
 	}
 
     int id()const

+ 71 - 13
area_business.cpp

@@ -3,6 +3,10 @@
 
 #include "card_base.h"
 #include "area_business.h"
+#include "area.h"
+#include "card.h"
+#include "ya_event.h"
+#include "module_service/module_call.h"
 
 struct area_business_factory
 {
@@ -10,7 +14,7 @@ struct area_business_factory
 	{
 	}
 
-	void regist(int type,std::shared_ptr<area_business> ab)
+	void regist(int type,area_business* ab)
 	{
 		if(type>=(int)m_check_list.size())
 		{
@@ -19,24 +23,27 @@ struct area_business_factory
 
 		assert(m_check_list[type]);
 
-		m_check_list[type]=ab;
+		m_check_list[type].reset(ab);
 	}
 
-	std::vector<std::shared_ptr<area_business>> get_check_list(int business_type)
+	std::vector<area_business*> get_check_list(int business_type)
 	{
-		std::vector<std::shared_ptr<area_business>> check_list;
-		for(int i=0,B=1;i<32;i++)
+		std::vector<area_business*> check_list;
+		for(int i=0;i<32;i++)
 		{
-			if((B&business_type)==0)
+			if(business_type==0)
+				break;
+
+			if((business_type&1)==0)
 				continue;
 
-			check_list.push_back(m_check_list[i]);
+			check_list.push_back(m_check_list[i].get());
 		}
 
-		return std::move(m_check_list);
+		return std::move(check_list);
 	}
 
-	std::vector<std::shared_ptr<area_business>> m_check_list;
+	std::vector<std::unique_ptr<area_business>> m_check_list;
 	static area_business_factory& instance()
 	{
 		static area_business_factory _instance;
@@ -111,13 +118,64 @@ struct area_business_restricted:area_business
 	//记录进入时间等信息,生成告警
 	virtual void on_enter(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> )
 	{
-	
+        a->m_enter_point = point(c->x,c->y,c->z);
+        a->m_last_point.set(0,0,0);
+        a->m_last_time = 0;
+        a->m_enter_time = time(nullptr);
+
+        // 发送警告
+        event_ptr evPtr = event_list::instance()->get_event_card(c->m_id,c->m_type,ET_CARD_AREA_FORBIDDEN_PERSON);
+        if (nullptr == evPtr)
+        {
+            event_ptr evPtr = event_list::create_event_card(c->m_id, c->m_type, ET_CARD_AREA_FORBIDDEN_PERSON);
+            event_list::instance()->copy_event(c, evPtr);
+            event_list::instance()->add(evPtr->get_list_id(), evPtr);
+        }
+        evPtr->m_limit_value = 0;
+        evPtr->m_cur_value = 0;
+        evPtr->m_is_display = false;
+        evPtr->m_status = EVENT_STATUS::ES_START ;
+        evPtr->m_cur_time = std::chrono::system_clock::now();
+
+        event_list::save_event(evPtr);
+
+        //呼叫
+        module_call::instance()->system_call_apoint(c->m_id,c->m_type);
 	}
 
 	//记录退出时间等信息
-	virtual void on_leave(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> )
+	virtual void on_leave(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 	{
-	}
+        a->m_last_point = point(c->x,c->y,c->z);
+        a->m_last_time = time(nullptr);
+
+        // 发送警告
+        int oldStatus = -1;
+        event_ptr evPtr = event_list::instance()->get_event_card(c->m_id,c->m_type,ET_CARD_AREA_FORBIDDEN_PERSON);
+        if (nullptr == evPtr)
+        {
+            event_ptr evPtr = event_list::create_event_card(c->m_id, c->m_type, ET_CARD_AREA_FORBIDDEN_PERSON);
+            event_list::instance()->copy_event(c, evPtr);
+            event_list::instance()->add(evPtr->get_list_id(), evPtr);
+            oldStatus = EVENT_STATUS::ES_END;
+        } else{
+            if (evPtr->m_status != EVENT_STATUS::ES_END)
+            {
+                oldStatus = EVENT_STATUS::ES_END;
+            }
+        }
+        evPtr->m_limit_value = 0;
+        evPtr->m_cur_value = 0;
+        evPtr->m_is_display = false;
+        evPtr->m_status = EVENT_STATUS::ES_END ;
+        evPtr->m_cur_time = std::chrono::system_clock::now();
+        if (oldStatus != -1)
+        {
+            event_list::save_event(evPtr);
+        }
+        //取消呼叫
+        module_call::instance()->system_cancel_call_apoint(c->m_id,c->m_type);
+    }
 };
 
 /*
@@ -241,7 +299,7 @@ struct area_business_person_dwell_checker:area_business
 };
 
 
-std::vector<std::shared_ptr<area_business>> area_business::get_instance_list(int business_type)
+std::vector<area_business*> area_business::get_instance_list(int business_type)
 {
 	return area_business_factory::instance().get_check_list(business_type);
 }

+ 1 - 1
area_business.h

@@ -17,7 +17,7 @@ struct area_business
 	virtual void on_hover(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
 	virtual void on_leave(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr){}
 
-	static std::vector<std::shared_ptr<area_business>> get_instance_list(int business_type);
+	static std::vector<area_business*> get_instance_list(int business_type);
 };
 #endif
 

+ 16 - 2
card.cpp

@@ -16,6 +16,7 @@
 #include "log.h"
 #include "area.h"
 #include "card.h"
+#include "mine_module/MineCardManager.h"
 
 
 extern config_file config;
@@ -121,8 +122,21 @@ void card_list::load_his_card_postion_from_db()
         {
             auto str = tool_time::to_str_ex( tool_time::to_ms(mine_tool_ptr->m_attendance_start_time));
             log_info("加载考勤,考勤开始时间: %s, 卡id=%d,卡type=%d", str.c_str(), card_ptr->m_id, card_ptr->m_type);
+
+            //还在考勤中表示,还在井下(初始化话数据)
+            if(card_ptr->is_person())
+            {
+                CMineCardManager::instance()->OnPersonDown(card_ptr,true);
+            }
+            if(card_ptr->is_vehicle())
+            {
+                CMineCardManager::instance()->OnVehicleDown(card_ptr,true);
+            }
         }
     }
+    //初始化后检查是否超员
+    CMineCardManager::instance()->OnPersonOvercrowdingWarning();
+    CMineCardManager::instance()->OnVehicleOvercrowdingWarning();
 
     auto area_map = area_list::instance()->m_map;
     for(auto&iter: area_map)
@@ -269,11 +283,11 @@ void card_list::load_his_card_postion_staff()
     YADB::CDBResultSet DBRes;
     sDBConnPool.Query(sql,DBRes,Error);
     if(!Error.empty())
-        log_error("load_his_card_postion_vehicle列表 Error,%s",Error.c_str());
+        log_error("load_his_card_postion_staff列表 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 );
+        log_info( "load_his_card_postion_staff. The record count=%ld\n", nCount );
 
         while ( DBRes.GetNextRecod(Error) )
         {

+ 8 - 0
card_base.h

@@ -25,6 +25,14 @@ struct site;
 
 namespace YA{struct _CARD_POS_;}
 
+//m_is_attendance 井上井下状态  0初始状态 1 井上 2 井下 
+enum EAttendanceState
+{
+	 Init 	  = 0,	//0初始状态
+	 MineUp   = 1,	//井上
+	 MineDown = 2	//井下
+};
+
 struct card:point
 {
 	card(uint32_t id,uint16_t dis,uint64_t type,int32_t deptid,int32_t level_id,uint32_t cid)

+ 5 - 1
card_person.cpp

@@ -14,6 +14,7 @@
 #include "monkey_car/monkeycar_person.h"
 #include "websocket/ws_common.h"
 #include "ya_event.h"
+
 person::person(const std::string &type,uint32_t cardid,uint16_t needdisplay,int16_t t,int32_t deptid,int32_t level_id,uint32_t cid,int wl,const std::string &sname,const std::string &dname)
 	:card_location_base(type,cardid,needdisplay,t,deptid,level_id,cid)
 	,m_workLine(wl)
@@ -113,7 +114,10 @@ void person::handle_three_rates(const point & pt)
 }
 
 void person::on_timer()
-{    
+{
+	//人员井下超时
+    m_mine_tool->on_check_overtime(this->m_id,this->m_type);
+
 	if(!m_mine_tool->is_attendance())
 		return;
 	YA::_CARD_POS_ cp;

+ 24 - 17
db/db_api/CDBConnPool.cpp

@@ -65,15 +65,20 @@ namespace YADB
 		}
 
 		__Setting = Setting;
-		for ( int i = 0; i < __Setting.PoolSize; i++ )
+		//检查连接池中是否已有连接数量
+		if ((int)__IdleConnList.size() < __Setting.PoolSize)
 		{
-			CDBConnect* pConn = __CreateIdleConn( szError );
-			if ( !pConn )
+			for ( int i = 0; i < __Setting.PoolSize; i++ )
 			{
-				return false;
-			}
+				CDBConnect* pConn = __CreateIdleConn( szError );
+				if ( !pConn )
+				{
+					return false;
+				}
+			}	
 		}
-		if (bAsync)
+		// 是否已创建异步线程
+		if (bAsync || !__Running)
 		{
 			//创建异步执行线程
 			__CreateAsyncThrdConn();
@@ -141,7 +146,7 @@ namespace YADB
 					return 0;
 				}
 
-				__IdleConnList.pop_front();				//zzj, ERROR!!,应该是pop_back吧
+				__IdleConnList.pop_front();
 				__BusyConnList.push_back( pConn );
 			}
 			else
@@ -151,7 +156,7 @@ namespace YADB
 			}
 		}
 
-		//验证看数据库连接是否还有效 //zzj, 新建的链接不需要测试
+		//验证看数据库连接是否还有效
 		if ( pConn )
 		{
 			if ( pConn->ConnctionTest( Error ) != 0 )
@@ -172,7 +177,6 @@ namespace YADB
 		return pConn;
 	}
 
-	//zzj, 建议使用栈展开的方式 自动回收
 	void CDBConnPool::GiveBack( CDBConnect * pConn )
 	{
 		std::unique_lock<std::mutex> lock( __mtx );
@@ -284,6 +288,7 @@ namespace YADB
 
 	void CDBConnPool::__StartAsyncThrd()
 	{
+		__Running = true;
 		boost::thread thrd( boost::bind( &CDBConnPool::_AsyncThreadFunc, this, this ) );
 		thrd.detach();
 	}
@@ -291,6 +296,8 @@ namespace YADB
 	void CDBConnPool::__CreateAsyncThrdConn()
 	{
 		std::string ConnErr;
+		//先断开之前的连接
+		this->__DestroyAsyncThrdConn();
 
 		_DB_CONN_SETTING_ ConnSetting = static_cast< _DB_CONN_SETTING_ >(__Setting);
 		CDBConnect* pConn = new CDBConnect();
@@ -327,7 +334,7 @@ namespace YADB
     }
 
     bool CDBConnPool::Query( const char *szSql, CDBResultSet& DBRes,std::string& Error )
-	{
+    {
 		CDBConnect *pConn = GetDBConnect( Error );
 		if ( 0 == pConn )
 		{
@@ -335,9 +342,9 @@ namespace YADB
 		}
 
 		MYSQL_RES* pRes = pConn->Query( szSql, Error );
-		GiveBack( pConn );
-		return DBRes.Bind( pRes, Error );
-	}
+	GiveBack( pConn );
+        return DBRes.Bind( pRes, Error );
+    }
     
     MYSQL_RES* CDBConnPool::Query( const char *szSql, std::string& Error)
     {
@@ -351,15 +358,15 @@ namespace YADB
         return pRes;
     }
     my_ulonglong CDBConnPool::ExecuteSql( const char *szSql, std::string& Error )
-	{
-		CDBConnect *pConn = GetDBConnect( Error );
+    {
+    	CDBConnect *pConn = GetDBConnect( Error );
 		if ( 0 == pConn )
 		{
 			return -1;
 		}
-		my_ulonglong nRet = pConn->ExecuteSql( szSql, Error );
+	my_ulonglong nRet = pConn->ExecuteSql( szSql, Error );
 		GiveBack( pConn );
 		return nRet;
 		//return pConn->ExecuteSql( szSql, Error );
-	}
+    }
 }

+ 1 - 1
db/db_api/CDBConnPool.h

@@ -44,7 +44,7 @@ namespace YADB
 		std::list<CDBConnect*> __IdleConnList;//没有使用的数据库连接列表
 		_DB_POOL_SETTING_ __Setting;//数据库连接池设置
 		std::mutex __mtx;//互斥量
-		boost::atomic<bool> __Running{ true };//线程是否运行的标识
+		boost::atomic<bool> __Running{ false };//线程是否运行的标识 默认未开启,等创建线程后开启
 		boost::atomic<bool> __IsExited{ false };//线程是否已退出的标识
 		CDBConnect* __pAsyncDBConn;//异步执行线程用的数据库连接
 	private:

+ 4 - 0
main.cpp

@@ -19,6 +19,7 @@
 #include <config_file.h>
 #include "three_rates.h"
 #include "main_test.h"
+#include "ya_setting.h"
 
 config_file config;
 static void handlereader(uint32_t readerid,bool duration,uint32_t t)
@@ -47,6 +48,9 @@ struct Init_Setting
         DBSetting.PoolSize = config.get("db.pool_size",30);
         _mysql_init(DBSetting);
 
+        //系统设置初始化
+        CYaSetting::Init_sys_setting();
+
         sit_list::instance()->load_from_db();
 
         card_list::instance()->init_card_from_db();

+ 21 - 12
mine.cpp

@@ -1,21 +1,30 @@
 #include "mine.h"
 #include <module_service/module_mine.h>
 #include "common_tool.h"
+#include "mine_module/MineCardManager.h"
 
 void mine_tool::on_point(uint32_t card_id, int32_t type, int vehicle_category_id)
 {
     module_mine::on_point(card_id, type, vehicle_category_id);
 }
-	uint64_t mine_tool::get_down_time()
-	{
-		return tool_time::to_ms(m_attendance_start_time);
-	}
-	uint64_t mine_tool::get_work_time()
-	{
-		return tool_time::elapse_ms(m_attendance_start_time)	;
-	}
-	int32_t mine_tool::is_on_duty()
-	{
-		return get_down_time()>tool_time::morning_of_today_ms();
-	}
+
+//检查井下超时
+void mine_tool::on_check_overtime(uint32_t card_id, int32_t type)
+{
+	CMineCardManager::instance()->OnPersonInMineOverTime(card_id,type);
+
+}
+
+uint64_t mine_tool::get_down_time()
+{
+	return tool_time::to_ms(m_attendance_start_time);
+}
+uint64_t mine_tool::get_work_time()
+{
+	return tool_time::elapse_ms(m_attendance_start_time)	;
+}
+int32_t mine_tool::is_on_duty()
+{
+	return get_down_time()>tool_time::morning_of_today_ms();
+}
 

+ 12 - 0
mine.h

@@ -11,6 +11,9 @@
 #include <log.h>
 #include <chrono>
 #include "common.h"
+#include <memory>
+
+struct card_location_base;
 struct mine_tool
 {
     mine_tool()
@@ -19,6 +22,8 @@ struct mine_tool
 		,m_status_call(0)
 		,m_stat_attendance(AS_INIT)
 		,m_attendance_start_time(std::chrono::seconds(0))
+		,m_is_overtime(false)
+		,m_overtime(std::chrono::seconds(0))
     {
 
     }
@@ -32,8 +37,15 @@ struct mine_tool
     int m_stat_attendance;
     ///考勤开始时间
     std::chrono::system_clock::time_point m_attendance_start_time;
+    //井下是否超时
+    bool m_is_overtime;
+    //井下超时时间
+    std::chrono::system_clock::time_point m_overtime;
 
     void on_point(uint32_t card_id, int32_t type, int vehicle_category_id);
+
+    //检查井下超时
+    void on_check_overtime(uint32_t card_id, int32_t type);
 	uint64_t get_down_time();
 	uint64_t get_work_time();
 	int32_t is_on_duty();

+ 277 - 0
mine_module/MineCardManager.cpp

@@ -0,0 +1,277 @@
+#include "MineCardManager.h"
+#include "ya_setting.h"
+#include "common_tool.h"
+#include "mine.h"
+
+CMineCardManager::CMineCardManager()
+{
+    m_minecards = std::make_shared<mine_card_info>();
+}
+
+std::shared_ptr<mine_card_info> CMineCardManager::GetMineCards() 
+{
+    return m_minecards;
+}
+
+ /**
+     * @brief 获取事件ID
+     **/
+uint64_t CMineCardManager::GetMineEventId(int evType)
+{
+    return event_list::to_list_id(static_cast<EVENT_TYPE>(evType),OT_MINE,0,0);
+}
+
+bool CMineCardManager::Exist(SET_CARDID &list,uint64_t id)
+{
+    if (list.find(id) == list.end())
+    {
+        return false;
+    }
+    return true;
+}
+
+bool CMineCardManager::Exist(SET_CARDID &list,int card_id,int card_type)
+{
+    return Exist(list,tool_other::type_id_to_u64(card_type,card_id));
+}
+
+/**
+ * @brief 创建警告开始事件
+ * @param evType 警告类型
+ * @param limitVal 限制数据(阀门值)
+ * @param curVal 当前数据
+ **/
+void CMineCardManager::StartEvent(int evType,int limitVal,int curVal)
+{
+    int oldState = EVENT_STATUS::ES_END;
+    uint64_t evid = this->GetMineEventId(evType);
+    auto ev_ptr = event_list::instance()->get(evid);
+    if (nullptr != ev_ptr)
+    {
+        oldState = ev_ptr->m_status;
+    }
+    else
+    {
+        ev_ptr = event_list::instance()->create_event_mine(0,(EVENT_TYPE)evType);
+        if (nullptr == ev_ptr)
+        {
+            //打印日志
+            log_error("CMineCardManager::StartEvent: Create Event Fail.evid=%%llu evType=%d,evState=ES_START ",evid,evType);
+            return ;
+        }
+        ev_ptr->m_obj_id = "0";
+        event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr);
+    }
+    ev_ptr->m_status = EVENT_STATUS::ES_START;	
+    ev_ptr->m_cur_value= curVal;
+    ev_ptr->m_limit_value = limitVal;
+    ev_ptr->m_is_display = false;
+    ev_ptr->m_cur_time = std::chrono::system_clock::now();;
+    if (oldState == EVENT_STATUS::ES_END)
+    {
+        event_list::instance()->save_event(ev_ptr);
+    }
+    if (evType < MAX_MINE_EVENT_NUM)
+    {
+        m_evlist[evType] = evid;
+    }
+    log_info("CMineCardManager::StartEvent: Create Success .id=%%llu -%%llu  evType=%d,evState=ES_START ",evid,ev_ptr->get_list_id(),evType);
+}
+
+/**
+ * @brief 取消警告事件
+ * @param evType 警告类型
+ * @param curVal 当前数据
+ **/
+void CMineCardManager::CancelEvent(int evType,int curVal)
+{
+    uint64_t evid = this->GetMineEventId(evType);
+    auto ev_ptr = event_list::instance()->get(evid);
+    if (nullptr == ev_ptr)
+    {
+        //打印日志
+        log_errno("CMineCardManager::CancelEvent: Not Find Event.id=%%llu  evType=%d,evState=ES_END ",evid,evType);
+        return ;
+    }
+    if (ev_ptr->m_status == EVENT_STATUS::ES_END)
+    {
+        return ;
+    }
+    ev_ptr->m_status = EVENT_STATUS::ES_END;	
+    ev_ptr->m_cur_value= curVal;
+    ev_ptr->m_is_display = false;
+    ev_ptr->m_cur_time = std::chrono::system_clock::now();;
+    event_list::instance()->save_event(ev_ptr);
+    if (evType < MAX_MINE_EVENT_NUM)
+    {
+        m_evlist[evType] = 0;
+    }
+    log_info("CMineCardManager::CancelEvent: Success .id=%%llu  evType=%d,evState=ES_END ",evid,evType);
+}
+
+/**
+ * @brief 人员下井
+ * @param card 卡
+ **/
+void CMineCardManager::OnPersonDown(std::shared_ptr<card> card,bool bInit/* = false*/)
+{
+    if (nullptr == card)
+    {
+        return ;
+    }
+     //设置卡的状态
+    card->m_is_attendance = EAttendanceState::MineDown;
+   
+    uint64_t key = tool_other::type_id_to_u64(card->m_id,card->m_type);
+    if (this->Exist(m_minecards->m_down_person,key))
+    {
+        return ;
+    }   
+     //移除升井中的状态
+    m_minecards->m_up_person.erase(key);
+    //加入到井下列表中
+    m_minecards->m_down_person.insert(key);
+    if(!bInit)
+    {
+        //井下超员判断
+        this->OnPersonOvercrowdingWarning();
+    }
+}
+    /**
+ * @brief 人员升井
+ * @param card 卡
+ **/
+void CMineCardManager::OnPersonUp(std::shared_ptr<card> card)
+{
+    if (nullptr == card)
+    {
+        return ;
+    }
+    card->m_is_attendance = EAttendanceState::MineUp;
+    uint64_t key = tool_other::type_id_to_u64(card->m_id,card->m_type);
+    if (this->Exist(m_minecards->m_up_person,key))
+    {
+        return ;
+    }   
+     //移除井下列表
+    m_minecards->m_down_person.erase(key);
+    //加入到升井列表中
+    m_minecards->m_up_person.insert(key);
+    
+    int max_person = CYaSetting::m_sys_setting.over_count_person;
+    //井下超员判断--取消
+    if (max_person != 0 && (int)m_minecards->m_down_person.size() < max_person )
+    {
+        this->CancelEvent(EVENT_TYPE::ET_OVER_COUNT_PERSON,(int)m_minecards->m_down_person.size());
+    }
+    
+}
+
+/**
+ * @brief 人员超员警告
+**/
+void CMineCardManager::OnPersonOvercrowdingWarning()
+{
+    int max_person = CYaSetting::m_sys_setting.over_count_person;
+    //井下超员判断
+    if (max_person != 0 && (int)m_minecards->m_down_person.size() > max_person )
+    {
+        std::string log = "";
+        for (uint64_t id : m_minecards->m_down_person)
+        {
+            std::shared_ptr<card_location_base> pitcard = card_list::instance()->get(id);
+            if (nullptr != pitcard)
+            {
+                log += tool_other::type_id_to_str(pitcard->m_type,pitcard->m_id);
+                log += "&";
+            }
+        }
+        //打印日志
+        log_info("[lemon mp_card_list_down_person:]:%s",log.c_str());
+
+        this->StartEvent(EVENT_TYPE::ET_OVER_COUNT_PERSON,max_person,(int)m_minecards->m_down_person.size());
+    }
+}
+
+/**
+* @brief 人员井下超时
+**/
+void CMineCardManager::OnPersonInMineOverTime(int card_id,int card_type)
+{
+    std::shared_ptr<card_location_base> card = card_list::instance()->get(tool_other::type_id_to_u64(card_type, card_id));
+    if (nullptr == card)
+    {
+        return ;
+    }
+
+    std::shared_ptr<mine_tool> mine = card->get_mine_tool();
+    if(nullptr == mine )
+    {
+        return ;
+    }
+
+    int sec= tool_time::to_ms(std::chrono::system_clock::now()) - mine->get_work_time();
+    if (!mine->m_is_overtime && sec > (int)CYaSetting::m_sys_setting.over_time_person)
+    {
+        //人员超时
+        mine->m_is_overtime = true;
+        mine->m_overtime = std::chrono::system_clock::now();
+    }
+    else if (mine->m_is_overtime && sec < (int)CYaSetting::m_sys_setting.over_time_person)
+    {
+        mine->m_is_overtime = false;
+        mine->m_overtime = std::chrono::system_clock::now();
+    }
+    else
+    {
+        return ;
+    }
+
+    // 发送警告
+    event_ptr evPtr = event_list::instance()->get_event_card(card->m_id,card->m_type,ET_CARD_OVER_TIME_PERSON);
+    if (nullptr == evPtr)
+    {
+        event_ptr evPtr = event_list::create_event_card(card->m_id, card->m_type, ET_CARD_OVER_TIME_PERSON);
+        event_list::instance()->copy_event(card, evPtr);
+        event_list::instance()->add(evPtr->get_list_id(), evPtr);
+    }
+    evPtr->m_limit_value = 0;
+    evPtr->m_cur_value = 0;
+    evPtr->m_is_display = false;
+    evPtr->m_status = mine->m_is_overtime ? ES_START : ES_END;
+    evPtr->m_cur_time = std::chrono::system_clock::now();
+
+    event_list::save_event(evPtr);
+
+    log_info("OnPersonInMineOverTime: send Event=ET_CARD_OVER_TIME_PERSON card=id,eventState=%d",card->m_id,evPtr->m_status);
+}
+    /**
+ * @brief 车下井
+ * @param card 卡
+ **/
+void CMineCardManager::OnVehicleDown(std::shared_ptr<card> card,bool bInit/* = false*/)
+{
+    if (nullptr == card)
+    {
+        return ;
+    }
+}
+    /**
+ * @brief 车升井
+ * @param card 卡
+ **/
+void CMineCardManager::OnVehicleUp(std::shared_ptr<card> card)
+{
+    if (nullptr == card)
+    {
+        return ;
+    }
+}
+
+ /**
+ * @brief 车辆超员警告
+ **/
+void CMineCardManager::OnVehicleOvercrowdingWarning()
+{
+
+}

+ 92 - 0
mine_module/MineCardManager.h

@@ -0,0 +1,92 @@
+/*
+** 井中卡的数据:人员下井 ,人员升进,车下井升井数据
+** 对应的操作,井下人员超时,井下超员等
+*/
+#ifndef __MINECARDMANAGER_H
+#define __MINECARDMANAGER_H
+
+#include "minestruct.h"
+#include "card.h"
+#include "module_service/module_const.h"
+
+//井下警告类型数量
+#define MAX_MINE_EVENT_NUM 3
+
+class CMineCardManager : public singleton_base<CMineCardManager>
+{
+private:
+    friend class singleton_base<CMineCardManager>;
+    CMineCardManager();
+
+private:
+    std::shared_ptr<mine_card_info> m_minecards;
+
+    //井下警告列表ID(下标为实践类型)
+    uint64_t m_evlist[MAX_MINE_EVENT_NUM];
+private:
+    /**
+     * @brief 获取事件ID
+     **/
+    uint64_t GetMineEventId(int evType);
+    /**
+     * @brief 判断是否已存在
+     **/
+    bool Exist(SET_CARDID &list,uint64_t id);
+    bool Exist(SET_CARDID &list,int card_id,int card_type);
+     /**
+     * @brief 创建警告事件
+     * @param evType 警告类型
+     * @param limitVal 限制数据(阀门值)
+     * @param curVal 当前数据
+     **/
+    void StartEvent(int evType,int limitVal,int curVal);
+    /**
+     * @brief 取消警告事件
+     * @param evType 警告类型
+     * @param curVal 当前数据
+     **/
+    void CancelEvent(int evType,int curVal);
+public:
+    //TODO: 获取信息
+    std::shared_ptr<mine_card_info> GetMineCards() ;
+    /**
+     * @brief 人员下井,超员警告
+     * @param card 卡
+     * @param bInit 是否初始化(程序启动加载井下人员)
+     **/
+    void OnPersonDown(std::shared_ptr<card> card,bool bInit = false);
+     /**
+     * @brief 人员升井,取消超员警告
+     * @param card 卡
+     **/
+    void OnPersonUp(std::shared_ptr<card> card);
+     /**
+     * @brief 人员超员警告
+     **/
+    void OnPersonOvercrowdingWarning();
+
+    /**
+     * @brief 人员井下超时
+     **/
+    void OnPersonInMineOverTime(int card_id,int card_type);
+public:
+     /**
+     * @brief 车下井 ,车辆超员警告
+     * @param card 卡
+     * @param bInit 是否初始化(程序启动加载井下车辆)
+     **/
+    void OnVehicleDown(std::shared_ptr<card> card,bool bInit = false);
+     /**
+     * @brief 车升井,车辆超员警告取消
+     * @param card 卡
+     **/
+    void OnVehicleUp(std::shared_ptr<card> card);
+    /**
+     * @brief 车辆超员警告
+     **/
+    void OnVehicleOvercrowdingWarning();
+
+
+};
+
+#endif //__MINECARDMANAGER_H

+ 16 - 0
mine_module/minestruct.h

@@ -0,0 +1,16 @@
+#pragma once
+
+#include <set>
+#include <stdint.h>
+
+// 卡在card_list的掩码由
+typedef std::set<uint64_t> SET_CARDID;
+
+struct mine_card_info
+{
+    SET_CARDID m_down_vehicle; // 井下车辆
+    SET_CARDID m_up_vehicle; // 升井车辆
+	SET_CARDID m_down_person;  // 井下人员
+	SET_CARDID m_up_person; // 升井人员
+	SET_CARDID m_down_adhoc;   //井下自组网卡
+};

+ 9 - 0
module_service/module_attendance_person.h

@@ -22,6 +22,7 @@
 #include"module_const.h"
 #include"module_area.h"
 #include "module_meta_date_changed.h"
+#include "mine_module/MineCardManager.h"
 
 /**
  * @brief 主要是针对人卡进行考勤,人卡从井上切换到井下为考勤开始,人卡从井下切换到井上为考勤结束
@@ -46,6 +47,8 @@ public:
         if(site_ptr->is_up_site())
         {
             up_mine(card_ptr, site_ptr);
+            //检查井下是否超员--是否需要取消
+            CMineCardManager::instance()->OnPersonUp(card_ptr);
         }
         else// 从井上切换到井下为考勤开始
         {
@@ -64,6 +67,9 @@ public:
                          card_ptr->m_id, card_ptr->m_type,
                          site_ptr->m_id,site_ptr->m_reader_type_id,mine_tool_ptr->m_stat_attendance);
             }
+
+            //检查井下是否超员
+            CMineCardManager::instance()->OnPersonDown(card_ptr);
         }
     }
 
@@ -168,6 +174,9 @@ public:
                     db_tool::save_attendance(card_ptr);
                 }
 
+                //检查井下是否超员--是否需要取消
+                CMineCardManager::instance()->OnPersonUp(card_ptr);
+
                 auto area_hover_ptr = card_ptr->get_area_hover();
                 if(area_hover_ptr && 0!=area_hover_ptr->id() && 0!=area_hover_ptr->mapid())
                 {

+ 93 - 0
module_service/module_call.cpp

@@ -536,3 +536,96 @@ void module_call::get_user_all_call_cards(call_user_ptr& user_ptr,
 }
 
 
+/**
+* @brief 系统自动发送呼叫给指定的卡
+*/
+void module_call::system_call_apoint(int card_id,int card_type)
+{
+    int call_type = -1, call_level = -1, call_time_interval=-1;
+    uint32_t call_time_out = 0;
+    std::string user_name = "system_apoint";
+
+    std::vector<call_card_ptr> result_arr;//结果集
+
+    call_user_ptr user_ptr;
+    std::lock_guard<std::mutex> lock(_mutex);
+    auto user_map_ptr = _map.find(user_name);
+    if(_map.end() == user_map_ptr)//没有这个用户就新建并加入
+    {
+        user_ptr=call_user_ptr(new call_user());
+        _map[user_name]=user_ptr;
+    }
+    else//有这个用户
+    {
+        user_ptr=user_map_ptr->second;
+    }
+
+    //更新用户信息
+    user_ptr->call_time=std::chrono::system_clock::now();
+    user_ptr->call_time_out=call_time_out;
+    user_ptr->call_time_interval = call_time_interval;
+    user_ptr->call_type_id=call_type;
+    user_ptr->call_level_id=call_level;
+    user_ptr->user_name=user_name;
+
+    call_card_ptr c_card_ptr(new call_card());
+    c_card_ptr->cardid = card_id;
+    c_card_ptr->cardtype = card_type;
+    copy(user_ptr, c_card_ptr);
+    c_card_ptr->call_state = CALL_ING;
+
+    user_ptr->cards[c_card_ptr->cardid]=c_card_ptr;
+
+    for(auto& it:user_ptr->cards)//添加到结果集中
+    {
+        result_arr.push_back(it.second);
+    }
+    log_info("发起呼叫 cardid=%d, cardtype=%d", card_id,card_type);
+
+    //组装json发送给web
+    response_accept_call(result_arr);
+}
+/**
+ * @brief 系统自动发送呼叫给指定的卡
+ */
+void module_call::system_cancel_call_apoint(int card_id,int card_type)
+{
+    int call_type = -1;//, call_level = -1;
+    std::string user_name = "system_apoint";
+    int64_t call_time;
+
+    call_user_ptr result_user_ptr(new call_user());
+    result_user_ptr->call_type_id=call_type;
+    //    result_user_ptr->call_level_id=call_level;
+    result_user_ptr->call_time = std::chrono::system_clock::time_point(std::chrono::milliseconds(call_time));
+    result_user_ptr->user_name=user_name;
+
+    std::lock_guard<std::mutex> lock(_mutex);
+
+    call_user_ptr user_ptr(new call_user());
+    auto it_map = _map.find(user_name);
+    if(_map.end()!=it_map)//呼叫用户
+    {
+        user_ptr=it_map->second;
+    }
+    if (user_ptr->cards.find(card_id) == user_ptr->cards.end())
+    {
+        return ;
+    }
+    call_card_ptr c_card_ptr(new call_card());
+    c_card_ptr->cardid = card_id;
+    c_card_ptr->cardtype = card_type;
+
+    result_user_ptr->cards[c_card_ptr->cardid]=c_card_ptr;//增加到结果集中
+
+    user_ptr->cards.erase(c_card_ptr->cardid);//删除这个卡
+
+    log_info("取消呼叫: cardid=%d, cardtype=%d", card_id,card_type);
+    // 没有呼叫信息,删除该用户记录
+    if(user_ptr->cards.empty())
+    {
+        _map.erase(user_name);
+    }
+
+    response_accept_cancel(result_user_ptr);
+}

+ 9 - 0
module_service/module_call.h

@@ -193,7 +193,16 @@ public:
     std::string accept_login();
 
     void rev_from_card_resp(std::shared_ptr<card_location_base> card_ptr);
+
+    /**
+     * @brief 系统自动发送呼叫给指定的卡
+     */
+    void system_call_apoint(int card_id,int card_type);
     /**
+     * @brief 系统自动发送呼叫给指定的卡
+     */
+    void system_cancel_call_apoint(int card_id,int card_type);
+    /**int card_id,int card_type
      * @brief
      */
     void init(config_file& config)

+ 258 - 0
module_service/module_meta_date_changed.cpp

@@ -4,6 +4,122 @@
 #include"ant.h"
 
 
+///基础数据
+void module_meta_date_changed::accept(sio::message::ptr const& data)
+{
+    std::string name="";
+    if(!tool_map::try_get_value(name, JSON_KEY_NAME, data))
+    {
+        log_error("web发来的数据: 基础数据找不到name字段");
+        return;
+    }
+
+    std_debug("基础数据 receive meta_data_changed: %s", name.c_str());
+
+    int64_t id=-1;
+    tool_map::try_get_value(id, JSON_KEY_ID, data);
+
+    std::string op_type="";
+    tool_map::try_get_value(op_type, JSON_KEY_OP_TYPE, data);
+
+    if(-1 != id && !op_type.empty())
+    {
+        EDIT_TYPE_ID edit_type_id;
+        if(!try_get_edit_type_id(op_type, edit_type_id))
+        {
+            log_error("web发来的数据: 基础数据op_type字段错误:op_type=%s", op_type.c_str());
+            return;
+        }
+
+        if(JSON_KEY_NAME_VEHICLE == name || JSON_KEY_NAME_VEHICLE_EXTEND == name)
+        {
+            deal_call_edit_vehicle(id, edit_type_id);
+        }
+        else if(JSON_KEY_NAME_STAFF == name || JSON_KEY_NAME_STAFF_EXTEND == name)
+        {
+            deal_call_edit_staff(id, edit_type_id);
+        }
+        else if(JSON_KEY_NAME_CARD == name)
+        {
+            deal_call_edit_card(id, edit_type_id);
+        }
+        else if(JSON_KEY_NAME_AREA == name)
+        {
+            deal_call_edit_area(id, edit_type_id);
+        }
+        else if(JSON_KEY_NAME_READER == name)
+        {
+            deal_call_edit_reader(id, edit_type_id);
+        }
+        else if ("antenna" == name)
+        {
+            deal_call_edit_antenna(id,edit_type_id);
+        }
+        else if(JSON_KEY_NAME_PATH == name)
+        {
+            deal_call_edit_path(id, edit_type_id);
+        }
+        else if(JSON_KEY_NAME_MAP == name)
+        {
+            deal_call_edit_map(id, edit_type_id);
+        }
+        else if (JSON_KEY_NAME_LIGHT == name)
+        {
+            deal_call_edit_light(id,edit_type_id);///待实现
+        }
+        else if ("lights_group" == name)
+        {
+            deal_call_edit_lights_group(id,edit_type_id);///待实现
+        }
+        else
+        {
+            log_error("web发来的数据: 基础数据name字段错误:name=%s", name.c_str());
+        }
+    }
+    else
+    {
+        if(JSON_KEY_NAME_SETTING == name)
+        {
+            //阈值限制接口
+            init_setting(); ///待实现
+        }
+        else
+        {
+            log_error("web发来的数据: 基础数据name字段错误:name=%s", name.c_str());
+        }
+    }
+}
+
+///3.清除卡相关信息,区域相关,分站相关,考勤相关,清除定时器,
+///速度,状态 呼救 呼叫 告警相关。即保留基础信息,其他的重置。
+void module_meta_date_changed::clear_card(std::shared_ptr<card_location_base> card_ptr)
+{
+    //删除
+    card_ptr->del_card_pos();
+    // 升井 删除所有报警信息
+    for(int i=0; i < CARD_EVENT_COUNT_MAX; i++ )
+    {
+        if (i == EVENT_TYPE::ET_CARD_LOW_POWER_SERIOUS)
+        {
+            continue;
+        }
+
+        auto ev_ptr = event_list::instance()->get_event_card(
+                card_ptr->m_id, card_ptr->m_type, static_cast<EVENT_TYPE>(i));
+        if(ev_ptr && !ev_ptr->is_end()) //
+        {
+            event_list::copy_event(card_ptr, ev_ptr);
+
+            ev_ptr->m_status = ES_END;
+
+            event_list::save_event(ev_ptr);
+        }
+    }
+
+    card_ptr->clear();
+}
+
+
 void module_meta_date_changed::deal_call_edit_vehicle(int64_t id64, EDIT_TYPE_ID edit_type_id)
 {
     if(ET_INSERT == edit_type_id || ET_UPDATE == edit_type_id)
@@ -206,3 +322,145 @@ void module_meta_date_changed::remove_card(uint32_t id, int32_t type)
     card_list::instance()->remove(card_id);
     log_info("基础数据, 在全局列表中删除卡成功, id=%d, type=%d", id, type);
 }
+
+bool module_meta_date_changed::try_get_edit_type_id(const std::string& op_type, EDIT_TYPE_ID& out_edit_type_id)
+{
+    if(JSON_KEY_OP_TYPE_UPDATE == op_type)
+    {
+        out_edit_type_id = ET_UPDATE;
+    }
+    else if(JSON_KEY_OP_TYPE_DELETE == op_type)
+    {
+        out_edit_type_id = ET_DELETE;
+    }
+    else if(JSON_KEY_OP_TYPE_INSERT == op_type)
+    {
+        out_edit_type_id = ET_INSERT;
+    }
+    else
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool module_meta_date_changed::is_monkeycar_area(int area_id)
+{
+    char sql[1024] = {'\0'};
+    sprintf(sql,"select monkeycar_areaid from dat_monkeycar_base_info where monkeycar_areaid=%d;", area_id);
+    std::string Error;
+    YADB::CDBResultSet DBRes;
+    sDBConnPool.Query(sql,DBRes,Error);
+    int64_t nCount = DBRes.GetRecordCount( Error );
+
+    log_info("monkeycar_area区域查询:nCount=%d,sql=%s", nCount, sql);
+    std_debug("monkeycar_area区域查询:nCount=%d,sql=%s", nCount, sql);
+
+    return  (nCount > 0);
+}
+
+///删除区域所有报警信息
+void module_meta_date_changed::delete_area_event(std::shared_ptr<area> area_ptr)
+{
+    for(int i=0; i < CARD_EVENT_COUNT_MAX; i++ )
+    {
+        auto ev_ptr = event_list::instance()->get_event_area(area_ptr->id(), static_cast<EVENT_TYPE>(i));
+        if(ev_ptr && !ev_ptr->is_end()) //
+        {
+            event_list::copy_event(area_ptr, ev_ptr);
+
+            ev_ptr->m_status = ES_END;
+
+            event_list::save_event(ev_ptr);
+        }
+    }
+}
+
+void module_meta_date_changed::delete_antenna(int id)
+{
+    int sitid=-8;
+    auto map = sit_list::instance()->m_map;
+    for(auto&it:map)
+    {
+        auto sit_ptr = it.second;
+        if(sit_ptr->m_ant[0].m_id == id)
+        {
+            sitid=sit_ptr->m_id;
+            sit_ptr->delete_antenna(0);
+            break;
+        }
+        if(sit_ptr->m_ant[1].m_id == id)
+        {
+            sitid=sit_ptr->m_id;
+            sit_ptr->delete_antenna(1);
+            break;
+        }
+    }
+
+    if(sitid==-8)
+    {
+        std_debug("天线已经删除了,在分站列表中找不到该天线:天线id=%d", id);
+        log_info("天线已经删除了,在分站列表中找不到该天线:天线id=%d", id);
+    }
+    else
+    {
+        std_debug("删除天线成功:天线id=%d,分站id=%d", id, sitid);
+        log_info("删除天线成功:天线id=%d,分站id=%d", id, sitid);
+    }
+}
+
+bool module_meta_date_changed::is_cur_map(int id)
+{
+    return cur_map_id()==id;
+}
+
+int module_meta_date_changed::cur_map_id()
+{
+    auto tmp = area_list::instance()->m_map;
+    for(auto&it:tmp)
+    {
+        if(0!=it.second->m_mapid)
+        {
+            return it.second->m_mapid;
+        }
+    }
+
+    return -1;
+}
+
+void module_meta_date_changed::update_map_info(int id)
+{
+    std::string sql = "SELECT scale FROM dat_map WHERE map_id=";
+
+    sql.append(std::to_string(id));
+    sql.append(";");
+
+    std_debug("修改地图 sql=%s", sql.c_str());
+    log_info("修改地图 sql=%s", sql.c_str());
+
+    std::string Error;
+    YADB::CDBResultSet DBRes;
+    sDBConnPool.Query(sql.c_str(),DBRes,Error);
+    int nCount = DBRes.GetRecordCount( Error );
+    if (nCount < 1)
+    {
+        log_error("修改地图失败,数据库中找不到: map_id=%d", id);
+        return ;
+    }
+
+    double scale  = 0;
+    DBRes.GetField( "scale",scale, Error );
+
+    auto area = area_list::instance()->m_map;
+    for(auto& it : area)
+    {
+        it.second->m_scale = scale;
+    }
+
+    auto site = sit_list::instance()->m_map;
+    for(auto& it : site)
+    {
+        it.second->m_scale = scale;
+    }
+}

+ 9 - 243
module_service/module_meta_date_changed.h

@@ -34,119 +34,11 @@ private:
     ///'rules', 'drivingface_vehicle', 'dat_handup_vehicle', 'lights_binding'
 public:
     ///基础数据
-    void accept(sio::message::ptr const& data)
-    {
-        std::string name="";
-        if(!tool_map::try_get_value(name, JSON_KEY_NAME, data))
-        {
-            log_error("web发来的数据: 基础数据找不到name字段");
-            return;
-        }
-
-        std_debug("基础数据 receive meta_data_changed: %s", name.c_str());
-
-        int64_t id=-1;
-        tool_map::try_get_value(id, JSON_KEY_ID, data);
-
-        std::string op_type="";
-        tool_map::try_get_value(op_type, JSON_KEY_OP_TYPE, data);
-
-        if(-1 != id && !op_type.empty())
-        {
-            EDIT_TYPE_ID edit_type_id;
-            if(!try_get_edit_type_id(op_type, edit_type_id))
-            {
-                log_error("web发来的数据: 基础数据op_type字段错误:op_type=%s", op_type.c_str());
-                return;
-            }
-
-            if(JSON_KEY_NAME_VEHICLE == name || JSON_KEY_NAME_VEHICLE_EXTEND == name)
-            {
-                deal_call_edit_vehicle(id, edit_type_id);
-            }
-            else if(JSON_KEY_NAME_STAFF == name || JSON_KEY_NAME_STAFF_EXTEND == name)
-            {
-                deal_call_edit_staff(id, edit_type_id);
-            }
-            else if(JSON_KEY_NAME_CARD == name)
-            {
-                deal_call_edit_card(id, edit_type_id);
-            }
-            else if(JSON_KEY_NAME_AREA == name)
-            {
-                deal_call_edit_area(id, edit_type_id);
-            }
-            else if(JSON_KEY_NAME_READER == name)
-            {
-                deal_call_edit_reader(id, edit_type_id);
-            }
-            else if ("antenna" == name)
-            {
-                deal_call_edit_antenna(id,edit_type_id);
-            }
-            else if(JSON_KEY_NAME_PATH == name)
-            {
-                deal_call_edit_path(id, edit_type_id);
-            }
-            else if(JSON_KEY_NAME_MAP == name)
-            {
-                deal_call_edit_map(id, edit_type_id);
-            }
-            else if (JSON_KEY_NAME_LIGHT == name)
-            {
-                deal_call_edit_light(id,edit_type_id);///待实现
-            }
-            else if ("lights_group" == name)
-            {
-                deal_call_edit_lights_group(id,edit_type_id);///待实现
-            }
-            else
-            {
-                log_error("web发来的数据: 基础数据name字段错误:name=%s", name.c_str());
-            }
-        }
-        else
-        {
-            if(JSON_KEY_NAME_SETTING == name)
-            {
-                //阈值限制接口
-                init_setting(); ///待实现
-            }
-            else
-            {
-                log_error("web发来的数据: 基础数据name字段错误:name=%s", name.c_str());
-            }
-        }
-    }
+    void accept(sio::message::ptr const& data);
 
     ///3.清除卡相关信息,区域相关,分站相关,考勤相关,清除定时器,
     ///速度,状态 呼救 呼叫 告警相关。即保留基础信息,其他的重置。
-    static void clear_card(std::shared_ptr<card_location_base> card_ptr)
-    {
-        //删除
-        card_ptr->del_card_pos();
-        // 升井 删除所有报警信息
-        for(int i=0; i < CARD_EVENT_COUNT_MAX; i++ )
-        {
-            if (i == EVENT_TYPE::ET_CARD_LOW_POWER_SERIOUS)
-            {
-                continue;
-            }
-
-            auto ev_ptr = event_list::instance()->get_event_card(
-                        card_ptr->m_id, card_ptr->m_type, static_cast<EVENT_TYPE>(i));
-            if(ev_ptr && !ev_ptr->is_end()) //
-            {
-                event_list::copy_event(card_ptr, ev_ptr);
-
-                ev_ptr->m_status = ES_END;
-
-                event_list::save_event(ev_ptr);
-            }
-        }
-
-        card_ptr->clear();
-    }
+    static void clear_card(std::shared_ptr<card_location_base> card_ptr);
 
 private:
     ///id64格式为:10000001016
@@ -180,147 +72,21 @@ private:
 
     void remove_card(uint32_t id, int32_t type);
 
-    bool try_get_edit_type_id(const std::string& op_type, EDIT_TYPE_ID& out_edit_type_id)
-    {
-        if(JSON_KEY_OP_TYPE_UPDATE == op_type)
-        {
-            out_edit_type_id = ET_UPDATE;
-        }
-        else if(JSON_KEY_OP_TYPE_DELETE == op_type)
-        {
-            out_edit_type_id = ET_DELETE;
-        }
-        else if(JSON_KEY_OP_TYPE_INSERT == op_type)
-        {
-            out_edit_type_id = ET_INSERT;
-        }
-        else
-        {
-            return false;
-        }
-
-        return true;
-    }
-
-    bool is_monkeycar_area(int area_id)
-    {
-        char sql[1024] = {'\0'};
-        sprintf(sql,"select monkeycar_areaid from dat_monkeycar_base_info where monkeycar_areaid=%d;", area_id);
-        std::string Error;
-        YADB::CDBResultSet DBRes;
-        sDBConnPool.Query(sql,DBRes,Error);
-        int64_t nCount = DBRes.GetRecordCount( Error );
+    bool try_get_edit_type_id(const std::string& op_type, EDIT_TYPE_ID& out_edit_type_id);
 
-        log_info("monkeycar_area区域查询:nCount=%d,sql=%s", nCount, sql);
-        std_debug("monkeycar_area区域查询:nCount=%d,sql=%s", nCount, sql);
-
-        return  (nCount > 0);
-    }
+    bool is_monkeycar_area(int area_id);
 
     ///删除区域所有报警信息
-    static void delete_area_event(std::shared_ptr<area> area_ptr)
-    {
-        for(int i=0; i < CARD_EVENT_COUNT_MAX; i++ )
-        {
-            auto ev_ptr = event_list::instance()->get_event_area(area_ptr->id(), static_cast<EVENT_TYPE>(i));
-            if(ev_ptr && !ev_ptr->is_end()) //
-            {
-                event_list::copy_event(area_ptr, ev_ptr);
-
-                ev_ptr->m_status = ES_END;
+    static void delete_area_event(std::shared_ptr<area> area_ptr);
 
-                event_list::save_event(ev_ptr);
-            }
-        }
-    }
-
-    void delete_antenna(int id)
-    {
-        int sitid=-8;
-        auto map = sit_list::instance()->m_map;
-        for(auto&it:map)
-        {
-            auto sit_ptr = it.second;
-            if(sit_ptr->m_ant[0].m_id == id)
-            {
-                sitid=sit_ptr->m_id;
-                sit_ptr->delete_antenna(0);
-                break;
-            }
-            if(sit_ptr->m_ant[1].m_id == id)
-            {
-                sitid=sit_ptr->m_id;
-                sit_ptr->delete_antenna(1);
-                break;
-            }
-        }
+    void delete_antenna(int id);
 
-        if(sitid==-8)
-        {
-            std_debug("天线已经删除了,在分站列表中找不到该天线:天线id=%d", id);
-            log_info("天线已经删除了,在分站列表中找不到该天线:天线id=%d", id);
-        }
-        else
-        {
-            std_debug("删除天线成功:天线id=%d,分站id=%d", id, sitid);
-            log_info("删除天线成功:天线id=%d,分站id=%d", id, sitid);
-        }
-    }
+    bool is_cur_map(int id);
 
-    bool is_cur_map(int id)
-    {
-        return cur_map_id()==id;
-    }
+    int cur_map_id();
 
-    int cur_map_id()
-    {
-        auto tmp = area_list::instance()->m_map;
-        for(auto&it:tmp)
-        {
-            if(0!=it.second->m_mapid)
-            {
-                return it.second->m_mapid;
-            }
-        }
+    void update_map_info(int id);
 
-        return -1;
-    }
-
-    void update_map_info(int id)
-    {
-        std::string sql = "SELECT scale FROM dat_map WHERE map_id=";
-
-        sql.append(std::to_string(id));
-        sql.append(";");
-
-        std_debug("修改地图 sql=%s", sql.c_str());
-        log_info("修改地图 sql=%s", sql.c_str());
-
-        std::string Error;
-        YADB::CDBResultSet DBRes;
-        sDBConnPool.Query(sql.c_str(),DBRes,Error);
-        int nCount = DBRes.GetRecordCount( Error );
-        if (nCount < 1)
-        {
-            log_error("修改地图失败,数据库中找不到: map_id=%d", id);
-            return ;
-        }
-
-        double scale  = 0;
-        DBRes.GetField( "scale",scale, Error );
-
-        auto area = area_list::instance()->m_map;
-        for(auto& it : area)
-        {
-            it.second->m_scale = scale;
-        }
-
-        auto site = sit_list::instance()->m_map;
-        for(auto& it : site)
-        {
-            it.second->m_scale = scale;
-        }
-    }
 };
 
 #endif // MODULE_META_DATE_CHANGED_H

+ 1 - 1
module_service/module_mine.h

@@ -29,7 +29,7 @@ public:
 
         if(card_ptr->is_person())//人卡
         {
-
+            
         }
 
         if(card_ptr->is_vehicle())//车卡

+ 4 - 3
monkey_car/monkeycar_area.cpp

@@ -30,7 +30,7 @@ std::shared_ptr<monkey_person> monkey_area::find(uint32_t cardid)
 
 void monkey_area::on_hover(int64_t card_id,std::shared_ptr<area_hover>&c,double speed,uint64_t type)
 {
-	area::on_hover(card_id,c,speed,type);
+	//area::on_hover(card_id,c,speed,type);
 	//人卡走下面的业务
 	if(type != 1)
 	  return;
@@ -48,7 +48,8 @@ void monkey_area::on_hover(int64_t card_id,std::shared_ptr<area_hover>&c,double
 }
 void monkey_area::on_enter(int64_t card_id,std::shared_ptr<area_hover>&c,double speed,uint64_t type)
 {
-	area::on_enter(card_id,c,speed,type);
+	//std::shared_ptr<card_location_base> card = card_list::instance()->get(tool_other::type_id_to_u64(type, card_id));
+	//area::on_enter(card_id,c,speed,type);
 
 	if(type != 1)
 	  return;
@@ -56,7 +57,7 @@ void monkey_area::on_enter(int64_t card_id,std::shared_ptr<area_hover>&c,double
 }
 void monkey_area::on_leave(int64_t card_id,std::shared_ptr<area_hover>&c,double speed,uint64_t type)
 {
-	area::on_leave(card_id,c,speed,type);
+	//area::on_leave(card_id,c,speed,type);
 	if(type != 1)
 	  return;
 	on_card_leave(card_id);

+ 17 - 17
websocket/constdef.h

@@ -22,7 +22,7 @@
 #define JSON_ROOT_KEY_STATISTIC_AREA "area"
 #define JSON_ROOT_KEY_STATISTIC_LEVEL "occupation_level"
 
-// 采集端接收接口
+// 锟缴硷拷锟剿斤拷锟秸接匡拷
 #define JSON_CMD_VALUE_CLEAR_CARD "clear_card"
 #define JSON_CMD_VALUE_DEAL_HELP "helpme_done"   //deal_help
 #define JSON_CMD_VALUE_DEAL_HELP_RESPONSE "helpme_done_rsp"   //deal_help
@@ -32,7 +32,7 @@
 #define JSON_CMD_VALUE_CALL_CARD_START "call_card_start"
 #define JSON_CMD_VALUE_CALL_CARD_CANCEL "call_card_cancel"
 #define  JSON_CMD_VALUE_LEADER_ARRANGE "leader_arrange"
-//呼叫命令
+//锟斤拷锟斤拷锟斤拷锟斤拷
 #define JSON_CMD_VALUE_CALL_CARD_REQUEST "call_card_req"
 #define JSON_CMD_VALUE_CALL_CARD_RESPONSE "call_card_resp"
 #define JSON_CMD_VALUE_CALL_CARD_CANCEL_REQUEST "call_card_cancel_req"
@@ -94,35 +94,35 @@
 #define JSON_KEY_EDIT_CARD_ID "cardid"
 #define JSON_KEY_EDIT_EDIT_TYPE_ID "edittype"
 
-// 采集端调用接口
+// 锟缴硷拷锟剿碉拷锟矫接匡拷
 #define JSON_CMD_VALUE_LOGIN "login"
 #define JSON_CMD_VALUE_LOGOUT "logout"
 #define JSON_KEY_USERNAME "user_name"
 #define JSON_KEY_PASSWORD "user_pass"
 #define JSON_VALUE_USERNAME "COLLECTOR"
 #define JSON_VALUE_PASSWORD "666666"  //"666666"
-#define JSON_KEY_CARD_ID "card_id" //"卡号"
+#define JSON_KEY_CARD_ID "card_id" //"锟斤拷锟斤拷"
 #define JSON_KEY_CARD_TYPE_ID "card_type_id"
-#define JSON_KEY_REC_TIME "rec_time" // "接收时间"
-#define JSON_KEY_DOWN_TIME "down_time" // "入井时间"
-#define JSON_KEY_WORK_TIME "work_time" // "工作时间"
-#define JSON_KEY_ENTER_AREA_TIME "enter_area_time" // "进入区域时间"
+#define JSON_KEY_REC_TIME "rec_time" // "锟斤拷锟斤拷时锟斤拷"
+#define JSON_KEY_DOWN_TIME "down_time" // "锟诫井时锟斤拷"
+#define JSON_KEY_WORK_TIME "work_time" // "锟斤拷锟斤拷时锟斤拷"
+#define JSON_KEY_ENTER_AREA_TIME "enter_area_time" // "锟斤拷锟斤拷锟斤拷锟斤拷时锟斤拷"
 #define JSON_KEY_CORDINATE_X "x"
 #define JSON_KEY_CORDINATE_Y "y"
 #define JSON_KEY_CORDINATE_Z "z"
 #define JSON_KEY_STATE "state" // "状态"
-#define JSON_KEY_STATE_MOVING "state_moving" // 运动状态
-#define JSON_KEY_STATE_BIZ "state_biz" // 业状态
-#define JSON_KEY_MAP_ID "map_id" // "地图编号"
+#define JSON_KEY_STATE_MOVING "state_moving" // 锟剿讹拷状态
+#define JSON_KEY_STATE_BIZ "state_biz" // 业锟斤拷状态
+#define JSON_KEY_MAP_ID "map_id" // "锟斤拷图锟斤拷锟�"
 #define JSON_KEY_DEPT_ID "dept_id"
-#define JSON_KEY_SPEED "speed"	//速度
+#define JSON_KEY_SPEED "speed"	//锟劫讹拷
 #define JSON_KEY_LANDMARK_ID "landmark_id"
 #define JSON_KEY_DIRECTORY_ID "landmark_direction_id"
 #define JSON_KEY_LANDMARK_DIS "landmark_distance"
 
 // id, name, type, map_id
-#define JSON_KEY_AREA_ID "area_id" // "区域编号"
-#define JSON_KEY_AREA_IS_SPECIAL "is_special_area" // "区域名称"
+#define JSON_KEY_AREA_ID "area_id" // "锟斤拷锟斤拷锟斤拷"
+#define JSON_KEY_AREA_IS_SPECIAL "is_special_area" // "锟斤拷锟斤拷锟斤拷锟斤拷"
 // down_mine,up_mine
 #define JSON_CMD_VALUE_DOWN_MINE "down_mine"
 #define JSON_CMD_VALUE_UP_MINE "up_mine"
@@ -136,7 +136,7 @@
 // pos_map
 #define JSON_CMD_VALUE_POS_MAP "pos_map"
 
-// 告警事件
+// 锟芥警锟铰硷拷
 #define JSON_KEY_EVENT_EVENT_ID "event_id"
 #define JSON_KEY_EVENT_STATUS "status"
 #define JSON_KEY_EVENT_TYPE_ID "type_id"
@@ -178,14 +178,14 @@
 #define JSON_KEY_ALARM_LIGHT_GROUP_NAME	"light_group_name"
 
 #define JSON_KEY_ALARM_TRAFFIC_RED_LIGHT "traffic_red_light"
-// 掘进面
+// 锟斤拷锟斤拷锟�
 #define JSON_KEY_DRIVINGFACE_DIS "driving_face_moving_dis"
 #define JSON_KEY_DRIVINGFACE_WARNING_POINT_ID "driving_face_warning_point_id"
 #define JSON_KEY_DRIVINGFACE_WARNING_POINT_DIS "driving_face_warning_point_dis"
 
 #define JSON_KEY_DRIVINGFACE_CURSHIFT_LENGTH "drivingface_curshift_length"
 
-//人上车状态
+//锟斤拷锟较筹拷状态
 #define JSON_KEY_PERSON_ON_CAR "person_on_car"
 #define JSON_CMD_REQ_ALL_PERSON_ON_CAR "req_all_person_on_car"
 #define JSON_CMD_RESP_ALL_PERSON_ON_CAR "resp_all_person_on_car"

+ 1 - 1
ya_event.cpp

@@ -30,7 +30,7 @@ void event_list::load_his_data_from_db()
     uint64_t nCount = DBRes.GetRecordCount( Error );
     if (nCount > 0)
     {
-        log_info( "init_vehicle_category. The record count=%ld\n", nCount );
+        log_info( "load_his_data_from_db. The record count=%ld\n", nCount );
 
         while ( DBRes.GetNextRecod(Error) )
         {

+ 16 - 1
ya_event.h

@@ -34,13 +34,24 @@ enum EVENT_STATUS
 };
 
 enum EVENT_TYPE{ // 事件类型
+    ET_UNKNOWN = 0,
+	ET_OVER_COUNT_PERSON = 1, // 井下人员超员pit_module/CPicardmanager
+	ET_OVER_COUNT_VEHICLE = 2,    // 井下车辆超员pit_module/CPicardmanager
+
     ET_AREA_OVER_COUNT_PERSON = 3,	// 区域人员超员
     ET_AREA_OVER_COUNT_VEHICLE = 4,	// 区域车辆超员
 	ET_READER_ERROR = 6,
     ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
 
+    ET_CARD_OVER_TIME_PERSON = 13, // 人员井下超时pit_module/CPicardmanager
+	ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时pit_module/CPicardmanager
+
     ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
     ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
+    ET_CARD_AREA_LIMIT_PERSON = 17, // 人员进入限制区域
+    ET_CARD_AREA_LIMIT_VEHICLE = 18, // 车辆进入限制区域
+    ET_CARD_AREA_FORBIDDEN_PERSON = 19,  // 人员进入禁止区域
+    ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
     ET_CARD_OVER_SPEED = 21, // 车辆超速
     ET_CARD_HELP = 24, // 人员呼救
 
@@ -151,7 +162,11 @@ public:
         return (static_cast<uint64_t>(ev_type)<<48)|(static_cast<uint64_t>(obj_type)<<40)
                 |(static_cast<uint64_t>(obj_id_type)<<32)|static_cast<uint64_t>(obj_id);
     }
-
+    ///创建井下警告
+    static event_ptr create_event_mine(int objid, EVENT_TYPE ev_type)
+    {
+        return create_event(OT_MINE, objid, 0, ev_type);
+    } 
     ///创建区域警告
     static event_ptr create_event_area(int area_id, EVENT_TYPE ev_type)
     {

+ 44 - 0
ya_setting.cpp

@@ -0,0 +1,44 @@
+#include "ya_setting.h"
+#include "db_api/CDBSingletonDefine.h"
+
+SSys_setting CYaSetting::m_sys_setting;
+/*
+* 从数据库的dat_setting表初始化系统阈值,
+* 包括:井下人员阈值,井下车辆阈值,人员超时阈值,车辆超时阈值,车辆超速阈值
+*/
+bool CYaSetting::Init_sys_setting()
+{
+	std::string Error;
+	YADB::CDBResultSet DBRes;
+	std::string sql = "select setting_id, name, type, value from dat_setting;";
+	sDBConnPool.Query(sql.c_str(),DBRes,Error);
+	int nCount = DBRes.GetRecordCount( Error );
+	if (nCount > 0)
+	{
+		while ( DBRes.GetNextRecod(Error) )
+		{
+			std::string strVal = "";
+#define D_GetValue(K,N,X,PS) \
+			if (DBRes.GetField( N,strVal, Error ))\
+				{K = atoi(strVal.c_str()) * X;}\
+
+			D_GetValue(m_sys_setting.over_count_person,"over_count_person",1,"人员井下超员")
+			D_GetValue(m_sys_setting.over_count_vehicle,"over_count_vehicle",1,"车辆井下超员")
+			D_GetValue(m_sys_setting.over_time_person,"over_time_person",60,"人员井下超时")
+			D_GetValue(m_sys_setting.over_time_vehicle,"over_time_vehicle",60,"车辆井下超时")
+			D_GetValue(m_sys_setting.over_speed,"over_speed",1,"车辆超速限值")
+			D_GetValue(m_sys_setting.att_starttime_offset_staff,"att_starttime_offset_staff",60,"考勤开始时间向前偏移分钟数")
+			D_GetValue(m_sys_setting.att_endtime_offset_staff,"att_endtime_offset_staff",60,"车辆考勤开始时间向前偏移分钟数")
+			D_GetValue(m_sys_setting.att_starttime_offset_vehicle,"att_starttime_offset_vehicle",60,"车辆考勤结束时间向后偏移分钟数")
+			D_GetValue(m_sys_setting.att_endtime_offset_vehicle,"att_endtime_offset_vehicle",60,"车辆考勤结束时间向后偏移分钟数")
+			D_GetValue(m_sys_setting.att_person_thre_hour,"att_person_thre_hour",60*60,"")
+			D_GetValue(m_sys_setting.rear_end_d,"rear_end_distance",1,"")
+			D_GetValue(m_sys_setting.rear_end_t,"rear_end_time",1,"")
+			D_GetValue(m_sys_setting.geofault_warn_dis,"geofault_warn",1,"")
+
+#undef D_GetValue
+		}
+	}
+
+    return true;
+}

+ 60 - 0
ya_setting.h

@@ -0,0 +1,60 @@
+#ifndef _YASL_SETTINS_H
+#define _YASL_SETTINS_H
+
+#include <time.h>
+#include <map>
+
+// 系统设置,,读取DB.dat_setting
+struct  SSys_setting // system_limit_setting
+{
+	unsigned int over_count_person; // 井下人员超员
+	unsigned int over_count_vehicle; // 井下车辆超员
+	unsigned int over_time_person; // 井下人员超时
+	unsigned int over_time_vehicle; // 井下车辆超时
+	double over_speed; // 井下车辆超速
+
+	// lihongzhen  2017/8/18 考勤偏移时间
+	int att_starttime_offset_staff;
+	int att_endtime_offset_staff;
+	int att_starttime_offset_vehicle;
+	int att_endtime_offset_vehicle; 
+	uint64_t att_person_thre_hour;
+	//车辆防追尾配置数据
+	double rear_end_d;
+	time_t rear_end_t;
+	double geofault_warn_dis;
+    SSys_setting()
+    {
+        init();
+    }
+    void init()
+    {
+        over_count_person = 1000;
+        over_count_vehicle = 100;
+        over_speed = 30;
+        over_time_person = 36000;
+        over_time_vehicle = 18000;
+        att_endtime_offset_staff = 600;
+        att_endtime_offset_vehicle = 600;
+        att_starttime_offset_staff = 900;
+        att_starttime_offset_vehicle = 600;
+        att_person_thre_hour = 0;
+        rear_end_d = 0;
+        rear_end_t = 0;
+        geofault_warn_dis=50; 
+    }
+};
+
+class CYaSetting
+{
+public:
+    /*
+    * 从数据库的dat_setting表初始化系统阈值,
+    * 包括:井下人员阈值,井下车辆阈值,人员超时阈值,车辆超时阈值,车辆超速阈值
+    */
+    static SSys_setting m_sys_setting;
+    static bool Init_sys_setting();
+
+};
+
+#endif