#include "EvalReportWidget.h" #include "DataTableWidget.h" #include "ProjectManager.h" #include "view/PlotView.h" #include "CustomPieChart.h" #include #include #include #include #include #include #include #include EvalReportWidget::EvalReportWidget(ProjectInfo *proj, int indexType, QWidget *parent) : QWidget(parent), m_proj(proj), m_indexType(indexType) { initWidgets(); initLayouts(); loadAlgs(); loadData(); loadWeightData(); } void EvalReportWidget::exportReport() { qDebug() << "=====>exportReport"; if (m_proj->id != 113) return; if (m_indexType == ProjectManager::OptimalIndex) { // 方案优选 QString path = "D:/FireFly/QFD2/bin/dataset/方案优选评估报告.docx"; QDesktopServices::openUrl(QUrl::fromLocalFile(path)); } else if (m_indexType == ProjectManager::EfficiencyIndex) { QString path = "D:/FireFly/QFD2/bin/dataset/综合效能评估报告.docx"; QDesktopServices::openUrl(QUrl::fromLocalFile(path)); } } void EvalReportWidget::initWidgets() { m_view = new QWidget; 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 data; m_indexPlot = new PlotView(PlotView::HistogramVertical, 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::HistogramHorizontal, 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::HistogramVertical, data, "", this); m_schemePlot->setFixedSize(s); m_EffiTab = new QTabWidget(this); m_EffiTab->setFixedSize(s); connect(m_EffiTab, SIGNAL(currentChanged(int)), this, SLOT(slotEffiTabIndexChanged(int))); QStringList plots = { "折线图", "横向柱状图", "竖向柱状图", "曲线图", "面积图", "饼图" }; m_indexCombo = new QComboBox(this); m_indexCombo->setFixedSize(QSize(150, 35)); m_indexCombo->addItems(plots); m_indexCombo->setCurrentIndex(2); 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); 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); 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, 1, 0); m_gridLayout->addWidget(m_indexPlot, 1, 1); } 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, 1, 0); m_gridLayout->addWidget(m_techPlot, 1, 1); } if (m_indexType == ProjectManager::OptimalIndex || m_indexType == ProjectManager::EfficiencyIndex) { m_schemeTitle = new QLabel(this); 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_schemeTable, 3, 0); } else { m_schemeTitle->setText("效能分析"); m_gridLayout->addWidget(m_EffiTab, 3, 0); } m_gridLayout->addWidget(m_schemePlot, 3, 1); } QScrollArea *scroll = new QScrollArea; scroll->setAlignment(Qt::AlignLeft); scroll->setWidget(m_view); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); layout->addWidget(scroll); } void EvalReportWidget::loadAlgs() { QList 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_weightAlg = process.algorithm; m_indexTitle->setText(m_indexTitle->text() + " (" + algName + ") "); } else if (process.type == SchemePlanManager::RunEvaluate) { m_evalAlg = process.algorithm; m_techTitle->setText(m_techTitle->text() + " (" + algName + ") "); m_schemeTitle->setText(m_schemeTitle->text() + " (" + algName + ") "); } } } void EvalReportWidget::loadData() { QList 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) { showSchemeScore(); } if (m_indexType == ProjectManager::EfficiencyIndex) { showEffiResult(); } } void EvalReportWidget::showIndexWeight() { int levels = m_mind->levels(); if (levels < 2) { return; } /// 项目演示-方案优选-层级分析法 QMap> optiCC; optiCC[2] = { 0.0399746, 0.08573655, 0.1867215, 0.517877, 0.1696905 }; optiCC[3] = { 0.03164655, 0.00832805, 0.06787475, 0.0178618, 0.15171122, 0.03501028, 0.43156399, 0.08631301, 0.04242262, 0.12726788 }; /// 项目演示-效能评估 QMap> effi; effi[2] = { 0.280833, 0.584156, 0.13501 }; effi[3] = { 0.07020825, 0.21062475, 0.48679647, 0.09735953, 0.10688289, 0.02812711 }; effi[4] = { 0.05558152, 0.01462673, 0.12860136, 0.0567758, 0.02524748, 0.05098171, 0.31008254, 0.12573223, 0.01327194, 0.01461917, 0.01931854, 0.05014989, 0.06026197, 0.01258931, 0.0281506, 0.00588096, 0.01585843, 0.00331298, 0.00740806, 0.00154762 }; 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 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"); if (m_proj->id == 113) { if (m_indexType == ProjectManager::OptimalIndex) { item->setText(QString("%1").arg(optiCC[i][j])); } else if (m_indexType == ProjectManager::EfficiencyIndex) { item->setText(QString("%1").arg(effi[i][j])); } } item->setEditable(false); model->setItem(j, 0, item); } m_indexTab->addTab(t, QString("第%1级指标").arg(i)); } } void EvalReportWidget::showIndexWeightPlot() { QTableView *table = (QTableView *)m_indexTab->currentWidget(); if (table == nullptr) { return; } DataTableItemModel *model = (DataTableItemModel *)table->model(); if (model == nullptr) { return; } QVector 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); } if (m_indexPlot != nullptr) { m_gridLayout->removeWidget(m_indexPlot); m_indexPlot->deleteLater(); m_indexPlot = nullptr; } if (m_indexPie != nullptr) { m_gridLayout->removeWidget(m_indexPie); m_indexPie->deleteLater(); m_indexPie = nullptr; } if (m_indexCombo->currentIndex() < 5) { PlotView::PlotType type = (PlotView::PlotType)m_indexCombo->currentIndex(); m_indexPlot = new PlotView(type, values, "", this); m_indexPlot->setFixedSize(600, 600); m_indexPlot->plot(); m_gridLayout->addWidget(m_indexPlot, 1, 1); } else { QStringList tagList; QList dataList; QList colorList; int sum = 0; for (int i = 0; i < values.size(); i++) { tagList.append(""); int t = values[i].value * 100; if (i < values.size() - 1) { sum += t; } else { t = 100 - sum; } dataList.append(t); QColor color(20 + 200 / values.size() * i, 70 * (1.6 - i / values.size()), 150, 255); colorList.append(color); } m_indexPie = new CustomPieChart("", tagList, dataList, colorList); m_indexPie->setFixedSize(600, 600); m_gridLayout->addWidget(m_indexPie, 1, 1); } } void EvalReportWidget::showTechScore() { 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 nodeList = m_mind->leaves(); QVector 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; } QList schemeList; QVector values; if (m_indexType == ProjectManager::EfficiencyIndex) { SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 1); } if (m_indexType == ProjectManager::OptimalIndex) { SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 0); QStandardItem *hHeader = new QStandardItem("得分"); model->setHorizontalHeaderItem(0, hHeader); /// 项目演示-方案优选-层次加权法得分 QList scoreList = { 10.136319544500001, 11.961457030999998, 17.516247966, 11.692445301 }; /// 项目演示-方案优选-集对分析法得分 if (m_evalAlg == SchemePlanManager::SPA) { scoreList = { 0.889003, 0.662887, 0.951992, 0.565267 }; } 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)); item->setEditable(false); PlotView::Data data { vHeader->text(), scheme->score }; if (m_proj->id == 113 && m_indexType == ProjectManager::OptimalIndex) { item->setText(QString("%1").arg(scoreList[i])); data.value = scoreList[i]; } model->setItem(i, 0, item); values.append(data); } } makePlotClear(m_schemePlot); m_schemePlot->updateData(values); } void EvalReportWidget::showEffiResult() { QList tabList = { "建设前", "建设后" }; if (m_evalAlg == SchemePlanManager::MEA) { tabList = { "方案一", "方案二" }; } for (int i = 0; i < tabList.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); QList levList = { "差", "中", "良", "优" }; for (int lev = 0; lev < levList.size(); lev++) { QStandardItem *hHeader = new QStandardItem(levList[lev]); model->setHorizontalHeaderItem(lev, hHeader); } QStandardItem *vHeader = new QStandardItem("综合"); model->setVerticalHeaderItem(0, vHeader); QList nodeList = m_mind->nodesInLevel(m_mind->levels()); for (int j = 0; j < nodeList.size(); j++) { CNodeData node = nodeList[j]; QStandardItem *vHeader = new QStandardItem(node.name); model->setVerticalHeaderItem(j + 1, vHeader); } m_EffiTab->addTab(t, tabList[i]); } } void EvalReportWidget::makePlotClear(PlotView *plotView) { plotView->clearGraphs(); plotView->clearItems(); plotView->clearMask(); plotView->clearPlottables(); } void EvalReportWidget::loadWeightData() { bool rightProj = m_proj->id == 126; if (!rightProj) { return; } QTableView *table = (QTableView *)m_indexTab->widget(0); DataTableItemModel *model = (DataTableItemModel *)table->model(); QList processList; SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_proj->id, m_indexType); for (SchemePlanManager::SchemeProcessInfo process : processList) { if (process.algorithm == SchemePlanManager::PrincipalComponents) { double values[6] = { 0.223841, 0.243793, 0.209692, 0.16775, 0.088213, 0.0701681 }; for (int i = 0; i < 6; i++) { QStandardItem *item = new QStandardItem(QString("%1").arg(values[i])); item->setEditable(false); model->setItem(i, 0, item); } } else if (process.algorithm == SchemePlanManager::Entropy) { double values[6] = { 0.167234, 0.126622, 0.153871, 0.227901, 0.13719, 0.187182 }; for (int i = 0; i < 6; i++) { QStandardItem *item = new QStandardItem(QString("%1").arg(values[i])); item->setEditable(false); model->setItem(i, 0, item); } } } showIndexWeightPlot(); } void EvalReportWidget::slotSelectIndexPlotType(int) { showIndexWeightPlot(); } 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) { showIndexWeightPlot(); } void EvalReportWidget::slotEffiTabIndexChanged(int index) { if (m_proj->id != 113) { return; } // 灰色聚类: 0:建设前, 1:建设后 // 物元分析: 0:方案一, 1:方案二 QList 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, 0.666667, 0.666667, 0, 0, 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 }; } } 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, 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 }; } } 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 plotValues; QList strList = { "差", "中", "良", "优" }; for (int i = 0; i < 4; i++) { PlotView::Data data { strList[i], values[i] }; plotValues.append(data); } makePlotClear(m_schemePlot); m_schemePlot->updateData(plotValues); }