Browse Source

效能评估报告显示各层级指标聚类结果。

Ulricy 1 year ago
parent
commit
afdef19116
2 changed files with 198 additions and 9 deletions
  1. 189 9
      QFD/widgets/EvalReportWidget.cpp
  2. 9 0
      QFD/widgets/EvalReportWidget.h

+ 189 - 9
QFD/widgets/EvalReportWidget.cpp

@@ -21,6 +21,7 @@
 #include <QBoxLayout>
 #include <QGridLayout>
 #include <QComboBox>
+#include <QPushButton>
 
 static QSize kFigureSize = QSize(600, 600);
 
@@ -112,6 +113,12 @@ void EvalReportWidget::initWidgets()
     m_schemeCombo->addItems(plots);
     m_schemeCombo->setCurrentIndex(2);
     connect(m_schemeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectSchemePlotType(int)));
+
+    m_lastSchemeLev = new QPushButton("上一级指标");
+    m_nextSchemeLev = new QPushButton("下一级指标");
+
+    connect(m_lastSchemeLev, &QPushButton::clicked, this, &EvalReportWidget::slotLastSchemeLev);
+    connect(m_nextSchemeLev, &QPushButton::clicked, this, &EvalReportWidget::slotNextSchemeLev);
 }
 
 void EvalReportWidget::initLayouts()
@@ -148,16 +155,22 @@ void EvalReportWidget::initLayouts()
         m_schemeTitle->setFont(ft);
         m_schemeTitle->setFixedHeight(100);
         m_schemeTitle->setContentsMargins(0, 50, 0, 10);
-        m_gridLayout->addWidget(m_schemeTitle, 2, 0);
-        m_gridLayout->addWidget(m_schemeCombo, 2, 1, Qt::AlignBottom);
 
         if (m_indexType == ProjectManager::OptimalIndex) {
             m_schemeTitle->setText("方案得分");
+            m_gridLayout->addWidget(m_schemeTitle, 2, 0);
             m_gridLayout->addWidget(m_schemeTable, 3, 0);
         } else {
             m_schemeTitle->setText("效能分析");
+            m_gridLayout->addWidget(m_schemeTitle, 2, 0);
             m_gridLayout->addWidget(m_EffiTab, 3, 0);
+            QHBoxLayout *lay = new QHBoxLayout();
+            lay->addWidget(m_lastSchemeLev);
+            lay->addSpacing(20);
+            lay->addWidget(m_nextSchemeLev);
+            m_gridLayout->addLayout(lay, 4, 0);
         }
+        m_gridLayout->addWidget(m_schemeCombo, 2, 1, Qt::AlignBottom);
         m_gridLayout->addWidget(m_schemePlot, 3, 1);
     }
 
@@ -557,6 +570,10 @@ void EvalReportWidget::showSchemeScorePlot()
 
 void EvalReportWidget::showEffiResult()
 {
+    showEffiResultLev();
+
+    return;
+
     m_EffiTab->clear();
 
     QList<GradeInfo *> gradeInfoList;
@@ -648,6 +665,151 @@ void EvalReportWidget::makePlotClear(PlotView *plotView)
     plotView->clearPlottables();
 }
 
+void EvalReportWidget::showEffiResultLev()
+{
+    if (m_mind->levels() < 2) {
+        return;
+    }
+
+    // 获取指标权重
+    MindWeightInfo info;
+    int indexType = m_indexType;
+    if (indexType == ProjectManager::TechIndex) {
+        indexType = ProjectManager::AbilityIndex;
+    }
+    bool ret = MindWeightService().queryWeightData(&info, m_proj->id, indexType);
+    if (ret == false) {
+        return;
+    }
+
+    if (info.id < 0) {
+        qDebug() << __FUNCTION__ << __LINE__ << "未找到指标权重数据" << endl;
+        return;
+    }
+    QMap<QString, double> weightData;
+    QStringList weightList = info.weight.split(";");
+    for (QString keyValueStr : weightList) {
+        QStringList keyValue = keyValueStr.split(":");
+        if (keyValue.size() == 2) {
+            weightData[keyValue.first()] = keyValue.last().toDouble();
+        }
+    }
+
+    int curTabIndex = m_EffiTab->currentIndex();
+    m_EffiTab->clear();
+
+    QList<GradeInfo *> gradeInfoList;
+    int type      = m_evalAlg == SchemePlanManager::MEA ? 0 : 1;
+    bool gradeRet = GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, m_proj->id, type);
+    if (gradeRet == false) {
+        return;
+    }
+    QStringList gradeNames;
+    for (int i = 0; i < gradeInfoList.size(); ++i) {
+        gradeNames.append(gradeInfoList[i]->gradeValue);
+    }
+
+    QList<EffectResult> effList;
+    bool effRet = EffectResultService().queryDataList(effList, m_proj->id);
+    if (effRet == false) {
+        return;
+    }
+
+    QMap<int, QMap<QString, QList<double>>> effData;
+    QMap<int, QString> schemeNames;
+    int levels = 0;  // 效能分级
+    for (EffectResult effect : effList) {
+        if (effData.keys().contains(effect.schemeId) == false) {
+            effData[effect.schemeId]     = QMap<QString, QList<double>>();
+            schemeNames[effect.schemeId] = effect.schemeName;
+        }
+        QStringList values = effect.value.split(",");
+        levels             = values.size();
+        QList<double> valueList;
+        for (int v = 0; v < values.size(); ++v) {
+            valueList.append(values[v].toDouble());
+        }
+
+        effData[effect.schemeId][effect.indexName] = valueList;
+    }
+
+    for (int i = 0; i < effData.keys().size(); i++) {
+        QTableView *t = new QTableView();
+        t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
+        t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
+        t->setAlternatingRowColors(true);
+        t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
+        DataTableItemModel *model = new DataTableItemModel();
+        t->setModel(model);
+
+        for (int lev = 0; lev < levels; lev++) {
+            QStandardItem *hHeader = new QStandardItem(gradeNames[lev]);
+            model->setHorizontalHeaderItem(lev, hHeader);
+        }
+
+        QStandardItem *vHeader = new QStandardItem("综合");
+        model->setVerticalHeaderItem(0, vHeader);
+
+        QList<CNodeData> nodeList = m_mind->nodesInLevel(m_curSchemeLev);
+        for (int j = 0; j < nodeList.size(); j++) {
+            CNodeData node         = nodeList[j];
+            QStandardItem *vHeader = new QStandardItem(node.name);
+            model->setVerticalHeaderItem(j + 1, vHeader);
+        }
+
+        qDebug() << __FUNCTION__ << __LINE__ << model->rowCount() << endl;
+        for (int r = 0; r < model->rowCount(); ++r) {
+            QStandardItem *vHeader = model->verticalHeaderItem(r);
+
+            qDebug() << __FUNCTION__ << __LINE__ << vHeader->text() << endl;
+
+            QList<double> rowValues;
+
+            if (m_curSchemeLev == m_mind->levels() || r == 0) {
+                rowValues = effData[effData.keys()[i]][vHeader->text()];
+            } else {
+                QList<CNodeData> subNodes = m_mind->leavesOfNode(nodeList[r - 1]);
+                qDebug() << __FUNCTION__ << __LINE__ << vHeader->text() << endl;
+                for (int l = 0; l < levels; l++) {
+                    double sumValue  = 0;
+                    double sumWeight = 0;
+                    for (int n = 0; n < subNodes.count(); n++) {
+                        QList<double> subNodeValues = effData[effData.keys()[i]][subNodes[n].name];
+                        double weight               = weightData[subNodes[n].name];
+                        sumValue += subNodeValues[l] * weight;
+                        sumWeight += weight;
+                    }
+                    double finalValue = 0;
+                    if (sumWeight > 0) {
+                        finalValue = sumValue / sumWeight;
+                    }
+                    rowValues.append(finalValue);
+                }
+            }
+
+            for (int c = 0; c < model->columnCount(); ++c) {
+                QStandardItem *item = new QStandardItem();
+                if (effData.keys().size() > i && rowValues.size() > c) {
+                    QString text = QString("%1").arg(rowValues[c]);
+                    if (std::isnan(rowValues[c])) {
+                        text = "0";
+                    }
+                    item->setText(text);
+                }
+
+                item->setEditable(false);
+                model->setItem(r, c, item);
+            }
+        }
+
+        m_EffiTab->addTab(t, schemeNames[effData.keys()[i]]);
+    }
+
+    if (curTabIndex >= 0) {
+        m_EffiTab->setCurrentIndex(curTabIndex);
+    }
+}
+
 void EvalReportWidget::slotSelectIndexPlotType(int)
 {
     showIndexWeightPlot();
@@ -676,26 +838,28 @@ void EvalReportWidget::slotIndexTabIndexChanged(int)
 
 void EvalReportWidget::slotEffiTabIndexChanged(int index)
 {
+    qDebug() << __FUNCTION__ << __LINE__ << endl;
+
     QTableView *table = (QTableView *)m_EffiTab->currentWidget();
     if (table == nullptr) {
         return;
     }
+    qDebug() << __FUNCTION__ << __LINE__ << endl;
     DataTableItemModel *model = (DataTableItemModel *)table->model();
     if (model == nullptr) {
         return;
     }
-
+    qDebug() << __FUNCTION__ << __LINE__ << endl;
     QVector<PlotView::Data> values;
     for (int i = 0; i < model->columnCount(); i++) {
         QStandardItem *header = model->horizontalHeaderItem(i);
         QStandardItem *item   = model->item(0, i);
-        PlotView::Data data { header->text(), item->text().toDouble() };
-        qDebug() << __FUNCTION__ << __LINE__ << data.name << data.value << endl;
-        qDebug() << __FUNCTION__ << __LINE__ << std::isnan(data.value) << endl;
-
-        values.append(data);
+        if (item != nullptr) {
+            PlotView::Data data { header->text(), item->text().toDouble() };
+            values.append(data);
+        }
     }
-
+    qDebug() << __FUNCTION__ << __LINE__ << endl;
     if (m_schemePlot != nullptr) {
         m_gridLayout->removeWidget(m_schemePlot);
         m_schemePlot->deleteLater();
@@ -732,3 +896,19 @@ void EvalReportWidget::slotEffiTabIndexChanged(int index)
         m_gridLayout->addWidget(m_schemePie, 3, 1);
     }
 }
+
+void EvalReportWidget::slotLastSchemeLev()
+{
+    if (m_curSchemeLev > 2) {
+        m_curSchemeLev--;
+    }
+    showEffiResultLev();
+}
+
+void EvalReportWidget::slotNextSchemeLev()
+{
+    if (m_curSchemeLev < m_mind->levels()) {
+        m_curSchemeLev++;
+    }
+    showEffiResultLev();
+}

+ 9 - 0
QFD/widgets/EvalReportWidget.h

@@ -10,6 +10,7 @@ class ProjectInfo;
 class CMind;
 class PlotView;
 class CustomPieChart;
+class QPushButton;
 
 class QVBoxLayout;
 class QGridLayout;
@@ -53,12 +54,16 @@ private:
 
     void makePlotClear(PlotView *plotView);
 
+    void showEffiResultLev();
+
 private slots:
     void slotSelectIndexPlotType(int type);
     void slotSelectTechPlotType(int type);
     void slotSelectSchemePlotType(int type);
     void slotIndexTabIndexChanged(int index);
     void slotEffiTabIndexChanged(int index);
+    void slotLastSchemeLev();
+    void slotNextSchemeLev();
 
 private:
     ProjectInfo *m_proj = nullptr;  // 项目
@@ -97,6 +102,10 @@ private:
     PlotView *m_schemePlot      = nullptr;  // 方案得分图
     CustomPieChart *m_schemePie = nullptr;  // 方案得分饼图
     QComboBox *m_schemeCombo    = nullptr;  // 切换方案得分类型
+
+    QPushButton *m_lastSchemeLev = nullptr;
+    QPushButton *m_nextSchemeLev = nullptr;
+    int m_curSchemeLev           = 2;  // 默认显示第二级指标
 };
 
 #endif  // EVALREPORTWIDGET_H