3500/WokingConditionConfig.cpp
2024-10-24 13:49:00 +08:00

538 lines
24 KiB
C++

#include "WokingConditionConfig.h"
#include "ui_WokingConditionConfig.h"
#include <QComboBox>
#include <QMenu>
#include <QStyleFactory>
#include <QListView>
CWokingConditionConfig::CWokingConditionConfig(QWidget *parent) :
QWidget(parent),
ui(new Ui::CWokingConditionConfig)
{
ui->setupUi(this);
headerStr = QObject::tr("工况参数,范围下,范围上,百分比判断,波动判断,波动范围下,波动范围上");
model = new QStandardItemModel(ui->tableView);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
//ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //选中行
QStringList headerList = headerStr.split(",");
model->setHorizontalHeaderLabels(headerList);
model->setColumnCount(headerList.size());
ui->tableView->setModel(model);
ui->tableView->setAlternatingRowColors(true);
ui->tableView->setColumnWidth(0, 200);
//ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
//ui->tableView->horizontalHeader()->setSectionResizeMode(0,QHeaderView::ResizeToContents);
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
ui->treeView->setStyle(QStyleFactory::create("windows"));
treeModel = new QStandardItemModel(ui->treeView); //创建模型指定父类
ui->treeView->setModel(treeModel);
ui->treeView->setHeaderHidden(true);
ui->comboBox_unitType->setView(new QListView());
this->setWindowTitle("工况逻辑配置");
m_Index = 0;
QRegExp exp("[0-9\\.-]+$");
QValidator *Validator = new QRegExpValidator(exp);
ui->lineEdit_Interval->setValidator(Validator);
ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
CWokingConditionConfig::~CWokingConditionConfig()
{
delete ui;
}
QWidget *CWokingConditionConfig::CreateCombox(int flag)
{
if(flag == 0){
QComboBox* cmb = new QComboBox();
QStringList strList ;
strList << "" << "";
cmb->addItems(strList);
return cmb;
}else if(flag == 1){
QComboBox* cmb = new QComboBox();
QStringList strList ;
strList << "" << "";
cmb->addItems(strList);
return cmb;
}
}
QStandardItem* CWokingConditionConfig::add_checkBox_model(int flag)
{
QStandardItem *item = new QStandardItem();
item->setCheckable(true);
if(!flag){
item->setCheckState(Qt::Unchecked);
}else{
item->setCheckState(Qt::Checked);
}
//item->setEditable(false);
return item;
}
void CWokingConditionConfig::\
InitConfig(int index,QString& strWorkConditionType,\
QStringList& strChannelName,WorkCondition_t& workCondition,\
QVector<WorkConditionChannels_t>& workConditionChannels,QVector<WorkConditionInfo_t>& WorkConditionInfo)
{
qDebug() << "InitConfig" <<endl;
for(int i = 0;i < treeModel->rowCount() ;i++){
treeModel->removeRow(i);
}
m_WorkConditionChannels = workConditionChannels;
qDebug() << "m_WorkConditionChannels" << m_WorkConditionChannels.size() << endl;
m_strChannelName.clear();
m_strChannelName = strChannelName;
m_Index = index;
qDebug() << m_strChannelName << endl;
ui->lineEdit_workContion->setText(strWorkConditionType);
ui->comboBox_unitType->clear();
ui->comboBox_unitType->addItem("请选择通道...");
ui->comboBox_unitType->addItems(m_strChannelName);
if(WorkConditionInfo.size() > 0){
QStringList ChannelName;
QString str = QString("%1").arg(workCondition.CheckWorkConditionInterval);
ui->lineEdit_Interval->setText(str);
ui->textEdit_Description->setText(workCondition.Description);
for (int i = 0; i < WorkConditionInfo.size() ; i++) {
model->setRowCount(i+1);
if(WorkConditionInfo[i].EnRangeLower == "1")
model->setItem(i, 1, add_checkBox_model(1));
else
model->setItem(i, 1, add_checkBox_model());
if(WorkConditionInfo[i].EnRangeUpper == "1")
model->setItem(i, 2, add_checkBox_model(1));
else
model->setItem(i, 2, add_checkBox_model());
if(WorkConditionInfo[i].EnVolatilityRangeLower == "1")
model->setItem(i, 5, add_checkBox_model(1));
else
model->setItem(i, 5, add_checkBox_model());
if(WorkConditionInfo[i].EnVolatilityRangeUpper == "1")
model->setItem(i, 6, add_checkBox_model(1));
else
model->setItem(i, 6, add_checkBox_model());
model->setData(model->index(i,0,QModelIndex()),WorkConditionInfo[i].DisplayName);
model->setData(model->index(i,1,QModelIndex()),WorkConditionInfo[i].LowerSideOfRange);
model->setData(model->index(i,2,QModelIndex()),WorkConditionInfo[i].UpperSideOfRange);
if(WorkConditionInfo[i].EnLowerSideOfRangePercent == "1"){
ui->tableView->setIndexWidget(model->index(i, 3), CreateCombox(0));
}else{
ui->tableView->setIndexWidget(model->index(i, 3), CreateCombox(1));
}
if(WorkConditionInfo[i].EnableCheckVolatility == "1"){
ui->tableView->setIndexWidget(model->index(i, 4), CreateCombox(0));
}else{
ui->tableView->setIndexWidget(model->index(i, 4), CreateCombox(1));
}
model->setData(model->index(i,5,QModelIndex()),WorkConditionInfo[i].LowerSideOfVolatilityRange);
model->setData(model->index(i,6,QModelIndex()),WorkConditionInfo[i].UpperSideOfVolatilityRange);
QJsonObject m_JsonObjWorkConditionRules;
for (int j = 0; j < g_ChannelBaseInfo.size() ; j++) {
if(WorkConditionInfo[i].ChannelName == g_ChannelBaseInfo[j].channelName){
m_JsonObjWorkConditionRules["BoardNo"] = g_ChannelBaseInfo[j].bordNo;
m_JsonObjWorkConditionRules["ChannelName"] = g_ChannelBaseInfo[j].channelName;
m_JsonObjWorkConditionRules["ChannelNoInBoard"] = g_ChannelBaseInfo[j].channelNoInBoard;
}
}
m_JsonArrayWorkConditionRules.append(m_JsonObjWorkConditionRules);
ChannelName.append(WorkConditionInfo[i].DisplayName);
}
QJsonDocument doc = QJsonDocument::fromJson(workCondition.WorkConditionJudgeLogicRules.toUtf8());
QJsonObject obj = doc.object();
QJsonObject WorkConditionJudgeLogicRulesObj = obj;
if(WorkConditionJudgeLogicRulesObj.contains("logicAND")){
QJsonValue arrayValue = WorkConditionJudgeLogicRulesObj.value(QStringLiteral("logicAND"));
if(arrayValue.isArray()){
QJsonArray array = arrayValue.toArray();
QString subprimaryTitle = "logicAND";
QList<QStandardItem*> items1;
QStandardItem* item1 = new QStandardItem(subprimaryTitle);
treeModel->appendRow(item1);
for (int i = 0; i < array.size(); i++) {
QJsonObject tempObj2 = array[i].toObject();
if (tempObj2.contains(QStringLiteral("logicOR"))){
QJsonValue arrayValue = tempObj2.value(QStringLiteral("logicOR"));
QStandardItem *itemOR = new QStandardItem(QString("logicOR"));
item1->appendRow(itemOR);
QJsonArray array = arrayValue.toArray();
for (int kk = 0; kk < array.size(); kk++) {
QList<QStandardItem*> items2;
QStandardItem* item3 = new QStandardItem(array.at(kk)["DispalyName"].toString());
items2.append(item3);
itemOR->appendRow(items2);
}
}else{
QList<QStandardItem*> items2;
QStandardItem* item3 = new QStandardItem(array.at(i)["DispalyName"].toString());
items2.append(item3);
item1->appendRow(items2);
}
}
}else {
}
}
if(WorkConditionJudgeLogicRulesObj.contains("logicOR")){
QJsonValue arrayValue = WorkConditionJudgeLogicRulesObj.value(QStringLiteral("logicOR"));
if(arrayValue.isArray()){
QJsonArray array = arrayValue.toArray();
QString subprimaryTitle = "logicOR";
QList<QStandardItem*> items1;
QStandardItem* item1 = new QStandardItem(subprimaryTitle);
treeModel->appendRow(item1);
for (int i = 0; i < array.size(); i++) {
QJsonObject tempObj2 = array[i].toObject();
if (tempObj2.contains(QStringLiteral("logicAND"))){
QJsonValue arrayValue = tempObj2.value(QStringLiteral("logicAND"));
QStandardItem *itemAnd = new QStandardItem(QString("logicAND"));
item1->appendRow(itemAnd);
QJsonArray array = arrayValue.toArray();
for (int kk = 0; kk < array.size(); kk++) {
QList<QStandardItem*> items2;
QStandardItem* item3 = new QStandardItem(array.at(kk)["DispalyName"].toString());
items2.append(item3);
itemAnd->appendRow(items2);
}
}else{
QList<QStandardItem*> items2;
QStandardItem* item3 = new QStandardItem(array.at(i)["DispalyName"].toString());
items2.append(item3);
item1->appendRow(items2);
}
}
}else {
}
}
}else{
}
QObject::connect(ui->tableView ,SIGNAL(customContextMenuRequested(const QPoint &)),this,SLOT(on_treeView_customContextMenuRequested(const QPoint &)));
}
void CWokingConditionConfig::on_pushButton_addUnit_clicked()
{
int rowCount = model->rowCount();
qDebug() << rowCount << endl;
model->setRowCount(rowCount+1);
ui->tableView->setIndexWidget(model->index(rowCount, 3), CreateCombox(1));
ui->tableView->setIndexWidget(model->index(rowCount, 4), CreateCombox(1));
model->setItem(rowCount, 1, add_checkBox_model());
model->setItem(rowCount, 2, add_checkBox_model());
model->setItem(rowCount, 5, add_checkBox_model());
model->setItem(rowCount, 6, add_checkBox_model());
model->setData(model->index(rowCount,0,QModelIndex()),"");
model->setData(model->index(rowCount,1,QModelIndex()),"");
model->setData(model->index(rowCount,2,QModelIndex()),"");
model->setData(model->index(rowCount,5,QModelIndex()),"");
model->setData(model->index(rowCount,6,QModelIndex()),"");
}
void CWokingConditionConfig::on_comboBox_unitType_currentTextChanged(const QString &arg1)
{
int row = ui-> tableView ->currentIndex().row();//获得当前行索引
QJsonObject m_JsonObjWorkConditionRules;
int repetitionCount = 0;
for (int i = 0; i < model->rowCount(); i++) {
QModelIndex index = model->index(i,0);
QString strData = model->data(index).toString();
if(strData.contains(arg1)){
repetitionCount++;
}
}
if(repetitionCount > 0){
QString strChannelName = QString("%1%2").arg(repetitionCount).arg(arg1);
model->setData(model->index(row,0,QModelIndex()),strChannelName);
}
else{
model->setData(model->index(row,0,QModelIndex()),arg1);
}
for (int i = 0; i < g_ChannelBaseInfo.size() ; i++) {
if(arg1.contains(g_ChannelBaseInfo[i].channelName)){
m_JsonObjWorkConditionRules["BoardNo"] = g_ChannelBaseInfo[i].bordNo;
m_JsonObjWorkConditionRules["ChannelName"] = g_ChannelBaseInfo[i].channelName;
m_JsonObjWorkConditionRules["ChannelNoInBoard"] = g_ChannelBaseInfo[i].channelNoInBoard;
m_JsonObjWorkConditionRules["DispalyName"] = arg1;
}
}
m_JsonArrayWorkConditionRules.append(m_JsonObjWorkConditionRules);
qDebug() << m_JsonArrayWorkConditionRules <<endl;
}
void CWokingConditionConfig::slotDeleteItem()
{
QModelIndex curIndex = ui->treeView->currentIndex();
//QModelIndex index = curIndex.sibling(curIndex.row(),0); //同一行第一列元素的index
if(curIndex.isValid())
{
QStandardItem* item = treeModel->itemFromIndex(curIndex);
QString text = item->text();
qDebug() << text <<endl;
treeModel->removeRow(curIndex.row(),curIndex.parent());
}
}
void CWokingConditionConfig::on_treeView_customContextMenuRequested(const QPoint &pos)
{
qDebug() << "on_treeView_customContextMenuRequested" <<endl;
QModelIndex curIndex = ui->treeView->indexAt(pos); //当前点击的元素的index
QModelIndex index = curIndex.sibling(curIndex.row(),0); //该行的第1列元素的index
QMenu menu;
if (index.isValid())
{
//可获取元素的文本、data,进行其他判断处理
//QStandardItem* item = mModel->itemFromIndex(index);
//QString text = item->text();
//QVariant data = item->data(Qt::UserRole + 1);
//...
//添加一行菜单,进行展开
menu.addAction(QStringLiteral("删除"), this, SLOT(slotDeleteItem()));
menu.addSeparator(); //添加一个分隔线
//menu.addAction(QStringLiteral("增加"), this, SLOT(slotTreeMenuCollapse(bool)));
}
menu.exec(QCursor::pos()); //显示菜单
}
void CWokingConditionConfig::on_pushButton_and_clicked()
{
QModelIndex index = ui->treeView->currentIndex();
if(index.isValid())
{
QStandardItem* item = treeModel->itemFromIndex(index);
QString subprimaryTitle = "logicAND";
QStandardItem* item1 = new QStandardItem(subprimaryTitle);
item->appendRow(item1);
}else{
QString subprimaryTitle = "logicAND";
QList<QStandardItem*> items1;
QStandardItem* item1 = new QStandardItem(subprimaryTitle);
treeModel->appendRow(item1);
}
}
void CWokingConditionConfig::on_pushButton_or_clicked()
{
QModelIndex index = ui->treeView->currentIndex();
qDebug() << index.row() <<endl;
if(index.isValid())
{
QStandardItem* item = treeModel->itemFromIndex(index);
QString subprimaryTitle = "logicOR";
QStandardItem* item1 = new QStandardItem(subprimaryTitle);
item->appendRow(item1);
}else{
QString subprimaryTitle = "logicOR";
QList<QStandardItem*> items1;
QStandardItem* item1 = new QStandardItem(subprimaryTitle);
treeModel->appendRow(item1);
}
}
QJsonArray CWokingConditionConfig::GetItem(QStandardItem *item)
{
QJsonArray array;
QJsonObject jsonObj;
if(item->hasChildren())
{
for(int i = 0;i < item->rowCount() ;i++)
{
QStandardItem * childitem = item->child(i);
qDebug() << "childitem = " << childitem->text();
if(childitem->text() == "logicOR" || childitem->text() == "logicAND"){
QJsonObject jsonObjLogic;
jsonObjLogic[childitem->text()] = GetItem(childitem);
array.append(jsonObjLogic);
}else{
for (int i = 0; i < m_ArrayWorkConditionRules.size() ; i++) {
if(m_ArrayWorkConditionRules.at(i)["DispalyName"] == childitem->text()){
jsonObj["WC_NO"] = m_ArrayWorkConditionRules.at(i)["WC_NO"];
jsonObj["DispalyName"] = m_ArrayWorkConditionRules.at(i)["DispalyName"];
}
}
array.append(jsonObj);
}
}
return array;
}
}
void CWokingConditionConfig::on_pushButton_save_clicked()
{
if(treeModel->rowCount() < 1){
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("请选择正确的组态逻辑"));
return;
}
for(int i=0; i< m_ArrayWorkConditionRules.size(); i++)
{
m_ArrayWorkConditionRules.removeAt(i);
}
for (int i = 0; i < model->rowCount(); i++) {
QJsonObject jsonObj;
QStringList strDataList;
for (int j = 0; j < model->columnCount(); j++) {
QModelIndex index = model->index(i,j);
QString strData = model->data(index).toString();
if(j == 0){
for (int ii = 0; ii < m_WorkConditionChannels.size();ii++ ) {
//qDebug() <<"============="<< m_WorkConditionChannels[ii].ChannelName << strData << endl;
if(strData.contains(m_WorkConditionChannels[ii].ChannelName) && m_WorkConditionChannels[ii].ChannelName != ""){
jsonObj["BoardNo"] = m_WorkConditionChannels[ii].BoardNo;
jsonObj["ChannelName"] = m_WorkConditionChannels[ii].ChannelName;
jsonObj["ChannelNoInBoard"] = m_WorkConditionChannels[ii].ChannelNoInBoard;
jsonObj["WorkConditionChannelType"] = m_WorkConditionChannels[ii].WorkConditionChannelType;
jsonObj["ChannelID"] = m_WorkConditionChannels[ii].channelID;
jsonObj["DispalyName"] = strData;
}
}
}
if(j == 1){
QStandardItem *item = model->itemFromIndex(index);
if(item->checkState() == Qt::Unchecked)
jsonObj["EnRangeLower"] = false;
else if(item->checkState() == Qt::Checked)
jsonObj["EnRangeLower"] = true;
jsonObj["LowerSideOfRange"] = model->data(index).toString();
}
if(j == 2){
QStandardItem *item = model->itemFromIndex(index);
if(item->checkState() == Qt::Unchecked)
jsonObj["EnRangeUpper"] = false;
else if(item->checkState() == Qt::Checked)
jsonObj["EnRangeUpper"] = true;
jsonObj["UpperSideOfRange"] = model->data(index).toString();
}
if(j == 5){
QStandardItem *item = model->itemFromIndex(index);
if(item->checkState() == Qt::Unchecked)
jsonObj["EnVolatilityRangeLower"] = false;
else if(item->checkState() == Qt::Checked)
jsonObj["EnVolatilityRangeLower"] = true;
jsonObj["LowerSideOfVolatilityRange"] = model->data(index).toString();
}
if(j == 6){
QStandardItem *item = model->itemFromIndex(index);
if(item->checkState() == Qt::Unchecked)
jsonObj["EnVolatilityRangeUpper"] = false;
else if(item->checkState() == Qt::Checked)
jsonObj["EnVolatilityRangeUpper"] = true;
jsonObj["UpperSideOfVolatilityRange"] = model->data(index).toString();
}
if(j == 3){
QComboBox *comBox = (QComboBox*)(ui->tableView->indexWidget(index));
if(comBox->currentText() == ""){
jsonObj["EnSideOfRangePercent"] = true;
}else if(comBox->currentText() == ""){
jsonObj["EnSideOfRangePercent"] = false;
}
}
if(j == 4){
QComboBox *comBox = (QComboBox*)(ui->tableView->indexWidget(index));
if(comBox->currentText() == ""){
jsonObj["EnableCheckVolatility"] = true;
}else if(comBox->currentText() == ""){
jsonObj["EnableCheckVolatility"] = false;
}
}
}
jsonObj["WC_NO"] = i+1;
QString strTableName = "t_WorkConditionRules";
QString strWhere = QString(" SN = '%1' and ChannelId = '%2' and displayName = '%3' ").
arg(m_Index).arg(jsonObj["ChannelID"].toString()).arg(jsonObj["DispalyName"].toString());
QString strSql = "count(*)";
int iRet = g_SqliteDB->QueryData(strTableName,strSql,strWhere);
if(iRet > 0){
strSql = QString(" set EnLowerSideOfRangePercent = '%1',EnRangeUpper = '%2',EnRangeLower = '%3',EnVolatilityRangeUpper = '%4',EnVolatilityRangeLower = '%5',\
EnableCheckVolatility = '%6',LowerSideOfRange = '%7',UpperSideOfRange = '%8',LowerSideOfVolatilityRange = '%9',UpperSideOfVolatilityRange = '%10',WC_NO = %11 where SN = '%12' and ChannelId = '%13' and displayName = '%14'").arg(jsonObj["EnSideOfRangePercent"].toBool()).arg(jsonObj["EnRangeUpper"].toBool()).\
arg(jsonObj["EnRangeLower"].toBool()).arg(jsonObj["EnVolatilityRangeUpper"].toBool()).arg(jsonObj["EnVolatilityRangeLower"].toBool()).arg(jsonObj["EnableCheckVolatility"].toBool()).arg(jsonObj["LowerSideOfRange"].toString()).arg(jsonObj["UpperSideOfRange"].toString()).arg(jsonObj["LowerSideOfVolatilityRange"].toString()).arg(jsonObj["UpperSideOfVolatilityRange"].toString()).\
arg(i+1).arg(m_Index).arg(jsonObj["ChannelID"].toString()).arg(jsonObj["DispalyName"].toString());
g_SqliteDB->UpdateDataSql(strTableName,strSql);
}else
{
strSql = QString(" values('%1',%2,'%3','%4','%5',%6,'%7','%8','%9','%10','%11','%12','%13','%14',%15,%16,%17,'%18');").arg(jsonObj["ChannelID"].toString()).arg(jsonObj["BoardNo"].toInt()).arg(jsonObj["ChannelName"].toString()).arg(jsonObj["ChannelNoInBoard"].toInt()).arg(jsonObj["EnSideOfRangePercent"].toBool()).\
arg(jsonObj["EnRangeUpper"].toBool()).arg(jsonObj["EnRangeLower"].toBool()).arg(jsonObj["EnVolatilityRangeUpper"].toBool()).arg(jsonObj["EnVolatilityRangeLower"].toBool()).arg(jsonObj["EnableCheckVolatility"].toBool()).arg(jsonObj["LowerSideOfRange"].toString()).\
arg(jsonObj["UpperSideOfRange"].toString()).arg(jsonObj["LowerSideOfVolatilityRange"].toString()).arg(jsonObj["UpperSideOfVolatilityRange"].toString()).arg(jsonObj["WorkConditionChannelType"].toInt()).arg(m_Index).arg(i+1).arg(jsonObj["DispalyName"].toString());
g_SqliteDB->InsertData(strTableName,strSql);
}
m_ArrayWorkConditionRules.append(jsonObj);
}
qDebug() << m_ArrayWorkConditionRules << endl;
QJsonObject jsonObj2;
for(int i = 0;i < treeModel->rowCount() ;i++)
{
QStandardItem *item = treeModel->item(i);
qDebug() <<"item = " << item->text();
qDebug() << item->rowCount() << endl;
jsonObj2[item->text()] = GetItem(item);
}
qDebug() << jsonObj2 << endl;
QJsonObject WorkConditionsInfoObj;
WorkConditionsInfoObj["WorkConditionJudgeLogicRules"] = jsonObj2;
WorkConditionsInfoObj["WorkConditionRules"] = m_ArrayWorkConditionRules;
QString str = QString("%1").arg(m_Index);
WorkConditionsInfoObj["SN"] = str;
WorkConditionsInfoObj["CheckWorkConditionInterval"] = ui->lineEdit_Interval->text().toInt();
WorkConditionsInfoObj["Description"] = ui->textEdit_Description->toPlainText();
// WorkConditionsInfoObj["Enable"] = m_WorkCondition.Enable;
// WorkConditionsInfoObj["StartWorkCondition"] = m_WorkCondition.StartWorkCondition;
WorkConditionsInfoObj["WorkConditionName"] = ui->lineEdit_workContion->text();
qDebug() << WorkConditionsInfoObj << endl;
sigWorkConditon(WorkConditionsInfoObj);
this->close();
}
void CWokingConditionConfig::on_comboBox_unitType_textActivated(const QString &arg1)
{
qDebug() << "on_comboBox_unitType_textActivated" << endl;
}
void CWokingConditionConfig::on_pushButton_del_clicked()
{
int row = ui->tableView->currentIndex().row();//获得当前行索引
qDebug() << "row" <<row <<endl;
QString strData = model->data(model->index(row,0)).toString();
QString strTableName = "t_WorkConditionRules";
QString strWhere = QString("SN = '%1' and ChannelName = '%2' ").arg(m_Index).arg(strData);
int iRet = g_SqliteDB->DeleteDataW(strTableName,strWhere);
if(iRet == 0){
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("删除成功!"));
}else{
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("删除失败!"));
}
model->removeRow(row);
}