|
@@ -12,6 +12,8 @@
|
|
|
|
|
|
PersonCountRuleInfo::PersonCountRuleInfo()
|
|
PersonCountRuleInfo::PersonCountRuleInfo()
|
|
{
|
|
{
|
|
|
|
+ isUpdate = false;
|
|
|
|
+ noRule = false;
|
|
ChannelID = -1;
|
|
ChannelID = -1;
|
|
// week = 0;
|
|
// week = 0;
|
|
// RuleType = Enum_PeriodType::PERIOD_ALL;
|
|
// RuleType = Enum_PeriodType::PERIOD_ALL;
|
|
@@ -59,55 +61,20 @@ PersonCountRuleInfo& PersonCountRuleInfo::operator=(PersonCountRuleInfo& other)
|
|
return *this;
|
|
return *this;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-EndAlarmParam::EndAlarmParam()
|
|
|
|
-{
|
|
|
|
- ChannelID = -1;
|
|
|
|
- AppID = AppFunction::APP_NONE;
|
|
|
|
- CameraID = -1;
|
|
|
|
- insertAlarmNum = 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-EndAlarmParam::EndAlarmParam(const EndAlarmParam& other)
|
|
|
|
-{
|
|
|
|
- ChannelID = other.ChannelID;
|
|
|
|
- AppID = other.AppID;
|
|
|
|
- CameraID = other.CameraID;
|
|
|
|
- insertAlarmNum = other.insertAlarmNum;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-EndAlarmParam& EndAlarmParam::operator=(const EndAlarmParam& other)
|
|
|
|
-{
|
|
|
|
- if(this != &other)
|
|
|
|
- {
|
|
|
|
- ChannelID = other.ChannelID;
|
|
|
|
- AppID = other.AppID;
|
|
|
|
- CameraID = other.CameraID;
|
|
|
|
- insertAlarmNum = other.insertAlarmNum;
|
|
|
|
- }
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-bool EndAlarmParam::operator==(const EndAlarmParam& other)
|
|
|
|
|
|
+/* 对比规则需不需要更新 */
|
|
|
|
+bool PersonCountRuleInfo::equals(const PersonCountRuleInfo& other) const
|
|
{
|
|
{
|
|
- if(this == &other)
|
|
|
|
- {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- if(ChannelID != other.ChannelID)
|
|
|
|
- {
|
|
|
|
|
|
+ if (ChannelID != other.ChannelID) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
- if(AppID != other.AppID)
|
|
|
|
- {
|
|
|
|
|
|
+ if (LiveMinEnable != other.LiveMinEnable || LiveMaxEnable != other.LiveMaxEnable ||
|
|
|
|
+ DicMinEnable != other.DicMinEnable || DicMaxEnable != other.DicMaxEnable ||
|
|
|
|
+ LiveDicMinEnable != other.LiveDicMinEnable || LiveDicMaxEnable != other.LiveDicMaxEnable) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
- if(CameraID != other.CameraID)
|
|
|
|
- {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- if(insertAlarmNum != other.insertAlarmNum)
|
|
|
|
- {
|
|
|
|
|
|
+ if (LiveMin != other.LiveMin || LiveMax != other.LiveMax ||
|
|
|
|
+ DicMin != other.DicMin || DicMax != other.DicMax ||
|
|
|
|
+ LiveDicMin != other.LiveDicMin || LiveDicMax != other.LiveDicMax) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
return true;
|
|
@@ -146,7 +113,7 @@ RoomPeopleInfo& RoomPeopleInfo::operator=(const RoomPeopleInfo& other)
|
|
|
|
|
|
AlarmBuffer::AlarmBuffer()
|
|
AlarmBuffer::AlarmBuffer()
|
|
{
|
|
{
|
|
- isMax = false;
|
|
|
|
|
|
+ // isMax = false;
|
|
// isInsertDB = false;
|
|
// isInsertDB = false;
|
|
ChannelID = -1;
|
|
ChannelID = -1;
|
|
RoomID = -1;
|
|
RoomID = -1;
|
|
@@ -160,7 +127,7 @@ AlarmBuffer::AlarmBuffer()
|
|
|
|
|
|
AlarmBuffer::AlarmBuffer(const AlarmBuffer& other)
|
|
AlarmBuffer::AlarmBuffer(const AlarmBuffer& other)
|
|
{
|
|
{
|
|
- isMax = other.isMax;
|
|
|
|
|
|
+ // isMax = other.isMax;
|
|
// isInsertDB = other.isInsertDB;
|
|
// isInsertDB = other.isInsertDB;
|
|
ChannelID = other.ChannelID;
|
|
ChannelID = other.ChannelID;
|
|
RoomID = other.RoomID;
|
|
RoomID = other.RoomID;
|
|
@@ -175,7 +142,7 @@ AlarmBuffer::AlarmBuffer(const AlarmBuffer& other)
|
|
AlarmBuffer& AlarmBuffer::operator=(const AlarmBuffer& other)
|
|
AlarmBuffer& AlarmBuffer::operator=(const AlarmBuffer& other)
|
|
{
|
|
{
|
|
if (this != &other) {
|
|
if (this != &other) {
|
|
- isMax = other.isMax;
|
|
|
|
|
|
+ // isMax = other.isMax;
|
|
// isInsertDB = other.isInsertDB;
|
|
// isInsertDB = other.isInsertDB;
|
|
ChannelID = other.ChannelID;
|
|
ChannelID = other.ChannelID;
|
|
RoomID = other.RoomID;
|
|
RoomID = other.RoomID;
|
|
@@ -245,12 +212,24 @@ void FuncRegionalPersonCount::task()
|
|
}
|
|
}
|
|
|
|
|
|
/* 更新报警规则 */
|
|
/* 更新报警规则 */
|
|
- if(!getPersonCountRuleInfo(m_personCountRule))
|
|
|
|
|
|
+ if(!getPersonCountRuleInfo())
|
|
{
|
|
{
|
|
- /* 判断报警是否已经结束,没有结束就结束报警 */
|
|
|
|
- autoEndAlarm();
|
|
|
|
|
|
+ /* 判断是不是无报警规则了 */
|
|
|
|
+ if(m_personCountRule.noRule)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 没有报警规则,退出功能检测线程", m_baseLog);
|
|
|
|
+ /* 判断报警是否已经结束,没有结束就结束报警 */
|
|
|
|
+ autoEndAlarm();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
+ if(m_personCountRule.isUpdate)
|
|
|
|
+ {
|
|
|
|
+ /* 报警规则更新了,结束报警 */
|
|
|
|
+ autoEndAlarm();
|
|
|
|
+ }
|
|
|
|
|
|
/* 更新房间列表 */
|
|
/* 更新房间列表 */
|
|
updateRoomList();
|
|
updateRoomList();
|
|
@@ -286,6 +265,11 @@ void FuncRegionalPersonCount::task()
|
|
|
|
|
|
/* 解析数据 */
|
|
/* 解析数据 */
|
|
AlarmInfo alarmInfo;
|
|
AlarmInfo alarmInfo;
|
|
|
|
+ alarmInfo.ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
|
+ alarmInfo.RoomID = RoomInfo.RoomID;
|
|
|
|
+ alarmInfo.appFunction = m_funcThreadInfo.appFunction;
|
|
|
|
+ alarmInfo.ActionID = act;
|
|
|
|
+
|
|
parseRedisBaseData(strRetValue, alarmInfo);
|
|
parseRedisBaseData(strRetValue, alarmInfo);
|
|
parseOtherDataPersonCount(strRetValue, alarmInfo);
|
|
parseOtherDataPersonCount(strRetValue, alarmInfo);
|
|
/* 判断事件的时效性,超过多少秒不更新就可能是超脑挂了 */
|
|
/* 判断事件的时效性,超过多少秒不更新就可能是超脑挂了 */
|
|
@@ -300,6 +284,10 @@ void FuncRegionalPersonCount::task()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "房间数目: {}, 报警条目数目: {}", m_listRoomCamAct.size(), m_pListAlarm->listAlarmInfo.size());
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "报警人数: {}", m_pListAlarm->listAlarmInfo.front()->listPersonInfo.size());
|
|
|
|
+
|
|
/************ 挨个房间检测人数,取出每个房间内人数的最大值 ************/
|
|
/************ 挨个房间检测人数,取出每个房间内人数的最大值 ************/
|
|
for(const auto& RoomInfo : m_listRoomCamAct)
|
|
for(const auto& RoomInfo : m_listRoomCamAct)
|
|
{
|
|
{
|
|
@@ -317,18 +305,39 @@ void FuncRegionalPersonCount::task()
|
|
/************ 单独判断每个房间内人数的最大值和最小值 ************/
|
|
/************ 单独判断每个房间内人数的最大值和最小值 ************/
|
|
for(const auto& it : m_mapRoomPeople)
|
|
for(const auto& it : m_mapRoomPeople)
|
|
{
|
|
{
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "房间:{} 人数: {}", it.second.RoomName, it.second.MaxNum);
|
|
/* 处理房间内的人数最大值 */
|
|
/* 处理房间内的人数最大值 */
|
|
handleRoomMaxNum(it.second);
|
|
handleRoomMaxNum(it.second);
|
|
|
|
+ /* 处理房间内人数最小值 */
|
|
|
|
+ handleRoomMinNum(it.second);
|
|
}
|
|
}
|
|
|
|
|
|
/************ 检测频率直播间 + 导播间房间的人数 ************/
|
|
/************ 检测频率直播间 + 导播间房间的人数 ************/
|
|
-
|
|
|
|
|
|
+ int liveDicMaxNum = 0;
|
|
|
|
+ std::string strImagePath = "";
|
|
|
|
+ for(const auto& it : m_mapRoomPeople)
|
|
|
|
+ {
|
|
|
|
+ /* 直播间 + 导播间 */
|
|
|
|
+ if(it.second.RoomType == Enum_RoomType::ROOM_LIVE || it.second.RoomType == Enum_RoomType::ROOM_DIC)
|
|
|
|
+ {
|
|
|
|
+ liveDicMaxNum += it.second.MaxNum;
|
|
|
|
+ strImagePath = it.second.imagePath;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ RoomPeopleInfo liveDicMaxNumInfo;
|
|
|
|
+ liveDicMaxNumInfo.RoomID = 0;
|
|
|
|
+ liveDicMaxNumInfo.RoomType = Enum_RoomType::ROOM_LIVEDIC;
|
|
|
|
+ liveDicMaxNumInfo.MaxNum = liveDicMaxNum;
|
|
|
|
+ liveDicMaxNumInfo.imagePath = strImagePath;
|
|
|
|
+ liveDicMaxNumInfo.RoomName = "直播间+导播间";
|
|
|
|
+ handleRoomMaxNum(liveDicMaxNumInfo);
|
|
|
|
+ handleRoomMinNum(liveDicMaxNumInfo);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/* 获取该频率的人员计数规则 */
|
|
/* 获取该频率的人员计数规则 */
|
|
-bool FuncRegionalPersonCount::getPersonCountRuleInfo(PersonCountRuleInfo& personCountRuleInfo)
|
|
|
|
|
|
+bool FuncRegionalPersonCount::getPersonCountRuleInfo()
|
|
{
|
|
{
|
|
std::list<PersonCountRuleInfo> listRule;
|
|
std::list<PersonCountRuleInfo> listRule;
|
|
if(!m_fromWebAPI->getPersonCountRuleInfo(listRule))
|
|
if(!m_fromWebAPI->getPersonCountRuleInfo(listRule))
|
|
@@ -344,65 +353,35 @@ bool FuncRegionalPersonCount::getPersonCountRuleInfo(PersonCountRuleInfo& person
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
/* 获取这个频率的报警信息 */
|
|
/* 获取这个频率的报警信息 */
|
|
- m_personCountRule.ChannelID = -1;
|
|
|
|
|
|
+ bool isFind = false;
|
|
|
|
+ m_personCountRule.noRule = false;
|
|
|
|
+ m_personCountRule.isUpdate = false;
|
|
for(auto& it : listRule)
|
|
for(auto& it : listRule)
|
|
{
|
|
{
|
|
if(it.ChannelID == m_funcThreadInfo.ChannelID)
|
|
if(it.ChannelID == m_funcThreadInfo.ChannelID)
|
|
{
|
|
{
|
|
- m_personCountRule = it;
|
|
|
|
|
|
+ isFind = true;
|
|
|
|
+ /* 判断规则是否有更新 */
|
|
|
|
+ if(!it.equals(m_personCountRule))
|
|
|
|
+ {
|
|
|
|
+ /* 规则有更新 */
|
|
|
|
+ m_personCountRule = it;
|
|
|
|
+ m_personCountRule.isUpdate = true;
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 报警规则有更新", m_baseLog);
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if(m_personCountRule.ChannelID == -1)
|
|
|
|
|
|
+ if(!isFind)
|
|
{
|
|
{
|
|
SPDLOG_LOGGER_ERROR(m_logger, "频率:{}《人员计数》无报警规则", m_funcThreadInfo.ChannelID);
|
|
SPDLOG_LOGGER_ERROR(m_logger, "频率:{}《人员计数》无报警规则", m_funcThreadInfo.ChannelID);
|
|
|
|
+ m_personCountRule.noRule = true;
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-/* 判断是否在检测时间段内 */
|
|
|
|
-// bool FuncRegionalPersonCount::isInPeriodTime()
|
|
|
|
-// {
|
|
|
|
-// /* 所有时段 */
|
|
|
|
-// if(m_personCountRule.RuleType == Enum_PeriodType::PERIOD_ALL)
|
|
|
|
-// {
|
|
|
|
-// return true;
|
|
|
|
-// }
|
|
|
|
-// /* 按天检测 */
|
|
|
|
-// else if(m_personCountRule.RuleType == Enum_PeriodType::PERIOD_DAY)
|
|
|
|
-// {
|
|
|
|
-// if(m_personCountRule.StartTime <= m_nowTime && m_personCountRule.EndTime >= m_nowTime)
|
|
|
|
-// {
|
|
|
|
-// /* 在检测时间内 */
|
|
|
|
-// return true;
|
|
|
|
-// } else {
|
|
|
|
-// /* 不在检测时间内 */
|
|
|
|
-// return false;
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// /* 按周检测 */
|
|
|
|
-// else if (m_personCountRule.RuleType == Enum_PeriodType::PERIOD_WEEK)
|
|
|
|
-// {
|
|
|
|
-// if(m_personCountRule.week != m_nowTime.date().dayOfWeek())
|
|
|
|
-// {
|
|
|
|
-// /* 一周日期不相等 */
|
|
|
|
-// return false;
|
|
|
|
-// }
|
|
|
|
-// /* 判断周日期是否相等 */
|
|
|
|
-// if(m_personCountRule.StartTime.time() <= m_nowTime.time() && m_personCountRule.EndTime.time() >= m_nowTime.time())
|
|
|
|
-// {
|
|
|
|
-// return true;
|
|
|
|
-// } else {
|
|
|
|
-// /* 不在检测时间内 */
|
|
|
|
-// return false;
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
-// return true;
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
|
|
|
|
/* 更新房间列表 */
|
|
/* 更新房间列表 */
|
|
void FuncRegionalPersonCount::updateRoomList()
|
|
void FuncRegionalPersonCount::updateRoomList()
|
|
@@ -424,45 +403,23 @@ void FuncRegionalPersonCount::updateRoomList()
|
|
/* 自动结束报警 */
|
|
/* 自动结束报警 */
|
|
void FuncRegionalPersonCount::autoEndAlarm()
|
|
void FuncRegionalPersonCount::autoEndAlarm()
|
|
{
|
|
{
|
|
- EndAlarmParam alarmParam;
|
|
|
|
- alarmParam.ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
|
- alarmParam.AppID = m_funcThreadInfo.appFunction;
|
|
|
|
/* 判断报警是否已经结束,没有结束就结束报警 */
|
|
/* 判断报警是否已经结束,没有结束就结束报警 */
|
|
- if(findAlarmEnd(alarmParam))
|
|
|
|
|
|
+ if(m_mapAlarmBuffer.empty())
|
|
{
|
|
{
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "频率:{}《人员计数》报警已经结束", m_funcThreadInfo.strChannelName);
|
|
|
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "{} 报警已经结束", m_baseLog);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- if(!m_fromWebAPI->endPersonCountAlarm(alarmParam))
|
|
|
|
|
|
+ /* 结束该频率人员计数的所有报警 */
|
|
|
|
+ if(!m_fromWebAPI->endPersonCountAlarm(m_funcThreadInfo.ChannelID, m_funcThreadInfo.appFunction))
|
|
{
|
|
{
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "频率:{}《人员计数》结束报警失败", m_funcThreadInfo.strChannelName);
|
|
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 结束报警失败", m_baseLog);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- /* 记录已经结束报警的信息,限制一下记录列表的大小 */
|
|
|
|
- if(m_listEndAlarmPara.size() > 1024)
|
|
|
|
- {
|
|
|
|
- m_listEndAlarmPara.clear();
|
|
|
|
- }
|
|
|
|
- m_listEndAlarmPara.push_back(alarmParam);
|
|
|
|
-
|
|
|
|
|
|
+ /* 清空报警列表 */
|
|
|
|
+ clearAlarmBufferMap();
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 结束报警,已清空报警缓存", m_baseLog);
|
|
}
|
|
}
|
|
|
|
|
|
-/* 查找是否已经结束了报警 */
|
|
|
|
-bool FuncRegionalPersonCount::findAlarmEnd(EndAlarmParam& alarmParam)
|
|
|
|
-{
|
|
|
|
- if(m_listEndAlarmPara.empty())
|
|
|
|
- {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- for(auto& it : m_listEndAlarmPara)
|
|
|
|
- {
|
|
|
|
- if(it == alarmParam)
|
|
|
|
- {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return false;
|
|
|
|
-}
|
|
|
|
|
|
|
|
/* 取出一个房间内的最大人数 */
|
|
/* 取出一个房间内的最大人数 */
|
|
bool FuncRegionalPersonCount::getRoomMaxNum(int roomID, int& maxNum, std::string& strImagePath)
|
|
bool FuncRegionalPersonCount::getRoomMaxNum(int roomID, int& maxNum, std::string& strImagePath)
|
|
@@ -499,7 +456,7 @@ void FuncRegionalPersonCount::handleRoomMaxNum(const RoomPeopleInfo& peopleInfo)
|
|
{
|
|
{
|
|
if(!m_personCountRule.LiveMaxEnable)
|
|
if(!m_personCountRule.LiveMaxEnable)
|
|
{
|
|
{
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "{} 直播间最大人数检测功能未开启", m_baseLog);
|
|
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 直播间最大人数检测功能未开启", m_baseLog);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
/* 判断有没有名称 */
|
|
/* 判断有没有名称 */
|
|
@@ -515,7 +472,7 @@ void FuncRegionalPersonCount::handleRoomMaxNum(const RoomPeopleInfo& peopleInfo)
|
|
{
|
|
{
|
|
if(!m_personCountRule.DicMaxEnable)
|
|
if(!m_personCountRule.DicMaxEnable)
|
|
{
|
|
{
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "{} 导播间最大人数检测功能未开启", m_baseLog);
|
|
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 导播间最大人数检测功能未开启", m_baseLog);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
/* 判断有没有名称 */
|
|
/* 判断有没有名称 */
|
|
@@ -527,11 +484,11 @@ void FuncRegionalPersonCount::handleRoomMaxNum(const RoomPeopleInfo& peopleInfo)
|
|
}
|
|
}
|
|
maxNum = m_personCountRule.DicMax;
|
|
maxNum = m_personCountRule.DicMax;
|
|
}
|
|
}
|
|
- else if(peopleInfo.RoomType == Enum_RoomType::ROOM_ALL)
|
|
|
|
|
|
+ else if(peopleInfo.RoomType == Enum_RoomType::ROOM_LIVEDIC)
|
|
{
|
|
{
|
|
if(!m_personCountRule.LiveDicMaxEnable)
|
|
if(!m_personCountRule.LiveDicMaxEnable)
|
|
{
|
|
{
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "{} 直播间+导播间最大人数检测功能未开启", m_baseLog);
|
|
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 直播间+导播间最大人数检测功能未开启", m_baseLog);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
/* 判断有没有名称 */
|
|
/* 判断有没有名称 */
|
|
@@ -551,21 +508,29 @@ void FuncRegionalPersonCount::handleRoomMaxNum(const RoomPeopleInfo& peopleInfo)
|
|
|
|
|
|
/* 查找房间信息 */
|
|
/* 查找房间信息 */
|
|
RoomCamActInfo roomInfo;
|
|
RoomCamActInfo roomInfo;
|
|
- if(!findRoomInfo(peopleInfo.RoomID, roomInfo))
|
|
|
|
- {
|
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "房间ID:{},房间信息不存在", peopleInfo.RoomID);
|
|
|
|
- return;
|
|
|
|
|
|
+ if(peopleInfo.RoomType == Enum_RoomType::ROOM_LIVEDIC)
|
|
|
|
+ {
|
|
|
|
+ /* 创造一个摄像机和算法信息 */
|
|
|
|
+ std::list<std::string> listAct;
|
|
|
|
+ listAct.push_back("0");
|
|
|
|
+ roomInfo.mapCameraAction.insert(std::make_pair(0, listAct));
|
|
|
|
+ } else {
|
|
|
|
+ if(!findRoomInfo(peopleInfo.RoomID, roomInfo))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "房间ID:{},房间信息不存在", peopleInfo.RoomID);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/* 开启了最大人数的检测,判断是否超过最大人数 */
|
|
/* 开启了最大人数的检测,判断是否超过最大人数 */
|
|
if(peopleInfo.MaxNum > maxNum)
|
|
if(peopleInfo.MaxNum > maxNum)
|
|
{
|
|
{
|
|
/* 超过了最大人数,判断是否已经加入了内存缓冲区 */
|
|
/* 超过了最大人数,判断是否已经加入了内存缓冲区 */
|
|
- AlarmBuffer alarmBuffer;
|
|
|
|
- if(findAlarmBuffer(peopleInfo.RoomID, alarmBuffer))
|
|
|
|
|
|
+ AlarmBuffer* alarmBuffer = findAlarmBuffer(peopleInfo.RoomID);
|
|
|
|
+ if(alarmBuffer != nullptr)
|
|
{
|
|
{
|
|
/* 更新时间,这里只更新时间吗?最大人数和图片不更新吗? */
|
|
/* 更新时间,这里只更新时间吗?最大人数和图片不更新吗? */
|
|
- alarmBuffer.AlarmTime = m_nowTime;
|
|
|
|
|
|
+ alarmBuffer->AlarmTime = m_nowTime;
|
|
}else
|
|
}else
|
|
{
|
|
{
|
|
/* 没有加入缓冲区,先写入数据库,再加入缓冲区 */
|
|
/* 没有加入缓冲区,先写入数据库,再加入缓冲区 */
|
|
@@ -574,8 +539,9 @@ void FuncRegionalPersonCount::handleRoomMaxNum(const RoomPeopleInfo& peopleInfo)
|
|
alarmInfo.appFunction = m_funcThreadInfo.appFunction;
|
|
alarmInfo.appFunction = m_funcThreadInfo.appFunction;
|
|
alarmInfo.RoomID = peopleInfo.RoomID;
|
|
alarmInfo.RoomID = peopleInfo.RoomID;
|
|
alarmInfo.DeviceID = roomInfo.mapCameraAction.begin()->first;
|
|
alarmInfo.DeviceID = roomInfo.mapCameraAction.begin()->first;
|
|
- alarmInfo.ImageInfo = peopleInfo.imagePath;
|
|
|
|
|
|
+ alarmInfo.PicUrl = peopleInfo.imagePath;
|
|
alarmInfo.ActionID = roomInfo.mapCameraAction.begin()->second.front();
|
|
alarmInfo.ActionID = roomInfo.mapCameraAction.begin()->second.front();
|
|
|
|
+ alarmInfo.StartTime = m_nowTime.toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString();
|
|
alarmInfo.EventTime = m_nowTime.toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString();
|
|
alarmInfo.EventTime = m_nowTime.toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString();
|
|
alarmInfo.Is_Alarm = true;
|
|
alarmInfo.Is_Alarm = true;
|
|
alarmInfo.ActionDes = fmt::format("{}人数为{},已超过最大人数{}限制",
|
|
alarmInfo.ActionDes = fmt::format("{}人数为{},已超过最大人数{}限制",
|
|
@@ -590,59 +556,236 @@ void FuncRegionalPersonCount::handleRoomMaxNum(const RoomPeopleInfo& peopleInfo)
|
|
SPDLOG_LOGGER_ERROR(m_logger, "{} 写入报警信息失败", m_baseLog);
|
|
SPDLOG_LOGGER_ERROR(m_logger, "{} 写入报警信息失败", m_baseLog);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 房间: {},超过最大人数{},报警开始,已写入数据库",
|
|
|
|
+ m_baseLog, roomName, maxNum);
|
|
/* 将报警信息写入缓存中 */
|
|
/* 将报警信息写入缓存中 */
|
|
- alarmBuffer.isMax = true;
|
|
|
|
|
|
+ // alarmBuffer.isMax = true;
|
|
// alarmBuffer.isInsertDB = true;
|
|
// alarmBuffer.isInsertDB = true;
|
|
- alarmBuffer.ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
|
- alarmBuffer.RoomID = peopleInfo.RoomID;
|
|
|
|
- alarmBuffer.PKID = pkid;
|
|
|
|
- alarmBuffer.RoomType = peopleInfo.RoomType;
|
|
|
|
- alarmBuffer.PeopleNum = peopleInfo.MaxNum;
|
|
|
|
- alarmBuffer.AlarmTime = m_nowTime;
|
|
|
|
- alarmBuffer.imagePath = peopleInfo.imagePath;
|
|
|
|
- alarmBuffer.actionDecs = alarmInfo.ActionDes;
|
|
|
|
|
|
+ AlarmBuffer* alarmBuffer = new AlarmBuffer();
|
|
|
|
+ if(alarmBuffer == nullptr)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 创建报警缓冲区失败", m_baseLog);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ alarmBuffer->ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
|
+ alarmBuffer->RoomID = peopleInfo.RoomID;
|
|
|
|
+ alarmBuffer->PKID = pkid;
|
|
|
|
+ alarmBuffer->RoomType = peopleInfo.RoomType;
|
|
|
|
+ alarmBuffer->PeopleNum = peopleInfo.MaxNum;
|
|
|
|
+ alarmBuffer->AlarmTime = m_nowTime;
|
|
|
|
+ alarmBuffer->imagePath = peopleInfo.imagePath;
|
|
|
|
+ alarmBuffer->actionDecs = alarmInfo.ActionDes;
|
|
m_mapAlarmBuffer.insert(std::make_pair(peopleInfo.RoomID, alarmBuffer));
|
|
m_mapAlarmBuffer.insert(std::make_pair(peopleInfo.RoomID, alarmBuffer));
|
|
}
|
|
}
|
|
}else
|
|
}else
|
|
{
|
|
{
|
|
/* 未超过最大人数,判断是否已经写入的数据库,如果已经写入了数据库,就结束报警 */
|
|
/* 未超过最大人数,判断是否已经写入的数据库,如果已经写入了数据库,就结束报警 */
|
|
- AlarmBuffer alarmBuffer;
|
|
|
|
- if(findAlarmBuffer(peopleInfo.RoomID, alarmBuffer))
|
|
|
|
|
|
+ AlarmBuffer* alarmBuffer = findAlarmBuffer(peopleInfo.RoomID);
|
|
|
|
+ if(alarmBuffer != nullptr)
|
|
{
|
|
{
|
|
/* 已写入数据库,结束报警,但是需要注意,人数少于一定时间后才结束报警,不会立马结束 */
|
|
/* 已写入数据库,结束报警,但是需要注意,人数少于一定时间后才结束报警,不会立马结束 */
|
|
- if(alarmBuffer.AlarmTime.secsTo(m_nowTime) > GVariable.AppPeopleCount_LessTime)
|
|
|
|
|
|
+ if(alarmBuffer->AlarmTime.secsTo(m_nowTime) > GVariable.AppPeopleCount_LessTime)
|
|
{
|
|
{
|
|
SPDLOG_LOGGER_INFO(m_logger, "{} 房间: {},超过最大人数{},报警结束",
|
|
SPDLOG_LOGGER_INFO(m_logger, "{} 房间: {},超过最大人数{},报警结束",
|
|
m_baseLog, roomName, maxNum);
|
|
m_baseLog, roomName, maxNum);
|
|
/* 结束报警 */
|
|
/* 结束报警 */
|
|
- if(!m_fromWebAPI->endAlarmInfoByPKID(alarmBuffer.PKID, m_nowTime))
|
|
|
|
|
|
+ if(!m_fromWebAPI->endAlarmInfoByPKID(alarmBuffer->PKID, m_nowTime))
|
|
{
|
|
{
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "{} 结束超过最大人数报警失败,PKID: {}", m_baseLog, alarmBuffer.PKID);
|
|
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 结束超过最大人数报警失败,PKID: {}", m_baseLog, alarmBuffer->PKID);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
/* 删除报警缓冲区 */
|
|
/* 删除报警缓冲区 */
|
|
m_mapAlarmBuffer.erase(peopleInfo.RoomID);
|
|
m_mapAlarmBuffer.erase(peopleInfo.RoomID);
|
|
|
|
+ delete alarmBuffer;
|
|
|
|
+ alarmBuffer = nullptr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+/* 处理房间内人数最小值 */
|
|
|
|
+void FuncRegionalPersonCount::handleRoomMinNum(const RoomPeopleInfo& peopleInfo)
|
|
|
|
+{
|
|
|
|
+ std::string roomName = "";
|
|
|
|
+ int minNum = 0;
|
|
|
|
+ /* 判断当前房间是否开启了最少人员检测功能 */
|
|
|
|
+ if(peopleInfo.RoomType == Enum_RoomType::ROOM_LIVE)
|
|
|
|
+ {
|
|
|
|
+ if(!m_personCountRule.LiveMinEnable)
|
|
|
|
+ {
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 直播间最少人数检测功能未开启", m_baseLog);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ /* 判断有没有名称 */
|
|
|
|
+ if(peopleInfo.RoomName.empty())
|
|
|
|
+ {
|
|
|
|
+ roomName = "直播间";
|
|
|
|
+ } else {
|
|
|
|
+ roomName = peopleInfo.RoomName;
|
|
|
|
+ }
|
|
|
|
+ minNum = m_personCountRule.LiveMin;
|
|
|
|
+ }
|
|
|
|
+ else if(peopleInfo.RoomType == Enum_RoomType::ROOM_DIC)
|
|
|
|
+ {
|
|
|
|
+ if(!m_personCountRule.DicMinEnable)
|
|
|
|
+ {
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 导播间最少人数检测功能未开启", m_baseLog);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ /* 判断有没有名称 */
|
|
|
|
+ if(peopleInfo.RoomName.empty())
|
|
|
|
+ {
|
|
|
|
+ roomName = "导播间";
|
|
|
|
+ } else {
|
|
|
|
+ roomName = peopleInfo.RoomName;
|
|
|
|
+ }
|
|
|
|
+ minNum = m_personCountRule.DicMin;
|
|
|
|
+ }
|
|
|
|
+ else if(peopleInfo.RoomType == Enum_RoomType::ROOM_LIVEDIC)
|
|
|
|
+ {
|
|
|
|
+ if(!m_personCountRule.LiveDicMinEnable)
|
|
|
|
+ {
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 直播间+导播间最少人数检测功能未开启", m_baseLog);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ /* 判断有没有名称 */
|
|
|
|
+ if(peopleInfo.RoomName.empty())
|
|
|
|
+ {
|
|
|
|
+ roomName = "直播间+导播间";
|
|
|
|
+ } else {
|
|
|
|
+ roomName = peopleInfo.RoomName;
|
|
|
|
+ }
|
|
|
|
+ minNum = m_personCountRule.LiveDicMin;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "{} 房间类型错误", m_baseLog);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 查找房间信息 */
|
|
|
|
+ RoomCamActInfo roomInfo;
|
|
|
|
+ if(peopleInfo.RoomType == Enum_RoomType::ROOM_LIVEDIC)
|
|
|
|
+ {
|
|
|
|
+ /* 创造一个摄像机和算法信息 */
|
|
|
|
+ std::list<std::string> listAct;
|
|
|
|
+ listAct.push_back("0");
|
|
|
|
+ roomInfo.mapCameraAction.insert(std::make_pair(0, listAct));
|
|
|
|
+ } else {
|
|
|
|
+ if(!findRoomInfo(peopleInfo.RoomID, roomInfo))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "房间ID:{},房间信息不存在", peopleInfo.RoomID);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 开启了最小人数的检测,判断是否小于最少人数
|
|
|
|
+ 如果小于,不会立刻写入数据库,先存储到缓存中,经过一定时间后再写入数据库 */
|
|
|
|
+ if(peopleInfo.MaxNum < minNum)
|
|
|
|
+ {
|
|
|
|
+ /* 小于最少人数,判断是否已经加入了内存缓冲区 */
|
|
|
|
+ AlarmBuffer* alarmBuffer = findAlarmBuffer(peopleInfo.RoomID);
|
|
|
|
+ if(alarmBuffer != nullptr)
|
|
|
|
+ {
|
|
|
|
+ /* 已经存在缓存中了,判断是否已经写入数据库 */
|
|
|
|
+ if(alarmBuffer->PKID == 0)
|
|
|
|
+ {
|
|
|
|
+ /* 还未写入数据库,判断是否超过时间 */
|
|
|
|
+ // if(alarmBuffer->AlarmTime.secsTo(m_nowTime) > 2)
|
|
|
|
+ if(alarmBuffer->AlarmTime.secsTo(m_nowTime) > GVariable.AppPeopleCount_LessTime)
|
|
|
|
+ {
|
|
|
|
+ /* 超过时间,写入数据库 */
|
|
|
|
+ AlarmInfo alarmInfo;
|
|
|
|
+ alarmInfo.ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
|
+ alarmInfo.appFunction = m_funcThreadInfo.appFunction;
|
|
|
|
+ alarmInfo.RoomID = peopleInfo.RoomID;
|
|
|
|
+ alarmInfo.DeviceID = roomInfo.mapCameraAction.begin()->first;
|
|
|
|
+ alarmInfo.PicUrl = peopleInfo.imagePath;
|
|
|
|
+ alarmInfo.ActionID = roomInfo.mapCameraAction.begin()->second.front();
|
|
|
|
+ alarmInfo.EventTime = m_nowTime.toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString();
|
|
|
|
+ alarmInfo.Is_Alarm = true;
|
|
|
|
+ alarmInfo.ActionDes = fmt::format("{}人数为{},已低于最小人数{}限制",
|
|
|
|
+ roomName, peopleInfo.MaxNum, minNum);
|
|
|
|
+ for(auto& it : roomInfo.mapCameraAction)
|
|
|
|
+ {
|
|
|
|
+ alarmInfo.listBbox.push_back(GConfig.getCameraName(it.first));
|
|
|
|
+ }
|
|
|
|
+ int pkid = 0;
|
|
|
|
+ if(!m_fromWebAPI->insertAlarmInfo(alarmInfo, pkid))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 写入报警信息失败", m_baseLog);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 房间: {},人数为{},已低于最小人数{}限制,已写入数据库",
|
|
|
|
+ m_baseLog, roomName, peopleInfo.MaxNum, minNum);
|
|
|
|
+ /* 更新报警缓冲区 */
|
|
|
|
+ alarmBuffer->PKID = pkid;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else
|
|
|
|
+ {
|
|
|
|
+ AlarmBuffer* alarmBuffer = new AlarmBuffer();
|
|
|
|
+ if(alarmBuffer == nullptr)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 创建报警缓冲区失败", m_baseLog);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ /* 将报警信息写入缓存中 */
|
|
|
|
+ alarmBuffer->ChannelID = m_funcThreadInfo.ChannelID;
|
|
|
|
+ alarmBuffer->RoomID = peopleInfo.RoomID;
|
|
|
|
+ alarmBuffer->PKID = 0;
|
|
|
|
+ alarmBuffer->RoomType = peopleInfo.RoomType;
|
|
|
|
+ alarmBuffer->PeopleNum = peopleInfo.MaxNum;
|
|
|
|
+ alarmBuffer->AlarmTime = m_nowTime;
|
|
|
|
+ alarmBuffer->imagePath = peopleInfo.imagePath;
|
|
|
|
+ m_mapAlarmBuffer.insert(std::make_pair(peopleInfo.RoomID, alarmBuffer));
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 房间: {},人数为{},已低于最小人数{}限制,已写入缓存",
|
|
|
|
+ m_baseLog, roomName, peopleInfo.MaxNum, minNum);
|
|
|
|
+ }
|
|
|
|
+ }else
|
|
|
|
+ {
|
|
|
|
+ /* 不小于最少人数 */
|
|
|
|
+ auto alarmBuffer = findAlarmBuffer(peopleInfo.RoomID);
|
|
|
|
+ if(alarmBuffer != nullptr)
|
|
|
|
+ {
|
|
|
|
+ /* 判断是否已经写入数据库 */
|
|
|
|
+ if(alarmBuffer->PKID != 0)
|
|
|
|
+ {
|
|
|
|
+ /* 已经写入数据库,结束报警 */
|
|
|
|
+ if(!m_fromWebAPI->endAlarmInfoByPKID(alarmBuffer->PKID, m_nowTime))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 结束低于最小人数报警失败,PKID: {}", m_baseLog, alarmBuffer->PKID);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 房间: {},人数为{},结束低于最小人数{}报警",
|
|
|
|
+ m_baseLog, roomName, peopleInfo.MaxNum, minNum);
|
|
|
|
+ /* 删除报警缓冲区 */
|
|
|
|
+ m_mapAlarmBuffer.erase(peopleInfo.RoomID);
|
|
|
|
+ delete alarmBuffer;
|
|
|
|
+ alarmBuffer = nullptr;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
/* 根据房间ID查找报警缓冲区 */
|
|
/* 根据房间ID查找报警缓冲区 */
|
|
-bool FuncRegionalPersonCount::findAlarmBuffer(int roomID, AlarmBuffer& alarmBuffer)
|
|
|
|
|
|
+AlarmBuffer* FuncRegionalPersonCount::findAlarmBuffer(int roomID)
|
|
{
|
|
{
|
|
if(m_mapAlarmBuffer.empty())
|
|
if(m_mapAlarmBuffer.empty())
|
|
{
|
|
{
|
|
- return false;
|
|
|
|
|
|
+ return nullptr;
|
|
}
|
|
}
|
|
for(auto& it : m_mapAlarmBuffer)
|
|
for(auto& it : m_mapAlarmBuffer)
|
|
{
|
|
{
|
|
if(it.first == roomID)
|
|
if(it.first == roomID)
|
|
{
|
|
{
|
|
- alarmBuffer = it.second;
|
|
|
|
- return true;
|
|
|
|
|
|
+ return it.second;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return false;
|
|
|
|
|
|
+ return nullptr;
|
|
}
|
|
}
|
|
|
|
|
|
/* 根据房间ID查找房间信息 */
|
|
/* 根据房间ID查找房间信息 */
|
|
@@ -664,3 +807,18 @@ bool FuncRegionalPersonCount::findRoomInfo(int roomID, RoomCamActInfo& roomInfo)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+/* 清空报警列表 */
|
|
|
|
+void FuncRegionalPersonCount::clearAlarmBufferMap()
|
|
|
|
+{
|
|
|
|
+ for(auto& it : m_mapAlarmBuffer)
|
|
|
|
+ {
|
|
|
|
+ if(it.second != nullptr)
|
|
|
|
+ {
|
|
|
|
+ delete it.second;
|
|
|
|
+ it.second = nullptr;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ m_mapAlarmBuffer.clear();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|