EXDataTableView.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. #include "EXDataTableView.h"
  2. #include "EXDataViewDelegate.h"
  3. #include "ProjectManager.h"
  4. #include <dbService/CNodeDataService.h>
  5. #include <dbService/ClassSet.h>
  6. #include <dbService/UserService.h>
  7. #include <dbService/NodeMatrixService.h>
  8. #include <Widgets/Button.h>
  9. #include <QBoxLayout>
  10. #include <QTabWidget>
  11. #include <QLabel>
  12. #include <QTableView>
  13. #include <QTableWidget>
  14. #include <QAbstractItemModel>
  15. #include <QStandardItemModel>
  16. #include <QStandardItem>
  17. #include <QHeaderView>
  18. #include <QApplication>
  19. #include <QDesktopWidget>
  20. #include <QDateTime>
  21. #include <QFileDialog>
  22. #include <QDebug>
  23. EXDataTableView::EXDataTableView(SchemePlanManager::SchemeProcessInfo process, QWidget *parent)
  24. : QWidget(parent), m_process(process)
  25. {
  26. m_mind1 = new CMind(this);
  27. m_mind2 = new CMind(this);
  28. initWidget();
  29. initLayout();
  30. connectSignalsAndSlots();
  31. m_comboDelegate = new EXDataTableComboDelegate(this);
  32. m_user = new QFUser();
  33. UserService().QueryUserInfoById(m_user, 62);
  34. m_export = new QXlsx::Document(this);
  35. }
  36. SchemePlanManager::SchemeProcessInfo EXDataTableView::process() const
  37. {
  38. return m_process;
  39. }
  40. void EXDataTableView::setProjectInfo(ProjectInfo *proj)
  41. {
  42. m_proj = proj;
  43. }
  44. void EXDataTableView::initWidget()
  45. {
  46. m_dataTab = new QTabWidget(this);
  47. m_dataTab->setTabPosition(QTabWidget::South);
  48. m_pageLab = new QLabel(this);
  49. m_previous = new PushButton("上一级指标", this);
  50. m_next = new PushButton("下一级指标", this);
  51. m_save = new PushButton("保存", this);
  52. }
  53. void EXDataTableView::initLayout()
  54. {
  55. m_layout = new QVBoxLayout(this);
  56. m_layout->addWidget(m_dataTab);
  57. m_pageLayout = new QHBoxLayout();
  58. m_layout->addLayout(m_pageLayout);
  59. m_pageLayout->setSpacing(10);
  60. m_pageLayout->addStretch();
  61. m_pageLayout->addWidget(m_previous);
  62. m_pageLayout->addWidget(m_pageLab);
  63. m_pageLayout->addWidget(m_next);
  64. m_pageLayout->addStretch();
  65. m_pageLayout->addWidget(m_save);
  66. }
  67. void EXDataTableView::connectSignalsAndSlots()
  68. {
  69. connect(m_previous, &PushButton::clicked, this, &EXDataTableView::slotPrevious);
  70. connect(m_next, &PushButton::clicked, this, &EXDataTableView::slotNext);
  71. connect(m_dataTab, &QTabWidget::currentChanged, this, &EXDataTableView::slotTabCurrentChanged);
  72. connect(m_save, &PushButton::clicked, this, &EXDataTableView::slotSave);
  73. }
  74. void EXDataTableView::setupTabWidget()
  75. {
  76. /// 创建 tableView 并添加进 tabWidget
  77. /// 这个过程中会触发 tabWidget 的 currentChanged,
  78. /// 所以使用 m_isSettingTable 标记此过程, 以采取必要措施来规避一些异常操作
  79. m_isSettingTable = true;
  80. m_dataTab->clear();
  81. QList<CNodeData> nodeList = m_mind1->nodesInLevel(m_currentPage);
  82. for (int i = 0; i < nodeList.count(); i++) {
  83. CNodeData n = nodeList[i];
  84. QTableView *t = new QTableView(m_dataTab);
  85. t->setAlternatingRowColors(m_mind2->nodeList().count() > 0);
  86. t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  87. t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  88. t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  89. t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  90. t->setSelectionMode(QAbstractItemView::SingleSelection);
  91. m_dataTab->addTab(t, n.name);
  92. QList<QStandardItemModel *> modelList;
  93. if (m_models.keys().contains(m_currentPage)) {
  94. modelList = m_models[m_currentPage];
  95. }
  96. QStandardItemModel *model;
  97. if (modelList.count() <= i) {
  98. model = new QStandardItemModel(t);
  99. modelList.append(model);
  100. } else {
  101. model = modelList[i];
  102. }
  103. m_models[m_currentPage] = modelList;
  104. t->setModel(model);
  105. connect(t, &QTableView::clicked, this, &EXDataTableView::slotItemClicked);
  106. }
  107. m_isSettingTable = false;
  108. }
  109. int EXDataTableView::currentPage() const
  110. {
  111. return m_currentPage;
  112. }
  113. void EXDataTableView::setCurrentPage(int p)
  114. {
  115. if (p < 1 || p >= m_mind1->levels()) {
  116. return;
  117. }
  118. m_currentPage = p;
  119. m_previous->setEnabled(p > 1);
  120. m_next->setEnabled(p < m_mind1->levels() - 1);
  121. setupTabWidget();
  122. m_pageLab->setText(QString("共 %1 页, 当前第 %2 页").arg(m_mind1->levels() - 1).arg(p));
  123. updateCurrentTable();
  124. }
  125. void EXDataTableView::updateCurrentTable()
  126. {
  127. int c = m_dataTab->currentIndex();
  128. QTableView *table = (QTableView *)m_dataTab->widget(c);
  129. if (table == nullptr || table->model() == nullptr || m_isSettingTable) {
  130. return;
  131. }
  132. m_hNodes.clear();
  133. m_vNodes.clear();
  134. m_values.clear();
  135. QStandardItemModel *model = (QStandardItemModel *)table->model();
  136. /// 设置顶部水平方向标题
  137. int hIndex = -1;
  138. int dimensionIndex = -1; // 量纲所在列
  139. int typeIndex = -1; // 指标类型所在列
  140. // 指标
  141. CNodeData n = m_mind1->nodesInLevel(m_currentPage)[c];
  142. QList<CNodeData> hList = m_mind1->subNodes(n);
  143. // 以下情况需要显示指标
  144. // 导入权重分析数据
  145. // 导入需求分析评估的评估数据
  146. if (m_process.type == SchemePlanManager::ImportWeightData || m_process.indexType == ProjectManager::TechIndex) {
  147. for (CNodeData node : hList) {
  148. QStandardItem *item = new QStandardItem(node.name);
  149. item->setToolTip(node.remark);
  150. model->setHorizontalHeaderItem(++hIndex, item);
  151. m_hNodes.append(node.name);
  152. }
  153. }
  154. // 导入方案优选评估或效能评估的评估数据时, 需要显示量纲
  155. if (m_process.type == SchemePlanManager::ImportEvalData
  156. && (m_process.indexType == ProjectManager::OptimalIndex
  157. || m_process.indexType == ProjectManager::EfficiencyIndex)) {
  158. QStandardItem *item = new QStandardItem("指标量纲");
  159. model->setHorizontalHeaderItem(++hIndex, item);
  160. dimensionIndex = hIndex;
  161. }
  162. // 导入方案优选评估的评估数据时, 需要显示指标类型
  163. if (m_process.type == SchemePlanManager::ImportEvalData && m_process.indexType == ProjectManager::OptimalIndex) {
  164. QStandardItem *item = new QStandardItem("指标类型");
  165. model->setHorizontalHeaderItem(++hIndex, item);
  166. typeIndex = hIndex;
  167. }
  168. /// 设置左侧垂直方向标题
  169. QList<CNodeData> vList;
  170. // 导入权重分析的专家数据时, 显示指标
  171. if (m_process.type == SchemePlanManager::ImportWeightData) {
  172. vList = hList;
  173. }
  174. // 导入评估数据时, 显示最后一级指标
  175. if (m_process.type == SchemePlanManager::ImportEvalData) {
  176. if (m_process.indexType == ProjectManager::TechIndex) {
  177. vList = m_mind2->leaves();
  178. } else {
  179. vList = m_mind1->leaves();
  180. }
  181. }
  182. for (int i = 0; i < vList.count(); i++) {
  183. CNodeData node = vList[i];
  184. QStandardItem *item = new QStandardItem(QString(" %1 ").arg(node.name));
  185. item->setToolTip(node.remark);
  186. model->setVerticalHeaderItem(i, item);
  187. table->setRowHeight(i, 35);
  188. m_vNodes.append(node.name);
  189. }
  190. /// 填充量纲和指标类型
  191. for (int i = 0; i < vList.count(); i++) {
  192. CNodeData vNode = vList[i];
  193. QStandardItem *d = new QStandardItem();
  194. d->setData(Qt::AlignCenter, Qt::TextAlignmentRole); // 单元格文字居中
  195. if (dimensionIndex >= 0) {
  196. d->setText(vNode.dimension);
  197. model->setItem(i, dimensionIndex, d);
  198. }
  199. if (typeIndex >= 0) {
  200. model->setItem(i, typeIndex, d);
  201. }
  202. table->setRowHeight(i, 35);
  203. }
  204. if (m_process.type == SchemePlanManager::ImportWeightData) {
  205. for (int i = 0; i < vList.count(); i++) {
  206. CNodeData vNode = vList[i];
  207. for (int j = 0; j < hList.count(); j++) {
  208. CNodeData hNode = hList[i];
  209. QStandardItem *item = new QStandardItem();
  210. item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
  211. item->setEditable(false);
  212. if (i == j) {
  213. item->setText("1");
  214. }
  215. if (i >= j) {
  216. item->setBackground(QBrush(QColor("lightgray")));
  217. }
  218. model->setItem(i, j, item);
  219. }
  220. }
  221. }
  222. if (m_process.type == SchemePlanManager::ImportEvalData || m_process.indexType == ProjectManager::TechIndex) {
  223. for (int i = 0; i < vList.count(); i++) {
  224. for (int j = 0; j < hList.count(); j++) {
  225. QStandardItem *item = new QStandardItem();
  226. item->setData(Qt::AlignCenter, Qt::TextAlignmentRole);
  227. model->setItem(i, j, item);
  228. table->setItemDelegate(m_comboDelegate);
  229. }
  230. }
  231. }
  232. }
  233. CMind *EXDataTableView::mind1() const
  234. {
  235. return m_mind1;
  236. }
  237. CMind *EXDataTableView::mind2() const
  238. {
  239. return m_mind2;
  240. }
  241. void EXDataTableView::exportData()
  242. {
  243. qDebug() << __FUNCTION__ << __LINE__ << endl;
  244. //文件夹路径
  245. QFileDialog::Options options;
  246. options |= QFileDialog::DontUseNativeDialog;
  247. QString filePath = QFileDialog::getExistingDirectory(nullptr, "导出资源包", "/", options);
  248. if (filePath.isEmpty()) {
  249. return;
  250. }
  251. QString fileName = m_user->userName + "-"
  252. + ProjectManager::nameOfIndexType((ProjectManager::IndexType)m_process.indexType) + "-"
  253. + m_proj->projectName;
  254. // QString filePath = "";
  255. // filePath = QCoreApplication::applicationDirPath();
  256. QDir dirReportPath(filePath);
  257. if (!dirReportPath.exists()) {
  258. if (dirReportPath.mkpath(filePath)) {
  259. filePath = filePath + "/" + fileName + tr(".xlsx");
  260. }
  261. } else {
  262. filePath = filePath + "/" + fileName + tr(".xlsx");
  263. }
  264. QFile file(fileName);
  265. if (file.exists()) {
  266. file.remove();
  267. }
  268. for (int i = 1; i < m_mind1->levels(); i++) {
  269. if (m_models.keys().contains(i) == false) {
  270. continue;
  271. }
  272. QList<CNodeData> nodes = m_mind1->nodesInLevel(i);
  273. for (int j = 0; j < m_models[i].count(); j++) {
  274. CNodeData node = nodes[j];
  275. QStandardItemModel *model = m_models[i][j];
  276. m_export->addSheet(node.name);
  277. int row = model->rowCount();
  278. int col = model->columnCount();
  279. m_export->setColumnWidth(1, 20);
  280. for (int c = 2; c < col + 2; c++) {
  281. QStandardItem *head = model->horizontalHeaderItem(c - 2);
  282. m_export->write(1, c, head->text());
  283. m_export->setColumnWidth(c, head->text().size() == 0 ? 40 : head->text().size() * 4);
  284. }
  285. for (int r = 2; r < row + 2; r++) {
  286. QStandardItem *head = model->verticalHeaderItem(r - 2);
  287. m_export->write(r, 1, head->text());
  288. for (int c = 2; c < col + 2; c++) {
  289. QStandardItem *head = model->item(r - 2, c - 2);
  290. m_export->write(r, c, head->text());
  291. }
  292. }
  293. }
  294. m_export->saveAs(filePath);
  295. }
  296. }
  297. void EXDataTableView::editItemData(const QModelIndex &index, const QString &val)
  298. {
  299. int c = m_dataTab->currentIndex();
  300. QTableView *table = (QTableView *)m_dataTab->widget(c);
  301. QStandardItemModel *model = (QStandardItemModel *)table->model();
  302. model->itemFromIndex(index)->setText(val);
  303. QString symmetry;
  304. if (val.startsWith("1/")) {
  305. symmetry = val.split("/")[1];
  306. } else {
  307. if (val == "0" || val == "1") {
  308. symmetry = val;
  309. } else {
  310. symmetry = "1/" + val;
  311. }
  312. }
  313. model->item(index.column(), index.row())->setText(symmetry);
  314. }
  315. void EXDataTableView::slotPrevious()
  316. {
  317. setCurrentPage(m_currentPage - 1);
  318. }
  319. void EXDataTableView::slotNext()
  320. {
  321. setCurrentPage(m_currentPage + 1);
  322. }
  323. void EXDataTableView::slotTabCurrentChanged(int c)
  324. {
  325. Q_UNUSED(c)
  326. updateCurrentTable();
  327. }
  328. void EXDataTableView::slotItemClicked(const QModelIndex &index)
  329. {
  330. if (index.row() >= index.column()) {
  331. return;
  332. }
  333. if (m_process.type != SchemePlanManager::ImportWeightData) {
  334. return;
  335. }
  336. QStringList l = { "1/9", "1/7", "1/5", "1/3", "1", "3", "5", "7", "9" };
  337. QTableView *table = (QTableView *)sender();
  338. QStandardItemModel *model = (QStandardItemModel *)table->model();
  339. // SchemeBar *scheme =
  340. // new SchemeBar(model->item(index.row(), 0)->text(),
  341. // model->horizontalHeaderItem(index.column())->text(), l);
  342. SchemeBar *scheme = new SchemeBar(model->verticalHeaderItem(index.row())->text(),
  343. model->horizontalHeaderItem(index.column())->text(), l);
  344. scheme->setModal(true);
  345. scheme->setAttribute(Qt::WA_DeleteOnClose);
  346. connect(scheme, &SchemeBar::setValue, [=](QString val) { editItemData(index, val); });
  347. scheme->show();
  348. QPoint p = QCursor::pos();
  349. if (p.x() + scheme->width() + 10 >= QApplication::desktop()->width()) {
  350. p.setX(QApplication::desktop()->width() - 10 - scheme->width());
  351. }
  352. scheme->move(p);
  353. }
  354. void EXDataTableView::slotSave()
  355. {
  356. return;
  357. int c = m_dataTab->currentIndex();
  358. QTableView *table = (QTableView *)m_dataTab->widget(c);
  359. QStandardItemModel *model = (QStandardItemModel *)table->model();
  360. QList<NodeMatrixInfo *> values;
  361. if (m_process.type == SchemePlanManager::ImportWeightData) {
  362. for (int i = 0; i < model->rowCount(); i++) {
  363. QStandardItem *row = model->verticalHeaderItem(i);
  364. for (int j = 0; j < model->columnCount(); j++) {
  365. QStandardItem *col = model->horizontalHeaderItem(j);
  366. QStandardItem *item = model->item(i, j);
  367. NodeMatrixInfo *info = new NodeMatrixInfo();
  368. info->expertName = m_user->userName;
  369. info->expertId = QString("%1").arg(m_user->id);
  370. info->engineerId = m_process.projectId;
  371. info->mindId = m_process.dSource;
  372. info->abscissa = col->text();
  373. info->ordinate = row->text();
  374. info->writeDate = QDateTime::currentDateTime();
  375. info->mark = QString("%1").arg(m_currentPage);
  376. info->nodeValue = item->text();
  377. info->tableMsg = QString("%1").arg(m_process.indexType);
  378. values.append(info);
  379. }
  380. }
  381. }
  382. NodeMatrixService().AddNodeMatrixInfoList2(values);
  383. }