2025-03-14 17:05:48 +08:00
|
|
|
|
#include "CDataOptWidget.h"
|
|
|
|
|
|
#include "ui_CDataOptWidget.h"
|
|
|
|
|
|
#include "pub_utility_api/FileStyle.h"
|
|
|
|
|
|
#include <QFile>
|
|
|
|
|
|
#include <QComboBox>
|
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
#include <QDateTime>
|
|
|
|
|
|
#include "Common.h"
|
|
|
|
|
|
#include "perm_mng_api/PermMngApi.h"
|
|
|
|
|
|
#include "pub_logger_api/logger.h"
|
|
|
|
|
|
#include "pub_sysinfo_api/SysInfoApi.h"
|
2025-03-17 09:23:17 +08:00
|
|
|
|
using namespace iot_dbms;
|
|
|
|
|
|
using namespace iot_public;
|
|
|
|
|
|
using namespace iot_service;
|
2025-03-14 17:05:48 +08:00
|
|
|
|
|
|
|
|
|
|
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<STOptTagInfo> >("QList<STOptTagInfo>");
|
|
|
|
|
|
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<int,QString>::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();
|
2025-03-17 09:23:17 +08:00
|
|
|
|
std::string strFullPath = iot_public::CFileStyle::getPathOfStyleFile("public.qss") ;
|
2025-03-14 17:05:48 +08:00
|
|
|
|
QFile qssfile1(QString::fromStdString(strFullPath));
|
|
|
|
|
|
qssfile1.open(QFile::ReadOnly);
|
|
|
|
|
|
if (qssfile1.isOpen())
|
|
|
|
|
|
{
|
|
|
|
|
|
qss += QLatin1String(qssfile1.readAll());
|
|
|
|
|
|
qssfile1.close();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-17 09:23:17 +08:00
|
|
|
|
// strFullPath = iot_public::CFileStyle::getPathOfStyleFile("relaySetting.qss") ;
|
2025-03-14 17:05:48 +08:00
|
|
|
|
// 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<int,QString>::iterator itor = m_subMap.begin();
|
|
|
|
|
|
while (itor != m_subMap.end()) {
|
|
|
|
|
|
ui->cSub->addItem(itor.value(),itor.key());
|
|
|
|
|
|
itor++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ui->cType->clear();
|
|
|
|
|
|
QMap<int,QString>::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<STOptTagInfo> &dataList)
|
|
|
|
|
|
{
|
|
|
|
|
|
ui->treeWidget->clear();
|
|
|
|
|
|
ui->treeWidget->setSortingEnabled(false);
|
|
|
|
|
|
QList<int> typeList = m_typeMap.keys();
|
|
|
|
|
|
QMap<QString, QTreeWidgetItem*> devGroupMap; //< 设备组所在节点
|
|
|
|
|
|
for(int index(0);index<dataList.count();index++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!typeList.contains(dataList[index].tagType))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
STTagInfo tagInfo = m_pWork->getTagInfoByPointTagName(dataList[index].tagName);
|
|
|
|
|
|
|
|
|
|
|
|
//< 找到设备组所在树节点
|
|
|
|
|
|
QTreeWidgetItem * parent = Q_NULLPTR;
|
|
|
|
|
|
QMap<QString, QTreeWidgetItem*>::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); nChildIndex<item->childCount(); nChildIndex++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!item->child(nChildIndex)->isHidden())
|
|
|
|
|
|
{
|
|
|
|
|
|
showRowCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
ui->lCount->setNum(showRowCount);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDataOptWidget::permCheck(int location, int region)
|
|
|
|
|
|
{
|
2025-03-17 09:23:17 +08:00
|
|
|
|
iot_service::CPermMngApiPtr permMngPtr = iot_service::getPermMngInstance("base");
|
2025-03-14 17:05:48 +08:00
|
|
|
|
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 <int> vecRegionOptId;
|
|
|
|
|
|
QList<int> regList;
|
|
|
|
|
|
QList<int> locList;
|
|
|
|
|
|
std::vector <int> vecLocationOptId;
|
|
|
|
|
|
if(PERM_NORMAL == permMngPtr->GetSpeFunc(OPT_FUNC_SPE_OPT_OVERRIDE, vecRegionOptId, vecLocationOptId))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <int>::iterator region = vecRegionOptId.begin();
|
|
|
|
|
|
while (region != vecRegionOptId.end())
|
|
|
|
|
|
{
|
|
|
|
|
|
regList.append(*region++);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::vector <int>::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)
|
|
|
|
|
|
{
|
2025-03-17 09:23:17 +08:00
|
|
|
|
m_communicator = new iot_net::CMbCommunicator();
|
2025-03-14 17:05:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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); nTopIndex<ui->treeWidget->topLevelItemCount(); nTopIndex++)
|
|
|
|
|
|
{
|
|
|
|
|
|
bool isAllHide = true;
|
|
|
|
|
|
QTreeWidgetItem * parent = ui->treeWidget->topLevelItem(nTopIndex);
|
|
|
|
|
|
for(int nChildIndex(0); nChildIndex<parent->childCount(); 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<STOptTagInfo> &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<QTreeWidgetItem*> 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<itemData> itemDataList = {};
|
|
|
|
|
|
|
|
|
|
|
|
QList<QTreeWidgetItem*>::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; n<item->childCount(); 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); nIndex<itemDataList.length(); nIndex++)
|
|
|
|
|
|
{
|
|
|
|
|
|
itemData& data = itemDataList[nIndex];
|
|
|
|
|
|
if(!cancelItemSetValue(data.tagDesc,data.tagName,data.tagType))
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
filter("");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CDataOptWidget::cancelItemSetValue(const QString &desc,const QString &tagName, int tagType)
|
|
|
|
|
|
{
|
|
|
|
|
|
STOptTagInfo info;
|
|
|
|
|
|
if(m_pWork->getOptTagInfoByTagAndType(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)
|
|
|
|
|
|
{
|
2025-03-17 09:23:17 +08:00
|
|
|
|
iot_net::CMbMessage msg;
|
2025-03-14 17:05:48 +08:00
|
|
|
|
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); nTopIndex<ui->treeWidget->topLevelItemCount(); nTopIndex++)
|
|
|
|
|
|
{
|
|
|
|
|
|
QTreeWidgetItem * parent = ui->treeWidget->topLevelItem(nTopIndex);
|
|
|
|
|
|
for(int nChildIndex(0); nChildIndex<parent->childCount(); 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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|