3500/ViewTriggerConfig.cpp

295 lines
13 KiB
C++
Raw Normal View History

2023-04-14 19:30:30 +08:00
#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;
}
2024-03-14 09:35:39 +08:00
QString strWhere = QString(" WorkConditionID = %1 and operate <> 3 ").arg(m_WorkCondition[ii].SN);
2023-04-14 19:30:30 +08:00
m_vecTriggerConfig.clear();
QVector<TriggerConfig_t>().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()),"偏差");
2026-02-04 17:58:54 +08:00
model->setData(model->index(i,1,QModelIndex()),m_vecTriggerConfig[i].ChannelID,Qt::UserRole);
2023-04-14 19:30:30 +08:00
model->setData(model->index(i,14,QModelIndex()),m_vecTriggerConfig[i].WorkConditionID);
}
}
}
2026-02-04 17:58:54 +08:00
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();
2023-04-14 19:30:30 +08:00
2026-02-04 17:58:54 +08:00
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<QJsonObject> 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);
}
}
}
}
}
}
}
2023-04-14 19:30:30 +08:00
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){
2026-02-04 17:58:54 +08:00
LoadConfiguration(ui->comboBox_workCondition->currentText());
2023-04-14 19:30:30 +08:00
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();
2026-02-04 17:58:54 +08:00
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;
}
}
}
2024-03-14 09:35:39 +08:00
QString strWhere = QString("where ChannelName = '%1' and WorkConditionID = %2 and Characteristic = '%3' ").arg(strChannelName).arg(m_WorkCondition[ii].SN).arg(strCharacteristic);
2023-04-14 19:30:30 +08:00
QString tableName = "t_TriggerConfig ";
2024-03-14 09:35:39 +08:00
QString strSql = QString(" set operate = 3 ");
strSql = strSql + strWhere;
iRet = g_SqliteDB->UpdateDataSql(tableName,strSql);
//iRet = g_SqliteDB->DeleteDataW(tableName,strWhere);
2023-04-14 19:30:30 +08:00
if(iRet != 0)
break;
}
}
2024-03-14 09:35:39 +08:00
if(iRet == 0){
2023-04-14 19:30:30 +08:00
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("删除成功!"));
2024-03-14 09:35:39 +08:00
emit deleteTriggerEvent_sg();
}
else{
2023-04-14 19:30:30 +08:00
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("删除失败!"));
2024-03-14 09:35:39 +08:00
}
2023-04-14 19:30:30 +08:00
LoadTriggerConfig(m_strWorkCondition);
}