2025-03-17 09:23:17 +08:00

819 lines
23 KiB
C++

#include "AlarmMng.h"
#include "public/pub_sysinfo_api/SysInfoApi.h"
#include "pub_utility_api/CharUtil.h"
#include "perm_mng_api/PermMngApi.h"
#include "pub_logger_api/logger.h"
#include <QMutexLocker>
#include <QSqlQuery>
using namespace iot_dbms;
using namespace iot_public;
using namespace std;
AlarmMng *AlarmMng::pInstance = NULL;
AlarmMng *AlarmMng::instance()
{
if(pInstance == NULL)
{
pInstance = new AlarmMng();
qRegisterMetaType<QStringList>("QStringList");
}
return pInstance;
}
void AlarmMng::destory()
{
if(m_rtdbAccess != NULL)
{
delete m_rtdbAccess;
}
m_rtdbAccess = NULL;
m_locMap.clear();
m_locOrder.clear();
m_devgMap.clear();
m_devMap.clear();
m_devTreeInfo.clear();
if(m_pReadDb)
{
delete m_pReadDb;
}
m_pReadDb = NULL;
pInstance = NULL;
delete this;
}
QMap<QString, QString> AlarmMng::getDevTpType()
{
QMutexLocker locker(mutex);
return m_devTpTypeMap;
}
QMap<int, QMap<QString, QList<QString> > > AlarmMng::getDevTreeInfo()
{
QMutexLocker locker(mutex);
return m_devTreeInfo;
}
QMap<int, QList<QString> > AlarmMng::getDevGroupTreeInfo()
{
QMutexLocker locker(mutex);
return m_devgTreeInfo;
}
QList<QString> AlarmMng::getDevGroupInfo(int locId)
{
QMutexLocker locker(mutex);
return m_devgTreeInfo.value(locId);
}
QString AlarmMng::getLocDescById(int locId)
{
LOGDEBUG("车站id:%d",locId);
return m_locMap.value(locId,tr("未知车站"));
}
QString AlarmMng::getDevgDescByTag(const QString &tag)
{
return m_devgMap.value(tag,tr("未知设备组"));
}
QString AlarmMng::getDevDescByTag(const QString &tag)
{
return m_devMap.value(tag,tr("未知设备"));
}
QMap<QString, QString> AlarmMng::getDevInfo()
{
return m_devMap;
}
QMap<QString, QString> AlarmMng::getDevgInfo()
{
return m_devgMap;
}
QMap<int, QString> AlarmMng::getLocInfo()
{
return m_locMap;
}
QList<int> AlarmMng::getLocOrder()
{
return m_locOrder;
}
QMap<QString, QString> AlarmMng::getDevType()
{
return m_devTypeMap;
}
QMap<int, QString> AlarmMng::getAlarmAction()
{
return m_alarmActionMap;
}
QMap<int, int> AlarmMng::getAlarmLevelAction()
{
return m_alarmLevelActionMap;
}
QMap<int, QString> AlarmMng::getAlarmLevel()
{
return m_alarmLevelMap;
}
bool AlarmMng::isDiObjAlarm(PointInfoPtr info,ST_OBJ_INFO &objInfo)
{
QSqlQuery query;
QString table = "digital";
QString sql = QString("select is_obj_alm_manner,alarm_priority,"
"pic_name,sound_name1 from %1 where tag_name = '%2' limit 1").arg(table).arg(info->m_tag);
if(!m_pReadDb->isOpen())
{
return false;
}
if(m_pReadDb->execute(sql,query))
{
while (query.next()) {
bool isObj = query.value(0).toBool();
objInfo.bIsObj = isObj;
objInfo.iPriority = query.value(1).toInt();
objInfo.strPushPic = query.value(2).toString();
objInfo.strVoice = query.value(3).toString();
return isObj;
}
}
return false;
}
bool AlarmMng::isAiObjAlarm(PointInfoPtr info, ST_OBJ_INFO &objInfo, ST_LIMIT_INFO &limitInfo)
{
QSqlQuery query;
bool isLimit = false;
QString table = "analog";
QString tableLimit = "analog_limit_info";
QString stVoice;
QString sql =QString("select is_limit,sound_name1 from %1 where tag_name = '%2' limit 1").arg(table).arg(info->m_tag);
if(!m_pReadDb->isOpen())
{
return false;
}
if(m_pReadDb->execute(sql,query))
{
while (query.next()) {
isLimit = query.value(0).toBool();
stVoice = query.value(1).toString();
break;
}
}
limitInfo.bIsLimit =isLimit;
objInfo.strVoice = stVoice;
objInfo.bIsObj = false;
if(!isLimit)
{
return isLimit;
}else
{
sql = QString("select limit_num,limit_up1,limit_low1,limit_up2,limit_low2,is_obj_alm_manner"
",alarm_priority,pic_name from %1 where tag_name = '%2' limit 1").arg(tableLimit).arg(info->m_tag);
if(m_pReadDb->execute(sql,query))
{
while (query.next()) {
limitInfo.iLevel = query.value(0).toInt();
limitInfo.dLimitUp1 = query.value(1).toDouble();
limitInfo.dLimitDown1 = query.value(2).toDouble();
limitInfo.dLimitUp2 = query.value(3).toDouble();
limitInfo.dLimitDown2 = query.value(4).toDouble();
objInfo.bIsObj = query.value(5).toBool();
objInfo.iPriority = query.value(6).toInt();
objInfo.strPushPic = query.value(7).toString();
break;
}
}
}
return isLimit;
}
QMap<int, ST_USER_DEF> AlarmMng::getUserInfo()
{
return m_userInfo;
}
QMap<QString, QString> AlarmMng::getFuncInfo()
{
return m_funcMap;
}
QMap<QString, QList<AlarmCalcInfoPtr> > AlarmMng::getCalcInfo()
{
return m_calcInfoMap;
}
QList<ST_DEV_INFO> AlarmMng::getDevInfoByDevGroup(const QString devGroup)
{
QList<ST_DEV_INFO> devList;
QMap<QString,QList<QString> >::iterator it = m_devgDevMap.find(devGroup);
if(it!= m_devgDevMap.end())
{
QList<QString> devTagList =it.value();
for(int index(0);index<devTagList.size();index++)
{
ST_DEV_INFO info;
info.strDev = devTagList.at(index);
info.nLocId = m_devGlocIdMap.value(devGroup);
info.nSubId = 4;
info.strDevDesc = m_devMap.value(devTagList.at(index));
info.nDevType = m_devTypeIdMap.value(devTagList.at(index));
devList.append(info);
}
}
return devList;
}
QList<QString> AlarmMng::getDiText()
{
return m_diTextList;
}
bool AlarmMng::getNomRptEditPerm()
{
iot_service::CPermMngApiPtr permMngPtr = iot_service::getPermMngInstance("base");
if(permMngPtr == NULL || (PERM_NORMAL != permMngPtr->PermDllInit()))
{
LOGERROR("权限接口初始化失败!");
return false;
}
std::string tmpStr = "FUNC_NOM_RPT_EDIT";
if (PERM_PERMIT != permMngPtr->PermCheck(PERM_NOM_FUNC_DEF, &tmpStr))
{
return false;
}
return true;
}
void AlarmMng::slotSelectPoint(const QString &devg, const int index, const QString &filter)
{
if(devg.isEmpty())
{
return ;
}
QStringList devList = m_devgDevMap.value(devg);
loadPointByDev(devList,index,filter);
}
AlarmMng::AlarmMng()
: QObject()
{
mutex = new QMutex;
m_pReadDb = new iot_dbms::CDbApi(DB_CONN_MODEL_READ);
if(!m_pReadDb->open())
{
LOGERROR("打开数据库失败,error:%s",m_pReadDb->getLastErrorString().toStdString().c_str());
}
m_rtdbAccess = new iot_dbms::CRdbAccess();
loadLocInfo();
loadDevgInfo();
loadDevInfo();
loadDevType();
loadAlarmAction();
loadAlarmLevel();
loadUserInfo();
loadFuncInfo();
loadCalcInfo();
loadDiText();
}
void AlarmMng::loadLocInfo()
{
iot_service::CPermMngApiPtr permMngPtr = iot_service::getPermMngInstance("base");
if(permMngPtr == NULL || (PERM_NORMAL != permMngPtr->PermDllInit()))
{
LOGERROR("权限接口初始化失败!");
return;
}
int level;
std::vector <int> vecLocationId;
std::vector<std::string> vecPermPic;
if (PERM_NORMAL != permMngPtr->GetUsergInfo(level, vecLocationId, vecPermPic))
{
LOGERROR("权限接口获取获取当前登录用户组的等级、所属车站ID失败!");
return;
}
std::string strApplicationName = "base";
std::string strTableName = "sys_model_location_info";
QPair<std::string, std::string> id_value;
id_value.first = "location_id";
id_value.second = "description";
if(m_rtdbAccess->open(strApplicationName.c_str(), strTableName.c_str()))
{
iot_dbms::CTableLockGuard locker(*m_rtdbAccess);
iot_dbms::CRdbQueryResult result;
std::vector<std::string> columns;
columns.push_back(id_value.first);
columns.push_back(id_value.second);
std::string sOrderColumn = "location_no";
if(m_rtdbAccess->select(result, columns, sOrderColumn))
{
m_locMap.clear();
for(int nIndex(0); nIndex < result.getRecordCount(); nIndex++)
{
iot_dbms::CVarType key;
iot_dbms::CVarType value;
result.getColumnValue(nIndex, 0, key);
result.getColumnValue(nIndex, 1, value);
std::vector <int>::const_iterator it = vecLocationId.cbegin();
while (it != vecLocationId.cend())
{
if(key.toInt() == *it)
{
m_locMap[key.toInt()] = QString::fromStdString(value.toStdString());
m_locOrder.push_back(key.toInt());
}
++it;
}
}
}
}
}
void AlarmMng::loadDevgInfo()
{
QList<QString> devList;
QSqlQuery query;
QString strLoctionFilter;
if(m_locMap.keys().isEmpty())
{
return ;
}
QStringList listLocation;
foreach (int nLocationID, m_locMap.keys())
{
listLocation.append(QString::number(nLocationID));
}
strLoctionFilter = QString("(%1 in (%2))").arg("location_id").arg(listLocation.join(","));
QString sqlSequenceQuery = QString("select tag_name, description, location_id from dev_group where sub_system > 3");
if(!strLoctionFilter.isEmpty())
{
sqlSequenceQuery.append(QString(" and %1 order by dev_group_no asc;").arg(strLoctionFilter));
}else
{
sqlSequenceQuery.append(QString(" order by dev_group_no asc;"));
}
if(m_pReadDb->execute(sqlSequenceQuery,query))
{
while(query.next())
{
QString tag = query.value(0).toString();
QString desc = query.value(1).toString();
int loc = query.value(2).toInt();
m_devgMap[tag] = desc;
m_devGlocIdMap[tag] = loc;
m_devTreeInfo[loc].insert(tag, devList);
m_devgTreeInfo[loc].append(tag);
}
}
}
void AlarmMng::loadDevInfo()
{
QSqlQuery query;
QString strLoctionFilter;
if(m_devgMap.isEmpty())
return;
strLoctionFilter = QString("(group_tag_name in ('%1'))").arg(m_devgMap.keys().join("','"));
QString sqlSequenceQuery = QString("select tag_name, description, group_tag_name, location_id,dev_tp_name,dev_type from dev_info");
if(!strLoctionFilter.isEmpty())
{
sqlSequenceQuery.append(QString(" where %1;").arg(strLoctionFilter));
}
if(m_pReadDb->execute(sqlSequenceQuery,query))
{
while(query.next())
{
QString tag = query.value(0).toString();
QString desc = query.value(1).toString();
QString devg = query.value(2).toString();
int locId = query.value(3).toInt();
QString devType = query.value(4).toString();
int nDevType = query.value(5).toInt();
m_devTypeMap[tag] = devType;
m_devMap[tag] = desc;
m_devTreeInfo[locId][devg].append(tag);
m_devgDevMap[devg].append(tag);
m_devTypeIdMap[tag] = nDevType;
}
}
}
void AlarmMng::loadDevType()
{
QSqlQuery query;
QString sqlSequenceQuery = QString("select tag_name, description from dev_temp_def where sub_system > 3");
if(m_pReadDb->execute(sqlSequenceQuery,query))
{
while(query.next())
{
QString tag = query.value(0).toString();
QString desc = query.value(1).toString();
m_devTpTypeMap[tag] = desc;
}
}
}
void AlarmMng::loadAlarmAction()
{
QSqlQuery query;
QString sqlSequenceQuery = QString("select action_id, action_name from alarm_action_define");
if(m_pReadDb->execute(sqlSequenceQuery,query))
{
while(query.next())
{
int id = query.value(0).toInt();
QString name = query.value(1).toString();
m_alarmActionMap[id] = name;
}
}
}
void AlarmMng::loadAlarmLevel()
{
QSqlQuery query;
QString sqlSequenceQuery = QString("select priority_id, priority_name ,alarm_actions from alarm_level_define");
if(m_pReadDb->execute(sqlSequenceQuery,query))
{
while(query.next())
{
int id = query.value(0).toInt();
QString name = query.value(1).toString();
int action = query.value(2).toInt();
m_alarmLevelMap[id] = name;
m_alarmLevelActionMap[id] = action;
}
}
}
void AlarmMng::loadPointByDev(const QStringList &devList, const int index, const QString &filter)
{
QList<PointInfoPtr> pointList;
switch (index) {
case EN_POINT_AI_INDEX:
loadAi(pointList,devList);
filterPoint(pointList,filter);
if(pointList.size()>0)
{
emit addAiPoint(pointList);
}
break;
case EN_POINT_DI_INDEX:
loadDi(pointList,devList);
filterPoint(pointList,filter);
if(pointList.size()>0)
{
emit addDiPoint(pointList);
}
break;
default:
break;
}
}
void AlarmMng::loadAi(QList<PointInfoPtr> &pointList, const QStringList &devList)
{
QSqlQuery query;
QString strDeviceFilter;
QString tableName = "analog";
strDeviceFilter = "'" + devList.join("', '") + "'";
strDeviceFilter = QString("(%1 in (%2))").arg("device").arg(strDeviceFilter);
QString sql = QString("select %1.tag_name,%1.description,%1.device,%1.location_id,%1.is_limit"
",%2.group_tag_name from %1 left join %2 on %1.device"
" = %2.tag_name where %3").arg(tableName).arg("dev_info").arg(strDeviceFilter);
if(m_pReadDb->execute(sql,query))
{
while(query.next())
{
QString tag = query.value(0).toString();
QString desc = query.value(1).toString();
QString dev = query.value(2).toString();
int locId = query.value(3).toInt();
int isLimit = query.value(4).toInt();
QString devg = query.value(5).toString();
PointInfoPtr info(new PointInfo());
info->m_tag = tag;
if(isLimit == 1)
{
getAlarmObj(info);
}
info->m_desc = desc;
info->m_dev = dev;
info->m_devg = devg;
info->m_loc = locId;
info->m_sub = 4;
info->m_type = EN_POINT_ANALOG;
pointList.append(info);
}
}
}
void AlarmMng::loadDi(QList<PointInfoPtr> &pointList, const QStringList &devList)
{
QSqlQuery query;
QString strDeviceFilter;
QString tableName = "digital";
strDeviceFilter = "'" + devList.join("', '") + "'";
strDeviceFilter = QString("(%1 in (%2))").arg("device").arg(strDeviceFilter);
QString sql = QString("select %1.tag_name,%1.description,%1.device,%1.location_id,%1.is_obj_alm_manner,%1.alarm_priority"
",%2.group_tag_name from %1 left join %2 on %1.device"
" = %2.tag_name where %3").arg(tableName).arg("dev_info").arg(strDeviceFilter);
if(m_pReadDb->execute(sql,query))
{
while(query.next())
{
QString tag = query.value(0).toString();
QString desc = query.value(1).toString();
QString dev = query.value(2).toString();
int locId = query.value(3).toInt();
int is_obj = query.value(4).toInt();
int priority = -1;
QString devg = query.value(6).toString();
priority = query.value(5).toInt();
PointInfoPtr info(new PointInfo());
info->m_tag = tag;
//getAlarmShield(info);
info->m_desc = desc;
info->m_dev = dev;
info->m_devg = devg;
info->m_sub = 4;
info->m_loc = locId;
info->m_obj = is_obj;
info->m_type = EN_POINT_DIGITAL;
info->m_priority = priority;
pointList.append(info);
}
}
}
void AlarmMng::loadPi(QList<PointInfoPtr> &pointList, const QStringList &devList)
{
QSqlQuery query;
QString strDeviceFilter;
QString tableName = "accuml";
strDeviceFilter = "'" + devList.join("', '") + "'";
strDeviceFilter = QString("(%1 in (%2))").arg("device").arg(strDeviceFilter);
QString sql = QString("select %1.tag_name,%1.description,%1.device,%1.location_id"
",%2.group_tag_name from %1 left join %2 on %1.device"
" = %2.tag_name where %3").arg(tableName).arg("dev_info").arg(strDeviceFilter);
if(m_pReadDb->execute(sql,query))
{
while(query.next())
{
QString tag = query.value(0).toString();
QString desc = query.value(1).toString();
QString dev = query.value(2).toString();
int locId = query.value(3).toInt();
QString devg = query.value(4).toString();
PointInfoPtr info(new PointInfo());
info->m_tag = tag;
info->m_desc = desc;
info->m_dev = dev;
info->m_devg = devg;
info->m_loc = locId;
info->m_type = EN_POINT_ACCUML;
pointList.append(info);
}
}
}
void AlarmMng::loadUserInfo()
{
QSqlQuery query;
QString tableName = "rm_user_def";
QString sql = QString("select %1.perm_id,%1.perm_name,%1.perm_alias,%1.perm_desc from %1").arg(tableName);
if(m_pReadDb->execute(sql,query))
{
while (query.next()) {
ST_USER_DEF user;
user.iId = query.value(0).toInt();
user.strName = query.value(1).toString();
user.strAlias = query.value(2).toString();
user.strDesc = query.value(3).toString();
m_userInfo[user.iId] = user;
}
}
}
void AlarmMng::loadFuncInfo()
{
QSqlQuery query;
QString tableName = "calc_func_def";
QString sql = QString("select %1.func_name,%1.description from %1").arg(tableName);
if(m_pReadDb->execute(sql,query))
{
while (query.next()) {
m_funcMap[query.value(0).toString()] = query.value(1).toString();
}
}
}
void AlarmMng::loadCalcInfo()
{
m_calcInfoMap.clear();
QSqlQuery query;
QString tableName = "calc_para_def";
QString sql = QString("select %1.func_name,%1.para_seq_no,%1.description from %1 ").arg(tableName);
if(m_pReadDb->execute(sql,query))
{
while (query.next()) {
AlarmCalcInfoPtr info(new AlarmCalcInfo());
info->m_tag = query.value(0).toString();
info->m_nId = query.value(1).toInt();
info->m_strTip = query.value(2).toString();
m_calcInfoMap[info->m_tag].append(info);
}
}
}
void AlarmMng::loadDiText()
{
m_diTextList.clear();
QSqlQuery query;
QString tableName = "dict_state_text_info";
QString sql = QString("select state_text_name from %1 where sub_system >3 group by state_text_name").arg(tableName);
if(m_pReadDb->execute(sql,query))
{
while (query.next()) {
QString text = query.value(0).toString();
m_diTextList.append(text);
}
}
}
void AlarmMng::filterPoint(QList<PointInfoPtr> &pointList, const QString &filter)
{
if(!filter.isEmpty())
{
QList<PointInfoPtr>::iterator iter = pointList.begin();
while (iter != pointList.end()) {
if(!conditionFilter(*iter,filter))
{
iter = pointList.erase(iter);
//pointList.erase(iter++);
}else
{
iter++;
}
}
}
}
bool AlarmMng::conditionFilter(PointInfoPtr info,const QString &filter)
{
if(info->m_desc.indexOf(filter) != -1)
{
return true;
}
if(m_locMap.value(info->m_loc,"").indexOf(filter) != -1)
{
return true;
}
if(m_devgMap.value(info->m_devg,"").indexOf(filter) != -1)
{
return true;
}
if(m_devMap.value(info->m_dev).indexOf(filter) != -1)
{
return true;
}
if(m_alarmLevelMap.value(info->m_priority,tr("未知")).indexOf(filter) != -1)
{
return true;
}
QString text;
int priority = info->m_priority;
if( priority < 0)
{
text = "-";
}else
{
int act = m_alarmLevelActionMap.value(priority,0);
QMap<int,QString>::const_iterator it = m_alarmActionMap.cbegin();
while (it != m_alarmActionMap.cend()) {
if(act>>(it.key()-1) & 0x0001)
{
text += QString("%2 ").arg(it.value());
}
it++;
}
}
if(text.indexOf(filter) != -1)
{
return true;
}
return false;
}
void AlarmMng::getAlarmObj(PointInfoPtr info)
{
QSqlQuery query;
QString tableName = "analog_limit_info";
QString sql = QString("select %1.is_obj_alm_manner,%1.alarm_priority from %1 where tag_name = '%2' ").arg(tableName).arg(info->m_tag);
if(m_pReadDb->execute(sql,query))
{
while (query.next()) {
int is_obj = query.value(0).toInt();
int priority = query.value(1).toInt();
info->m_obj = is_obj;
info->m_priority = priority;
return ;
}
}
return ;
}
//void AlarmMng::getAlarmShield(PointInfoPtr info)
//{
// QSqlQuery query;
// QString sql = QString("select shield_id,key_id_tag from %1 where shield_object ='%2' limit 1").arg("opt_shield_obj").arg(info->m_tag);
// if(m_pReadDb->execute(sql,query))
// {
// while (query.next()) {
// int shield_id =query.value(0).toInt();
// QString key_id_tag = query.value(1).toString();
// info->m_bShield = true;
// info->m_keyIdTag =key_id_tag;
// info->m_shieldId = shield_id;
// break;
// }
// }
// //查询屏蔽描述和时段
// if(!info->m_bShield)
// {
// return ;
// }
// query.clear();
// sql = QString("select shield_name,time_id from %1 where shield_id =%2 limit 1").arg("opt_shield_info").arg(info->m_shieldId);
// if(m_pReadDb->execute(sql,query))
// {
// while (query.next()) {
// info->m_shieldDesc = query.value(0).toString();
// int time_id =query.value(1).toInt();
// info->m_timeId = time_id;
// break;
// }
// }
// if(info->m_timeId < 0)
// {
// return ;
// }
// query.clear();
// sql = QString("select time_type,start_time,end_time,time_option from %1 where time_id = %2 limit 1").arg("opt_shield_time").arg(info->m_timeId);
// if(m_pReadDb->execute(sql,query))
// {
// while (query.next()) {
// info->m_timeType = query.value(0).toInt();
// info->m_startTime = query.value(1).toString();
// info->m_endTime = query.value(2).toString();
// info->m_timeOption = query.value(3).toInt();
// break;
// }
// }
//}