AnalysisTableWidget.cpp 28 KB

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