|
@@ -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);
|
|
|
}
|