#include "CDataOptWidget.h" #include "ui_CDataOptWidget.h" #include "pub_utility_api/FileStyle.h" #include #include #include #include #include "Common.h" #include "perm_mng_api/PermMngApi.h" #include "pub_logger_api/logger.h" #include "pub_sysinfo_api/SysInfoApi.h" using namespace iot_dbms; using namespace iot_public; using namespace iot_service; CDataOptWidget::CDataOptWidget(bool editMode, QWidget *parent) : QWidget(parent), ui(new Ui::CDataOptWidget), m_pReadDb(Q_NULLPTR), m_communicator(Q_NULLPTR), m_pThread(Q_NULLPTR), m_pWork(Q_NULLPTR), m_editMode(editMode), m_domainId(-1), m_appId(-1) { ui->setupUi(this); qRegisterMetaType >("QList"); initStyleSheet(); if(!m_editMode) { m_pReadDb = new CDbApi(DB_CONN_MODEL_READ); m_pReadDb->open(); if(m_pThread == Q_NULLPTR) { m_pThread = new QThread(); } if(m_pWork == Q_NULLPTR) { m_pWork = new CDataOptWork(); } m_pWork->moveToThread(m_pThread); connect(m_pThread,&QThread::finished,m_pWork,&QObject::deleteLater); connect(this,&CDataOptWidget::sigSearch,m_pWork,&CDataOptWork::slotSearch,Qt::QueuedConnection); connect(m_pWork,&CDataOptWork::sigShowMess,this,&CDataOptWidget::slotShowMess,Qt::QueuedConnection); connect(m_pWork,&CDataOptWork::sigBrush,this,&CDataOptWidget::slotBrush,Qt::QueuedConnection); connect(ui->pBrush,&QPushButton::clicked,this,&CDataOptWidget::search); connect(ui->pCancelSetValue,&QPushButton::clicked,this,&CDataOptWidget::cancelSetValue); initialize(); m_pThread->start(); search(); } } CDataOptWidget::~CDataOptWidget() { if(m_pReadDb) { m_pReadDb->close(); delete m_pReadDb; } m_pReadDb = Q_NULLPTR; if(m_pThread) { m_pThread->exit(); m_pThread->wait(); delete m_pThread; } m_pThread = Q_NULLPTR; delete ui; } void CDataOptWidget::setTagType(int actual) { if(m_editMode) { return ; } if(actual <= 0) { ui->cType->blockSignals(true); ui->cType->clear(); ui->cType->addItem(tr("全部"),-1); QMap::iterator pos = m_typeMap.begin(); while (pos != m_typeMap.end()) { ui->cType->addItem(pos.value(),pos.key()); pos++; } ui->cType->blockSignals(false); }else { ui->cType->blockSignals(true); ui->cType->clear(); ui->cType->addItem(m_typeMap.value(actual),actual); ui->cType->blockSignals(false); ui->label_2->setHidden(true); ui->cType->setHidden(true); ui->treeWidget->setColumnHidden(COL_TYPE,true); ui->treeWidget->setColumnHidden(COL_SETVALUE,true); } search(); } void CDataOptWidget::initStyleSheet() { QString qss = QString(); std::string strFullPath = iot_public::CFileStyle::getPathOfStyleFile("public.qss") ; QFile qssfile1(QString::fromStdString(strFullPath)); qssfile1.open(QFile::ReadOnly); if (qssfile1.isOpen()) { qss += QLatin1String(qssfile1.readAll()); qssfile1.close(); } // strFullPath = iot_public::CFileStyle::getPathOfStyleFile("relaySetting.qss") ; // QFile qssfile2(QString::fromStdString(strFullPath)); // qssfile2.open(QFile::ReadOnly); // if (qssfile2.isOpen()) // { // qss += QLatin1String(qssfile2.readAll()); // qssfile2.close(); // } if(!qss.isEmpty()) { setStyleSheet(qss); } } void CDataOptWidget::initialize() { if(!createSysInfoInstance(m_pSysInfo)) { LOGERROR("创建系统信息访问库实例失败!"); } initMsg(); initData(); initView(); initConn(); } void CDataOptWidget::initData() { loadLoc(); loadSub(); loadDevG(); loadTagType();//dict_menu_info } void CDataOptWidget::initView() { ui->cLocation->blockSignals(true); ui->cSub->blockSignals(true); ui->cType->blockSignals(true); ui->cLocation->clear(); foreach (const int &locId, m_locOrder) { ui->cLocation->addItem(m_locMap.value(locId).desc, locId); } ui->cSub->clear(); QMap::iterator itor = m_subMap.begin(); while (itor != m_subMap.end()) { ui->cSub->addItem(itor.value(),itor.key()); itor++; } ui->cType->clear(); QMap::iterator pos = m_typeMap.begin(); while (pos != m_typeMap.end()) { ui->cType->addItem(pos.value(),pos.key()); pos++; } ui->cLocation->blockSignals(false); ui->cSub->blockSignals(false); ui->cType->blockSignals(false); setDefaultWidth(); setColumnHidden(COL_SUBSYSTEM,true); setColumnHidden(COL_STATETEXT,true); setColumnHidden(COL_USERGROUP,true); setColumnHidden(COL_KEYIDTAG,true); setColumnHidden(COL_TABLE,true); ui->treeWidget->setSortingEnabled(true); ui->treeWidget->sortByColumn(COL_OPTTIME, Qt::DescendingOrder); } void CDataOptWidget::initConn() { connect(ui->cLocation,&QComboBox::currentTextChanged,this,&CDataOptWidget::filter); connect(ui->cSub,&QComboBox::currentTextChanged,this,&CDataOptWidget::filter); connect(ui->cType,&QComboBox::currentTextChanged,this,&CDataOptWidget::filter); } void CDataOptWidget::loadLoc() { if(!m_pReadDb->isOpen()) { return ; } QSqlQuery query; QString sqlQuery = QString("select LOCATION_ID,DESCRIPTION,DOMAIN_ID from sys_model_location_info order by LOCATION_NO"); m_pReadDb->execute(sqlQuery, query); while(query.next()) { STLocationInfo loc; loc.id = query.value(0).toInt(); loc.desc = query.value(1).toString(); loc.domainId = query.value(2).toInt(); m_locMap.insert(loc.id, loc); m_locOrder.push_back(loc.id); } } void CDataOptWidget::loadSub() { if(!m_pReadDb->isOpen()) { return ; } QSqlQuery query; QString sqlQuery = QString("select SUB_SYSTEM_ID,DESCRIPTION from sys_model_sub_system_info where SUB_SYSTEM_ID > 3"); m_pReadDb->execute(sqlQuery, query); while(query.next()) { int id = query.value(0).toInt(); QString desc = query.value(1).toString(); m_subMap.insert(id, desc); } } void CDataOptWidget::loadDevG() { if(!m_pReadDb->isOpen()) { return ; } QSqlQuery query; QString sqlQuery = QString("select TAG_NAME,DESCRIPTION from dev_group"); m_pReadDb->execute(sqlQuery, query); while(query.next()) { QString tag = query.value(0).toString(); QString desc = query.value(1).toString(); m_devgMap.insert(tag, desc); } } void CDataOptWidget::loadTagType() { if(!m_pReadDb->isOpen()) { return ; } QSqlQuery query; QString sqlQuery = QString("select ACTUAL_VALUE,DISPLAY_VALUE from dict_menu_info where menu_name = '标签类型'"); m_pReadDb->execute(sqlQuery, query); while(query.next()) { int actual = query.value(0).toInt(); QString display = query.value(1).toString(); m_typeMap.insert(actual, display); } } void CDataOptWidget::updateTree(const QList &dataList) { ui->treeWidget->clear(); ui->treeWidget->setSortingEnabled(false); QList typeList = m_typeMap.keys(); QMap devGroupMap; //< 设备组所在节点 for(int index(0);indexgetTagInfoByPointTagName(dataList[index].tagName); //< 找到设备组所在树节点 QTreeWidgetItem * parent = Q_NULLPTR; QMap::iterator iter = devGroupMap.find(tagInfo.devgName); if(iter == devGroupMap.end()) { QTreeWidgetItem * devgItem = new QTreeWidgetItem; devgItem->setText(COL_TAGNAME, m_devgMap.value(tagInfo.devgName,tr("未知"))); devgItem->setData(COL_TAGNAME, Qt::UserRole, tagInfo.devgName); devgItem->setData(COL_TAGNAME, Qt::UserRole+1, TYPE_DEVGROUP); devgItem->setText(COL_OPTTIME, QDateTime::fromMSecsSinceEpoch(dataList[index].optTime).toString("yyyy-MM-dd hh:mm:ss")); devgItem->setData(COL_OPTTIME, Qt::UserRole, dataList[index].optTime); //< 用于排序 ui->treeWidget->addTopLevelItem(devgItem); devGroupMap.insert(tagInfo.devgName, devgItem); parent = devgItem; } else { if(dataList[index].optTime > iter.value()->data(COL_OPTTIME, Qt::UserRole).toInt()) { iter.value()->setData(COL_OPTTIME, Qt::UserRole, dataList[index].optTime); iter.value()->setText(COL_OPTTIME, QDateTime::fromMSecsSinceEpoch(dataList[index].optTime).toString("yyyy-MM-dd hh:mm:ss")); } parent = iter.value(); } QTreeWidgetItem *item = new QTreeWidgetItem(parent); item->setText(COL_TAGNAME, tagInfo.desc); item->setData(COL_TAGNAME, Qt::UserRole, tagInfo.tagName); item->setData(COL_TAGNAME, Qt::UserRole+1, TYPE_POINT); item->setText(COL_LOCATION, m_locMap.value(dataList[index].locationId).desc); item->setData(COL_LOCATION, Qt::UserRole, dataList[index].locationId); item->setText(COL_DEVICE, tagInfo.devDesc); item->setData(COL_DEVICE, Qt::UserRole, tagInfo.devName); item->setText(COL_TYPE, m_typeMap.value(dataList[index].tagType, tr("未知"))); item->setData(COL_TYPE, Qt::UserRole, dataList[index].tagType); item->setText(COL_OPTTIME, QDateTime::fromMSecsSinceEpoch(dataList[index].optTime).toString("yyyy-MM-dd hh:mm:ss")); item->setData(COL_OPTTIME, Qt::UserRole, dataList[index].optTime); item->setText(COL_SUBSYSTEM, m_subMap.value(dataList[index].subSystem,tr("未知"))); item->setData(COL_SUBSYSTEM, Qt::UserRole, dataList[index].subSystem); item->setText(COL_SETVALUE, QString::number(dataList[index].setValue)); item->setData(COL_SETVALUE, Qt::UserRole, dataList[index].setValue); item->setText(COL_STATETEXT, dataList[index].stateText); item->setData(COL_STATETEXT, Qt::UserRole, dataList[index].stateText); item->setText(COL_HOSTNAME, dataList[index].hostName); item->setData(COL_HOSTNAME, Qt::UserRole, dataList[index].hostName); item->setText(COL_USERNAME, dataList[index].userName); item->setData(COL_USERNAME, Qt::UserRole, dataList[index].userName); item->setText(COL_USERGROUP, dataList[index].userGroup); item->setData(COL_USERGROUP, Qt::UserRole, dataList[index].userGroup); item->setText(COL_KEYIDTAG, dataList[index].keyIdTag); item->setData(COL_KEYIDTAG, Qt::UserRole, dataList[index].keyIdTag); item->setText(COL_TABLE, dataList[index].table); item->setData(COL_TABLE, Qt::UserRole,dataList[index].table); } filter(""); ui->treeWidget->setSortingEnabled(true); } void CDataOptWidget::updateCount() { int showRowCount = 0; for(int nIndex(0); nIndex< ui->treeWidget->topLevelItemCount(); nIndex++) { QTreeWidgetItem *item = ui->treeWidget->topLevelItem(nIndex); for(int nChildIndex(0); nChildIndexchildCount(); nChildIndex++) { if(!item->child(nChildIndex)->isHidden()) { showRowCount++; } } } ui->lCount->setNum(showRowCount); } bool CDataOptWidget::permCheck(int location, int region) { iot_service::CPermMngApiPtr permMngPtr = iot_service::getPermMngInstance("base"); QString mess; if(permMngPtr != NULL) { permMngPtr->PermDllInit(); int nUserGrpId; int nLevel; int nLoginSec; std::string strInstanceName; int userId; if(PERM_NORMAL != permMngPtr->CurUser(userId, nUserGrpId, nLevel, nLoginSec, strInstanceName)) { userId = -1; mess = QString(tr("获取当前登录用户失败!")); slotShowMess(mess); return false; } std::vector vecRegionOptId; QList regList; QList locList; std::vector vecLocationOptId; if(PERM_NORMAL == permMngPtr->GetSpeFunc(OPT_FUNC_SPE_OPT_OVERRIDE, vecRegionOptId, vecLocationOptId)) { std::vector ::iterator region = vecRegionOptId.begin(); while (region != vecRegionOptId.end()) { regList.append(*region++); } std::vector ::iterator location = vecLocationOptId.begin(); while (location != vecLocationOptId.end()) { locList.append(*location++); } } if(locList.contains(location) && regList.contains(region)) { return true; }else { mess = QString(tr("无操作权限!")); slotShowMess(mess); return false; } } mess = QString(tr("初始化权限失败!")); slotShowMess(mess); return false; } void CDataOptWidget::initMsg() { if(m_communicator == Q_NULLPTR) { m_communicator = new iot_net::CMbCommunicator(); } } int CDataOptWidget::createReqHead(SOptReqHead &head) { SNodeInfo nodeInfo; int userID = -1; int usergID = -1; int level; int loginSec; std::string instanceName; CSysInfoInterfacePtr sysInfo; if(createSysInfoInstance(sysInfo) == false) { LOGERROR("创建系统信息访问库实例失败!"); return kbdFailed; } else { sysInfo->getLocalNodeInfo(nodeInfo); } CPermMngApiPtr permMng = getPermMngInstance("base"); if(permMng != NULL) { if(permMng->PermDllInit() != PERM_NORMAL) { LOGERROR("权限接口初始化失败!"); return kbdFailed; }else { if(PERM_NORMAL != permMng->CurUser(userID, usergID, level, loginSec, instanceName)) { userID = -1; return kbdFailed; } } } head.strSrcTag = "dataOptWidget"; head.nSrcDomainID = nodeInfo.nDomainId; head.nDstDomainID = m_domainId; head.nAppID = m_appId; head.strHostName = nodeInfo.strName; head.strInstName = instanceName; head.strCommName = m_communicator->getName(); head.nUserID = userID; head.nUserGroupID = usergID; head.nOptTime = QDateTime::currentDateTime().toMSecsSinceEpoch(); return kbdSuccess; } void CDataOptWidget::filter(const QString &text) { Q_UNUSED(text) int nLocId = ui->cLocation->currentData().toInt(); int nSubId = ui->cSub->currentData().toInt(); int nTypeId = ui->cType->currentData().toInt(); for(int nTopIndex(0); nTopIndextreeWidget->topLevelItemCount(); nTopIndex++) { bool isAllHide = true; QTreeWidgetItem * parent = ui->treeWidget->topLevelItem(nTopIndex); for(int nChildIndex(0); nChildIndexchildCount(); nChildIndex++) { if(nLocId != parent->child(nChildIndex)->data(COL_LOCATION, Qt::UserRole).toInt()) { parent->child(nChildIndex)->setHidden(true); } else if(nSubId != parent->child(nChildIndex)->data(COL_SUBSYSTEM, Qt::UserRole).toInt()) { parent->child(nChildIndex)->setHidden(true); } else if(nTypeId != -1 && nTypeId != parent->child(nChildIndex)->data(COL_TYPE, Qt::UserRole).toInt()) { parent->child(nChildIndex)->setHidden(true); } else { parent->child(nChildIndex)->setHidden(false); isAllHide = false; } } if(isAllHide) { parent->setHidden(true); } else { parent->setHidden(false); } } ui->treeWidget->expandAll(); updateCount(); } void CDataOptWidget::slotShowMess(const QString &mess) { QMessageBox::warning(this, tr("提示"), mess, QMessageBox::Ok); } void CDataOptWidget::slotBrush(const QList &optTagInfoList) { updateTree(optTagInfoList); updateCount(); } void CDataOptWidget::setColumnHidden(int column, bool hide) { ui->treeWidget->setColumnHidden(column, hide); } void CDataOptWidget::setColumnWidth(int column, int width) { ui->treeWidget->setColumnWidth(column,width); } void CDataOptWidget::setRowHeight(int height) { ui->treeWidget->header()->setDefaultSectionSize(height); } void CDataOptWidget::setDefaultWidth() { setColumnWidth(COL_TAGNAME,200); setColumnWidth(COL_LOCATION,200); setColumnWidth(COL_DEVICE,200); setColumnWidth(COL_TYPE,150); setColumnWidth(COL_OPTTIME,200); setColumnWidth(COL_SETVALUE,100); setColumnWidth(COL_HOSTNAME,150); setColumnWidth(COL_USERNAME,150); } void CDataOptWidget::cancelSetValue() { QString mess = QString(tr("当前未选中任何项!")); QList list = ui->treeWidget->selectedItems(); if (list.size() <= 0) { slotShowMess(mess); return; } struct itemData { QString tagName; QString tagDesc; int tagType; inline bool operator==(const itemData &other) const { if(tagName != other.tagName) { return false; } return tagType == other.tagType; } }; QList itemDataList = {}; QList::iterator iter= list.begin(); for(; iter!=list.end(); ++iter) { QTreeWidgetItem *item = *iter; int type = item->data(COL_TAGNAME, Qt::UserRole+1).toInt(); if(type == TYPE_DEVGROUP) { for(int n=0; nchildCount(); n++) { if(item->child(n)->isHidden()) { continue; } itemData sItemData; sItemData.tagName = item->child(n)->data(COL_TAGNAME, Qt::UserRole).toString(); sItemData.tagDesc = item->child(n)->text(COL_TAGNAME); sItemData.tagType = item->child(n)->data(COL_TYPE, Qt::UserRole).toInt(); if(itemDataList.isEmpty()) { itemDataList.append(sItemData); } else if(std::find(itemDataList.begin(), itemDataList.end(), sItemData) == itemDataList.end()) { itemDataList.append(sItemData); } else { LOGINFO("取消置数: 重复[%s %d]", sItemData.tagName.toStdString().c_str(), sItemData.tagType); } } } else if(type == TYPE_POINT) { itemData sItemData; sItemData.tagName = item->data(COL_TAGNAME, Qt::UserRole).toString(); sItemData.tagDesc = item->text(COL_TAGNAME); sItemData.tagType = item->data(COL_TYPE, Qt::UserRole).toInt(); if(itemDataList.isEmpty()) { itemDataList.append(sItemData); } else if(std::find(itemDataList.begin(), itemDataList.end(), sItemData) == itemDataList.end()) { itemDataList.append(sItemData); } else { LOGINFO("取消置数: 重复[%s %d]", sItemData.tagName.toStdString().c_str(), sItemData.tagType); } } else { LOGERROR("取消置数: 未知树节点类型[%d]", type); } } LOGINFO("取消置数: [%d]", itemDataList.length()); for(int nIndex(0); nIndexgetOptTagInfoByTagAndType(tagName,tagType,info) !=kbdSuccess ) { slotShowMess(tr("获取标签操作信息有误,%1").arg(desc)); return false; } STTagInfo tagInfo; if(m_pWork->getTagInfoByTag(tagName,tagInfo) !=kbdSuccess ) { slotShowMess(tr("获取标签信息有误,%1").arg(desc)); return false; } if(!permCheck(info.locationId,tagInfo.region)) { return false; } removeOptTagInfo(info); return true; } void CDataOptWidget::removeOptTagInfo(const STOptTagInfo &info) { iot_net::CMbMessage msg; msg.setMsgType(MT_OPT_COMMON_DOWN); msg.setSubject(info.subSystem, CH_HMI_TO_OPT_OPTCMD_DOWN); SOptTagSet sOptTagSet; SOptTagQueue optTagQueue; COptTagSet cOptTagSet; if(createReqHead(sOptTagSet.stHead)!= kbdSuccess) { return ; } optTagQueue.strKeyIdTag = info.keyIdTag.toStdString(); optTagQueue.nIsSet = 0;// 0:取消;1:设置; optTagQueue.fSetValue = info.setValue; optTagQueue.strStateText = info.stateText.toStdString(); optTagQueue.bIsPointQuery = 1; optTagQueue.nLocationId = info.locationId; optTagQueue.nSubSystem = info.subSystem; sOptTagSet.vecTagQueue.push_back(optTagQueue); std::string content = cOptTagSet.generate(sOptTagSet); int type = info.tagType; if(type == 1) { msg.setMsgType(MT_OPT_TAG_VALUE_SET); }else if(type == 2) { msg.setMsgType(MT_OPT_PINHIBIT_REF); }else if(type == 3) { msg.setMsgType(MT_OPT_PINHIBIT_ALARM); }else { msg.setMsgType(MT_OPT_PINHIBIT_CTRL); } msg.setData(content); if(!m_communicator->sendMsgToDomain(msg, m_domainId)) { QString mess = QString(tr("下发取消命令失败")); slotShowMess(mess); }else { removeItemOptTagInfo(info); m_pWork->removeOneOptTagInfo(info); updateCount(); } } void CDataOptWidget::removeItemOptTagInfo(const STOptTagInfo &info) { for(int nTopIndex(0); nTopIndextreeWidget->topLevelItemCount(); nTopIndex++) { QTreeWidgetItem * parent = ui->treeWidget->topLevelItem(nTopIndex); for(int nChildIndex(0); nChildIndexchildCount(); nChildIndex++) { QString tagName = parent->child(nChildIndex)->data(COL_TAGNAME, Qt::UserRole).toString(); int tagType = parent->child(nChildIndex)->data(COL_TYPE, Qt::UserRole).toInt(); if(info.tagName == tagName && info.tagType == tagType) { parent->takeChild(nChildIndex--); break; } } if(parent->childCount() == 0) { ui->treeWidget->takeTopLevelItem(nTopIndex--); } } } void CDataOptWidget::search() { m_domainId = m_locMap.value(ui->cLocation->currentData().toInt()).domainId; if(m_pSysInfo != Q_NULLPTR) { SAppInfo stAppInfo; m_pSysInfo->getAppInfoBySubsystemId(ui->cSub->currentData().toInt(),stAppInfo); m_appId = stAppInfo.nId; emit sigSearch(m_domainId,m_appId); } }