MatterElementConfigWidget.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. #include "MatterElementConfigWidget.h"
  2. #include "MatterElementItemDelegate.h"
  3. #include "ui_MatterElementConfigWidget.h"
  4. #include "dbService/ScaleInfoService.h"
  5. #include "dbService/GradeInfoService.h"
  6. #include "dbService/GradeIndexInfoService.h"
  7. #include "CMind.h"
  8. #include <QLineEdit>
  9. #include <QMessageBox>
  10. #include <QPushButton>
  11. #include <QDebug>
  12. MatterElementConfigWidget::MatterElementConfigWidget(CMind *mind, int domainLevel, QWidget *parent)
  13. : QWidget(parent), ui(new Ui::MatterElementConfigWidget), m_domainLevel(domainLevel), m_mind(mind)
  14. {
  15. ui->setupUi(this);
  16. initScaleDivisionTable();
  17. initConfigItems();
  18. initDomainTable();
  19. }
  20. MatterElementConfigWidget::~MatterElementConfigWidget()
  21. {
  22. delete ui;
  23. }
  24. void MatterElementConfigWidget::initScaleDivisionTable()
  25. {
  26. QTableView *t = ui->scaleDivisionTable;
  27. t->setAlternatingRowColors(false);
  28. t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  29. t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  30. t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  31. t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  32. t->setSelectionMode(QAbstractItemView::SingleSelection);
  33. t->verticalHeader()->hide();
  34. int projectId = m_mind->root().projectId;
  35. m_scaleDivisionmodel = new QStandardItemModel;
  36. t->setModel(m_scaleDivisionmodel);
  37. m_scaleDivisionmodel->setRowCount(1);
  38. m_scaleDivisionmodel->setColumnCount(7);
  39. const QStringList headers = { "定义", "很差", "较差", "一般", "较高", "很高", "相邻定义" };
  40. m_scaleDivisionmodel->setHorizontalHeaderLabels(headers);
  41. QStandardItem *s = nullptr;
  42. MatterElementItemSpinDelegate *sd = new MatterElementItemSpinDelegate(t);
  43. QStringList originValues = { "1.0", "3.0", "5.0", "7.0", "9.0", "[2.0, 4.0, 6.0, 8.0]" };
  44. QList<ScaleInfo *> scaleInfoList;
  45. if (!ScaleInfoService().QueryScaleByProjectId(&scaleInfoList, projectId)) {
  46. QMessageBox::warning(this, "警告", "数据库访问失败");
  47. } else {
  48. if (scaleInfoList.size() == 0) {
  49. for (int num = 0; num < originValues.size(); ++num) {
  50. ScaleInfo sinfo;
  51. sinfo.projectId = projectId;
  52. sinfo.scaleName = headers.at(num + 1);
  53. sinfo.scaleValue = originValues.at(num);
  54. if (!ScaleInfoService().AddScaleInfo(sinfo)) {
  55. QMessageBox::warning(this, "警告", "数据库访问失败");
  56. }
  57. }
  58. } else {
  59. for (const auto &si : scaleInfoList) {
  60. int loc = headers.indexOf(si->scaleName);
  61. originValues[loc - 1] = si->scaleValue;
  62. }
  63. }
  64. }
  65. qDeleteAll(scaleInfoList);
  66. for (int i = 0; i < headers.size(); ++i) {
  67. if (i == 0) {
  68. s = new QStandardItem("标度");
  69. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  70. s->setTextAlignment(Qt::AlignCenter);
  71. } else {
  72. s = new QStandardItem(originValues.at(i - 1));
  73. s->setTextAlignment(Qt::AlignCenter);
  74. }
  75. m_scaleDivisionmodel->setItem(0, i, s);
  76. if (i > 0 && i < headers.size() - 1) {
  77. t->setItemDelegateForColumn(i, sd);
  78. }
  79. if (i == headers.size() - 1) {
  80. t->setItemDelegateForColumn(i, new MatterElementItemInsideDelegate);
  81. }
  82. }
  83. connect(ui->updateScaleBtn, &QToolButton::clicked, this, &MatterElementConfigWidget::onScaleValueUpdate);
  84. }
  85. static void clearTab(QTabWidget *tabWidget)
  86. {
  87. while (tabWidget->count() > 0) {
  88. auto widget = tabWidget->widget(0); // 获取当前页对应的widget
  89. tabWidget->removeTab(0); // 从QTabWidget中删除当前页
  90. widget->setParent(nullptr); // 从父控件中删除widget对象
  91. widget->deleteLater(); // 删除widget对象
  92. }
  93. }
  94. void MatterElementConfigWidget::initDomainLevelLayout()
  95. {
  96. ui->levelLabel->setText(QString::number(m_domainLevel));
  97. QList<GradeInfo *> gradeInfoList;
  98. QMap<QString, QString> levelMaps;
  99. int projectId = m_mind->root().projectId;
  100. if (!GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, projectId, 0)) {
  101. QMessageBox::warning(this, "警告", "数据库访问失败");
  102. } else {
  103. if (gradeInfoList.size() == 0) {
  104. for (int lvl = 0; lvl < m_domainLevel; ++lvl) {
  105. levelMaps.insert(QString("%1级:").arg(lvl + 1), QString("E%1").arg(lvl + 1));
  106. GradeInfo ginfo;
  107. ginfo.projectId = projectId;
  108. ginfo.gradeName = QString("%1级").arg(lvl + 1);
  109. ginfo.gradeValue = QString("E%1").arg(lvl + 1);
  110. ginfo.type = 0;
  111. if (!GradeInfoService().AddGradeInfo(ginfo)) {
  112. QMessageBox::warning(this, "警告", "数据库访问失败");
  113. }
  114. }
  115. } else {
  116. for (const auto &gi : gradeInfoList) {
  117. levelMaps.insert(gi->gradeName, gi->gradeValue);
  118. if (levelMaps.size() >= m_domainLevel) {
  119. break;
  120. }
  121. }
  122. for (int lvl = gradeInfoList.size(); lvl < m_domainLevel; ++lvl) {
  123. levelMaps.insert(QString("%1级:").arg(lvl + 1), QString("E%1").arg(lvl + 1));
  124. GradeInfo ginfo;
  125. ginfo.projectId = projectId;
  126. ginfo.gradeName = QString("%1级").arg(lvl + 1);
  127. ginfo.gradeValue = QString("E%1").arg(lvl + 1);
  128. ginfo.type = 0;
  129. if (!GradeInfoService().AddGradeInfo(ginfo)) {
  130. QMessageBox::warning(this, "警告", "数据库访问失败");
  131. }
  132. }
  133. }
  134. }
  135. qDeleteAll(gradeInfoList);
  136. QFormLayout *formLayout = new QFormLayout;
  137. QMapIterator<QString, QString> iter(levelMaps);
  138. while (iter.hasNext()) {
  139. iter.next();
  140. auto le = new QLineEdit(iter.value());
  141. le->setMinimumHeight(30);
  142. le->setMaximumWidth(80);
  143. m_levelEdits << le;
  144. formLayout->addRow(iter.key() + ":", le);
  145. }
  146. auto levelSaveBtn = new QPushButton("保存");
  147. levelSaveBtn->setIcon(QIcon(":/qfluentwidgets/images/icons/Save_black.svg"));
  148. levelSaveBtn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
  149. levelSaveBtn->setMinimumHeight(30);
  150. levelSaveBtn->setMaximumWidth(80);
  151. formLayout->addRow("", levelSaveBtn);
  152. ui->levelWidget->setLayout(formLayout);
  153. connect(levelSaveBtn, &QPushButton::clicked, this, &MatterElementConfigWidget::onLevelSaveBtnClick);
  154. }
  155. void MatterElementConfigWidget::initConfigItems()
  156. {
  157. // 脑图层级 < 2 时无效
  158. if (m_mind->levels() < 2) {
  159. return;
  160. }
  161. m_allConfigItems.clear();
  162. // 使用倒数第二层节点及其子节点
  163. for (CNodeData n : m_mind->nodesInLevel(m_mind->levels() - 1)) {
  164. QVector<MEDomain> children;
  165. for (CNodeData sub : m_mind->subNodes(n)) {
  166. MEDomain d;
  167. d.name = sub.name;
  168. d.leftValues = QVector<double>(m_domainLevel + 1, 0);
  169. d.rightValues = QVector<double>(m_domainLevel + 1, 0);
  170. children.append(d);
  171. }
  172. MEConfigItem i;
  173. i.parentName = n.name;
  174. i.childs = children;
  175. m_allConfigItems.append(i);
  176. }
  177. QList<GradeIndexInfo *> gradeIndexInfoList;
  178. int projectId = m_mind->root().projectId;
  179. if (!GradeIndexInfoService().QueryGradeIndexInfoByProjectId(&gradeIndexInfoList, projectId)) {
  180. QMessageBox::warning(this, "警告", "数据库访问失败");
  181. } else {
  182. if (gradeIndexInfoList.size() == 0) {
  183. for (const auto &configItem : m_allConfigItems) {
  184. for (int c = 0; c < configItem.childs.size(); ++c) {
  185. // 一个指标对应m_domainLevel+1个配置项
  186. for (int domain = 0; domain < m_domainLevel + 1; ++domain) {
  187. GradeIndexInfo gii;
  188. gii.projectId = projectId;
  189. gii.gradeIndexName = configItem.childs.at(c).name;
  190. gii.gradeParentName = configItem.parentName;
  191. gii.gradeLevel = domain + 1;
  192. gii.gradeIndexValue = QString("(%1, %2)")
  193. .arg(configItem.childs.at(c).leftValues.at(domain))
  194. .arg(configItem.childs.at(c).rightValues.at(domain));
  195. if (!GradeIndexInfoService().AddGradeIndexInfo(gii)) {
  196. QMessageBox::warning(this, "警告", "数据库访问失败");
  197. }
  198. }
  199. }
  200. }
  201. } else {
  202. for (auto &configItem : m_allConfigItems) {
  203. for (int c = 0; c < configItem.childs.size(); ++c) {
  204. bool found = false;
  205. for (auto gindex : gradeIndexInfoList) {
  206. for (int domain = 0; domain < m_domainLevel + 1; ++domain) {
  207. // 默认指标名具有唯一性
  208. if (gindex->gradeIndexName == configItem.childs[c].name
  209. && gindex->gradeLevel == domain + 1) {
  210. QStringList list = gindex->gradeIndexValue.mid(1, gindex->gradeIndexValue.size() - 2)
  211. .replace(" ", "")
  212. .split(",");
  213. configItem.childs[c].leftValues[domain] = list.at(0).toDouble();
  214. configItem.childs[c].rightValues[domain] = list.at(1).toDouble();
  215. found = true;
  216. }
  217. }
  218. }
  219. if (!found) {
  220. for (int domain = 0; domain < m_domainLevel + 1; ++domain) {
  221. GradeIndexInfo gii;
  222. gii.projectId = projectId;
  223. gii.gradeIndexName = configItem.childs[c].name;
  224. gii.gradeParentName = configItem.parentName;
  225. gii.gradeLevel = domain + 1;
  226. gii.gradeIndexValue = QString("(%1, %2)")
  227. .arg(configItem.childs[c].leftValues.at(domain))
  228. .arg(configItem.childs[c].rightValues.at(domain));
  229. if (!GradeIndexInfoService().AddGradeIndexInfo(gii)) {
  230. QMessageBox::warning(this, "警告", "数据库访问失败");
  231. }
  232. }
  233. }
  234. }
  235. }
  236. }
  237. }
  238. qDeleteAll(gradeIndexInfoList);
  239. }
  240. void MatterElementConfigWidget::initDomainTable()
  241. {
  242. initDomainLevelLayout();
  243. m_meRangeDelegate = new MatterElementItemRangeDelegate(this);
  244. const QStringList rangeItems = { "很差", "较差", "一般", "较高", "很高",
  245. "相邻较差", "相邻一般", "相邻较高", "相邻很高" };
  246. QVector<double> rangeValues;
  247. auto scaleValues = getScaleValues();
  248. rangeValues << scaleValues.at(0) << scaleValues.at(1);
  249. m_meRangeDelegate->setOriginItems(rangeItems, rangeValues);
  250. QStringList domainLevels = getDomainLevels();
  251. for (int pindex = 0; pindex < m_allConfigItems.size(); ++pindex) {
  252. QTableView *table = new QTableView;
  253. table->setAlternatingRowColors(false);
  254. table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  255. table->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  256. table->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}");
  257. table->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
  258. table->setSelectionMode(QAbstractItemView::SingleSelection);
  259. table->verticalHeader()->hide();
  260. table->verticalHeader()->setDefaultSectionSize(60);
  261. table->horizontalHeader()->hide();
  262. QStandardItemModel *tModel = new QStandardItemModel(table);
  263. m_domainModels << tModel;
  264. table->setModel(tModel);
  265. ui->tabWidget->addTab(table, m_allConfigItems.at(pindex).parentName);
  266. connect(tModel, &QStandardItemModel::itemChanged, this, &MatterElementConfigWidget::onTableItemChanged);
  267. int indexNumber = m_allConfigItems.at(pindex).childs.size();
  268. tModel->setColumnCount(4 * m_domainLevel);
  269. tModel->setRowCount(indexNumber);
  270. for (int r = 0; r < m_domainLevel + 1; ++r) {
  271. QStandardItem *s = nullptr;
  272. if (r < m_domainLevel) {
  273. s = new QStandardItem(QString("R%1").arg(r + 1));
  274. } else {
  275. s = new QStandardItem("Rp");
  276. }
  277. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  278. s->setTextAlignment(Qt::AlignCenter);
  279. if (r < m_domainLevel) {
  280. s->setToolTip(QString("经典域R%1").arg(r + 1));
  281. } else {
  282. s->setToolTip("节域p");
  283. }
  284. tModel->setItem(0, r * 4, s);
  285. table->setColumnWidth(r * 4, 20);
  286. table->setSpan(0, r * 4, indexNumber, 1);
  287. if (r < m_domainLevel) {
  288. s = new QStandardItem(domainLevels.at(r));
  289. } else {
  290. s = new QStandardItem("节域p");
  291. }
  292. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  293. s->setTextAlignment(Qt::AlignCenter);
  294. tModel->setItem(0, r * 4 + 1, s);
  295. table->setSpan(0, r * 4 + 1, indexNumber, 1);
  296. for (int k = 0; k < indexNumber; ++k) {
  297. s = new QStandardItem(m_allConfigItems[pindex].childs[k].name);
  298. s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
  299. s->setTextAlignment(Qt::AlignCenter);
  300. tModel->setItem(k, r * 4 + 2, s);
  301. s = new QStandardItem();
  302. s->setTextAlignment(Qt::AlignCenter);
  303. if (r < m_domainLevel) {
  304. s->setText(QString("(%1, %2)")
  305. .arg(m_allConfigItems[pindex].childs[k].leftValues[r])
  306. .arg(m_allConfigItems[pindex].childs[k].rightValues[r]));
  307. tModel->setItem(k, r * 4 + 3, s);
  308. }
  309. }
  310. table->setItemDelegateForColumn(r * 4 + 3, m_meRangeDelegate);
  311. }
  312. }
  313. connect(ui->cleanBtn, &QToolButton::clicked, this, &MatterElementConfigWidget::onClearBtnClick);
  314. connect(ui->saveBtn, &QToolButton::clicked, this, &MatterElementConfigWidget::onSaveBtnClick);
  315. }
  316. QStringList MatterElementConfigWidget::getDomainLevels() const
  317. {
  318. QStringList lvls;
  319. for (int i = 0; i < m_levelEdits.size(); ++i) {
  320. QString v = m_levelEdits.at(i)->text().trimmed();
  321. if (v.isEmpty()) {
  322. lvls << QString("E%1").arg(i + 1);
  323. } else {
  324. lvls << v;
  325. }
  326. }
  327. return lvls;
  328. }
  329. QVector<QVector<double>> MatterElementConfigWidget::getScaleValues() const
  330. {
  331. QVector<QVector<double>> newValues(2);
  332. for (int c = 1; c < m_scaleDivisionmodel->columnCount() - 1; ++c) {
  333. newValues[0] << m_scaleDivisionmodel->item(0, c)->text().toDouble();
  334. }
  335. QString value = m_scaleDivisionmodel->item(0, m_scaleDivisionmodel->columnCount() - 1)->text();
  336. QStringList tmp = value.mid(1, value.size() - 2).replace(" ", "").split(",");
  337. for (const auto &var : tmp) {
  338. newValues[1] << var.toDouble();
  339. }
  340. return newValues;
  341. }
  342. void MatterElementConfigWidget::onLevelSaveBtnClick()
  343. {
  344. QStringList domainLevels = getDomainLevels();
  345. for (auto model : m_domainModels) {
  346. for (int c = 0; c < domainLevels.size(); ++c) {
  347. model->item(0, c * 4 + 1)->setText(domainLevels.at(c));
  348. }
  349. }
  350. // 更新数据库等级值
  351. QList<GradeInfo *> gradeInfoList;
  352. if (!GradeInfoService().QueryGradeByProjectIdAndType(&gradeInfoList, m_mind->root().projectId, 0)) {
  353. QMessageBox::warning(this, "警告", "数据库访问失败");
  354. return;
  355. }
  356. for (auto gi : gradeInfoList) {
  357. int num = gi->gradeName.mid(0, gi->gradeName.size() - 1).toInt();
  358. if (num < domainLevels.size() + 1) {
  359. if (gi->gradeValue != domainLevels.at(num - 1)) {
  360. gi->gradeValue = domainLevels.at(num - 1);
  361. if (!GradeInfoService().UpdateGradeInfo(*gi)) {
  362. QMessageBox::warning(this, "警告", "数据库访问失败");
  363. return;
  364. }
  365. }
  366. }
  367. }
  368. qDeleteAll(gradeInfoList);
  369. }
  370. void MatterElementConfigWidget::onScaleValueUpdate()
  371. {
  372. ui->scaleDivisionTable->clearSelection(); // 清除表格选中
  373. // 把值聚集起来
  374. QVector<double> rangeValues;
  375. auto scaleValues = getScaleValues();
  376. rangeValues << scaleValues.at(0) << scaleValues.at(1);
  377. m_meRangeDelegate->updateOriginValues(rangeValues);
  378. // 更新数据库
  379. QList<ScaleInfo *> scaleInfoList;
  380. if (!ScaleInfoService().QueryScaleByProjectId(&scaleInfoList, m_mind->root().projectId)) {
  381. QMessageBox::warning(this, "警告", "数据库访问失败");
  382. return;
  383. } else {
  384. for (int c = 1; c < m_scaleDivisionmodel->columnCount(); ++c) {
  385. QString header = m_scaleDivisionmodel->horizontalHeaderItem(c)->text();
  386. QString value = m_scaleDivisionmodel->item(0, c)->text();
  387. for (auto si : scaleInfoList) {
  388. if (si->scaleName == header && value != si->scaleValue) {
  389. si->scaleValue = value;
  390. if (!ScaleInfoService().UpdateScaleInfo(*si)) {
  391. QMessageBox::warning(this, "警告", "数据库访问失败");
  392. }
  393. }
  394. }
  395. }
  396. }
  397. qDeleteAll(scaleInfoList);
  398. }
  399. void MatterElementConfigWidget::onClearBtnClick()
  400. {
  401. for (auto &config : m_allConfigItems) {
  402. for (auto &child : config.childs) {
  403. for (int domain = 0; domain < m_domainLevel + 1; ++domain) {
  404. child.leftValues[domain] = child.rightValues[domain] = 0;
  405. }
  406. }
  407. }
  408. for (int pindex = 0; pindex < m_allConfigItems.size(); ++pindex) {
  409. QStandardItemModel *tModel = m_domainModels.at(pindex);
  410. int indexNumber = m_allConfigItems.at(pindex).childs.size();
  411. for (int r = 0; r < m_domainLevel + 1; ++r) {
  412. for (int k = 0; k < indexNumber; ++k) {
  413. tModel->item(k, r * 4 + 3)->setText("(0, 0)");
  414. }
  415. }
  416. }
  417. }
  418. void MatterElementConfigWidget::onSaveBtnClick()
  419. {
  420. for (int pindex = 0; pindex < m_allConfigItems.size(); ++pindex) {
  421. QStandardItemModel *tModel = m_domainModels.at(pindex);
  422. int indexNumber = m_allConfigItems.at(pindex).childs.size();
  423. for (int r = 0; r < m_domainLevel + 1; ++r) {
  424. for (int k = 0; k < indexNumber; ++k) {
  425. QString txt = tModel->item(k, r * 4 + 3)->text().trimmed();
  426. QStringList list = txt.mid(1, txt.size() - 2).replace(" ", "").split(",");
  427. m_allConfigItems[pindex].childs[k].leftValues[r] = list.at(0).toDouble();
  428. m_allConfigItems[pindex].childs[k].rightValues[r] = list.at(1).toDouble();
  429. qDebug() << r << k << list;
  430. }
  431. }
  432. }
  433. QList<GradeIndexInfo *> gradeIndexInfoList;
  434. int projectId = m_mind->root().projectId;
  435. if (!GradeIndexInfoService().QueryGradeIndexInfoByProjectId(&gradeIndexInfoList, projectId)) {
  436. QMessageBox::warning(this, "警告", "数据库访问失败");
  437. } else {
  438. if (gradeIndexInfoList.size() == 0) { // 防止数据库被异步删除
  439. for (const auto &configItem : m_allConfigItems) {
  440. for (int c = 0; c < configItem.childs.size(); c++) {
  441. for (int domain = 0; domain < m_domainLevel + 1; ++domain) {
  442. GradeIndexInfo gii;
  443. gii.projectId = projectId;
  444. gii.gradeIndexName = configItem.childs[c].name;
  445. gii.gradeParentName = configItem.parentName;
  446. gii.gradeLevel = domain + 1;
  447. gii.gradeIndexValue = QString("(%1, %2)")
  448. .arg(configItem.childs[c].leftValues.at(domain))
  449. .arg(configItem.childs[c].rightValues.at(domain));
  450. if (!GradeIndexInfoService().AddGradeIndexInfo(gii)) {
  451. QMessageBox::warning(this, "警告", "数据库访问失败");
  452. }
  453. }
  454. }
  455. }
  456. } else {
  457. for (const auto &configItem : m_allConfigItems) {
  458. for (int c = 0; c < configItem.childs.size(); c++) {
  459. bool found = false;
  460. for (auto &gindex : gradeIndexInfoList) {
  461. for (int domain = 0; domain < m_domainLevel + 1; ++domain) {
  462. if ((gindex->gradeIndexName == configItem.childs[c].name)
  463. && (gindex->gradeLevel == domain + 1)) {
  464. if (gindex->gradeIndexValue
  465. != QString("(%1, %2)")
  466. .arg(configItem.childs[c].leftValues.at(domain))
  467. .arg(configItem.childs[c].rightValues.at(domain))) {
  468. gindex->gradeIndexValue = QString("(%1, %2)")
  469. .arg(configItem.childs[c].leftValues.at(domain))
  470. .arg(configItem.childs[c].rightValues.at(domain));
  471. if (!GradeIndexInfoService().UpdateGradeIndexInfo(*gindex)) {
  472. QMessageBox::warning(this, "警告", "数据库访问失败");
  473. }
  474. }
  475. found = true;
  476. }
  477. }
  478. }
  479. if (!found) {
  480. for (int domain = 0; domain < m_domainLevel + 1; ++domain) {
  481. GradeIndexInfo gii;
  482. gii.projectId = projectId;
  483. gii.gradeIndexName = configItem.childs[c].name;
  484. gii.gradeParentName = configItem.parentName;
  485. gii.gradeLevel = c + 1;
  486. gii.gradeIndexValue = QString("(%1, %2)")
  487. .arg(configItem.childs[c].leftValues.at(domain))
  488. .arg(configItem.childs[c].rightValues.at(domain));
  489. if (!GradeIndexInfoService().AddGradeIndexInfo(gii)) {
  490. QMessageBox::warning(this, "警告", "数据库访问失败");
  491. }
  492. }
  493. }
  494. }
  495. }
  496. }
  497. }
  498. qDeleteAll(gradeIndexInfoList);
  499. }
  500. /// 第一个区间或最后一个区间更新时, 同时更新节域
  501. void MatterElementConfigWidget::onTableItemChanged(QStandardItem *item)
  502. {
  503. /// 判断是否为第一个或最后一个区间
  504. int index1 = 3; // 第一个区间列索引
  505. int index2 = (m_domainLevel - 1) * 4 + 3; // 最后一个区间列索引
  506. if (item->column() != index1 && item->column() != index2) {
  507. return;
  508. }
  509. QStandardItem *item1 = item->model()->item(item->row(), index1);
  510. QStandardItem *item2 = item->model()->item(item->row(), index2);
  511. if (item1 == nullptr || item2 == nullptr) {
  512. return;
  513. }
  514. /// 求节域值
  515. QString left1, right1, left2, right2;
  516. QString sep = ", ";
  517. if (item1->text().length() > 2 && item1->text().contains(sep)) {
  518. left1 = item1->text().mid(1, item1->text().length() - 2).split(sep).first();
  519. right1 = item1->text().mid(1, item1->text().length() - 2).split(sep).last();
  520. }
  521. if (item2->text().length() > 2 && item2->text().contains(sep)) {
  522. left2 = item2->text().mid(1, item2->text().length() - 2).split(sep).first();
  523. right2 = item2->text().mid(1, item2->text().length() - 2).split(sep).last();
  524. }
  525. QString range = QString("(%1, %2)").arg(left1).arg(right2);
  526. if (left1.toDouble() > right2.toDouble()) {
  527. // range = QString("(%1, %2)").arg(right1).arg(left2);
  528. }
  529. /// 显示节域值
  530. int jointIndex = m_domainLevel * 4 + 3; // 节域列索引
  531. QStandardItem *rangeItem = item->model()->item(item->row(), jointIndex);
  532. if (rangeItem) {
  533. rangeItem->setText(range);
  534. } else {
  535. rangeItem = new QStandardItem(range);
  536. rangeItem->setEditable(false);
  537. item->model()->setItem(item->row(), jointIndex, rangeItem);
  538. }
  539. }
  540. QList<MEConfigItem> MatterElementConfigWidget::getAllConfigItems() const
  541. {
  542. return m_allConfigItems;
  543. }