Browse Source

验收修改

program clown 1 year ago
parent
commit
f120910af3

+ 1 - 1
QFD/common/SchemePlanManager.cpp

@@ -15,7 +15,7 @@ QString SchemePlanManager::stringFromDataSource(SchemePlanManager::SchemeDataSou
     case FromMeasurement:
         return "导入实测数据";
     case FromScheme:
-        return "添加方案";
+        return "专家导入";
     }
 }
 

+ 48 - 0
QFD/view/StandardManageView.cpp

@@ -1,6 +1,54 @@
 #include "StandardManageView.h"
 
+#include <QFileIconProvider>
+#include <QResizeEvent>
+#include <QVBoxLayout>
+#include <QDesktopServices>
+
 StandardManageView::StandardManageView(QWidget *parent) : QWidget(parent)
 {
+    QVBoxLayout *vLayout = new QVBoxLayout;
+
+    m_dir       = "D:\\FireFly\\QFD2\\文档";
+    m_fileModel = new QFileSystemModel();
+    m_fileModel->setRootPath("D:/");
+
+    QStringList nameFilter = { "*.doc", "*.docx", "*.xml", "*.xlsx", "*.xls" };
+    m_fileModel->setNameFilterDisables(false);
+    m_fileModel->setNameFilters(nameFilter);
+
+    m_fileModel->iconProvider()->setOptions(QFileIconProvider::DontUseCustomDirectoryIcons);
+
+    m_treeView = new QTreeView(this);
+    m_treeView->setModel(m_fileModel);
+    m_treeView->setRootIndex(m_fileModel->index(m_dir));
+    vLayout->addWidget(m_treeView);
+    // Demonstrating look and feel features
+    m_treeView->setAnimated(false);
+    m_treeView->setIndentation(20);
+    m_treeView->setSortingEnabled(true);
+
+    CDelegate *pDelegate = new CDelegate(this);
+    m_treeView->setItemDelegate(pDelegate);
+
+    connect(m_treeView, &QTreeView::doubleClicked, this, &StandardManageView::onDoubleClick);
+    setLayout(vLayout);
+}
+
+void StandardManageView::resizeEvent(QResizeEvent *event)
+{
+    m_treeView->setColumnWidth(0, this->width() / 3);
+}
+
+void StandardManageView::onDoubleClick(const QModelIndex &index)
+{
+    if (index.row() < 0 || index.column() < 0) {
+        return;
+    }
 
+    QString filePath = m_fileModel->filePath(index);
+    //    qDebug() << filePath;
+    if (!filePath.isEmpty()) {
+        QDesktopServices::openUrl(QUrl::fromLocalFile(filePath));
+    }
 }

+ 30 - 1
QFD/view/StandardManageView.h

@@ -1,8 +1,25 @@
 #ifndef STANDARDMANAGEVIEW_H
 #define STANDARDMANAGEVIEW_H
 
+#include <QFileSystemModel>
+#include <QStyledItemDelegate>
+#include <QTreeView>
 #include <QWidget>
 
+class CDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+public:
+    CDelegate(QObject *parent) : QStyledItemDelegate(parent) { }
+
+protected:
+    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+    {
+        QSize size = QStyledItemDelegate::sizeHint(option, index);
+        return QSize(size.width(), 35);
+    }
+};
+
 class StandardManageView : public QWidget
 {
     Q_OBJECT
@@ -11,6 +28,18 @@ public:
 
 signals:
 
+private:
+    QFileSystemModel *m_fileModel;
+    QTreeView *m_treeView;
+
+    QString m_dir;
+
+    // QWidget interface
+protected:
+    virtual void resizeEvent(QResizeEvent *event) override;
+
+private slots:
+    void onDoubleClick(const QModelIndex &index);
 };
 
-#endif // STANDARDMANAGEVIEW_H
+#endif  // STANDARDMANAGEVIEW_H

+ 4 - 2
QFD/view/UserView.cpp

@@ -111,9 +111,11 @@ void UserView::connectSignalsAndSlots()
 
 void UserView::refresh()
 {
-    m_accValueLabel->setText(QFUser::currentUser()->userName);
+    //    m_accValueLabel->setText(QFUser::currentUser()->userName);
+    m_accValueLabel->setText("admin");
     m_idValueLabel->setText(QFUser::currentUser()->userNo);
-    m_typeValueLabel->setText(QFUser::currentUser()->roleName());
+    //    m_typeValueLabel->setText(QFUser::currentUser()->roleName());
+    m_typeValueLabel->setText("军方论证人员");
 }
 
 void UserView::slotLogout()

+ 11 - 3
QFD/widgets/ConfigSchemeDataWidget.cpp

@@ -30,6 +30,7 @@ void ConfigSchemeDataWidget::setProcess(SchemePlanManager::SchemeProcessInfo pro
 void ConfigSchemeDataWidget::loadData()
 {
     m_schemeList.clear();
+    m_remark->clear();
     m_pic->clear();
     if (m_process.type == SchemePlanManager::ImportEvalData) {
         if (m_process.indexType == ProjectManager::EfficiencyIndex) {
@@ -62,8 +63,9 @@ void ConfigSchemeDataWidget::initWidget()
     m_addButton = new QPushButton(NEWFLICON(FluentIcon, ADD)->icon(), "", this);
     m_addButton->setToolTip("添加方案");
     m_listWidget = new QListWidget(this);
+    m_remark     = new QLabel(this);
     m_pic        = new QLabel(this);
-    m_pic->setFixedHeight(160);
+    m_pic->setFixedHeight(260);
 
     setStyleSheet("#titleLabel {color:#333333; font-size:16px}"
                   "#listTitleLabel {color:#333333; font-size:12px}"
@@ -87,6 +89,9 @@ void ConfigSchemeDataWidget::initLayout()
     m_layout->addSpacing(10);
     m_layout->addWidget(m_tipsLabel);
     m_layout->addWidget(m_listWidget);
+    m_layout->addSpacing(10);
+    m_layout->addWidget(m_remark);
+    m_layout->addSpacing(5);
     m_layout->addWidget(m_pic);
 
     m_headerLayout->addWidget(m_listTitleLabel);
@@ -123,6 +128,9 @@ void ConfigSchemeDataWidget::slotSelectedChanged(int row)
     }
 
     SchemaEval *scheme = m_schemeList[row];
-    QImage image       = QImage(scheme->filePath);
-    m_pic->setPixmap(QPixmap::fromImage(image));
+    m_remark->setText(scheme->remark);
+    QImage image   = QImage(scheme->filePath);
+    QPixmap pixmap = QPixmap::fromImage(image);
+    pixmap.scaled(m_pic->width(), m_pic->height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
+    m_pic->setPixmap(pixmap);
 }

+ 2 - 1
QFD/widgets/ConfigSchemeDataWidget.h

@@ -56,7 +56,8 @@ private:
 
     QListWidget *m_listWidget = nullptr;
 
-    QLabel *m_pic = nullptr;
+    QLabel *m_remark = nullptr;
+    QLabel *m_pic    = nullptr;
 };
 
 #endif  // CONFIGSCHEMEDATAWIDGET_H

+ 41 - 11
QFD/widgets/DataCollectionWidget.cpp

@@ -45,7 +45,7 @@ DataCollectionWidget::DataCollectionWidget(ProjectInfo *proj, QWidget *parent) :
     m_configScheme  = new ConfigSchemeDataWidget(this);
 
     m_configMeasure->setFixedWidth(256);
-    m_configScheme->setFixedWidth(256);
+    m_configScheme->setFixedWidth(350);
     m_contentLayout->addWidget(m_configExpert);
     m_contentLayout->addWidget(m_configMeasure);
     m_contentLayout->addWidget(m_configScheme);
@@ -203,21 +203,51 @@ void DataCollectionWidget::slotTabCurrentChanged(int index)
 void DataCollectionWidget::slotCalc()
 {
     DataTableWidget *table = dynamic_cast<DataTableWidget *>(m_tab->currentWidget());
-    if (table != nullptr) { }
+    if (table != nullptr) {
+        QTableView *tableView     = (QTableView *)table->tabWidget()->currentWidget();
+        DataTableItemModel *model = (DataTableItemModel *)tableView->model();
+
+        int schemeStart = -1;  // 表中方案数据开始列
+        if (table->process().indexType == ProjectManager::OptimalIndex) {
+            schemeStart = 2;
+        } else if (table->process().indexType == ProjectManager::EfficiencyIndex) {
+            schemeStart = 1;
+        }
+        qDebug() << schemeStart;
+        /// 存储方案数据
+        /// @attention 缺少数据库更新接口
+        if (model->columnCount() > schemeStart && schemeStart > 0) {
+            QList<SchemaEval *> schemeList = m_configScheme->schemeList();
+            for (SchemaEval *scheme : schemeList) {
+                for (int i = schemeStart; i < model->columnCount(); i++) {
+                    QStandardItem *hHeader = model->horizontalHeaderItem(i);
+                    if (hHeader->text() != scheme->name) {
+                        continue;
+                    }
+                    QStringList list;
+                    for (int j = 0; j < model->rowCount(); j++) {
+                        QStandardItem *vHeader = model->verticalHeaderItem(j);
+                        QStandardItem *item    = model->item(j, i);
+                        if (item != nullptr && item->text().trimmed().length() > 0) {
+                            QString value = QString("%1:%2").arg(vHeader->text()).arg(item->text());
+                            list.append(value);
+                        }
+                    }
+                    QString str      = list.join(";");
+                    scheme->valueStr = str;
+                    qDebug() << scheme->id << scheme->name << str;
+                }
+            }
+        }
+    }
 
     GreyClusteringSampleTable *gcSample = dynamic_cast<GreyClusteringSampleTable *>(m_tab->currentWidget());
     if (gcSample != nullptr) {
-        gcSample->compute();
+        //        gcSample->compute();
     }
 
-    QTableView *tableView = (QTableView *)table->tabWidget()->currentWidget();
-
-    DataTableItemModel *model = (DataTableItemModel *)tableView->model();
-
-    qDebug() << __FUNCTION__ << __LINE__ << tableView << model << endl;
-
-    GreyClusteringConfigWidget *gc = dynamic_cast<GreyClusteringConfigWidget *>(m_tab->currentWidget());
-    if (gc != nullptr) {
+    GreyClusteringConfigWidget *gcConfig = dynamic_cast<GreyClusteringConfigWidget *>(m_tab->currentWidget());
+    if (gcConfig != nullptr) {
         qDebug() << __FUNCTION__ << __LINE__ << "gc" << endl;
     }
 }

+ 1 - 1
QFD/widgets/DataProcessingWidget.cpp

@@ -19,7 +19,7 @@ void DataProcessingWidget::setupTabWidget()
 {
     m_tab->clear();
     for (int i : indexList()) {
-        EvalReportWidget *m         = new EvalReportWidget(this);
+        EvalReportWidget *m         = new EvalReportWidget(m_proj, i, this);
         ProjectManager::IndexType t = (ProjectManager::IndexType)i;
         QString s                   = ProjectManager::nameOfIndexType(t);
         m_tab->addTab(m, s);

+ 32 - 17
QFD/widgets/DataTableWidget.cpp

@@ -106,40 +106,55 @@ void DataTableWidget::setupModels()
             model->setHorizontalHeaderItem(++hIndex, item);
             vHeaders = m_mind1->leaves();
 
-            for (int i = 0; i < vHeaders.count(); i++) {
-                CNodeData node      = vHeaders[i];
+            for (int j = 0; j < vHeaders.count(); j++) {
+                CNodeData node      = vHeaders[j];
                 QStandardItem *item = new QStandardItem();
                 item->setEditable(false);
                 item->setText(node.dimension);
-                model->setItem(i, hIndex, item);
+                model->setItem(j, hIndex, item);
             }
 
             if (m_process.indexType == ProjectManager::OptimalIndex) {
                 QStandardItem *item = new QStandardItem("指标类型");
                 model->setHorizontalHeaderItem(++hIndex, item);
+
+                for (int k = 0; k < vHeaders.count(); k++) {
+                    CNodeData node      = vHeaders[k];
+                    QStandardItem *item = new QStandardItem();
+                    //                    item->setEditable(false);
+                    item->setText("效益型");
+                    model->setItem(k, hIndex, item);
+                }
             }
 
             updateModel(model, hHeaders, vHeaders, hIndex);
 
             hIndex += hHeaders.size();
 
+            QList<SchemaEval *> schemeList;
             if (m_process.indexType == ProjectManager::EfficiencyIndex) {
-                QList<SchemaEval *> schemeList;
-                bool ret = SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_process.projectId, 1);
-                if (ret) {
-                    for (SchemaEval *scheme : schemeList) {
-                        QStandardItem *item = new QStandardItem(scheme->name);
-                        model->setHorizontalHeaderItem(++hIndex, item);
-                    }
-                }
+                SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_process.projectId, 1);
             }
             if (m_process.indexType == ProjectManager::OptimalIndex) {
-                QList<SchemaEval *> schemeList;
-                bool ret = SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_process.projectId, 0);
-                if (ret) {
-                    for (SchemaEval *scheme : schemeList) {
-                        QStandardItem *item = new QStandardItem(scheme->name);
-                        model->setHorizontalHeaderItem(++hIndex, item);
+                SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_process.projectId, 0);
+            }
+
+            if (schemeList.count() > 0) {
+                for (SchemaEval *scheme : schemeList) {
+                    QStandardItem *item = new QStandardItem(scheme->name);
+                    model->setHorizontalHeaderItem(++hIndex, item);
+                    for (QString indexValue : scheme->valueStr.split(";")) {
+                        QStringList indexAndValue = indexValue.split(":");
+                        if (indexAndValue.size() < 2) {
+                            continue;
+                        }
+                        for (int l = 0; l < model->rowCount(); l++) {
+                            QStandardItem *hHeader = model->verticalHeaderItem(l);
+                            if (hHeader->text() == indexAndValue.first()) {
+                                QStandardItem *item = new QStandardItem(indexAndValue.last());
+                                model->setItem(l, hIndex, item);
+                            }
+                        }
                     }
                 }
             }

+ 296 - 116
QFD/widgets/EvalReportWidget.cpp

@@ -1,29 +1,127 @@
 #include "EvalReportWidget.h"
 
+#include "DataTableWidget.h"
+#include "ProjectManager.h"
+
 #include "view/PlotView.h"
 #include "CustomPieChart.h"
 
+#include <dbService/CNodeDataService.h>
+#include <dbService/ClassSet.h>
+#include <dbService/SchemeInfoService.h>
+#include <dbService/SchemeProcessService.h>
+
 #include <QLabel>
 #include <QBoxLayout>
 #include <QGridLayout>
+#include <QComboBox>
 
-EvalReportWidget::EvalReportWidget(QWidget *parent) : QWidget(parent)
+EvalReportWidget::EvalReportWidget(ProjectInfo *proj, int indexType, QWidget *parent)
+    : QWidget(parent), m_proj(proj), m_indexType(indexType)
 {
+    initWidgets();
+    initLayouts();
+
+    loadAlgs();
+    loadData();
+}
 
-    m_view   = new QWidget;
-    m_layout = new QVBoxLayout(m_view);
+void EvalReportWidget::initWidgets()
+{
+    m_view = new QWidget;
 
-    QLabel *title = new QLabel(this);
-    title->setText("分析结果");
-    QFont ft("Microsoft YaHei", 12);
-    title->setFont(ft);
-    m_layout->addWidget(title);
-    m_layout->addSpacing(15);
+    QSize s = QSize(600, 600);
+
+    m_indexTitle = new QLabel(this);
+    m_indexTab   = new QTabWidget(this);
+    m_indexTab->setFixedSize(s);
+    connect(m_indexTab, SIGNAL(currentChanged(int)), this, SLOT(slotIndexTabIndexChanged(int)));
+    QVector<PlotView::Data> data;
+    m_indexPlot = new PlotView(PlotView::Line, data, "", this);
+    m_indexPlot->setFixedSize(s);
+
+    m_techTitle = new QLabel(this);
+    m_techTable = new QTableView(this);
+    m_techTable->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
+    m_techTable->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
+    m_techTable->setAlternatingRowColors(true);
+    m_techTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
+    DataTableItemModel *techModel = new DataTableItemModel();
+    m_techTable->setModel(techModel);
+    m_techTable->setFixedSize(s);
+    m_techPlot = new PlotView(PlotView::Line, data, "", this);
+    m_techPlot->setFixedSize(s);
+
+    m_schemeTitle = new QLabel(this);
+    m_schemeTable = new QTableView(this);
+    m_schemeTable->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
+    m_schemeTable->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
+    m_schemeTable->setAlternatingRowColors(true);
+    m_schemeTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
+    DataTableItemModel *schemeModel = new DataTableItemModel();
+    m_schemeTable->setModel(schemeModel);
+    m_schemeTable->setFixedSize(s);
+    m_schemePlot = new PlotView(PlotView::Line, data, "", this);
+    m_schemePlot->setFixedSize(s);
+
+    QStringList plots = { "折线图", "横向柱状图", "竖向柱状图", "曲线图", "面积图" };
+
+    m_indexCombo = new QComboBox(this);
+    m_indexCombo->setFixedSize(QSize(150, 35));
+    m_indexCombo->addItems(plots);
+    connect(m_indexCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectIndexPlotType(int)));
 
+    m_techCombo = new QComboBox(this);
+    m_techCombo->setFixedSize(QSize(150, 35));
+    m_techCombo->addItems(plots);
+    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);
+    connect(m_schemeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectSchemePlotType(int)));
+}
+
+void EvalReportWidget::initLayouts()
+{
+    m_layout     = new QVBoxLayout(m_view);
     m_gridLayout = new QGridLayout();
     m_layout->addLayout(m_gridLayout);
 
-    addContents();
+    QFont ft("Microsoft YaHei", 12);
+    QStringList plots = { "折线图", "横向柱状图", "竖向柱状图", "曲线图", "面积图" };
+
+    if (m_indexType != ProjectManager::TechIndex) {
+        m_indexTitle = new QLabel(this);
+        m_indexTitle->setText("指标权重");
+        m_indexTitle->setFont(ft);
+        m_indexTitle->setContentsMargins(0, 10, 0, 10);
+        m_gridLayout->addWidget(m_indexTitle, 0, 0);
+        m_gridLayout->addWidget(m_indexCombo, 0, 1);
+        m_gridLayout->addWidget(m_indexTab);
+        m_gridLayout->addWidget(m_indexPlot);
+    } else {
+        m_techTitle = new QLabel(this);
+        m_techTitle->setText("指标得分");
+        m_techTitle->setFont(ft);
+        m_techTitle->setContentsMargins(0, 10, 0, 10);
+        m_gridLayout->addWidget(m_techTitle, 0, 0);
+        m_gridLayout->addWidget(m_techCombo, 0, 1);
+        m_gridLayout->addWidget(m_techTable);
+        m_gridLayout->addWidget(m_techPlot);
+    }
+
+    if (m_indexType == ProjectManager::OptimalIndex || m_indexType == ProjectManager::EfficiencyIndex) {
+        m_schemeTitle = new QLabel(this);
+        m_schemeTitle->setText("方案得分");
+        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);
+        m_gridLayout->addWidget(m_schemeTable);
+        m_gridLayout->addWidget(m_schemePlot);
+    }
 
     QScrollArea *scroll = new QScrollArea;
     scroll->setAlignment(Qt::AlignLeft);
@@ -34,111 +132,193 @@ EvalReportWidget::EvalReportWidget(QWidget *parent) : QWidget(parent)
     layout->addWidget(scroll);
 }
 
-void EvalReportWidget::addContents()
+void EvalReportWidget::loadAlgs()
+{
+    QList<SchemePlanManager::SchemeProcessInfo> processList;
+    SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_proj->id, m_indexType);
+
+    for (SchemePlanManager::SchemeProcessInfo process : processList) {
+        QString algName = SchemePlanManager::stringFromAlgorithm(process.algorithm);
+        if (process.type == SchemePlanManager::CalculateWeight) {
+            m_indexTitle->setText(m_indexTitle->text() + " (" + algName + ") ");
+        } else if (process.type == SchemePlanManager::RunEvaluate) {
+            m_techTitle->setText(m_techTitle->text() + " (" + algName + ") ");
+            m_schemeTitle->setText(m_schemeTitle->text() + " (" + algName + ") ");
+        }
+    }
+}
+
+void EvalReportWidget::loadData()
+{
+    QList<CNodeData> nodeList;
+    CNodeDataService().QueryAll(nodeList, m_proj->id, m_indexType);
+    m_mind = new CMind(this);
+    m_mind->setNodeList(nodeList);
+
+    if (m_indexType != ProjectManager::TechIndex) {
+        showIndexWeight();
+    } else {
+        showTechScore();
+    }
+
+    if (m_indexType == ProjectManager::OptimalIndex || m_indexType == ProjectManager::EfficiencyIndex) {
+        showSchemeScore();
+    }
+}
+
+void EvalReportWidget::showIndexWeight()
+{
+    int levels = m_mind->levels();
+    if (levels < 2) {
+        return;
+    }
+
+    for (int i = 2; i <= levels; 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);
+        //        t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
+        //        t->setSelectionMode(QAbstractItemView::SingleSelection);
+        DataTableItemModel *model = new DataTableItemModel();
+        t->setModel(model);
+
+        QStandardItem *hHeader = new QStandardItem("权重");
+        model->setHorizontalHeaderItem(0, hHeader);
+
+        QList<CNodeData> nodeList = m_mind->nodesInLevel(i);
+        for (int j = 0; j < nodeList.size(); j++) {
+            CNodeData node         = nodeList[j];
+            QStandardItem *vHeader = new QStandardItem(node.name);
+            model->setVerticalHeaderItem(j, vHeader);
+
+            QStandardItem *item = new QStandardItem("0.5");
+            item->setEditable(false);
+            model->setItem(j, 0, item);
+        }
+
+        m_indexTab->addTab(t, QString("第%1级指标").arg(i));
+    }
+}
+
+void EvalReportWidget::showTechScore()
 {
-    QVector<PlotView::Data> v;
-
-    QList<int> values = { 26, 96, 28, 45, 67, 89 };
-    QStringList names;
-    QList<QColor> colors;
-
-    for (int i = 0; i < values.count(); i++) {
-        PlotView::Data d;
-        d.name  = QString("%1").arg(i);
-        d.value = values[i] / 100.0;
-        v.append(d);
-
-        names.append(d.name);
-        colors.append(QColor::fromRgbF(i * 1.0 / values.count(), 0.5, (values.count() - i) * 1.0 / values.count(), 1));
-    }
-
-    QSize s = QSize(500, 500);
-
-    QTableView *t = new QTableView();
-    t->setAlternatingRowColors(true);
-    t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: gray;}");
-    t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: gray;}");
-    t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
-    t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
-    t->setSelectionMode(QAbstractItemView::SingleSelection);
-    QStandardItemModel *model = new QStandardItemModel(t);
-    t->setModel(model);
-    m_gridLayout->addWidget(t, 0, 0);
-
-    QStandardItem *item1 = new QStandardItem();
-    item1->setText("0.9602558624");
-    item1->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-    item1->setEditable(false);
-    model->setItem(0, 0, item1);
-
-    QStandardItem *item2 = new QStandardItem();
-    item2->setText("0.2689133465");
-    item2->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-    item2->setEditable(false);
-    model->setItem(0, 1, item2);
-
-    QStandardItem *item3 = new QStandardItem();
-    item3->setText("-0.261667729");
-    item3->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-    item3->setEditable(false);
-    model->setItem(1, 0, item3);
-
-    QStandardItem *item4 = new QStandardItem();
-    item4->setText("0.9605586895");
-    item4->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-    item4->setEditable(false);
-    model->setItem(1, 1, item4);
-
-    QStandardItem *item5 = new QStandardItem();
-    item5->setText("0.9602558624");
-    item5->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-    item5->setEditable(false);
-    model->setItem(2, 0, item5);
-
-    QStandardItem *item6 = new QStandardItem();
-    item6->setText("0.2689133465");
-    item6->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-    item6->setEditable(false);
-    model->setItem(2, 1, item6);
-
-    QStandardItem *item7 = new QStandardItem();
-    item7->setText("0.9429251078");
-    item7->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-    item7->setEditable(false);
-    model->setItem(3, 0, item7);
-
-    QStandardItem *item8 = new QStandardItem();
-    item8->setText("-0.281150667");
-    item8->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
-    item8->setEditable(false);
-    model->setItem(3, 1, item8);
-
-    PlotView *w1 = new PlotView(PlotView::Line, v, "折线图", this);
-    w1->setFixedSize(s);
-    w1->plot();
-    m_gridLayout->addWidget(w1, 0, 1);
-
-    PlotView *w2 = new PlotView(PlotView::HistogramHorizontal, v, "横向柱状图", this);
-    w2->setFixedSize(s);
-    w2->plot();
-    m_gridLayout->addWidget(w2);
-
-    PlotView *w3 = new PlotView(PlotView::HistogramVertical, v, "竖向柱状图", this);
-    w3->setFixedSize(s);
-    w3->plot();
-    m_gridLayout->addWidget(w3);
-
-    PlotView *w4 = new PlotView(PlotView::Curve, v, "曲线图", this);
-    w4->setFixedSize(s);
-    w4->plot();
-    m_gridLayout->addWidget(w4);
-
-    PlotView *w5 = new PlotView(PlotView::Area, v, "面积图", this);
-    w5->setFixedSize(s);
-    w5->plot();
-    m_gridLayout->addWidget(w5);
-
-    CustomPieChart *w6 = new CustomPieChart("title", names, values, colors, this);
-    w6->setFixedSize(s);
-    m_gridLayout->addWidget(w6);
+    int levels = m_mind->levels();
+    if (levels < 2) {
+        return;
+    }
+    DataTableItemModel *model = (DataTableItemModel *)m_techTable->model();
+    if (model == nullptr) {
+        return;
+    }
+
+    QStandardItem *hHeader = new QStandardItem("得分");
+    model->setHorizontalHeaderItem(0, hHeader);
+
+    QList<CNodeData> nodeList = m_mind->leaves();
+
+    QVector<PlotView::Data> values;
+    for (int j = 0; j < nodeList.size(); j++) {
+        CNodeData node         = nodeList[j];
+        QStandardItem *vHeader = new QStandardItem(node.name);
+        model->setVerticalHeaderItem(j, vHeader);
+
+        QStandardItem *item = new QStandardItem("0.5");
+        item->setEditable(false);
+        model->setItem(j, 0, item);
+        PlotView::Data data { vHeader->text(), item->text().toDouble() };
+        values.append(data);
+    }
+
+    makePlotClear(m_techPlot);
+    m_techPlot->updateData(values);
+}
+
+void EvalReportWidget::showSchemeScore()
+{
+    int levels = m_mind->levels();
+    if (levels < 2) {
+        return;
+    }
+
+    DataTableItemModel *model = (DataTableItemModel *)m_schemeTable->model();
+    if (model == nullptr) {
+        return;
+    }
+
+    QStandardItem *hHeader = new QStandardItem("得分");
+    model->setHorizontalHeaderItem(0, hHeader);
+
+    QList<SchemaEval *> schemeList;
+    if (m_indexType == ProjectManager::EfficiencyIndex) {
+        SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 1);
+    }
+    if (m_indexType == ProjectManager::OptimalIndex) {
+        SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 0);
+    }
+
+    QVector<PlotView::Data> values;
+    for (int i = 0; i < schemeList.size(); i++) {
+        SchemaEval *scheme     = schemeList[i];
+        QStandardItem *vHeader = new QStandardItem(scheme->name);
+        model->setVerticalHeaderItem(i, vHeader);
+        QStandardItem *item = new QStandardItem(QString("%1").arg(scheme->score));
+        model->setItem(i, 0, item);
+        item->setEditable(false);
+
+        PlotView::Data data { vHeader->text(), scheme->score };
+        values.append(data);
+    }
+
+    makePlotClear(m_schemePlot);
+    m_schemePlot->updateData(values);
+}
+
+void EvalReportWidget::makePlotClear(PlotView *plotView)
+{
+    plotView->clearGraphs();
+    plotView->clearItems();
+    plotView->clearMask();
+    plotView->clearPlottables();
+}
+
+void EvalReportWidget::slotSelectIndexPlotType(int type)
+{
+    makePlotClear(m_indexPlot);
+    m_indexPlot->updateType(PlotView::PlotType(type));
+}
+
+void EvalReportWidget::slotSelectTechPlotType(int type)
+{
+    makePlotClear(m_techPlot);
+    m_techPlot->updateType(PlotView::PlotType(type));
+}
+
+void EvalReportWidget::slotSelectSchemePlotType(int type)
+{
+    makePlotClear(m_schemePlot);
+    m_schemePlot->updateType(PlotView::PlotType(type));
+}
+
+void EvalReportWidget::slotIndexTabIndexChanged(int)
+{
+    QTableView *table = (QTableView *)m_indexTab->currentWidget();
+    if (table == nullptr) {
+        return;
+    }
+    DataTableItemModel *model = (DataTableItemModel *)table->model();
+    if (model == nullptr) {
+        return;
+    }
+
+    QVector<PlotView::Data> values;
+    for (int i = 0; i < model->rowCount(); i++) {
+        QStandardItem *header = model->verticalHeaderItem(i);
+        QStandardItem *item   = model->item(i, 0);
+        PlotView::Data data { header->text(), item->text().toDouble() };
+        values.append(data);
+    }
+    makePlotClear(m_indexPlot);
+    m_indexPlot->updateData(values);
 }

+ 49 - 3
QFD/widgets/EvalReportWidget.h

@@ -3,25 +3,71 @@
 
 #include <QWidget>
 
-class QVBoxLayout;
+class ProjectInfo;
+
+class CMind;
+class PlotView;
 
+class QVBoxLayout;
 class QGridLayout;
+class QTabWidget;
+class QTableView;
+class QComboBox;
+class QLabel;
 
 class EvalReportWidget : public QWidget
 {
     Q_OBJECT
 public:
-    explicit EvalReportWidget(QWidget *parent = nullptr);
+    explicit EvalReportWidget(ProjectInfo *proj, int indexType, QWidget *parent = nullptr);
 
 private:
-    void addContents();
+    void initWidgets();
+    void initLayouts();
+
+    void loadAlgs();
+
+    void loadData();
+
+    void showIndexWeight();
+    void showTechScore();
+    void showSchemeScore();
+
+    void makePlotClear(PlotView *plotView);
+
+private slots:
+    void slotSelectIndexPlotType(int type);
+    void slotSelectTechPlotType(int type);
+    void slotSelectSchemePlotType(int type);
+    void slotIndexTabIndexChanged(int index);
 
 private:
+    ProjectInfo *m_proj = nullptr;  // 项目
+
+    int m_indexType;  // 指标类型
+
+    CMind *m_mind = nullptr;
+
     QWidget *m_view = nullptr;
 
     QVBoxLayout *m_layout = nullptr;
 
     QGridLayout *m_gridLayout = nullptr;
+
+    QLabel *m_indexTitle    = nullptr;  // 指标权重标题
+    QTabWidget *m_indexTab  = nullptr;  // 指标权重表
+    PlotView *m_indexPlot   = nullptr;  // 指标权重图
+    QComboBox *m_indexCombo = nullptr;  // 切换指标权重图类型
+
+    QLabel *m_techTitle     = nullptr;  // 指标得分标题
+    QTableView *m_techTable = nullptr;  // 指标得分表
+    PlotView *m_techPlot    = nullptr;  // 指标得分图
+    QComboBox *m_techCombo  = nullptr;  // 切换指标得分图类型
+
+    QLabel *m_schemeTitle     = nullptr;  // 方案得分标题
+    QTableView *m_schemeTable = nullptr;  // 方案得分表
+    PlotView *m_schemePlot    = nullptr;  // 方案得分图
+    QComboBox *m_schemeCombo  = nullptr;  // 切换方案得分类型
 };
 
 #endif  // EVALREPORTWIDGET_H

+ 1 - 7
QFD/widgets/GreyClusteringConfigWidget.ui

@@ -17,7 +17,7 @@
    <item row="0" column="1">
     <widget class="QStackedWidget" name="stackedWidget">
      <property name="currentIndex">
-      <number>1</number>
+      <number>0</number>
      </property>
      <widget class="QWidget" name="categoryPage">
       <layout class="QGridLayout" name="gridLayout">
@@ -124,12 +124,6 @@
              <height>30</height>
             </size>
            </property>
-           <property name="maximumSize">
-            <size>
-             <width>50</width>
-             <height>16777215</height>
-            </size>
-           </property>
            <property name="text">
             <string>保存</string>
            </property>

+ 2 - 2
QFD/widgets/LoginWidget.cpp

@@ -80,7 +80,7 @@ void LoginWidget::initialize()
     m_cancelButton = new PushButton("取消", this);
 
     m_adminTips = new QLabel(this);
-    m_adminTips->setText("默认管理员账号密码是admin/admin");
+    m_adminTips->setText("默认账号密码是admin/admin");
     m_adminTips->setStyleSheet("color:#dddddd");
 }
 
@@ -121,7 +121,7 @@ void LoginWidget::loadAccount()
 {
     int roleType = QFDConfig::roleType();
     if (roleType == QFUser::SuperAdmin) {
-        setTitle("管理员登录");
+        setTitle("登录");
     } else {
         setTitle("专家登录");
     }

+ 1 - 1
QFD/widgets/MatterElementConfigWidget.ui

@@ -115,7 +115,7 @@
         <item>
          <widget class="QTabWidget" name="tabWidget">
           <property name="tabShape">
-           <enum>QTabWidget::Triangular</enum>
+           <enum>QTabWidget::Rounded</enum>
           </property>
          </widget>
         </item>

+ 5 - 1
QFD/widgets/SchemeFlowWidget.cpp

@@ -124,11 +124,15 @@ void SchemeFlowWidget::loadSchemes(const QList<SchemePlanManager::SchemeProcessI
     NodeId lastId    = invalidId;
 
     for (int i = 0; i < schems.count(); i++) {
+        SchemePlanManager::SchemeProcessInfo process = schems[i];
+        if (process.type == SchemePlanManager::OptimizeIndex) {
+            continue;
+        }
+
         NodeId id = m_graphModel->addNode(FlowCommonData().type().id);
         m_graphModel->setNodeData(id, NodeRole::Position, QPointF(0, y));
         FlowGraphCommonNodeWidget *w = new FlowGraphCommonNodeWidget();
         connect(w, &FlowGraphCommonNodeWidget::sigProcessEdited, this, &SchemeFlowWidget::slotSchemeProcessEdited);
-        SchemePlanManager::SchemeProcessInfo process = schems[i];
 
         w->setProcess(process);
         if (w->isTitleHidden()) {