Browse Source

移植人员井下超员告警正常功能已完成

chensongchao 6 years ago
parent
commit
e51105da6c

+ 5 - 0
CMakeLists.txt

@@ -84,6 +84,11 @@ set(SRC_MODULE
     "mine.h" "mine.cpp"
     "ya_event.h" "ya_event.cpp"
     "common_tool.h"
+    "ya_setting.h" "ya_setting.cpp"
+
+    "mine_module/minestruct.h"
+    "mine_module/MineCardManager.h"
+    "mine_module/MineCardManager.cpp"
 
     "module_service/module_area.h"
     "module_service/module_site.h"

+ 8 - 0
card.h

@@ -21,6 +21,14 @@ struct card_message_handle;
 struct mine_tool;
 struct location_card;
 struct card_pos;
+
+enum EAttendanceState
+{
+	None = 0,	//初始化
+	Up	= 1,	//井上
+	Down = 2	//井下
+};
+
 struct card:point
 {
 	card(uint32_t id,uint16_t dis,uint64_t type,int32_t deptid,int32_t level_id,uint32_t cid)

+ 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();

+ 203 - 0
mine_module/MineCardManager.cpp

@@ -0,0 +1,203 @@
+#include "MineCardManager.h"
+#include "ya_setting.h"
+#include <time.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,card_list::to_id64(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=%ulld 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=%ulld-%ulld 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=%ulld 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=%ulld evType=%d,evState=ES_END ",evid,evType);
+}
+
+/**
+ * @brief 人员下井
+ * @param card 卡
+ **/
+void CMineCardManager::OnPersonDown(std::shared_ptr<card> card)
+{
+    if (nullptr == card)
+    {
+        return ;
+    }
+     //设置卡的状态
+    card->m_is_attendance = EAttendanceState::Down;
+   
+    uint64_t key = card_list::to_id64(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);
+    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 += card_list::to_id64_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 人员升井
+ * @param card 卡
+ **/
+void CMineCardManager::OnPersonUp(std::shared_ptr<card> card)
+{
+    if (nullptr == card)
+    {
+        return ;
+    }
+    card->m_is_attendance = EAttendanceState::Up;
+    uint64_t key = card_list::to_id64(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 车下井
+ * @param card 卡
+ **/
+void CMineCardManager::OnVehicleDown(std::shared_ptr<card> card)
+{
+    if (nullptr == card)
+    {
+        return ;
+    }
+}
+    /**
+ * @brief 车升井
+ * @param card 卡
+ **/
+void CMineCardManager::OnVehicleUp(std::shared_ptr<card> card)
+{
+    if (nullptr == card)
+    {
+        return ;
+    }
+}

+ 74 - 0
mine_module/MineCardManager.h

@@ -0,0 +1,74 @@
+/*
+** 井中卡的数据:人员下井 ,人员升进,车下井升井数据
+** 对应的操作,井下人员超时,井下超员等
+*/
+#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 卡
+     **/
+    void OnPersonDown(std::shared_ptr<card> card);
+     /**
+     * @brief 人员升井
+     * @param card 卡
+     **/
+    void OnPersonUp(std::shared_ptr<card> card);
+     /**
+     * @brief 车下井
+     * @param card 卡
+     **/
+    void OnVehicleDown(std::shared_ptr<card> card);
+     /**
+     * @brief 车升井
+     * @param card 卡
+     **/
+    void OnVehicleUp(std::shared_ptr<card> card);
+};
+
+#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:
                     tool_db::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())
                 {

+ 1 - 1
module_service/module_mine.h

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

+ 12 - 1
ya_event.h

@@ -30,11 +30,18 @@ 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_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_OVER_SPEED = 21, // 车辆超速
@@ -147,7 +154,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