|
@@ -1,4 +1,4 @@
|
|
|
-#include "FuncOnAndOffJob.h"
|
|
|
+#include "FuncOnAndOffWork.h"
|
|
|
#include "GlobalVariable.h"
|
|
|
#include "GlobalConfig.h"
|
|
|
#include "UniversalFunc.h"
|
|
@@ -234,32 +234,30 @@ bool RoomOnWorkInfo::isLeaveTimeExist(const QDateTime& time)
|
|
|
|
|
|
|
|
|
|
|
|
-FuncOnAndOffJob::FuncOnAndOffJob()
|
|
|
+FuncOnAndOffWork::FuncOnAndOffWork()
|
|
|
{
|
|
|
- m_pListAlarm = new ListAlarmInfo();
|
|
|
m_logger = spdlog::get("SPAServer");
|
|
|
if(m_logger == nullptr)
|
|
|
{
|
|
|
- SPDLOG_ERROR("FuncOnAndOffJob logger is nullptr");
|
|
|
+ SPDLOG_ERROR("FuncOnAndOffWork logger is nullptr");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
-FuncOnAndOffJob::~FuncOnAndOffJob()
|
|
|
+FuncOnAndOffWork::~FuncOnAndOffWork()
|
|
|
{
|
|
|
- if(m_pListAlarm != nullptr)
|
|
|
- {
|
|
|
- delete m_pListAlarm;
|
|
|
- m_pListAlarm = nullptr;
|
|
|
- }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
|
-void FuncOnAndOffJob::task()
|
|
|
+void FuncOnAndOffWork::task()
|
|
|
{
|
|
|
while(GThreadInfo.getRunning())
|
|
|
{
|
|
|
+ /* 休眠一段时间 */
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(GVariable.ThreadSleepMS));
|
|
|
+
|
|
|
/* 判断是否需要退出 */
|
|
|
if(m_funcThreadInfo.RunState == RunTimeState::RUN_STATE_STOP)
|
|
|
{
|
|
@@ -267,162 +265,198 @@ void FuncOnAndOffJob::task()
|
|
|
}
|
|
|
|
|
|
/* 判断是否在检测时间段内 */
|
|
|
- if(!isInDetectTime(m_funcThreadInfo.StartTime, m_funcThreadInfo.EndTime))
|
|
|
+ if(!isInDetectTime(m_periodInfo))
|
|
|
{
|
|
|
- /* 休眠一段时间 */
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(GVariable.ThreadSleepMS));
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- /* 先获取所有的直播间,这里不需要读取所有的房间数据
|
|
|
- * 理论上一个频率只有一个直播间 */
|
|
|
- std::map<int, RoomCamActInfo> mapRoomCamActInfo;
|
|
|
- for(auto& it : m_funcThreadInfo.listRoomCamActInfo)
|
|
|
+
|
|
|
+ /* -----------------------------------------------------------------------
|
|
|
+ * 读取Redis数据(读取全部的数据,后面根据不同情况自己处理)
|
|
|
+ * ----------------------------------------------------------------------- */
|
|
|
+ readRedisData(m_listSrcAlarm);
|
|
|
+
|
|
|
+ /* -----------------------------------------------------------------------
|
|
|
+ * 处理数据
|
|
|
+ * ----------------------------------------------------------------------- */
|
|
|
+
|
|
|
+ /* 记录人员在岗情况 */
|
|
|
+ recordPersonOnWork();
|
|
|
+ /* 处理直播间在岗离岗报警情况 */
|
|
|
+ processRoomOnWorkAlarm();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 清空数据 */
|
|
|
+ for(auto& it : m_mapRoomOnWorkInfo)
|
|
|
+ {
|
|
|
+ delete it.second;
|
|
|
+ }
|
|
|
+ m_mapRoomOnWorkInfo.clear();
|
|
|
+
|
|
|
+ m_listSrcAlarm.clearAlarmInfo();
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/* 记录在岗离岗情况 */
|
|
|
+void FuncOnAndOffWork::recordPersonOnWork()
|
|
|
+{
|
|
|
+ /* -----------------------------------------------------------------------
|
|
|
+ * 处理数据
|
|
|
+ * ----------------------------------------------------------------------- */
|
|
|
+ /* 处理数据,将报警信息的人脸信息取出来,放入到人脸信息列表中 */
|
|
|
+ for(auto& alarmInfo : m_listSrcAlarm.listAlarmInfo)
|
|
|
+ {
|
|
|
+ /* 添加到人脸列表中,会自动去重,自动创建对应的频道和房间信息 */
|
|
|
+ m_pListRoomFace->addRoomFaceInfo(*alarmInfo);
|
|
|
+ }
|
|
|
+ /* 计算人脸个数,每个房间逐个对比 */
|
|
|
+ m_nowTime = QDateTime::currentDateTime();
|
|
|
+ for(auto it = m_pListRoomFace->listRoomFaceInfo.begin(); it != m_pListRoomFace->listRoomFaceInfo.end(); )
|
|
|
+ {
|
|
|
+ /* m_pListRoomFace的数据不会删除,会和历史对比,这里的MaxNum和MinNum就是历史数据 */
|
|
|
+ if(it->MaxNum < it->listPersonInfo.size())
|
|
|
+ {
|
|
|
+ it->MaxNum = it->listPersonInfo.size();
|
|
|
+ }
|
|
|
+ if(it->MinNum > it->listPersonInfo.size())
|
|
|
+ {
|
|
|
+ it->MinNum = it->listPersonInfo.size();
|
|
|
+ }
|
|
|
+ /* 判断是否需要写入数据库,一定时间写入一次,默认是10分钟写一次 */
|
|
|
+ if(m_nowTime.toSecsSinceEpoch() - it->StartTime.toSecsSinceEpoch() > GVariable.AppUpdateOnWorkTimeInterval_Time)
|
|
|
{
|
|
|
- /* 判断是不是直播间 */
|
|
|
- if(it.RoomType == Enum_RoomType::ROOM_LIVE)
|
|
|
+ /* 写入数据库 */
|
|
|
+ if(m_fromWebAPI->insertOnWorkInfo(*it))
|
|
|
{
|
|
|
- mapRoomCamActInfo.insert(std::make_pair(it.RoomID, it));
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "☆ 新增人脸信息,频道[{}][{}],摄像头[{}][{}],时间范围[{} - {}],人数范围[{} - {}]",
|
|
|
+ it->ChannelID, GConfig.getChannelName(it->ChannelID), it->CameraID, GConfig.getCameraName(it->CameraID),
|
|
|
+ it->StartTime.toString("yyyy-MM-dd hh:mm:ss").toStdString(), it->EndTime.toString("yyyy-MM-dd hh:mm:ss").toStdString(),
|
|
|
+ it->MinNum, it->MaxNum);
|
|
|
+ /* 删除这条信息 */
|
|
|
+ it = m_pListRoomFace->listRoomFaceInfo.erase(it);
|
|
|
+ continue;
|
|
|
+ }else {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "写入数据库tWorkOnInfo失败");
|
|
|
}
|
|
|
}
|
|
|
+ ++it;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- /* 获取当前频率的在岗离岗信息,在表格“tChannel”中 */
|
|
|
- if(!getCurrentFrequencyInfo(m_funcThreadInfo.ChannelID, m_nowChnDetecRule))
|
|
|
+/* 处理房间人员在岗离岗报警信息(这里只有直播间的在岗离岗报警) */
|
|
|
+void FuncOnAndOffWork::processRoomOnWorkAlarm()
|
|
|
+{
|
|
|
+ /* 先获取所有的直播间,这里不需要读取所有的房间数据
|
|
|
+ * 理论上一个频率只有一个直播间 */
|
|
|
+ std::map<int, RoomCamActInfo> mapRoomCamActInfo;
|
|
|
+ for(auto& it : m_funcThreadInfo.listRoomCamActInfo)
|
|
|
+ {
|
|
|
+ /* 判断是不是直播间 */
|
|
|
+ if(it.RoomType == Enum_RoomType::ROOM_LIVE)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "获取当前频率信息失败, ChannelID:{}", m_funcThreadInfo.ChannelID);
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(GVariable.ThreadSleepMS));
|
|
|
- continue;
|
|
|
+ mapRoomCamActInfo.insert(std::make_pair(it.RoomID, it));
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
- /* 读取Redis数据 */
|
|
|
- for(const auto& RoomInfo : mapRoomCamActInfo)
|
|
|
+ /* 获取当前频率的在岗离岗信息,在表格“tChannel”中 */
|
|
|
+ if(!getCurrentFrequencyInfo(m_funcThreadInfo.ChannelID, m_nowChnDetecRule))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 获取在岗离岗信息失败", m_baseLog);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 获取当前时间 */
|
|
|
+ m_nowTime = QDateTime::currentDateTime();
|
|
|
+ /* 创建本轮的临时变量 */
|
|
|
+ m_nowRoomOnWorkInfo.clear();
|
|
|
+ /* 对所有房间挨个判断 */
|
|
|
+ for(auto& roomInfo : mapRoomCamActInfo)
|
|
|
+ {
|
|
|
+ bool bHasPeople = false;
|
|
|
+ bool bOnWork = false;
|
|
|
+ m_strBaseInfo = fmt::format("频道[{}][{}], 房间[{}][{}]:", m_funcThreadInfo.ChannelID, m_funcThreadInfo.strChannelName, roomInfo.second.RoomID, roomInfo.second.strRoomName);
|
|
|
+ /* 先使用人员计数判断直播间有没有人,如果直播间有人,再使用人脸识别算法判断是否是认识的人(是认识的人才会被识别到) */
|
|
|
+ for(auto& alarm : m_listSrcAlarm.listAlarmInfo)
|
|
|
{
|
|
|
- /* it是摄像机信息,it.first是摄像机ID */
|
|
|
- for(const auto& it : RoomInfo.second.mapCameraAction)
|
|
|
+ if(alarm->RoomID == roomInfo.first)
|
|
|
{
|
|
|
- for(const auto& act : it.second)
|
|
|
+ if(alarm->ActionID == GVariable.ActPersonCount())
|
|
|
{
|
|
|
- std::string strKey = std::to_string(it.first) + ":" + act;
|
|
|
- std::string strRetValue;
|
|
|
- if(!m_fromRedis->getRedisString(strKey, strRetValue))
|
|
|
- {
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "读取Redis数据失败, Key:{}", strKey);
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
- continue;
|
|
|
- }
|
|
|
- /* 解析数据 */
|
|
|
- AlarmInfo alarmInfo;
|
|
|
- parseRedisBaseData(strRetValue, alarmInfo);
|
|
|
- parseRedisBBoxesData(strRetValue, alarmInfo);
|
|
|
- /* 判断事件的时效性,超过多少秒不更新就可能是超脑挂了 */
|
|
|
- if(isEventTimeVaild(alarmInfo.EventTime))
|
|
|
+ if(alarm->listBbox.size() > 0)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_WARN(m_logger, "Redis Key:{} 数据长时间没有更新,EventTime:{}",strKey, alarmInfo.EventTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
- continue;
|
|
|
+ bHasPeople = true;
|
|
|
+ break;
|
|
|
}
|
|
|
- m_pListAlarm->addAlarmInfo(alarmInfo);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- /* 获取当前时间 */
|
|
|
- m_curTime = QDateTime::currentDateTime();
|
|
|
- /* 创建本轮的临时变量 */
|
|
|
- m_nowRoomOnWorkInfo.clear();
|
|
|
- /* 对所有房间挨个判断 */
|
|
|
- for(auto& roomInfo : mapRoomCamActInfo)
|
|
|
+
|
|
|
+ /* 如果有人,记录可以识别到的人员信息,记录在岗时间 */
|
|
|
+ if(bHasPeople)
|
|
|
{
|
|
|
- bool bHasPeople = false;
|
|
|
- bool bOnWork = false;
|
|
|
- m_strBaseInfo = fmt::format("频道[{}][{}], 房间[{}][{}]:", m_funcThreadInfo.ChannelID, m_funcThreadInfo.strChannelName, roomInfo.second.RoomID, roomInfo.second.strRoomName);
|
|
|
- /* 先使用人员计数判断直播间有没有人,如果直播间有人,再使用人脸识别算法判断是否是认识的人(是认识的人才会被识别到) */
|
|
|
- for(auto& alarm : m_pListAlarm->listAlarmInfo)
|
|
|
+ for(auto& alarm : m_listSrcAlarm.listAlarmInfo)
|
|
|
{
|
|
|
if(alarm->RoomID == roomInfo.first)
|
|
|
{
|
|
|
- if(alarm->ActionID == GVariable.ActPersonCount)
|
|
|
+ if(alarm->ActionID == GVariable.ActFaceIdentify())
|
|
|
{
|
|
|
- if(alarm->listBbox.size() > 0)
|
|
|
+ if(alarm->listPersonInfo.size() > 0)
|
|
|
{
|
|
|
- bHasPeople = true;
|
|
|
- break;
|
|
|
+ bOnWork = true;
|
|
|
+ /* 记录人员信息 */
|
|
|
+ m_nowRoomOnWorkInfo.addPersonInfo(alarm->listPersonInfo);
|
|
|
+ /* 更新在岗时间 */
|
|
|
+ m_nowRoomOnWorkInfo.updateOnWorkTime(m_nowTime);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- /* 如果有人,记录可以识别到的人员信息,记录在岗时间 */
|
|
|
- if(bHasPeople)
|
|
|
- {
|
|
|
- for(auto& alarm : m_pListAlarm->listAlarmInfo)
|
|
|
- {
|
|
|
- if(alarm->RoomID == roomInfo.first)
|
|
|
- {
|
|
|
- if(alarm->ActionID == GVariable.ActFaceIdentify)
|
|
|
- {
|
|
|
- if(alarm->listPersonInfo.size() > 0)
|
|
|
- {
|
|
|
- bOnWork = true;
|
|
|
- /* 记录人员信息 */
|
|
|
- m_nowRoomOnWorkInfo.addPersonInfo(alarm->listPersonInfo);
|
|
|
- /* 更新在岗时间 */
|
|
|
- m_nowRoomOnWorkInfo.updateOnWorkTime(m_curTime);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* 查找这个房间对应的房间信息 */
|
|
|
- RoomOnWorkInfo* pRoomOnWorkInfo = nullptr;
|
|
|
- auto it0 = m_mapRoomOnWorkInfo.find(roomInfo.first);
|
|
|
- if(it0 != m_mapRoomOnWorkInfo.end())
|
|
|
- {
|
|
|
- pRoomOnWorkInfo = it0->second;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- /* 没找到,就创建一个 */
|
|
|
- pRoomOnWorkInfo = new RoomOnWorkInfo();
|
|
|
- pRoomOnWorkInfo->bOnWork = bOnWork;
|
|
|
- pRoomOnWorkInfo->ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
- pRoomOnWorkInfo->RoomID = roomInfo.first;
|
|
|
- pRoomOnWorkInfo->RoomID = roomInfo.second.RoomID;
|
|
|
- pRoomOnWorkInfo->RoomType = roomInfo.second.RoomType;
|
|
|
- pRoomOnWorkInfo->StartTime = m_curTime;
|
|
|
- pRoomOnWorkInfo->strImagePath = m_nowRoomOnWorkInfo.strImagePath;
|
|
|
- pRoomOnWorkInfo->listPersonInfo = m_nowRoomOnWorkInfo.listPersonInfo;
|
|
|
-
|
|
|
- m_mapRoomOnWorkInfo.insert(std::make_pair(roomInfo.first, pRoomOnWorkInfo));
|
|
|
- }
|
|
|
- if(pRoomOnWorkInfo == nullptr)
|
|
|
- {
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "创建房间在岗信息失败,频率ID:{},房间ID:{}", m_funcThreadInfo.ChannelID, roomInfo.first);
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- /* 处理此次在岗和离岗 */
|
|
|
- if(bOnWork)
|
|
|
- {
|
|
|
- /* 在岗 */
|
|
|
- onWorkProcess(pRoomOnWorkInfo, roomInfo);
|
|
|
- } else
|
|
|
- {
|
|
|
- /* 离岗 */
|
|
|
- offWorkProcess(pRoomOnWorkInfo, roomInfo);
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
+ /* 查找这个房间对应的房间信息 */
|
|
|
+ RoomOnWorkInfo* pRoomOnWorkInfo = nullptr;
|
|
|
+ auto it0 = m_mapRoomOnWorkInfo.find(roomInfo.first);
|
|
|
+ if(it0 != m_mapRoomOnWorkInfo.end())
|
|
|
+ {
|
|
|
+ pRoomOnWorkInfo = it0->second;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* 没找到,就创建一个 */
|
|
|
+ pRoomOnWorkInfo = new RoomOnWorkInfo();
|
|
|
+ pRoomOnWorkInfo->bOnWork = bOnWork;
|
|
|
+ pRoomOnWorkInfo->ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
+ pRoomOnWorkInfo->RoomID = roomInfo.first;
|
|
|
+ pRoomOnWorkInfo->RoomID = roomInfo.second.RoomID;
|
|
|
+ pRoomOnWorkInfo->RoomType = roomInfo.second.RoomType;
|
|
|
+ pRoomOnWorkInfo->StartTime = m_nowTime;
|
|
|
+ pRoomOnWorkInfo->strImagePath = m_nowRoomOnWorkInfo.strImagePath;
|
|
|
+ pRoomOnWorkInfo->listPersonInfo = m_nowRoomOnWorkInfo.listPersonInfo;
|
|
|
+ m_mapRoomOnWorkInfo.insert(std::make_pair(roomInfo.first, pRoomOnWorkInfo));
|
|
|
+ }
|
|
|
+ if(pRoomOnWorkInfo == nullptr)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 创建房间在岗信息失败, 房间: {}", m_baseLog, roomInfo.second.strRoomName);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ /* 处理此次在岗和离岗 */
|
|
|
+ if(bOnWork)
|
|
|
+ {
|
|
|
+ /* 在岗 */
|
|
|
+ onWorkProcess(pRoomOnWorkInfo, roomInfo);
|
|
|
+ } else
|
|
|
+ {
|
|
|
+ /* 离岗 */
|
|
|
+ offWorkProcess(pRoomOnWorkInfo, roomInfo);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/* 获取当前频率信息 */
|
|
|
-bool FuncOnAndOffJob::getCurrentFrequencyInfo(const int ChannelID, DecCondition& info)
|
|
|
+bool FuncOnAndOffWork::getCurrentFrequencyInfo(const int ChannelID, DecCondition& info)
|
|
|
{
|
|
|
auto str = m_fromWebAPI->getChannelInfo(ChannelID);
|
|
|
if(str == "")
|
|
@@ -472,7 +506,7 @@ bool FuncOnAndOffJob::getCurrentFrequencyInfo(const int ChannelID, DecCondition&
|
|
|
* @param pRoomOnWorkInfo 这个是内存中的记录,是历史记录
|
|
|
* @param roomInfo
|
|
|
*/
|
|
|
-void FuncOnAndOffJob::onWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo)
|
|
|
+void FuncOnAndOffWork::onWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo)
|
|
|
{
|
|
|
/* 判断上次是否在岗,上次是离岗,结束离岗报警 */
|
|
|
if(pRoomOnWorkInfo->bOnWork == false)
|
|
@@ -483,15 +517,15 @@ void FuncOnAndOffJob::onWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<c
|
|
|
{
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "·人员报警结束,{}", m_strBaseInfo);
|
|
|
/* 结束报警,写入数据库 */
|
|
|
- m_fromWebAPI->endAlarmInfoByPKID(pRoomOnWorkInfo->PKID, m_curTime);
|
|
|
+ m_fromWebAPI->endAlarmInfoByPKID(pRoomOnWorkInfo->PKID, m_nowTime);
|
|
|
/* 删除离岗记录,重新开始 */
|
|
|
pRoomOnWorkInfo->PKID = 0;
|
|
|
pRoomOnWorkInfo->listLeaveTime.clear();
|
|
|
- pRoomOnWorkInfo->StartTime = m_curTime;
|
|
|
+ pRoomOnWorkInfo->StartTime = m_nowTime;
|
|
|
}else
|
|
|
{
|
|
|
/* 没有写入数据库 */
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "·{}人员离岗报警结束,结束时间:{}", m_strBaseInfo, m_curTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "·{}人员离岗报警结束,结束时间:{}", m_strBaseInfo, m_nowTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
|
|
|
}
|
|
|
}
|
|
|
pRoomOnWorkInfo->bOnWork = true;
|
|
@@ -574,7 +608,7 @@ void FuncOnAndOffJob::onWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<c
|
|
|
}else
|
|
|
{
|
|
|
/* 人员信息没有变化,更新在岗时间 */
|
|
|
- pRoomOnWorkInfo->updateOnWorkTime(m_curTime);
|
|
|
+ pRoomOnWorkInfo->updateOnWorkTime(m_nowTime);
|
|
|
SPDLOG_LOGGER_DEBUG(m_logger, "人员信息没有变化,更新在岗时间: {}", m_nowRoomOnWorkInfo.getLastOnWorkTimeString());
|
|
|
}
|
|
|
|
|
@@ -596,7 +630,7 @@ void FuncOnAndOffJob::onWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<c
|
|
|
* @param pRoomOnWorkInfo
|
|
|
* @param roomInfo
|
|
|
*/
|
|
|
-void FuncOnAndOffJob::offWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo)
|
|
|
+void FuncOnAndOffWork::offWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo)
|
|
|
{
|
|
|
if(true == pRoomOnWorkInfo->bOnWork)
|
|
|
{
|
|
@@ -608,16 +642,16 @@ void FuncOnAndOffJob::offWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<
|
|
|
{
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "人员在岗结束(PKID:{}),离岗开始,{}", pRoomOnWorkInfo->PKID, m_strBaseInfo);
|
|
|
/* 更新数据库,结束在岗 */
|
|
|
- m_fromWebAPI->endAlarmInfoByPKID(pRoomOnWorkInfo->PKID, m_curTime);
|
|
|
+ m_fromWebAPI->endAlarmInfoByPKID(pRoomOnWorkInfo->PKID, m_nowTime);
|
|
|
pRoomOnWorkInfo->PKID = 0;
|
|
|
- pRoomOnWorkInfo->StartTime = m_curTime;
|
|
|
+ pRoomOnWorkInfo->StartTime = m_nowTime;
|
|
|
}else
|
|
|
{
|
|
|
/* 没有写入数据库 */
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "人员在岗结束,离岗开始,{}", m_strBaseInfo);
|
|
|
}
|
|
|
|
|
|
- pRoomOnWorkInfo->addOneLeaveTime(m_curTime, m_nowChnDetecRule.leaveTimeMaxNum);
|
|
|
+ pRoomOnWorkInfo->addOneLeaveTime(m_nowTime, m_nowChnDetecRule.leaveTimeMaxNum);
|
|
|
auto strLeaveTime = pRoomOnWorkInfo->getLeaveTimeString();
|
|
|
if(strLeaveTime != "")
|
|
|
{
|
|
@@ -638,7 +672,7 @@ void FuncOnAndOffJob::offWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<
|
|
|
/* 没有写入数据库,现在写入 */
|
|
|
|
|
|
/* 判断单次离岗超时,计算时间差,leaveOneTime设置为0表示不启用检测 */
|
|
|
- int nLeaveTime = pRoomOnWorkInfo->StartTime.secsTo(m_curTime);
|
|
|
+ int nLeaveTime = pRoomOnWorkInfo->StartTime.secsTo(m_nowTime);
|
|
|
if(nLeaveTime > m_nowChnDetecRule.leaveOneTime && m_nowChnDetecRule.leaveOneTime > 0)
|
|
|
{
|
|
|
AlarmInfo alarmInfo;
|
|
@@ -693,7 +727,7 @@ void FuncOnAndOffJob::offWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<
|
|
|
(m_nowChnDetecRule.leaveNumOnTime > 0) && (m_nowChnDetecRule.leaveTimeMaxNum > 0))
|
|
|
{
|
|
|
/* 计算距离第一次离岗时间长度 */
|
|
|
- int nLeaveTime = pRoomOnWorkInfo->listLeaveTime.front().secsTo(m_curTime);
|
|
|
+ int nLeaveTime = pRoomOnWorkInfo->listLeaveTime.front().secsTo(m_nowTime);
|
|
|
if(nLeaveTime <= m_nowChnDetecRule.leaveOneTime)
|
|
|
{
|
|
|
AlarmInfo alarmInfo;
|
|
@@ -751,12 +785,12 @@ void FuncOnAndOffJob::offWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<
|
|
|
|
|
|
|
|
|
/* 删除离岗人员和未知人员信息 */
|
|
|
-void FuncOnAndOffJob::deleteNoWorkPerson(std::list<PersonInfo>& listPersonInfo)
|
|
|
+void FuncOnAndOffWork::deleteNoWorkPerson(std::list<PersonInfo>& listPersonInfo)
|
|
|
{
|
|
|
/* 删除离岗人员 */
|
|
|
for(auto it = listPersonInfo.begin(); it != listPersonInfo.end();)
|
|
|
{
|
|
|
- if((it->lastOnWork < m_curTime) || it->PersonID == "-1" || it->PersonID == "-2")
|
|
|
+ if((it->lastOnWork < m_nowTime) || it->PersonID == "-1" || it->PersonID == "-2")
|
|
|
{
|
|
|
it = listPersonInfo.erase(it);
|
|
|
} else
|
|
@@ -768,7 +802,7 @@ void FuncOnAndOffJob::deleteNoWorkPerson(std::list<PersonInfo>& listPersonInfo)
|
|
|
}
|
|
|
|
|
|
/* 获取当前直播间的摄像机名称列表 */
|
|
|
-std::list<std::string> FuncOnAndOffJob::getCameraNameList(const std::map<int, std::list<std::string>>& mapCameraAction)
|
|
|
+std::list<std::string> FuncOnAndOffWork::getCameraNameList(const std::map<int, std::list<std::string>>& mapCameraAction)
|
|
|
{
|
|
|
std::list<std::string> listCameraName;
|
|
|
for(const auto& it : mapCameraAction)
|
|
@@ -780,7 +814,7 @@ std::list<std::string> FuncOnAndOffJob::getCameraNameList(const std::map<int, st
|
|
|
|
|
|
|
|
|
/* 创建报警记录 */
|
|
|
-// void FuncOnAndOffJob::createAlarmInfo(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo, std::string actionDes, AlarmInfo& alarmInfo)
|
|
|
+// void FuncOnAndOffWork::createAlarmInfo(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo, std::string actionDes, AlarmInfo& alarmInfo)
|
|
|
// {
|
|
|
// if(pRoomOnWorkInfo == nullptr)
|
|
|
// {
|
|
@@ -805,3 +839,55 @@ std::list<std::string> FuncOnAndOffJob::getCameraNameList(const std::map<int, st
|
|
|
// }
|
|
|
|
|
|
|
|
|
+/* 读取Redis数据 */
|
|
|
+// void FuncOnAndOffWork::readRedisData()
|
|
|
+// {
|
|
|
+// m_listSrcAlarm.clearAlarmInfo();
|
|
|
+// /* 读取Redis数据 */
|
|
|
+// for(const auto& roomInfo : m_funcThreadInfo.listRoomCamActInfo)
|
|
|
+// {
|
|
|
+// for(const auto& cam : roomInfo.mapCameraAction)
|
|
|
+// {
|
|
|
+// for(const auto act : cam.second)
|
|
|
+// {
|
|
|
+// /* 读取Redis数据 */
|
|
|
+// std::string strKey = std::to_string(cam.first) + ":" + act;
|
|
|
+// std::string strRetValue;
|
|
|
+// // SPDLOG_LOGGER_DEBUG(m_logger, "读取Redis数据, Key:{}", strKey);
|
|
|
+// if(!m_fromRedis->getRedisString(strKey, strRetValue))
|
|
|
+// {
|
|
|
+// // SPDLOG_LOGGER_ERROR(m_logger, "读取Redis数据失败, Key:{}", strKey);
|
|
|
+// std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
|
+// continue;
|
|
|
+// }
|
|
|
+
|
|
|
+// /* 解析数据,先设置基础数据 */
|
|
|
+// AlarmInfo newAlarmInfo;
|
|
|
+// newAlarmInfo.ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
+// newAlarmInfo.appFunction = m_funcThreadInfo.appFunction;
|
|
|
+// newAlarmInfo.RoomID = roomInfo.RoomID;
|
|
|
+// newAlarmInfo.DeviceID = cam.first;
|
|
|
+// newAlarmInfo.ActionID = act;
|
|
|
+
|
|
|
+
|
|
|
+// parseRedisBaseData(strRetValue, newAlarmInfo);
|
|
|
+// parseRedisBBoxesData(strRetValue, newAlarmInfo);
|
|
|
+// /* 判断事件的时效性,超过多少秒不更新就可能是超脑挂了 */
|
|
|
+// if(!isEventTimeVaild(newAlarmInfo.EventTime))
|
|
|
+// {
|
|
|
+// /* 事件时间超过600秒,可能是超脑挂了 */
|
|
|
+// SPDLOG_LOGGER_WARN(m_logger, "Redis Key:{} 数据长时间没有更新,EventTime:{}",strKey, newAlarmInfo.EventTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
|
|
|
+// std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
+// continue;
|
|
|
+// }
|
|
|
+// m_listSrcAlarm.addAlarmInfo(newAlarmInfo);
|
|
|
+// SPDLOG_LOGGER_DEBUG(m_logger, "报警数据: {}, 房间ID: {}, 报警时间: {}, bBox数目: {}, Person数目: {}",
|
|
|
+// strKey, roomInfo.RoomID, newAlarmInfo.EventTime.toString("yyyy-MM-dd hh:mm:ss").toStdString(),
|
|
|
+// newAlarmInfo.listBbox.size(), newAlarmInfo.listPersonInfo.size());
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+
|