projectdialog.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #include "projectdialog.h"
  2. #include <QtCore/qlogging.h>
  3. #include <QCheckBox>
  4. #include <QListView>
  5. #include <QMessageBox>
  6. #include <QPushButton>
  7. #include <QStandardItemModel>
  8. #include "../components/MultiSelectComboBox.h"
  9. #include "../utils/logger.h"
  10. #include "ui_projectdialog.h"
  11. ProjectDialog::ProjectDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ProjectDialog) {
  12. ui->setupUi(this);
  13. connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &ProjectDialog::validateAndSaveProject);
  14. connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &ProjectDialog::clearFormData);
  15. }
  16. void ProjectDialog::initComboBoxBlaster(const QJsonArray &undergroundOperators) {
  17. MultiSelectComboBox *comboBox = new MultiSelectComboBox(this);
  18. for (const QJsonValue &value : undergroundOperators) {
  19. if (value.isObject()) {
  20. QJsonObject obj = value.toObject();
  21. if (obj.contains("nickName")) {
  22. QString name = obj["nickName"].toString();
  23. comboBox->addItem(obj["identity"].toString(), name);
  24. }
  25. }
  26. }
  27. QVBoxLayout *layout = new QVBoxLayout(ui->undergroundOperatorsWidget);
  28. layout->addWidget(comboBox);
  29. }
  30. void ProjectDialog::initComboBoxSafetyInspectors(const QJsonArray &safeInspectors) {
  31. MultiSelectComboBox *comboBox = new MultiSelectComboBox(this);
  32. for (const QJsonValue &value : safeInspectors) {
  33. if (value.isObject()) {
  34. QJsonObject obj = value.toObject();
  35. if (obj.contains("nickName")) {
  36. QString name = obj["nickName"].toString();
  37. comboBox->addItem(obj["identity"].toString(), name);
  38. }
  39. }
  40. }
  41. QVBoxLayout *layout = new QVBoxLayout(ui->safetyInspectorsWidget);
  42. layout->addWidget(comboBox);
  43. }
  44. void ProjectDialog::initComboBoxOperator(const QJsonArray &groundOperators) {
  45. MultiSelectComboBox *comboBox = new MultiSelectComboBox(this);
  46. for (const QJsonValue &value : groundOperators) {
  47. if (value.isObject()) {
  48. QJsonObject obj = value.toObject();
  49. if (obj.contains("nickName")) {
  50. QString name = obj["nickName"].toString();
  51. comboBox->addItem(obj["identity"].toString(), name);
  52. }
  53. }
  54. }
  55. QVBoxLayout *layout = new QVBoxLayout(ui->groundOperatorsWidget);
  56. layout->addWidget(comboBox);
  57. }
  58. void ProjectDialog::SetL1AddressOptions(const QJsonArray &Options) {
  59. parentOptions = Options;
  60. ui->comboBoxAddr->clear();
  61. for (const QJsonValue &option : Options) {
  62. ui->comboBoxAddr->addItem(option.toObject()["name"].toString(), option.toObject()["uuid"].toString());
  63. }
  64. ui->comboBoxAddr->setCurrentIndex(-1);
  65. }
  66. void ProjectDialog::updateL2AddressOptions() {
  67. ui->comboBoxAddr_2->clear();
  68. for (const QJsonValue &child : L2AddressOptions) {
  69. ui->comboBoxAddr_2->addItem(child.toObject()["name"].toString(), child.toObject()["uuid"].toString());
  70. }
  71. ui->comboBoxAddr_2->setCurrentIndex(-1);
  72. }
  73. void ProjectDialog::updateL3AddressOptions() {
  74. ui->comboBoxAddr_3->clear();
  75. for (const QJsonValue &child : L3AddressOptions) {
  76. ui->comboBoxAddr_3->addItem(child.toObject()["name"].toString(), child.toObject()["uuid"].toString());
  77. }
  78. ui->comboBoxAddr_3->setCurrentIndex(-1);
  79. }
  80. void ProjectDialog::setChildOptions(const QJsonArray &newDataOptions) { dataOptions = newDataOptions; }
  81. void ProjectDialog::clearFormData() {
  82. QList<QLineEdit *> lineEdits = findChildren<QLineEdit *>();
  83. for (QLineEdit *lineEdit : lineEdits) {
  84. lineEdit->clear();
  85. }
  86. QList<MultiSelectComboBox *> multiSelectCombos = findChildren<MultiSelectComboBox *>();
  87. for (MultiSelectComboBox *combo : multiSelectCombos) {
  88. combo->setCheckedKeys(QStringList());
  89. }
  90. ui->comboBoxAddr->setCurrentIndex(-1);
  91. ui->comboBoxAddr_2->setCurrentIndex(-1);
  92. ui->comboBoxAddr_3->setCurrentIndex(-1);
  93. // 清除选中数据
  94. selectedBlasters.clear();
  95. selectedOperators.clear();
  96. selectedSafetyInspectors.clear(); // Add this line
  97. // 显示确认按钮
  98. ui->buttonBox->button(QDialogButtonBox::Ok)->setVisible(true);
  99. }
  100. void ProjectDialog::on_comboBoxAddr_currentIndexChanged(int index) {
  101. if (index >= 0 && index < parentOptions.size()) {
  102. L2AddressOptions = parentOptions[index].toObject()["children"].toArray();
  103. updateL2AddressOptions();
  104. }
  105. }
  106. void ProjectDialog::on_comboBoxAddr_2_currentIndexChanged(int index) {
  107. if (index >= 0 && index < L2AddressOptions.size()) {
  108. QJsonArray subOptions = L2AddressOptions[index].toObject()["children"].toArray();
  109. L3AddressOptions = subOptions;
  110. updateL3AddressOptions();
  111. }
  112. }
  113. void ProjectDialog::validateAndSaveProject() {
  114. for (const auto &pair :
  115. ui->undergroundOperatorsWidget->findChild<MultiSelectComboBox *>()->checkedItemsWithKeys()) {
  116. selectedBlasters.append(pair.first);
  117. }
  118. for (const auto &pair : ui->groundOperatorsWidget->findChild<MultiSelectComboBox *>()->checkedItemsWithKeys()) {
  119. selectedOperators.append(pair.first);
  120. }
  121. for (const auto &pair : ui->safetyInspectorsWidget->findChild<MultiSelectComboBox *>()->checkedItemsWithKeys()) {
  122. selectedSafetyInspectors.append(pair.first);
  123. }
  124. QString detNum = ui->editDetNum->text().trimmed();
  125. QString blastCount = ui->editRegCount->text().trimmed();
  126. QString projectName = ui->editName->text().trimmed();
  127. QString xmbh = ui->editXMBH->text().trimmed();
  128. QString htid = ui->editHTID->text().trimmed();
  129. if (detNum.isEmpty() || !ui->editDetNum->hasAcceptableInput()) {
  130. QMessageBox::warning(nullptr, "输入错误", "请输入0-10000的数字!");
  131. return;
  132. }
  133. if (selectedBlasters.isEmpty()) {
  134. QMessageBox::warning(nullptr, "选择错误", "请至少选择一名井下爆破员!");
  135. return;
  136. }
  137. if (selectedOperators.isEmpty()) {
  138. QMessageBox::warning(nullptr, "选择错误", "请至少选择一名井上爆破员!");
  139. return;
  140. }
  141. if (selectedSafetyInspectors.isEmpty()) {
  142. QMessageBox::warning(nullptr, "选择错误", "请至少选择一名安全员!");
  143. return;
  144. }
  145. // 创建一个 QMap 集合,存储数据
  146. QMap<QString, QString> data;
  147. data["detNum"] = detNum;
  148. data["name"] = projectName;
  149. data["xmbh"] = xmbh;
  150. data["htid"] = htid;
  151. // 选择level最低的uuid
  152. QString addressUuid = ui->comboBoxAddr->currentData().toString().trimmed();
  153. QString l2AddressUuid = ui->comboBoxAddr_2->currentData().toString().trimmed();
  154. QString l3AddressUuid = ui->comboBoxAddr_3->currentData().toString().trimmed();
  155. QString l1AddressName = ui->comboBoxAddr->currentText().trimmed();
  156. QString l2AddressName = ui->comboBoxAddr_2->currentText().trimmed();
  157. QString l3AddressName = ui->comboBoxAddr_3->currentText().trimmed();
  158. if (l3AddressUuid != "") {
  159. addressUuid = l3AddressUuid;
  160. } else if (l2AddressUuid != "") {
  161. addressUuid = l2AddressUuid;
  162. } else if (addressUuid == "") {
  163. QMessageBox::warning(nullptr, "输入错误", "请选择地址!");
  164. return;
  165. }
  166. data["addressPath"] = l1AddressName + "/" + l2AddressName + "/" + l3AddressName;
  167. data["addressUuid"] = addressUuid;
  168. data["blasterIdentity"] = selectedBlasters.join(",");
  169. data["operatorIdentity"] = selectedOperators.join(",");
  170. data["safetyInspectorIdentity"] = selectedSafetyInspectors.join(",");
  171. data["blastCount"] = blastCount;
  172. if (operationType == 0) {
  173. qDebug() << "Project data to create:" << data;
  174. emit createProject(data);
  175. } else if (operationType == 1) {
  176. qDebug() << "Project data to update:" << data;
  177. emit saveProject(data);
  178. }
  179. clearFormData(); // 清除表单数据
  180. }
  181. int ProjectDialog::getOperationType() const { return operationType; }
  182. void ProjectDialog::setOperationType(int newOperationType) { operationType = newOperationType; }
  183. void ProjectDialog::setFormData(const HProject &Project) {
  184. try {
  185. clearFormData(); // 清除表单数据
  186. // hide the accept button
  187. ui->buttonBox->button(QDialogButtonBox::Ok)->setVisible(false);
  188. ui->editName->setText(Project.getName());
  189. ui->editDetNum->setText(Project.getDetSum());
  190. ui->editHTID->setText(Project.getHtid());
  191. ui->editXMBH->setText(Project.getXmbh());
  192. ui->editRegCount->setText(Project.getBlastCount());
  193. ui->level4Address->setText(Project.getLevel4Address());
  194. ui->groundOperatorsWidget->findChild<MultiSelectComboBox *>()->setCheckedKeys(
  195. Project.getOperatorIdentity().split(","));
  196. ui->undergroundOperatorsWidget->findChild<MultiSelectComboBox *>()->setCheckedKeys(
  197. Project.getBlasterIdentity().split(","));
  198. ui->safetyInspectorsWidget->findChild<MultiSelectComboBox *>()->setCheckedKeys(
  199. Project.getSafetyInspectorIdentity().split(","));
  200. // 设置地址选择
  201. QStringList addressParts = Project.getAddressPath().split("/");
  202. int numAddresses = addressParts.size();
  203. QVector<QString> addressVariables;
  204. for (int i = 0; i < numAddresses; ++i) {
  205. QString part = addressParts[i];
  206. addressVariables.append(part);
  207. }
  208. // 查找目标文本对应的索引
  209. int indexAddr = ui->comboBoxAddr->findText(addressVariables[0]);
  210. if (indexAddr != -1) {
  211. // 如果找到了对应的索引,设置为当前索引
  212. ui->comboBoxAddr->setCurrentIndex(indexAddr);
  213. } else {
  214. qDebug() << "未找到选项 " << addressVariables[0];
  215. }
  216. if (addressVariables.size() >= 2) {
  217. int indexAddr_2 = ui->comboBoxAddr_2->findText(addressVariables[1]);
  218. if (indexAddr_2 != -1) {
  219. // 如果找到了对应的索引,设置为当前索引
  220. ui->comboBoxAddr_2->setCurrentIndex(indexAddr_2);
  221. } else {
  222. qDebug() << "未找到选项 " << addressVariables[1];
  223. }
  224. }
  225. if (addressVariables.size() >= 3) {
  226. int indexAddr_3 = ui->comboBoxAddr_3->findText(addressVariables[2]);
  227. if (indexAddr_3 != -1) {
  228. // 如果找到了对应的索引,设置为当前索引
  229. ui->comboBoxAddr_3->setCurrentIndex(indexAddr_3);
  230. } else {
  231. // 如果没找到,输出提示信息
  232. qDebug() << "未找到选项 " << addressVariables[2];
  233. }
  234. }
  235. } catch (const std::exception &e) {
  236. Logger::getInstance().error(QString("设置表单数据时发生异常: %1").arg(e.what()));
  237. QMessageBox::warning(this, "错误", "无法设置表单数据,请检查数据格式是否正确。");
  238. }
  239. }
  240. ProjectDialog::~ProjectDialog() { delete ui; }