MatrixPanelWidget.cpp 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  1. #include "MatrixPanelWidget.h"
  2. #include "MatrixTableTechMeasuresWidget.h"
  3. #include "MatrixTableWidget.h"
  4. #include "dbService/DBServiceSet.h"
  5. #include "ui_MatrixPanelWidget.h"
  6. #include <xlsxdocument.h>
  7. MatrixPanelWidget::MatrixPanelWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MatrixPanelWidget)
  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. ui->saveBtn->setDisabled(false);
  18. ui->exportBtn->setDisabled(true);
  19. ui->importBtn->setVisible(true);
  20. }
  21. MatrixPanelWidget::MatrixPanelWidget(QWidget *parent, ProfessorInfo professor)
  22. : QWidget(parent), ui(new Ui::MatrixPanelWidget)
  23. {
  24. ui->setupUi(this);
  25. firstLayout = new QGridLayout;
  26. firstPlainWidget = nullptr;
  27. ui->stackedWidget->widget(0)->setLayout(firstLayout);
  28. secondLayout = new QGridLayout;
  29. secondPlainWidget = nullptr;
  30. ui->stackedWidget->widget(1)->setLayout(secondLayout);
  31. ui->stackedWidget->setCurrentIndex(0);
  32. m_professor = professor;
  33. if (m_professor.tableMsg != "技术措施重要度评估对象") {
  34. ui->saveBtn->setDisabled(false);
  35. ui->exportBtn->setDisabled(true);
  36. }
  37. ui->importBtn->setVisible(false);
  38. ui->exportBtn->setVisible(false);
  39. }
  40. MatrixPanelWidget::~MatrixPanelWidget()
  41. {
  42. if (currentMindNodes) {
  43. delete currentMindNodes;
  44. }
  45. if (classifiedNodes) {
  46. delete classifiedNodes;
  47. }
  48. if (indexsRefClassifiedNodes) {
  49. delete indexsRefClassifiedNodes;
  50. }
  51. delete ui;
  52. }
  53. void MatrixPanelWidget::init(const QStringList indexsRef, const QStringList indexs)
  54. {
  55. qDebug() << "MatrixPanelWidget---init" << endl;
  56. indexsRefClassifiedNodes = nullptr;
  57. if (!indexsRef.isEmpty()) {
  58. MindNodeManager *indexsRefNodes = new MindNodeManager(); //是否参考指标体系
  59. getMindNodes(indexsRefNodes, indexsRef);
  60. indexsRefClassifiedNodes = new QList<QList<MindNodeManager::NodeMessage>>;
  61. sortMindNodes(*indexsRefNodes, indexsRefClassifiedNodes);
  62. delete indexsRefNodes;
  63. }
  64. if (!indexs.isEmpty()) {
  65. currentMindNodes = new MindNodeManager();
  66. classifiedNodes = new QList<QList<MindNodeManager::NodeMessage>>;
  67. getMindNodes(currentMindNodes, indexs);
  68. sortMindNodes(*currentMindNodes, classifiedNodes);
  69. } else {
  70. currentMindNodes = nullptr;
  71. classifiedNodes = nullptr;
  72. }
  73. ui->toatalPagesLabel->setText(QString("共%1页").arg(getPages()));
  74. ui->currPageLabel->setText(QString("当前第0页"));
  75. QList<NodeMatrixInfo *> nodeValueInfoList;
  76. // DBServiceSet().QueryNodeMatrixListByExpertIdAndEngineerId2(&nodeValueInfoList, m_professor.id,
  77. // m_professor.engineer.engineerId,
  78. // m_professor.tableMsg);
  79. if (!indexsRef.isEmpty()) {
  80. currentTab = "技术措施重要度评估对象";
  81. initPlainTechMeasuresWidget(nodeValueInfoList);
  82. setPage(1);
  83. return;
  84. }
  85. if (!indexs.isEmpty()) {
  86. currentTab = "";
  87. initPlainWidget(nodeValueInfoList);
  88. setPage(1);
  89. return;
  90. }
  91. }
  92. void MatrixPanelWidget::initImportData(const QStringList indexsRef, const QStringList indexs,
  93. QList<NodeMatrixInfo *> nodeValueInfoList)
  94. {
  95. // qDebug() << "MatrixPanelWidget---initImportData" << endl;
  96. indexsRefClassifiedNodes = nullptr;
  97. if (!indexsRef.isEmpty()) {
  98. MindNodeManager *indexsRefNodes = new MindNodeManager(); //是否参考指标体系
  99. getMindNodes(indexsRefNodes, indexsRef);
  100. indexsRefClassifiedNodes = new QList<QList<MindNodeManager::NodeMessage>>;
  101. sortMindNodes(*indexsRefNodes, indexsRefClassifiedNodes);
  102. delete indexsRefNodes;
  103. }
  104. if (!indexs.isEmpty()) {
  105. currentMindNodes = new MindNodeManager();
  106. classifiedNodes = new QList<QList<MindNodeManager::NodeMessage>>;
  107. getMindNodes(currentMindNodes, indexs);
  108. sortMindNodes(*currentMindNodes, classifiedNodes);
  109. } else {
  110. currentMindNodes = nullptr;
  111. classifiedNodes = nullptr;
  112. }
  113. ui->toatalPagesLabel->setText(QString("共%1页").arg(getPages()));
  114. ui->currPageLabel->setText(QString("当前第0页"));
  115. if (!indexsRef.isEmpty()) {
  116. currentTab = "技术措施重要度评估对象";
  117. qDebug() << "MatrixPanelWidget---init" << currentTab << endl;
  118. initPlainTechMeasuresWidget(nodeValueInfoList);
  119. setPage(1);
  120. return;
  121. }
  122. if (!indexs.isEmpty()) {
  123. currentTab = "";
  124. initPlainWidget(nodeValueInfoList);
  125. setPage(1);
  126. return;
  127. }
  128. }
  129. void MatrixPanelWidget::sortMindNodes(const MindNodeManager &manager,
  130. QList<QList<MindNodeManager::NodeMessage>> *classify)
  131. {
  132. for (MindNodeManager::NodeMessage msg : manager.getMindNodes()) {
  133. QStringList nodePonit = msg.node.split(".");
  134. while (nodePonit.count() - 1 > classify->count()) {
  135. (*classify) << QList<MindNodeManager::NodeMessage>();
  136. }
  137. (*classify)[nodePonit.count() - 2] << msg;
  138. }
  139. }
  140. void MatrixPanelWidget::getMindNodes(MindNodeManager *manager, QStringList listNodes)
  141. {
  142. int sn[16];
  143. memset(sn, 0, sizeof(int) * 16);
  144. int spaceNum = -1;
  145. int level = 0;
  146. MindNodeManager::NodeMessage temp;
  147. manager->setMindName(listNodes[0].trimmed());
  148. for (int i = 1; i < listNodes.count(); i++) {
  149. int tempSpace = 0;
  150. for (QString s : listNodes[i]) {
  151. if (s == " ") {
  152. tempSpace++;
  153. } else {
  154. break;
  155. }
  156. }
  157. tempSpace /= 4;
  158. if (tempSpace == 1) { //一级
  159. spaceNum = tempSpace;
  160. level = 0;
  161. sn[level]++;
  162. memset((void *)&sn[1], 0, sizeof(int) * 15);
  163. } else {
  164. if (spaceNum < tempSpace) { //空格增加
  165. spaceNum = tempSpace;
  166. level++;
  167. sn[level]++;
  168. } else if (spaceNum == tempSpace) { //同一级
  169. sn[level]++;
  170. } else {
  171. memset((void *)&sn[tempSpace], 0, sizeof(int) * (16 - tempSpace));
  172. level -= spaceNum - tempSpace;
  173. spaceNum = tempSpace;
  174. sn[level]++;
  175. }
  176. }
  177. QString node = "1";
  178. for (int l : sn) {
  179. if (l > 0) {
  180. node += QString(".%1").arg(l);
  181. } else {
  182. break;
  183. }
  184. }
  185. if (listNodes[i].trimmed().isEmpty()) {
  186. temp.name = QString("NULL(节点%1)").arg(node);
  187. temp.node = node;
  188. temp.remark = "";
  189. manager->pushNewMind(temp);
  190. } else {
  191. temp.name = listNodes[i].trimmed().split("\t")[0];
  192. temp.node = node;
  193. temp.remark = listNodes[i].trimmed().split("\t")[1];
  194. manager->pushNewMind(temp);
  195. }
  196. }
  197. }
  198. QStringList MatrixPanelWidget::getFirstIndexNodes(const MindNodeManager &manager)
  199. {
  200. QList<QList<MindNodeManager::NodeMessage>> classify;
  201. for (MindNodeManager::NodeMessage msg : manager.getMindNodes()) {
  202. QStringList nodePonit = msg.node.split(".");
  203. while (nodePonit.count() - 1 > classify.count()) {
  204. classify << QList<MindNodeManager::NodeMessage>();
  205. }
  206. classify[nodePonit.count() - 2] << msg;
  207. }
  208. QStringList firstNodes;
  209. for (MindNodeManager::NodeMessage msg : classify.first()) {
  210. firstNodes << msg.name;
  211. }
  212. return firstNodes;
  213. }
  214. QStringList MatrixPanelWidget::getLastIndexNodes(const MindNodeManager &manager)
  215. {
  216. QList<QList<MindNodeManager::NodeMessage>> classify;
  217. for (MindNodeManager::NodeMessage msg : manager.getMindNodes()) {
  218. QStringList nodePonit = msg.node.split(".");
  219. while (nodePonit.count() - 1 > classify.count()) {
  220. classify << QList<MindNodeManager::NodeMessage>();
  221. }
  222. classify[nodePonit.count() - 2] << msg;
  223. }
  224. QStringList lastNodes;
  225. for (MindNodeManager::NodeMessage msg : classify.last()) {
  226. lastNodes << msg.name;
  227. }
  228. return lastNodes;
  229. }
  230. int MatrixPanelWidget::getPages()
  231. {
  232. #if 0
  233. int max = 0;
  234. for (MindNodeManager::NodeMessage msg : currentMindNodes->getMindNodes()) {
  235. QStringList nodePonit = msg.node.split(".");
  236. if (max < nodePonit.count() - 1) { max = nodePonit.count() - 1; }
  237. }
  238. return max;
  239. #else
  240. if (!classifiedNodes) {
  241. return 0;
  242. }
  243. int pages = classifiedNodes->count();
  244. if (pages == 1) {
  245. ui->nextPageBtn->setVisible(false);
  246. ui->prePageBtn->setVisible(false);
  247. }
  248. return classifiedNodes->count();
  249. #endif
  250. }
  251. void MatrixPanelWidget::setPage(int page)
  252. {
  253. if (page < 1 || page > getPages()) {
  254. return;
  255. }
  256. currentPage = page;
  257. ui->currPageLabel->setText(QString("当前第%1页").arg(currentPage));
  258. if (currentPage == 1) {
  259. ui->prePageBtn->setDisabled(true);
  260. ui->nextPageBtn->setDisabled(false);
  261. } else if (currentPage == getPages()) {
  262. ui->prePageBtn->setDisabled(false);
  263. ui->nextPageBtn->setDisabled(true);
  264. } else {
  265. ui->prePageBtn->setDisabled(false);
  266. ui->nextPageBtn->setDisabled(false);
  267. }
  268. paintPlainWidget();
  269. }
  270. //能力重要度评估指标体系初始化
  271. void MatrixPanelWidget::initPlainWidget(QList<NodeMatrixInfo *> nodeValueInfoList)
  272. {
  273. qDeleteAll(modelList);
  274. modelList.clear();
  275. if (getPages() == 0) {
  276. return;
  277. }
  278. if (nodeValueInfoList.size() > 0) {
  279. ui->saveBtn->setDisabled(false);
  280. ui->exportBtn->setDisabled(false);
  281. isAutoSave = true;
  282. }
  283. //准备第一页,非tab的
  284. MatrixTableWidget *table = new MatrixTableWidget((indexsRefClassifiedNodes == nullptr), nullptr);
  285. table->setCurrentPage(1);
  286. table->setMsgName("总体");
  287. table->setTableIndexAndTableMsg(0, m_professor.engineer.engineerId, m_professor.id, m_table_msg);
  288. connect(table, &MatrixTableWidget::dataReady, this, &MatrixPanelWidget::oneTableDataReady);
  289. // connect(table, &MatrixTableWidget::autoSave, this, &MatrixPanelWidget::oneTableDataSave);
  290. connect(table, &MatrixTableWidget::returnModel, this, &MatrixPanelWidget::getTableModel);
  291. connect(table, &MatrixTableWidget::returnModelName, this, &MatrixPanelWidget::getTableModelName);
  292. if (indexsRefClassifiedNodes) {
  293. for (MindNodeManager::NodeMessage msg : indexsRefClassifiedNodes->last()) {
  294. // qDebug() << msg.node << msg.name << msg.remark;
  295. table->addRowNode(msg.node, msg.name, msg.remark);
  296. }
  297. }
  298. for (MindNodeManager::NodeMessage msg : classifiedNodes->first()) {
  299. table->addColNode(msg.node, msg.name, msg.remark);
  300. if (indexsRefClassifiedNodes == nullptr) {
  301. table->addRowNode(msg.node, msg.name, msg.remark);
  302. }
  303. }
  304. DBServiceSet().QueryNodesByExpertNameAndEngineerId2(&nodeValueInfoList, m_professor.name,
  305. m_professor.engineer.engineerId, m_professor.tableMsg, "1", 0);
  306. table->paintMatrixTable(nodeValueInfoList);
  307. firstLayout->addWidget(table);
  308. qDeleteAll(nodeValueInfoList);
  309. nodeValueInfoList.clear();
  310. //准备第二页,tab组合的
  311. for (int p = 1; p < getPages(); ++p) {
  312. QTabWidget *tab = new QTabWidget;
  313. tab->setTabPosition(QTabWidget::South);
  314. int index = 0;
  315. for (MindNodeManager::NodeMessage msg : classifiedNodes->at(p - 1)) {
  316. ++index;
  317. QString node = msg.node;
  318. // MatrixTableWidget *table = nullptr;
  319. table = nullptr;
  320. for (MindNodeManager::NodeMessage info : classifiedNodes->at(p)) {
  321. if ((info.node.count('.') == msg.node.count('.') + 1)
  322. && (info.node.left(msg.node.count()) == msg.node)) {
  323. if (!table) {
  324. table = new MatrixTableWidget((indexsRefClassifiedNodes == nullptr), nullptr);
  325. connect(table, &MatrixTableWidget::returnModel, this, &MatrixPanelWidget::getTableModel);
  326. connect(table, &MatrixTableWidget::returnModelName, this,
  327. &MatrixPanelWidget::getTableModelName);
  328. table->setCurrentPage(2);
  329. table->setTableIndexAndTableMsg(index, m_professor.engineer.engineerId, m_professor.id,
  330. m_table_msg);
  331. }
  332. if (table) {
  333. table->addColNode(info.node, info.name, info.remark);
  334. if (!indexsRefClassifiedNodes) {
  335. table->addRowNode(info.node, info.name, info.remark);
  336. }
  337. }
  338. }
  339. }
  340. if (indexsRefClassifiedNodes) {
  341. for (MindNodeManager::NodeMessage msg : indexsRefClassifiedNodes->last()) {
  342. table->addRowNode(msg.node, msg.name, msg.remark);
  343. }
  344. }
  345. if (table) {
  346. table->setMsgName(msg.name);
  347. // qDebug() << "专家界面tab" << msg.name;
  348. DBServiceSet().QueryNodesByExpertNameAndEngineerId2(
  349. &nodeValueInfoList, m_professor.name, m_professor.engineer.engineerId, m_professor.tableMsg,
  350. QString::number(p + 1), index - 1);
  351. table->paintMatrixTable(nodeValueInfoList);
  352. tab->addTab(table, msg.name);
  353. qDebug() << "tabmes===" << msg.name;
  354. connect(table, &MatrixTableWidget::dataReady, this, &MatrixPanelWidget::oneTableDataReady);
  355. qDeleteAll(nodeValueInfoList);
  356. nodeValueInfoList.clear();
  357. }
  358. }
  359. tabWidgets << tab;
  360. }
  361. // secondLayout->addWidget(tab);
  362. }
  363. void MatrixPanelWidget::initPlainTechMeasuresWidget(QList<NodeMatrixInfo *> nodeValueInfoList)
  364. {
  365. qDeleteAll(modelList);
  366. modelList.clear();
  367. // qDebug() << "initPlainTechMeasuresWidget" << endl;
  368. if (getPages() == 0) {
  369. return;
  370. }
  371. if (nodeValueInfoList.size() > 0) {
  372. ui->saveBtn->setDisabled(false);
  373. ui->exportBtn->setDisabled(false);
  374. }
  375. //准备第一页,非tab的
  376. MatrixTableTechMeasuresWidget *table = new MatrixTableTechMeasuresWidget(nullptr);
  377. connect(table, &MatrixTableTechMeasuresWidget::dataReady, this, &MatrixPanelWidget::oneTechMeasureTableDataReady);
  378. connect(table, &MatrixTableTechMeasuresWidget::returnModel, this, &MatrixPanelWidget::getTableModel);
  379. connect(table, &MatrixTableTechMeasuresWidget::returnModelName, this, &MatrixPanelWidget::getTableModelName);
  380. if (indexsRefClassifiedNodes) {
  381. for (MindNodeManager::NodeMessage msg : indexsRefClassifiedNodes->last()) {
  382. // qDebug() << "mes.node" << msg.name;
  383. table->addRowNode(msg.node, msg.name, msg.remark);
  384. }
  385. }
  386. for (MindNodeManager::NodeMessage msg : classifiedNodes->first()) {
  387. // qDebug() << "mes.node" << msg.name;
  388. table->addColNode(msg.node, msg.name, msg.remark);
  389. technicalCols.append(msg);
  390. if (indexsRefClassifiedNodes == nullptr) {
  391. table->addRowNode(msg.node, msg.name, msg.remark);
  392. }
  393. }
  394. DBServiceSet().QueryNodesByExpertNameAndEngineerId2(&nodeValueInfoList, m_professor.name,
  395. m_professor.engineer.engineerId, m_professor.tableMsg, "1", 0);
  396. table->setTableName("总体");
  397. table->paintMatrixTable(nodeValueInfoList);
  398. firstLayout->addWidget(table);
  399. qDeleteAll(nodeValueInfoList);
  400. nodeValueInfoList.clear();
  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 MatrixTableTechMeasuresWidget(nullptr);
  416. connect(table, &MatrixTableTechMeasuresWidget::returnModel, this,
  417. &MatrixPanelWidget::getTableModel);
  418. connect(table, &MatrixTableTechMeasuresWidget::returnModelName, this,
  419. &MatrixPanelWidget::getTableModelName);
  420. }
  421. if (table) {
  422. table->addColNode(info.node, info.name, info.remark);
  423. if (!indexsRefClassifiedNodes) {
  424. table->addRowNode(info.node, info.name, info.remark);
  425. }
  426. }
  427. }
  428. }
  429. if (indexsRefClassifiedNodes) {
  430. for (MindNodeManager::NodeMessage msg : indexsRefClassifiedNodes->last()) {
  431. table->addRowNode(msg.node, msg.name, msg.remark);
  432. }
  433. }
  434. if (table) {
  435. DBServiceSet().QueryNodesByExpertNameAndEngineerId2(
  436. &nodeValueInfoList, m_professor.name, m_professor.engineer.engineerId, m_professor.tableMsg,
  437. QString::number(p + 1), index - 1);
  438. table->setTableName(msg.name);
  439. table->paintMatrixTable(nodeValueInfoList);
  440. tab->addTab(table, msg.name);
  441. connect(table, &MatrixTableTechMeasuresWidget::dataReady, this,
  442. &MatrixPanelWidget::oneTechMeasureTableDataReady);
  443. qDeleteAll(nodeValueInfoList);
  444. nodeValueInfoList.clear();
  445. }
  446. }
  447. tabWidgets << tab;
  448. }
  449. // secondLayout->addWidget(tab);
  450. }
  451. bool MatrixPanelWidget::checkTableDateReady()
  452. {
  453. bool filled = true;
  454. if (m_table_msg == "技术措施重要度评估对象") {
  455. MatrixTableTechMeasuresWidget *first =
  456. qobject_cast<MatrixTableTechMeasuresWidget *>(firstLayout->itemAt(0)->widget());
  457. if (!first->isDataReady()) {
  458. filled = false;
  459. }
  460. for (QTabWidget *tab : tabWidgets) {
  461. for (int t = 0; t < tab->count(); ++t) {
  462. MatrixTableTechMeasuresWidget *table = qobject_cast<MatrixTableTechMeasuresWidget *>(tab->widget(t));
  463. if (!table->isDataReady()) {
  464. filled = false;
  465. }
  466. }
  467. }
  468. } else {
  469. MatrixTableWidget *first = qobject_cast<MatrixTableWidget *>(firstLayout->itemAt(0)->widget());
  470. if (!first->isDataReady()) {
  471. filled = false;
  472. }
  473. for (QTabWidget *tab : tabWidgets) {
  474. for (int t = 0; t < tab->count(); ++t) {
  475. MatrixTableWidget *table = qobject_cast<MatrixTableWidget *>(tab->widget(t));
  476. if (!table->isDataReady()) {
  477. filled = false;
  478. }
  479. }
  480. }
  481. }
  482. return filled;
  483. }
  484. void MatrixPanelWidget::paintPlainWidget()
  485. {
  486. bool firstShow = true;
  487. if (getPages() == 0) {
  488. return;
  489. }
  490. if (currentPage > 1) {
  491. firstShow = false;
  492. }
  493. if (firstShow) {
  494. ui->stackedWidget->setCurrentIndex(0);
  495. } else {
  496. QTabWidget *newTab = tabWidgets.at(currentPage - 2);
  497. if (secondLayout->count() == 0) {
  498. secondLayout->addWidget(newTab);
  499. newTab->show();
  500. } else {
  501. QTabWidget *currTab = qobject_cast<QTabWidget *>(secondLayout->itemAt(0)->widget());
  502. if (newTab == currTab) {
  503. qDebug() << "same tab";
  504. } else {
  505. secondLayout->removeWidget(currTab);
  506. currTab->hide();
  507. secondLayout->addWidget(newTab);
  508. newTab->show();
  509. }
  510. }
  511. ui->stackedWidget->setCurrentIndex(1);
  512. }
  513. }
  514. void MatrixPanelWidget::on_prePageBtn_clicked()
  515. {
  516. setPage(currentPage - 1);
  517. }
  518. void MatrixPanelWidget::on_nextPageBtn_clicked()
  519. {
  520. setPage(currentPage + 1);
  521. }
  522. void MatrixPanelWidget::setTableMsg(QString tableMsg)
  523. {
  524. m_table_msg = tableMsg;
  525. }
  526. //采集完成保存
  527. void MatrixPanelWidget::on_saveBtn_clicked()
  528. {
  529. bool saveFlag = true;
  530. int tabIndex = 0;
  531. QList<NodeMatrixInfo *> nodeInfoList;
  532. if (currentTab == "技术措施重要度评估对象") {
  533. if (currentPage == 1) {
  534. MatrixTableTechMeasuresWidget *first =
  535. qobject_cast<MatrixTableTechMeasuresWidget *>(firstLayout->itemAt(0)->widget());
  536. //保存第一页数据
  537. for (MatrixDataSource s : first->getSource()) {
  538. NodeMatrixInfo *t = new NodeMatrixInfo();
  539. t->abscissa = s.abscissa;
  540. t->ordinate = s.ordinate;
  541. t->node = s.node;
  542. t->nodeValue = s.nodeValue == "" ? "0" : s.nodeValue;
  543. t->expertId = QString::number(m_professor.id);
  544. t->expertName = m_professor.name;
  545. t->engineerId = m_professor.engineer.engineerId;
  546. t->writeDate = m_professor.createDataTime;
  547. t->mark = "1";
  548. t->tableMsg = m_professor.tableMsg;
  549. t->tabIndex = tabIndex;
  550. nodeInfoList.append(t);
  551. if (t->nodeValue.isEmpty()) {
  552. saveFlag = false;
  553. }
  554. }
  555. } else {
  556. QTabWidget *currTab = qobject_cast<QTabWidget *>(secondLayout->itemAt(0)->widget());
  557. tabIndex = currTab->currentIndex();
  558. //保存第二页数据,如果有
  559. // for (QTabWidget *tabWidget : tabWidgets) {
  560. for (int ta = 0; ta < tabWidgets.count(); ta++) {
  561. if (ta + 2 == currentPage) {
  562. for (int i = 0; i < tabWidgets[ta]->count(); ++i) {
  563. MatrixTableTechMeasuresWidget *table =
  564. dynamic_cast<MatrixTableTechMeasuresWidget *>(tabWidgets[ta]->widget(tabIndex));
  565. for (MatrixDataSource s : table->getSource()) {
  566. NodeMatrixInfo *t = new NodeMatrixInfo();
  567. t->abscissa = s.abscissa;
  568. t->ordinate = s.ordinate;
  569. t->node = s.node;
  570. t->nodeValue = s.nodeValue == "" ? "0" : s.nodeValue;
  571. t->expertId = QString::number(m_professor.id);
  572. t->expertName = m_professor.name;
  573. t->engineerId = m_professor.engineer.engineerId;
  574. t->writeDate = m_professor.createDataTime;
  575. t->mark = QString::number(currentPage);
  576. t->tableMsg = m_professor.tableMsg;
  577. t->tabIndex = tabIndex;
  578. nodeInfoList.append(t);
  579. if (t->nodeValue.isEmpty()) {
  580. saveFlag = false;
  581. }
  582. }
  583. }
  584. }
  585. }
  586. }
  587. } else {
  588. //能力重要度
  589. if (currentPage == 1) {
  590. MatrixTableWidget *first = qobject_cast<MatrixTableWidget *>(firstLayout->itemAt(0)->widget());
  591. //保存第一页数据
  592. for (MatrixDataSource s : first->getSource()) {
  593. NodeMatrixInfo *t = new NodeMatrixInfo();
  594. t->abscissa = s.abscissa;
  595. t->ordinate = s.ordinate;
  596. t->node = s.node;
  597. t->nodeValue = s.nodeValue;
  598. t->expertId = QString::number(m_professor.id);
  599. t->expertName = m_professor.name;
  600. t->engineerId = m_professor.engineer.engineerId;
  601. t->writeDate = m_professor.createDataTime;
  602. t->mark = "1";
  603. t->tableMsg = m_professor.tableMsg;
  604. t->tabIndex = tabIndex;
  605. nodeInfoList.append(t);
  606. if (t->nodeValue.isEmpty()) {
  607. saveFlag = false;
  608. }
  609. }
  610. } else {
  611. qDebug() << "currentPage--------" << currentPage;
  612. QTabWidget *currTab = qobject_cast<QTabWidget *>(secondLayout->itemAt(0)->widget());
  613. tabIndex = currTab->currentIndex();
  614. //保存第二页数据,如果有
  615. // for (QTabWidget *tabWidget : tabWidgets) {
  616. for (int ta = 0; ta < tabWidgets.count(); ta++) {
  617. if (ta + 2 == currentPage) {
  618. qDebug() << "----" << tabWidgets[ta]->count();
  619. MatrixTableWidget *table = dynamic_cast<MatrixTableWidget *>(tabWidgets[ta]->widget(tabIndex));
  620. for (MatrixDataSource s : table->getSource()) {
  621. NodeMatrixInfo *t = new NodeMatrixInfo();
  622. t->abscissa = s.abscissa;
  623. t->ordinate = s.ordinate;
  624. t->node = s.node;
  625. t->nodeValue = s.nodeValue;
  626. t->expertId = QString::number(m_professor.id);
  627. t->expertName = m_professor.name;
  628. t->engineerId = m_professor.engineer.engineerId;
  629. t->writeDate = m_professor.createDataTime;
  630. t->mark = QString::number(currentPage);
  631. t->tableMsg = m_professor.tableMsg;
  632. t->tabIndex = tabIndex;
  633. qDebug() << t->abscissa << "----" << t->ordinate << "-----" << t->node << "-----"
  634. << t->nodeValue;
  635. nodeInfoList.append(t);
  636. if (t->nodeValue.isEmpty()) {
  637. saveFlag = false;
  638. }
  639. }
  640. }
  641. }
  642. }
  643. }
  644. if (saveFlag) {
  645. if (DBServiceSet().QueryNodeMatrixListByExpertNameAndEngineerId2(
  646. m_professor.name, m_professor.engineer.engineerId, m_professor.tableMsg,
  647. QString::number(currentPage), tabIndex)) {
  648. qDebug() << "存在数据";
  649. DBServiceSet().UpdateNodeMatrixNodeValueList2(nodeInfoList);
  650. } else {
  651. qDebug() << "新插入数据";
  652. DBServiceSet().AddNodeMatrixInfoList2(nodeInfoList);
  653. }
  654. } else {
  655. QMessageBox::warning(this, "警告", "请先填写数据,保证数据完整性!");
  656. return;
  657. }
  658. QMessageBox::information(this, tr("成功"), tr("数据保存成功"));
  659. qDeleteAll(nodeInfoList);
  660. }
  661. void MatrixPanelWidget::saveNodes()
  662. {
  663. if (currentTab == "技术措施重要度评估对象") {
  664. // qDebug() << "技术措施---保存" << endl;
  665. int tabIndex = 0;
  666. QList<NodeMatrixInfo *> nodeInfoList;
  667. MatrixTableTechMeasuresWidget *first =
  668. qobject_cast<MatrixTableTechMeasuresWidget *>(firstLayout->itemAt(0)->widget());
  669. //保存第一页数据
  670. for (MatrixDataSource s : first->getSource()) {
  671. NodeMatrixInfo *t = new NodeMatrixInfo();
  672. t->abscissa = s.abscissa;
  673. t->ordinate = s.ordinate;
  674. t->node = s.node;
  675. t->nodeValue = s.nodeValue == "" ? "0" : s.nodeValue;
  676. t->expertId = QString::number(m_professor.id);
  677. t->expertName = m_professor.name;
  678. t->engineerId = m_professor.engineer.engineerId;
  679. t->writeDate = m_professor.createDataTime;
  680. t->mark = "1";
  681. t->tableMsg = m_professor.tableMsg;
  682. t->tabIndex = tabIndex;
  683. nodeInfoList.append(t);
  684. }
  685. if (DBServiceSet().QueryNodeMatrixListByExpertNameAndEngineerId2(
  686. m_professor.name, m_professor.engineer.engineerId, m_professor.tableMsg, "1", tabIndex)) {
  687. qDebug() << "存在数据";
  688. DBServiceSet().UpdateNodeMatrixNodeValueList2(nodeInfoList);
  689. } else {
  690. qDebug() << "新插入数据";
  691. DBServiceSet().AddNodeMatrixInfoList2(nodeInfoList);
  692. }
  693. //保存第二页数据,如果有
  694. // for (QTabWidget *tabWidget : tabWidgets) {
  695. for (int ta = 0; ta < tabWidgets.count(); ta++) {
  696. for (int i = 0; i < tabWidgets[ta]->count(); i++) {
  697. QList<NodeMatrixInfo *> secondNodeInfoList;
  698. secondNodeInfoList.clear();
  699. MatrixTableTechMeasuresWidget *table =
  700. dynamic_cast<MatrixTableTechMeasuresWidget *>(tabWidgets[ta]->widget(i));
  701. for (MatrixDataSource s : table->getSource()) {
  702. NodeMatrixInfo *t = new NodeMatrixInfo();
  703. t->abscissa = s.abscissa;
  704. t->ordinate = s.ordinate;
  705. t->node = s.node;
  706. t->nodeValue = s.nodeValue == "" ? "0" : s.nodeValue;
  707. t->expertId = QString::number(m_professor.id);
  708. t->expertName = m_professor.name;
  709. t->engineerId = m_professor.engineer.engineerId;
  710. t->writeDate = m_professor.createDataTime;
  711. t->mark = QString::number(ta + 2);
  712. t->tableMsg = m_professor.tableMsg;
  713. t->tabIndex = i;
  714. secondNodeInfoList.append(t);
  715. }
  716. if (DBServiceSet().QueryNodeMatrixListByExpertNameAndEngineerId2(
  717. m_professor.name, m_professor.engineer.engineerId, m_professor.tableMsg,
  718. QString::number(ta + 2), i)) {
  719. qDebug() << "存在数据";
  720. DBServiceSet().UpdateNodeMatrixNodeValueList2(secondNodeInfoList);
  721. } else {
  722. qDebug() << "新插入数据";
  723. DBServiceSet().AddNodeMatrixInfoList2(secondNodeInfoList);
  724. }
  725. }
  726. }
  727. } else {
  728. QList<NodeMatrixInfo *> nodeInfoList;
  729. MatrixTableWidget *first = qobject_cast<MatrixTableWidget *>(firstLayout->itemAt(0)->widget());
  730. //保存第一页数据
  731. int tabIndex = 0;
  732. for (MatrixDataSource s : first->getSource()) {
  733. NodeMatrixInfo *t = new NodeMatrixInfo();
  734. t->abscissa = s.abscissa;
  735. t->ordinate = s.ordinate;
  736. t->node = s.node;
  737. t->nodeValue = s.nodeValue;
  738. t->expertId = QString::number(m_professor.id);
  739. t->expertName = m_professor.name;
  740. t->engineerId = m_professor.engineer.engineerId;
  741. t->writeDate = m_professor.createDataTime;
  742. t->mark = "1";
  743. t->tableMsg = m_professor.tableMsg;
  744. t->tabIndex = tabIndex;
  745. nodeInfoList.append(t);
  746. }
  747. if (DBServiceSet().QueryNodeMatrixListByExpertNameAndEngineerId2(
  748. m_professor.name, m_professor.engineer.engineerId, m_professor.tableMsg, "1", tabIndex)) {
  749. qDebug() << "存在数据";
  750. DBServiceSet().UpdateNodeMatrixNodeValueList2(nodeInfoList);
  751. } else {
  752. qDebug() << "新插入数据";
  753. DBServiceSet().AddNodeMatrixInfoList2(nodeInfoList);
  754. }
  755. qDeleteAll(nodeInfoList);
  756. //保存第二页数据,如果有
  757. // for (QTabWidget *tabWidget : tabWidgets) {
  758. for (int ta = 0; ta < tabWidgets.count(); ta++) {
  759. for (int i = 0; i < tabWidgets[ta]->count(); i++) {
  760. QList<NodeMatrixInfo *> secondNodeInfoList;
  761. secondNodeInfoList.clear();
  762. MatrixTableWidget *table = dynamic_cast<MatrixTableWidget *>(tabWidgets[ta]->widget(i));
  763. for (MatrixDataSource s : table->getSource()) {
  764. NodeMatrixInfo *t = new NodeMatrixInfo();
  765. t->abscissa = s.abscissa;
  766. t->ordinate = s.ordinate;
  767. t->node = s.node;
  768. t->nodeValue = s.nodeValue;
  769. t->expertId = QString::number(m_professor.id);
  770. t->expertName = m_professor.name;
  771. t->engineerId = m_professor.engineer.engineerId;
  772. t->writeDate = m_professor.createDataTime;
  773. t->mark = QString::number(ta + 2);
  774. t->tableMsg = m_professor.tableMsg;
  775. t->tabIndex = i;
  776. secondNodeInfoList.append(t);
  777. }
  778. if (DBServiceSet().QueryNodeMatrixListByExpertNameAndEngineerId2(
  779. m_professor.name, m_professor.engineer.engineerId, m_professor.tableMsg,
  780. QString::number(ta + 2), i)) {
  781. qDebug() << "存在数据";
  782. DBServiceSet().UpdateNodeMatrixNodeValueList2(secondNodeInfoList);
  783. } else {
  784. qDebug() << "新插入数据";
  785. DBServiceSet().AddNodeMatrixInfoList2(secondNodeInfoList);
  786. }
  787. qDeleteAll(secondNodeInfoList);
  788. }
  789. }
  790. }
  791. }
  792. void MatrixPanelWidget::oneTableDataSave()
  793. {
  794. if (isAutoSave) {
  795. on_saveBtn_clicked();
  796. }
  797. }
  798. void MatrixPanelWidget::oneTableDataReady(bool status)
  799. {
  800. if (status) {
  801. bool filled = true;
  802. MatrixTableWidget *first = qobject_cast<MatrixTableWidget *>(firstLayout->itemAt(0)->widget());
  803. if (!first->isDataReady()) {
  804. filled = false;
  805. }
  806. for (QTabWidget *tab : tabWidgets) {
  807. for (int t = 0; t < tab->count(); ++t) {
  808. MatrixTableWidget *table = qobject_cast<MatrixTableWidget *>(tab->widget(t));
  809. if (!table->isDataReady()) {
  810. filled = false;
  811. }
  812. }
  813. }
  814. if (filled) {
  815. ui->saveBtn->setDisabled(false);
  816. ui->exportBtn->setDisabled(false);
  817. } else {
  818. ui->saveBtn->setDisabled(false);
  819. ui->exportBtn->setDisabled(true);
  820. }
  821. } else {
  822. ui->saveBtn->setDisabled(false);
  823. ui->exportBtn->setDisabled(true);
  824. }
  825. }
  826. void MatrixPanelWidget::oneTechMeasureTableDataReady(bool status)
  827. {
  828. if (status) {
  829. bool filled = true;
  830. MatrixTableTechMeasuresWidget *first =
  831. qobject_cast<MatrixTableTechMeasuresWidget *>(firstLayout->itemAt(0)->widget());
  832. if (!first->isDataReady()) {
  833. filled = false;
  834. }
  835. for (QTabWidget *tab : tabWidgets) {
  836. for (int t = 0; t < tab->count(); ++t) {
  837. MatrixTableTechMeasuresWidget *table = qobject_cast<MatrixTableTechMeasuresWidget *>(tab->widget(t));
  838. if (!table->isDataReady()) {
  839. filled = false;
  840. }
  841. }
  842. }
  843. if (filled) {
  844. ui->saveBtn->setDisabled(false);
  845. ui->exportBtn->setDisabled(false);
  846. } else {
  847. ui->saveBtn->setDisabled(false);
  848. ui->exportBtn->setDisabled(true);
  849. }
  850. } else {
  851. ui->saveBtn->setDisabled(false);
  852. ui->exportBtn->setDisabled(true);
  853. }
  854. }
  855. void MatrixPanelWidget::getTableModel(QStandardItemModel *item)
  856. {
  857. modelList.append(item);
  858. }
  859. void MatrixPanelWidget::getTableModelName(QString itemName)
  860. {
  861. qDebug() << "-----tabeName----" << itemName;
  862. modelName.append(itemName);
  863. }
  864. //导出table数据
  865. void MatrixPanelWidget::on_exportBtn_clicked()
  866. {
  867. if (!checkTableDateReady()) {
  868. QMessageBox::warning(this, "警告", "请确保xlsx数据的完整性!");
  869. return;
  870. }
  871. //文件夹路径
  872. QFileDialog::Options options;
  873. options |= QFileDialog::DontUseNativeDialog;
  874. QString filePath = QFileDialog::getExistingDirectory(nullptr, "导出资源包", "/", options);
  875. if (filePath.isEmpty()) {
  876. return;
  877. }
  878. QString fileName = m_professor.name + "-" + m_table_msg + "-" + m_professor.engineer.engineerName;
  879. // QString filePath = "";
  880. // filePath = QCoreApplication::applicationDirPath();
  881. QDir dirReportPath(filePath);
  882. if (!dirReportPath.exists()) {
  883. if (dirReportPath.mkpath(filePath)) {
  884. filePath = filePath + "/" + fileName + tr(".xlsx");
  885. }
  886. } else {
  887. filePath = filePath + "/" + fileName + tr(".xlsx");
  888. }
  889. QFile file(fileName);
  890. if (file.exists()) {
  891. file.remove();
  892. }
  893. QXlsx::Format format;
  894. format.setFontSize(12); //字体大小
  895. // format.setFontBold(true); //加粗
  896. // format.setFontColor(QColor(73, 88, 233)); //颜色
  897. // 可以用rgb,也可以用系统自带 QColor(Qt::red)
  898. format.setHorizontalAlignment(QXlsx::Format::AlignHCenter); //水平居中
  899. format.setVerticalAlignment(QXlsx::Format::AlignVCenter); //垂直居中
  900. QXlsx::Document exprot;
  901. //判断是否需要多sheet页
  902. // QList<QString> strList;
  903. // qDebug() << "modelListSize-----------------" << modelList.size();
  904. // if (modelList.size() > 1) {
  905. // QStandardItemModel *model = modelList.at(0);
  906. // for (int c = 0; c < model->columnCount(); c++) {
  907. // QStandardItem *head = model->horizontalHeaderItem(c);
  908. // if (head != nullptr) {
  909. // strList.append(head->text() == "" ? "总体" : head->text());
  910. // qDebug() << "modelListSize-----------------" << head->text();
  911. // }
  912. // }
  913. // } else {
  914. // strList.append("总体");
  915. // }
  916. for (int i = 0; i < modelList.size(); i++) {
  917. QStandardItemModel *model = modelList.at(i);
  918. // qDebug() << strList.at(i);
  919. exprot.addSheet(modelName.at(i));
  920. int row = model->rowCount();
  921. int col = model->columnCount();
  922. //先把表头获取到添加
  923. for (int c = 1; c < col + 1; c++) {
  924. QStandardItem *head = model->horizontalHeaderItem(c - 1);
  925. exprot.write(1, c, head->text(), format);
  926. exprot.setColumnWidth(c, head->text().size() == 0 ? 40 : head->text().size() * 4);
  927. }
  928. for (int r = 2; r < row + 2; r++) {
  929. for (int c = 1; c < col + 1; c++) {
  930. QStandardItem *item = model->item(r - 2, c - 1);
  931. exprot.write(r, c, item->text(), format);
  932. }
  933. }
  934. }
  935. //添加专家基本信息
  936. exprot.addSheet("专家信息");
  937. exprot.write(1, 1, "ID", format);
  938. exprot.write(1, 2, "账号", format);
  939. exprot.write(1, 3, "单位", format);
  940. exprot.write(1, 4, "职务", format);
  941. exprot.write(1, 5, "专业", format);
  942. exprot.write(1, 6, "联系方式", format);
  943. exprot.write(1, 7, "填写时间", format);
  944. exprot.write(1, 8, "备注", format);
  945. exprot.write(2, 1, m_professor.id, format);
  946. exprot.write(2, 2, m_professor.name, format);
  947. exprot.write(2, 3, m_professor.department, format);
  948. exprot.write(2, 4, m_professor.job, format);
  949. exprot.write(2, 5, m_professor.major, format);
  950. exprot.write(2, 6, m_professor.phone, format);
  951. exprot.write(2, 7, m_professor.createDataTime, format);
  952. exprot.write(2, 8, m_professor.remark, format);
  953. exprot.saveAs(filePath);
  954. QMessageBox::information(this, tr("成功"), tr("数据导出成功"));
  955. saveNodes();
  956. }
  957. //导入数据
  958. void MatrixPanelWidget::on_importBtn_clicked()
  959. {
  960. //打开文件
  961. QDir dir;
  962. QFileDialog::Options options;
  963. options |= QFileDialog::DontUseNativeDialog;
  964. QString selectedFilter;
  965. QString fileName =
  966. QFileDialog::getOpenFileName(this, "选择Excel文件", "", "Excel (*.xls *.xlsx)", &selectedFilter, options);
  967. if (fileName.isEmpty())
  968. return;
  969. //获取node节点
  970. QList<NodeMatrixInfo *> nodeValueInfoList;
  971. DBServiceSet().QueryNodeMatrixListByExpertNameAndEngineerId(&nodeValueInfoList, m_professor.name,
  972. m_professor.engineer.engineerId);
  973. //读取文件内容
  974. QXlsx::Document xlsxR(fileName);
  975. QStringList str = xlsxR.sheetNames();
  976. //遍历sheet页
  977. for (int i = 0; i < str.size(); i++) {
  978. xlsxR.selectSheet(str.at(i));
  979. if (xlsxR.load()) {
  980. int row = xlsxR.dimension().lastRow();
  981. int col = xlsxR.dimension().lastColumn();
  982. for (int r = 2; r <= row; r++) {
  983. for (int c = 2; c <= col; c++) {
  984. QString abscissa;
  985. QString ordinate;
  986. QXlsx::Cell *cellAbscissa = xlsxR.cellAt(r, 1);
  987. if (cellAbscissa != NULL) {
  988. QVariant var = cellAbscissa->readValue();
  989. abscissa = var.toString();
  990. }
  991. QXlsx::Cell *cellOrdinate = xlsxR.cellAt(1, c);
  992. if (cellOrdinate != NULL) {
  993. QVariant var = cellOrdinate->readValue();
  994. ordinate = var.toString();
  995. }
  996. for (int index = 0; index < nodeValueInfoList.size(); index++) {
  997. NodeMatrixInfo *nodeInfo = nodeValueInfoList.at(index);
  998. if (abscissa == nodeInfo->abscissa && ordinate == nodeInfo->ordinate) {
  999. QXlsx::Cell *value = xlsxR.cellAt(r, c);
  1000. if (value != NULL) {
  1001. QVariant var = value->readValue();
  1002. nodeInfo->nodeValue = var.toString();
  1003. }
  1004. }
  1005. }
  1006. }
  1007. }
  1008. }
  1009. }
  1010. emit importData(nodeValueInfoList);
  1011. }