AnalysisPanelWidget.cpp 31 KB

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