Selaa lähdekoodia

存储和加载灰类值;
修改灰类配置后,切换到评估页面立即刷新;

chengxr 1 vuosi sitten
vanhempi
commit
1be699ae44

+ 1 - 1
QFD/dbService/ClassSet.h

@@ -238,7 +238,7 @@ public:
     QString valueStr;  // 指标得分
     double score;      // 得分
     QString filePath;  // 图片地址
-    int type;          // 类型0方案1综合效能
+    int type;          // 类型, 0:方案优选 1:综合效能物元分析 2:综合效能灰色聚类
 };
 
 /**

+ 44 - 0
QFD/dbService/SchemeInfoService.cpp

@@ -117,4 +117,48 @@ bool SchemeInfoService::updateSchemeScore(const int &id, const double &score)
     }
     return ret;
 }
+
+bool SchemeInfoService::addUniqueGCEData(const SchemaEval &scheme)
+{
+    SchemaEval s;
+    bool qRet = queryGCEData(s, scheme.engineerId, scheme.name);
+    if (qRet == false) {
+        return false;
+    }
+
+    if (s.id < 0) {
+        return addScheme(scheme);
+    } else {
+        return UpdateValueStrById(s.id, scheme.valueStr);
+    }
+}
+
+bool SchemeInfoService::queryGCEData(SchemaEval &scheme, int projId, QString name)
+{
+    QSqlDatabase db = SqlDBHelper::getDatabase();
+    QSqlQuery query(db);
+    bool ret          = false;
+    QString selectSql = QString("select id,project_id,name,remark,value_str "
+                                ",score,file_path,type from t_scheme_info where "
+                                " project_id =%1 and name = '%2' and type = 2")
+                                .arg(QString::number(projId))
+                                .arg(name);
+    qDebug() << "sql=" << selectSql;
+    if (query.exec(selectSql)) {
+        while (query.next()) {
+            scheme.id         = query.value(0).toInt();
+            scheme.engineerId = query.value(1).toInt();
+            scheme.name       = query.value(2).toString();
+            scheme.remark     = query.value(3).toString();
+            scheme.valueStr   = query.value(4).toString();
+            scheme.score      = query.value(5).toDouble();
+            scheme.filePath   = query.value(6).toString();
+            scheme.type       = query.value(7).toInt();
+        }
+        ret = true;
+    } else {
+        qDebug() << query.lastError();
+    }
+    return ret;
+}
 ///////////////////////common-end/////////////////////

+ 3 - 0
QFD/dbService/SchemeInfoService.h

@@ -14,6 +14,9 @@ public:
 
     bool addScheme(const SchemaEval &scheme);
     bool updateSchemeScore(const int &id, const double &score);
+
+    bool addUniqueGCEData(const SchemaEval &scheme);
+    bool queryGCEData(SchemaEval &scheme, int projId, QString name);
 };
 
 #endif  // SCHEMEINFOSERVICE_H

+ 0 - 1
QFD/widgets/ConfigExpertDataWidget.cpp

@@ -194,7 +194,6 @@ void ConfigExpertDataWidget::loadNodeData()
         }
         m_nodeData[info->expertId].append(info);
     }
-    qDebug() << __FUNCTION__ << __LINE__ << m_nodeData.keys() << endl;
 
     refreshConfigList();
 }

+ 11 - 4
QFD/widgets/DataCollectionWidget.cpp

@@ -175,8 +175,12 @@ void DataCollectionWidget::setupTabWidget()
 
 void DataCollectionWidget::slotTabCurrentChanged(int index)
 {
+    if (index < 0) {
+        return;
+    }
+
     DataTableWidget *table = dynamic_cast<DataTableWidget *>(m_tab->widget(index));
-    if (index >= 0 && table != nullptr) {
+    if (table != nullptr) {
         bool expert = (table->process().dSource == SchemePlanManager::FromExpert);
         if (expert) {
             m_configExpert->setProcess(table->process());
@@ -200,13 +204,16 @@ void DataCollectionWidget::slotTabCurrentChanged(int index)
             m_configMeasure->selectFirst();
         }
         m_configMeasure->setVisible(meaure);
-    }
-
-    if (table == nullptr) {
+    } else {
         m_configExpert->setHidden(true);
         m_configMeasure->setHidden(true);
         m_configScheme->setHidden(true);
     }
+
+    GreyClusteringSampleTable *gs = dynamic_cast<GreyClusteringSampleTable *>(m_tab->widget(index));
+    if (gs != nullptr) {
+        gs->refreshData();
+    }
 }
 
 void DataCollectionWidget::slotCalc()

+ 0 - 2
QFD/widgets/GreyClusteringConfigWidget.cpp

@@ -156,7 +156,6 @@ void GreyClusteringConfigWidget::initClusteringItems()
             sg->oldValue       = 0;
             sg->newValue       = 0;
             childItem.value.reset(sg);
-            qDebug() << __FUNCTION__ << __LINE__ << childItem.indexName << childItem.value->units << endl;
             m_greyClusterings.append(childItem);
             subRow++;
         }
@@ -218,7 +217,6 @@ void GreyClusteringConfigWidget::initClusteringItems()
 
                     int align = qMin(valueList.size(), item.value->greyRanges.size());
 
-                    qDebug() << __FUNCTION__ << __LINE__ << effInfo->effectIndexValue << valueList << align << endl;
                     for (int str = 0; str < align; str++) {
                         //[0:0]
                         QStringList lr = valueList.at(str).mid(1, valueList.at(str).size() - 2).split(":");

+ 119 - 33
QFD/widgets/GreyClusteringSampleTable.cpp

@@ -4,6 +4,7 @@
 #include "CMind.h"
 #include "dbService/GradeInfoService.h"
 #include "dbService/EffectIndexInfoService.h"
+#include "dbService/SchemeInfoService.h"
 #include "algorithm/GreyClusterEvaluation.h"
 
 #include "ProjectManager.h"
@@ -138,9 +139,20 @@ GreyClusteringSampleTable::GreyClusteringSampleTable(CMind *mind, int grayNumber
     : QTableView(parent), m_mind(mind), m_nodeDepth(2), m_grayNumber(grayNumber)
 {
     m_model = new QStandardItemModel();
+    connect(m_model, &QStandardItemModel::itemChanged, this, &GreyClusteringSampleTable::itemChanged);
     this->setModel(m_model);
 
     init();
+
+    refreshData();
+}
+
+void GreyClusteringSampleTable::refreshData()
+{
+    loadData();
+
+    loadSchemeData();
+
     initClusteringItems();
 
     refreshTableView();
@@ -148,9 +160,11 @@ GreyClusteringSampleTable::GreyClusteringSampleTable(CMind *mind, int grayNumber
 
 void GreyClusteringSampleTable::refreshTableView()
 {
+    m_isFillingData = true;
     m_model->clear();
 
     if (m_greyClusterings.size() == 0) {
+        m_isFillingData = false;
         return;
     }
 
@@ -168,37 +182,41 @@ void GreyClusteringSampleTable::refreshTableView()
 
     // 设置表头
     {
-        auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, colCount, this);
-        hHeader->setSectionResizeMode(QHeaderView::Stretch);
+        if (m_tableHeaderInitialized == false) {
+            m_tableHeaderInitialized = true;
 
-        hHeader->setCellSpan(0, 0, 2, m_nodeDepth);       // 指标占位
-        for (int n = 0; n < 2 + greyNames.size(); ++n) {  //  单位+权重+灰度级占位
-            hHeader->setCellSpan(0, m_nodeDepth + n, 2, 1);
-        }
-        hHeader->setCellSpan(0, m_nodeDepth + 2 + greyNames.size(), 1, 2);  // 延拓值占位
-        hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size(), 1, 1);
-        hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size() + 1, 1, 1);
-
-        hHeader->setCellSpan(0, m_nodeDepth + 4 + greyNames.size(), 1, 2);  // 实现值占位
-        hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size(), 1, 1);
-        hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size() + 1, 1, 1);
-
-        // 一级
-        hHeader->setCellText(0, 0, QString("指标"));
-        hHeader->setCellText(0, m_nodeDepth, QString("单位"));
-        hHeader->setCellText(0, m_nodeDepth + 1, QString("权重"));
-        for (int i = 0; i < greyNames.size(); ++i) {
-            hHeader->setCellText(0, m_nodeDepth + 2 + i, greyNames.at(i));
+            auto hHeader = new MultiLevelHeaderView(Qt::Horizontal, 2, colCount, this);
+            hHeader->setSectionResizeMode(QHeaderView::Stretch);
+
+            hHeader->setCellSpan(0, 0, 2, m_nodeDepth);       // 指标占位
+            for (int n = 0; n < 2 + greyNames.size(); ++n) {  //  单位+权重+灰度级占位
+                hHeader->setCellSpan(0, m_nodeDepth + n, 2, 1);
+            }
+            hHeader->setCellSpan(0, m_nodeDepth + 2 + greyNames.size(), 1, 2);  // 延拓值占位
+            hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size(), 1, 1);
+            hHeader->setCellSpan(1, m_nodeDepth + 2 + greyNames.size() + 1, 1, 1);
+
+            hHeader->setCellSpan(0, m_nodeDepth + 4 + greyNames.size(), 1, 2);  // 实现值占位
+            hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size(), 1, 1);
+            hHeader->setCellSpan(1, m_nodeDepth + 4 + greyNames.size() + 1, 1, 1);
+
+            // 一级
+            hHeader->setCellText(0, 0, QString("指标"));
+            hHeader->setCellText(0, m_nodeDepth, QString("单位"));
+            hHeader->setCellText(0, m_nodeDepth + 1, QString("权重"));
+            for (int i = 0; i < greyNames.size(); ++i) {
+                hHeader->setCellText(0, m_nodeDepth + 2 + i, greyNames.at(i));
+            }
+            hHeader->setCellText(0, m_nodeDepth + 2 + greyNames.size(), QString("延拓值"));
+            hHeader->setCellText(0, m_nodeDepth + 4 + greyNames.size(), QString("实现值"));
+            // 二级
+            hHeader->setCellText(1, m_nodeDepth + 2 + greyNames.size(), "左");
+            hHeader->setCellText(1, m_nodeDepth + 3 + greyNames.size(), "右");
+            hHeader->setCellText(1, m_nodeDepth + 4 + greyNames.size(), "建设前");
+            hHeader->setCellText(1, m_nodeDepth + 5 + greyNames.size(), "建设后");
+
+            this->setHorizontalHeader(hHeader);
         }
-        hHeader->setCellText(0, m_nodeDepth + 2 + greyNames.size(), QString("延拓值"));
-        hHeader->setCellText(0, m_nodeDepth + 4 + greyNames.size(), QString("实现值"));
-        // 二级
-        hHeader->setCellText(1, m_nodeDepth + 2 + greyNames.size(), "左");
-        hHeader->setCellText(1, m_nodeDepth + 3 + greyNames.size(), "右");
-        hHeader->setCellText(1, m_nodeDepth + 4 + greyNames.size(), "建设前");
-        hHeader->setCellText(1, m_nodeDepth + 5 + greyNames.size(), "建设后");
-
-        this->setHorizontalHeader(hHeader);
     }
 
     m_model->setColumnCount(colCount);
@@ -238,11 +256,19 @@ void GreyClusteringSampleTable::refreshTableView()
             m_model->setItem(item.row, item.col + offset,
                              new QStandardItem(QString::number(item.value->rightExtension)));  // 延拓值右
             ++offset;
-            m_model->setItem(item.row, item.col + offset,
-                             new QStandardItem(QString::number(item.value->oldValue)));  // 实现值前
+
+            QStandardItem *oldValue = new QStandardItem;
+            if (m_schemeData.keys().contains("建设前")) {
+                oldValue->setText(m_schemeData["建设前"][item.indexName]);
+            }
+            m_model->setItem(item.row, item.col + offset, oldValue);  // 实现值前
             ++offset;
-            m_model->setItem(item.row, item.col + offset,
-                             new QStandardItem(QString::number(item.value->newValue)));  // 实现值后
+
+            QStandardItem *newValue = new QStandardItem;
+            if (m_schemeData.keys().contains("建设后")) {
+                newValue->setText(m_schemeData["建设后"][item.indexName]);
+            }
+            m_model->setItem(item.row, item.col + offset, newValue);  // 实现值后
 
             ++offset;
 
@@ -257,6 +283,39 @@ void GreyClusteringSampleTable::refreshTableView()
             }
         }
     }
+    m_isFillingData = false;
+}
+
+void GreyClusteringSampleTable::itemChanged(QStandardItem *item)
+{
+    if (m_isFillingData) {
+        return;
+    }
+
+    if (horizontalHeader()->model()->rowCount() < 2 || horizontalHeader()->model()->columnCount() <= item->column()) {
+        return;
+    }
+
+    QModelIndex hIndex = horizontalHeader()->model()->index(1, item->column());
+    QString hTitle     = horizontalHeader()->model()->data(hIndex).toString();
+
+    QStringList valueStrList;
+    for (int r = 0; r < m_model->rowCount(); ++r) {
+        QString vTitle   = m_model->item(r, 1)->text();
+        QString value    = m_model->item(r, item->column())->text();
+        QString valueStr = vTitle + ":" + value;
+        valueStrList.append(valueStr);
+    }
+    QString v = valueStrList.join(";");
+
+    SchemaEval scheme;
+    scheme.engineerId = m_mind->root().projectId;
+    scheme.name       = hTitle;
+    scheme.valueStr   = v;
+    scheme.type       = 2;
+
+    bool ret = SchemeInfoService().addUniqueGCEData(scheme);
+    qDebug() << __FUNCTION__ << __LINE__ << ret << endl;
 }
 
 void GreyClusteringSampleTable::compute()
@@ -325,7 +384,10 @@ void GreyClusteringSampleTable::init()
     verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
     verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
     setSelectionMode(QAbstractItemView::SingleSelection);
+}
 
+void GreyClusteringSampleTable::loadData()
+{
     QList<GradeInfo *> gradeInfoList;
     QMap<QString, QString> grayLevelMaps;
     int projectId = m_mind->root().projectId;
@@ -370,6 +432,30 @@ void GreyClusteringSampleTable::init()
     qDeleteAll(gradeInfoList);
 }
 
+void GreyClusteringSampleTable::loadSchemeData()
+{
+    m_schemeData.clear();
+
+    QList<SchemaEval *> schemeList;
+    bool ret = SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_mind->root().projectId, 2);
+    if (ret == false) {
+        return;
+    }
+
+    for (SchemaEval *scheme : schemeList) {
+        if (m_schemeData.keys().contains(scheme->name) == false) {
+            m_schemeData[scheme->name] = QMap<QString, QString>();
+        }
+        QStringList valueStrList = scheme->valueStr.split(";");
+        for (QString valueStr : valueStrList) {
+            QStringList keyValue = valueStr.split(":");
+            if (keyValue.size() == 2) {
+                m_schemeData[scheme->name][keyValue.first()] = keyValue.last();
+            }
+        }
+    }
+}
+
 void GreyClusteringSampleTable::initClusteringItems()
 {
     // 脑图层级 < 2 时无效

+ 16 - 1
QFD/widgets/GreyClusteringSampleTable.h

@@ -48,14 +48,24 @@ class GreyClusteringSampleTable : public QTableView
 public:
     GreyClusteringSampleTable(CMind *mind, int grayNumber, QWidget *parent = nullptr);
 
-    void refreshTableView();
+    void refreshData();
 
     void compute();
 
 private:
     void init();
+
+    void loadData();
+
+    void loadSchemeData();
+
     void initClusteringItems();
 
+    void refreshTableView();
+
+private slots:
+    void itemChanged(QStandardItem *item);
+
 private:
     QVector<GreyClusteringItem> m_greyClusterings;
     QStandardItemModel *m_model;
@@ -66,6 +76,11 @@ private:
 
     const int nodeDepth = 2;  // 节点深度
     int m_grayNumber;
+
+    bool m_isFillingData          = false;
+    bool m_tableHeaderInitialized = false;
+
+    QMap<QString, QMap<QString, QString>> m_schemeData;
 };
 
 #endif  // GREYCLUSTERINGSAMPLETABLE_H