Эх сурвалжийг харах

存储效能评估计算结果;
显示效能评估报告;

chengxr 1 жил өмнө
parent
commit
6016a5e88e

+ 15 - 0
QFD/algorithm/GreyClusterEvaluation.cpp

@@ -116,5 +116,20 @@ BestIndex GreyClusterEvaluation::getBestIndex() const
                 break;
         }
     }
+
+    for (GCEmat m : ranges_weight_) {
+        qDebug() << __FUNCTION__ << __LINE__ << m.front_val << m.back_val << endl;
+    }
+
     return index;
 }
+
+const QVector<GCEmat> &GreyClusterEvaluation::getRangeWeights() const
+{
+    return ranges_weight_;
+}
+
+const QVector<GCEMat> &GreyClusterEvaluation::getRangeCVT() const
+{
+    return ranges_cv_;
+}

+ 3 - 0
QFD/algorithm/GreyClusterEvaluation.h

@@ -46,6 +46,9 @@ public:
 
     BestIndex getBestIndex() const;
 
+    const QVector<GCEmat> &getRangeWeights() const;
+    const QVector<GCEMat> &getRangeCVT() const;
+
     int sample_num_;  // 样本数
     int level_num_;   // 等级数
 

+ 11 - 6
QFD/algorithm/MatterElementAnalysis.cpp

@@ -85,6 +85,11 @@ const MEAMat &MatterElementAnalysis::getRangeWeights() const
     return range_weights_;
 }
 
+const QVector<MEAMat> &MatterElementAnalysis::getRangeCVT() const
+{
+    return range_cvt_;
+}
+
 QVector<int> MatterElementAnalysis::getBestIndex() const
 {
     auto maxLoc = [](const QVector<double> &v) {
@@ -103,11 +108,11 @@ QVector<int> MatterElementAnalysis::getBestIndex() const
         result << maxLoc(s) + 1;
     }
 
-    //    for (int i = 0; i < range_cvt_.size(); i++) {
-    //        qDebug() << "指标 " << i;
-    //        for (int j = 0; j < range_cvt_.at(i).size(); j++) {
-    //            qDebug() << range_cvt_.at(i).at(j);
-    //        }
-    //    }
+    for (int i = 0; i < range_cvt_.size(); i++) {
+        qDebug() << "指标 " << i;
+        for (int j = 0; j < range_cvt_.at(i).size(); j++) {
+            qDebug() << range_cvt_.at(i).at(j);
+        }
+    }
     return result;
 }

+ 1 - 0
QFD/algorithm/MatterElementAnalysis.h

@@ -33,6 +33,7 @@ public:
     void evaluate(const QVector<double> &weights);
 
     const MEAMat &getRangeWeights() const;
+    const QVector<MEAMat> &getRangeCVT() const;
 
     QVector<int> getBestIndex() const;
 

+ 46 - 7
QFD/common/DataEvaluator.cpp

@@ -18,6 +18,7 @@
 #include <dbService/MindScoreService.h>
 #include <dbService/SchemeInfoService.h>
 #include <dbService/GradeIndexInfoService.h>
+#include <dbService/EffectResultService.h>
 
 #include <QMap>
 #include <QDebug>
@@ -394,7 +395,8 @@ bool DataEvaluator::evaluateScheme()
     bool weightRet = getWeightData(weightData);
 
     QMap<int, QMap<QString, double>> schemeData;
-    bool schemeRet = getSchemeData(schemeData);
+    QMap<int, QString> schemeNames;
+    bool schemeRet = getSchemeData(schemeData, schemeNames);
 
     if (weightRet == false || schemeRet == false) {
         return false;
@@ -450,7 +452,8 @@ bool DataEvaluator::evaluateEfficiencyMEA()
 
     /// 获取样本数据
     QMap<int, QMap<QString, double>> schemeData;
-    bool schemeRet = getSchemeData(schemeData);
+    QMap<int, QString> schemeNames;
+    bool schemeRet = getSchemeData(schemeData, schemeNames);
 
     QMap<QString, double> weightData;
     bool weightRet = getWeightData(weightData);
@@ -499,12 +502,47 @@ bool DataEvaluator::evaluateEfficiencyMEA()
 
     MatterElementAnalysis me(mat, ranges);
     me.evaluate(weights);
-    QVector<int> index = me.getBestIndex();
-    qDebug() << __FUNCTION__ << __LINE__ << index << endl;
 
-    qDebug() << __FUNCTION__ << __LINE__ << me.getRangeWeights() << endl;
+    QVector<MEAMat> rangeCvt = me.getRangeCVT();
+    MEAMat rangeWeights      = me.getRangeWeights();
 
-    return false;
+    if (schemeData.keys().size() != rangeCvt.size() || schemeData.keys().size() != rangeWeights.size()) {
+        return false;
+    }
+
+    QList<EffectResult> resultData;
+    for (int scheme = 0; scheme < schemeData.keys().size(); ++scheme) {
+        EffectResult overall;
+        overall.projectId      = m_process.projectId;
+        overall.schemeId       = schemeData.keys()[scheme];
+        overall.schemeName     = schemeNames[schemeData.keys()[scheme]];
+        overall.algType        = 0;
+        overall.indexName      = "综合";
+        QVector<double> values = rangeWeights[scheme];
+        QStringList strList;
+        for (int v = 0; v < values.size(); ++v) {
+            strList.append(QString("%1").arg(values[v]));
+        }
+        overall.value = strList.join(",");
+        resultData.append(overall);
+        for (int index = 0; index < indexList.size(); ++index) {
+            EffectResult result;
+            result.projectId       = m_process.projectId;
+            result.schemeId        = schemeData.keys()[scheme];
+            result.schemeName      = schemeNames[schemeData.keys()[scheme]];
+            result.algType         = 0;
+            result.indexName       = indexList[index].name;
+            QVector<double> values = rangeCvt[scheme][index];
+            QStringList strList;
+            for (int v = 0; v < values.size(); ++v) {
+                strList.append(QString("%1").arg(values[v]));
+            }
+            result.value = strList.join(",");
+            resultData.append(result);
+        }
+    }
+    bool saveRet = EffectResultService().addDataList(resultData);
+    return saveRet;
 }
 
 bool DataEvaluator::evaluateEfficiencyGCE()
@@ -610,7 +648,7 @@ bool DataEvaluator::getWeightData(QMap<QString, double> &weightData) const
     return true;
 }
 
-bool DataEvaluator::getSchemeData(QMap<int, QMap<QString, double>> &schemeData) const
+bool DataEvaluator::getSchemeData(QMap<int, QMap<QString, double>> &schemeData, QMap<int, QString> &schemeNames) const
 {
     QList<SchemaEval *> schemeList;
     int type = m_process.indexType == ProjectManager::OptimalIndex ? 0 : 1;
@@ -635,6 +673,7 @@ bool DataEvaluator::getSchemeData(QMap<int, QMap<QString, double>> &schemeData)
                 schemeData[scheme->id][keyValue.first()] = keyValue.last().toDouble();
             }
         }
+        schemeNames[scheme->id] = scheme->name;
     }
     return true;
 }

+ 1 - 1
QFD/common/DataEvaluator.h

@@ -58,7 +58,7 @@ private:
     /// int key: 方案 id
     /// QString key: 指标名称
     /// double value: 指标权重
-    bool getSchemeData(QMap<int, QMap<QString, double>> &schemeData) const;
+    bool getSchemeData(QMap<int, QMap<QString, double>> &schemeData, QMap<int, QString> &schemeNames) const;
 
     /// 使用横坐标和纵坐标构造索引
     QString nodeDataKey(NodeMatrixInfo *data) const;

+ 7 - 6
QFD/dbService/ClassSet.h

@@ -427,12 +427,13 @@ public:
 class EffectResult
 {
 public:
-    int id = -1;           // 主键id
-    int projectId;         // 工程id
-    QString effectOld;     // 效能指标名称
-    QString effectNew;     // 效能指标值
-    QString effectResult;  // 结果
-    QString createTime;    // 创建时间
+    int id = -1;         // 主键id
+    int projectId;       // 工程id
+    int schemeId;        // 方案 id, 对于灰色聚类法, 建设前为-2, 建设后为-1;
+    QString schemeName;  // 方案名称
+    int algType;         // 算法类型, 0:物元分析法, 1:灰色聚类法
+    QString indexName;   // 指标名称
+    QString value;       // 结果
 };
 
 class MindWeightInfo

+ 76 - 9
QFD/dbService/EffectResultService.cpp

@@ -8,12 +8,9 @@ int EffectResultService::AddEffectResult(const EffectResult &effectResult)
     int ret = -1;
     try {
         Transaction t(SqlDBHelper::getDatabase());
-        InsertQuery query = t.insertInto("t_effect_result(`project_id`, `effect_old`, `effect_new`, "
+        InsertQuery query     = t.insertInto("t_effect_result(`project_id`, `effect_old`, `effect_new`, "
                                          "`effect_result`, `create_time`)");
-        NonQueryResult result =
-                query.values(effectResult.projectId, effectResult.effectOld, effectResult.effectNew,
-                             effectResult.effectResult, QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
-                        .exec();
+        NonQueryResult result = query.values(effectResult.projectId).exec();
         t.commit();
         ret = result.lastInsertId().toInt();
     } catch (const DBException &ex) {
@@ -36,10 +33,6 @@ bool EffectResultService::QueryAllEffectResultByProjectId(QList<EffectResult *>
             if (query.isNull(0) == false) {
                 EffectResult *projectInfo = new EffectResult();
                 projectInfo->id           = query.value(0).toInt();
-                projectInfo->effectOld    = query.value(1).toString();
-                projectInfo->effectNew    = query.value(2).toString();
-                projectInfo->effectResult = query.value(3).toString();
-                projectInfo->createTime   = query.value(4).toString();
                 effectResult->append(projectInfo);
             }
             ret = true;
@@ -49,3 +42,77 @@ bool EffectResultService::QueryAllEffectResultByProjectId(QList<EffectResult *>
     }
     return ret;
 }
+
+bool EffectResultService::addDataList(QList<EffectResult> &dataList)
+{
+    if (dataList.size() <= 0) {
+        return true;
+    }
+
+    bool deleteRet = deleteData(dataList.first().projectId);
+    if (deleteRet == false) {
+        return false;
+    }
+
+    bool ret = false;
+    try {
+        Transaction t(SqlDBHelper::getDatabase());
+        for (int i = 0; i < dataList.size(); i++) {
+            EffectResult effect = dataList[i];
+            InsertQuery query =
+                    t.insertInto("t_effect_result (project_id, scheme_id, scheme_name, alg_type, index_name, "
+                                 "value)");
+            query.values(effect.projectId, effect.schemeId, effect.schemeName, effect.algType, effect.indexName,
+                         effect.value)
+                    .exec();
+            t.commit();
+        }
+
+        ret = true;
+    } catch (const DBException &ex) {
+        qDebug() << ex.lastError.text();
+    }
+    return ret;
+}
+
+bool EffectResultService::queryDataList(QList<EffectResult> &dataList, int projectId)
+{
+    QSqlDatabase db = SqlDBHelper::getDatabase();
+    QSqlQuery query(db);
+    bool ret          = false;
+    QString selectSql = QString("SELECT id, project_id, scheme_id, scheme_name, index_name, value FROM "
+                                "t_effect_result where project_id = %1 order by id")
+                                .arg(projectId);
+    if (query.exec(selectSql)) {
+        while (query.next()) {
+            if (query.isNull(0) == false) {
+                EffectResult effect;
+                effect.id         = query.value(0).toInt();
+                effect.projectId  = query.value(1).toInt();
+                effect.schemeId   = query.value(2).toInt();
+                effect.schemeName = query.value(3).toString();
+                effect.indexName  = query.value(4).toString();
+                effect.value      = query.value(5).toString();
+                dataList.append(effect);
+            }
+            ret = true;
+        }
+    } else {
+        qDebug() << query.lastError();
+    }
+    return ret;
+}
+
+bool EffectResultService::deleteData(int projectId)
+{
+    bool ret = false;
+    try {
+        Transaction t(SqlDBHelper::getDatabase());
+        t.deleteFrom("t_effect_result").where("project_id = ?", projectId);
+        t.commit();
+        ret = true;
+    } catch (const DBException &ex) {
+        qDebug() << ex.lastError.text();
+    }
+    return ret;
+}

+ 6 - 0
QFD/dbService/EffectResultService.h

@@ -8,6 +8,12 @@ public:
     EffectResultService(QObject *parent = nullptr);
     int AddEffectResult(const EffectResult &effectResult);
     bool QueryAllEffectResultByProjectId(QList<EffectResult *> *effectResult, int projectId);
+
+    bool addDataList(QList<EffectResult> &dataList);
+
+    bool queryDataList(QList<EffectResult> &dataList, int projectId);
+
+    bool deleteData(int projectId);
 };
 
 #endif  // EFFECTRESULTSERVICE_H

+ 96 - 144
QFD/widgets/EvalReportWidget.cpp

@@ -12,6 +12,8 @@
 #include <dbService/SchemeProcessService.h>
 #include <dbService/MindWeightService.h>
 #include <dbService/MindScoreService.h>
+#include <dbService/EffectResultService.h>
+#include <dbService/GradeInfoService.h>
 
 #include <QLabel>
 #include <QBoxLayout>
@@ -92,18 +94,20 @@ void EvalReportWidget::initWidgets()
     m_indexCombo = new QComboBox(this);
     m_indexCombo->setFixedSize(QSize(150, 35));
     m_indexCombo->addItems(plots);
-    m_indexCombo->setCurrentIndex(2);
+    m_indexCombo->setCurrentIndex(1);
     connect(m_indexCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectIndexPlotType(int)));
 
     //    plots       = QStringList { "竖向柱状图" };
     m_techCombo = new QComboBox(this);
     m_techCombo->setFixedSize(QSize(150, 35));
     m_techCombo->addItems(plots);
+    m_techCombo->setCurrentIndex(1);
     connect(m_techCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectTechPlotType(int)));
 
     m_schemeCombo = new QComboBox(this);
     m_schemeCombo->setFixedSize(QSize(150, 35));
     m_schemeCombo->addItems(plots);
+    m_schemeCombo->setCurrentIndex(2);
     connect(m_schemeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectSchemePlotType(int)));
 }
 
@@ -520,11 +524,42 @@ void EvalReportWidget::showEffiResult()
 {
     m_EffiTab->clear();
 
-    QList<QString> tabList = { "建设前", "建设后" };
-    if (m_evalAlg == SchemePlanManager::MEA) {
-        tabList = { "方案一", "方案二" };
+    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);
     }
-    for (int i = 0; i < tabList.size(); i++) {
+
+    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;}");
@@ -533,9 +568,8 @@ void EvalReportWidget::showEffiResult()
         DataTableItemModel *model = new DataTableItemModel();
         t->setModel(model);
 
-        QList<QString> levList = { "差", "中", "良", "优" };
-        for (int lev = 0; lev < levList.size(); lev++) {
-            QStandardItem *hHeader = new QStandardItem(levList[lev]);
+        for (int lev = 0; lev < levels; lev++) {
+            QStandardItem *hHeader = new QStandardItem(gradeNames[lev]);
             model->setHorizontalHeaderItem(lev, hHeader);
         }
 
@@ -551,13 +585,16 @@ void EvalReportWidget::showEffiResult()
 
         for (int r = 0; r < model->rowCount(); ++r) {
             for (int c = 0; c < model->columnCount(); ++c) {
-                QStandardItem *item = new QStandardItem();
+                QStandardItem *vHeader = model->verticalHeaderItem(r);
+                QStandardItem *item    = new QStandardItem();
+                QString text           = QString("%1").arg(effData[effData.keys()[i]][vHeader->text()][c]);
+                item->setText(text);
                 item->setEditable(false);
                 model->setItem(r, c, item);
             }
         }
 
-        m_EffiTab->addTab(t, tabList[i]);
+        m_EffiTab->addTab(t, schemeNames[effData.keys()[i]]);
     }
 }
 
@@ -616,9 +653,13 @@ void EvalReportWidget::slotSelectTechPlotType(int)
 
 void EvalReportWidget::slotSelectSchemePlotType(int)
 {
-    showSchemeScorePlot();
-    //    makePlotClear(m_schemePlot);
-    //    m_schemePlot->updateType(PlotView::PlotType(type));
+    if (m_indexType == ProjectManager::OptimalIndex) {
+        showSchemeScorePlot();
+    }
+
+    if (m_indexType == ProjectManager::EfficiencyIndex) {
+        slotEffiTabIndexChanged(m_EffiTab->currentIndex());
+    }
 }
 
 void EvalReportWidget::slotIndexTabIndexChanged(int)
@@ -628,146 +669,57 @@ void EvalReportWidget::slotIndexTabIndexChanged(int)
 
 void EvalReportWidget::slotEffiTabIndexChanged(int index)
 {
-    if (m_proj->id != 113) {
+    QTableView *table = (QTableView *)m_EffiTab->currentWidget();
+    if (table == nullptr) {
+        return;
+    }
+    DataTableItemModel *model = (DataTableItemModel *)table->model();
+    if (model == nullptr) {
         return;
     }
 
-    // 灰色聚类: 0:建设前, 1:建设后
-    // 物元分析: 0:方案一, 1:方案二
-    QList<double> values;
-    if (index == 0) {
-        if (m_evalAlg == SchemePlanManager::GCE) {
-            values = { 0.228928, 0.715073, 0.394897, 0.00254005,
-
-                       0,        0.666667, 0,        0,
-
-                       0.111111, 0.75,     0.6,      0,
-
-                       0,        0.666667, 0.666667, 0,
-
-                       0.833333, 0.210526, 0,        0,
-
-                       0.010101, 1,        0.333333, 0,
-
-                       0.428571, 0.875,    0.142857, 0,
-
-                       0.2,      1,        0.363636, 0,
-
-                       0,        0,        0.992366, 0.020202,
-
-                       0.428571, 0.875,    0.333333, 0,
-
-                       1,        0.428571, 0,        0,
-
-                       0.020202, 0.992366, 0,        0,
-
-                       0.2,      1,        0.363636, 0,
-
-                       0.714286, 0.625,    0,        0,
-
-                       0.4,      1,        0.333333, 0,
-
-                       0.142857, 0.888889, 0.444444, 0,
-
-                       0.666667, 0.666667, 0,        0,
-
-                       0.142857, 0.875,    0.428571, 0,
-
-                       0.266667, 0.96,     0.3,      0,
+    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;
+        values.append(data);
+    }
 
-                       0.666667, 0.666667, 0,        0,
+    if (m_schemePlot != nullptr) {
+        m_gridLayout->removeWidget(m_schemePlot);
+        m_schemePlot->deleteLater();
+        m_schemePlot = nullptr;
+    }
+    if (m_schemePie != nullptr) {
+        m_gridLayout->removeWidget(m_schemePie);
+        m_schemePie->deleteLater();
+        m_schemePie = nullptr;
+    }
 
-                       0.666667, 0.666667, 0,        0 };
-        } else {
-            values = { 0.228397,  0.174062,  -0.139881, -0.192361, -0.333333,  0,           -0.333333,  -0.6,
-                       0.214286,  -0.26087,  0.0625,    0.214286,  -0.333333,  0,           0,          -0.333333,
-                       -0.1,      0.5,       1,         2,         0.00364964, -0.00362319, 0.00364964, 0.0110294,
-                       -0.125,    0.166667,  -0.3,      -0.5625,   -0.25,      0.5,         -0.25,      -0.454545,
-                       -0.375,    -0.285714, -0.166667, 0.25,      -0.125,     0.166667,    -0.3,       -0.5625,
-                       29,        -0.5,      -0.625,    -0.684211, 0.25,       -0.166667,   -0.285714,  -0.375,
-                       -0.25,     0.5,       -0.25,     -0.454545, 0.25,       -0.166667,   -0.5,       -0.6875,
-                       -0.333333, 1,         -0.333333, -0.6,      0.125,      -0.0526316,  0.0588235,  0.285714,
-                       0,         0,         -0.5,      -0.666667, -0.25,      0.125,       -0.1,       -0.4375,
-                       -0.272727, 0.333333,  -0.2,      -0.6,      -0.111111,  0.142857,    0.6,        1,
-                       0,         0,         -0.5,      -0.666667 };
-        }
+    if (m_schemeCombo->currentIndex() < 5) {
+        PlotView::PlotType type = (PlotView::PlotType)m_schemeCombo->currentIndex();
+        m_schemePlot            = new PlotView(type, values, "", this);
+        m_schemePlot->setFixedSize(kFigureSize);
+        m_schemePlot->plot();
+        m_gridLayout->addWidget(m_schemePlot, 3, 1);
     } else {
-        if (m_evalAlg == SchemePlanManager::GCE) {
-            values = {
-                0.0406435, 0.311878, 0.735938, 0.316491,
-
-                0,         0,        0.666667, 0,
-
-                0,         0,        0.8,      0.5,
-
-                0,         0,        0.994872, 0.020202,
-
-                0,         0.444444, 0.888889, 0.166667,
-
-                0,         0,        0.333333, 1,
-
-                0,         0.625,    0.714286, 0.125,
-
-                0,         0.2,      0.8,      0.571429,
-
-                0.3,       0.96,     0.266667, 0,
-
-                0,         0.625,    0.777778, 0.125,
-
-                0.2,       1,        0.363636, 0,
-
-                0,         0.266667, 0.96,     0.3,
-
-                0,         0.2,      0.8,      0.571429,
-
-                0,         0.5,      0.857143, 0.25,
-
-                0,         0,        0.979167, 0.0606061,
-
-                0,         0,        0.533333, 0.833333,
 
-                0,         0,        0.994872, 0.020202,
-
-                0,         0.125,    0.714286, 0.625,
-
-                0,         0,        0.882353, 0.3,
-
-                0,         0.25,     1,        0.25,
+        QStringList tagList;
+        QList<double> dataList;
+        QList<QColor> colorList;
 
-                0,         0,        0.994872, 0.020202,
-            };
-        } else {
-            values = { -0.406858, -0.219394, 0.364666,  -0.228834, -0.428571, -0.2,      0,          -0.2,
-                       0.428571,  -0.130435, 0,         0,         -0.4,      -0.25,     0,          0,
-                       0.25,      0.0526316, -0.047619, 0.111111,  0.0182482, 0.0108696, 0.00359712, -0.00357143,
-                       -0.357143, -0.1,      0.125,     -0.357143, -0.75,     -0.5,      1,          -0.333333,
-                       -0.142857, 0.2,       -0.2,      -0.4,      -0.357143, -0.1,      0.125,      -0.357143,
-                       -0.25,     0.5,       -0.25,     -0.454545, -0.4,      -0.2,      0.2,        -0.142857,
-                       -0.75,     -0.5,      1,         -0.333333, -0.428571, -0.2,      0.333333,   -0.333333,
-                       -0.454545, -0.333333, -0.142857, 0.2,       0.5,       0.263158,  0.0909091,  -0.0769231,
-                       -0.4,      -0.25,     0,         0,         -0.642857, -0.5,      0.25,       -0.166667,
-                       -0.444444, -0.375,    -0.166667, 0.25,      0.277778,  0.0454545, -0.0416667, 0.0454545,
-                       -0.4,      -0.25,     0,         0 };
+        for (int i = 0; i < values.size(); i++) {
+            tagList.append("");
+            double t = values[i].value;
+            dataList.append(t);
+            QColor color(20 + 200 / values.size() * i, 70 * (1.6 - i / values.size()), 150, 255);
+            colorList.append(color);
         }
-    }
-
-    QTableView *table         = (QTableView *)m_EffiTab->widget(index);
-    DataTableItemModel *model = (DataTableItemModel *)table->model();
-
-    for (int i = 0; i < values.size(); i++) {
-        QStandardItem *item = new QStandardItem();
-        item->setEditable(false);
 
-        item->setText(QString("%1").arg(values[i]));
-        model->setItem(i / 4, i % 4, item);
-    }
-
-    QVector<PlotView::Data> plotValues;
-    QList<QString> strList = { "差", "中", "良", "优" };
-    for (int i = 0; i < 4; i++) {
-        PlotView::Data data { strList[i], values[i] };
-        plotValues.append(data);
+        m_schemePie = new CustomPieChart("", tagList, dataList, colorList);
+        m_schemePie->setFixedSize(kFigureSize);
+        m_gridLayout->addWidget(m_schemePie, 3, 1);
     }
-    makePlotClear(m_schemePlot);
-    m_schemePlot->updateData(plotValues);
 }

+ 73 - 4
QFD/widgets/GreyClusteringSampleTable.cpp

@@ -5,6 +5,8 @@
 #include "dbService/GradeInfoService.h"
 #include "dbService/EffectIndexInfoService.h"
 #include "dbService/SchemeInfoService.h"
+#include "dbService/MindWeightService.h"
+#include "dbService/EffectResultService.h"
 #include "algorithm/GreyClusterEvaluation.h"
 
 #include "ProjectManager.h"
@@ -372,13 +374,80 @@ void GreyClusteringSampleTable::compute()
     }
     QScopedPointer<GreyClusterEvaluation> gc(new GreyClusterEvaluation(mat, ranges));
 
-    // { 0.2, 0.15, 0.05, 0.4, 0.2 }
+    MindWeightInfo info;
+    bool ret = MindWeightService().queryWeightData(&info, m_mind->root().projectId, ProjectManager::EfficiencyIndex);
+    if (ret == false) {
+        return;
+    }
 
-    QVector<double> weights(m_rowCount, 1.0 / m_rowCount);
+    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();
+        }
+    }
+
+    QVector<double> weights;
+    QList<CNodeData> indexList = m_mind->leaves();
+    for (int i = 0; i < indexList.size(); ++i) {
+        weights.append(weightData[indexList[i].name]);
+    }
 
     gc->evaluate(weights);
-    BestIndex index = gc->getBestIndex();
-    qDebug() << index.front_index << index.back_index;
+    gc->getBestIndex();
+
+    QVector<GCEmat> rangeWeights = gc->getRangeWeights();
+    QVector<GCEMat> rangeCvt     = gc->getRangeCVT();
+
+    QList<EffectResult> resultData;
+    QList<int> schemeIdList       = { -2, -1 };
+    QList<QString> schemeNameList = { "建设前", "建设后" };
+    for (int scheme = 0; scheme < 2; ++scheme) {
+        EffectResult overall;
+        overall.projectId  = m_mind->root().projectId;
+        overall.schemeId   = schemeIdList[scheme];
+        overall.schemeName = schemeNameList[scheme];
+        overall.algType    = 1;
+        overall.indexName  = "综合";
+        QStringList strList;
+        for (int v = 0; v < rangeWeights.size(); ++v) {
+            if (scheme == 0) {
+                strList.append(QString("%1").arg(rangeWeights[v].front_val));
+            } else {
+                strList.append(QString("%1").arg(rangeWeights[v].back_val));
+            }
+        }
+        overall.value = strList.join(",");
+        resultData.append(overall);
+        for (int index = 0; index < indexList.size(); ++index) {
+            EffectResult result;
+            result.projectId  = indexList[index].projectId;
+            result.schemeId   = schemeIdList[scheme];
+            result.schemeName = schemeNameList[scheme];
+            result.algType    = 1;
+            result.indexName  = indexList[index].name;
+
+            QStringList strList;
+            for (int v = 0; v < rangeWeights.size(); ++v) {
+                if (scheme == 0) {
+                    strList.append(QString("%1").arg(rangeCvt[index][v].front_val));
+                } else {
+                    strList.append(QString("%1").arg(rangeCvt[index][v].back_val));
+                }
+            }
+            result.value = strList.join(",");
+            resultData.append(result);
+        }
+    }
+    bool saveRet = EffectResultService().addDataList(resultData);
+    qDebug() << __FUNCTION__ << __LINE__ << saveRet << endl;
 }
 
 void GreyClusteringSampleTable::init()