#include "ViewTriggerConfig.h" #include "ui_ViewTriggerConfig.h" ViewTriggerConfig::ViewTriggerConfig(QWidget *parent) : QWidget(parent), ui(new Ui::ViewTriggerConfig) { ui->setupUi(this); m_strWorkCondition = ""; headerStr = QObject::tr(" ,通道名称,特征值,高于警报值,高于危险值,\ 低于警报值,低于危险值,警报触发状态,危险触发状态,警报延时触发时长,危险延时触发时长,触发类型"); model = new QStandardItemModel(ui->tableView); ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //选中行 QStringList headerList = headerStr.split(","); model->setHorizontalHeaderLabels(headerList); model->setColumnCount(headerList.size()); CheckBoxDelegate *pCheckDelegate = new CheckBoxDelegate(this); ui->tableView->setItemDelegateForColumn(0, pCheckDelegate); ui->tableView->setModel(model); ui->tableView->setAlternatingRowColors(true); ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); for (int i = 0; i < model->columnCount() ; i++) { if(i == 0){ ui->tableView->setColumnWidth(i, 50); } else if(i == 1){ ui->tableView->setColumnWidth(i, 200); }else if(i == 9 || i == 10){ ui->tableView->setColumnWidth(i, 200); }else{ ui->tableView->setColumnWidth(i, 150); } } QString wherecon = ""; wherecon = QString("Enable = \"1\" "); m_WorkCondition = g_SqliteDB->GetWorkCondition("t_WorkCondition",wherecon); QStringList strWorkConditionList; for (int i = 0; i < m_WorkCondition.size(); i++) { strWorkConditionList << m_WorkCondition.at(i).WorkConditionName; } ui->comboBox_workCondition->addItems(strWorkConditionList); //connect(ui->comboBox_workCondition,SIGNAL(currentTextChanged(const QString &)),this,SLOT(on_comboBox_WorkCondition_currentTextChanged(const QString&))); m_strWorkCondition = ui->comboBox_workCondition->currentText(); //LoadTriggerConfig(m_strWorkCondition); } ViewTriggerConfig::~ViewTriggerConfig() { delete ui; } //void ViewTriggerConfig::on_comboBox_WorkCondition_currentTextChanged(const QString &arg1) //{ //} void ViewTriggerConfig::on_comboBox_workCondition_currentTextChanged(const QString &arg1) { m_strWorkCondition = arg1; LoadTriggerConfig(m_strWorkCondition); } void ViewTriggerConfig::LoadTriggerConfig(const QString& strWorkCondition) { model->removeRows(0, model->rowCount()); int ii = 0,flag = -1; for (ii = 0; ii < m_WorkCondition.size(); ii++) { if(m_WorkCondition[ii].WorkConditionName == strWorkCondition){ flag = 1; break; } } if(flag == -1){ QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("工况信息加载失败!")); return; } QString strWhere = QString(" WorkConditionID = %1 and operate <> 3 ").arg(m_WorkCondition[ii].SN); m_vecTriggerConfig.clear(); QVector().swap(m_vecTriggerConfig); m_vecTriggerConfig = g_SqliteDB->GetTriggerConfig("t_TriggerConfig",strWhere); if(m_vecTriggerConfig.size() > 0){ model->setRowCount(m_vecTriggerConfig.size()); for (int i = 0; i < m_vecTriggerConfig.size(); i++) { model->setData(model->index(i,1,QModelIndex()),m_vecTriggerConfig[i].ChannelName); model->setData(model->index(i,2,QModelIndex()),m_vecTriggerConfig[i].Characteristic); if(m_vecTriggerConfig[i].AlertOver == 1) model->setData(model->index(i,3,QModelIndex()),m_vecTriggerConfig[i].AlertOverSetpoint); else model->setData(model->index(i,3,QModelIndex()),""); if(m_vecTriggerConfig[i].DangerOver) model->setData(model->index(i,4,QModelIndex()),m_vecTriggerConfig[i].DangerOverSetpoint); else model->setData(model->index(i,4,QModelIndex()),""); if(m_vecTriggerConfig[i].AlertUnder) model->setData(model->index(i,5,QModelIndex()),m_vecTriggerConfig[i].AlertUnderSetpoint); else model->setData(model->index(i,5,QModelIndex()),""); if(m_vecTriggerConfig[i].DangerUnder) model->setData(model->index(i,6,QModelIndex()),m_vecTriggerConfig[i].DangerUnderSetpoint); else model->setData(model->index(i,6,QModelIndex()),""); // model->setData(model->index(i,2,QModelIndex()),m_vecTriggerConfig[i].AlertOverSetpoint); // model->setData(model->index(i,2,QModelIndex()),m_vecTriggerConfig[i].DangerOverSetpoint); // model->setData(model->index(i,4,QModelIndex()),m_vecTriggerConfig[i].AlertUnderSetpoint); // model->setData(model->index(i,5,QModelIndex()),m_vecTriggerConfig[i].DangerUnderSetpoint); if(m_vecTriggerConfig[i].AlertTriggerStatus == "Latching") model->setData(model->index(i,7,QModelIndex()),"单次触发"); else if(m_vecTriggerConfig[i].AlertTriggerStatus == "Nonlatching") model->setData(model->index(i,7,QModelIndex()),"连续触发"); if(m_vecTriggerConfig[i].DangerTriggerStatus == "Latching") model->setData(model->index(i,8,QModelIndex()),"单次触发"); else if(m_vecTriggerConfig[i].DangerTriggerStatus == "Nonlatching") model->setData(model->index(i,8,QModelIndex()),"连续触发"); model->setData(model->index(i,9,QModelIndex()),m_vecTriggerConfig[i].AlertTriggerDelay); model->setData(model->index(i,10,QModelIndex()),m_vecTriggerConfig[i].DangerTriggerDelay); if(m_vecTriggerConfig[i].TriggerType == "LEVEL") model->setData(model->index(i,11,QModelIndex()),"阈值"); else if(m_vecTriggerConfig[i].TriggerType == "DELTA") model->setData(model->index(i,12,QModelIndex()),"偏差"); model->setData(model->index(i,1,QModelIndex()),m_vecTriggerConfig[i].ChannelID,Qt::UserRole); model->setData(model->index(i,14,QModelIndex()),m_vecTriggerConfig[i].WorkConditionID); } } } void ViewTriggerConfig::populateTree(QStandardItem *parentItem, const QJsonObject &jsonObject) { for (auto it = jsonObject.begin(); it != jsonObject.end(); ++it) { QString key = it.key(); QJsonValue value = it.value(); if (key == "Combination") { } else if (key == "Inputs" && value.isArray()) { // 解析 Inputs 数组 QJsonArray inputsArray = value.toArray(); for (const QJsonValue &inputValue : inputsArray) { if (inputValue.isObject()) { populateTree(parentItem, inputValue.toObject()); } } } else if (key.startsWith("logic")) { // 处理 logicAND 或 logicOR 节点 QStandardItem *logicItem = new QStandardItem(key); parentItem->appendRow(logicItem); if (value.isArray()) { QJsonArray logicArray = value.toArray(); for (const QJsonValue &logicValue : logicArray) { if (logicValue.isObject()) { QJsonObject logicCombination = logicValue["Combination"].toObject(); int MinimumNumber =logicCombination["MinimumNumber"].toInt(); qDebug() << "MinimumNumber" << MinimumNumber << endl; logicItem->setData(MinimumNumber,Qt::UserRole+1); if(key.contains("logicAND")) logicItem->setText(QString("logicAND(%1)").arg(MinimumNumber)); populateTree(logicItem, logicValue.toObject()); } } } } else if (value.isObject()) { // 如果是嵌套对象 QStandardItem *objectItem = new QStandardItem(key); parentItem->appendRow(objectItem); populateTree(objectItem, value.toObject()); } else if (key == "displayTitle") { // 叶子节点:展示 displayTitle QStandardItem *leafItem = new QStandardItem(value.toString()); parentItem->appendRow(leafItem); }else if (key == "channelId") { vecChannelID.append(value.toString()); } } } void ViewTriggerConfig::LoadConfiguration(const QString& strWorkConditonName){ #ifdef Q_OS_WIN32 QString name = QCoreApplication::applicationDirPath() + "\\config\\UnitConfigurations.json"; #endif #ifdef Q_OS_LINUX QString name = QCoreApplication::applicationDirPath() + "/config/UnitConfigurations.json"; #endif QVector vecWorkConditionObj; QFile loadFile(name); if(!loadFile.open(QIODevice::ReadOnly)) { qDebug() << "could't open projects json"; return; } QString value = loadFile.readAll(); loadFile.close(); QJsonParseError parseJsonErr; QJsonDocument document = QJsonDocument::fromJson(value.toUtf8(), &parseJsonErr); if (!(parseJsonErr.error == QJsonParseError::NoError)) { QMessageBox::about(NULL, "提示", "读取文件错误!"); return; } QJsonObject TriggerConfigObj = document.object(); QJsonArray arrayConfig = TriggerConfigObj["WorkConditionConfiguraitons"].toArray(); for (int i = 0; i < arrayConfig.size(); i++) { vecWorkConditionObj.append(arrayConfig[i].toObject()); } for (int i = 0; i < vecWorkConditionObj.size(); i++) { QJsonObject tempObj = vecWorkConditionObj[i]; if(strWorkConditonName == tempObj["WorkConditionName"].toString()){ QJsonArray tempArray = tempObj["Configuraitons"].toArray(); QString strSecondDelaySeconds = tempObj["SecondDelaySeconds"].toString(); for (int j = 0;j < tempArray.size() ;j++ ) { QJsonArray tempArray2 = tempArray.at(j)["logicExpress"].toArray(); // 递归解析 JSON 数据并填充到模型中 for (int k = 0; k < tempArray2.size(); k++) { QJsonObject tempObj2 = tempArray2[k].toObject(); if (tempObj2.contains(QStringLiteral("logicOR"))){ QJsonValue arrayValue = tempObj2.value(QStringLiteral("logicOR")); QStandardItem *itemOr = new QStandardItem(QString("logicOR")); QJsonArray array = arrayValue.toArray(); for (int kk = 0; kk < array.size(); kk++) { QJsonObject tempObj3 = array[k].toObject(); populateTree(itemOr, tempObj3); } } } } } } } void ViewTriggerConfig::on_pushButton_del_clicked() { int iRet = -1; int ii = 0,flag = -1; for (ii = 0; ii < m_WorkCondition.size(); ii++) { if(m_WorkCondition[ii].WorkConditionName == ui->comboBox_workCondition->currentText()){ flag = 1; break; } } if(flag == -1){ QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("工况信息加载失败!")); return; } for (int i = 0; i < model->rowCount(); i++) { QModelIndex indexCheck = model->index(i,0); bool check = model->data(indexCheck, Qt::UserRole).toBool(); if(check){ LoadConfiguration(ui->comboBox_workCondition->currentText()); QString strChannelName = model->data(model->index(i,1)).toString(); QString strWorkConditionID = model->data(model->index(i,14)).toString(); QString strCharacteristic = model->data(model->index(i,2)).toString(); QString strChannelID = model->data(model->index(i,1),Qt::UserRole).toString(); if(vecChannelID.size()>0){ for (int var = 0; var < vecChannelID.size(); var++) { if(vecChannelID[var] == strChannelID){ QString message = QString("请先删除“组态配置”中绑定的触发信息。\n通道名称: %1。").arg(strChannelName); QMessageBox::warning(this, QStringLiteral("警告"), message); return; } } } QString strWhere = QString("where ChannelName = '%1' and WorkConditionID = %2 and Characteristic = '%3' ").arg(strChannelName).arg(m_WorkCondition[ii].SN).arg(strCharacteristic); QString tableName = "t_TriggerConfig "; QString strSql = QString(" set operate = 3 "); strSql = strSql + strWhere; iRet = g_SqliteDB->UpdateDataSql(tableName,strSql); //iRet = g_SqliteDB->DeleteDataW(tableName,strWhere); if(iRet != 0) break; } } if(iRet == 0){ QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("删除成功!")); emit deleteTriggerEvent_sg(); } else{ QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("删除失败!")); } LoadTriggerConfig(m_strWorkCondition); }