#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 #include 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"); } 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 AlarmMng::getDevTpType() { QMutexLocker locker(mutex); return m_devTpTypeMap; } QMap > > AlarmMng::getDevTreeInfo() { QMutexLocker locker(mutex); return m_devTreeInfo; } QMap > AlarmMng::getDevGroupTreeInfo() { QMutexLocker locker(mutex); return m_devgTreeInfo; } QList 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 AlarmMng::getDevInfo() { return m_devMap; } QMap AlarmMng::getDevgInfo() { return m_devgMap; } QMap AlarmMng::getLocInfo() { return m_locMap; } QList AlarmMng::getLocOrder() { return m_locOrder; } QMap AlarmMng::getDevType() { return m_devTypeMap; } QMap AlarmMng::getAlarmAction() { return m_alarmActionMap; } QMap AlarmMng::getAlarmLevelAction() { return m_alarmLevelActionMap; } QMap 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 AlarmMng::getUserInfo() { return m_userInfo; } QMap AlarmMng::getFuncInfo() { return m_funcMap; } QMap > AlarmMng::getCalcInfo() { return m_calcInfoMap; } QList AlarmMng::getDevInfoByDevGroup(const QString devGroup) { QList devList; QMap >::iterator it = m_devgDevMap.find(devGroup); if(it!= m_devgDevMap.end()) { QList devTagList =it.value(); for(int index(0);index 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 vecLocationId; std::vector vecPermPic; if (PERM_NORMAL != permMngPtr->GetUsergInfo(level, vecLocationId, vecPermPic)) { LOGERROR("权限接口获取获取当前登录用户组的等级、所属车站ID失败!"); return; } std::string strApplicationName = "base"; std::string strTableName = "sys_model_location_info"; QPair 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 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 ::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 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 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 &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 &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 &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 &pointList, const QString &filter) { if(!filter.isEmpty()) { QList::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::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; // } // } //}