AnalysisPanelWidget.cpp 31 KB

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