Pārlūkot izejas kodu

dev: 添加安全员逻辑

Yao 1 mēnesi atpakaļ
vecāks
revīzija
78364da199

+ 8 - 0
.gitignore

@@ -2,6 +2,14 @@
 .vscode/*
 .DS_Store
 .editorconfig
+.cache/
+.qt/
+Makefile
+CMakeCache.txt
+CMakeFiles/
+cmake_install.cmake
+compile_commands.json
+cspell.json
 
 # 忽略构建文件
 build/

+ 4 - 0
README.md

@@ -35,5 +35,9 @@
    目前一些请求需要cookie, 所以需要从登录页面进入才可以。
 5. 如何添加用户?
    访问后端APP。菜单: 基础信息 -> 人员管理。添加爆破员,操作员。
+
+6. 安全员控制逻辑。
+   安全员汇报的地址可能包含多个爆破工程,但一个爆破工程不会上报多次地址。
    
 ### TODOs:
+ 

+ 1 - 1
backendapimanager.cpp

@@ -107,7 +107,7 @@ QJsonArray backendAPIManager::getSysUsers() {
     return result;
 }
 
-QJsonArray backendAPIManager::getPcs() {
+QJsonArray backendAPIManager::getHAddresses() {
     if (!s_instance) return QJsonArray();
 
     QNetworkReply *reply = s_instance->sendRequest("h-address/pc", QJsonObject(), "GET");

+ 1 - 1
backendapimanager.h

@@ -22,7 +22,7 @@ class backendAPIManager : public QObject {
     static bool uploadBlastProjectDets(const QJsonObject &detsData);
     static bool uploadBlastEquipments(const QJsonObject &regDetsData);
     static QJsonArray getSysUsers();
-    static QJsonArray getPcs();
+    static QJsonArray getHAddresses();
 
    signals:
     void uploadFinished(const QJsonDocument &response);

+ 10 - 10
blastProject/HProjectDao.h

@@ -1,12 +1,14 @@
 #ifndef HPROJECTDAO_H
 #define HPROJECTDAO_H
 
+#include <QList>
+#include <QMessageBox>
 #include <QObject>
 #include <QSqlDatabase>
-#include <QSqlQuery>
 #include <QSqlError>
-#include <QList>
+#include <QSqlQuery>
 #include <QSqlRecord>
+
 #include "HProject.h"
 
 struct PaginatedHProjectResult {
@@ -14,10 +16,8 @@ struct PaginatedHProjectResult {
     int totalCount;
 };
 
-class HProjectDao
-{
-
-public:
+class HProjectDao {
+   public:
     HProjectDao(QSqlDatabase db);
     bool addHProject(const HProject &project);
     bool updateHProject(const HProject &project);
@@ -26,13 +26,13 @@ public:
     HProject getHProjectById(qint64 id);
     PaginatedHProjectResult getAllHProjects(int page, int pageSize);
     PaginatedHProjectResult getAllHProjectsByOpera(int page, int pageSize);
-    QList<QSharedPointer<HProject> > getAllHProjectsReg();
+    QList<QSharedPointer<HProject>> getAllHProjectsReg();
+    QList<QSharedPointer<HProject>> getRegistedProjectByAddressUuid(QList<QString> addressUuids);
 
-private:
+   private:
     QSqlDatabase database;
     // 将QSqlRecord转换为HProject对象
     QSharedPointer<HProject> recordToProject(const QSqlRecord &record);
-
 };
 
-#endif // HPROJECTDAO_H
+#endif  // HPROJECTDAO_H

+ 13 - 16
blastProject/blastprojectpage.cpp

@@ -24,7 +24,7 @@ BlastProjectPage::BlastProjectPage(QWidget *parent)
     RefreshData();
 
     dialog = new ProjectDialog(this);
-    QJsonArray pcs = backendAPIManager::getPcs();
+    QJsonArray pcs = backendAPIManager::getHAddresses();
     addressOptions(pcs);
     QJsonArray sysUsersObj = backendAPIManager::getSysUsers();
     personOptionsByType(sysUsersObj);
@@ -49,7 +49,7 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
     // 定义表头信息
     QList<HeaderInfo> headers = {
         {"工程名称", "name"},        {"操作员", "operatorName"},
-        {"爆破员", "blasterName"},   {"井下地址", "addressUuid"},
+        {"爆破员", "blasterName"},   {"井下地址", "addressPath"},
         {"雷管数量", "detSum"},      {"起爆器数量", "blastCount"},
         {"起爆状态", "blastStatus"}, {"操作", ""},
     };
@@ -75,15 +75,20 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
                 QVariant value = metaProp.read(&HProject);
                 if (prop == "blastStatus") {
                     QString statusText;
-                    if (value.toString() == "1") {
+                    if (value.toString() == BlastStatus::Created) {
                         statusText = "未注册";
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#e7c66b"));
-                    } else if (value.toString() == "2") {
+                    } else if (value.toString() == BlastStatus::Registered) {
+                        statusText = "待安全确认";
+                        item = new QStandardItem(statusText);
+                        item->setForeground(QColor("#f3a361"));
+                    } else if (value.toString() == BlastStatus::SafeChecked) {
                         statusText = "待起爆";
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#f3a361"));
-                    } else if (value.toString() == "3") {
+
+                    } else if (value.toString() == BlastStatus::Blasted) {
                         statusText = "起爆完成";
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#90d543"));
@@ -159,12 +164,8 @@ void BlastProjectPage::personOptionsByType(const QJsonArray &dataArray) {
 }
 
 void BlastProjectPage::addressOptions(const QJsonArray &dataArrayAddress) {
-    QJsonArray parentOptions;
-    for (const QJsonValue &item : dataArrayAddress) {
-        parentOptions.append(item.toObject()["name"].toString());
-    }
-    dialog->SetComboBoxAddress(parentOptions);
-    dialog->setChildOptions(dataArrayAddress);
+    dialog->SetL1AddressOptions(dataArrayAddress);
+    // dialog->setChildOptions(dataArrayAddress);
 }
 
 // 递归函数,用于提取所有的 name 信息
@@ -188,10 +189,6 @@ void BlastProjectPage::parseJsonString(const QJsonDocument &jsonDoc) {
     dataArray = dataObj["list"].toArray();
 }
 
-void BlastProjectPage::parseJsonStringAddress(const QJsonDocument &jsonDoc) {
-    QJsonObject jsonObj = jsonDoc.object();
-    dataArrayAddress = jsonObj["data"].toArray();
-}
 void BlastProjectPage::on_pushButton_clicked() {
     dialog->setModal(false);
     dialog->setOperationStatus(0);
@@ -206,6 +203,7 @@ void BlastProjectPage::insertPlan(const QMap<QString, QString> &data) {
     project.setBlasterName(data.value("blasterName"));
     project.setOperatorName(data.value("operatorName"));
     project.setAddressUuid(data.value("addressUuid"));
+    project.setAddressPath(data.value("addressPath"));
     project.setBlasterIdentity(data.value("blasterIdentity"));
     project.setOperatorIdentity(data.value("operatorIdentity"));
     project.setLoraAddress(data.value("loraAddress"));
@@ -233,7 +231,6 @@ void BlastProjectPage::insertPlan(const QMap<QString, QString> &data) {
         QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Indented);
 
         mqttClient->sendMessage("hxgc/companycode/pro/B", jsonData, 2, true);
-        qDebug() << "mqtt单例:" << mqttClient;
     }
 }
 

+ 0 - 1
blastProject/blastprojectpage.h

@@ -35,7 +35,6 @@ class BlastProjectPage : public QWidget {
     void RefreshData();
     void loadDataFromSource(int currentPage, int pageSize);
     void personOptionsByType(const QJsonArray &arrayData);
-    void parseJsonStringAddress(const QJsonDocument &jsonDoc);
     void addressOptions(const QJsonArray &jsonArray);
     void parseJsonString(const QJsonDocument &jsonDoc);
     void fillComboBox(QComboBox *comboBox, const QJsonArray &jsonArray);

+ 52 - 193
blastProject/hproject.cpp

@@ -1,253 +1,113 @@
 #include "hproject.h"
 
-HProject::HProject(QObject *parent) : QObject(parent)
-{
-}
+HProject::HProject(QObject *parent) : QObject(parent) {}
 
 // Getter and Setter implementations
-qint64 HProject::getId() const
-{
-    return id;
-}
+qint64 HProject::getId() const { return id; }
 
-void HProject::setId(qint64 newId)
-{
-    id = newId;
-}
+void HProject::setId(qint64 newId) { id = newId; }
 
-QString HProject::getUuid() const
-{
-    return uuid;
-}
+QString HProject::getUuid() const { return uuid; }
 
-void HProject::setUuid(const QString &newUuid)
-{
-    uuid = newUuid;
-}
+void HProject::setUuid(const QString &newUuid) { uuid = newUuid; }
 
-QString HProject::getName() const
-{
-    return name;
-}
+QString HProject::getName() const { return name; }
 
-void HProject::setName(const QString &newName)
-{
-    name = newName;
-}
+void HProject::setName(const QString &newName) { name = newName; }
 
-QString HProject::getCompanyCode() const
-{
-    return companyCode;
-}
+QString HProject::getCompanyCode() const { return companyCode; }
 
-void HProject::setCompanyCode(const QString &newCompanyCode)
-{
-    companyCode = newCompanyCode;
-}
+void HProject::setCompanyCode(const QString &newCompanyCode) { companyCode = newCompanyCode; }
 
-QString HProject::getHtid() const
-{
-    return htid;
-}
+QString HProject::getHtid() const { return htid; }
 
-void HProject::setHtid(const QString &newHtid)
-{
-    htid = newHtid;
-}
+void HProject::setHtid(const QString &newHtid) { htid = newHtid; }
 
-QString HProject::getXmbh() const
-{
-    return xmbh;
-}
+QString HProject::getXmbh() const { return xmbh; }
 
-void HProject::setXmbh(const QString &newXmbh)
-{
-    xmbh = newXmbh;
-}
+void HProject::setXmbh(const QString &newXmbh) { xmbh = newXmbh; }
 
-QString HProject::getOperatorName() const
-{
-    return operatorName;
-}
+QString HProject::getOperatorName() const { return operatorName; }
 
-void HProject::setOperatorName(const QString &newOperatorName)
-{
-    operatorName = newOperatorName;
-}
+void HProject::setOperatorName(const QString &newOperatorName) { operatorName = newOperatorName; }
 
-QString HProject::getOperatorIdentity() const
-{
-    return operatorIdentity;
-}
+QString HProject::getOperatorIdentity() const { return operatorIdentity; }
 
-void HProject::setOperatorIdentity(const QString &newOperatorIdentity)
-{
+void HProject::setOperatorIdentity(const QString &newOperatorIdentity) {
     operatorIdentity = newOperatorIdentity;
 }
 
-QString HProject::getBlasterName() const
-{
-    return blasterName;
-}
+QString HProject::getBlasterName() const { return blasterName; }
 
-void HProject::setBlasterName(const QString &newBlasterName)
-{
-    blasterName = newBlasterName;
-}
+void HProject::setBlasterName(const QString &newBlasterName) { blasterName = newBlasterName; }
 
-QString HProject::getBlasterIdentity() const
-{
-    return blasterIdentity;
-}
+QString HProject::getBlasterIdentity() const { return blasterIdentity; }
 
-void HProject::setBlasterIdentity(const QString &newBlasterIdentity)
-{
+void HProject::setBlasterIdentity(const QString &newBlasterIdentity) {
     blasterIdentity = newBlasterIdentity;
 }
 
-QString HProject::getAddressUuid() const
-{
-    return addressUuid;
-}
+QString HProject::getAddressUuid() const { return addressUuid; }
 
-void HProject::setAddressUuid(const QString &newAddressUuid)
-{
-    addressUuid = newAddressUuid;
-}
+void HProject::setAddressUuid(const QString &newAddressUuid) { addressUuid = newAddressUuid; }
 
-QString HProject::getPcSn() const
-{
-    return pcSn;
-}
+QString HProject::getAddressPath() const { return addressPath; }
 
-void HProject::setPcSn(const QString &newPcSn)
-{
-    pcSn = newPcSn;
-}
+void HProject::setAddressPath(const QString &newAddressPath) { addressPath = newAddressPath; }
 
-QString HProject::getDetSum() const
-{
-    return detSum;
-}
+QString HProject::getPcSn() const { return pcSn; }
 
-void HProject::setDetSum(const QString &newDetSum)
-{
-    detSum = newDetSum;
-}
+void HProject::setPcSn(const QString &newPcSn) { pcSn = newPcSn; }
 
-QString HProject::getFileName() const
-{
-    return fileName;
-}
+QString HProject::getDetSum() const { return detSum; }
 
-void HProject::setFileName(const QString &newFileName)
-{
-    fileName = newFileName;
-}
+void HProject::setDetSum(const QString &newDetSum) { detSum = newDetSum; }
 
-QString HProject::getFileUrl() const
-{
-    return fileUrl;
-}
+QString HProject::getFileName() const { return fileName; }
 
-void HProject::setFileUrl(const QString &newFileUrl)
-{
-    fileUrl = newFileUrl;
-}
+void HProject::setFileName(const QString &newFileName) { fileName = newFileName; }
 
-QString HProject::getBlastStatus() const
-{
-    return blastStatus;
-}
+QString HProject::getFileUrl() const { return fileUrl; }
 
-void HProject::setBlastStatus(const QString &newBlastStatus)
-{
-    blastStatus = newBlastStatus;
-}
+void HProject::setFileUrl(const QString &newFileUrl) { fileUrl = newFileUrl; }
 
-QDateTime HProject::getCreatedAt() const
-{
-    return createdAt;
-}
+QString HProject::getBlastStatus() const { return blastStatus; }
 
-void HProject::setCreatedAt(const QDateTime &newCreatedAt)
-{
-    createdAt = newCreatedAt;
-}
+void HProject::setBlastStatus(const QString &newBlastStatus) { blastStatus = newBlastStatus; }
 
-QDateTime HProject::getUpdatedAt() const
-{
-    return updatedAt;
-}
+QDateTime HProject::getCreatedAt() const { return createdAt; }
 
-void HProject::setUpdatedAt(const QDateTime &newUpdatedAt)
-{
-    updatedAt = newUpdatedAt;
-}
+void HProject::setCreatedAt(const QDateTime &newCreatedAt) { createdAt = newCreatedAt; }
 
-QDateTime HProject::getDeletedAt() const
-{
-    return deletedAt;
-}
+QDateTime HProject::getUpdatedAt() const { return updatedAt; }
 
-void HProject::setDeletedAt(const QDateTime &newDeletedAt)
-{
-    deletedAt = newDeletedAt;
-}
+void HProject::setUpdatedAt(const QDateTime &newUpdatedAt) { updatedAt = newUpdatedAt; }
 
-qint64 HProject::getCreateBy() const
-{
-    return createBy;
-}
+QDateTime HProject::getDeletedAt() const { return deletedAt; }
 
-void HProject::setCreateBy(qint64 newCreateBy)
-{
-    createBy = newCreateBy;
-}
+void HProject::setDeletedAt(const QDateTime &newDeletedAt) { deletedAt = newDeletedAt; }
 
-qint64 HProject::getUpdateBy() const
-{
-    return updateBy;
-}
+qint64 HProject::getCreateBy() const { return createBy; }
 
-void HProject::setUpdateBy(qint64 newUpdateBy)
-{
-    updateBy = newUpdateBy;
-}
+void HProject::setCreateBy(qint64 newCreateBy) { createBy = newCreateBy; }
 
-QString HProject::getLoraAddress() const
-{
-    return loraAddress;
-}
+qint64 HProject::getUpdateBy() const { return updateBy; }
 
-void HProject::setLoraAddress(const QString &newLoraAddress)
-{
-    loraAddress = newLoraAddress;
-}
+void HProject::setUpdateBy(qint64 newUpdateBy) { updateBy = newUpdateBy; }
 
-QString HProject::getBlastCount() const
-{
-    return blastCount;
-}
+QString HProject::getLoraAddress() const { return loraAddress; }
 
-void HProject::setBlastCount(const QString &newBlastCount)
-{
-    blastCount = newBlastCount;
-}
+void HProject::setLoraAddress(const QString &newLoraAddress) { loraAddress = newLoraAddress; }
 
-QString HProject::getLoraSn() const
-{
-    return loraSn;
-}
+QString HProject::getBlastCount() const { return blastCount; }
 
-void HProject::setLoraSn(const QString &newLoraSn)
-{
-    loraSn = newLoraSn;
-}
+void HProject::setBlastCount(const QString &newBlastCount) { blastCount = newBlastCount; }
 
+QString HProject::getLoraSn() const { return loraSn; }
 
+void HProject::setLoraSn(const QString &newLoraSn) { loraSn = newLoraSn; }
 
-QByteArray HProject::ProjectToJson(const HProject& project) {
+QByteArray HProject::ProjectToJson(const HProject &project) {
     QJsonObject jsonObject;
     jsonObject["name"] = project.getName();
     jsonObject["uuid"] = project.getUuid();
@@ -263,4 +123,3 @@ QByteArray HProject::ProjectToJson(const HProject& project) {
     QJsonDocument jsonDoc(jsonObject);
     return jsonDoc.toJson(QJsonDocument::Compact);
 }
-

+ 14 - 10
blastProject/hproject.h

@@ -1,20 +1,19 @@
 #ifndef HPROJECT_H
 #define HPROJECT_H
 
-#include <QString>
 #include <QDateTime>
-#include <QJsonObject>
 #include <QJsonDocument>
+#include <QJsonObject>
+#include <QString>
 #include <QUuid>
 
 enum class BladeStatus : int {
     UNREGISTERED = 1,  // 未注册
-    REGISTERED = 2,     // 已注册
-    BLADED = 3,     // 已爆破
+    REGISTERED = 2,    // 已注册
+    BLADED = 3,        // 已爆破
 };
 
-class HProject : public QObject
-{
+class HProject : public QObject {
     Q_OBJECT
     // 定义属性
     Q_PROPERTY(qint64 id READ getId WRITE setId)
@@ -28,6 +27,7 @@ class HProject : public QObject
     Q_PROPERTY(QString blasterName READ getBlasterName WRITE setBlasterName)
     Q_PROPERTY(QString blasterIdentity READ getBlasterIdentity WRITE setBlasterIdentity)
     Q_PROPERTY(QString addressUuid READ getAddressUuid WRITE setAddressUuid)
+    Q_PROPERTY(QString addressPath READ getAddressPath WRITE setAddressPath)
     Q_PROPERTY(QString loraAddress READ getLoraAddress WRITE setLoraAddress)
     Q_PROPERTY(QString loraSn READ getLoraSn WRITE setLoraSn)
     Q_PROPERTY(QString pcSn READ getPcSn WRITE setPcSn)
@@ -42,7 +42,7 @@ class HProject : public QObject
     Q_PROPERTY(qint64 createBy READ getCreateBy WRITE setCreateBy)
     Q_PROPERTY(qint64 updateBy READ getUpdateBy WRITE setUpdateBy)
 
-public:
+   public:
     explicit HProject(QObject *parent = nullptr);
 
     // Getter and Setter methods
@@ -79,6 +79,9 @@ public:
     QString getAddressUuid() const;
     void setAddressUuid(const QString &newAddressUuid);
 
+    QString getAddressPath() const;
+    void setAddressPath(const QString &newAddressPath);
+
     QString getPcSn() const;
     void setPcSn(const QString &newPcSn);
 
@@ -109,7 +112,7 @@ public:
     qint64 getUpdateBy() const;
     void setUpdateBy(qint64 newUpdateBy);
 
-    QByteArray ProjectToJson(const HProject& project);
+    QByteArray ProjectToJson(const HProject &project);
 
     QString getLoraAddress() const;
     void setLoraAddress(const QString &newLoraAddress);
@@ -120,7 +123,7 @@ public:
     QString getLoraSn() const;
     void setLoraSn(const QString &newLoraSn);
 
-private:
+   private:
     qint64 id;
     QString uuid;
     QString name;
@@ -132,6 +135,7 @@ private:
     QString blasterName;
     QString blasterIdentity;
     QString addressUuid;
+    QString addressPath;
     QString loraAddress;
     QString loraSn;
     QString pcSn;
@@ -147,4 +151,4 @@ private:
     qint64 updateBy;
 };
 
-#endif // HPROJECT_H
+#endif  // HPROJECT_H

+ 93 - 55
blastProject/hprojectdao.cpp

@@ -1,16 +1,22 @@
 #include "HProjectDao.h"
 
+#include "../global.h"
 
-HProjectDao::HProjectDao(QSqlDatabase db):database(db)
-{
-}
-
-bool HProjectDao::addHProject(const HProject &project)
-{
+HProjectDao::HProjectDao(QSqlDatabase db) : database(db) {}
 
+bool HProjectDao::addHProject(const HProject &project) {
     QSqlQuery query;
-    query.prepare("INSERT INTO h_project (uuid, name, company_code, htid, xmbh, operator_name, operator_identity, blaster_name, blaster_identity, address_uuid, lora_address,pc_sn, det_sum, file_name, file_url, blast_status,blast_count,created_at, updated_at, deleted_at, create_by, update_by) "
-                  "VALUES (:uuid, :name, :companyCode, :htid, :xmbh, :operatorName, :operatorIdentity, :blasterName, :blasterIdentity, :addressUuid,:loraAddress, :pcSn, :detSum, :fileName, :fileUrl, :blastStatus, :blastCount,:createdAt, :updatedAt, :deletedAt, :createBy, :updateBy)");
+    query.prepare(
+        "INSERT INTO h_project (uuid, name, company_code, htid, xmbh, operator_name, "
+        "operator_identity, blaster_name, blaster_identity, address_uuid, address_path, "
+        "lora_address,pc_sn, "
+        "det_sum, file_name, file_url, blast_status,blast_count,created_at, updated_at, "
+        "deleted_at, create_by, update_by) "
+        "VALUES (:uuid, :name, :companyCode, :htid, :xmbh, :operatorName, :operatorIdentity, "
+        ":blasterName, :blasterIdentity, :addressUuid, :addressPath, :loraAddress, :pcSn, :detSum, "
+        ":fileName, "
+        ":fileUrl, :blastStatus, :blastCount,:createdAt, :updatedAt, :deletedAt, :createBy, "
+        ":updateBy)");
 
     query.bindValue(":uuid", project.getUuid());
     query.bindValue(":name", project.getName());
@@ -22,6 +28,7 @@ bool HProjectDao::addHProject(const HProject &project)
     query.bindValue(":blasterName", project.getBlasterName());
     query.bindValue(":blasterIdentity", project.getBlasterIdentity());
     query.bindValue(":addressUuid", project.getAddressUuid());
+    query.bindValue(":addressPath", project.getAddressPath());
     query.bindValue(":loraAddress", project.getLoraAddress());
     query.bindValue(":blastCount", project.getBlastCount());
     query.bindValue(":pcSn", project.getPcSn());
@@ -42,31 +49,32 @@ bool HProjectDao::addHProject(const HProject &project)
     return true;
 }
 
-bool HProjectDao::updateHProject(const HProject &project)
-{
+bool HProjectDao::updateHProject(const HProject &project) {
     QSqlQuery query;
-    query.prepare("UPDATE h_project SET "
-                  "uuid = :uuid, "
-                  "name = :name, "
-                  "company_code = :companyCode, "
-                  "htid = :htid, "
-                  "xmbh = :xmbh, "
-                  "operator_name = :operatorName, "
-                  "operator_identity = :operatorIdentity, "
-                  "blaster_name = :blasterName, "
-                  "blaster_identity = :blasterIdentity, "
-                  "address_uuid = :addressUuid, "
-                  "pc_sn = :pcSn, "
-                  "det_sum = :detSum, "
-                  "file_name = :fileName, "
-                  "file_url = :fileUrl, "
-                  "blast_status = :blastStatus, "
-                  "created_at = :createdAt, "
-                  "updated_at = :updatedAt, "
-                  "deleted_at = :deletedAt, "
-                  "create_by = :createBy, "
-                  "update_by = :updateBy "
-                  "WHERE id = :id");
+    query.prepare(
+        "UPDATE h_project SET "
+        "uuid = :uuid, "
+        "name = :name, "
+        "company_code = :companyCode, "
+        "htid = :htid, "
+        "xmbh = :xmbh, "
+        "operator_name = :operatorName, "
+        "operator_identity = :operatorIdentity, "
+        "blaster_name = :blasterName, "
+        "blaster_identity = :blasterIdentity, "
+        "address_uuid = :addressUuid, "
+        "address_path = :addressPath, "
+        "pc_sn = :pcSn, "
+        "det_sum = :detSum, "
+        "file_name = :fileName, "
+        "file_url = :fileUrl, "
+        "blast_status = :blastStatus, "
+        "created_at = :createdAt, "
+        "updated_at = :updatedAt, "
+        "deleted_at = :deletedAt, "
+        "create_by = :createBy, "
+        "update_by = :updateBy "
+        "WHERE id = :id");
 
     query.bindValue(":id", project.getId());
     query.bindValue(":uuid", project.getUuid());
@@ -79,6 +87,7 @@ bool HProjectDao::updateHProject(const HProject &project)
     query.bindValue(":blasterName", project.getBlasterName());
     query.bindValue(":blasterIdentity", project.getBlasterIdentity());
     query.bindValue(":addressUuid", project.getAddressUuid());
+    query.bindValue(":addressPath", project.getAddressPath());
     query.bindValue(":pcSn", project.getPcSn());
     query.bindValue(":detSum", project.getDetSum());
     query.bindValue(":fileName", project.getFileName());
@@ -97,8 +106,7 @@ bool HProjectDao::updateHProject(const HProject &project)
     return true;
 }
 
-bool HProjectDao::deleteHProject(const HProject &project)
-{
+bool HProjectDao::deleteHProject(const HProject &project) {
     QSqlQuery query;
     query.prepare("DELETE FROM h_project WHERE id = :id");
     query.bindValue(":id", project.getId());
@@ -119,8 +127,7 @@ bool HProjectDao::deleteHProject(const HProject &project)
 //     return HProject();
 // }
 
-PaginatedHProjectResult HProjectDao::getAllHProjects(int page, int pageSize)
-{
+PaginatedHProjectResult HProjectDao::getAllHProjects(int page, int pageSize) {
     QList<QSharedPointer<HProject>> projects;
     QSqlQuery query(database);
     int offset = (page - 1) * pageSize;
@@ -129,7 +136,6 @@ PaginatedHProjectResult HProjectDao::getAllHProjects(int page, int pageSize)
     query.bindValue(":offset", offset);
 
     if (query.exec()) {
-
         while (query.next()) {
             projects.append(recordToProject(query.record()));
         }
@@ -142,15 +148,17 @@ PaginatedHProjectResult HProjectDao::getAllHProjects(int page, int pageSize)
     if (query.exec() && query.next()) {
         totalCount = query.value(0).toInt();
     }
-    return { projects, totalCount };
+    return {projects, totalCount};
 }
 
-PaginatedHProjectResult HProjectDao::getAllHProjectsByOpera(int page, int pageSize)
-{
+PaginatedHProjectResult HProjectDao::getAllHProjectsByOpera(int page, int pageSize) {
     QList<QSharedPointer<HProject>> projects;
     QSqlQuery query(database);
     int offset = (page - 1) * pageSize;
-    query.prepare("SELECT * FROM h_project WHERE blast_status >1 and blast_status <3 ORDER BY created_at LIMIT :pageSize OFFSET :offset");
+    query.prepare(
+        "SELECT * FROM h_project WHERE blast_status = :safeCheckedStatus ORDER BY created_at "
+        "LIMIT :pageSize OFFSET :offset");
+    query.bindValue(":safeCheckedStatus", BlastStatus::SafeChecked);
     query.bindValue(":pageSize", pageSize);
     query.bindValue(":offset", offset);
     if (query.exec()) {
@@ -166,11 +174,35 @@ PaginatedHProjectResult HProjectDao::getAllHProjectsByOpera(int page, int pageSi
     if (query.exec() && query.next()) {
         totalCount = query.value(0).toInt();
     }
-    return { projects, totalCount };
+    return {projects, totalCount};
+}
+
+QList<QSharedPointer<HProject>> HProjectDao::getRegistedProjectByAddressUuid(
+    QList<QString> addressUuids) {
+    QList<QSharedPointer<HProject>> projects;
+    QSqlQuery query(database);
+    QString placeholders = QString(",").repeated(addressUuids.size() - 1).prepend(":addressUuid");
+    query.prepare("SELECT * FROM h_project WHERE address_uuid IN (" + placeholders +
+                  ") "
+                  "AND blast_status = " +
+                  BlastStatus::Registered + " ORDER BY created_at");
+
+    for (const QString &addressUuid : addressUuids) {
+        query.bindValue(":addressUuid", addressUuid);
+        if (!query.exec()) {
+            QMessageBox::critical(
+                nullptr, "数据搜索异常",
+                QString("通过地址查询注册工程数据异常: %1").arg(query.lastError().text()));
+            return projects;
+        }
+        while (query.next()) {
+            projects.append(recordToProject(query.record()));
+        }
+    }
+    return projects;
 }
 
-QList<QSharedPointer<HProject>> HProjectDao::getAllHProjectsReg()
-{
+QList<QSharedPointer<HProject>> HProjectDao::getAllHProjectsReg() {
     QList<QSharedPointer<HProject>> projects;
     QSqlQuery query(database);
     query.prepare("SELECT * FROM h_project WHERE blast_status =1 ORDER BY created_at ");
@@ -185,26 +217,28 @@ QList<QSharedPointer<HProject>> HProjectDao::getAllHProjectsReg()
     return projects;
 }
 
-//更改状态
-bool HProjectDao::updateBlastStatusByUuid(const QString &uuid, const QString &blastStatus)
-{
+// 更改状态
+bool HProjectDao::updateBlastStatusByUuid(const QString &uuid, const QString &blastStatus) {
     QSqlQuery query;
-    query.prepare("UPDATE h_project SET "
-                  "blast_status = :blastStatus "
-                  "WHERE uuid = :uuid");
+    query.prepare(
+        "UPDATE h_project SET "
+        "blast_status = :blastStatus "
+        "WHERE uuid = :uuid");
     query.bindValue(":uuid", uuid);
     query.bindValue(":blastStatus", blastStatus);
 
+    qDebug() << "Executing SQL query to update blast_status:" << query.lastQuery();
     if (!query.exec()) {
         qCritical() << "Failed to update blast_status for HProject:" << query.lastError().text();
         return false;
     }
 
+    qDebug() << "Executing SQL query to update blast_status completed successfully.";
+    ;
     return true;
 }
 
-QSharedPointer<HProject> HProjectDao::recordToProject(const QSqlRecord &record)
-{
+QSharedPointer<HProject> HProjectDao::recordToProject(const QSqlRecord &record) {
     QSharedPointer<HProject> project = QSharedPointer<HProject>::create();
     project->setId(record.value("id").toInt());
     project->setUuid(record.value("uuid").toString());
@@ -217,15 +251,19 @@ QSharedPointer<HProject> HProjectDao::recordToProject(const QSqlRecord &record)
     project->setBlasterName(record.value("blaster_name").toString());
     project->setBlasterIdentity(record.value("blaster_identity").toString());
     project->setAddressUuid(record.value("address_uuid").toString());
+    project->setAddressPath(record.value("address_path").toString());
     project->setPcSn(record.value("pc_sn").toString());
     project->setDetSum(record.value("det_sum").toString());
     project->setBlastCount(record.value("blast_count").toString());
     project->setFileName(record.value("file_name").toString());
     project->setFileUrl(record.value("file_url").toString());
     project->setBlastStatus(record.value("blast_status").toString());
-    project->setCreatedAt(QDateTime::fromString(record.value("created_at").toString(), Qt::ISODateWithMs));
-    project->setUpdatedAt(QDateTime::fromString(record.value("updated_at").toString(), Qt::ISODateWithMs));
-    project->setDeletedAt(QDateTime::fromString(record.value("deleted_at").toString(), Qt::ISODateWithMs));
+    project->setCreatedAt(
+        QDateTime::fromString(record.value("created_at").toString(), Qt::ISODateWithMs));
+    project->setUpdatedAt(
+        QDateTime::fromString(record.value("updated_at").toString(), Qt::ISODateWithMs));
+    project->setDeletedAt(
+        QDateTime::fromString(record.value("deleted_at").toString(), Qt::ISODateWithMs));
     project->setCreateBy(record.value("create_by").toInt());
     project->setUpdateBy(record.value("update_by").toInt());
     return project;

+ 43 - 52
blastProject/projectdialog.cpp

@@ -4,7 +4,8 @@
 
 ProjectDialog::ProjectDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ProjectDialog) {
     ui->setupUi(this);
-    connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &ProjectDialog::validateInput);
+    connect(ui->buttonBox, &QDialogButtonBox::accepted, this,
+            &ProjectDialog::validateAndSaveProject);
     connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &ProjectDialog::clearFormData);
 }
 
@@ -46,50 +47,32 @@ void ProjectDialog::fillComboBox(QComboBox *comboBox, const QJsonArray &jsonArra
     }
 }
 
-void ProjectDialog::SetComboBoxAddress(const QJsonArray &Options) {
+void ProjectDialog::SetL1AddressOptions(const QJsonArray &Options) {
     parentOptions = Options;
     ui->comboBoxAddr->clear();
+
     for (const QJsonValue &option : Options) {
-        ui->comboBoxAddr->addItem(option.toString());
+        ui->comboBoxAddr->addItem(option.toObject()["name"].toString(),
+                                  option.toObject()["uuid"].toString());
     }
     ui->comboBoxAddr->setCurrentIndex(-1);
 }
 
-void ProjectDialog::SetComboBoxAddress2(const QString &parentName) {
+void ProjectDialog::updateL2AddressOptions() {
     ui->comboBoxAddr_2->clear();
-    for (const QJsonValue &item : dataOptions) {
-        const QJsonObject &obj = item.toObject();
-        if (obj["name"].toString() == parentName) {
-            const QJsonArray &children = obj["children"].toArray();
-            childOptions = children;
-            for (const QJsonValue &child : children) {
-                ui->comboBoxAddr_2->addItem(child.toObject()["name"].toString());
-            }
-            break;
-        }
-    };
+    for (const QJsonValue &child : L2AddressOptions) {
+        ui->comboBoxAddr_2->addItem(child.toObject()["name"].toString(),
+                                    child.toObject()["uuid"].toString());
+    }
     ui->comboBoxAddr_2->setCurrentIndex(-1);
 }
 
-void ProjectDialog::SetComboBoxAddress3(const QString &childName) {
+void ProjectDialog::updateL3AddressOptions() {
     ui->comboBoxAddr_3->clear();
-    for (const QJsonValue &item : dataOptions) {
-        const QJsonArray &childrenArray = item["children"].toArray();
-        for (const QJsonValue &child : childrenArray) {
-            const QJsonObject &childObj = child.toObject();
-            if (childObj["name"].toString() == childName) {
-                const QJsonArray &grandChildrenArray = childObj["children"].toArray();
-                grandChildOptions = grandChildrenArray;
-                qDebug() << "grandChildOptions " << grandChildOptions;
-                for (const QJsonValue &grandChild : grandChildrenArray) {
-                    const QJsonObject &grandChildObj = grandChild.toObject();
-                    ui->comboBoxAddr_3->addItem(grandChildObj["name"].toString());
-                }
-                break;
-            }
-        };
+    for (const QJsonValue &child : L3AddressOptions) {
+        ui->comboBoxAddr_3->addItem(child.toObject()["name"].toString(),
+                                    child.toObject()["uuid"].toString());
     }
-
     ui->comboBoxAddr_3->setCurrentIndex(-1);
 }
 
@@ -156,38 +139,42 @@ void ProjectDialog::clearFormData() {
 
 void ProjectDialog::on_comboBoxAddr_currentIndexChanged(int index) {
     if (index >= 0 && index < parentOptions.size()) {
-        QString parentName = parentOptions[index].toString();
-        SetComboBoxAddress2(parentName);
+        L2AddressOptions = parentOptions[index].toObject()["children"].toArray();
+        updateL2AddressOptions();
     }
 }
 
 void ProjectDialog::on_comboBoxAddr_2_currentIndexChanged(int index) {
-    if (index >= -1 && index < childOptions.size()) {
-        QString childName = childOptions[index].toObject()["name"].toString();
-        SetComboBoxAddress3(childName);
+    if (index >= 0 && index < L2AddressOptions.size()) {
+        QJsonArray subOptions = L2AddressOptions[index].toObject()["children"].toArray();
+        L3AddressOptions = subOptions;
+        updateL3AddressOptions();
     }
 }
 
 void ProjectDialog::on_comboBoxAddr_3_currentIndexChanged(int index) {
-    if (index >= -1 && index < grandChildOptions.size()) {
-        QString grandChildName = grandChildOptions[index].toObject()["name"].toString();
+    if (index >= 0 && index < L3AddressOptions.size()) {
+        QString grandChildName = L3AddressOptions[index].toObject()["uuid"].toString();
         SetComboBoxLora(grandChildName);
     }
 }
 
-void ProjectDialog::validateInput() {
+void ProjectDialog::validateAndSaveProject() {
     QString detNum = ui->editDetNum->text().trimmed();
     QString blastCount = ui->editRegCount->text().trimmed();
     QString projectName = ui->editName->text().trimmed();
     QString blastName = ui->comboBoxBlast->currentText().trimmed();
     QString operatorName = ui->comboBoxOperator->currentText().trimmed();
-    QString parentAddress = ui->comboBoxAddr->currentText().trimmed();
-    QString childAddress = ui->comboBoxAddr_2->currentText().trimmed();
-    QString grandChildAddress = ui->comboBoxAddr_3->currentText().trimmed();
+    QString l1AddressUuid = ui->comboBoxAddr->currentData().toString().trimmed();
+    QString l2AddressUuid = ui->comboBoxAddr_2->currentData().toString().trimmed();
+    QString l3AddressUuid = ui->comboBoxAddr_3->currentData().toString().trimmed();
+    QString l1AddressName = ui->comboBoxAddr->currentText().trimmed();
+    QString l2AddressName = ui->comboBoxAddr_2->currentText().trimmed();
+    QString l3AddressName = ui->comboBoxAddr_3->currentText().trimmed();
     QString loraAddress = ui->comboBoxLora->currentText().trimmed();
 
     if (detNum.isEmpty() || !ui->editDetNum->hasAcceptableInput()) {
-        QMessageBox::warning(this, "输入错误", "请输入0-10000的数字!");
+        QMessageBox::warning(nullptr, "输入错误", "请输入0-10000的数字!");
         return;
     }
     // 创建一个 QMap 集合,存储数据
@@ -196,15 +183,19 @@ void ProjectDialog::validateInput() {
     data["name"] = projectName;
     data["operatorName"] = operatorName;
     data["blasterName"] = blastName;
-    // 拼接 addressUuid
-    QString addressUuid = parentAddress;
-    if (!childAddress.isEmpty()) {
-        qDebug() << "childAddress" << childAddress;
-        addressUuid += "/" + childAddress;
-        if (!grandChildAddress.isEmpty()) {
-            addressUuid += "/" + grandChildAddress;
-        }
+    // 选择level最低的uui:w
+    QString addressUuid = l1AddressUuid;
+    if (l3AddressUuid != "") {
+        addressUuid = l3AddressUuid;
+    } else if (l2AddressUuid != "") {
+        addressUuid = l2AddressUuid;
+    } else if (l1AddressUuid != "") {
+        addressUuid = l1AddressUuid;
+    } else {
+        QMessageBox::warning(nullptr, "输入错误", "请选择地址!");
+        return;
     }
+    data["addressPath"] = l1AddressName + "/" + l2AddressName + "/" + l3AddressName;
     data["addressUuid"] = addressUuid;
     data["blasterIdentity"] = blasterId;
     data["operatorIdentity"] = operatorId;

+ 18 - 17
blastProject/projectdialog.h

@@ -1,35 +1,35 @@
 #ifndef PROJECTDIALOG_H
 #define PROJECTDIALOG_H
 
-#include <QDialog>
 #include <QComboBox>
+#include <QDialog>
+#include <QHash>
 #include <QJsonArray>
 #include <QJsonObject>
-#include <QHash>
-#include "hproject.h"
+
 #include "../regex.h"
+#include "hproject.h"
 
 namespace Ui {
 class ProjectDialog;
 }
 
-class ProjectDialog : public QDialog
-{
+class ProjectDialog : public QDialog {
     Q_OBJECT
 
-public:
+   public:
     explicit ProjectDialog(QWidget *parent = nullptr);
     ~ProjectDialog();
     void SetComboBoxBlast(const QJsonArray &bapoYuan);
     void SetComboBoxOperator(const QJsonArray &anQuanYuanArray);
-    void SetComboBoxAddress(const QJsonArray &parentOptions);
+    void SetL1AddressOptions(const QJsonArray &parentOptions);
     void setChildOptions(const QJsonArray &newChildOptions);
     void clearFormData();
     void setFormData(const HProject &Project);
     int getOperationStatus() const;
     void setOperationStatus(int newOperationStatus);
 
-private slots:
+   private slots:
     void on_comboBoxAddr_currentIndexChanged(int index);
 
     void on_comboBoxAddr_2_currentIndexChanged(int index);
@@ -40,20 +40,19 @@ private slots:
 
     void on_comboBoxAddr_3_currentIndexChanged(int index);
 
-signals:
+   signals:
     void validateDetNum(const QMap<QString, QString> &data);
     void validateDetNumUpdate(const QMap<QString, QString> &data);
 
-
-private:
+   private:
     void fillComboBox(QComboBox *comboBox, const QJsonArray &jsonArray);
-    void SetComboBoxAddress2(const QString &parentName);
-    void SetComboBoxAddress3(const QString &childName);
-    void validateInput();
+    void updateL2AddressOptions();
+    void updateL3AddressOptions();
+    void validateAndSaveProject();
     void SetComboBoxLora(const QString &grandChildName);
     void extractNames(const QJsonArray &array, QStringList &names);
 
-private:
+   private:
     Ui::ProjectDialog *ui;
     QString blasterId;
     QString operatorId;
@@ -64,9 +63,11 @@ private:
     QStringList loraOptions;
     QJsonArray childOptions;
     QJsonArray grandChildOptions;
+    QJsonArray L1AddressOptions;
+    QJsonArray L2AddressOptions;
+    QJsonArray L3AddressOptions;
     QHash<QString, QString> nameLoraSnMap;
     int operationStatus;
-
 };
 
-#endif // PROJECTDIALOG_H
+#endif  // PROJECTDIALOG_H

+ 0 - 2
blastRecord/blastrecord.cpp

@@ -56,8 +56,6 @@ void BlastRecord::loadDataFromSource(int currentPage, int pageSize) {
                     QDateTime dateTime = value.toDateTime();
                     item = new QStandardItem(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
                 } else if (prop == "isOfflineBlast") {
-                    qDebug() << "isOfflineBlast value:" << HBlastRecord.getIsOfflineBlast()
-                             << prop.toUtf8() << value.toBool() << value;
                     item = new QStandardItem(value.toBool() ? "离线爆破" : "线上爆破");
                 } else {
                     item = new QStandardItem(value.toString());

+ 1 - 1
blastRecord/hblastrecord.cpp

@@ -93,7 +93,7 @@ QDateTime HBlastRecord::getDeletedAt() const { return deletedAt; }
 void HBlastRecord::setDeletedAt(const QDateTime &newDeletedAt) { deletedAt = newDeletedAt; }
 
 void HBlastRecord::setIsOfflineBlast(bool isOfflineBlast) { isOfflineBlast = isOfflineBlast; }
-bool HBlastRecord::getIsOfflineBlast() const { qDebug() << "isOfflineBlast value:" << isOfflineBlast; return isOfflineBlast; }
+bool HBlastRecord::getIsOfflineBlast() const { return isOfflineBlast; }
 
 qint64 HBlastRecord::getCreateBy() const { return createBy; }
 

+ 29 - 29
blastopepage.cpp

@@ -15,14 +15,9 @@
 BlastOpePage::BlastOpePage(QWidget *parent)
     : QWidget(parent), ui(new Ui::BlastOpePage), dao(DatabaseManager::getInstance().getDatabase()) {
     QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
-    InitFace();
-    // QString useFaceVerify = env.value("UseFaceVerify", "true");
-    // if (useFaceVerify.toLower() == "true") {
-    //     InitFace();
-    // } else {
-    //     ui->setupUi(this);
-    //     initPagination();
-    // }
+    // InitFace();
+    ui->setupUi(this);
+    initPagination();
 }
 
 void BlastOpePage::showDownWidget(QString uuid, const QString &topic, const QString &message) {
@@ -93,7 +88,6 @@ void BlastOpePage::InitFace() {
             }
         }
     }
-    qDebug() << "certifyUrl: " << certifyUrl;
     if (!certifyUrl.isEmpty()) {
         view->load(QUrl(certifyUrl));
 
@@ -124,7 +118,7 @@ void BlastOpePage::closeWebViewAndRestoreUI() {
 
 // 槽函数:处理 URL 改变事件
 void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
-    LoadingWidget::showLoading(this, "跳转验证页...");
+    LoadingWidget::showLoading(this, "查询验证结果...");
     if (newUrl.host() == "www.integrateblaster.com") {
         closeWebViewAndRestoreUI();
         QNetworkAccessManager manager;
@@ -236,14 +230,6 @@ QJsonObject BlastOpePage::getMetaInfo() {
     QString certName;
     QString certNo;
 
-    // TODO: 获取登录用户信息
-    // QProcessEnvironment env = QProcessEnvironment::systemEnvironment();  //  获取系统环境变量
-    // if (env.contains("certName") && env.contains("certNo")) {
-    //     certName = env.value("certName", "");  // 第二个参数为默认值
-    //     certNo = env.value("certNo", "");
-    //     qDebug() << "Environment variables 'certName' or 'certNo' not found.";
-    //     return metaInfo;  // 如果没有找到相关环境变量,返回空的 QJsonObject
-    // } else {
     QMap<QString, QString> userInfo = RegistryManager::instance()->getCurentLoginUser();
     certName = userInfo.value("certName", "");
     certNo = userInfo.value("identity", "");
@@ -279,7 +265,7 @@ void BlastOpePage::loadDataFromSource(int currentPage, int pageSize) {
         {"工程名称", "name"},
         {"操作员", "operatorName"},
         {"爆破员", "blasterName"},
-        {"井下地址", "addressUuid"},
+        {"井下地址", "addressPath"},
         {"雷管数量", "detSum"},
         {"起爆器数量", "blastCount"},
         {"起爆状态", "blastStatus"},
@@ -316,15 +302,19 @@ void BlastOpePage::loadDataFromSource(int currentPage, int pageSize) {
 
                 if (prop == "blastStatus") {
                     QString statusText;
-                    if (value.toString() == "1") {
+                    if (value.toString() == BlastStatus::Created) {
                         statusText = "未 注 册";
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#e7c66b"));
-                    } else if (value.toString() == "2") {
-                        statusText = "待 起 爆";
+                    } else if (value.toString() == BlastStatus::Registered) {
+                        statusText = "待安全确认";
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#f3a361"));
-                    } else if (value.toString() == "3") {
+                    } else if (value.toString() == BlastStatus::SafeChecked) {
+                        statusText = "已安全确认";
+                        item = new QStandardItem(statusText);
+                        item->setForeground(QColor("#f3a3k'k1"));
+                    } else if (value.toString() == BlastStatus::Blasted) {
                         statusText = "起 爆 完 成";
                         item = new QStandardItem(statusText);
                         item->setForeground(QColor("#90d543"));
@@ -429,8 +419,12 @@ void BlastOpePage::loadDataFromSource(int currentPage, int pageSize) {
                     "    border: none;"
                     "    background-color: transparent;"
                     "}");
-            } else {
+            } else if (blastStatus == "已安全确认") {
                 button->setText(startBlastButtonTxt);
+                button->setEnabled(true);
+            } else {
+                button->setText("待安全员确认");
+                button->setDisabled(true);
             }
         }
         QHBoxLayout *layout = new QHBoxLayout(widget);
@@ -519,6 +513,12 @@ void BlastOpePage::onUpdateBlastStatus(int status, int row) {
         QFont boldFont;
         boldFont.setBold(true);
         switch (status) {
+            case 0:
+                model->setData(index, "已安全确认");
+                customColor = QColor("#44035b");
+                model->setData(index, customColor, Qt::ForegroundRole);
+                model->setData(index, boldFont, Qt::FontRole);
+                break;
             case 1:
                 model->setData(index, "组 网 中 ...");
                 customColor = QColor("#44035b");
@@ -551,11 +551,11 @@ void BlastOpePage::onUpdateBlastStatus(int status, int row) {
                 customColor = QColor("#90d543");
                 model->setData(index, customColor, Qt::ForegroundRole);
                 break;
-            case 0:
-                model->setData(index, "已 注 册");
-                customColor = QColor("#8e620");
-                model->setData(index, customColor, Qt::ForegroundRole);
-                break;
+            // case 0:
+            //     model->setData(index, "已 注 册");
+            //     customColor = QColor("#8e620");
+            //     model->setData(index, customColor, Qt::ForegroundRole);
+            //     break;
             case 10:
                 model->setData(index, "按 下 双 建 起 爆 ...");
                 customColor = QColor("#8e620");

+ 0 - 272
blastprojectpage.cpp

@@ -1,272 +0,0 @@
-#include "blastprojectpage.h"
-
-#include <QUrl>
-#include <iostream>
-
-#include "databasemanager.h"
-#include "global.h"
-#include "ui_blastprojectpage.h"
-
-BlastProjectPage::BlastProjectPage(QWidget *parent)
-    : QWidget(parent),
-      ui(new Ui::BlastProjectPage),
-      dao(DatabaseManager::getInstance().getDatabase()) {
-    ui->setupUi(this);
-    pageWidget = new PageWidget;
-    connect(pageWidget, &PageWidget::currentPageChanged, this, &BlastProjectPage::PageChanged);
-    connect(pageWidget->getComboBox(), QOverload<int>::of(&QComboBox::currentIndexChanged), this,
-            &BlastProjectPage::onComboBoxIndexChanged);
-    ui->verticalLayout_4->addWidget(pageWidget);
-    ;
-    pageSize = 10;
-    currentPage = 1;
-
-    RefreshData();
-    m_httpClient = new HttpClient(this);
-    QUrl localUrl("person/type");
-    QUrl fullUrl = apiBackendUrl.resolved(localUrl);
-    m_httpClient->sendHttpGetRequest(fullUrl);
-
-    QUrl addressLocalUrl("h-address/pc");
-    QUrl addressFullUrl = apiBackendUrl.resolved(addressLocalUrl);
-    m_httpClient->sendHttpGetAddress(addressFullUrl);
-    // 获取用户信息
-    connect(m_httpClient, &HttpClient::httpGetFinished,
-            [this](const QJsonDocument &data, const QUrl url) {
-                QString relativePath = url.toString().remove(0, g_url.toString().length());
-                if (relativePath == "person/type") {
-                    this->personOptionsByType(data);
-                } else if (relativePath == "h-address/pc") {
-                    this->addressOptions(data);
-                }
-                qDebug() << "relativePath:" << relativePath;
-            });
-
-    dialog = new ProjectDialog(this);
-    connect(dialog, &ProjectDialog::validateDetNum, this, &BlastProjectPage::insertPlan);
-    connect(dialog, &ProjectDialog::validateDetNumUpdate, this, &BlastProjectPage::updateProject);
-}
-
-void BlastProjectPage::RefreshData() { loadDataFromSource(currentPage, pageSize); }
-
-void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
-    PaginatedHProjectResult result = dao.getAllHProjects(currentPage, pageSize);
-
-    QList<QSharedPointer<HProject>> projectList = result.projects;
-
-    totalCount = result.totalCount;
-    pageWidget->setMaxPage(ceil(static_cast<double>(totalCount) / pageSize));
-    QStandardItemModel *model;
-    model = new QStandardItemModel(this);
-
-    // 定义表头信息
-    QList<HeaderInfo> headers = {
-        {"工程名称", "name"},
-        {"操作员", "operatorName"},
-        {"爆破员", "blasterName"},
-        {"井下地址", "addressUuid"},
-        {"雷管数量", "detSum"},
-        {"起爆状态", "blastStatus"},
-        {"操作", ""},
-    };
-    // 获取表头的长度
-    int headerCount = headers.size();
-    // 设置表头
-    QStringList headerLabels;
-    QMap<int, QString> propMap;  // 用于存储表头的 prop 属性
-    for (int i = 0; i < headers.size(); ++i) {
-        headerLabels << headers[i].label;
-        propMap[i] = headers[i].prop;
-    }
-    model->setHorizontalHeaderLabels(headerLabels);
-    // // 填充数据
-    for (int row = 0; row < projectList.size(); ++row) {
-        HProject &HProject = *projectList.at(row).data();
-        for (int col = 0; col < headers.size(); ++col) {
-            QString prop = propMap[col];
-            QStandardItem *item = nullptr;
-
-            // 根据 prop 获取 SysApi 对象的属性值
-            if (!prop.isEmpty()) {
-                QMetaProperty metaProp = HProject.metaObject()->property(
-                    HProject.metaObject()->indexOfProperty(prop.toUtf8()));
-                QVariant value = metaProp.read(&HProject);
-                item = new QStandardItem(value.toString());
-            } else {
-                item = new QStandardItem("操作");
-            }
-            if (item) {
-                item->setTextAlignment(Qt::AlignCenter);  // 设置文本居中对齐
-                model->setItem(row, col, item);
-            }
-        }
-    }
-    // 设置 QTableView 的 model
-    ui->tableView->setModel(model);
-    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
-
-    // 创建并设置自定义委托
-    ButtonDelegate *delegate = new ButtonDelegate(headerCount - 1, this);
-    QObject::connect(delegate, &ButtonDelegate::buttonClicked, [=](int row, int column) {
-        qDebug() << "Button clicked at row:" << row << "column:" << column;
-        // 获取 HPlan 引用
-        HProject &HPlanDeleteOrUpdate = *projectList.at(row).data();
-        updateId = HPlanDeleteOrUpdate.getId();
-        if (column == 1) {
-            deleteButtonClicked(HPlanDeleteOrUpdate);
-        }
-        if (column == 2) {
-            updateButtonClicked(HPlanDeleteOrUpdate);
-        }
-        QStringList rowData;
-        for (int col = 0; col < model->columnCount(); ++col) {
-            QModelIndex index = model->index(row, col);
-            rowData << index.data().toString();
-            QVariant data = model->data(index);
-            rowData += QString("Column %1: %2 | ").arg(col).arg(data.toString());
-        }
-        // qDebug() << "Row data:" << rowData;
-    });
-    ui->tableView->setItemDelegateForColumn(headerCount - 1, delegate);
-}
-
-// 切换页数
-void BlastProjectPage::PageChanged(int page) {
-    currentPage = page;
-    loadDataFromSource(currentPage, pageSize);
-}
-
-void BlastProjectPage::onComboBoxIndexChanged(int index) {
-    // 获取当前选中的文本
-    QVariant variant = pageWidget->getComboBox()->itemData(index);
-    int value = variant.toInt();
-    pageSize = value;
-    currentPage = 1;
-    loadDataFromSource(currentPage, pageSize);
-}
-
-void BlastProjectPage::personOptionsByType(const QJsonDocument &jsonDoc) {
-    parseJsonString(jsonDoc);
-    // 定义两个新的 QJsonArray 用于存储分组后的数据
-    QJsonArray bapoYuanArray;
-    QJsonArray anQuanYuanArray;
-
-    for (const QJsonValue &value : dataArray) {
-        if (value.isObject()) {
-            QJsonObject obj = value.toObject();
-            if (obj.contains("personTypeName")) {
-                QString personTypeName = obj["personTypeName"].toString();
-
-                // 按 personType 分组
-                if (personTypeName == "爆破员") {
-                    bapoYuanArray.append(obj);
-                } else if (personTypeName == "安全员") {
-                    anQuanYuanArray.append(obj);
-                }
-            }
-        }
-    }
-    // 将分组后的数据填充到对应的 QComboBox 中
-    dialog->SetComboBoxBlast(bapoYuanArray);
-    dialog->SetComboBoxOperator(anQuanYuanArray);
-}
-
-void BlastProjectPage::addressOptions(const QJsonDocument &jsonDoc) {
-    parseJsonStringAddress(jsonDoc);
-    QJsonArray parentOptions;
-    for (const QJsonValue &item : dataArrayAddress) {
-        parentOptions.append(item.toObject()["name"].toString());
-    }
-    dialog->SetComboBoxAddress(parentOptions);
-    dialog->setChildOptions(dataArrayAddress);
-    // qDebug()<<"parentOptions data"<<parentOptions;
-}
-
-void BlastProjectPage::parseJsonString(const QJsonDocument &jsonDoc) {
-    QJsonObject jsonObj = jsonDoc.object();
-    QJsonObject dataObj = jsonObj["data"].toObject();
-    dataArray = dataObj["list"].toArray();
-    // qDebug()<<"Row data"<<dataArray;
-}
-
-void BlastProjectPage::parseJsonStringAddress(const QJsonDocument &jsonDoc) {
-    QJsonObject jsonObj = jsonDoc.object();
-    dataArrayAddress = jsonObj["data"].toArray();
-    // qDebug()<<"Row data"<<dataArrayAddress;
-}
-void BlastProjectPage::on_pushButton_clicked() {
-    dialog->setModal(false);
-    dialog->setOperationStatus(0);
-    int ref = dialog->exec();
-    if (ref == QDialog::Accepted) {
-        qDebug() << "新增对话框关闭";
-    };
-}
-
-void BlastProjectPage::insertPlan(const QMap<QString, QString> &data) {
-    qDebug() << "Inserting project *****************:";
-
-    HProject project;
-    project.setName(data.value("name"));
-    project.setDetSum(data.value("detNum"));
-    project.setBlasterName(data.value("blasterName"));
-    project.setOperatorName(data.value("operatorName"));
-    project.setAddressUuid(data.value("addressUuid"));
-    project.setBlasterIdentity(data.value("blasterIdentity"));
-    project.setOperatorIdentity(data.value("operatorIdentity"));
-    // 生成 32 位的 UUID
-    QString uuidString =
-        QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-"));
-    project.setUuid(uuidString);  // 假设 HProject 类有 setUuid 方法
-    if (dao.addHProject(project)) {
-        RefreshData();
-        qDebug() << "Inserting MqttClient";
-        MqttClient *client = MqttClient::getInstance();
-
-        // 将 project 对象转换为 JSON
-        QByteArray jsonData = project.ProjectToJson(project);
-
-        qDebug() << "JSON from HProject: " << jsonData;
-
-        // 发送消息到 testtopic
-        client->sendMessage("testtopic", jsonData);
-    }
-}
-
-void BlastProjectPage::updateButtonClicked(const HProject &project) {
-    dialog->setModal(false);
-    dialog->setOperationStatus(1);
-    dialog->setFormData(project);
-    int ref = dialog->exec();
-    if (ref == QDialog::Accepted) {
-        qDebug() << "aaa";
-    };
-}
-
-void BlastProjectPage::updateProject(const QMap<QString, QString> &data) {
-    QString detNum = data.value("detNum");
-    QString name = data.value("name");
-    QString operaName = data.value("operatorName");
-    qDebug() << "updateProject  with detNum:" << detNum << "name:" << name
-             << "operaName:" << operaName;
-    HProject project;
-    project.setId(updateId);
-    project.setName(data.value("name"));
-    project.setDetSum(data.value("detNum"));
-    project.setBlasterName(data.value("blasterName"));
-    project.setOperatorName(data.value("operatorName"));
-    project.setAddressUuid(data.value("addressUuid"));
-    project.setBlasterIdentity(data.value("blasterIdentity"));
-    project.setOperatorIdentity(data.value("operatorIdentity"));
-    if (dao.updateHProject(project)) {
-        qDebug() << "updateHProject";
-        RefreshData();
-    }
-}
-void BlastProjectPage::deleteButtonClicked(const HProject &project) {
-    if (dao.deleteHProject(project)) {
-        RefreshData();
-    }
-}
-
-BlastProjectPage::~BlastProjectPage() { delete ui; }

+ 0 - 61
blastprojectpage.h

@@ -1,61 +0,0 @@
-#ifndef BLASTPROJECTPAGE_H
-#define BLASTPROJECTPAGE_H
-
-#include <QWidget>
-#include <QStandardItemModel>
-#include <QPushButton>
-#include <QJsonArray>
-#include "hprojectdao.h"
-#include "PageWidget.h"
-#include "buttondelegate.h"
-#include "projectdialog.h"
-#include "HttpClient.h"
-#include "mqtt/mqttclient.h"
-
-namespace Ui {
-class BlastProjectPage;
-}
-
-class BlastProjectPage : public QWidget
-{
-    Q_OBJECT
-
-public:
-    explicit BlastProjectPage(QWidget *parent = nullptr);
-    ~BlastProjectPage();
-
-
-private slots:
-    void PageChanged(int page);
-    void onComboBoxIndexChanged(int index);
-    void on_pushButton_clicked();
-
-private:
-    void RefreshData();
-    void loadDataFromSource(int currentPage,int pageSize);
-    void personOptionsByType(const QJsonDocument &jsonDoc);
-    void parseJsonStringAddress(const QJsonDocument &jsonDoc);
-    void addressOptions(const QJsonDocument &jsonDoc);
-    void parseJsonString(const QJsonDocument &jsonDoc);
-    void fillComboBox(QComboBox *comboBox, const QJsonArray &jsonArray);
-    void insertPlan(const QMap<QString, QString> &data);
-    void updateButtonClicked(const HProject &project);
-    void updateProject(const QMap<QString, QString> &data);
-    void deleteButtonClicked(const HProject &project);
-
-private:
-    Ui::BlastProjectPage *ui;
-    PageWidget *pageWidget;
-    ProjectDialog *dialog;
-    HttpClient *m_httpClient;
-    HProjectDao dao;
-    QJsonArray dataArray;
-    QJsonArray dataArrayAddress;
-    int pageSize;  //每页显示的记录数量
-    int currentPage;      //当前页面
-    int totalCount;
-    int updateId;
-
-};
-
-#endif // BLASTPROJECTPAGE_H

+ 4 - 8
detInfo/detinfofactory.h

@@ -1,16 +1,12 @@
 #ifndef DETINFOFACTORY_H
 #define DETINFOFACTORY_H
-#include "../PageFactory.h"
+#include "../pagefactory.h"
 #include "detinfopage.h"
 
-
-
-
-class DetInfoFactory:public PageFactory
-{
-public:
+class DetInfoFactory : public PageFactory {
+   public:
     DetInfoFactory();
     QWidget* createPage(QWidget* parent) const override;
 };
 
-#endif // DETINFOFACTORY_H
+#endif  // DETINFOFACTORY_H

+ 3 - 5
detInfo/detinfopage.cpp

@@ -49,8 +49,7 @@ void DetInfoPage::onComboBoxIndexChanged(int index) {
 void DetInfoPage::dataTable(const QJsonDocument& jsonDoc) {
     parseJsonString(jsonDoc);
     model = new QStandardItemModel(this);
-    model->setHorizontalHeaderLabels(
-        {"设备编号", "管码", "uid码", "工作码", "有效期", "是否使用", "创建时间"});
+    model->setHorizontalHeaderLabels({"管码", "uid码", "创建时间"});
     for (const QJsonValue& jsonValue : dataArray) {
         QJsonObject jsonObj = jsonValue.toObject();
         QList<QStandardItem*> items = jsonToItem(jsonObj);
@@ -63,7 +62,6 @@ void DetInfoPage::dataTable(const QJsonDocument& jsonDoc) {
 QList<QStandardItem*> DetInfoPage::jsonToItem(const QJsonObject& jsonObj) {
     // QStandardItem* nameItem = new QStandardItem(jsonObj["name"].toString());
     // nameItem->setTextAlignment(Qt::AlignCenter);
-    QStandardItem* equipItem = new QStandardItem(jsonObj["equipmentSn"].toString());
     QStandardItem* fbhItem = new QStandardItem(jsonObj["fbh"].toString());
     QStandardItem* uidItem = new QStandardItem(jsonObj["uid"].toString());
     QStandardItem* gzmItem = new QStandardItem(jsonObj["gzm"].toString());
@@ -73,13 +71,13 @@ QList<QStandardItem*> DetInfoPage::jsonToItem(const QJsonObject& jsonObj) {
     QString formattedYxq = yxq.toString("yyyy-MM-dd HH:mm:ss");
     QStandardItem* yxqItem = new QStandardItem(formattedYxq);
     QStandardItem* isUseItem = new QStandardItem(jsonObj["isUse"].toInt());
+
     QString createdAtStr = jsonObj["createdAt"].toString();
     QDateTime createdAt = QDateTime::fromString(createdAtStr, Qt::ISODateWithMs);
     QString formattedCreatedAt = createdAt.toString("yyyy-MM-dd HH:mm:ss");
     QStandardItem* createdItem = new QStandardItem(formattedCreatedAt);
 
-    return QList<QStandardItem*>()
-           << equipItem << fbhItem << uidItem << gzmItem << yxqItem << isUseItem << createdItem;
+    return QList<QStandardItem*>() << fbhItem << uidItem << createdItem;
 }
 
 void DetInfoPage::parseJsonString(const QJsonDocument& jsonDoc) {

+ 17 - 12
fireWidget/firingwidget.cpp

@@ -14,8 +14,6 @@
 #include <QUrlQuery>
 
 #include "../backendapimanager.h"
-#include "../countdownwidget.h"
-#include "../global.h"
 #include "../logger.h"
 #include "ui_firingwidget.h"
 
@@ -46,9 +44,8 @@ firingWidget::firingWidget(const int &row, const bool &select, const QString &uu
     mqttThread->setConnectionInfo("114.55.233.194", 1883, "hxgc", "hxgc123456", "P" + uuid, topics);
     connect(mqttThread, &MqttThread::mqttConnected, this, &firingWidget::onMqttConnected);
     mqttThread->start();
-    connect(mqttThread, &MqttThread::messageAndTopicReceived, this,
-            &firingWidget::handleMessageAndTopic);
-
+    connect(mqttThread, &MqttThread::projectMqttMessageReceived, this,
+            &firingWidget::handleProjectFiringMqttMessage);
     connect(this, &firingWidget::lastStageChanged, this, &firingWidget::onLastStageChanged);
     connect(this, &firingWidget::updateData, this, &firingWidget::onBlastSucess);
     startBlasting();
@@ -142,12 +139,17 @@ bool firingWidget::uploadToDanLing(const QJsonObject &jsonObj) {
     return true;
 }
 
-void firingWidget::handleMessageAndTopic(const QByteArray &message, const QMqttTopicName &topic) {
+void firingWidget::handleProjectFiringMqttMessage(const QByteArray &message,
+                                                  const QMqttTopicName &topic) {
     QString msgText = QString("Topic: %1, Message: %2").arg(topic.name(), QString(message));
     QTextEdit *textEdit = ui->scrollAreaWidgetContents->findChild<QTextEdit *>("textEdit");
     if (textEdit) {
         textEdit->append(msgText);
     }
+
+    qDebug() << ANSI_COLOR_GREEN << "Received message on topic:" << topic.name()
+             << ", Message:" << QString(message) << ANSI_COLOR_RESET;
+
     int stage = 0;
     QJsonDocument jsonDoc = QJsonDocument::fromJson(message);
     if (!jsonDoc.isNull() && jsonDoc.isObject()) {
@@ -157,6 +159,7 @@ void firingWidget::handleMessageAndTopic(const QByteArray &message, const QMqttT
                 QJsonObject dataObject = jsonObj["data"].toObject();
                 stage = dataObject["stage"].toInt();
                 if (stage != lastStage) {
+                    // TODO: check available stage
                     lastStage = stage;
                     switch (stage) {
                         case 0:
@@ -264,13 +267,17 @@ void firingWidget::onLastStageChanged(int newStage) {
             buttonText = "立即测试";
             sendMqttMessage(topic, message.toUtf8());
             break;
-        case 2:
+        case 2:  // 进入充电
             message = "开始充电";
             buttonText = "充电";
             sendMqttMessage(topic, message.toUtf8());
             break;
-        case 4:
-            message = "起爆";
+        case 3:  // 充电完成
+            message = "待安全确认";
+            // buttonText = "起爆";
+            break;
+        case 4:  // 充电完成
+            message = "待起爆";
             buttonText = "起爆";
             break;
         case 5:
@@ -344,8 +351,6 @@ void firingWidget::onBlastSucess(const QJsonObject &jsonObj) {
     Logger::getInstance("blastRecord.log")
         .info(QJsonDocument(jsonObj).toJson(QJsonDocument::Indented));
     blast_uuid = QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-"));
-    lat = labLat;
-    lon = labLon;
 
     saveAndUploadRecord(jsonObj);
 }
@@ -504,4 +509,4 @@ QList<HBlastRecordDet *> firingWidget::recordBlastProjectDets(const QString proj
         }
     }
     return recordDets;
-}
+}

+ 1 - 1
fireWidget/firingwidget.h

@@ -35,7 +35,7 @@ class firingWidget : public QWidget {
    private slots:
     void on_pushButton_2_clicked();
     void on_sendTest_4_clicked();
-    void handleMessageAndTopic(const QByteArray &message, const QMqttTopicName &topic);
+    void handleProjectFiringMqttMessage(const QByteArray &message, const QMqttTopicName &topic);
 
     void onMqttConnected();
     // 双键按下

+ 2 - 1
global.cpp

@@ -8,4 +8,5 @@ QString firewidgetPort("COM1");
 QString gpsPort("COM3");
 QString databaseHost("192.168.0.241");
 QString mqttClientId("mqttclient_OnDevPC");
-bool isShowTriggeringWidget = true;
+QString MQTT_TOPIC_CAMPANY_PROJECTS("hxgc/companycode/pro/P");
+bool isShowTriggeringWidget = true;

+ 14 - 5
global.h

@@ -11,10 +11,19 @@ extern QUrl apiBackendUrl;  // 声明全局变量
 extern QString labLat;      // 新增的全局变量声明
 extern QString labLon;      // 新增的全局变量声明
 extern QString globalAuthority;
-extern QString firewidgetPort;       // 点火装置串口号
-extern QString gpsPort;              // gps串口号
-extern QString databaseHost;         // pc数据库地址
-extern QString mqttClientId;         // mqtt客户端ID
-extern bool isShowTriggeringWidget;  // 是否显示点火装置触发中调试组件
+extern QString firewidgetPort;               // 点火装置串口号
+extern QString gpsPort;                      // gps串口号
+extern QString databaseHost;                 // pc数据库地址
+extern QString mqttClientId;                 // mqtt客户端ID
+extern QString MQTT_TOPIC_CAMPANY_PROJECTS;  // 每个部署点(公司)唯一地址
+extern bool isShowTriggeringWidget;          // 是否显示点火装置触发中调试组件
+
+/* BlastStatus (1未注册2注册成功3充电4起爆)*/
+namespace BlastStatus {
+const QString Created = "1";
+const QString Registered = "2";
+const QString Blasted = "4";
+const QString SafeChecked = "5";
+}  // namespace BlastStatus
 
 #endif  // GLOBAL_H

+ 76 - 7
mainwindow.cpp

@@ -4,6 +4,7 @@
 #include <QPushButton>
 #include <QWidget>
 
+#include "backendapimanager.h"
 #include "global.h"
 #include "jobs.h"
 #include "loadingWidget.h"
@@ -19,8 +20,8 @@
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
     try {
         this->setWindowFlags(Qt::FramelessWindowHint);
-        this->setWindowState(Qt::WindowMaximized);  // Maximizes the window
-        // this->setFixedSize(1920, 1080);
+        // this->setWindowState(Qt::WindowMaximized);  // Maximizes the window
+        this->setFixedSize(1000, 600);
         ui->setupUi(this);
         LoadingWidget::init(ui->stackedWidget);
 
@@ -127,30 +128,55 @@ void MainWindow::switchPage(QWidget *button) {
 void MainWindow::initialMqttService() {
     Logger::getInstance().info("Start init Mqtt server.");
     MqttClient *pcMqttInit = MqttClient::getInstance();
-    QStringList topics = {"hxgc/topic", "hxgc/companycode/pro/P"};
+    // "hxgc/topic"
+    QStringList topics = {MQTT_TOPIC_CAMPANY_PROJECTS};
     pcMqttInit->connectToMqttBroker("114.55.233.194", 1883, "hxgc", "hxgc123456", mqttClientId,
                                     topics);
     connect(pcMqttInit, &MqttClient::proMessageReceived, this,
-            &MainWindow::messageAndTopicReceived);
+            &MainWindow::handleMqttProjectsMessage);
     Logger::getInstance().info("Connect Mqtt server request sent.");
 }
 
-void MainWindow::messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic) {
+void MainWindow::handleMqttProjectsMessage(const QByteArray &message, const QMqttTopicName &topic) {
     QJsonDocument jsonDoc = QJsonDocument::fromJson(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() == "1") {  // "1" 未注册
+            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, "2");
+                    dao.updateBlastStatusByUuid(uuid, BlastStatus::Registered);
                 }
             }
+        } else if (jsonObj.contains("msgType") && jsonObj["msgType"].toString() == "safeCheck") {
+            qDebug() << "收到安全验证消息: " << jsonObj;
+            // 处理安全验证消息
+            if (jsonObj["status"] != "ok") {
+                QMessageBox::warning(this, "安全验证失败",
+                                     QString("安全验证未通过,练习安全员确认"));
+                return;
+            }
+            qDebug() << "安全验证通过,开始注册项目";
+
+            const QString addressUuid = jsonObj["addressUuid"].toString();
+            QJsonArray addressList = backendAPIManager::getHAddresses();
+
+            QList<QString> subAddressUuids = findAllChildUuids(addressList, addressUuid);
+            HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
+
+            QList<QSharedPointer<HProject>> projects =
+                dao.getRegistedProjectByAddressUuid(subAddressUuids);
+            MqttClient *pcMqttClient = MqttClient::getInstance();
+            for (const auto &project : projects) {
+                dao.updateBlastStatusByUuid(project->getUuid(), BlastStatus::SafeChecked);
+            }
+            // TODO if  have updated project, trigger refresh the project list page
         }
     }
 }
@@ -230,3 +256,46 @@ 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);
+
+                        // Also add any grandchildren
+                        if (child.toObject().contains("children") &&
+                            child.toObject()["children"].isArray()) {
+                            QJsonArray grandchildren = child.toObject()["children"].toArray();
+                            childrenUuids.append(findAllChildUuids(
+                                grandchildren, child.toObject()["uuid"].toString()));
+                        }
+                    }
+                }
+                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;
+}

+ 28 - 27
mainwindow.h

@@ -1,53 +1,55 @@
 #ifndef MAINWINDOW_H
 #define MAINWINDOW_H
 
+#include <QFrame>
+#include <QList>
 #include <QMainWindow>
 #include <QPropertyAnimation>
 #include <QPushButton>
-#include <QFrame>
-#include <QList>
 #include <QWidget>
-#include "mqtt/mqttclient.h"
+
 #include "addressfactory.h"
 #include "blastProject/blastprojectfactory.h"
-#include "equipmentfactory.h"
-#include "detInfo/detinfofactory.h"
-#include "blastoperationfactory.h"
 #include "blastRecord/blastrecordfactory.h"
+#include "blastoperationfactory.h"
+#include "detInfo/detinfofactory.h"
+#include "equipmentfactory.h"
+#include "global.h"
+#include "mqtt/mqttclient.h"
 #include "serial/serialtool.h"
 #include "serialGpsthread.h"
 #include "worker/timeupdatethread.h"
-#include "global.h"
-
 
 QT_BEGIN_NAMESPACE
-namespace Ui { class MainWindow; }
+namespace Ui {
+class MainWindow;
+}
 QT_END_NAMESPACE
 
-class MainWindow : public QMainWindow
-{
+class MainWindow : public QMainWindow {
     Q_OBJECT
 
-public:
+   public:
     MainWindow(QWidget *parent = nullptr);
     ~MainWindow();
 
     void setProjectTitle(const QString &newTitle);
 
-signals:
+   signals:
     void projectTitleChanged(const QString &newTitle);
 
-private slots:
+   private slots:
     void onToggleButtonClicked();
-    void onButtonClicked(QPushButton  *button);
+    void onButtonClicked(QPushButton *button);
     void handleStoredGNRMCData(const RMCData &data);
     void onTimeUpdated(const QString &timeString);
     void updateProjectTitleLabel(const QString &newTitle);
 
-    void messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic);
-private:
+    void handleMqttProjectsMessage(const QByteArray &message, const QMqttTopicName &topic);
+
+   private:
     void initializeAnimate();
-    void setStyleSheets(QPushButton  *selectedButton);
+    void setStyleSheets(QPushButton *selectedButton);
     void switchPage(QWidget *button);
     void initialMqttService();
     void onMqttConnected();
@@ -55,25 +57,24 @@ private:
     void initialGPSSerial();
     void initDateTime();
     void onSerialToolCreated();
+    QList<QString> findAllChildUuids(const QJsonArray &addressArray, const QString targetUuid);
 
-
-private:
+   private:
     Ui::MainWindow *ui;
-    SerialTool* serialTool;
+    SerialTool *serialTool;
     bool m_isMqttConnected = false;
     bool m_btnSerialInitialized = false;
     QPropertyAnimation *animate_leftFrame;
-    QList<QWidget*> left_button_station;
-    QMap<QWidget*, PageFactory*> pageFactories;
-    QMap<QWidget*, QWidget*> createdPageByButton;
+    QList<QWidget *> left_button_station;
+    QMap<QWidget *, PageFactory *> pageFactories;
+    QMap<QWidget *, QWidget *> createdPageByButton;
     TimeUpdateThread *timeThread;
     QString lat = "未知";
     QString lon = "未知";
     QPoint m_dragPosition;
-    QString m_currentProjectTitle;    // Stores the current project title
-
+    QString m_currentProjectTitle;  // Stores the current project title
 
     void mousePressEvent(QMouseEvent *event);
     void mouseMoveEvent(QMouseEvent *event);
 };
-#endif // MAINWINDOW_H
+#endif  // MAINWINDOW_H

+ 2 - 1
mqtt/mqttclient.cpp

@@ -4,6 +4,7 @@
 #include <QJsonObject>
 #include <QMessageBox>
 
+#include "../global.h"
 #include "../logger.h"
 
 MqttClient *MqttClient::instance = nullptr;
@@ -98,7 +99,7 @@ void MqttClient::sendMessage(const QString &topic, const QByteArray &message, qu
 }
 
 void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic) {
-    if (topic.name() == "hxgc/companycode/pro/P") {
+    if (topic.name() == MQTT_TOPIC_CAMPANY_PROJECTS) {
         emit proMessageReceived(message, topic);
     } else {
         emit messageAndTopicReceived(message, topic);

+ 1 - 1
mqttthread.cpp

@@ -40,7 +40,7 @@ void MqttThread::run() {
 
     connect(mqttClient, &MqttClient::connected, this, &MqttThread::mqttConnected);
     connect(mqttClient, &MqttClient::messageAndTopicReceived, this,
-            &MqttThread::messageAndTopicReceived);
+            &MqttThread::projectMqttMessageReceived);
     connect(this, &MqttThread::sendMessageRequested, mqttClient, &MqttClient::sendMessage);
     while (!m_stopFlag) {
         exec();

+ 16 - 12
mqttthread.h

@@ -1,35 +1,39 @@
 #ifndef MQTTTHREAD_H
 #define MQTTTHREAD_H
 
-#include <QThread>
 #include <QString>
 #include <QStringList>
+#include <QThread>
+
 #include "./mqtt/mqttclient.h"
 
 class MqttClient;
 
-class MqttThread : public QThread
-{
+class MqttThread : public QThread {
     Q_OBJECT
-public:
+   public:
     MqttThread(QObject *parent = nullptr);
     ~MqttThread();
     void stopThread();
 
-    void sendMqttMessage(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg);
-    void setConnectionInfo(const QString &hostname, quint16 port, const QString &username, const QString &password, const QString &clientId, const QStringList &topicsToSubscribe);
+    void sendMqttMessage(const QString &topic, const QByteArray &message, quint8 qos,
+                         bool isRetainedMsg);
+    void setConnectionInfo(const QString &hostname, quint16 port, const QString &username,
+                           const QString &password, const QString &clientId,
+                           const QStringList &topicsToSubscribe);
     MqttClient *getMqttClient() const;
 
-signals:
+   signals:
     void mqttConnected();
     // 转发 MQTT 消息接收信号
-    void messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic);
-    void sendMessageRequested(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg);
+    void projectMqttMessageReceived(const QByteArray &message, const QMqttTopicName &topic);
+    void sendMessageRequested(const QString &topic, const QByteArray &message, quint8 qos,
+                              bool isRetainedMsg);
 
-protected:
+   protected:
     void run() override;
 
-private:
+   private:
     MqttClient *mqttClient = nullptr;
     QString m_hostname;
     quint16 m_port;
@@ -39,4 +43,4 @@ private:
     QStringList m_topicsToSubscribe;
     bool m_stopFlag = false;
 };
-#endif // MQTTTHREAD_H
+#endif  // MQTTTHREAD_H

+ 0 - 251
projectdialog.cpp

@@ -1,251 +0,0 @@
-#include "projectdialog.h"
-
-#include "regex.h"
-#include "ui_projectdialog.h"
-
-ProjectDialog::ProjectDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ProjectDialog) {
-    ui->setupUi(this);
-    connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &ProjectDialog::validateInput);
-    connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &ProjectDialog::clearFormData);
-}
-
-// 初始化爆破员列表
-void ProjectDialog::SetComboBoxBlast(const QJsonArray &bapoYuanArray) {
-    blasterArray = bapoYuanArray;
-    ui->comboBoxBlast->clear();
-    fillComboBox(ui->comboBoxBlast, bapoYuanArray);
-    ui->comboBoxBlast->setCurrentIndex(-1);  // 设置当前索引为 -1
-}
-
-// 初始化操作员列表
-void ProjectDialog::SetComboBoxOperator(const QJsonArray &anQuanYuanArray) {
-    operatorArray = anQuanYuanArray;
-    ui->comboBoxOperator->clear();
-    fillComboBox(ui->comboBoxOperator, anQuanYuanArray);
-    ui->comboBoxOperator->setCurrentIndex(-1);  // 设置当前索引为 -1
-}
-
-void ProjectDialog::on_comboBoxOperator_currentIndexChanged(int index) {
-    if (index >= 0 && index < operatorArray.size()) {
-        operatorId = operatorArray[index].toObject()["identity"].toString();
-    }
-}
-
-void ProjectDialog::on_comboBoxBlast_currentIndexChanged(int index) {
-    if (index >= 0 && index < blasterArray.size()) {
-        blasterId = blasterArray[index].toObject()["identity"].toString();
-    }
-}
-
-void ProjectDialog::fillComboBox(QComboBox *comboBox, const QJsonArray &jsonArray) {
-    for (const QJsonValue &value : jsonArray) {
-        if (value.isObject()) {
-            QJsonObject obj = value.toObject();
-            if (obj.contains("name")) {
-                QString name = obj["name"].toString();
-                comboBox->addItem(name);
-            }
-        }
-    }
-}
-
-// 初始化一级地址列表
-void ProjectDialog::SetComboBoxAddress(const QJsonArray &Options) {
-    parentOptions = Options;
-    ui->comboBoxAddr->clear();
-    for (const QJsonValue &option : Options) {
-        ui->comboBoxAddr->addItem(option.toString());
-    }
-    ui->comboBoxAddr->setCurrentIndex(-1);  // 设置当前索引为 -1
-}
-// 初始化二级地址列表
-void ProjectDialog::SetComboBoxAddress2(const QString &parentName) {
-    ui->comboBoxAddr_2->clear();
-    for (const QJsonValue &item : dataOptions) {
-        const QJsonObject &obj = item.toObject();
-        if (obj["name"].toString() == parentName) {
-            const QJsonArray &children = obj["children"].toArray();
-            childOptions = children;
-            for (const QJsonValue &child : children) {
-                ui->comboBoxAddr_2->addItem(child.toObject()["name"].toString());
-            }
-
-            break;  // 找到对应的 parentName 后,跳出循环
-        }
-    };
-    ui->comboBoxAddr_2->setCurrentIndex(-1);  // 设置当前索引为 -1
-}
-
-void ProjectDialog::SetComboBoxAddress3(const QString &childName) {
-    ui->comboBoxAddr_3->clear();
-    for (const QJsonValue &item : dataOptions) {
-        const QJsonArray &childrenArray = item["children"].toArray();
-        for (const QJsonValue &child : childrenArray) {
-            const QJsonObject &childObj = child.toObject();
-            if (childObj["name"].toString() == childName) {
-                const QJsonArray &grandChildrenArray = childObj["children"].toArray();
-                for (const QJsonValue &grandChild : grandChildrenArray) {
-                    const QJsonObject &grandChildObj = grandChild.toObject();
-                    ui->comboBoxAddr_3->addItem(grandChildObj["name"].toString());
-                }
-                break;  // 找到对应的 childName 后,跳出循环
-            }
-        };
-    }
-
-    ui->comboBoxAddr_3->setCurrentIndex(-1);  // 设置当前索引为 -1
-}
-
-void ProjectDialog::setChildOptions(const QJsonArray &newDataOptions) {
-    dataOptions = newDataOptions;
-}
-
-void ProjectDialog::clearFormData() {
-    // 清除所有 QLineEdit 的文本
-    QList<QLineEdit *> lineEdits = findChildren<QLineEdit *>();
-    for (QLineEdit *lineEdit : lineEdits) {
-        lineEdit->clear();
-    }
-
-    // 清除所有 QComboBox 的选择
-    QList<QComboBox *> comboBoxes = findChildren<QComboBox *>();
-    for (QComboBox *comboBox : comboBoxes) {
-        comboBox->setCurrentIndex(-1);
-    }
-    // 可按需添加更多控件类型的清除逻辑
-}
-
-void ProjectDialog::on_comboBoxAddr_currentIndexChanged(int index) {
-    if (index >= 0 && index < parentOptions.size()) {
-        QString parentName = parentOptions[index].toString();
-        SetComboBoxAddress2(parentName);
-    }
-}
-
-void ProjectDialog::on_comboBoxAddr_2_currentIndexChanged(int index) {
-    if (index >= 0 && index < childOptions.size()) {
-        QString childName = childOptions[index].toObject()["name"].toString();
-        SetComboBoxAddress3(childName);
-    }
-}
-
-void ProjectDialog::validateInput() {
-    QString detNum = ui->editDetNum->text().trimmed();
-    QString projectName = ui->editName->text().trimmed();
-    QString blastName = ui->comboBoxBlast->currentText().trimmed();
-    QString operatorName = ui->comboBoxOperator->currentText().trimmed();
-    QString parentAddress = ui->comboBoxAddr->currentText().trimmed();
-    QString childAddress = ui->comboBoxAddr_2->currentText().trimmed();
-    QString grandChildAddress = ui->comboBoxAddr_3->currentText().trimmed();
-
-    // 检查电子邮件是否为空或格式是否正确
-    if (detNum.isEmpty() || !ui->editDetNum->hasAcceptableInput()) {
-        QMessageBox::warning(this, "输入错误", "请输入0-10000的数字!");
-        return;
-    }
-    // 创建一个 QMap 集合,存储数据
-    QMap<QString, QString> data;
-    data["detNum"] = detNum;
-    data["name"] = projectName;
-    data["operatorName"] = operatorName;
-    data["blasterName"] = blastName;
-    // 拼接 addressUuid
-    QString addressUuid = parentAddress;
-    if (!childAddress.isEmpty()) {
-        qDebug() << "childAddress" << childAddress;
-        addressUuid += "/" + childAddress;
-        if (!grandChildAddress.isEmpty()) {
-            addressUuid += "/" + grandChildAddress;
-        }
-    }
-    data["addressUuid"] = addressUuid;
-    data["blasterIdentity"] = blasterId;
-    data["operatorIdentity"] = operatorId;
-    if (operationStatus == 0) {
-        // 发射信号
-        emit validateDetNum(data);
-    } else if (operationStatus == 1) {
-        emit validateDetNumUpdate(data);
-    }
-
-    clearFormData();                                                         // 清除表单数据
-    qDebug() << "Emitting validateDetNum signal with data*******:" << data;  // 确认信号发射
-    // this->accept();
-}
-
-int ProjectDialog::getOperationStatus() const { return operationStatus; }
-
-void ProjectDialog::setOperationStatus(int newOperationStatus) {
-    operationStatus = newOperationStatus;
-}
-
-void ProjectDialog::setFormData(const HProject &Project) {
-    try {
-        ui->editName->setText(Project.getName());
-        ui->editDetNum->setText(Project.getDetSum());
-        ui->editHTID->setText(Project.getHtid());
-        ui->editXMBH->setText(Project.getXmbh());
-        int indexBlast = ui->comboBoxBlast->findText(Project.getBlasterName());
-        if (indexBlast != -1) {
-            ui->comboBoxBlast->setCurrentIndex(indexBlast);
-        } else {
-            qDebug() << "未找到选项 " << "。";
-        }
-        int indexOper = ui->comboBoxOperator->findText(Project.getOperatorName());
-        if (indexOper != -1) {
-            ui->comboBoxOperator->setCurrentIndex(indexOper);
-        } else {
-            qDebug() << "未找到选项 " << "。";
-        }
-        QStringList addressParts = Project.getAddressUuid().split("/");
-        int numAddresses = addressParts.size();
-        qDebug() << "numAddresses " << numAddresses;
-        QVector<QString> addressVariables;
-        for (int i = 0; i < numAddresses; ++i) {
-            QString part = addressParts[i];
-            addressVariables.append(part);
-        }
-        // 查找目标文本对应的索引
-        int indexAddr = ui->comboBoxAddr->findText(addressVariables[0]);
-
-        if (indexAddr != -1) {
-            // 如果找到了对应的索引,设置为当前索引
-            ui->comboBoxAddr->setCurrentIndex(indexAddr);
-            qDebug() << "已将选项 " << addressVariables[0] << " 设置为当前显示的选项。";
-        } else {
-            // 如果没找到,输出提示信息
-            qDebug() << "未找到选项 " << addressVariables[0];
-        }
-        if (addressVariables.size() >= 2) {
-            int indexAddr_2 = ui->comboBoxAddr_2->findText(addressVariables[1]);
-
-            if (indexAddr_2 != -1) {
-                // 如果找到了对应的索引,设置为当前索引
-                ui->comboBoxAddr_2->setCurrentIndex(indexAddr_2);
-                qDebug() << "已将选项 " << addressVariables[1] << " 设置为当前显示的选项。";
-            } else {
-                // 如果没找到,输出提示信息
-                qDebug() << "未找到选项 " << addressVariables[1];
-            }
-        }
-
-        if (addressVariables.size() >= 3) {
-            int indexAddr_3 = ui->comboBoxAddr_3->findText(addressVariables[2]);
-
-            if (indexAddr_3 != -1) {
-                // 如果找到了对应的索引,设置为当前索引
-                ui->comboBoxAddr_3->setCurrentIndex(indexAddr_3);
-                qDebug() << "已将选项 " << addressVariables[2] << " 设置为当前显示的选项。";
-            } else {
-                // 如果没找到,输出提示信息
-                qDebug() << "未找到选项 " << addressVariables[2];
-            }
-        }
-    } catch (const std::exception &e) {
-        qDebug() << "发生异常: " << e.what();
-    } catch (...) {
-        qDebug() << "发生未知异常";
-    }
-}
-
-ProjectDialog::~ProjectDialog() { delete ui; }

+ 0 - 64
projectdialog.h

@@ -1,64 +0,0 @@
-#ifndef PROJECTDIALOG_H
-#define PROJECTDIALOG_H
-
-#include <QDialog>
-#include <QComboBox>
-#include <QJsonArray>
-#include <QJsonObject>
-#include "hproject.h"
-
-namespace Ui {
-class ProjectDialog;
-}
-
-class ProjectDialog : public QDialog
-{
-    Q_OBJECT
-
-public:
-    explicit ProjectDialog(QWidget *parent = nullptr);
-    ~ProjectDialog();
-    void SetComboBoxBlast(const QJsonArray &bapoYuan);
-    void SetComboBoxOperator(const QJsonArray &anQuanYuanArray);
-    void SetComboBoxAddress(const QJsonArray &parentOptions);
-    void setChildOptions(const QJsonArray &newChildOptions);
-    void clearFormData();
-    void setFormData(const HProject &Project);
-    int getOperationStatus() const;
-    void setOperationStatus(int newOperationStatus);
-
-private slots:
-    void on_comboBoxAddr_currentIndexChanged(int index);
-
-    void on_comboBoxAddr_2_currentIndexChanged(int index);
-
-    void on_comboBoxOperator_currentIndexChanged(int index);
-
-    void on_comboBoxBlast_currentIndexChanged(int index);
-
-signals:
-    void validateDetNum(const QMap<QString, QString> &data);
-    void validateDetNumUpdate(const QMap<QString, QString> &data);
-
-
-private:
-    void fillComboBox(QComboBox *comboBox, const QJsonArray &jsonArray);
-    void SetComboBoxAddress2(const QString &parentName);
-    void SetComboBoxAddress3(const QString &childName);
-    void validateInput();
-
-private:
-    Ui::ProjectDialog *ui;
-    QString blasterId;
-    QString operatorId;
-    QJsonArray blasterArray;
-    QJsonArray operatorArray;
-    QJsonArray dataOptions;
-    QJsonArray parentOptions;
-    QJsonArray childOptions;
-    QJsonArray grandChildOptions;
-    int operationStatus;
-
-};
-
-#endif // PROJECTDIALOG_H