projectdialog.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. #include "projectdialog.h"
  2. #include <QCheckBox>
  3. #include <QListView>
  4. #include <QPushButton>
  5. #include <QStandardItemModel>
  6. #include "ui_projectdialog.h"
  7. ProjectDialog::ProjectDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ProjectDialog) {
  8. ui->setupUi(this);
  9. connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &ProjectDialog::validateAndSaveProject);
  10. connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &ProjectDialog::clearFormData);
  11. }
  12. void ProjectDialog::SetComboBoxBlast(const QJsonArray &bapoYuanArray) {
  13. blasterArray = bapoYuanArray;
  14. // 创建标准项模型用于多选
  15. QStandardItemModel *blastModel = new QStandardItemModel(ui->comboBoxBlast);
  16. for (const QJsonValue &value : bapoYuanArray) {
  17. if (value.isObject()) {
  18. QJsonObject obj = value.toObject();
  19. if (obj.contains("nickName")) {
  20. QString name = obj["nickName"].toString();
  21. QStandardItem *item = new QStandardItem(name);
  22. item->setCheckable(true);
  23. item->setData(obj["identity"].toString(), Qt::UserRole);
  24. blastModel->appendRow(item);
  25. }
  26. }
  27. }
  28. ui->comboBoxBlast->setModel(blastModel);
  29. ui->comboBoxBlast->setView(new QListView(ui->comboBoxBlast));
  30. ui->comboBoxBlast->view()->setMinimumWidth(200);
  31. // 连接项变更信号
  32. connect(blastModel, &QStandardItemModel::itemChanged, this, &ProjectDialog::onBlasterItemChanged);
  33. }
  34. void ProjectDialog::SetComboBoxOperator(const QJsonArray &anQuanYuanArray) {
  35. operatorArray = anQuanYuanArray;
  36. // 创建标准项模型用于多选
  37. QStandardItemModel *operatorModel = new QStandardItemModel(ui->comboBoxOperator);
  38. for (const QJsonValue &value : anQuanYuanArray) {
  39. if (value.isObject()) {
  40. QJsonObject obj = value.toObject();
  41. if (obj.contains("nickName")) {
  42. QString name = obj["nickName"].toString();
  43. QStandardItem *item = new QStandardItem(name);
  44. item->setCheckable(true);
  45. item->setData(obj["identity"].toString(), Qt::UserRole);
  46. operatorModel->appendRow(item);
  47. }
  48. }
  49. }
  50. ui->comboBoxOperator->setModel(operatorModel);
  51. ui->comboBoxOperator->setView(new QListView(ui->comboBoxOperator));
  52. ui->comboBoxOperator->view()->setMinimumWidth(200);
  53. // 连接项变更信号
  54. connect(operatorModel, &QStandardItemModel::itemChanged, this, &ProjectDialog::onOperatorItemChanged);
  55. }
  56. void ProjectDialog::on_comboBoxOperator_currentIndexChanged(int index) {
  57. // 此槽函数保留以避免编译错误,但不再需要之前的功能
  58. // 多选框的变更由 onOperatorItemChanged 处理
  59. }
  60. void ProjectDialog::on_comboBoxBlast_currentIndexChanged(int index) {
  61. // 此槽函数保留以避免编译错误,但不再需要之前的功能
  62. // 多选框的变更由 onBlasterItemChanged 处理
  63. }
  64. void ProjectDialog::fillComboBox(QComboBox *comboBox, const QJsonArray &jsonArray) {
  65. for (const QJsonValue &value : jsonArray) {
  66. if (value.isObject()) {
  67. QJsonObject obj = value.toObject();
  68. if (obj.contains("nickName")) {
  69. QString name = obj["nickName"].toString();
  70. comboBox->addItem(name);
  71. }
  72. }
  73. }
  74. }
  75. void ProjectDialog::SetL1AddressOptions(const QJsonArray &Options) {
  76. parentOptions = Options;
  77. ui->comboBoxAddr->clear();
  78. for (const QJsonValue &option : Options) {
  79. ui->comboBoxAddr->addItem(option.toObject()["name"].toString(), option.toObject()["uuid"].toString());
  80. }
  81. ui->comboBoxAddr->setCurrentIndex(-1);
  82. }
  83. void ProjectDialog::updateL2AddressOptions() {
  84. ui->comboBoxAddr_2->clear();
  85. for (const QJsonValue &child : L2AddressOptions) {
  86. ui->comboBoxAddr_2->addItem(child.toObject()["name"].toString(), child.toObject()["uuid"].toString());
  87. }
  88. ui->comboBoxAddr_2->setCurrentIndex(-1);
  89. }
  90. void ProjectDialog::updateL3AddressOptions() {
  91. ui->comboBoxAddr_3->clear();
  92. for (const QJsonValue &child : L3AddressOptions) {
  93. ui->comboBoxAddr_3->addItem(child.toObject()["name"].toString(), child.toObject()["uuid"].toString());
  94. }
  95. ui->comboBoxAddr_3->setCurrentIndex(-1);
  96. }
  97. void ProjectDialog::setChildOptions(const QJsonArray &newDataOptions) { dataOptions = newDataOptions; }
  98. void ProjectDialog::extractNames(const QJsonArray &array, QStringList &names) {
  99. for (const auto &item : array) {
  100. if (item.isObject()) {
  101. QJsonObject obj = item.toObject();
  102. if (obj.contains("name")) {
  103. names.append(obj["name"].toString());
  104. }
  105. if (obj.contains("children") && obj["children"].isArray()) {
  106. extractNames(obj["children"].toArray(), names);
  107. }
  108. }
  109. }
  110. }
  111. void ProjectDialog::clearFormData() {
  112. QList<QLineEdit *> lineEdits = findChildren<QLineEdit *>();
  113. for (QLineEdit *lineEdit : lineEdits) {
  114. lineEdit->clear();
  115. }
  116. // 清除多选ComboBox
  117. if (ui->comboBoxBlast->model()) {
  118. QStandardItemModel *blastModel = qobject_cast<QStandardItemModel *>(ui->comboBoxBlast->model());
  119. if (blastModel) {
  120. for (int i = 0; i < blastModel->rowCount(); ++i) {
  121. QStandardItem *item = blastModel->item(i);
  122. if (item) {
  123. item->setCheckState(Qt::Unchecked);
  124. }
  125. }
  126. }
  127. ui->comboBoxBlast->setEditText("请选择井下爆破员");
  128. }
  129. if (ui->comboBoxOperator->model()) {
  130. QStandardItemModel *operatorModel = qobject_cast<QStandardItemModel *>(ui->comboBoxOperator->model());
  131. if (operatorModel) {
  132. for (int i = 0; i < operatorModel->rowCount(); ++i) {
  133. QStandardItem *item = operatorModel->item(i);
  134. if (item) {
  135. item->setCheckState(Qt::Unchecked);
  136. }
  137. }
  138. }
  139. ui->comboBoxOperator->setEditText("请选择井上爆破员");
  140. }
  141. // 清除普通ComboBox
  142. ui->comboBoxAddr->setCurrentIndex(-1);
  143. ui->comboBoxAddr_2->setCurrentIndex(-1);
  144. ui->comboBoxAddr_3->setCurrentIndex(-1);
  145. // 清除选中数据
  146. selectedBlasters.clear();
  147. selectedOperators.clear();
  148. blasterIds.clear();
  149. operatorIds.clear();
  150. // 显示确认按钮
  151. ui->buttonBox->button(QDialogButtonBox::Ok)->setVisible(true);
  152. }
  153. void ProjectDialog::on_comboBoxAddr_currentIndexChanged(int index) {
  154. if (index >= 0 && index < parentOptions.size()) {
  155. L2AddressOptions = parentOptions[index].toObject()["children"].toArray();
  156. updateL2AddressOptions();
  157. }
  158. }
  159. void ProjectDialog::on_comboBoxAddr_2_currentIndexChanged(int index) {
  160. if (index >= 0 && index < L2AddressOptions.size()) {
  161. QJsonArray subOptions = L2AddressOptions[index].toObject()["children"].toArray();
  162. L3AddressOptions = subOptions;
  163. updateL3AddressOptions();
  164. }
  165. }
  166. void ProjectDialog::validateAndSaveProject() {
  167. QString detNum = ui->editDetNum->text().trimmed();
  168. QString blastCount = ui->editRegCount->text().trimmed();
  169. QString projectName = ui->editName->text().trimmed();
  170. QString xmbh = ui->editXMBH->text().trimmed();
  171. QString htid = ui->editHTID->text().trimmed();
  172. if (detNum.isEmpty() || !ui->editDetNum->hasAcceptableInput()) {
  173. QMessageBox::warning(nullptr, "输入错误", "请输入0-10000的数字!");
  174. return;
  175. }
  176. if (selectedBlasters.isEmpty()) {
  177. QMessageBox::warning(nullptr, "选择错误", "请至少选择一名井下爆破员!");
  178. return;
  179. }
  180. if (selectedOperators.isEmpty()) {
  181. QMessageBox::warning(nullptr, "选择错误", "请至少选择一名井上爆破员!");
  182. return;
  183. }
  184. // 创建一个 QMap 集合,存储数据
  185. QMap<QString, QString> data;
  186. data["detNum"] = detNum;
  187. data["name"] = projectName;
  188. data["xmbh"] = xmbh;
  189. data["htid"] = htid;
  190. data["operatorName"] = selectedOperators.join(", ");
  191. data["blasterName"] = selectedBlasters.join(", ");
  192. // 选择level最低的uuid
  193. QString addressUuid = ui->comboBoxAddr->currentData().toString().trimmed();
  194. QString l2AddressUuid = ui->comboBoxAddr_2->currentData().toString().trimmed();
  195. QString l3AddressUuid = ui->comboBoxAddr_3->currentData().toString().trimmed();
  196. QString l1AddressName = ui->comboBoxAddr->currentText().trimmed();
  197. QString l2AddressName = ui->comboBoxAddr_2->currentText().trimmed();
  198. QString l3AddressName = ui->comboBoxAddr_3->currentText().trimmed();
  199. if (l3AddressUuid != "") {
  200. addressUuid = l3AddressUuid;
  201. } else if (l2AddressUuid != "") {
  202. addressUuid = l2AddressUuid;
  203. } else if (addressUuid == "") {
  204. QMessageBox::warning(nullptr, "输入错误", "请选择地址!");
  205. return;
  206. }
  207. data["addressPath"] = l1AddressName + "/" + l2AddressName + "/" + l3AddressName;
  208. data["addressUuid"] = addressUuid;
  209. data["blasterIdentity"] = blasterIds.join(",");
  210. data["operatorIdentity"] = operatorIds.join(",");
  211. data["blastCount"] = blastCount;
  212. if (operationStatus == 0) {
  213. emit validateDetNum(data);
  214. } else if (operationStatus == 1) {
  215. emit validateDetNumUpdate(data);
  216. }
  217. clearFormData(); // 清除表单数据
  218. }
  219. int ProjectDialog::getOperationStatus() const { return operationStatus; }
  220. void ProjectDialog::setOperationStatus(int newOperationStatus) { operationStatus = newOperationStatus; }
  221. void ProjectDialog::setFormData(const HProject &Project) {
  222. try {
  223. clearFormData(); // 清除表单数据
  224. // hide the accept button
  225. ui->buttonBox->button(QDialogButtonBox::Ok)->setVisible(false);
  226. ui->editName->setText(Project.getName());
  227. ui->editDetNum->setText(Project.getDetSum());
  228. ui->editHTID->setText(Project.getHtid());
  229. ui->editXMBH->setText(Project.getXmbh());
  230. ui->editRegCount->setText(Project.getBlastCount());
  231. ui->level4Address->setText(Project.getLevel4Address());
  232. // 设置井下爆破员多选
  233. QStringList blasterNames = Project.getBlasterName().split(", ");
  234. QStringList blasterIdList = Project.getBlasterIdentity().split(",");
  235. QStandardItemModel *blastModel = qobject_cast<QStandardItemModel *>(ui->comboBoxBlast->model());
  236. if (blastModel) {
  237. for (int i = 0; i < blastModel->rowCount(); ++i) {
  238. QStandardItem *item = blastModel->item(i);
  239. if (item && blasterNames.contains(item->text())) {
  240. item->setCheckState(Qt::Checked);
  241. }
  242. }
  243. }
  244. // 设置井上爆破员多选
  245. QStringList operatorNames = Project.getOperatorName().split(", ");
  246. QStringList operatorIdList = Project.getOperatorIdentity().split(",");
  247. QStandardItemModel *operatorModel = qobject_cast<QStandardItemModel *>(ui->comboBoxOperator->model());
  248. if (operatorModel) {
  249. for (int i = 0; i < operatorModel->rowCount(); ++i) {
  250. QStandardItem *item = operatorModel->item(i);
  251. if (item && operatorNames.contains(item->text())) {
  252. item->setCheckState(Qt::Checked);
  253. }
  254. }
  255. }
  256. // 更新已选择列表
  257. selectedBlasters = blasterNames;
  258. blasterIds = blasterIdList;
  259. selectedOperators = operatorNames;
  260. operatorIds = operatorIdList;
  261. // 更新ComboBox显示文本
  262. ui->comboBoxBlast->setEditText(selectedBlasters.join(", "));
  263. ui->comboBoxOperator->setEditText(selectedOperators.join(", "));
  264. // 设置地址选择
  265. QStringList addressParts = Project.getAddressPath().split("/");
  266. int numAddresses = addressParts.size();
  267. QVector<QString> addressVariables;
  268. for (int i = 0; i < numAddresses; ++i) {
  269. QString part = addressParts[i];
  270. addressVariables.append(part);
  271. }
  272. // 查找目标文本对应的索引
  273. int indexAddr = ui->comboBoxAddr->findText(addressVariables[0]);
  274. if (indexAddr != -1) {
  275. // 如果找到了对应的索引,设置为当前索引
  276. ui->comboBoxAddr->setCurrentIndex(indexAddr);
  277. qDebug() << "已将选项 " << addressVariables[0] << " 设置为当前显示的选项。";
  278. } else {
  279. // 如果没找到,输出提示信息
  280. qDebug() << "未找到选项 " << addressVariables[0];
  281. }
  282. if (addressVariables.size() >= 2) {
  283. int indexAddr_2 = ui->comboBoxAddr_2->findText(addressVariables[1]);
  284. if (indexAddr_2 != -1) {
  285. // 如果找到了对应的索引,设置为当前索引
  286. ui->comboBoxAddr_2->setCurrentIndex(indexAddr_2);
  287. qDebug() << "已将选项 " << addressVariables[1] << " 设置为当前显示的选项。";
  288. } else {
  289. // 如果没找到,输出提示信息
  290. qDebug() << "未找到选项 " << addressVariables[1];
  291. }
  292. }
  293. if (addressVariables.size() >= 3) {
  294. int indexAddr_3 = ui->comboBoxAddr_3->findText(addressVariables[2]);
  295. if (indexAddr_3 != -1) {
  296. // 如果找到了对应的索引,设置为当前索引
  297. ui->comboBoxAddr_3->setCurrentIndex(indexAddr_3);
  298. qDebug() << "已将选项 " << addressVariables[2] << " 设置为当前显示的选项。";
  299. } else {
  300. // 如果没找到,输出提示信息
  301. qDebug() << "未找到选项 " << addressVariables[2];
  302. }
  303. }
  304. } catch (const std::exception &e) {
  305. qDebug() << "发生异常: " << e.what();
  306. } catch (...) {
  307. qDebug() << "发生未知异常";
  308. }
  309. }
  310. void ProjectDialog::onBlasterItemChanged(QStandardItem *item) { updateSelectedBlasters(); }
  311. void ProjectDialog::onOperatorItemChanged(QStandardItem *item) { updateSelectedOperators(); }
  312. void ProjectDialog::updateSelectedBlasters() {
  313. selectedBlasters.clear();
  314. blasterIds.clear();
  315. QStandardItemModel *model = qobject_cast<QStandardItemModel *>(ui->comboBoxBlast->model());
  316. if (!model) return;
  317. for (int i = 0; i < model->rowCount(); ++i) {
  318. QStandardItem *item = model->item(i);
  319. if (item && item->checkState() == Qt::Checked) {
  320. selectedBlasters.append(item->text());
  321. blasterIds.append(item->data(Qt::UserRole).toString());
  322. }
  323. }
  324. // 更新显示的文本
  325. if (selectedBlasters.isEmpty()) {
  326. ui->comboBoxBlast->setEditText("请选择井下爆破员");
  327. } else {
  328. ui->comboBoxBlast->setEditText(selectedBlasters.join(", "));
  329. }
  330. }
  331. void ProjectDialog::updateSelectedOperators() {
  332. selectedOperators.clear();
  333. operatorIds.clear();
  334. QStandardItemModel *model = qobject_cast<QStandardItemModel *>(ui->comboBoxOperator->model());
  335. if (!model) return;
  336. for (int i = 0; i < model->rowCount(); ++i) {
  337. QStandardItem *item = model->item(i);
  338. if (item && item->checkState() == Qt::Checked) {
  339. selectedOperators.append(item->text());
  340. operatorIds.append(item->data(Qt::UserRole).toString());
  341. }
  342. }
  343. // 更新显示的文本
  344. if (selectedOperators.isEmpty()) {
  345. ui->comboBoxOperator->setEditText("请选择井上爆破员");
  346. } else {
  347. ui->comboBoxOperator->setEditText(selectedOperators.join(", "));
  348. }
  349. }
  350. ProjectDialog::~ProjectDialog() { delete ui; }