MatrixPanelWidget.cpp 42 KB

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