295 lines
13 KiB
C++
295 lines
13 KiB
C++
#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<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()),"偏差");
|
|
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<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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
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);
|
|
}
|
|
|
|
|
|
|
|
|