瀏覽代碼

dev: change project data source to web server

YaoH 4 天之前
父節點
當前提交
6f535dbdc9

+ 21 - 11
blastJob/blastopepage.cpp

@@ -12,10 +12,10 @@
 #include "countdownwidget.h"
 #include "ui_blastopepage.h"
 
-const int ColIndexBlastStatus = 7;
-const int ColIndexProgressBar = 8;
-const int ColIndexOpBtn = 9;
-const int ColIndexUuid = 10;
+const int ColIndexBlastStatus = 6;
+const int ColIndexProgressBar = 7;
+const int ColIndexOpBtn = 8;
+const int ColIndexUuid = 9;
 
 BlastOpePage::BlastOpePage(QWidget *parent)
     : QWidget(parent), ui(new Ui::BlastOpePage), dao(DatabaseManager::getInstance().getDatabase()) {
@@ -250,21 +250,28 @@ void BlastOpePage::initPagination() {
 void BlastOpePage::RefreshData() { loadDataAndDrawTable(m_currentPage, m_pageSize); }
 
 void BlastOpePage::loadDataAndDrawTable(int currentPage, int pageSize) {
-    PaginatedHProjectResult result = dao.getAllHProjectsByOpera(currentPage, pageSize);
-    QList<QSharedPointer<HProject>> projectList = result.projects;
-    totalCount = result.totalCount;
+    LoadingWidget::showLoading(this, "正在加载数据...");
+    QJsonObject extParams{{"blast_status", QJsonArray({"2"})}};
+    QJsonObject result = backendAPIManager::getHProjects(currentPage, pageSize, extParams);
+
+    QList<QSharedPointer<HProject>> projectList =
+        dao.getHProjectsFromJsonArray(result["data"].toObject()["list"].toArray());
+
+    totalCount = result["data"].toObject()["count"].toInt();
     pageWidget->setMaxPage(ceil(static_cast<double>(totalCount) / pageSize));
 
     model = new QStandardItemModel(this);
+    qDebug() << "项目列表大小: " << projectList;
 
     headers = {
         {"选择", ""},
         {"工程名称", "name"},
-        {"井上爆破员", "operatorName"},
-        {"井下爆破员", "blasterName"},
+        //{"井上爆破员", "operatorName"},
+        // {"井下爆破员", "blasterName"},
         {"井下地址", "addressPath"},
         {"雷管数量", "detSum"},
-        {"起爆器数量", "blastCount"},
+        {"炸药量(kg)", "blastCount"},
+        {"井下起爆器", "pcSn"},
         {"起爆状态", "blastStatus"},
         {"进度", ""},
         {"操作", ""},
@@ -296,10 +303,11 @@ void BlastOpePage::loadDataAndDrawTable(int currentPage, int pageSize) {
                 QMetaProperty metaProp =
                     HProject.metaObject()->property(HProject.metaObject()->indexOfProperty(prop.toUtf8()));
                 QVariant value = metaProp.read(&HProject);
+                qDebug() << "prop: " << prop << ", value: " << value;
 
                 if (prop == "blastStatus") {
                     QString statusText;
-                    if (value.toString() == BlastStatus::SafeChecked) {
+                    if (value.toString() == BlastStatus::Registered) {
                         statusText = "待起爆";
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#f3a3k'k1"));
@@ -420,6 +428,8 @@ void BlastOpePage::loadDataAndDrawTable(int currentPage, int pageSize) {
                     [this, row, button]() { handleSingleBlastButtonClicked(row, button); });
         }
     }
+
+    LoadingWidget::hideLoading();
 }
 
 // 切换页数

+ 4 - 0
blastProject/HProjectDao.h

@@ -1,6 +1,9 @@
 #ifndef HPROJECTDAO_H
 #define HPROJECTDAO_H
 
+#include <QDateTime>
+#include <QJsonArray>
+#include <QJsonObject>
 #include <QList>
 #include <QMessageBox>
 #include <QObject>
@@ -28,6 +31,7 @@ class HProjectDao {
     PaginatedHProjectResult getAllHProjectsByOpera(int page, int pageSize);
     QList<QSharedPointer<HProject>> getAllHProjectsReg();
     QList<QSharedPointer<HProject>> getRegistedProjectByAddressUuid(QList<QString> addressUuids);
+    QList<QSharedPointer<HProject>> getHProjectsFromJsonArray(const QJsonArray &jsonArray);
 
    private:
     QSqlDatabase database;

+ 52 - 39
blastProject/blastprojectpage.cpp

@@ -1,9 +1,11 @@
 #include "blastprojectpage.h"
 
+#include <QJsonArray>
+#include <QJsonObject>
 #include <QUrl>
-#include <iostream>
 
 #include "../components/buttondelegate.h"
+#include "../components/loadingWidget.h"
 #include "../utils/backendapimanager.h"
 #include "../utils/databasemanager.h"
 #include "../utils/global.h"
@@ -11,7 +13,6 @@
 
 #define BLASTER_ROLE_ID 4
 #define OPERATOR_ROLE_ID 7
-#define SAFEGUARD_ROLE_ID 5
 
 BlastProjectPage::BlastProjectPage(QWidget *parent)
     : QWidget(parent), ui(new Ui::BlastProjectPage), dao(DatabaseManager::getInstance().getDatabase()) {
@@ -29,6 +30,7 @@ BlastProjectPage::BlastProjectPage(QWidget *parent)
     addressOptions(pcs);
 
     QJsonArray allUsers = backendAPIManager::getSysUsers();
+
     for (const QJsonValue &value : allUsers) {
         if (value.isObject()) {
             QJsonObject obj = value.toObject();
@@ -49,11 +51,14 @@ void BlastProjectPage::refreshData() {
 }
 
 void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
-    PaginatedHProjectResult result = dao.getAllHProjects(currentPage, pageSize);
+    LoadingWidget::showLoading(this, "正在加载数据...");
+    QJsonObject extParams({{"blast_status", QJsonArray({"2", "1"})}});
+    QJsonObject result = backendAPIManager::getHProjects(currentPage, pageSize, extParams);
 
-    QList<QSharedPointer<HProject>> projectList = result.projects;
+    QList<QSharedPointer<HProject>> projectList =
+        dao.getHProjectsFromJsonArray(result["data"].toObject()["list"].toArray());
 
-    totalCount = result.totalCount;
+    totalCount = result["data"].toObject()["count"].toInt();
     pageWidget->setMaxPage(ceil(static_cast<double>(totalCount) / pageSize));
     QStandardItemModel *model;
     model = new QStandardItemModel(this);
@@ -61,7 +66,6 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
     // 定义表头信息
     QList<HeaderInfo> headers = {
         {"工程名称", "name"},
-        {"安全员", "safetyInspectorIdentity"},
         {"井上爆破员", "operatorIdentity"},
         {"井下爆破员", "blasterIdentity"},
         {"井下地址", "addressPath"},
@@ -97,14 +101,9 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#e7c66b"));
                     } else if (value.toString() == BlastStatus::Registered) {
-                        statusText = "待安全确认";
-                        item = new QStandardItem(statusText);
-                        item->setForeground(QColor("#f3a361"));
-                    } else if (value.toString() == BlastStatus::SafeChecked) {
-                        statusText = "待起爆";
+                        statusText = "已注册";
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#f3a361"));
-
                     } else if (value.toString() == BlastStatus::Blasted) {
                         statusText = "起爆完成";
                         item = new QStandardItem(statusText);
@@ -112,13 +111,19 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
                     } else {
                         item = new QStandardItem(value.toString());
                     }
-                } else if (QStringList({"safetyInspectorIdentity", "operatorIdentity", "blasterIdentity"})
-                               .contains(prop)) {
-                    item = new QStandardItem(getUserNameByIds(value.toString().split(",")));
+                } else if (prop == "operatorIdentity" || prop == "blasterIdentity") {
+                    QJsonArray userInfoArray = getUserInfoByIds(value.toString().split(","));
+                    QStringList userNames;
+                    for (const QJsonValue &value : userInfoArray) {
+                        if (value.isObject()) {
+                            QJsonObject obj = value.toObject();
+                            userNames.append(obj["name"].toString());
+                        }
+                    }
+                    item = new QStandardItem(userNames.join(","));
                 } else {
                     item = new QStandardItem(value.toString());
                 }
-
             } else {
                 item = new QStandardItem("操作");
                 item->setTextAlignment(Qt::AlignCenter);
@@ -148,6 +153,7 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
         }
     });
     ui->tableView->setItemDelegateForColumn(headerCount - 1, delegate);
+    LoadingWidget::hideLoading();
 }
 
 void BlastProjectPage::PageChanged(int page) {
@@ -166,7 +172,6 @@ void BlastProjectPage::onComboBoxIndexChanged(int index) {
 void BlastProjectPage::initUserAndDialogOptions(const QJsonArray &dataArray) {
     QJsonArray blasterDeployerArray;
     QJsonArray operatorArray;
-    QJsonArray safeGuardArray;
     for (const QJsonValue &value : dataArray) {
         if (value.isObject()) {
             QJsonObject obj = value.toObject();
@@ -179,16 +184,12 @@ void BlastProjectPage::initUserAndDialogOptions(const QJsonArray &dataArray) {
                 if (roleIdsArray.contains(OPERATOR_ROLE_ID)) {  // 井上爆破员
                     operatorArray.append(obj);
                 }
-                if (roleIdsArray.contains(SAFEGUARD_ROLE_ID)) {  // 安全员
-                    safeGuardArray.append(obj);
-                }
             }
         }
     }
 
     m_dialog->initComboBoxBlaster(blasterDeployerArray);
     m_dialog->initComboBoxOperator(operatorArray);
-    m_dialog->initComboBoxSafetyInspectors(safeGuardArray);
 }
 
 void BlastProjectPage::addressOptions(const QJsonArray &dataArrayAddress) {
@@ -203,11 +204,13 @@ void BlastProjectPage::parseJsonString(const QJsonDocument &jsonDoc) {
 }
 
 void BlastProjectPage::on_pushButton_clicked() {
-    m_dialog->setModal(false);
-    m_dialog->clearFormData();
-    m_dialog->setOperationType(0);
-    int ref = m_dialog->exec();
-    if (ref == QDialog::Accepted) {};
+    // m_dialog->setModal(false);
+    // m_dialog->clearFormData();
+    // m_dialog->setOperationType(0);
+    // int ref = m_dialog->exec();
+    // if (ref == QDialog::Accepted) {};
+
+    refreshData();
 }
 
 void BlastProjectPage::createProject(const QMap<QString, QString> &data) {
@@ -218,7 +221,6 @@ void BlastProjectPage::createProject(const QMap<QString, QString> &data) {
     project.setAddressPath(data.value("addressPath"));
     project.setBlasterIdentity(data.value("blasterIdentity"));
     project.setOperatorIdentity(data.value("operatorIdentity"));
-    project.setSafetyInspectorIdentity(data.value("safetyInspectorIdentity"));
     project.setLevel4Address(data.value("level4Address"));
     project.setBlastCount(data.value("blastCount"));
     project.setBlastStatus("1");
@@ -242,25 +244,36 @@ QJsonArray BlastProjectPage::getUserInfoByIds(const QStringList &userIds) {
             userInfo["identity"] = userId;
             userInfoArray.append(userInfo);
         } else {
-            QMessageBox::critical(this, "错误", QString("用户(身份证: %1)不存在").arg(userId));
+            // TODO
+            continue;
         }
     }
     return userInfoArray;
 }
 
 void BlastProjectPage::publishAllPendingBlastProjects() {
-    QJsonArray jsonArray;
-    QList<QSharedPointer<HProject>> projectsReg = dao.getAllHProjectsReg();
-    for (const auto &projectPtr : projectsReg) {
-        if (projectPtr) {
-            QJsonObject projectJson = projectPtr->ProjectToJson(*projectPtr);
-            projectJson["undergroundBlasters"] = getUserInfoByIds(projectPtr->getBlasterIdentity().split(","));
-            projectJson["groundBlasters"] = getUserInfoByIds(projectPtr->getOperatorIdentity().split(","));
-            // projectJson["safetyInspectors"] = getUserInfoByIds(projectPtr->getSafetyInspectorIdentity().split(","));
-            jsonArray.append(projectJson);
-        }
+    QJsonObject extParams{{"blast_status", QJsonArray({"1", "2"})}};
+    QJsonObject result = backendAPIManager::getHProjects(currentPage, pageSize, extParams);
+
+    QJsonArray jsonArray = result["data"].toObject()["list"].toArray();
+    for (int i = 0; i < jsonArray.size(); ++i) {
+        QJsonObject projectObj = jsonArray[i].toObject();
+        QStringList blasterIds = projectObj["blasterIdentity"].toString().split(",");
+        QStringList operatorIds = projectObj["operatorIdentity"].toString().split(",");
+        // remove blasterIdentity and operatorIdentity from projectObj
+        projectObj.remove("blasterIdentity");
+        projectObj.remove("operatorIdentity");
+        projectObj.remove("blasterName");
+        projectObj.remove("operatorName");
+
+        QJsonArray blasterInfo = getUserInfoByIds(blasterIds);
+        QJsonArray operatorInfo = getUserInfoByIds(operatorIds);
+
+        projectObj["underground_blasters"] = blasterInfo;
+        projectObj["ground_blasters"] = operatorInfo;
+
+        jsonArray[i] = QJsonValue(projectObj);
     }
-
     QJsonDocument jsonDoc(jsonArray);
     QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Indented);
 

+ 1 - 1
blastProject/blastprojectpage.ui

@@ -107,7 +107,7 @@ QPushButton {
          </size>
         </property>
         <property name="text">
-         <string>创建</string>
+         <string>刷新</string>
         </property>
        </widget>
       </item>

+ 3 - 3
blastProject/hproject.cpp

@@ -103,9 +103,9 @@ QJsonObject HProject::ProjectToJson(const HProject &project) {
     jsonObject["companyCode"] = project.getCompanyCode();
     jsonObject["detSum"] = project.getDetSum();
     jsonObject["address"] = project.getAddressUuid();
-    //jsonObject["blasterIdentity"] = project.getBlasterIdentity();
-    //jsonObject["operatorIdentity"] = project.getOperatorIdentity();
-    //jsonObject["safetyInspectorIdentity"] = project.getSafetyInspectorIdentity();
+    // jsonObject["blasterIdentity"] = project.getBlasterIdentity();
+    // jsonObject["operatorIdentity"] = project.getOperatorIdentity();
+    // jsonObject["safetyInspectorIdentity"] = project.getSafetyInspectorIdentity();
     jsonObject["level4Address"] = project.getLevel4Address();
     jsonObject["blastCount"] = project.getBlastCount();
 

+ 4 - 0
blastProject/hproject.h

@@ -25,6 +25,7 @@ class HProject : public QObject {
     Q_PROPERTY(QString operatorIdentity READ getOperatorIdentity WRITE setOperatorIdentity)
     Q_PROPERTY(QString safetyInspectorIdentity READ getSafetyInspectorIdentity WRITE setSafetyInspectorIdentity)
     Q_PROPERTY(QString blasterIdentity READ getBlasterIdentity WRITE setBlasterIdentity)
+    Q_PROPERTY(QString pcSn READ getPcSn WRITE setPcSn)
     Q_PROPERTY(QString addressUuid READ getAddressUuid WRITE setAddressUuid)
     Q_PROPERTY(QString addressPath READ getAddressPath WRITE setAddressPath)
     Q_PROPERTY(QString level4Address READ getLevel4Address WRITE setLevel4Address)
@@ -105,6 +106,9 @@ class HProject : public QObject {
     QString getBlastCount() const;
     void setBlastCount(const QString &newBlastCount);
 
+    QString getPcSn() const { return pcSn; }
+    void setPcSn(const QString &newPcSn) { pcSn = newPcSn; }
+
     QString getLevel4Address() const;
     void setLevel4Address(const QString &newLoraSn);
 

+ 54 - 2
blastProject/hprojectdao.cpp

@@ -152,7 +152,7 @@ PaginatedHProjectResult HProjectDao::getAllHProjectsByOpera(int page, int pageSi
         "SELECT * FROM h_project WHERE blast_status = :safeCheckedStatus and deleted_at IS NULL ORDER BY created_at "
         "desc "
         "LIMIT :pageSize OFFSET :offset");
-    query.bindValue(":safeCheckedStatus", BlastStatus::SafeChecked);
+    query.bindValue(":safeCheckedStatus", BlastStatus::Registered);
     query.bindValue(":pageSize", pageSize);
     query.bindValue(":offset", offset);
     if (query.exec()) {
@@ -164,7 +164,7 @@ PaginatedHProjectResult HProjectDao::getAllHProjectsByOpera(int page, int pageSi
     }
 
     query.prepare("SELECT COUNT(*) FROM h_project WHERE blast_status = :safeCheckedStatus and deleted_at IS NULL");
-    query.bindValue(":safeCheckedStatus", BlastStatus::SafeChecked);
+    query.bindValue(":safeCheckedStatus", BlastStatus::Registered);
     int totalCount = 0;
     if (query.exec() && query.next()) {
         totalCount = query.value(0).toInt();
@@ -272,3 +272,55 @@ QSharedPointer<HProject> HProjectDao::recordToProject(const QSqlRecord &record)
     project->setUpdateBy(record.value("update_by").toInt());
     return project;
 }
+
+QList<QSharedPointer<HProject>> HProjectDao::getHProjectsFromJsonArray(const QJsonArray &jsonArray) {
+    QList<QSharedPointer<HProject>> projects;
+
+    for (const QJsonValue &value : jsonArray) {
+        if (value.isObject()) {
+            QJsonObject obj = value.toObject();
+            QSharedPointer<HProject> project = QSharedPointer<HProject>::create();
+
+            // 解析JSON对象并设置HProject属性
+            project->setId(obj["id"].toInt());
+            project->setUuid(obj["uuid"].toString());
+            project->setName(obj["name"].toString());
+            project->setCompanyCode(obj["companyCode"].toString());
+            project->setHtid(obj["htid"].toString());
+            project->setXmbh(obj["xmbh"].toString());
+            project->setOperatorIdentity(obj["operatorIdentity"].toString());
+            project->setBlasterIdentity(obj["blasterIdentity"].toString());
+
+            // 处理地址相关字段
+            project->setAddressPath(obj["address"].toString());
+            project->setLevel4Address(obj["lv4Address"].toString());
+
+            // 处理数值字段
+            project->setDetSum(QString::number(obj["detSum"].toInt()));
+            project->setBlastCount(QString::number(obj["explosiveQuantity"].toInt()));
+            project->setPcSn(obj["pcSn"].toString());
+
+            // 处理状态
+            project->setBlastStatus(obj["blastStatus"].toString());
+
+            // 处理时间字段
+            QString createdAtStr = obj["createdAt"].toString();
+            if (!createdAtStr.isEmpty()) {
+                project->setCreatedAt(QDateTime::fromString(createdAtStr, Qt::ISODateWithMs));
+            }
+
+            QString updatedAtStr = obj["updatedAt"].toString();
+            if (!updatedAtStr.isEmpty()) {
+                project->setUpdatedAt(QDateTime::fromString(updatedAtStr, Qt::ISODateWithMs));
+            }
+
+            // 处理创建者和更新者
+            project->setCreateBy(obj["createBy"].toInt());
+            project->setUpdateBy(obj["updateBy"].toInt());
+
+            projects.append(project);
+        }
+    }
+
+    return projects;
+}

+ 3 - 30
blastProject/projectdialog.cpp

@@ -34,22 +34,6 @@ void ProjectDialog::initComboBoxBlaster(const QJsonArray &undergroundOperators)
     layout->addWidget(comboBox);
 }
 
-void ProjectDialog::initComboBoxSafetyInspectors(const QJsonArray &safeInspectors) {
-    MultiSelectComboBox *comboBox = new MultiSelectComboBox(this);
-
-    for (const QJsonValue &value : safeInspectors) {
-        if (value.isObject()) {
-            QJsonObject obj = value.toObject();
-            if (obj.contains("nickName")) {
-                QString name = obj["nickName"].toString();
-                comboBox->addItem(obj["identity"].toString(), name);
-            }
-        }
-    }
-    QVBoxLayout *layout = new QVBoxLayout(ui->safetyInspectorsWidget);
-    layout->addWidget(comboBox);
-}
-
 void ProjectDialog::initComboBoxOperator(const QJsonArray &groundOperators) {
     MultiSelectComboBox *comboBox = new MultiSelectComboBox(this);
 
@@ -71,7 +55,7 @@ void ProjectDialog::SetL1AddressOptions(const QJsonArray &Options) {
     ui->comboBoxAddr->clear();
 
     for (const QJsonValue &option : Options) {
-        ui->comboBoxAddr->addItem(option.toObject()["name"].toString(), option.toObject()["uuid"].toString());
+        ui->comboBoxAddr->addItem(option.toObject()["name"].toString(), option.toObject()["name"].toString());
     }
     ui->comboBoxAddr->setCurrentIndex(-1);
 }
@@ -79,7 +63,7 @@ void ProjectDialog::SetL1AddressOptions(const QJsonArray &Options) {
 void ProjectDialog::updateL2AddressOptions() {
     ui->comboBoxAddr_2->clear();
     for (const QJsonValue &child : L2AddressOptions) {
-        ui->comboBoxAddr_2->addItem(child.toObject()["name"].toString(), child.toObject()["uuid"].toString());
+        ui->comboBoxAddr_2->addItem(child.toObject()["name"].toString(), child.toObject()["name"].toString());
     }
     ui->comboBoxAddr_2->setCurrentIndex(-1);
 }
@@ -87,7 +71,7 @@ void ProjectDialog::updateL2AddressOptions() {
 void ProjectDialog::updateL3AddressOptions() {
     ui->comboBoxAddr_3->clear();
     for (const QJsonValue &child : L3AddressOptions) {
-        ui->comboBoxAddr_3->addItem(child.toObject()["name"].toString(), child.toObject()["uuid"].toString());
+        ui->comboBoxAddr_3->addItem(child.toObject()["name"].toString(), child.toObject()["name"].toString());
     }
     ui->comboBoxAddr_3->setCurrentIndex(-1);
 }
@@ -110,7 +94,6 @@ void ProjectDialog::clearFormData() {
     // 清除选中数据
     selectedBlasters.clear();
     selectedOperators.clear();
-    selectedSafetyInspectors.clear();  // Add this line
 
     // 显示确认按钮
     ui->buttonBox->button(QDialogButtonBox::Ok)->setVisible(true);
@@ -139,9 +122,6 @@ void ProjectDialog::validateAndSaveProject() {
     for (const auto &pair : ui->groundOperatorsWidget->findChild<MultiSelectComboBox *>()->checkedItemsWithKeys()) {
         selectedOperators.append(pair.first);
     }
-    for (const auto &pair : ui->safetyInspectorsWidget->findChild<MultiSelectComboBox *>()->checkedItemsWithKeys()) {
-        selectedSafetyInspectors.append(pair.first);
-    }
 
     QString detNum = ui->editDetNum->text().trimmed();
     QString blastCount = ui->editRegCount->text().trimmed();
@@ -161,10 +141,6 @@ void ProjectDialog::validateAndSaveProject() {
         QMessageBox::warning(nullptr, "选择错误", "请至少选择一名井上爆破员!");
         return;
     }
-    if (selectedSafetyInspectors.isEmpty()) {
-        QMessageBox::warning(nullptr, "选择错误", "请至少选择一名安全员!");
-        return;
-    }
 
     // 创建一个 QMap 集合,存储数据
     QMap<QString, QString> data;
@@ -194,7 +170,6 @@ void ProjectDialog::validateAndSaveProject() {
     data["addressUuid"] = addressUuid;
     data["blasterIdentity"] = selectedBlasters.join(",");
     data["operatorIdentity"] = selectedOperators.join(",");
-    data["safetyInspectorIdentity"] = selectedSafetyInspectors.join(",");
     data["blastCount"] = blastCount;
 
     if (operationType == 0) {
@@ -229,8 +204,6 @@ void ProjectDialog::setFormData(const HProject &Project) {
             Project.getOperatorIdentity().split(","));
         ui->undergroundOperatorsWidget->findChild<MultiSelectComboBox *>()->setCheckedKeys(
             Project.getBlasterIdentity().split(","));
-        ui->safetyInspectorsWidget->findChild<MultiSelectComboBox *>()->setCheckedKeys(
-            Project.getSafetyInspectorIdentity().split(","));
 
         // 设置地址选择
         QStringList addressParts = Project.getAddressPath().split("/");

+ 13 - 23
blastProject/projectdialog.ui

@@ -63,6 +63,9 @@
        </property>
       </widget>
      </item>
+     <item row="3" column="1">
+      <widget class="QWidget" name="groundOperatorsWidget" native="true"/>
+     </item>
      <item row="4" column="0">
       <widget class="QLabel" name="labBlastName">
        <property name="text">
@@ -70,21 +73,17 @@
        </property>
       </widget>
      </item>
-     <item row="5" column="0">
-      <widget class="QLabel" name="label_2">
-       <property name="text">
-        <string>安全员:</string>
-       </property>
-      </widget>
+     <item row="4" column="1">
+      <widget class="QWidget" name="undergroundOperatorsWidget" native="true"/>
      </item>
-     <item row="6" column="0">
+     <item row="5" column="0">
       <widget class="QLabel" name="labAddress">
        <property name="text">
         <string>井下地址:</string>
        </property>
       </widget>
      </item>
-     <item row="6" column="1">
+     <item row="5" column="1">
       <layout class="QHBoxLayout" name="horizontalLayout">
        <item>
         <widget class="QComboBox" name="comboBoxAddr"/>
@@ -97,45 +96,36 @@
        </item>
       </layout>
      </item>
-     <item row="7" column="0">
+     <item row="6" column="0">
       <widget class="QLabel" name="label">
        <property name="text">
         <string>采场地址:</string>
        </property>
       </widget>
      </item>
-     <item row="7" column="1">
+     <item row="6" column="1">
       <widget class="QLineEdit" name="level4Address"/>
      </item>
-     <item row="8" column="0">
+     <item row="7" column="0">
       <widget class="QLabel" name="labRegCount">
        <property name="text">
         <string>起爆器数量:</string>
        </property>
       </widget>
      </item>
-     <item row="8" column="1">
+     <item row="7" column="1">
       <widget class="QLineEdit" name="editRegCount"/>
      </item>
-     <item row="9" column="0">
+     <item row="8" column="0">
       <widget class="QLabel" name="labDetNum">
        <property name="text">
         <string>雷管数量:</string>
        </property>
       </widget>
      </item>
-     <item row="9" column="1">
+     <item row="8" column="1">
       <widget class="QLineEdit" name="editDetNum"/>
      </item>
-     <item row="4" column="1">
-      <widget class="QWidget" name="undergroundOperatorsWidget" native="true"/>
-     </item>
-     <item row="5" column="1">
-      <widget class="QWidget" name="safetyInspectorsWidget" native="true"/>
-     </item>
-     <item row="3" column="1">
-      <widget class="QWidget" name="groundOperatorsWidget" native="true"/>
-     </item>
     </layout>
    </item>
   </layout>

+ 8 - 4
fireWidget/firingwidget.cpp

@@ -43,7 +43,10 @@ firingWidget::firingWidget(const int &row, const bool &select, const QString &uu
     ui->verticalLayout->setContentsMargins(0, 30, 0, 0);
     ui->scrollArea->setStyleSheet("background: rgba(0, 0, 0, 22); border-radius: 20px;");
     ui->verticalLayout->addWidget(navProgress);
-    m_topic = "hxgc/" + uuid + "/B";
+    // TODO
+    m_curProjUuid = "61c93e60e50e3439";
+    m_topic = "hxgc/" + m_curProjUuid + "/BlastTaskReply";
+    qDebug() << ANSI_COLOR_GREEN << "Firing widget created with topic: " << m_topic << ANSI_COLOR_RESET;
     QStringList topics = {m_topic};
     m_connectionCheckTimer = new QTimer(this);
 
@@ -274,7 +277,8 @@ void firingWidget::onSafeChecked(const QString projectUuid) {
 // 状态改变
 void firingWidget::handleFiringStageChanged(int newStage) {
     qDebug() << ANSI_COLOR_GREEN << "handleFiringStageChanged: " << newStage << ANSI_COLOR_RESET;
-    QString topic = "hxgc/" + m_curProjUuid + "/P";
+    m_curProjUuid = "61c93e60e50e3439";
+    QString topic = "hxgc/" + m_curProjUuid + "/BlastTask";
     QString message;
     QString buttonText;
     switch (newStage) {
@@ -355,6 +359,6 @@ void firingWidget::handleFiringStageChanged(int newStage) {
 
 void firingWidget::sendCancelFiringMsg() {
     QString message = "取消流程";
-    QString topic = "hxgc/" + m_curProjUuid + "/P";
+    QString topic = "hxgc/" + m_curProjUuid + "/BlastTask";
     sendMqttMessage(topic, message.toUtf8());
-}
+}

+ 1 - 85
mainwindow/mainwindow.cpp

@@ -178,19 +178,7 @@ void MainWindow::handleMqttProjectsMessage(const QMqttMessage &message) {
     if (!jsonDoc.isNull() && jsonDoc.isObject()) {
         // 注册工程信息
         QJsonObject jsonObj = jsonDoc.object();
-        if (jsonObj.contains("uuid") && jsonObj.contains("status")) {
-            QJsonValue uuidValue = jsonObj["uuid"];
-            QJsonValue statusValue = jsonObj["status"];
-            if (statusValue.isString() && statusValue.toString() == BlastStatus::Created) {  // "1" 未注册
-                if (uuidValue.isNull()) {
-                    qDebug() << "uuid 的值为 null";
-                } else {
-                    QString uuid = uuidValue.toString();
-                    HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
-                    dao.updateBlastStatusByUuid(uuid, BlastStatus::Registered);
-                }
-            }
-        } else if (jsonObj.contains("msgType") && jsonObj["msgType"].toString() == "blastSuccess") {
+         if (jsonObj.contains("msgType") && jsonObj["msgType"].toString() == "blastSuccess") {
             // 爆破成功, 更新状态; 尤其是离线爆破的; 服务器收到爆破记录后发布
             HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
             for (const QJsonValue &projectUuid : jsonObj["projectUuids"].toArray()) {
@@ -199,33 +187,6 @@ void MainWindow::handleMqttProjectsMessage(const QMqttMessage &message) {
             }
 
             publishBlastProjects();
-        } else if (jsonObj.contains("msgType") && jsonObj["msgType"].toString() == "safeCheck") {
-            // 处理安全验证消息
-            if (jsonObj["status"] != "ok") {
-                QMessageBox::warning(this, "安全验证失败", QString("安全验证未通过,请联系安全员确认"));
-                return;
-            }
-
-            const QString addressUuid = jsonObj["addressUuid"].toString();
-            QJsonArray addressList = backendAPIManager::getHAddresses();
-
-            QList<QString> subAddressUuids = findAllChildUuids(addressList, addressUuid);
-            subAddressUuids.append(addressUuid);  // 添加当前地址的 UUID
-            if (subAddressUuids.isEmpty()) {
-                QMessageBox::information(nullptr, "安全验证失败", QString("未找到子地址,请联系安全员确认"));
-                return;
-            }
-            HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
-
-            QList<QSharedPointer<HProject>> pendingCheckProjects = dao.getRegistedProjectByAddressUuid(subAddressUuids);
-            for (const auto &project : pendingCheckProjects) {
-                dao.updateBlastStatusByUuid(project->getUuid(), BlastStatus::SafeChecked);
-            }
-            if (!pendingCheckProjects.isEmpty()) {
-                QMessageBox::information(nullptr, "安全员确认信息",
-                                         QString("收到工程被安全员确认,请刷新查看爆破作业列表"));
-                return;
-            }
         }
     }
 }
@@ -304,48 +265,3 @@ void MainWindow::mouseMoveEvent(QMouseEvent *event) {
     //     event->accept();
     // }
 }
-
-QList<QString> MainWindow::findAllChildUuids(const QJsonArray &addressArray, const QString targetUuid) {
-    QList<QString> childrenUuids;
-
-    for (const QJsonValue &value : addressArray) {
-        if (!value.isObject()) continue;
-
-        QJsonObject addressObj = value.toObject();
-        QString currentUuid = addressObj["uuid"].toString();
-
-        if (currentUuid == targetUuid) {
-            // Found the target address, now collect all children UUIDs recursively
-            if (addressObj.contains("children") && addressObj["children"].isArray()) {
-                QJsonArray children = addressObj["children"].toArray();
-                for (const QJsonValue &child : children) {
-                    if (child.isObject()) {
-                        QString childUuid = child.toObject()["uuid"].toString();
-                        childrenUuids.append(childUuid);
-
-                        // max depth 3
-                        if (child.toObject().contains("children") && child.toObject()["children"].isArray()) {
-                            QJsonArray grandchildren = child.toObject()["children"].toArray();
-                            for (const QJsonValue &grandchild : grandchildren) {
-                                if (grandchild.isObject()) {
-                                    QString grandchildUuid = grandchild.toObject()["uuid"].toString();
-                                    childrenUuids.append(grandchildUuid);
-                                }
-                            }
-                        }
-                    }
-                }
-                return childrenUuids;
-            }
-        } else if (addressObj.contains("children") && addressObj["children"].isArray()) {
-            // Continue searching in children
-            QJsonArray children = addressObj["children"].toArray();
-            QList<QString> result = findAllChildUuids(children, targetUuid);
-            if (!result.isEmpty()) {
-                return result;
-            }
-        }
-    }
-
-    return childrenUuids;
-}

+ 59 - 5
utils/backendapimanager.cpp

@@ -62,10 +62,33 @@ QNetworkReply *backendAPIManager::sendRequest(const QString &endpoint, const QJs
             QUrl url = request.url();
             QUrlQuery query;
             for (const QString &key : data.keys()) {
-                query.addQueryItem(key, data.value(key).toString());
+                QJsonValue value = data.value(key);
+                if (value.isString()) {
+                    query.addQueryItem(key, value.toString());
+                } else if (value.isDouble()) {
+                    query.addQueryItem(key, QString::number(value.toDouble()));
+                } else if (value.isBool()) {
+                    query.addQueryItem(key, value.toBool() ? "true" : "false");
+                } else if (value.isArray()) {
+                    // 处理数组参数,将数组元素作为多个同名参数
+                    QJsonArray array = value.toArray();
+                    for (const QJsonValue &arrayValue : array) {
+                        query.addQueryItem(key, arrayValue.toString());
+                    }
+                } else {
+                    // 对于其他复杂类型,转换为JSON字符串
+                    QJsonDocument doc;
+                    if (value.isObject()) {
+                        doc.setObject(value.toObject());
+                    } else {
+                        doc.setArray(value.toArray());
+                    }
+                    query.addQueryItem(key, doc.toJson(QJsonDocument::Compact));
+                }
             }
             url.setQuery(query);
             request.setUrl(url);
+            qDebug() << "GET request URL:" << url.toString();
         }
         reply = networkManager->get(request);
     } else if (method == "POST") {
@@ -82,8 +105,8 @@ QJsonObject backendAPIManager::getBlastRecords(int page, int pageSize, QJsonObje
     if (!s_instance) return QJsonObject();
     s_instance->requestSuccess = false;
 
-    params.insert("page", page);
-    params.insert("pageSize", pageSize);
+    params.insert("page", QString::number(page));
+    params.insert("pageSize", QString::number(pageSize));
 
     QNetworkReply *reply = s_instance->sendRequest("blastrecord", params, "GET");
 
@@ -127,10 +150,41 @@ bool backendAPIManager::uploadBlastProjectFull(const QJsonObject &projectData) {
     return s_instance->requestSuccess;
 }
 
+QJsonObject backendAPIManager::getHProjects(int page, int pageSize, QJsonObject extParams) {
+    if (!s_instance) return QJsonObject();
+
+    QJsonObject params{
+        {"page", page},
+        {"pageSize", pageSize},
+        {"sort", "createdAt,desc"},
+        {"blast_status", QJsonArray({"2", "1"})},
+    };
+    // merge additional parameters if provided
+    for (const QString &key : extParams.keys()) {
+        params.insert(key, extParams.value(key));
+    }
+    QNetworkReply *reply = s_instance->sendRequest("h-project", params, "GET");
+
+    QEventLoop loop;
+    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
+    loop.exec();
+
+    QJsonObject result;
+    if (reply->error() == QNetworkReply::NoError) {
+        QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
+        result = response.object();
+    }
+
+    reply->deleteLater();
+    return result;
+}
+
 QJsonArray backendAPIManager::getSysUsers() {
     if (!s_instance) return QJsonArray();
-
-    QNetworkReply *reply = s_instance->sendRequest("sys-user", QJsonObject(), "GET");
+    QJsonObject params = QJsonObject();
+    params.insert("page", "1");
+    params.insert("pageSize", "200");  // Assuming a reasonable page size for initial
+    QNetworkReply *reply = s_instance->sendRequest("sys-user", params, "GET");
 
     QEventLoop loop;
     QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);

+ 1 - 0
utils/backendapimanager.h

@@ -21,6 +21,7 @@ class backendAPIManager : public QObject {
     static bool uploadBlastProject(const QJsonObject &projectData);
     static bool uploadBlastProjectDets(const QJsonObject &detsData);
     static bool uploadBlastEquipments(const QJsonObject &regDetsData);
+    static QJsonObject getHProjects(int page, int pageSize, QJsonObject extParams);
     static QJsonArray getSysUsers();
     static QJsonArray getHAddresses();
     static QJsonArray getDailyBlastedCount(int days);

+ 0 - 2
utils/global.h

@@ -57,7 +57,6 @@ const QString Created = "1";
 const QString Registered = "2";
 const QString Blasted = "3";
 const QString ErrorOccurred = "4";
-const QString SafeChecked = "5";
 }  // namespace BlastStatus
 
 namespace BlastStatusNames {
@@ -65,7 +64,6 @@ const QString Created = "未注册";
 const QString Registered = "已注册";
 const QString Blasted = "爆破完成";
 const QString ErrorOccurred = "爆破异常";
-const QString SafeChecked = "已安全检查";
 }  // namespace BlastStatusNames
 
 namespace ErrorBlastStatus {