AnalysisTableWidget.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. #include "AnalysisTableWidget.h"
  2. #include "RequirementImportance.h"
  3. #include "ConsistencyCheck.h"
  4. #include <QDebug>
  5. #include <QHeaderView>
  6. #include <QTime>
  7. #include <QtMath>
  8. #include "dbService/ClassSet.h"
  9. #include <dbService/DBServiceSet.h>
  10. #include <dbService/NodeMatrixService.h>
  11. #include <QList>
  12. AnalysisTableWidget::AnalysisTableWidget(QWidget *parent) : QTableView(parent)
  13. {
  14. qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
  15. // qDebug() << "AnalysisTableWidget---init";
  16. model = new QStandardItemModel();
  17. this->setModel(model);
  18. paintDone = false;
  19. connect(model, &QStandardItemModel::itemChanged, this, &AnalysisTableWidget::nodeValueChanged);
  20. }
  21. AnalysisTableWidget::~AnalysisTableWidget() { }
  22. void AnalysisTableWidget::addRowNode(QString node, QString name, QString remark)
  23. {
  24. matrixRows << AnalysisTableWidget::MatrixNode(node, name, remark);
  25. }
  26. void AnalysisTableWidget::addColNode(QString node, QString name, QString remark)
  27. {
  28. matrixCols << AnalysisTableWidget::MatrixNode(node, name, remark);
  29. }
  30. QList<AnalysisDataSource> AnalysisTableWidget::getSource() const
  31. {
  32. return dataSource;
  33. }
  34. void AnalysisTableWidget::setTableWeight(QList<DemandWeight *> firstWeight, QList<DemandWeight *> secondWeight)
  35. {
  36. m_firstTableWeight = firstWeight;
  37. m_secondTableWeight = secondWeight;
  38. }
  39. void AnalysisTableWidget::setTableIndexAndTableMsg(int index, int engineerId, QString expertId, QString tableMsg)
  40. {
  41. m_tableIndex = index;
  42. m_engineerId = engineerId;
  43. m_expertId = expertId;
  44. m_table_msg = tableMsg;
  45. }
  46. void AnalysisTableWidget::setTableMethod(QString method)
  47. {
  48. m_resultMethod = method;
  49. }
  50. void AnalysisTableWidget::paintMatrixTable(QList<NodeMatrixInfo *> nodeValueInfoList, int type)
  51. {
  52. int row = matrixRows.count();
  53. int col = matrixCols.count();
  54. this->horizontalHeader()->setStretchLastSection(true);
  55. this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  56. this->setSelectionMode(QAbstractItemView::SingleSelection);
  57. this->setSelectionBehavior(QAbstractItemView::SelectItems);
  58. model->setHorizontalHeaderItem(0, new QStandardItem(""));
  59. if (type == IndexType::IndexTech || type == IndexType::SchemaEval) {
  60. for (int c = 0; c < col; ++c) {
  61. model->setHorizontalHeaderItem(c + 1, new QStandardItem(matrixCols[c].name));
  62. model->horizontalHeaderItem(c + 1)->setToolTip(matrixCols[c].remark);
  63. model->horizontalHeaderItem(c + 1)->setTextAlignment(Qt::AlignCenter);
  64. }
  65. model->setHorizontalHeaderItem(col + 1, new QStandardItem("权重"));
  66. model->horizontalHeaderItem(col + 1)->setToolTip("权重");
  67. QStringList nodes;
  68. QVector<qreal> nxn((int)qPow(row, 2), 0);
  69. for (int r = 0; r < row; ++r) {
  70. model->setItem(r, 0, new QStandardItem(matrixRows[r].name));
  71. nodes << model->item(r, 0)->text().trimmed();
  72. model->item(r, 0)->setToolTip(matrixRows[r].remark);
  73. model->item(r, 0)->setTextAlignment(Qt::AlignCenter);
  74. model->item(r, 0)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  75. for (int c = 1; c < col + 1; ++c) {
  76. AnalysisDataSource data;
  77. data.row = r;
  78. data.col = c;
  79. data.changed = true;
  80. if (nodeValueInfoList.size() > 0) {
  81. for (NodeMatrixInfo *nodeMatrixInfo : nodeValueInfoList) {
  82. if (nodeMatrixInfo->abscissa == matrixRows[r].name
  83. && nodeMatrixInfo->ordinate == matrixCols[c - 1].name) {
  84. data.nodeValue = nodeMatrixInfo->nodeValue;
  85. }
  86. }
  87. } else {
  88. // data.nodeValue = "0";
  89. data.nodeValue = "";
  90. }
  91. model->setItem(r, c, new QStandardItem(data.nodeValue));
  92. QStringList content = model->item(r, c)->text().trimmed().split("/");
  93. if (content.size() == 1) {
  94. nxn[r * col + c - 1] = content[0].toDouble();
  95. } else {
  96. nxn[r * col + c - 1] = content[0].toDouble() / content[1].toDouble();
  97. }
  98. model->item(r, c)->setTextAlignment(Qt::AlignCenter);
  99. model->item(r, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  100. data.node = matrixRows[r].node;
  101. data.abscissa = matrixRows[r].name;
  102. data.ordinate = matrixCols[c - 1].name;
  103. dataSource << data;
  104. }
  105. }
  106. ConsistencyCheck cc(nodes, nxn);
  107. for (int r = 0; r < row; ++r) {
  108. model->setItem(r, col + 1,
  109. new QStandardItem(QString::number(cc.getWieghts().at(r)) == "nan"
  110. ? ""
  111. : QString::number(cc.getWieghts().at(r))));
  112. model->item(r, col + 1)->setTextAlignment(Qt::AlignCenter);
  113. model->item(r, col + 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  114. }
  115. QStringList nodeList = cc.getNodes();
  116. QVector<qreal> weights = cc.getWieghts();
  117. // qDebug() << weights;
  118. QList<DemandWeight *> list;
  119. for (int i = 0; i < weights.length(); i++) {
  120. DemandWeight *demandWeight = new DemandWeight();
  121. demandWeight->nodeName = nodeList.at(i);
  122. demandWeight->nodeWeight = weights.at(i);
  123. demandWeight->nodeValue = weights.at(i);
  124. demandWeight->engineerId = m_engineerId;
  125. demandWeight->expertId = m_expertId;
  126. demandWeight->isValid = 1;
  127. demandWeight->tableIndex = m_tableIndex;
  128. demandWeight->tableMsg = m_table_msg;
  129. demandWeight->pageIndex = 0;
  130. list.append(demandWeight);
  131. }
  132. if (NodeMatrixService().QueryByTableIndexAndTableMsg(m_expertId, m_engineerId, m_tableIndex, m_table_msg)) {
  133. NodeMatrixService().UpdateNodeValueList(list);
  134. } else {
  135. NodeMatrixService().AddNodeWeightInfoList(list);
  136. }
  137. } else {
  138. //获取到指标体系需求重要度
  139. model->setHorizontalHeaderItem(1, new QStandardItem("权重"));
  140. model->horizontalHeaderItem(1)->setToolTip("权重");
  141. for (int c = 0; c < col; ++c) {
  142. model->setHorizontalHeaderItem(c + 2, new QStandardItem(matrixCols[c].name));
  143. model->horizontalHeaderItem(c + 2)->setToolTip(matrixCols[c].remark);
  144. }
  145. for (int r = 0; r < row; ++r) {
  146. model->setItem(r, 0, new QStandardItem(matrixRows[r].name));
  147. model->item(r, 0)->setToolTip(matrixRows[r].remark);
  148. model->item(r, 0)->setTextAlignment(Qt::AlignCenter);
  149. model->item(r, 0)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  150. if (r >= m_secondTableWeight.count()) {
  151. model->setItem(r, 1, new QStandardItem(""));
  152. } else {
  153. model->setItem(r, 1,
  154. new QStandardItem(QString::number(m_secondTableWeight.at(r)->nodeValue) == "nan"
  155. ? ""
  156. : QString::number(m_secondTableWeight.at(r)->nodeValue)));
  157. }
  158. model->item(r, 1)->setTextAlignment(Qt::AlignCenter);
  159. model->item(r, 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  160. for (int c = 2; c < col + 2; ++c) {
  161. AnalysisDataSource data;
  162. data.row = r;
  163. data.col = c;
  164. data.changed = true;
  165. if (nodeValueInfoList.size() > 0) {
  166. for (NodeMatrixInfo *nodeMatrixInfo : nodeValueInfoList) {
  167. if (nodeMatrixInfo->abscissa == matrixRows[r].name
  168. && nodeMatrixInfo->ordinate == matrixCols[c - 2].name) {
  169. data.nodeValue = nodeMatrixInfo->nodeValue;
  170. }
  171. }
  172. } else {
  173. data.nodeValue = "";
  174. }
  175. model->setItem(r, c, new QStandardItem(data.nodeValue));
  176. model->item(r, c)->setTextAlignment(Qt::AlignCenter);
  177. model->item(r, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  178. data.node = matrixRows[r].node;
  179. data.abscissa = matrixRows[r].name;
  180. data.ordinate = matrixCols[c - 2].name;
  181. dataSource << data;
  182. }
  183. }
  184. for (int c = 0; c < col + 2; ++c) {
  185. if (c == 0) {
  186. model->setItem(row, c, new QStandardItem("技术重要度"));
  187. } else if (c > 1 && c < col + 2) {
  188. qreal value = 0;
  189. for (int r = 0; r < row; r++) {
  190. if (r < m_secondTableWeight.count()) {
  191. QStandardItem *item = model->item(r, c);
  192. QStringList content = item->text().trimmed().split("/");
  193. double itemValue = 0;
  194. if (content.size() == 1) {
  195. itemValue = content[0].toDouble();
  196. } else {
  197. itemValue = content[0].toDouble() / content[1].toDouble();
  198. }
  199. double tempValue = 0;
  200. if (QString::number(m_secondTableWeight.at(r)->nodeValue) != "nan") {
  201. tempValue = m_secondTableWeight.at(r)->nodeValue;
  202. }
  203. value += itemValue * tempValue;
  204. }
  205. }
  206. model->setItem(row, c, new QStandardItem(QString::number(value)));
  207. } else {
  208. model->setItem(row, c, new QStandardItem(""));
  209. }
  210. model->item(row, c)->setTextAlignment(Qt::AlignCenter);
  211. model->item(row, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  212. }
  213. //保存技术重要度
  214. QList<TechnicalImport *> importList;
  215. for (int c = 0; c < col; c++) {
  216. QStandardItem *item = model->item(row, c + 2);
  217. TechnicalImport *import = new TechnicalImport();
  218. import->engineerId = m_engineerId;
  219. import->expertId = m_expertId.toInt();
  220. import->nodeName = matrixCols[c].name;
  221. import->nodeValue = item->text().toDouble();
  222. importList.append(import);
  223. }
  224. if (DBServiceSet().QueryTechnicalImportInfoByEngineerId(m_expertId.toInt(), m_engineerId)) {
  225. DBServiceSet().UpdateTechnicalImportInfoList(importList);
  226. } else {
  227. DBServiceSet().AddTechnicalImportInfoList(importList);
  228. }
  229. }
  230. emit returnModel(model);
  231. paintDone = true;
  232. }
  233. void AnalysisTableWidget::paintCompositeMatrixTable(QList<NodeMatrixInfo *> nodeValueInfoList, int type)
  234. {
  235. int row = matrixRows.count();
  236. int col = matrixCols.count();
  237. this->horizontalHeader()->setStretchLastSection(true);
  238. this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  239. this->setSelectionMode(QAbstractItemView::SingleSelection);
  240. this->setSelectionBehavior(QAbstractItemView::SelectItems);
  241. model->setHorizontalHeaderItem(0, new QStandardItem(""));
  242. if (type == IndexType::IndexTech || type == IndexType::SchemaEval) {
  243. for (int c = 0; c < col; ++c) {
  244. model->setHorizontalHeaderItem(c + 1, new QStandardItem(matrixCols[c].name));
  245. model->horizontalHeaderItem(c + 1)->setToolTip(matrixCols[c].remark);
  246. }
  247. model->setHorizontalHeaderItem(col + 1, new QStandardItem("权重"));
  248. model->horizontalHeaderItem(col + 1)->setToolTip("权重");
  249. QStringList nodes;
  250. QVector<qreal> nxn((int)qPow(row, 2), 0);
  251. for (int r = 0; r < row; ++r) {
  252. model->setItem(r, 0, new QStandardItem(matrixRows[r].name));
  253. nodes << model->item(r, 0)->text().trimmed();
  254. model->item(r, 0)->setToolTip(matrixRows[r].remark);
  255. model->item(r, 0)->setTextAlignment(Qt::AlignCenter);
  256. model->item(r, 0)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  257. for (int c = 1; c < col + 1; ++c) {
  258. AnalysisDataSource data;
  259. data.row = r;
  260. data.col = c;
  261. data.changed = true;
  262. for (NodeMatrixInfo *nodeMatrixInfo : nodeValueInfoList) {
  263. if (nodeMatrixInfo->abscissa == matrixRows[r].name
  264. && nodeMatrixInfo->ordinate == matrixCols[c - 1].name) {
  265. data.nodeValue = nodeMatrixInfo->nodeValue;
  266. }
  267. }
  268. model->setItem(r, c, new QStandardItem(data.nodeValue));
  269. QStringList content = model->item(r, c)->text().trimmed().split("/");
  270. if (content.size() == 1) {
  271. nxn[r * col + c - 1] = content[0].toDouble();
  272. } else {
  273. nxn[r * col + c - 1] = content[0].toDouble() / content[1].toDouble();
  274. }
  275. model->item(r, c)->setTextAlignment(Qt::AlignCenter);
  276. model->item(r, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  277. data.node = matrixRows[r].node;
  278. data.abscissa = matrixRows[r].name;
  279. data.ordinate = matrixCols[c - 1].name;
  280. dataSource << data;
  281. }
  282. }
  283. ConsistencyCheck cc(nodes, nxn);
  284. for (int r = 0; r < row; ++r) {
  285. model->setItem(r, col + 1, new QStandardItem(QString::number(cc.getWieghts().at(r))));
  286. model->item(r, col + 1)->setTextAlignment(Qt::AlignCenter);
  287. model->item(r, col + 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  288. }
  289. QStringList nodeList = cc.getNodes();
  290. QVector<qreal> weights = cc.getWieghts();
  291. QList<DemandWeight *> list;
  292. for (int i = 0; i < weights.length(); i++) {
  293. DemandWeight *demandWeight = new DemandWeight();
  294. demandWeight->nodeName = nodeList.at(i);
  295. demandWeight->nodeWeight = weights.at(i);
  296. demandWeight->nodeValue = weights.at(i);
  297. demandWeight->engineerId = m_engineerId;
  298. demandWeight->expertId = m_expertId;
  299. demandWeight->isValid = 1;
  300. demandWeight->tableIndex = m_tableIndex;
  301. demandWeight->tableMsg = m_table_msg;
  302. list.append(demandWeight);
  303. }
  304. if (NodeMatrixService().QueryByTableIndexAndTableMsg(m_expertId, m_engineerId, m_tableIndex, m_table_msg)) {
  305. NodeMatrixService().UpdateNodeValueList(list);
  306. } else {
  307. NodeMatrixService().AddNodeWeightInfoList(list);
  308. }
  309. } else {
  310. //获取到指标体系需求重要度
  311. model->setHorizontalHeaderItem(1, new QStandardItem("权重"));
  312. model->horizontalHeaderItem(1)->setToolTip("权重");
  313. for (int c = 0; c < col; ++c) {
  314. model->setHorizontalHeaderItem(c + 2, new QStandardItem(matrixCols[c].name));
  315. model->horizontalHeaderItem(c + 2)->setToolTip(matrixCols[c].remark);
  316. }
  317. for (int r = 0; r < row; ++r) {
  318. model->setItem(r, 0, new QStandardItem(matrixRows[r].name));
  319. model->item(r, 0)->setToolTip(matrixRows[r].remark);
  320. model->item(r, 0)->setTextAlignment(Qt::AlignCenter);
  321. model->item(r, 0)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  322. if (r >= m_secondTableWeight.count()) {
  323. model->setItem(r, 1, new QStandardItem(""));
  324. } else {
  325. model->setItem(r, 1, new QStandardItem(QString::number(m_secondTableWeight.at(r)->nodeValue)));
  326. }
  327. model->item(r, 1)->setTextAlignment(Qt::AlignCenter);
  328. model->item(r, 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  329. for (int c = 2; c < col + 2; ++c) {
  330. AnalysisDataSource data;
  331. data.row = r;
  332. data.col = c;
  333. data.changed = true;
  334. for (NodeMatrixInfo *nodeMatrixInfo : nodeValueInfoList) {
  335. if (nodeMatrixInfo->abscissa == matrixRows[r].name
  336. && nodeMatrixInfo->ordinate == matrixCols[c - 2].name) {
  337. data.nodeValue = nodeMatrixInfo->nodeValue;
  338. }
  339. }
  340. model->setItem(r, c, new QStandardItem(data.nodeValue));
  341. model->item(r, c)->setTextAlignment(Qt::AlignCenter);
  342. model->item(r, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  343. data.node = matrixRows[r].node;
  344. data.abscissa = matrixRows[r].name;
  345. data.ordinate = matrixCols[c - 2].name;
  346. dataSource << data;
  347. }
  348. }
  349. for (int c = 0; c < col + 2; ++c) {
  350. if (c == 0) {
  351. model->setItem(row, c, new QStandardItem("技术重要度"));
  352. } else if (c > 1 && c < col + 2) {
  353. qreal value = 0;
  354. for (int r = 0; r < row; r++) {
  355. if (r < m_secondTableWeight.count()) {
  356. QStandardItem *item = model->item(r, c);
  357. QStringList content = item->text().trimmed().split("/");
  358. double itemValue = 0;
  359. if (content.size() == 1) {
  360. itemValue = content[0].toDouble();
  361. } else {
  362. itemValue = content[0].toDouble() / content[1].toDouble();
  363. }
  364. value += itemValue * m_secondTableWeight.at(r)->nodeValue;
  365. }
  366. }
  367. model->setItem(row, c, new QStandardItem(QString::number(value)));
  368. } else {
  369. model->setItem(row, c, new QStandardItem(""));
  370. }
  371. model->item(row, c)->setTextAlignment(Qt::AlignCenter);
  372. model->item(row, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  373. }
  374. }
  375. emit returnModel(model);
  376. paintDone = true;
  377. }
  378. void AnalysisTableWidget::paintSecondMatrixTable(QList<NodeMatrixInfo *> nodeValueInfoList, int page, int type,
  379. int index)
  380. {
  381. // qDebug() << "----------o---" << index;
  382. int row = matrixRows.count();
  383. int col = matrixCols.count();
  384. this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  385. this->setSelectionMode(QAbstractItemView::SingleSelection);
  386. this->setSelectionBehavior(QAbstractItemView::SelectItems);
  387. model->setHorizontalHeaderItem(0, new QStandardItem(""));
  388. if (type == IndexType::IndexTech || type == IndexType::SchemaEval) {
  389. for (int c = 0; c < col; ++c) {
  390. model->setHorizontalHeaderItem(c + 1, new QStandardItem(matrixCols[c].name));
  391. model->horizontalHeaderItem(c + 1)->setToolTip(matrixCols[c].remark);
  392. }
  393. model->setHorizontalHeaderItem(col + 1, new QStandardItem("权重"));
  394. model->horizontalHeaderItem(col + 1)->setToolTip("权重");
  395. model->setHorizontalHeaderItem(col + 2, new QStandardItem("需求重要度"));
  396. model->horizontalHeaderItem(col + 2)->setToolTip("需求重要度");
  397. QStringList nodes;
  398. QVector<qreal> nxn((int)qPow(row, 2), 0);
  399. for (int r = 0; r < row; ++r) {
  400. model->setItem(r, 0, new QStandardItem(matrixRows[r].name));
  401. nodes << model->item(r, 0)->text().trimmed();
  402. model->item(r, 0)->setToolTip(matrixRows[r].remark);
  403. model->item(r, 0)->setTextAlignment(Qt::AlignCenter);
  404. model->item(r, 0)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  405. for (int c = 1; c < col + 1; ++c) {
  406. AnalysisDataSource data;
  407. data.row = r;
  408. data.col = c;
  409. data.changed = true;
  410. if (nodeValueInfoList.size() > 0) {
  411. for (NodeMatrixInfo *nodeMatrixInfo : nodeValueInfoList) {
  412. if (nodeMatrixInfo->abscissa == matrixRows[r].name
  413. && nodeMatrixInfo->ordinate == matrixCols[c - 1].name) {
  414. data.nodeValue = nodeMatrixInfo->nodeValue;
  415. }
  416. }
  417. } else {
  418. // data.nodeValue = "0";
  419. data.nodeValue = "";
  420. }
  421. model->setItem(r, c, new QStandardItem(data.nodeValue));
  422. QStringList content = model->item(r, c)->text().trimmed().split("/");
  423. if (content.size() == 1) {
  424. nxn[r * col + c - 1] = content[0].toDouble();
  425. } else {
  426. nxn[r * col + c - 1] = content[0].toDouble() / content[1].toDouble();
  427. }
  428. model->item(r, c)->setTextAlignment(Qt::AlignCenter);
  429. model->item(r, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  430. data.node = matrixRows[r].node;
  431. data.abscissa = matrixRows[r].name;
  432. data.ordinate = matrixCols[c - 1].name;
  433. dataSource << data;
  434. }
  435. }
  436. ConsistencyCheck cc(nodes, nxn);
  437. for (int r = 0; r < row; ++r) {
  438. model->setItem(r, col + 1,
  439. new QStandardItem(QString::number(cc.getWieghts().at(r)) == "nan"
  440. ? ""
  441. : QString::number(cc.getWieghts().at(r))));
  442. model->item(r, col + 1)->setTextAlignment(Qt::AlignCenter);
  443. model->item(r, col + 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  444. qreal firstWeight = 0;
  445. if (m_firstTableWeight.size() > 0) {
  446. firstWeight = m_firstTableWeight.at(index - 1)->nodeWeight;
  447. }
  448. qreal value = cc.getWieghts().at(r) * firstWeight;
  449. model->setItem(r, col + 2,
  450. new QStandardItem(QString::number(value) == "nan" ? "" : QString::number(value)));
  451. model->item(r, col + 2)->setTextAlignment(Qt::AlignCenter);
  452. model->item(r, col + 2)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  453. }
  454. //校验成功持久化数据
  455. QStringList nodeList = cc.getNodes();
  456. QVector<qreal> weights = cc.getWieghts();
  457. QList<DemandWeight *> list;
  458. QList<DemandWeight *> firstList;
  459. // DBServiceSet().QueryByTableIndexAndTableMsg(&firstList, m_expertId, m_engineerId, 0, m_table_msg);
  460. NodeMatrixService().QueryByTableIndexAndTableMsg(&firstList, m_expertId, m_engineerId, page - 1, m_table_msg);
  461. double weight = 0;
  462. // if (firstList.size() != 0) {
  463. weight = m_firstTableWeight.at(index - 1)->nodeWeight;
  464. //}
  465. for (int i = 0; i < weights.length(); i++) {
  466. DemandWeight *demandWeight = new DemandWeight();
  467. demandWeight->nodeName = nodeList.at(i);
  468. demandWeight->nodeWeight = weights.at(i);
  469. demandWeight->engineerId = m_engineerId;
  470. demandWeight->expertId = m_expertId;
  471. demandWeight->isValid = 1;
  472. demandWeight->tableIndex = m_tableIndex;
  473. demandWeight->tableMsg = m_table_msg;
  474. demandWeight->nodeValue = demandWeight->nodeWeight * weight;
  475. demandWeight->pageIndex = page;
  476. list.append(demandWeight);
  477. }
  478. if (NodeMatrixService().QueryByTableIndexAndTableMsgAndPage(m_expertId, m_engineerId, m_tableIndex, m_table_msg,
  479. page)) {
  480. NodeMatrixService().UpdateNodeValueList(list);
  481. } else {
  482. NodeMatrixService().AddNodeWeightInfoList(list);
  483. }
  484. } else {
  485. model->setHorizontalHeaderItem(1, new QStandardItem("权重"));
  486. model->horizontalHeaderItem(1)->setToolTip("权重");
  487. for (int c = 0; c < col; ++c) {
  488. model->setHorizontalHeaderItem(c + 2, new QStandardItem(matrixCols[c].name));
  489. model->horizontalHeaderItem(c + 2)->setToolTip(matrixCols[c].remark);
  490. }
  491. for (int r = 0; r < row; ++r) {
  492. model->setItem(r, 0, new QStandardItem(matrixRows[r].name));
  493. model->item(r, 0)->setToolTip(matrixRows[r].remark);
  494. model->item(r, 0)->setTextAlignment(Qt::AlignCenter);
  495. model->item(r, 0)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  496. if (r >= m_secondTableWeight.count()) {
  497. model->setItem(r, 1, new QStandardItem("1"));
  498. } else {
  499. model->setItem(r, 1,
  500. new QStandardItem(QString::number(m_secondTableWeight.at(r)->nodeValue) == "nan"
  501. ? ""
  502. : QString::number(m_secondTableWeight.at(r)->nodeValue)));
  503. }
  504. model->item(r, 1)->setTextAlignment(Qt::AlignCenter);
  505. model->item(r, 1)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  506. for (int c = 2; c < col + 2; ++c) {
  507. AnalysisDataSource data;
  508. data.row = r;
  509. data.col = c;
  510. data.changed = true;
  511. if (nodeValueInfoList.size() > 0) {
  512. for (NodeMatrixInfo *nodeMatrixInfo : nodeValueInfoList) {
  513. if (nodeMatrixInfo->abscissa == matrixRows[r].name
  514. && nodeMatrixInfo->ordinate == matrixCols[c - 2].name) {
  515. data.nodeValue = nodeMatrixInfo->nodeValue;
  516. }
  517. }
  518. } else {
  519. data.nodeValue = "";
  520. }
  521. model->setItem(r, c, new QStandardItem(data.nodeValue));
  522. model->item(r, c)->setTextAlignment(Qt::AlignCenter);
  523. model->item(r, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  524. data.node = matrixRows[r].node;
  525. data.abscissa = matrixRows[r].name;
  526. data.ordinate = matrixCols[c - 2].name;
  527. dataSource << data;
  528. }
  529. }
  530. for (int c = 0; c < col + 2; ++c) {
  531. if (c == 0) {
  532. model->setItem(row, c, new QStandardItem("技术重要度"));
  533. } else if (c > 1 && c < col + 2) {
  534. qreal value = 0;
  535. for (int r = 0; r < row; r++) {
  536. if (r < m_secondTableWeight.count()) {
  537. QStandardItem *item = model->item(r, c);
  538. QStringList content = item->text().trimmed().split("/");
  539. double itemValue = 0;
  540. if (content.size() == 1) {
  541. itemValue = content[0].toDouble();
  542. } else {
  543. itemValue = content[0].toDouble() / content[1].toDouble();
  544. }
  545. double tempValue = 0;
  546. if (QString::number(m_secondTableWeight.at(r)->nodeValue) != "nan") {
  547. tempValue = m_secondTableWeight.at(r)->nodeValue;
  548. }
  549. value += itemValue * tempValue;
  550. }
  551. }
  552. model->setItem(row, c, new QStandardItem(QString::number(value)));
  553. } else {
  554. model->setItem(row, c, new QStandardItem(""));
  555. }
  556. model->item(row, c)->setTextAlignment(Qt::AlignCenter);
  557. model->item(row, c)->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
  558. }
  559. }
  560. emit returnModel(model);
  561. paintDone = true;
  562. // qDebug() << "--------ok";
  563. }
  564. void AnalysisTableWidget::nodeValueChanged(QStandardItem *item)
  565. {
  566. if (paintDone) {
  567. // qDebug() << item->column() << item->row() << item->text();
  568. }
  569. }
  570. bool AnalysisTableWidget::isDataReady() const
  571. {
  572. if (dataSource.count() == 0) {
  573. return false;
  574. }
  575. for (AnalysisDataSource data : dataSource) {
  576. if (data.changed == false) {
  577. return false;
  578. }
  579. }
  580. return true;
  581. }