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