Sfoglia il codice sorgente

井下超时处理

陈松潮 6 anni fa
parent
commit
6713db0bf0
7 ha cambiato i file con 117 aggiunte e 18 eliminazioni
  1. 1 0
      card.cpp
  2. 8 0
      card_base.h
  3. 5 1
      card_person.cpp
  4. 23 10
      mine.cpp
  5. 12 0
      mine.h
  6. 60 7
      mine_module/MineCardManager.cpp
  7. 8 0
      mine_module/MineCardManager.h

+ 1 - 0
card.cpp

@@ -16,6 +16,7 @@
 #include "log.h"
 #include "area.h"
 #include "card.h"
+#include "mine_module/MineCardManager.h"
 
 
 extern config_file config;

+ 8 - 0
card_base.h

@@ -24,6 +24,14 @@ struct site_area_hover;
 
 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(std::shared_ptr<person>(this));
+
 	if(!m_mine_tool->is_attendance())
 		return;
 	YA::_CARD_POS_ cp;

+ 23 - 10
mine.cpp

@@ -1,21 +1,34 @@
 #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()
+
+//检查井下超时
+void mine_tool::on_check_overtime(std::shared_ptr<card_location_base> card)
+{
+	if (card == nullptr)
 	{
-		return get_down_time()>tool_time::morning_of_today_ms();
+		return;
 	}
+	CMineCardManager::instance()->OnPersonInMineOverTime(card);
+
+}
+
+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(std::shared_ptr<card_location_base> card);
 	uint64_t get_down_time();
 	uint64_t get_work_time();
 	int32_t is_on_duty();

+ 60 - 7
mine_module/MineCardManager.cpp

@@ -1,6 +1,7 @@
 #include "MineCardManager.h"
 #include "ya_setting.h"
-#include <time.h>
+#include "common_tool.h"
+#include "mine.h"
 
 CMineCardManager::CMineCardManager()
 {
@@ -31,7 +32,7 @@ bool CMineCardManager::Exist(SET_CARDID &list,uint64_t id)
 
 bool CMineCardManager::Exist(SET_CARDID &list,int card_id,int card_type)
 {
-    return Exist(list,card_list::to_id64(card_type,card_id));
+    return Exist(list,tool_other::type_id_to_u64(card_type,card_id));
 }
 
 /**
@@ -119,9 +120,9 @@ void CMineCardManager::OnPersonDown(std::shared_ptr<card> card,bool bInit/* = fa
         return ;
     }
      //设置卡的状态
-    card->m_is_attendance = EAttendanceState::Down;
+    card->m_is_attendance = EAttendanceState::MineDown;
    
-    uint64_t key = card_list::to_id64(card->m_id,card->m_type);
+    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 ;
@@ -146,8 +147,8 @@ void CMineCardManager::OnPersonUp(std::shared_ptr<card> card)
     {
         return ;
     }
-    card->m_is_attendance = EAttendanceState::Up;
-    uint64_t key = card_list::to_id64(card->m_id,card->m_type);
+    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 ;
@@ -181,7 +182,7 @@ void CMineCardManager::OnPersonOvercrowdingWarning()
             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 += tool_other::type_id_to_str(pitcard->m_type,pitcard->m_id);
                 log += "&";
             }
         }
@@ -191,6 +192,58 @@ void CMineCardManager::OnPersonOvercrowdingWarning()
         this->StartEvent(EVENT_TYPE::ET_OVER_COUNT_PERSON,max_person,(int)m_minecards->m_down_person.size());
     }
 }
+
+/**
+* @brief 人员井下超时
+**/
+void CMineCardManager::OnPersonInMineOverTime(std::shared_ptr<card_location_base> card)
+{
+    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 卡

+ 8 - 0
mine_module/MineCardManager.h

@@ -64,6 +64,12 @@ public:
      * @brief 人员超员警告
      **/
     void OnPersonOvercrowdingWarning();
+
+    /**
+     * @brief 人员井下超时
+     **/
+    void OnPersonInMineOverTime(std::shared_ptr<card_location_base> card);
+public:
      /**
      * @brief 车下井 ,车辆超员警告
      * @param card 卡
@@ -79,6 +85,8 @@ public:
      * @brief 车辆超员警告
      **/
     void OnVehicleOvercrowdingWarning();
+
+
 };
 
 #endif //__MINECARDMANAGER_H