AnalysisPanelWidget.cpp 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. #include "AnalysisPanelWidget.h"
  2. #include "AnalysisTableWidget.h"
  3. #include "dbService/DBServiceSet.h"
  4. #include "dbService/NodeMatrixService.h"
  5. #include "dbService/DemandWeightService.h"
  6. #include "ui_AnalysisPanelWidget.h"
  7. #include <QHeaderView>
  8. AnalysisPanelWidget::AnalysisPanelWidget(QWidget *parent) : QWidget(parent), ui(new Ui::AnalysisPanelWidget)
  9. {
  10. ui->setupUi(this);
  11. firstLayout = new QGridLayout;
  12. firstPlainWidget = nullptr;
  13. ui->stackedWidget->widget(0)->setLayout(firstLayout);
  14. secondLayout = new QGridLayout;
  15. secondPlainWidget = nullptr;
  16. ui->stackedWidget->widget(1)->setLayout(secondLayout);
  17. ui->stackedWidget->setCurrentIndex(0);
  18. }
  19. AnalysisPanelWidget::~AnalysisPanelWidget()
  20. {
  21. if (currentMindNodes) {
  22. delete currentMindNodes;
  23. }
  24. if (classifiedNodes) {
  25. delete classifiedNodes;
  26. }
  27. if (indexsRefClassifiedNodes) {
  28. delete indexsRefClassifiedNodes;
  29. }
  30. delete ui;
  31. }
  32. void AnalysisPanelWidget::init(const QStringList indexsRef, const QStringList indexs, int engineerId, int expertId)
  33. {
  34. // qDebug() << "AnalysisPanelWidget::init" << indexsRef << indexs <<
  35. // engineerId << expertId;
  36. indexsRefClassifiedNodes = nullptr;
  37. if (!indexsRef.isEmpty()) {
  38. MindNodeManager *indexsRefNodes = new MindNodeManager(); //是否参考指标体系
  39. getMindNodes(indexsRefNodes, indexsRef);
  40. indexsRefClassifiedNodes = new QList<QList<MindNodeManager::NodeMessage>>;
  41. sortMindNodes(*indexsRefNodes, indexsRefClassifiedNodes);
  42. delete indexsRefNodes;
  43. } else {
  44. indexsRefClassifiedNodes = nullptr;
  45. }
  46. if (!indexs.isEmpty()) {
  47. currentMindNodes = new MindNodeManager();
  48. classifiedNodes = new QList<QList<MindNodeManager::NodeMessage>>;
  49. getMindNodes(currentMindNodes, indexs);
  50. sortMindNodes(*currentMindNodes, classifiedNodes);
  51. } else {
  52. currentMindNodes = nullptr;
  53. classifiedNodes = nullptr;
  54. }
  55. ui->toatalPagesLabel->setText(QString("共%1页").arg(getPages()));
  56. ui->currPageLabel->setText(QString("当前第0页"));
  57. initPlainWidget(engineerId, expertId, m_table_msg);
  58. setPage(1);
  59. }
  60. //综合专家页面初始化
  61. void AnalysisPanelWidget::initComposite(const QStringList indexsRef, const QStringList indexs, int engineerId,
  62. QList<int> expertIds)
  63. {
  64. indexsRefClassifiedNodes = nullptr;
  65. if (!indexsRef.isEmpty()) {
  66. MindNodeManager *indexsRefNodes = new MindNodeManager(); //是否参考指标体系
  67. getMindNodes(indexsRefNodes, indexsRef);
  68. indexsRefClassifiedNodes = new QList<QList<MindNodeManager::NodeMessage>>;
  69. sortMindNodes(*indexsRefNodes, indexsRefClassifiedNodes);
  70. delete indexsRefNodes;
  71. } else {
  72. indexsRefClassifiedNodes = nullptr;
  73. }
  74. if (!indexs.isEmpty()) {
  75. currentMindNodes = new MindNodeManager();
  76. classifiedNodes = new QList<QList<MindNodeManager::NodeMessage>>;
  77. getMindNodes(currentMindNodes, indexs);
  78. sortMindNodes(*currentMindNodes, classifiedNodes);
  79. } else {
  80. currentMindNodes = nullptr;
  81. classifiedNodes = nullptr;
  82. }
  83. ui->toatalPagesLabel->setText(QString("共%1页").arg(getPages()));
  84. ui->currPageLabel->setText(QString("当前第0页"));
  85. initCompositePlainWidget(engineerId, expertIds, m_table_msg);
  86. setPage(1);
  87. }
  88. void AnalysisPanelWidget::setViewTypeAndTableMsg(int type, QString tableMsg)
  89. {
  90. analysisViewType = type;
  91. m_table_msg = tableMsg;
  92. if (type == 1) {
  93. ui->prePageBtn->setText("上一级指标");
  94. ui->nextPageBtn->setText("下一级指标");
  95. } else if (type == 2) {
  96. ui->prePageBtn->setText("上一级技术措施");
  97. ui->nextPageBtn->setText("下一级技术措施");
  98. } else if (type == 3) {
  99. ui->prePageBtn->setText("上一级指标");
  100. ui->nextPageBtn->setText("下一级指标");
  101. }
  102. }
  103. void AnalysisPanelWidget::setArithmeticMethod(QString resultMethod, QString matricesMethod)
  104. {
  105. m_resultMethod = resultMethod;
  106. m_matricesMethod = matricesMethod;
  107. }
  108. void AnalysisPanelWidget::sortMindNodes(const MindNodeManager &manager,
  109. QList<QList<MindNodeManager::NodeMessage>> *classify)
  110. {
  111. for (MindNodeManager::NodeMessage msg : manager.getMindNodes()) {
  112. QStringList nodePonit = msg.node.split(".");
  113. // qDebug() << "TAG" << nodePonit << msg.node << msg.name;
  114. while (nodePonit.count() - 1 > classify->count()) {
  115. (*classify) << QList<MindNodeManager::NodeMessage>();
  116. }
  117. (*classify)[nodePonit.count() - 2] << msg;
  118. }
  119. #if 0
  120. struct ClassifyNode
  121. {
  122. MindNodeManager::NodeMessage msg;
  123. QList<ClassifyNode *> child;
  124. };
  125. QList<ClassifyNode *> classifyList;
  126. for (MindNodeManager::NodeMessage msg : manager.getMindNodes()) {
  127. QStringList nodePonit = msg.node.split(".");
  128. int level = nodePonit.count() - 1;
  129. if (level == 1) { //第一级
  130. ClassifyNode *cn = new ClassifyNode;
  131. cn->msg = msg;
  132. classifyList << cn;
  133. } else {
  134. ClassifyNode *ref = classifyList[nodePonit[1].toInt() - 1];
  135. for (int i = 2; i < level; ++i) {
  136. ref = ref->child[nodePonit[i].toInt() - 1];
  137. }
  138. ClassifyNode *cn = new ClassifyNode;
  139. cn->msg = msg;
  140. ref->child << cn;
  141. }
  142. }
  143. #endif
  144. }
  145. void AnalysisPanelWidget::getMindNodes(MindNodeManager *manager, QStringList listNodes)
  146. {
  147. int sn[16];
  148. memset(sn, 0, sizeof(int) * 16);
  149. int spaceNum = -1;
  150. int level = 0;
  151. MindNodeManager::NodeMessage temp;
  152. manager->setMindName(listNodes[0].trimmed());
  153. for (int i = 1; i < listNodes.count(); i++) {
  154. int tempSpace = 0;
  155. for (QString s : listNodes[i]) {
  156. if (s == " ") {
  157. tempSpace++;
  158. } else {
  159. break;
  160. }
  161. }
  162. tempSpace /= 4;
  163. if (tempSpace == 1) { //一级
  164. spaceNum = tempSpace;
  165. level = 0;
  166. sn[level]++;
  167. memset((void *)&sn[1], 0, sizeof(int) * 15);
  168. } else {
  169. if (spaceNum < tempSpace) { //空格增加
  170. spaceNum = tempSpace;
  171. level++;
  172. sn[level]++;
  173. } else if (spaceNum == tempSpace) { //同一级
  174. sn[level]++;
  175. } else {
  176. memset((void *)&sn[tempSpace], 0, sizeof(int) * (16 - tempSpace));
  177. level -= spaceNum - tempSpace;
  178. spaceNum = tempSpace;
  179. sn[level]++;
  180. }
  181. }
  182. QString node = "1";
  183. for (int l : sn) {
  184. if (l > 0) {
  185. node += QString(".%1").arg(l);
  186. } else {
  187. break;
  188. }
  189. }
  190. if (listNodes[i].trimmed().isEmpty()) {
  191. temp.name = QString("NULL(节点%1)").arg(node);
  192. temp.node = node;
  193. temp.remark = "";
  194. manager->pushNewMind(temp);
  195. } else {
  196. temp.name = listNodes[i].trimmed().split("\t")[0];
  197. temp.node = node;
  198. temp.remark = listNodes[i].trimmed().split("\t")[1];
  199. manager->pushNewMind(temp);
  200. }
  201. }
  202. }
  203. QStringList AnalysisPanelWidget::getFirstIndexNodes(const MindNodeManager &manager)
  204. {
  205. QList<QList<MindNodeManager::NodeMessage>> classify;
  206. for (MindNodeManager::NodeMessage msg : manager.getMindNodes()) {
  207. QStringList nodePonit = msg.node.split(".");
  208. while (nodePonit.count() - 1 > classify.count()) {
  209. classify << QList<MindNodeManager::NodeMessage>();
  210. }
  211. classify[nodePonit.count() - 2] << msg;
  212. }
  213. QStringList firstNodes;
  214. for (MindNodeManager::NodeMessage msg : classify.first()) {
  215. firstNodes << msg.name;
  216. }
  217. return firstNodes;
  218. }
  219. QStringList AnalysisPanelWidget::getLastIndexNodes(const MindNodeManager &manager)
  220. {
  221. QList<QList<MindNodeManager::NodeMessage>> classify;
  222. for (MindNodeManager::NodeMessage msg : manager.getMindNodes()) {
  223. QStringList nodePonit = msg.node.split(".");
  224. while (nodePonit.count() - 1 > classify.count()) {
  225. classify << QList<MindNodeManager::NodeMessage>();
  226. }
  227. classify[nodePonit.count() - 2] << msg;
  228. }
  229. QStringList lastNodes;
  230. for (MindNodeManager::NodeMessage msg : classify.last()) {
  231. lastNodes << msg.name;
  232. }
  233. return lastNodes;
  234. }
  235. int AnalysisPanelWidget::getPages()
  236. {
  237. #if 0
  238. int max = 0;
  239. for (MindNodeManager::NodeMessage msg : currentMindNodes->getMindNodes()) {
  240. QStringList nodePonit = msg.node.split(".");
  241. if (max < nodePonit.count() - 1) { max = nodePonit.count() - 1; }
  242. }
  243. return max;
  244. #else
  245. if (!classifiedNodes) {
  246. return 0;
  247. }
  248. return classifiedNodes->count();
  249. #endif
  250. }
  251. void AnalysisPanelWidget::setPage(int page)
  252. {
  253. if (page < 1 || page > getPages()) {
  254. return;
  255. }
  256. currentPage = page;
  257. ui->currPageLabel->setText(QString("当前第%1页").arg(currentPage));
  258. if (currentPage == 1) {
  259. ui->prePageBtn->setDisabled(true);
  260. ui->nextPageBtn->setDisabled(false);
  261. } else if (currentPage == getPages()) {
  262. ui->prePageBtn->setDisabled(false);
  263. ui->nextPageBtn->setDisabled(true);
  264. } else {
  265. ui->prePageBtn->setDisabled(false);
  266. ui->nextPageBtn->setDisabled(false);
  267. }
  268. paintPlainWidget();
  269. }
  270. //专家初始化数据
  271. void AnalysisPanelWidget::initPlainWidget(int engineerId, int expertId, QString tableMsg)
  272. {
  273. if (getPages() == 0) {
  274. return;
  275. }
  276. //获取技术措施指标权重
  277. QList<DemandWeight *> firstDemandList;
  278. QList<DemandWeight *> secondDemandList;
  279. DemandWeightService().QueryFirstDemandWeightByEngineerId(&firstDemandList, expertId, engineerId, tableMsg);
  280. // DBServiceSet().QuerySecondDemandWeightByEngineerId(&secondDemandList, expertId,
  281. // engineerId,"能力重要度评估指标体系");
  282. DemandWeightService().QuerySecondDemandWeightByEngineerIdAndMaxPage(&secondDemandList, expertId, engineerId,
  283. "能力重要度评估指标体系");
  284. QList<NodeMatrixInfo *> nodeValueInfoList;
  285. NodeMatrixService().QueryNodeMatrixListByExpertIdAndEngineerId(&nodeValueInfoList, expertId, engineerId, tableMsg);
  286. //准备第一页,非tab的
  287. AnalysisTableWidget *table = new AnalysisTableWidget;
  288. table->horizontalHeader()->setStretchLastSection(true);
  289. table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //填充表格
  290. table->setTableIndexAndTableMsg(0, engineerId, QString::number(expertId), tableMsg);
  291. connect(table, &AnalysisTableWidget::dataReady, this, &AnalysisPanelWidget::oneTableDataReady);
  292. connect(table, &AnalysisTableWidget::returnModel, this, &AnalysisPanelWidget::getTableModel);
  293. if (indexsRefClassifiedNodes) {
  294. for (MindNodeManager::NodeMessage msg : indexsRefClassifiedNodes->last()) {
  295. table->addRowNode(msg.node, msg.name, msg.remark);
  296. }
  297. }
  298. for (MindNodeManager::NodeMessage msg : classifiedNodes->first()) {
  299. table->addColNode(msg.node, msg.name, msg.remark);
  300. if (indexsRefClassifiedNodes == nullptr) {
  301. table->addRowNode(msg.node, msg.name, msg.remark);
  302. }
  303. }
  304. table->setTableWeight(firstDemandList, secondDemandList);
  305. QVector<qreal> firstTableWieghts;
  306. table->paintMatrixTable(nodeValueInfoList, analysisViewType);
  307. firstLayout->addWidget(table);
  308. //准备第二页,tab组合的
  309. QTabWidget *tab = new QTabWidget;
  310. for (int p = 1; p < getPages(); ++p) {
  311. QTabWidget *tab = new QTabWidget;
  312. tab->setTabPosition(QTabWidget::South);
  313. int index = 0;
  314. for (MindNodeManager::NodeMessage msg : classifiedNodes->at(p - 1)) {
  315. ++index;
  316. QString node = msg.node;
  317. // MatrixTableWidget *table = nullptr;
  318. table = nullptr;
  319. for (MindNodeManager::NodeMessage info : classifiedNodes->at(p)) {
  320. if ((info.node.count('.') == msg.node.count('.') + 1)
  321. && (info.node.left(msg.node.count()) == msg.node)) {
  322. if (!table) {
  323. table = new AnalysisTableWidget;
  324. connect(table, &AnalysisTableWidget::returnModel, this, &AnalysisPanelWidget::getTableModel);
  325. }
  326. if (table) {
  327. table->addColNode(info.node, info.name, info.remark);
  328. if (!indexsRefClassifiedNodes) {
  329. table->addRowNode(info.node, info.name, info.remark);
  330. }
  331. }
  332. }
  333. }
  334. if (indexsRefClassifiedNodes) {
  335. for (MindNodeManager::NodeMessage msg : indexsRefClassifiedNodes->last()) {
  336. table->addRowNode(msg.node, msg.name, msg.remark);
  337. }
  338. }
  339. if (table) {
  340. firstDemandList.clear();
  341. if (firstDemandList.size() == 0) {
  342. DemandWeightService().QueryLastPageDemandWeightByEngineerId(
  343. &firstDemandList, QString::number(expertId), engineerId, tableMsg, p - 1);
  344. }
  345. // qDebug() << p << "=" << p << "===========" << firstDemandList.size();
  346. table->setTableIndexAndTableMsg(index, engineerId, QString::number(expertId), tableMsg);
  347. table->setTableWeight(firstDemandList, secondDemandList);
  348. table->paintSecondMatrixTable(nodeValueInfoList, p, analysisViewType, index);
  349. tab->addTab(table, msg.name);
  350. connect(table, &AnalysisTableWidget::dataReady, this, &AnalysisPanelWidget::oneTableDataReady);
  351. }
  352. }
  353. tabWidgets << tab;
  354. }
  355. qDeleteAll(firstDemandList);
  356. qDeleteAll(secondDemandList);
  357. // secondLayout->addWidget(tab);
  358. }
  359. //综合专家页面渲染
  360. void AnalysisPanelWidget::initCompositePlainWidget(int engineerId, QList<int> expertIds, QString tableMsg)
  361. {
  362. if (getPages() == 0) {
  363. return;
  364. }
  365. QString experId;
  366. for (int i = 0; i < expertIds.size(); i++) {
  367. if (experId == nullptr) {
  368. experId = QString::number(expertIds.at(i));
  369. } else {
  370. experId = experId + "," + QString::number(expertIds.at(i));
  371. }
  372. }
  373. qDebug() << experId;
  374. //获取技术措施指标权重
  375. QList<DemandWeight *> firstDemandList;
  376. QList<DemandWeight *> secondDemandList;
  377. DemandWeightService().QueryFirstDemandWeightByEngineerId(&firstDemandList, experId, engineerId, tableMsg);
  378. DemandWeightService().QuerySecondDemandWeightByEngineerId(&secondDemandList, experId, engineerId,
  379. "能力重要度评估指标体系");
  380. QList<NodeMatrixInfo *> compositeNodeValueInfoList;
  381. computerCompositeValue(compositeNodeValueInfoList, expertIds, engineerId, tableMsg);
  382. //准备第一页,非tab的
  383. AnalysisTableWidget *table = new AnalysisTableWidget;
  384. connect(table, &AnalysisTableWidget::dataReady, this, &AnalysisPanelWidget::oneTableDataReady);
  385. connect(table, &AnalysisTableWidget::returnModel, this, &AnalysisPanelWidget::getTableModel);
  386. if (indexsRefClassifiedNodes) {
  387. for (MindNodeManager::NodeMessage msg : indexsRefClassifiedNodes->last()) {
  388. table->addRowNode(msg.node, msg.name, msg.remark);
  389. }
  390. }
  391. for (MindNodeManager::NodeMessage msg : classifiedNodes->first()) {
  392. table->addColNode(msg.node, msg.name, msg.remark);
  393. if (indexsRefClassifiedNodes == nullptr) {
  394. table->addRowNode(msg.node, msg.name, msg.remark);
  395. }
  396. }
  397. table->setTableWeight(firstDemandList, secondDemandList);
  398. QVector<qreal> firstTableWieghts;
  399. table->setTableIndexAndTableMsg(0, engineerId, experId, m_table_msg);
  400. table->paintMatrixTable(compositeNodeValueInfoList, analysisViewType);
  401. firstLayout->addWidget(table);
  402. //准备第二页,tab组合的
  403. for (int p = 1; p < getPages(); ++p) {
  404. QTabWidget *tab = new QTabWidget;
  405. tab->setTabPosition(QTabWidget::South);
  406. int index = 0;
  407. for (MindNodeManager::NodeMessage msg : classifiedNodes->at(p - 1)) {
  408. ++index;
  409. QString node = msg.node;
  410. // MatrixTableWidget *table = nullptr;
  411. table = nullptr;
  412. for (MindNodeManager::NodeMessage info : classifiedNodes->at(p)) {
  413. if ((info.node.count('.') == msg.node.count('.') + 1)
  414. && (info.node.left(msg.node.count()) == msg.node)) {
  415. if (!table) {
  416. table = new AnalysisTableWidget;
  417. table->setTableIndexAndTableMsg(index, engineerId, experId, tableMsg);
  418. connect(table, &AnalysisTableWidget::returnModel, this, &AnalysisPanelWidget::getTableModel);
  419. }
  420. if (table) {
  421. table->addColNode(info.node, info.name, info.remark);
  422. if (!indexsRefClassifiedNodes) {
  423. table->addRowNode(info.node, info.name, info.remark);
  424. }
  425. }
  426. }
  427. }
  428. if (indexsRefClassifiedNodes) {
  429. for (MindNodeManager::NodeMessage msg : indexsRefClassifiedNodes->last()) {
  430. table->addRowNode(msg.node, msg.name, msg.remark);
  431. }
  432. }
  433. if (table) {
  434. firstDemandList.clear();
  435. if (firstDemandList.size() == 0) {
  436. DemandWeightService().QueryLastPageDemandWeightByEngineerId(&firstDemandList, experId, engineerId,
  437. tableMsg, p - 1);
  438. }
  439. table->setTableWeight(firstDemandList, secondDemandList);
  440. table->paintSecondMatrixTable(compositeNodeValueInfoList, p, analysisViewType, index);
  441. tab->addTab(table, msg.name);
  442. connect(table, &AnalysisTableWidget::dataReady, this, &AnalysisPanelWidget::oneTableDataReady);
  443. }
  444. }
  445. tabWidgets << tab;
  446. }
  447. qDeleteAll(firstDemandList);
  448. }
  449. //综合计算
  450. void AnalysisPanelWidget::computerCompositeValue(QList<NodeMatrixInfo *> &compositeNodeValueInfoList,
  451. QList<int> expertIds, int engineerId, QString tabMsg)
  452. {
  453. qDebug() << m_matricesMethod;
  454. if (m_matricesMethod == "valueAverage") { //数值平均
  455. int expertSize = 0;
  456. if (tabMsg == "能力重要度评估指标体系" || tabMsg == "方案评估指标体系") {
  457. for (int i = 0; i < expertIds.size(); i++) {
  458. QList<NodeMatrixInfo *> nodeValueInfoList;
  459. NodeMatrixService().QueryNodeMatrixListByExpertIdAndEngineerId(&nodeValueInfoList, expertIds.at(i),
  460. engineerId, tabMsg);
  461. // qDebug() << "nodeValueInfoList.size()==" << nodeValueInfoList.size();
  462. if (nodeValueInfoList.size() == 0) {
  463. continue;
  464. }
  465. expertSize += 1;
  466. if (compositeNodeValueInfoList.isEmpty()) {
  467. compositeNodeValueInfoList = nodeValueInfoList;
  468. } else {
  469. for (int i = 0; i < compositeNodeValueInfoList.size(); i++) {
  470. NodeMatrixInfo *nodeInfo = compositeNodeValueInfoList.at(i);
  471. QStringList list = nodeInfo->nodeValue.split("/");
  472. int numerator;
  473. int denominator;
  474. if (list.size() == 1) {
  475. numerator = list.at(0).toInt() * list.at(0).toInt();
  476. denominator = list.at(0).toInt();
  477. } else {
  478. numerator = list.at(0).toInt();
  479. denominator = list.at(1).toInt();
  480. }
  481. for (int j = 0; j < nodeValueInfoList.size(); j++) {
  482. NodeMatrixInfo *info = nodeValueInfoList.at(j);
  483. if (nodeInfo->node == info->node && nodeInfo->abscissa == info->abscissa
  484. && nodeInfo->ordinate == info->ordinate) {
  485. QStringList list2 = info->nodeValue.split("/");
  486. int numerator2;
  487. int denominator2;
  488. if (list2.size() == 1) {
  489. numerator2 = list2.at(0).toInt() * list2.at(0).toInt();
  490. denominator2 = list2.at(0).toInt();
  491. } else {
  492. numerator2 = list2.at(0).toInt();
  493. denominator2 = list2.at(1).toInt();
  494. }
  495. numerator = numerator * denominator2 + numerator2 * denominator;
  496. denominator *= denominator2;
  497. nodeInfo->nodeValue = QString::number(numerator) + "/" + QString::number(denominator);
  498. }
  499. }
  500. }
  501. }
  502. }
  503. //平均value值
  504. for (int i = 0; i < compositeNodeValueInfoList.size(); i++) {
  505. QStringList valueList = compositeNodeValueInfoList.at(i)->nodeValue.split("/");
  506. long int numerator = 1;
  507. long int denominator = 1;
  508. if (valueList.size() != 1) {
  509. denominator = valueList.at(1).toInt();
  510. }
  511. numerator = valueList.at(0).toInt();
  512. numerator = numerator * 1;
  513. denominator *= expertSize;
  514. // qDebug() << "---yuefen前" << numerator << "---" << denominator;
  515. yuefen(numerator, denominator);
  516. // qDebug() << "---yuefen后" << numerator << "---" << denominator;
  517. if (denominator == 1) {
  518. compositeNodeValueInfoList.at(i)->nodeValue = QString::number(numerator);
  519. } else {
  520. compositeNodeValueInfoList.at(i)->nodeValue =
  521. QString::number(numerator) + "/" + QString::number(denominator);
  522. }
  523. }
  524. } else if (tabMsg == "技术措施重要度评估对象") {
  525. for (int i = 0; i < expertIds.size(); i++) {
  526. QList<NodeMatrixInfo *> nodeValueInfoList;
  527. NodeMatrixService().QueryNodeMatrixListByExpertIdAndEngineerId(&nodeValueInfoList, expertIds.at(i),
  528. engineerId, tabMsg);
  529. if (nodeValueInfoList.size() == 0) {
  530. continue;
  531. }
  532. expertSize += 1;
  533. if (compositeNodeValueInfoList.isEmpty()) {
  534. compositeNodeValueInfoList = nodeValueInfoList;
  535. } else {
  536. for (int i = 0; i < compositeNodeValueInfoList.size(); i++) {
  537. NodeMatrixInfo *nodeInfo = compositeNodeValueInfoList.at(i);
  538. for (int j = 0; j < nodeValueInfoList.size(); j++) {
  539. NodeMatrixInfo *info = nodeValueInfoList.at(j);
  540. if (nodeInfo->node == info->node && nodeInfo->abscissa == info->abscissa
  541. && nodeInfo->ordinate == info->ordinate) {
  542. nodeInfo->nodeValue =
  543. QString::number(nodeInfo->nodeValue.toInt() + info->nodeValue.toInt());
  544. }
  545. }
  546. }
  547. }
  548. }
  549. //平均value值
  550. for (int i = 0; i < compositeNodeValueInfoList.size(); i++) {
  551. QStringList valueList = compositeNodeValueInfoList.at(i)->nodeValue.split("/");
  552. long int numerator = valueList.at(0).toInt();
  553. long int denominator = 1;
  554. numerator = numerator * 1;
  555. denominator *= expertSize;
  556. // qDebug() << "---yuefen前" << numerator << "---" << denominator;
  557. yuefen(numerator, denominator);
  558. // qDebug() << "---yuefen后" << numerator << "---" << denominator;
  559. if (denominator == 1) {
  560. compositeNodeValueInfoList.at(i)->nodeValue = QString::number(numerator);
  561. } else {
  562. compositeNodeValueInfoList.at(i)->nodeValue =
  563. QString::number(numerator) + "/" + QString::number(denominator);
  564. }
  565. }
  566. }
  567. } else {
  568. if (tabMsg == "能力重要度评估指标体系" || tabMsg == "方案评估指标体系") {
  569. for (int i = 0; i < expertIds.size(); i++) {
  570. QList<NodeMatrixInfo *> nodeValueInfoList;
  571. NodeMatrixService().QueryNodeMatrixListByExpertIdAndEngineerId(&nodeValueInfoList, expertIds.at(i),
  572. engineerId, tabMsg);
  573. // qDebug() << "nodeValueInfoList.size()==" << nodeValueInfoList.size();
  574. if (nodeValueInfoList.size() == 0) {
  575. continue;
  576. }
  577. if (compositeNodeValueInfoList.isEmpty()) {
  578. compositeNodeValueInfoList = nodeValueInfoList;
  579. } else {
  580. for (int i = 0; i < compositeNodeValueInfoList.size(); i++) {
  581. NodeMatrixInfo *nodeInfo = compositeNodeValueInfoList.at(i);
  582. QString compostValue = nodeInfo->nodeValue;
  583. QStringList list = compostValue.split("/");
  584. long int numerator;
  585. long int denominator;
  586. if (list.size() == 1) {
  587. numerator = list.at(0).toInt() * list.at(0).toInt();
  588. denominator = list.at(0).toInt();
  589. } else {
  590. numerator = list.at(0).toInt();
  591. denominator = list.at(1).toInt();
  592. }
  593. for (int j = 0; j < nodeValueInfoList.size(); j++) {
  594. NodeMatrixInfo *info = nodeValueInfoList.at(j);
  595. if (nodeInfo->node == info->node && nodeInfo->abscissa == info->abscissa
  596. && nodeInfo->ordinate == info->ordinate) {
  597. QString infoValue = info->nodeValue;
  598. QStringList list2 = infoValue.split("/");
  599. int numerator2;
  600. int denominator2;
  601. if (list2.size() == 1) {
  602. numerator2 = list2.at(0).toInt() * list2.at(0).toInt();
  603. denominator2 = list2.at(0).toInt();
  604. } else {
  605. numerator2 = list2.at(0).toInt();
  606. denominator2 = list2.at(1).toInt();
  607. }
  608. //等级计算
  609. if (compostValue == infoValue) {
  610. nodeInfo->nodeValue = compostValue;
  611. numerator = numerator2;
  612. denominator = denominator2;
  613. continue;
  614. } else if (numerator / denominator == 0 && numerator2 / denominator2 == 0) { //都小于1
  615. numerator = 1;
  616. denominator = (denominator + denominator2) / 2;
  617. } else if (numerator / denominator == 0 && numerator2 / denominator2 != 0) {
  618. numerator = 1 + denominator2;
  619. denominator = 2;
  620. } else if (numerator / denominator != 0 && numerator2 / denominator2 == 0) {
  621. numerator = denominator + 1;
  622. denominator = 2;
  623. } else if (numerator / denominator != 0 && numerator2 / denominator2 != 0) {
  624. numerator = abs((numerator / denominator + numerator2 / denominator2));
  625. denominator = 2;
  626. }
  627. yuefen(numerator, denominator);
  628. if (numerator == denominator) {
  629. nodeInfo->nodeValue = "1";
  630. } else {
  631. nodeInfo->nodeValue =
  632. QString::number(numerator) + "/" + QString::number(denominator);
  633. }
  634. }
  635. }
  636. }
  637. }
  638. }
  639. } else if (tabMsg == "技术措施重要度评估对象") {
  640. }
  641. }
  642. }
  643. //字母约分处理
  644. void AnalysisPanelWidget::yuefen(long int &numerator, long int &denominator)
  645. {
  646. long int a = numerator, b = denominator;
  647. long int temp = a % b;
  648. while (temp) {
  649. a = b;
  650. b = temp;
  651. temp = a % b;
  652. }
  653. numerator /= b;
  654. denominator /= b;
  655. // qDebug() << "yuefen--" << numerator << "---" << denominator;
  656. }
  657. void AnalysisPanelWidget::paintPlainWidget()
  658. {
  659. bool firstShow = true;
  660. if (getPages() == 0) {
  661. return;
  662. }
  663. if (currentPage > 1) {
  664. firstShow = false;
  665. }
  666. if (firstShow) {
  667. ui->stackedWidget->setCurrentIndex(0);
  668. } else {
  669. QTabWidget *newTab = tabWidgets.at(currentPage - 2);
  670. // qDebug() << secondLayout->count();
  671. if (secondLayout->count() == 0) {
  672. secondLayout->addWidget(newTab);
  673. newTab->show();
  674. } else {
  675. QTabWidget *currTab = qobject_cast<QTabWidget *>(secondLayout->itemAt(0)->widget());
  676. if (newTab == currTab) {
  677. } else {
  678. secondLayout->removeWidget(currTab);
  679. currTab->hide();
  680. secondLayout->addWidget(newTab);
  681. newTab->show();
  682. }
  683. }
  684. ui->stackedWidget->setCurrentIndex(1);
  685. }
  686. }
  687. void AnalysisPanelWidget::on_prePageBtn_clicked()
  688. {
  689. setPage(currentPage - 1);
  690. }
  691. void AnalysisPanelWidget::on_nextPageBtn_clicked()
  692. {
  693. setPage(currentPage + 1);
  694. }
  695. void AnalysisPanelWidget::getTableModel(QStandardItemModel *item)
  696. {
  697. emit returnModel(item);
  698. }
  699. void AnalysisPanelWidget::oneTableDataReady(bool status)
  700. {
  701. if (status) {
  702. bool filled = true;
  703. AnalysisTableWidget *first = qobject_cast<AnalysisTableWidget *>(firstLayout->itemAt(0)->widget());
  704. if (!first->isDataReady()) {
  705. filled = false;
  706. }
  707. for (QTabWidget *tab : tabWidgets) {
  708. for (int t = 0; t < tab->count(); ++t) {
  709. AnalysisTableWidget *table = qobject_cast<AnalysisTableWidget *>(tab->widget(t));
  710. if (!table->isDataReady()) {
  711. filled = false;
  712. }
  713. }
  714. }
  715. emit dataReady(filled);
  716. } else {
  717. emit dataReady(false);
  718. }
  719. }