EvalReportWidget.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914
  1. #include "EvalReportWidget.h"
  2. #include "DataTableWidget.h"
  3. #include "ProjectManager.h"
  4. #include "view/PlotView.h"
  5. #include "CustomPieChart.h"
  6. #include <dbService/CNodeDataService.h>
  7. #include <dbService/ClassSet.h>
  8. #include <dbService/SchemeInfoService.h>
  9. #include <dbService/SchemeProcessService.h>
  10. #include <dbService/MindWeightService.h>
  11. #include <dbService/MindScoreService.h>
  12. #include <dbService/EffectResultService.h>
  13. #include <dbService/GradeInfoService.h>
  14. #include <dbService/UserConfigService.h>
  15. #include <dbService/NodeMatrixService.h>
  16. #include <QLabel>
  17. #include <QBoxLayout>
  18. #include <QGridLayout>
  19. #include <QComboBox>
  20. #include <QPushButton>
  21. static QSize kFigureSize = QSize(600, 600);
  22. EvalReportWidget::EvalReportWidget(ProjectInfo *proj, int indexType, QWidget *parent)
  23. : QWidget(parent), m_proj(proj), m_indexType(indexType)
  24. {
  25. initWidgets();
  26. initLayouts();
  27. loadAlgs();
  28. loadData();
  29. }
  30. void EvalReportWidget::exportReport()
  31. {
  32. qDebug() << "=====>exportReport";
  33. if (m_proj->id != 113)
  34. return;
  35. return;
  36. if (m_indexType == ProjectManager::OptimalIndex) { // 方案优选
  37. QString path = "D:/FireFly/QFD2/bin/dataset/方案优选评估报告.docx";
  38. QDesktopServices::openUrl(QUrl::fromLocalFile(path));
  39. } else if (m_indexType == ProjectManager::EfficiencyIndex) {
  40. QString path = "D:/FireFly/QFD2/bin/dataset/综合效能评估报告.docx";
  41. QDesktopServices::openUrl(QUrl::fromLocalFile(path));
  42. }
  43. }
  44. void EvalReportWidget::initWidgets()
  45. {
  46. m_view = new QWidget;
  47. QSize s = kFigureSize;
  48. m_indexTitle = new QLabel(this);
  49. m_indexTab = new QTabWidget(this);
  50. m_indexTab->setFixedSize(s);
  51. connect(m_indexTab, SIGNAL(currentChanged(int)), this, SLOT(slotIndexTabIndexChanged(int)));
  52. QVector<PlotView::Data> data;
  53. m_indexPlot = new PlotView(PlotView::HistogramVertical, data, "", this);
  54. m_indexPlot->setFixedSize(s);
  55. m_techTitle = new QLabel(this);
  56. m_techTable = new QTableView(this);
  57. m_techTable->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  58. m_techTable->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  59. m_techTable->setAlternatingRowColors(true);
  60. m_techTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  61. DataTableItemModel *techModel = new DataTableItemModel();
  62. m_techTable->setModel(techModel);
  63. m_techTable->setFixedSize(s);
  64. m_techPlot = new PlotView(PlotView::HistogramHorizontal, data, "", this);
  65. m_techPlot->setFixedSize(s);
  66. m_schemeTitle = new QLabel(this);
  67. m_schemeTable = new QTableView(this);
  68. m_schemeTable->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  69. m_schemeTable->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  70. m_schemeTable->setAlternatingRowColors(true);
  71. m_schemeTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  72. DataTableItemModel *schemeModel = new DataTableItemModel();
  73. m_schemeTable->setModel(schemeModel);
  74. m_schemeTable->setFixedSize(s);
  75. m_schemePlot = new PlotView(PlotView::HistogramVertical, data, "", this);
  76. m_schemePlot->setFixedSize(s);
  77. m_EffiTab = new QTabWidget(this);
  78. m_EffiTab->setFixedSize(s);
  79. connect(m_EffiTab, SIGNAL(currentChanged(int)), this, SLOT(slotEffiTabIndexChanged(int)));
  80. QStringList plots = { "折线图", "横向柱状图", "竖向柱状图", "曲线图", "面积图", "饼图" };
  81. m_indexCombo = new QComboBox(this);
  82. m_indexCombo->setFixedSize(QSize(150, 35));
  83. m_indexCombo->addItems(plots);
  84. m_indexCombo->setCurrentIndex(1);
  85. connect(m_indexCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectIndexPlotType(int)));
  86. // plots = QStringList { "竖向柱状图" };
  87. m_techCombo = new QComboBox(this);
  88. m_techCombo->setFixedSize(QSize(150, 35));
  89. m_techCombo->addItems(plots);
  90. m_techCombo->setCurrentIndex(1);
  91. connect(m_techCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectTechPlotType(int)));
  92. m_schemeCombo = new QComboBox(this);
  93. m_schemeCombo->setFixedSize(QSize(150, 35));
  94. m_schemeCombo->addItems(plots);
  95. m_schemeCombo->setCurrentIndex(2);
  96. connect(m_schemeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectSchemePlotType(int)));
  97. m_lastSchemeLev = new QPushButton("上一级指标");
  98. m_nextSchemeLev = new QPushButton("下一级指标");
  99. connect(m_lastSchemeLev, &QPushButton::clicked, this, &EvalReportWidget::slotLastSchemeLev);
  100. connect(m_nextSchemeLev, &QPushButton::clicked, this, &EvalReportWidget::slotNextSchemeLev);
  101. }
  102. void EvalReportWidget::initLayouts()
  103. {
  104. m_layout = new QVBoxLayout(m_view);
  105. m_gridLayout = new QGridLayout();
  106. m_layout->addLayout(m_gridLayout);
  107. QFont ft("Microsoft YaHei", 12);
  108. QStringList plots = { "折线图", "横向柱状图", "竖向柱状图", "曲线图", "面积图" };
  109. if (m_indexType != ProjectManager::TechIndex) {
  110. m_indexTitle = new QLabel(this);
  111. m_indexTitle->setText("指标权重");
  112. m_indexTitle->setFont(ft);
  113. m_indexTitle->setContentsMargins(0, 10, 0, 10);
  114. m_gridLayout->addWidget(m_indexTitle, 0, 0);
  115. m_gridLayout->addWidget(m_indexCombo, 0, 1);
  116. m_gridLayout->addWidget(m_indexTab, 1, 0);
  117. m_gridLayout->addWidget(m_indexPlot, 1, 1);
  118. } else {
  119. m_techTitle = new QLabel(this);
  120. m_techTitle->setText("技术措施重要度");
  121. m_techTitle->setFont(ft);
  122. m_techTitle->setContentsMargins(0, 10, 0, 10);
  123. m_gridLayout->addWidget(m_techTitle, 0, 0);
  124. m_gridLayout->addWidget(m_techCombo, 0, 1);
  125. m_gridLayout->addWidget(m_techTable, 1, 0);
  126. m_gridLayout->addWidget(m_techPlot, 1, 1);
  127. }
  128. if (m_indexType == ProjectManager::OptimalIndex || m_indexType == ProjectManager::EfficiencyIndex) {
  129. m_schemeTitle = new QLabel(this);
  130. m_schemeTitle->setFont(ft);
  131. m_schemeTitle->setFixedHeight(100);
  132. m_schemeTitle->setContentsMargins(0, 50, 0, 10);
  133. if (m_indexType == ProjectManager::OptimalIndex) {
  134. m_schemeTitle->setText("方案得分");
  135. m_gridLayout->addWidget(m_schemeTitle, 2, 0);
  136. m_gridLayout->addWidget(m_schemeTable, 3, 0);
  137. } else {
  138. m_schemeTitle->setText("效能分析");
  139. m_gridLayout->addWidget(m_schemeTitle, 2, 0);
  140. m_gridLayout->addWidget(m_EffiTab, 3, 0);
  141. QHBoxLayout *lay = new QHBoxLayout();
  142. lay->addWidget(m_lastSchemeLev);
  143. lay->addSpacing(20);
  144. lay->addWidget(m_nextSchemeLev);
  145. m_gridLayout->addLayout(lay, 4, 0);
  146. }
  147. m_gridLayout->addWidget(m_schemeCombo, 2, 1, Qt::AlignBottom);
  148. m_gridLayout->addWidget(m_schemePlot, 3, 1);
  149. }
  150. QScrollArea *scroll = new QScrollArea;
  151. scroll->setAlignment(Qt::AlignLeft);
  152. scroll->setWidget(m_view);
  153. QVBoxLayout *layout = new QVBoxLayout(this);
  154. layout->setMargin(0);
  155. layout->addWidget(scroll);
  156. }
  157. void EvalReportWidget::loadAlgs()
  158. {
  159. QList<SchemePlanManager::SchemeProcessInfo> processList;
  160. SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_proj->id, m_indexType);
  161. for (SchemePlanManager::SchemeProcessInfo process : processList) {
  162. QString algName = SchemePlanManager::stringFromAlgorithm(process.algorithm);
  163. if (process.type == SchemePlanManager::CalculateWeight) {
  164. m_weightAlg = process.algorithm;
  165. m_indexTitle->setText(m_indexTitle->text() + " (" + algName + ") ");
  166. } else if (process.type == SchemePlanManager::RunEvaluate) {
  167. m_evalAlg = process.algorithm;
  168. // m_techTitle->setText(m_techTitle->text() + " (" + algName + ") ");
  169. m_schemeTitle->setText(m_schemeTitle->text() + " (" + algName + ") ");
  170. }
  171. }
  172. }
  173. void EvalReportWidget::loadData()
  174. {
  175. QList<CNodeData> nodeList;
  176. CNodeDataService().QueryAllValid(nodeList, m_proj->id, m_indexType);
  177. m_mind = new CMind(this);
  178. m_mind->setNodeList(nodeList);
  179. if (checkDataComplete() == false) {
  180. return;
  181. }
  182. if (m_indexType != ProjectManager::TechIndex) {
  183. showIndexWeight();
  184. } else {
  185. showTechScore();
  186. }
  187. if (m_indexType == ProjectManager::OptimalIndex) {
  188. showSchemeScore();
  189. }
  190. if (m_indexType == ProjectManager::EfficiencyIndex) {
  191. showEffiResult();
  192. }
  193. }
  194. bool EvalReportWidget::checkDataComplete()
  195. {
  196. QString indexName = ProjectManager::nameOfIndexType((ProjectManager::IndexType)m_indexType);
  197. bool ret = NodeMatrixService().hasMeasureData(m_proj->id, indexName);
  198. if (ret == true) {
  199. return true;
  200. }
  201. QList<UserConfig *> cfgList;
  202. ret = UserConfigService().QueryUserConfigListInfoByEngineerId(&cfgList, m_proj->id);
  203. if (ret == false || cfgList.size() <= 0) {
  204. return false;
  205. }
  206. bool expertDataComplete = true;
  207. for (UserConfig *cfg : cfgList) {
  208. ret = NodeMatrixService().hasExpertData(m_proj->id, indexName, cfg->userId);
  209. if (ret == false) {
  210. expertDataComplete = false;
  211. break;
  212. }
  213. }
  214. return expertDataComplete;
  215. }
  216. void EvalReportWidget::showIndexWeight()
  217. {
  218. int levels = m_mind->levels();
  219. if (levels < 2) {
  220. return;
  221. }
  222. MindWeightInfo info;
  223. int indexType = m_indexType;
  224. if (indexType == ProjectManager::TechIndex) {
  225. indexType = ProjectManager::AbilityIndex;
  226. }
  227. bool ret = MindWeightService().queryWeightData(&info, m_proj->id, indexType);
  228. if (ret == false) {
  229. return;
  230. }
  231. if (info.id < 0) {
  232. qDebug() << __FUNCTION__ << __LINE__ << "未找到指标权重数据" << endl;
  233. return;
  234. }
  235. QMap<QString, double> weightData;
  236. QStringList weightList = info.weight.split(";");
  237. for (QString keyValueStr : weightList) {
  238. QStringList keyValue = keyValueStr.split(":");
  239. if (keyValue.size() == 2) {
  240. weightData[keyValue.first()] = keyValue.last().toDouble();
  241. }
  242. }
  243. for (int i = 2; i <= levels; i++) {
  244. QTableView *t = new QTableView();
  245. t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  246. t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  247. t->setAlternatingRowColors(true);
  248. t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  249. // t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  250. // t->setSelectionMode(QAbstractItemView::SingleSelection);
  251. DataTableItemModel *model = new DataTableItemModel();
  252. t->setModel(model);
  253. QStandardItem *hHeader = new QStandardItem("权重");
  254. model->setHorizontalHeaderItem(0, hHeader);
  255. QList<CNodeData> nodeList = m_mind->nodesInLevel(i);
  256. for (int j = 0; j < nodeList.size(); j++) {
  257. CNodeData node = nodeList[j];
  258. QStandardItem *vHeader = new QStandardItem(node.name);
  259. model->setVerticalHeaderItem(j, vHeader);
  260. QStandardItem *item = new QStandardItem();
  261. item->setText(QString("%1").arg(weightData[node.name]));
  262. item->setEditable(false);
  263. model->setItem(j, 0, item);
  264. }
  265. m_indexTab->addTab(t, QString("第%1级指标").arg(i));
  266. }
  267. }
  268. void EvalReportWidget::showIndexWeightPlot()
  269. {
  270. QTableView *table = (QTableView *)m_indexTab->currentWidget();
  271. if (table == nullptr) {
  272. return;
  273. }
  274. DataTableItemModel *model = (DataTableItemModel *)table->model();
  275. if (model == nullptr) {
  276. return;
  277. }
  278. QVector<PlotView::Data> values;
  279. for (int i = 0; i < model->rowCount(); i++) {
  280. QStandardItem *header = model->verticalHeaderItem(i);
  281. QStandardItem *item = model->item(i, 0);
  282. PlotView::Data data { header->text(), item->text().toDouble() };
  283. values.append(data);
  284. }
  285. if (m_indexPlot != nullptr) {
  286. m_gridLayout->removeWidget(m_indexPlot);
  287. m_indexPlot->deleteLater();
  288. m_indexPlot = nullptr;
  289. }
  290. if (m_indexPie != nullptr) {
  291. m_gridLayout->removeWidget(m_indexPie);
  292. m_indexPie->deleteLater();
  293. m_indexPie = nullptr;
  294. }
  295. if (m_indexCombo->currentIndex() < 5) {
  296. PlotView::PlotType type = (PlotView::PlotType)m_indexCombo->currentIndex();
  297. m_indexPlot = new PlotView(type, values, "", this);
  298. m_indexPlot->setFixedSize(kFigureSize);
  299. m_indexPlot->plot();
  300. m_gridLayout->addWidget(m_indexPlot, 1, 1);
  301. } else {
  302. QStringList tagList;
  303. QList<double> dataList;
  304. QList<QColor> colorList;
  305. for (int i = 0; i < values.size(); i++) {
  306. tagList.append("");
  307. double t = values[i].value;
  308. dataList.append(t);
  309. QColor color(20 + 200 / values.size() * i, 70 * (1.6 - i / values.size()), 150, 255);
  310. colorList.append(color);
  311. }
  312. m_indexPie = new CustomPieChart("", tagList, dataList, colorList);
  313. m_indexPie->setFixedSize(kFigureSize);
  314. m_gridLayout->addWidget(m_indexPie, 1, 1);
  315. }
  316. }
  317. void EvalReportWidget::showTechScore()
  318. {
  319. int levels = m_mind->levels();
  320. if (levels < 2) {
  321. return;
  322. }
  323. DataTableItemModel *model = (DataTableItemModel *)m_techTable->model();
  324. if (model == nullptr) {
  325. return;
  326. }
  327. MindScoreInfo info;
  328. bool ret = MindScoreService().queryScoreData(&info, m_proj->id);
  329. if (ret == false || info.id < 0) {
  330. return;
  331. }
  332. QMap<QString, QString> scoreData;
  333. QStringList keyValueStringList = info.score.split(";");
  334. for (QString keyValueString : keyValueStringList) {
  335. QStringList keyValue = keyValueString.split(":");
  336. if (keyValue.size() == 2) {
  337. scoreData[keyValue.first()] = keyValue.last();
  338. }
  339. }
  340. QStandardItem *hHeader = new QStandardItem("重要度");
  341. model->setHorizontalHeaderItem(0, hHeader);
  342. QList<CNodeData> nodeList = m_mind->leaves();
  343. QVector<PlotView::Data> values;
  344. for (int j = 0; j < nodeList.size(); j++) {
  345. CNodeData node = nodeList[j];
  346. QStandardItem *vHeader = new QStandardItem(node.name);
  347. model->setVerticalHeaderItem(j, vHeader);
  348. QStandardItem *item = new QStandardItem();
  349. item->setText(scoreData[node.name]);
  350. item->setEditable(false);
  351. model->setItem(j, 0, item);
  352. PlotView::Data data { vHeader->text(), item->text().toDouble() };
  353. values.append(data);
  354. }
  355. makePlotClear(m_techPlot);
  356. m_techPlot->updateData(values);
  357. }
  358. void EvalReportWidget::showTechScorePlot()
  359. {
  360. DataTableItemModel *model = (DataTableItemModel *)m_techTable->model();
  361. if (model == nullptr) {
  362. return;
  363. }
  364. QVector<PlotView::Data> values;
  365. for (int i = 0; i < model->rowCount(); i++) {
  366. QStandardItem *header = model->verticalHeaderItem(i);
  367. QStandardItem *item = model->item(i, 0);
  368. PlotView::Data data { header->text(), item->text().toDouble() };
  369. values.append(data);
  370. }
  371. if (m_techPlot != nullptr) {
  372. m_gridLayout->removeWidget(m_techPlot);
  373. m_techPlot->deleteLater();
  374. m_techPlot = nullptr;
  375. }
  376. if (m_techPie != nullptr) {
  377. m_gridLayout->removeWidget(m_techPie);
  378. m_techPie->deleteLater();
  379. m_techPie = nullptr;
  380. }
  381. if (m_techCombo->currentIndex() < 5) {
  382. PlotView::PlotType type = (PlotView::PlotType)m_techCombo->currentIndex();
  383. m_techPlot = new PlotView(type, values, "", this);
  384. m_techPlot->setFixedSize(kFigureSize);
  385. m_techPlot->plot();
  386. m_gridLayout->addWidget(m_techPlot, 1, 1);
  387. } else {
  388. QStringList tagList;
  389. QList<double> dataList;
  390. QList<QColor> colorList;
  391. for (int i = 0; i < values.size(); i++) {
  392. tagList.append("");
  393. double t = values[i].value;
  394. dataList.append(t);
  395. QColor color(20 + 200 / values.size() * i, 70 * (1.6 - i / values.size()), 150, 255);
  396. colorList.append(color);
  397. }
  398. m_techPie = new CustomPieChart("", tagList, dataList, colorList);
  399. m_techPie->setFixedSize(kFigureSize);
  400. m_gridLayout->addWidget(m_techPie, 1, 1);
  401. }
  402. }
  403. void EvalReportWidget::showSchemeScore()
  404. {
  405. int levels = m_mind->levels();
  406. if (levels < 2) {
  407. return;
  408. }
  409. DataTableItemModel *model = (DataTableItemModel *)m_schemeTable->model();
  410. if (model == nullptr) {
  411. return;
  412. }
  413. QList<SchemaEval *> schemeList;
  414. QVector<PlotView::Data> values;
  415. if (m_indexType == ProjectManager::EfficiencyIndex) {
  416. SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 1);
  417. }
  418. if (m_indexType == ProjectManager::OptimalIndex) {
  419. SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 0);
  420. QStandardItem *hHeader = new QStandardItem("得分");
  421. model->setHorizontalHeaderItem(0, hHeader);
  422. for (int i = 0; i < schemeList.size(); i++) {
  423. SchemaEval *scheme = schemeList[i];
  424. QStandardItem *vHeader = new QStandardItem(scheme->name);
  425. model->setVerticalHeaderItem(i, vHeader);
  426. QStandardItem *item = new QStandardItem(QString::number(scheme->score, 'f', 2));
  427. item->setEditable(false);
  428. PlotView::Data data { vHeader->text(), scheme->score };
  429. model->setItem(i, 0, item);
  430. values.append(data);
  431. }
  432. }
  433. makePlotClear(m_schemePlot);
  434. m_schemePlot->updateData(values);
  435. }
  436. void EvalReportWidget::showSchemeScorePlot()
  437. {
  438. DataTableItemModel *model = (DataTableItemModel *)m_schemeTable->model();
  439. if (model == nullptr) {
  440. return;
  441. }
  442. QVector<PlotView::Data> values;
  443. for (int i = 0; i < model->rowCount(); i++) {
  444. QStandardItem *header = model->verticalHeaderItem(i);
  445. QStandardItem *item = model->item(i, 0);
  446. PlotView::Data data { header->text(), item->text().toDouble() };
  447. values.append(data);
  448. }
  449. if (m_schemePlot != nullptr) {
  450. m_gridLayout->removeWidget(m_schemePlot);
  451. m_schemePlot->deleteLater();
  452. m_schemePlot = nullptr;
  453. }
  454. if (m_schemePie != nullptr) {
  455. m_gridLayout->removeWidget(m_schemePie);
  456. m_schemePie->deleteLater();
  457. m_schemePie = nullptr;
  458. }
  459. if (m_schemeCombo->currentIndex() < 5) {
  460. PlotView::PlotType type = (PlotView::PlotType)m_schemeCombo->currentIndex();
  461. m_schemePlot = new PlotView(type, values, "", this);
  462. m_schemePlot->setFixedSize(kFigureSize);
  463. m_schemePlot->plot();
  464. m_gridLayout->addWidget(m_schemePlot, 3, 1);
  465. } else {
  466. QStringList tagList;
  467. QList<double> dataList;
  468. QList<QColor> colorList;
  469. for (int i = 0; i < values.size(); i++) {
  470. tagList.append("");
  471. double t = values[i].value;
  472. dataList.append(t);
  473. QColor color(20 + 200 / values.size() * i, 70 * (1.6 - i / values.size()), 150, 255);
  474. colorList.append(color);
  475. }
  476. m_schemePie = new CustomPieChart("", tagList, dataList, colorList);
  477. m_schemePie->setFixedSize(kFigureSize);
  478. m_gridLayout->addWidget(m_schemePie, 3, 1);
  479. }
  480. }
  481. void EvalReportWidget::showEffiResult()
  482. {
  483. showEffiResultLev();
  484. return;
  485. m_EffiTab->clear();
  486. QList<GradeInfo *> gradeInfoList;
  487. int type = m_evalAlg == SchemePlanManager::MEA ? 0 : 1;
  488. bool gradeRet = GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, m_proj->id, type);
  489. if (gradeRet == false) {
  490. return;
  491. }
  492. QStringList gradeNames;
  493. for (int i = 0; i < gradeInfoList.size(); ++i) {
  494. gradeNames.append(gradeInfoList[i]->gradeValue);
  495. }
  496. QList<EffectResult> effList;
  497. bool effRet = EffectResultService().queryDataList(effList, m_proj->id);
  498. if (effRet == false) {
  499. return;
  500. }
  501. QMap<int, QMap<QString, QList<double>>> effData;
  502. QMap<int, QString> schemeNames;
  503. int levels = 0;
  504. for (EffectResult effect : effList) {
  505. if (effData.keys().contains(effect.schemeId) == false) {
  506. effData[effect.schemeId] = QMap<QString, QList<double>>();
  507. schemeNames[effect.schemeId] = effect.schemeName;
  508. }
  509. QStringList values = effect.value.split(",");
  510. levels = values.size();
  511. QList<double> valueList;
  512. for (int v = 0; v < values.size(); ++v) {
  513. valueList.append(values[v].toDouble());
  514. }
  515. effData[effect.schemeId][effect.indexName] = valueList;
  516. }
  517. for (int i = 0; i < effData.keys().size(); i++) {
  518. QTableView *t = new QTableView();
  519. t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  520. t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  521. t->setAlternatingRowColors(true);
  522. t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  523. DataTableItemModel *model = new DataTableItemModel();
  524. t->setModel(model);
  525. for (int lev = 0; lev < levels; lev++) {
  526. QStandardItem *hHeader = new QStandardItem(gradeNames[lev]);
  527. model->setHorizontalHeaderItem(lev, hHeader);
  528. }
  529. QStandardItem *vHeader = new QStandardItem("综合");
  530. model->setVerticalHeaderItem(0, vHeader);
  531. QList<CNodeData> nodeList = m_mind->nodesInLevel(m_mind->levels());
  532. for (int j = 0; j < nodeList.size(); j++) {
  533. CNodeData node = nodeList[j];
  534. QStandardItem *vHeader = new QStandardItem(node.name);
  535. model->setVerticalHeaderItem(j + 1, vHeader);
  536. }
  537. for (int r = 0; r < model->rowCount(); ++r) {
  538. QStandardItem *vHeader = model->verticalHeaderItem(r);
  539. QList<double> rowValues = effData[effData.keys()[i]][vHeader->text()];
  540. for (int c = 0; c < model->columnCount(); ++c) {
  541. QStandardItem *item = new QStandardItem();
  542. if (effData.keys().size() > i && rowValues.size() > c) {
  543. QString text = QString("%1").arg(rowValues[c]);
  544. if (std::isnan(rowValues[c])) {
  545. text = "0";
  546. }
  547. item->setText(text);
  548. }
  549. item->setEditable(false);
  550. model->setItem(r, c, item);
  551. }
  552. }
  553. m_EffiTab->addTab(t, schemeNames[effData.keys()[i]]);
  554. }
  555. }
  556. void EvalReportWidget::makePlotClear(PlotView *plotView)
  557. {
  558. plotView->clearGraphs();
  559. plotView->clearItems();
  560. plotView->clearMask();
  561. plotView->clearPlottables();
  562. }
  563. void EvalReportWidget::showEffiResultLev()
  564. {
  565. if (m_mind->levels() < 2) {
  566. return;
  567. }
  568. // 获取指标权重
  569. MindWeightInfo info;
  570. int indexType = m_indexType;
  571. if (indexType == ProjectManager::TechIndex) {
  572. indexType = ProjectManager::AbilityIndex;
  573. }
  574. bool ret = MindWeightService().queryWeightData(&info, m_proj->id, indexType);
  575. if (ret == false) {
  576. return;
  577. }
  578. if (info.id < 0) {
  579. qDebug() << __FUNCTION__ << __LINE__ << "未找到指标权重数据" << endl;
  580. return;
  581. }
  582. QMap<QString, double> weightData;
  583. QStringList weightList = info.weight.split(";");
  584. for (QString keyValueStr : weightList) {
  585. QStringList keyValue = keyValueStr.split(":");
  586. if (keyValue.size() == 2) {
  587. weightData[keyValue.first()] = keyValue.last().toDouble();
  588. }
  589. }
  590. int curTabIndex = m_EffiTab->currentIndex();
  591. m_EffiTab->clear();
  592. QList<GradeInfo *> gradeInfoList;
  593. int type = m_evalAlg == SchemePlanManager::MEA ? 0 : 1;
  594. bool gradeRet = GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, m_proj->id, type);
  595. if (gradeRet == false) {
  596. return;
  597. }
  598. QStringList gradeNames;
  599. for (int i = 0; i < gradeInfoList.size(); ++i) {
  600. gradeNames.append(gradeInfoList[i]->gradeValue);
  601. }
  602. QList<EffectResult> effList;
  603. bool effRet = EffectResultService().queryDataList(effList, m_proj->id);
  604. if (effRet == false) {
  605. return;
  606. }
  607. QMap<int, QMap<QString, QList<double>>> effData;
  608. QMap<int, QString> schemeNames;
  609. int levels = 0; // 效能分级
  610. for (EffectResult effect : effList) {
  611. if (effData.keys().contains(effect.schemeId) == false) {
  612. effData[effect.schemeId] = QMap<QString, QList<double>>();
  613. schemeNames[effect.schemeId] = effect.schemeName;
  614. }
  615. QStringList values = effect.value.split(",");
  616. levels = values.size();
  617. QList<double> valueList;
  618. for (int v = 0; v < values.size(); ++v) {
  619. valueList.append(values[v].toDouble());
  620. }
  621. effData[effect.schemeId][effect.indexName] = valueList;
  622. }
  623. for (int i = 0; i < effData.keys().size(); i++) {
  624. QTableView *t = new QTableView();
  625. t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  626. t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  627. t->setAlternatingRowColors(true);
  628. t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  629. DataTableItemModel *model = new DataTableItemModel();
  630. t->setModel(model);
  631. for (int lev = 0; lev < levels; lev++) {
  632. QStandardItem *hHeader = new QStandardItem(gradeNames[lev]);
  633. model->setHorizontalHeaderItem(lev, hHeader);
  634. }
  635. QStandardItem *vHeader = new QStandardItem("综合");
  636. model->setVerticalHeaderItem(0, vHeader);
  637. QList<CNodeData> nodeList = m_mind->nodesInLevel(m_curSchemeLev);
  638. for (int j = 0; j < nodeList.size(); j++) {
  639. CNodeData node = nodeList[j];
  640. QStandardItem *vHeader = new QStandardItem(node.name);
  641. model->setVerticalHeaderItem(j + 1, vHeader);
  642. }
  643. qDebug() << __FUNCTION__ << __LINE__ << model->rowCount() << endl;
  644. for (int r = 0; r < model->rowCount(); ++r) {
  645. QStandardItem *vHeader = model->verticalHeaderItem(r);
  646. qDebug() << __FUNCTION__ << __LINE__ << vHeader->text() << endl;
  647. QList<double> rowValues;
  648. if (m_curSchemeLev == m_mind->levels() || r == 0) {
  649. rowValues = effData[effData.keys()[i]][vHeader->text()];
  650. } else {
  651. QList<CNodeData> subNodes = m_mind->leavesOfNode(nodeList[r - 1]);
  652. qDebug() << __FUNCTION__ << __LINE__ << vHeader->text() << endl;
  653. for (int l = 0; l < levels; l++) {
  654. double sumValue = 0;
  655. double sumWeight = 0;
  656. for (int n = 0; n < subNodes.count(); n++) {
  657. QList<double> subNodeValues = effData[effData.keys()[i]][subNodes[n].name];
  658. double weight = weightData[subNodes[n].name];
  659. sumValue += subNodeValues[l] * weight;
  660. sumWeight += weight;
  661. }
  662. double finalValue = 0;
  663. if (sumWeight > 0) {
  664. finalValue = sumValue / sumWeight;
  665. }
  666. rowValues.append(finalValue);
  667. }
  668. }
  669. for (int c = 0; c < model->columnCount(); ++c) {
  670. QStandardItem *item = new QStandardItem();
  671. if (effData.keys().size() > i && rowValues.size() > c) {
  672. QString text = QString("%1").arg(rowValues[c]);
  673. if (std::isnan(rowValues[c])) {
  674. text = "0";
  675. }
  676. item->setText(text);
  677. }
  678. item->setEditable(false);
  679. model->setItem(r, c, item);
  680. }
  681. }
  682. m_EffiTab->addTab(t, schemeNames[effData.keys()[i]]);
  683. }
  684. if (curTabIndex >= 0) {
  685. m_EffiTab->setCurrentIndex(curTabIndex);
  686. }
  687. }
  688. void EvalReportWidget::slotSelectIndexPlotType(int)
  689. {
  690. showIndexWeightPlot();
  691. }
  692. void EvalReportWidget::slotSelectTechPlotType(int)
  693. {
  694. showTechScorePlot();
  695. }
  696. void EvalReportWidget::slotSelectSchemePlotType(int)
  697. {
  698. if (m_indexType == ProjectManager::OptimalIndex) {
  699. showSchemeScorePlot();
  700. }
  701. if (m_indexType == ProjectManager::EfficiencyIndex) {
  702. slotEffiTabIndexChanged(m_EffiTab->currentIndex());
  703. }
  704. }
  705. void EvalReportWidget::slotIndexTabIndexChanged(int)
  706. {
  707. showIndexWeightPlot();
  708. }
  709. void EvalReportWidget::slotEffiTabIndexChanged(int index)
  710. {
  711. qDebug() << __FUNCTION__ << __LINE__ << endl;
  712. QTableView *table = (QTableView *)m_EffiTab->currentWidget();
  713. if (table == nullptr) {
  714. return;
  715. }
  716. qDebug() << __FUNCTION__ << __LINE__ << endl;
  717. DataTableItemModel *model = (DataTableItemModel *)table->model();
  718. if (model == nullptr) {
  719. return;
  720. }
  721. qDebug() << __FUNCTION__ << __LINE__ << endl;
  722. QVector<PlotView::Data> values;
  723. for (int i = 0; i < model->columnCount(); i++) {
  724. QStandardItem *header = model->horizontalHeaderItem(i);
  725. QStandardItem *item = model->item(0, i);
  726. if (item != nullptr) {
  727. PlotView::Data data { header->text(), item->text().toDouble() };
  728. values.append(data);
  729. }
  730. }
  731. qDebug() << __FUNCTION__ << __LINE__ << endl;
  732. if (m_schemePlot != nullptr) {
  733. m_gridLayout->removeWidget(m_schemePlot);
  734. m_schemePlot->deleteLater();
  735. m_schemePlot = nullptr;
  736. }
  737. if (m_schemePie != nullptr) {
  738. m_gridLayout->removeWidget(m_schemePie);
  739. m_schemePie->deleteLater();
  740. m_schemePie = nullptr;
  741. }
  742. if (m_schemeCombo->currentIndex() < 5) {
  743. PlotView::PlotType type = (PlotView::PlotType)m_schemeCombo->currentIndex();
  744. m_schemePlot = new PlotView(type, values, "", this);
  745. m_schemePlot->setFixedSize(kFigureSize);
  746. m_schemePlot->plot();
  747. m_gridLayout->addWidget(m_schemePlot, 3, 1);
  748. } else {
  749. QStringList tagList;
  750. QList<double> dataList;
  751. QList<QColor> colorList;
  752. for (int i = 0; i < values.size(); i++) {
  753. tagList.append("");
  754. double t = values[i].value;
  755. dataList.append(t);
  756. QColor color(20 + 200 / values.size() * i, 70 * (1.6 - i / values.size()), 150, 255);
  757. colorList.append(color);
  758. }
  759. m_schemePie = new CustomPieChart("", tagList, dataList, colorList);
  760. m_schemePie->setFixedSize(kFigureSize);
  761. m_gridLayout->addWidget(m_schemePie, 3, 1);
  762. }
  763. }
  764. void EvalReportWidget::slotLastSchemeLev()
  765. {
  766. if (m_curSchemeLev > 2) {
  767. m_curSchemeLev--;
  768. }
  769. showEffiResultLev();
  770. }
  771. void EvalReportWidget::slotNextSchemeLev()
  772. {
  773. if (m_curSchemeLev < m_mind->levels()) {
  774. m_curSchemeLev++;
  775. }
  776. showEffiResultLev();
  777. }