Browse Source

format and optmize code

Yao 1 week ago
parent
commit
31ef2fb841

+ 31 - 42
addresspage.cpp

@@ -1,33 +1,30 @@
 #include "addresspage.h"
-#include "ui_addresspage.h"
+
 #include <QDebug>
-#include <QJsonObject>
 #include <QJsonArray>
 #include <QJsonDocument>
-#include "httpclient.h"
-#include "global.h"
+#include <QJsonObject>
 #include <QUrl>
-AddressPage::AddressPage(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::AddressPage)
-{
+
+#include "global.h"
+#include "httpclient.h"
+#include "ui_addresspage.h"
+AddressPage::AddressPage(QWidget* parent) : QWidget(parent), ui(new Ui::AddressPage) {
     ui->setupUi(this);
     m_httpClient = new HttpClient(this);
     QUrl localUrl("h-address/pc");
-    QUrl fullUrl = g_url.resolved(localUrl);
+    QUrl fullUrl = apiBackendUrl.resolved(localUrl);
     m_httpClient->sendHttpGetRequest(fullUrl);
 
-    connect(m_httpClient, &HttpClient::httpGetFinished, [this](const QJsonDocument &data) {
+    connect(m_httpClient, &HttpClient::httpGetFinished, [this](const QJsonDocument& data) {
         this->dataTable(data);
-
     });
 }
 
-void AddressPage::dataTable(const QJsonDocument &jsonDoc)
-{
+void AddressPage::dataTable(const QJsonDocument& jsonDoc) {
     parseJsonString(jsonDoc);
     model = new QStandardItemModel(this);
-    model->setHorizontalHeaderLabels({"名称", "设备编号", "LORA地址","描述","创建时间"});
+    model->setHorizontalHeaderLabels({"名称", "设备编号", "LORA地址", "描述", "创建时间"});
 
     if (jsonDoc["data"].isArray()) {
         QJsonArray jsonArray = jsonDoc["data"].toArray();
@@ -43,41 +40,33 @@ void AddressPage::dataTable(const QJsonDocument &jsonDoc)
     ui->treeView->header()->setSectionResizeMode(QHeaderView::Stretch);
     ui->treeView->header()->setDefaultAlignment(Qt::AlignCenter);
     ui->treeView->setAlternatingRowColors(true);
-
 }
 
-void AddressPage::parseJsonString(const QJsonDocument &jsonDoc)
-{
+void AddressPage::parseJsonString(const QJsonDocument& jsonDoc) {
     QJsonObject jsonObj = jsonDoc.object();
     QJsonObject dataObj = jsonObj["data"].toObject();
     dataArray = dataObj["list"].toArray();
 }
 
-QList<QStandardItem *> AddressPage::jsonToItem(const QJsonObject &jsonObj)
-{
-
-      QStandardItem* nameItem = new QStandardItem(jsonObj["name"].toString());
-      nameItem->setTextAlignment(Qt::AlignCenter);
-      QStandardItem* equipmentSn = new QStandardItem(jsonObj["equipmentSn"].toString());
-      QStandardItem* loraSn = new QStandardItem(jsonObj["loraSn"].toString());
-      QStandardItem* describe = new QStandardItem(jsonObj["describe"].toString());
-      QString isoDateTimeStr = jsonObj["createdAt"].toString();
-      QDateTime dateTime = QDateTime::fromString(isoDateTimeStr, Qt::ISODateWithMs);
-      QString formattedDateTime = dateTime.toString("yyyy-MM-dd hh:mm:ss");
-      QStandardItem* createdAt = new QStandardItem(formattedDateTime);
-      if (jsonObj.contains("children") && jsonObj["children"].isArray()) {
-          QJsonArray childrenArray = jsonObj["children"].toArray();
-          for (const QJsonValue& child : childrenArray) {
-              QList<QStandardItem*> childItems = jsonToItem(child.toObject());
-              nameItem->appendRow(childItems);
-          }
-      }
+QList<QStandardItem*> AddressPage::jsonToItem(const QJsonObject& jsonObj) {
+    QStandardItem* nameItem = new QStandardItem(jsonObj["name"].toString());
+    nameItem->setTextAlignment(Qt::AlignCenter);
+    QStandardItem* equipmentSn = new QStandardItem(jsonObj["equipmentSn"].toString());
+    QStandardItem* loraSn = new QStandardItem(jsonObj["loraSn"].toString());
+    QStandardItem* describe = new QStandardItem(jsonObj["describe"].toString());
+    QString isoDateTimeStr = jsonObj["createdAt"].toString();
+    QDateTime dateTime = QDateTime::fromString(isoDateTimeStr, Qt::ISODateWithMs);
+    QString formattedDateTime = dateTime.toString("yyyy-MM-dd hh:mm:ss");
+    QStandardItem* createdAt = new QStandardItem(formattedDateTime);
+    if (jsonObj.contains("children") && jsonObj["children"].isArray()) {
+        QJsonArray childrenArray = jsonObj["children"].toArray();
+        for (const QJsonValue& child : childrenArray) {
+            QList<QStandardItem*> childItems = jsonToItem(child.toObject());
+            nameItem->appendRow(childItems);
+        }
+    }
 
-      return QList<QStandardItem*>() << nameItem << equipmentSn << loraSn<<describe<<createdAt;
+    return QList<QStandardItem*>() << nameItem << equipmentSn << loraSn << describe << createdAt;
 }
 
-
-AddressPage::~AddressPage()
-{
-    delete ui;
-}
+AddressPage::~AddressPage() { delete ui; }

+ 70 - 116
blastProject/blastprojectpage.cpp

@@ -1,81 +1,70 @@
 #include "blastprojectpage.h"
-#include "ui_blastprojectpage.h"
-#include <iostream>
-#include "../global.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())
-{
+BlastProjectPage::BlastProjectPage(QWidget *parent)
+    : QWidget(parent),
+      ui(new Ui::BlastProjectPage),
+      dao(DatabaseManager::getInstance().getDatabase()) {
     ui->setupUi(this);
-    pageWidget= new PageWidget;
+    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);;
+    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 = g_url.resolved(localUrl);
+    QUrl fullUrl = apiBackendUrl.resolved(localUrl);
     m_httpClient->sendHttpGetRequest(fullUrl);
 
     QUrl addressLocalUrl("h-address/pc");
-    QUrl addressFullUrl = g_url.resolved(addressLocalUrl);
+    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);
-        }
-
-    });
-
+    connect(m_httpClient, &HttpClient::httpGetFinished,
+            [this](const QJsonDocument &data, const QUrl url) {
+                QString relativePath = url.toString().remove(0, apiBackendUrl.toString().length());
+                if (relativePath == "person/type") {
+                    this->personOptionsByType(data);
+                } else if (relativePath == "h-address/pc") {
+                    this->addressOptions(data);
+                }
+            });
 
     dialog = new ProjectDialog(this);
     connect(dialog, &ProjectDialog::validateDetNum, this, &BlastProjectPage::insertPlan);
     connect(dialog, &ProjectDialog::validateDetNumUpdate, this, &BlastProjectPage::updateProject);
 
     mqttClient = MqttClient::getInstance();
-
-
 }
 
+void BlastProjectPage::RefreshData() { loadDataFromSource(currentPage, pageSize); }
 
-void BlastProjectPage::RefreshData()
-{
-
-    loadDataFromSource(currentPage,pageSize);
-
-}
-
-void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize)
-{
-    PaginatedHProjectResult result =dao.getAllHProjects(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));
+    pageWidget->setMaxPage(ceil(static_cast<double>(totalCount) / pageSize));
     QStandardItemModel *model;
     model = new QStandardItemModel(this);
 
     // 定义表头信息
     QList<HeaderInfo> headers = {
-        {"工程名称", "name"},
-        {"操作员", "operatorName"},
-        {"爆破员", "blasterName"},
-        {"井下地址", "addressUuid"},
-        {"雷管数量", "detSum"},
-        {"起爆器数量", "blastCount"},
-        {"起爆状态", "blastStatus"},
-        {"操作",""},
+        {"工程名称", "name"},        {"操作员", "operatorName"},
+        {"爆破员", "blasterName"},   {"井下地址", "addressUuid"},
+        {"雷管数量", "detSum"},      {"起爆器数量", "blastCount"},
+        {"起爆状态", "blastStatus"}, {"操作", ""},
     };
 
     int headerCount = headers.size();
@@ -88,13 +77,14 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize)
     model->setHorizontalHeaderLabels(headerLabels);
 
     for (int row = 0; row < projectList.size(); ++row) {
-        HProject& HProject = *projectList.at(row).data();
+        HProject &HProject = *projectList.at(row).data();
         for (int col = 0; col < headers.size(); ++col) {
             QString prop = propMap[col];
-            QStandardItem* item = nullptr;
+            QStandardItem *item = nullptr;
 
             if (!prop.isEmpty()) {
-                QMetaProperty metaProp = HProject.metaObject()->property(HProject.metaObject()->indexOfProperty(prop.toUtf8()));
+                QMetaProperty metaProp = HProject.metaObject()->property(
+                    HProject.metaObject()->indexOfProperty(prop.toUtf8()));
                 QVariant value = metaProp.read(&HProject);
                 if (prop == "blastStatus") {
                     QString statusText;
@@ -131,26 +121,24 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize)
     ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
     ui->tableView->setAlternatingRowColors(true);
     // 创建并设置自定义委托
-    ButtonDelegate *delegate = new ButtonDelegate(headerCount-1,this);
+    ButtonDelegate *delegate = new ButtonDelegate(headerCount - 1, this);
     QObject::connect(delegate, &ButtonDelegate::buttonClicked, [=](int row, int column) {
         // 获取 HPlan 引用
-        HProject& HPlanDeleteOrUpdate = *projectList.at(row).data();
+        HProject &HPlanDeleteOrUpdate = *projectList.at(row).data();
         updateId = HPlanDeleteOrUpdate.getId();
-        if(column == 1){
+        if (column == 1) {
             deleteButtonClicked(HPlanDeleteOrUpdate);
         }
-        if(column == 2){
+        if (column == 2) {
             updateButtonClicked(HPlanDeleteOrUpdate);
         }
     });
-    ui->tableView->setItemDelegateForColumn(headerCount-1, delegate);
+    ui->tableView->setItemDelegateForColumn(headerCount - 1, delegate);
 }
 
-
-void BlastProjectPage::PageChanged(int page)
-{
+void BlastProjectPage::PageChanged(int page) {
     currentPage = page;
-    loadDataFromSource(currentPage,pageSize);
+    loadDataFromSource(currentPage, pageSize);
 }
 
 void BlastProjectPage::onComboBoxIndexChanged(int index) {
@@ -158,13 +146,10 @@ void BlastProjectPage::onComboBoxIndexChanged(int index) {
     int value = variant.toInt();
     pageSize = value;
     currentPage = 1;
-    loadDataFromSource(currentPage,pageSize);
-
+    loadDataFromSource(currentPage, pageSize);
 }
 
-
-void BlastProjectPage::personOptionsByType(const QJsonDocument &jsonDoc)
-{
+void BlastProjectPage::personOptionsByType(const QJsonDocument &jsonDoc) {
     parseJsonString(jsonDoc);
     QJsonArray bapoYuanArray;
     QJsonArray anQuanYuanArray;
@@ -186,9 +171,7 @@ void BlastProjectPage::personOptionsByType(const QJsonDocument &jsonDoc)
     dialog->SetComboBoxOperator(anQuanYuanArray);
 }
 
-
-void BlastProjectPage::addressOptions(const QJsonDocument &jsonDoc)
-{
+void BlastProjectPage::addressOptions(const QJsonDocument &jsonDoc) {
     parseJsonStringAddress(jsonDoc);
     QJsonArray parentOptions;
     for (const QJsonValue &item : dataArrayAddress) {
@@ -196,12 +179,11 @@ void BlastProjectPage::addressOptions(const QJsonDocument &jsonDoc)
     }
     dialog->SetComboBoxAddress(parentOptions);
     dialog->setChildOptions(dataArrayAddress);
-
 }
 
 // 递归函数,用于提取所有的 name 信息
-void BlastProjectPage::extractNames(const QJsonArray& array, QStringList& names) {
-    for (const auto& item : array) {
+void BlastProjectPage::extractNames(const QJsonArray &array, QStringList &names) {
+    for (const auto &item : array) {
         if (item.isObject()) {
             QJsonObject obj = item.toObject();
             if (obj.contains("name")) {
@@ -214,34 +196,24 @@ void BlastProjectPage::extractNames(const QJsonArray& array, QStringList& names)
     }
 }
 
-
-void BlastProjectPage::parseJsonString(const QJsonDocument &jsonDoc)
-{
+void BlastProjectPage::parseJsonString(const QJsonDocument &jsonDoc) {
     QJsonObject jsonObj = jsonDoc.object();
     QJsonObject dataObj = jsonObj["data"].toObject();
     dataArray = dataObj["list"].toArray();
 }
 
-void BlastProjectPage::parseJsonStringAddress(const QJsonDocument &jsonDoc)
-{
+void BlastProjectPage::parseJsonStringAddress(const QJsonDocument &jsonDoc) {
     QJsonObject jsonObj = jsonDoc.object();
     dataArrayAddress = jsonObj["data"].toArray();
-
 }
-void BlastProjectPage::on_pushButton_clicked()
-{
-
+void BlastProjectPage::on_pushButton_clicked() {
     dialog->setModal(false);
     dialog->setOperationStatus(0);
     int ref = dialog->exec();
-    if (ref==QDialog::Accepted){
-
-    };
-
+    if (ref == QDialog::Accepted) {};
 }
 
-void BlastProjectPage::insertPlan(const QMap<QString, QString> &data)
-{
+void BlastProjectPage::insertPlan(const QMap<QString, QString> &data) {
     HProject project;
     project.setName(data.value("name"));
     project.setDetSum(data.value("detNum"));
@@ -255,14 +227,15 @@ void BlastProjectPage::insertPlan(const QMap<QString, QString> &data)
     project.setBlastCount(data.value("blastCount"));
     project.setBlastStatus("1");
     // 生成 32 位的 UUID
-    QString uuidString = QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-"));
+    QString uuidString =
+        QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-"));
     project.setUuid(uuidString);
     project.setCreatedAt(QDateTime::currentDateTime());
-    if(dao.addHProject(project)){
+    if (dao.addHProject(project)) {
         RefreshData();
         QJsonArray jsonArray;
         QList<QSharedPointer<HProject>> projectsReg = dao.getAllHProjectsReg();
-        for (const auto& projectPtr : projectsReg) {
+        for (const auto &projectPtr : projectsReg) {
             if (projectPtr) {
                 QByteArray projectJson = projectPtr->ProjectToJson(*projectPtr);
                 QJsonDocument doc = QJsonDocument::fromJson(projectJson);
@@ -274,23 +247,19 @@ 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;
+        qDebug() << "mqtt单例:" << mqttClient;
     }
-
 }
 
-void BlastProjectPage::updateButtonClicked(const HProject &project){
+void BlastProjectPage::updateButtonClicked(const HProject &project) {
     dialog->setModal(false);
     dialog->setOperationStatus(1);
     dialog->setFormData(project);
     int ref = dialog->exec();
-    if (ref==QDialog::Accepted){
-
-    };
-
+    if (ref == QDialog::Accepted) {};
 }
 
-void BlastProjectPage::updateProject(const QMap<QString, QString> &data){
+void BlastProjectPage::updateProject(const QMap<QString, QString> &data) {
     HProject project;
     project.setId(updateId);
     project.setName(data.value("name"));
@@ -301,27 +270,22 @@ void BlastProjectPage::updateProject(const QMap<QString, QString> &data){
     project.setBlasterIdentity(data.value("blasterIdentity"));
     project.setOperatorIdentity(data.value("operatorIdentity"));
     project.setUpdatedAt(QDateTime::currentDateTime());
-    if(dao.updateHProject(project)){
+    if (dao.updateHProject(project)) {
         RefreshData();
     }
-
-
-
 }
-void BlastProjectPage::deleteButtonClicked(const HProject &project){
-
-    if(dao.deleteHProject(project)){
+void BlastProjectPage::deleteButtonClicked(const HProject &project) {
+    if (dao.deleteHProject(project)) {
         RefreshData();
     }
-
 }
 
-
-void BlastProjectPage::messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic){
+void BlastProjectPage::messageAndTopicReceived(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")) {
+        if (jsonObj.contains("uuid") && jsonObj.contains("status")) {
             QJsonValue uuidValue = jsonObj["uuid"];
             QJsonValue statusValue = jsonObj["status"];
             if (statusValue.isString() && statusValue.toString() == "1") {
@@ -334,18 +298,8 @@ void BlastProjectPage::messageAndTopicReceived(const QByteArray &message, const
             }
         }
     }
-
-}
-
-
-void BlastProjectPage::updateProjectUUId(QString uuid){
-    dao.updateBlastStatusByUuid(uuid,"2");
-
-}
-
-BlastProjectPage::~BlastProjectPage()
-{
-    delete ui;
 }
 
+void BlastProjectPage::updateProjectUUId(QString uuid) { dao.updateBlastStatusByUuid(uuid, "2"); }
 
+BlastProjectPage::~BlastProjectPage() { delete ui; }

File diff suppressed because it is too large
+ 304 - 397
blastopepage.cpp


+ 40 - 40
blastopepage.h

@@ -1,56 +1,54 @@
 #ifndef BLASTOPEPAGE_H
 #define BLASTOPEPAGE_H
 
-#include <QWidget>
-#include <QPushButton>
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
 #include <QLayout>
-#include <QWebEnginePage>
+#include <QMessageBox>
 #include <QNetworkAccessManager>
 #include <QNetworkReply>
-#include <QWebEngineView>
-#include <QJsonObject>
-#include <QJsonDocument>
-#include <QJsonArray>
-#include <QMessageBox>
 #include <QProgressBar>
-#include <QLayout>
-#include <QStandardItemModel>
+#include <QPushButton>
 #include <QSet>
+#include <QStandardItemModel>
+#include <QWebEnginePage>
+#include <QWebEngineView>
+#include <QWidget>
+
+#include "./serial/serialtool.h"
 #include "PageWidget.h"
-#include "hprojectdao.h"
-#include "fireWidget/firingwidget.h"  // 包含 firingWidget 头文件
 #include "countdownwidget.h"
-#include "./serial/serialtool.h"
+#include "fireWidget/firingwidget.h"  // 包含 firingWidget 头文件
+#include "hprojectdao.h"
 
 // 自定义结构体
 struct ProgressBarTriple {
-    QProgressBar* bar1;
-    QProgressBar* bar2;
-    QProgressBar* bar3;
-
+    QProgressBar *bar1;
+    QProgressBar *bar2;
+    QProgressBar *bar3;
 
     // 构造函数
-    ProgressBarTriple(QProgressBar* b1, QProgressBar* b2, QProgressBar* b3)
+    ProgressBarTriple(QProgressBar *b1, QProgressBar *b2, QProgressBar *b3)
         : bar1(b1), bar2(b2), bar3(b3) {}
 };
 namespace Ui {
 class BlastOpePage;
 }
 
-class BlastOpePage : public QWidget
-{
+class BlastOpePage : public QWidget {
     Q_OBJECT
 
-public:
+   public:
     explicit BlastOpePage(QWidget *parent = nullptr);
     ~BlastOpePage();
-private slots:
+   private slots:
     void PageChanged(int page);
     void onComboBoxIndexChanged(int index);
-    void updateProgressBar(int value,int row);
-    void onUpdateBlastStatus(int status,int row);
+    void updateProgressBar(int value, int row);
+    void onUpdateBlastStatus(int status, int row);
     void changeButByMqtt(int status, int row);
-    void showDownWidget(QString uuid,const QString &topic,const QString &message);
+    void showDownWidget(QString uuid, const QString &topic, const QString &message);
     void updateProject(QString uuid);
     void destroyFiringWidget(const QString &uuid);
     void on_btnSelect_clicked();
@@ -59,10 +57,12 @@ private slots:
     void showDownWidgetSelect();
     void selectBlasting();
     void destroyFiringWidgetSelect(const QString &uuid);
-private:
-    void handleFeaturePermission(QWebEnginePage *page, const QUrl &securityOrigin, QWebEnginePage::Feature feature);
+
+   private:
+    void handleFeaturePermission(QWebEnginePage *page, const QUrl &securityOrigin,
+                                 QWebEnginePage::Feature feature);
     void RefreshData();
-    void loadDataFromSource(int currentPage,int pageSize);
+    void loadDataFromSource(int currentPage, int pageSize);
     void InitFace();
     void closeWebViewAndRestoreUI();
     void parseJsonString(const QJsonDocument &jsonDoc);
@@ -70,31 +70,31 @@ private:
     void initPagination();
     QJsonObject sendPostRequest(const QUrl &url, const QJsonObject &data);
     QJsonObject getMetaInfo();
-    void handleButtonClick(int row,QPushButton *button);
+    void handleButtonClick(int row, QPushButton *button);
     bool checkUuidsSame();
 
-
-private:
+   private:
     Ui::BlastOpePage *ui;
     QList<HeaderInfo> headers;
     QStandardItemModel *model;
-    QMap<QString, firingWidget*> uuidWidgetMap;
+    QMap<QString, firingWidget *> uuidWidgetMap;
     QWebEngineView *view;
     QVBoxLayout *layout;
     QString certifyId;
     PageWidget *pageWidget;
     QJsonArray dataArray;
     HProjectDao dao;
-    QVector<ProgressBarTriple> progressBars; // 用于保存每行的两个进度条指针
-    QMap<int, QString> uuidMap; // 用于存储行号和对应的 uuid
-    QMap<QString, firingWidget*> uuidWidgetSMap;
-    SerialTool* serialTool;
+    QVector<ProgressBarTriple> progressBars;  // 用于保存每行的两个进度条指针
+    QMap<int, QString> uuidMap;               // 用于存储行号和对应的 uuid
+    QMap<QString, firingWidget *> uuidWidgetSMap;
+    SerialTool *serialTool;
     QSet<QString> selectedUuids;
     QMetaObject::Connection connectionItem;
-    int pageSize;  //每页显示的记录数量
-    int currentPage;      //当前页面
+    int pageSize;     // 每页显示的记录数量
+    int currentPage;  // 当前页面
     int totalCount;
-
+    QString stopButtonTxt = "中止起爆流程";
+    QString startButtonTxt = "开启起爆流程";
 };
 
-#endif // BLASTOPEPAGE_H
+#endif  // BLASTOPEPAGE_H

+ 69 - 96
blastprojectpage.cpp

@@ -1,65 +1,61 @@
 #include "blastprojectpage.h"
-#include "ui_blastprojectpage.h"
-#include <iostream>
-#include "global.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())
-{
+BlastProjectPage::BlastProjectPage(QWidget *parent)
+    : QWidget(parent),
+      ui(new Ui::BlastProjectPage),
+      dao(DatabaseManager::getInstance().getDatabase()) {
     ui->setupUi(this);
-    pageWidget= new PageWidget;
+    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);;
+    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 = g_url.resolved(localUrl);
+    QUrl fullUrl = apiBackendUrl.resolved(localUrl);
     m_httpClient->sendHttpGetRequest(fullUrl);
 
     QUrl addressLocalUrl("h-address/pc");
-    QUrl addressFullUrl = g_url.resolved(addressLocalUrl);
+    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;
-    });
-
+    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::RefreshData()
-{
-
-    loadDataFromSource(currentPage,pageSize);
-
-}
-
-void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize)
-{
-    PaginatedHProjectResult result =dao.getAllHProjects(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));
+    pageWidget->setMaxPage(ceil(static_cast<double>(totalCount) / pageSize));
     QStandardItemModel *model;
     model = new QStandardItemModel(this);
 
@@ -71,13 +67,13 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize)
         {"井下地址", "addressUuid"},
         {"雷管数量", "detSum"},
         {"起爆状态", "blastStatus"},
-        {"操作",""},
+        {"操作", ""},
     };
     // 获取表头的长度
     int headerCount = headers.size();
     // 设置表头
     QStringList headerLabels;
-    QMap<int, QString> propMap; // 用于存储表头的 prop 属性
+    QMap<int, QString> propMap;  // 用于存储表头的 prop 属性
     for (int i = 0; i < headers.size(); ++i) {
         headerLabels << headers[i].label;
         propMap[i] = headers[i].prop;
@@ -85,14 +81,15 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize)
     model->setHorizontalHeaderLabels(headerLabels);
     // // 填充数据
     for (int row = 0; row < projectList.size(); ++row) {
-        HProject& HProject = *projectList.at(row).data();
+        HProject &HProject = *projectList.at(row).data();
         for (int col = 0; col < headers.size(); ++col) {
             QString prop = propMap[col];
-            QStandardItem* item = nullptr;
+            QStandardItem *item = nullptr;
 
             // 根据 prop 获取 SysApi 对象的属性值
             if (!prop.isEmpty()) {
-                QMetaProperty metaProp = HProject.metaObject()->property(HProject.metaObject()->indexOfProperty(prop.toUtf8()));
+                QMetaProperty metaProp = HProject.metaObject()->property(
+                    HProject.metaObject()->indexOfProperty(prop.toUtf8()));
                 QVariant value = metaProp.read(&HProject);
                 item = new QStandardItem(value.toString());
             } else {
@@ -109,35 +106,34 @@ void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize)
     ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
 
     // 创建并设置自定义委托
-    ButtonDelegate *delegate = new ButtonDelegate(headerCount-1,this);
+    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();
+        HProject &HPlanDeleteOrUpdate = *projectList.at(row).data();
         updateId = HPlanDeleteOrUpdate.getId();
-        if(column == 1){
+        if (column == 1) {
             deleteButtonClicked(HPlanDeleteOrUpdate);
         }
-        if(column == 2){
+        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();
+            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);
+    ui->tableView->setItemDelegateForColumn(headerCount - 1, delegate);
 }
 
 // 切换页数
-void BlastProjectPage::PageChanged(int page)
-{
+void BlastProjectPage::PageChanged(int page) {
     currentPage = page;
-    loadDataFromSource(currentPage,pageSize);
+    loadDataFromSource(currentPage, pageSize);
 }
 
 void BlastProjectPage::onComboBoxIndexChanged(int index) {
@@ -146,13 +142,10 @@ void BlastProjectPage::onComboBoxIndexChanged(int index) {
     int value = variant.toInt();
     pageSize = value;
     currentPage = 1;
-    loadDataFromSource(currentPage,pageSize);
-
+    loadDataFromSource(currentPage, pageSize);
 }
 
-
-void BlastProjectPage::personOptionsByType(const QJsonDocument &jsonDoc)
-{
+void BlastProjectPage::personOptionsByType(const QJsonDocument &jsonDoc) {
     parseJsonString(jsonDoc);
     // 定义两个新的 QJsonArray 用于存储分组后的数据
     QJsonArray bapoYuanArray;
@@ -178,9 +171,7 @@ void BlastProjectPage::personOptionsByType(const QJsonDocument &jsonDoc)
     dialog->SetComboBoxOperator(anQuanYuanArray);
 }
 
-
-void BlastProjectPage::addressOptions(const QJsonDocument &jsonDoc)
-{
+void BlastProjectPage::addressOptions(const QJsonDocument &jsonDoc) {
     parseJsonStringAddress(jsonDoc);
     QJsonArray parentOptions;
     for (const QJsonValue &item : dataArrayAddress) {
@@ -191,35 +182,28 @@ void BlastProjectPage::addressOptions(const QJsonDocument &jsonDoc)
     // qDebug()<<"parentOptions data"<<parentOptions;
 }
 
-void BlastProjectPage::parseJsonString(const QJsonDocument &jsonDoc)
-{
+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)
-{
+void BlastProjectPage::parseJsonStringAddress(const QJsonDocument &jsonDoc) {
     QJsonObject jsonObj = jsonDoc.object();
     dataArrayAddress = jsonObj["data"].toArray();
     // qDebug()<<"Row data"<<dataArrayAddress;
-
 }
-void BlastProjectPage::on_pushButton_clicked()
-{
-
+void BlastProjectPage::on_pushButton_clicked() {
     dialog->setModal(false);
     dialog->setOperationStatus(0);
     int ref = dialog->exec();
-    if (ref==QDialog::Accepted){
-        qDebug()<<"新增对话框关闭";
+    if (ref == QDialog::Accepted) {
+        qDebug() << "新增对话框关闭";
     };
-
 }
 
-void BlastProjectPage::insertPlan(const QMap<QString, QString> &data)
-{
+void BlastProjectPage::insertPlan(const QMap<QString, QString> &data) {
     qDebug() << "Inserting project *****************:";
 
     HProject project;
@@ -231,41 +215,40 @@ void BlastProjectPage::insertPlan(const QMap<QString, QString> &data)
     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)){
+    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();
+        MqttClient *client = MqttClient::getInstance();
 
         // 将 project 对象转换为 JSON
-        QByteArray jsonData  = project.ProjectToJson(project);
+        QByteArray jsonData = project.ProjectToJson(project);
 
         qDebug() << "JSON from HProject: " << jsonData;
 
         // 发送消息到 testtopic
         client->sendMessage("testtopic", jsonData);
-
     }
-
 }
 
-void BlastProjectPage::updateButtonClicked(const HProject &project){
+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";
+    if (ref == QDialog::Accepted) {
+        qDebug() << "aaa";
     };
-
 }
 
-void BlastProjectPage::updateProject(const QMap<QString, QString> &data){
+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;
+    qDebug() << "updateProject  with detNum:" << detNum << "name:" << name
+             << "operaName:" << operaName;
     HProject project;
     project.setId(updateId);
     project.setName(data.value("name"));
@@ -275,25 +258,15 @@ void BlastProjectPage::updateProject(const QMap<QString, QString> &data){
     project.setAddressUuid(data.value("addressUuid"));
     project.setBlasterIdentity(data.value("blasterIdentity"));
     project.setOperatorIdentity(data.value("operatorIdentity"));
-    if(dao.updateHProject(project)){
+    if (dao.updateHProject(project)) {
         qDebug() << "updateHProject";
         RefreshData();
     }
-
-
-
 }
-void BlastProjectPage::deleteButtonClicked(const HProject &project){
-
-    if(dao.deleteHProject(project)){
+void BlastProjectPage::deleteButtonClicked(const HProject &project) {
+    if (dao.deleteHProject(project)) {
         RefreshData();
     }
-
-}
-
-BlastProjectPage::~BlastProjectPage()
-{
-    delete ui;
 }
 
-
+BlastProjectPage::~BlastProjectPage() { delete ui; }

+ 16 - 9
databasemanager.cpp

@@ -1,6 +1,10 @@
 #include "databasemanager.h"
-#include <QSqlError>
+
 #include <QDebug>
+#include <QMessageBox>
+#include <QSqlError>
+
+#include "global.h"
 #include "logger.h"
 
 DatabaseManager& DatabaseManager::getInstance() {
@@ -10,17 +14,22 @@ DatabaseManager& DatabaseManager::getInstance() {
 
 // 创建一个新的数据库连接
 DatabaseManager::DatabaseManager() : db(QSqlDatabase::addDatabase("QMYSQL")) {
-    QString host("127.0.0.1");
-    db.setHostName(host);
+    db.setHostName(databaseHost);
     db.setDatabaseName("pc_system");
     db.setUserName("root");
     db.setPassword("123456");
 
     if (!db.open()) {
-        qDebug() << "Failed to open database: " << db.lastError().text();
-    }
-    Logger::getInstance().info(QString("Mysql Connected. host: %1").arg(host));
+        Logger::getInstance().error(QString("Mysql Connected error. host: %1, error: %2")
+                                        .arg(databaseHost, db.lastError().text()));
+        QMessageBox::critical(
+            nullptr, "错误",
+            QString("无法连接数据库, 请联系开发人员。\n 错误: %1").arg(db.lastError().text()));
 
+        throw std::runtime_error("Database connection failed: " +
+                                 db.lastError().text().toStdString());
+    }
+    Logger::getInstance().info(QString("Mysql Connected. host: %1").arg(databaseHost));
 }
 
 DatabaseManager::~DatabaseManager() {
@@ -29,6 +38,4 @@ DatabaseManager::~DatabaseManager() {
     }
 }
 
-QSqlDatabase& DatabaseManager::getDatabase() {
-    return db;
-}
+QSqlDatabase& DatabaseManager::getDatabase() { return db; }

+ 5 - 6
databasemanager.h

@@ -2,13 +2,12 @@
 #define DATABASEMANAGER_H
 #include <QSqlDatabase>
 
-
-class DatabaseManager
-{
-public:
+class DatabaseManager {
+   public:
     static DatabaseManager& getInstance();
     QSqlDatabase& getDatabase();
-private:
+
+   private:
     DatabaseManager();
     ~DatabaseManager();
     DatabaseManager(const DatabaseManager&) = delete;
@@ -16,4 +15,4 @@ private:
     QSqlDatabase db;
 };
 
-#endif // DATABASEMANAGER_H
+#endif  // DATABASEMANAGER_H

+ 58 - 83
detInfo/detinfopage.cpp

@@ -1,30 +1,24 @@
 #include "detinfopage.h"
-#include "ui_detinfopage.h"
+
 #include <QTimer>
 
-DetInfoPage::DetInfoPage(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::DetInfoPage)
-{
+#include "ui_detinfopage.h"
+
+DetInfoPage::DetInfoPage(QWidget* parent) : QWidget(parent), ui(new Ui::DetInfoPage) {
     ui->setupUi(this);
     m_pPageWidget = new PageWidget;
     connect(m_pPageWidget, &PageWidget::currentPageChanged, this, &DetInfoPage::PageChanged);
-    connect(m_pPageWidget->getComboBox(), QOverload<int>::of(&QComboBox::currentIndexChanged), this, &DetInfoPage::onComboBoxIndexChanged);
+    connect(m_pPageWidget->getComboBox(), QOverload<int>::of(&QComboBox::currentIndexChanged), this,
+            &DetInfoPage::onComboBoxIndexChanged);
     m_httpClient = new HttpClient(this);
     pageSize = 10;
     currentPage = 1;
     ui->verticalLayout_4->addWidget(m_pPageWidget);
     loadAndRefreshData();
-
-
-}
-void DetInfoPage::loadAndRefreshData() {
-
-    loadDataFromSource(currentPage,pageSize);
 }
+void DetInfoPage::loadAndRefreshData() { loadDataFromSource(currentPage, pageSize); }
 
-void DetInfoPage::loadDataFromSource(int currentPage,int pageSize,const QString& equipmentSn)
-{
+void DetInfoPage::loadDataFromSource(int currentPage, int pageSize, const QString& equipmentSn) {
     QUrl localUrl("projectdet/pc");
     QUrlQuery query;
 
@@ -34,34 +28,29 @@ void DetInfoPage::loadDataFromSource(int currentPage,int pageSize,const QString&
         query.addQueryItem("equipmentSn", equipmentSn);
     }
     localUrl.setQuery(query);
-    QUrl fullUrl = g_url.resolved(localUrl);
+    QUrl fullUrl = apiBackendUrl.resolved(localUrl);
     m_httpClient->sendHttpGetRequest(fullUrl);
-    connect(m_httpClient, &HttpClient::httpGetFinished, [this](const QJsonDocument &data) {
-        this->dataTable(data);
-    });
+    connect(m_httpClient, &HttpClient::httpGetFinished,
+            [this](const QJsonDocument& data) { this->dataTable(data); });
 }
 
-void DetInfoPage::PageChanged(int page)
-{
+void DetInfoPage::PageChanged(int page) {
     currentPage = page;
-    loadDataFromSource(currentPage,pageSize);
+    loadDataFromSource(currentPage, pageSize);
 }
 
-
 void DetInfoPage::onComboBoxIndexChanged(int index) {
-     QVariant variant = m_pPageWidget->getComboBox()->itemData(index);
-     int value = variant.toInt();
-     pageSize = value;
-    loadDataFromSource(currentPage,pageSize);
-
+    QVariant variant = m_pPageWidget->getComboBox()->itemData(index);
+    int value = variant.toInt();
+    pageSize = value;
+    loadDataFromSource(currentPage, pageSize);
 }
 
-
-void DetInfoPage::dataTable(const QJsonDocument &jsonDoc)
-{
+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);
@@ -71,79 +60,67 @@ void DetInfoPage::dataTable(const QJsonDocument &jsonDoc)
     ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
     ui->tableView->setAlternatingRowColors(true);
 }
-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());
-
-      QString yxqStr = jsonObj["yxq"].toString();
-      QDateTime yxq = QDateTime::fromString(yxqStr, Qt::ISODateWithMs);
-      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*>() << nameItem << equipItem <<fbhItem<<uidItem<<gzmItem<<yxqItem<<isUseItem<<createdItem;
-
+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());
+
+    QString yxqStr = jsonObj["yxq"].toString();
+    QDateTime yxq = QDateTime::fromString(yxqStr, Qt::ISODateWithMs);
+    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*>() << nameItem << equipItem << fbhItem << uidItem << gzmItem
+                                   << yxqItem << isUseItem << createdItem;
 }
 
-
-void DetInfoPage::parseJsonString(const QJsonDocument &jsonDoc)
-{
+void DetInfoPage::parseJsonString(const QJsonDocument& jsonDoc) {
     QJsonObject jsonObj = jsonDoc.object();
     QJsonObject dataObj = jsonObj["data"].toObject();
     dataArray = dataObj["list"].toArray();
     totalCount = dataObj["count"].toInt();
-    m_pPageWidget->setMaxPage(ceil(static_cast<double>(totalCount)/pageSize));
+    m_pPageWidget->setMaxPage(ceil(static_cast<double>(totalCount) / pageSize));
 }
 
+DetInfoPage::~DetInfoPage() { delete ui; }
 
-
-DetInfoPage::~DetInfoPage()
-{
-    delete ui;
-}
-
-void DetInfoPage::on_pushButton_clicked()
-{
+void DetInfoPage::on_pushButton_clicked() {
     dialog = new DetDialog;
     dialog->setModal(false);
     connect(dialog, &DetDialog::validateDetNum, this, &DetInfoPage::insertDet);
     int ref = dialog->exec();
-    if (ref==QDialog::Accepted){
-
-    };
+    if (ref == QDialog::Accepted) {};
 }
 
-void DetInfoPage::insertDet(const QJsonDocument &jsonDoc){
+void DetInfoPage::insertDet(const QJsonDocument& jsonDoc) {
     QNetworkAccessManager manager;
     QUrl localUrl("det");
-    QUrl fullUrl = g_url.resolved(localUrl);
-    qDebug()<<"-----insert Det"<<fullUrl;
+    QUrl fullUrl = apiBackendUrl.resolved(localUrl);
+    qDebug() << "-----insert Det" << fullUrl;
     QUrlQuery query;
     if (!jsonDoc.isNull() && jsonDoc.isObject()) {
-           QJsonObject obj = jsonDoc.object();
-           for (const QString &key : obj.keys()) {
-               QJsonValue value = obj.value(key);
-               if (value.isString()) {
-                   query.addQueryItem(key, value.toString());
-               }
-           }
-       }
+        QJsonObject obj = jsonDoc.object();
+        for (const QString& key : obj.keys()) {
+            QJsonValue value = obj.value(key);
+            if (value.isString()) {
+                query.addQueryItem(key, value.toString());
+            }
+        }
+    }
 
     fullUrl.setQuery(query);
     QNetworkRequest request(fullUrl);
 
-    request.setRawHeader("Authorization",globalAuthority.toUtf8());
-    QNetworkReply *reply = manager.get(request);
+    request.setRawHeader("Authorization", globalAuthority.toUtf8());
+    QNetworkReply* reply = manager.get(request);
     // 使用事件循环等待请求完成
     QEventLoop loop;
     QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
@@ -161,6 +138,4 @@ void DetInfoPage::insertDet(const QJsonDocument &jsonDoc){
     }
     // 释放资源
     reply->deleteLater();
-
 }
-

+ 36 - 59
equipment/equipmentpage.cpp

@@ -1,15 +1,14 @@
 #include "equipmentpage.h"
-#include "ui_equipmentpage.h"
+
 #include "../global.h"
+#include "ui_equipmentpage.h"
 
-EquipmentPage::EquipmentPage(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::EquipmentPage)
-{
+EquipmentPage::EquipmentPage(QWidget* parent) : QWidget(parent), ui(new Ui::EquipmentPage) {
     ui->setupUi(this);
     m_pPageWidget = new PageWidget;
     connect(m_pPageWidget, &PageWidget::currentPageChanged, this, &EquipmentPage::PageChanged);
-    connect(m_pPageWidget->getComboBox(), QOverload<int>::of(&QComboBox::currentIndexChanged), this, &EquipmentPage::onComboBoxIndexChanged);
+    connect(m_pPageWidget->getComboBox(), QOverload<int>::of(&QComboBox::currentIndexChanged), this,
+            &EquipmentPage::onComboBoxIndexChanged);
     m_httpClient = new HttpClient(this);
     pageSize = 10;
     currentPage = 1;
@@ -17,22 +16,14 @@ EquipmentPage::EquipmentPage(QWidget *parent) :
     loadAndRefreshData();
 }
 
-
-
-
-void EquipmentPage::on_btnSearch_clicked()
-{
+void EquipmentPage::on_btnSearch_clicked() {
     QString equipmentSn = ui->editSn->text();
     loadDataFromSource(currentPage, pageSize, equipmentSn);
 }
 
+void EquipmentPage::loadAndRefreshData() { loadDataFromSource(currentPage, pageSize); }
 
-void EquipmentPage::loadAndRefreshData() {
-    loadDataFromSource(currentPage,pageSize);
-}
-
-void EquipmentPage::loadDataFromSource(int currentPage,int pageSize,const QString& equipmentSn)
-{
+void EquipmentPage::loadDataFromSource(int currentPage, int pageSize, const QString& equipmentSn) {
     QUrl localUrl("equipment/pc");
 
     QUrlQuery query;
@@ -42,36 +33,31 @@ void EquipmentPage::loadDataFromSource(int currentPage,int pageSize,const QStrin
         query.addQueryItem("equipmentSn", equipmentSn);
     }
     localUrl.setQuery(query);
-    QUrl fullUrl = g_url.resolved(localUrl);
+    QUrl fullUrl = apiBackendUrl.resolved(localUrl);
     m_httpClient->sendHttpGetRequest(fullUrl);
 
-    connect(m_httpClient, &HttpClient::httpGetFinished, [this](const QJsonDocument &data) {
+    connect(m_httpClient, &HttpClient::httpGetFinished, [this](const QJsonDocument& data) {
         this->dataTable(data);
-
     });
 }
 
-void EquipmentPage::PageChanged(int page)
-{
+void EquipmentPage::PageChanged(int page) {
     currentPage = page;
-    loadDataFromSource(currentPage,pageSize);
+    loadDataFromSource(currentPage, pageSize);
 }
 
-
 void EquipmentPage::onComboBoxIndexChanged(int index) {
-     QVariant variant = m_pPageWidget->getComboBox()->itemData(index);
-     int value = variant.toInt();
-     pageSize = value;
-    loadDataFromSource(currentPage,pageSize);
-
+    QVariant variant = m_pPageWidget->getComboBox()->itemData(index);
+    int value = variant.toInt();
+    pageSize = value;
+    loadDataFromSource(currentPage, pageSize);
 }
 
-
-void EquipmentPage::dataTable(const QJsonDocument &jsonDoc)
-{
+void EquipmentPage::dataTable(const QJsonDocument& jsonDoc) {
     parseJsonString(jsonDoc);
     model = new QStandardItemModel(this);
-    model->setHorizontalHeaderLabels({"名称", "设备编号", "设备类型","设备状态","在线状态","创建时间"});
+    model->setHorizontalHeaderLabels(
+        {"名称", "设备编号", "设备类型", "设备状态", "在线状态", "创建时间"});
 
     for (const QJsonValue& jsonValue : dataArray) {
         QJsonObject jsonObj = jsonValue.toObject();
@@ -82,39 +68,30 @@ void EquipmentPage::dataTable(const QJsonDocument &jsonDoc)
     ui->tableView->setModel(model);
     ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
     ui->tableView->setAlternatingRowColors(true);
-
 }
 
-QList<QStandardItem *> EquipmentPage::jsonToItem(const QJsonObject &jsonObj)
-{
-
-      QStandardItem* nameItem = new QStandardItem(jsonObj["name"].toString());
-      nameItem->setTextAlignment(Qt::AlignCenter);
-      QStandardItem* equipItem = new QStandardItem(jsonObj["equipmentSn"].toString());
-      QStandardItem* typeItem = new QStandardItem(jsonObj["equipmentTypeName"].toString());
-      QStandardItem* statusItem = new QStandardItem(jsonObj["statusName"].toString());
-      QStandardItem* onlineItem = new QStandardItem(jsonObj["onlineName"].toString());
-      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*>() << nameItem << equipItem << typeItem<<statusItem<<onlineItem<<createdItem;
-
+QList<QStandardItem*> EquipmentPage::jsonToItem(const QJsonObject& jsonObj) {
+    QStandardItem* nameItem = new QStandardItem(jsonObj["name"].toString());
+    nameItem->setTextAlignment(Qt::AlignCenter);
+    QStandardItem* equipItem = new QStandardItem(jsonObj["equipmentSn"].toString());
+    QStandardItem* typeItem = new QStandardItem(jsonObj["equipmentTypeName"].toString());
+    QStandardItem* statusItem = new QStandardItem(jsonObj["statusName"].toString());
+    QStandardItem* onlineItem = new QStandardItem(jsonObj["onlineName"].toString());
+    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*>()
+           << nameItem << equipItem << typeItem << statusItem << onlineItem << createdItem;
 }
 
-
-void EquipmentPage::parseJsonString(const QJsonDocument &jsonDoc)
-{
+void EquipmentPage::parseJsonString(const QJsonDocument& jsonDoc) {
     QJsonObject jsonObj = jsonDoc.object();
     QJsonObject dataObj = jsonObj["data"].toObject();
     dataArray = dataObj["list"].toArray();
     totalCount = dataObj["count"].toInt();
-    m_pPageWidget->setMaxPage(ceil(static_cast<double>(totalCount)/pageSize));
+    m_pPageWidget->setMaxPage(ceil(static_cast<double>(totalCount) / pageSize));
 }
 
-
-EquipmentPage::~EquipmentPage()
-{
-    delete ui;
-}
+EquipmentPage::~EquipmentPage() { delete ui; }

+ 4 - 5
equipmentpage.h

@@ -7,16 +7,15 @@ namespace Ui {
 class EquipmentPage;
 }
 
-class EquipmentPage : public QWidget
-{
+class EquipmentPage : public QWidget {
     Q_OBJECT
 
-public:
+   public:
     explicit EquipmentPage(QWidget *parent = nullptr);
     ~EquipmentPage();
 
-private:
+   private:
     Ui::EquipmentPage *ui;
 };
 
-#endif // EQUIPMENTPAGE_H
+#endif  // EQUIPMENTPAGE_H

+ 227 - 322
fireWidget/firingwidget.cpp

@@ -1,40 +1,42 @@
 #include "firingwidget.h"
-#include "ui_firingwidget.h"
-#include "../countdownwidget.h"
-#include <QNetworkAccessManager>
-#include <QNetworkRequest>
-#include <QNetworkReply>
-#include <QUrl>
-#include <QUrlQuery>
+
+#include <QDebug>
+#include <QJsonArray>
 #include <QJsonDocument>
 #include <QJsonObject>
-#include <QJsonArray>
-#include <QDebug>
-#include <QSqlQuery>
 #include <QMessageBox>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QNetworkRequest>
+#include <QSqlQuery>
 #include <QTimeZone>
-#include "../global.h"
+#include <QUrl>
+#include <QUrlQuery>
+
 #include "../backendapimanager.h"
+#include "../countdownwidget.h"
+#include "../global.h"
 #include "../logger.h"
+#include "ui_firingwidget.h"
 
 #define ANSI_COLOR_GREEN "\x1B[32m"
 #define ANSI_COLOR_RESET "\x1B[0m"
 
-firingWidget::firingWidget(const int &row, const bool &select, const QString &uuid, QWidget *parent) : QWidget(parent),
-                                                                                                       ui(new Ui::firingWidget),
-                                                                                                       m_uuid(uuid),
-                                                                                                       m_row(row),
-                                                                                                       m_select(select),
-                                                                                                       dao(DatabaseManager::getInstance().getDatabase()),
-                                                                                                       daoDet(DatabaseManager::getInstance().getDatabase()),
-                                                                                                       daoReg(DatabaseManager::getInstance().getDatabase())
-{
+firingWidget::firingWidget(const int &row, const bool &select, const QString &uuid, QWidget *parent)
+    : QWidget(parent),
+      ui(new Ui::firingWidget),
+      m_uuid(uuid),
+      m_row(row),
+      m_select(select),
+      dao(DatabaseManager::getInstance().getDatabase()),
+      daoDet(DatabaseManager::getInstance().getDatabase()),
+      daoReg(DatabaseManager::getInstance().getDatabase()) {
     ui->setupUi(this);
 
     ui->pushButton_2->setText("立即测试");
     ui->textEdit->setStyleSheet("border: none;background: transparent;");
     ui->frame_2->setStyleSheet("border: none;background: transparent;");
-    QFrame *frame = ui->frame_2; // 使用你为 QFrame 设置的对象名称
+    QFrame *frame = ui->frame_2;  // 使用你为 QFrame 设置的对象名称
     navProgress = new NavProgress(frame);
     ui->verticalLayout->setContentsMargins(0, 30, 0, 0);
     ui->scrollArea->setStyleSheet("background: rgba(0, 0, 0, 22); border-radius: 20px;");
@@ -44,77 +46,61 @@ 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::messageAndTopicReceived, this,
+            &firingWidget::handleMessageAndTopic);
 
     connect(this, &firingWidget::lastStageChanged, this, &firingWidget::onLastStageChanged);
     connect(this, &firingWidget::updateData, this, &firingWidget::onBlastSucess);
     startBlasting();
 }
 
-firingWidget::~firingWidget()
-{
-    delete ui;
-}
-
-void firingWidget::sendMqttMessage(const QString &topic, const QByteArray &message)
-{
+firingWidget::~firingWidget() { delete ui; }
 
-    if (mqttThread && m_isMqttConnected)
-    {
-        Logger::getInstance().info(QString("发送MQTT消息到主题: %1, 消息: %2").arg(topic, QString(message)));
+void firingWidget::sendMqttMessage(const QString &topic, const QByteArray &message) {
+    if (mqttThread && m_isMqttConnected) {
         emit mqttThread->sendMessageRequested(topic, message, quint8(2), false);
-    }
-    else
-    {
+    } else {
         Logger::getInstance().error("MQTT未连接, 无法发送消息");
-        qDebug() << "MQTT 未连接,无法发送消息";
     }
 }
 
-void firingWidget::startBlasting()
-{
+void firingWidget::startBlasting() {
     // TODO 检测起爆器是否在线
-    QTimer::singleShot(1000, this, [this]()
-                       {
-         lastStage=0;
-         emit lastStageChanged(0); });
-}
-
-void firingWidget::on_pushButton_2_clicked()
-{
-    emit countdown(m_uuid, topic, "message");
+    QTimer::singleShot(1000, this, [this]() {
+        lastStage = 0;
+        emit lastStageChanged(0);
+    });
 }
 
-bool firingWidget::uploadToDanLing(const QJsonObject &jsonObj)
-{
+void firingWidget::on_pushButton_2_clicked() { emit countdown(m_uuid, topic, "message"); }
 
+bool firingWidget::uploadToDanLing(const QJsonObject &jsonObj) {
     QString htid = jsonObj["project_htid"].toString();
-    QString htm = ""; //
+    QString htm = "";  //
     QString xmbh = jsonObj["project_xmbh"].toString();
     QString sbbh = jsonObj["equipment_sn"].toString();
     QString bprysfz = jsonObj["operator_identity"].toString();
     QString dwdm = jsonObj["company_code"].toString();
-    QString xtm = ""; //
+    QString xtm = "";  //
     QString jd = jsonObj["blast_longitude"].toString();
     QString bpsj = jsonObj["blast_time"].toString();
     QString wd = jsonObj["blast_latitude"].toString();
     QStringList uidList;
     QJsonArray regs = jsonObj["regs"].toArray();
-    for (const auto &reg : regs)
-    {
+    for (const auto &reg : regs) {
         QJsonObject regObj = reg.toObject();
         QJsonArray dets = regObj["dets"].toArray();
-        for (const auto &det : dets)
-        {
+        for (const auto &det : dets) {
             QJsonObject detObj = det.toObject();
             uidList.append(detObj["uid"].toString());
         }
     }
     QString uid = uidList.join(",");
 
-    QString plainText = QString("{\"htid\":\"%1\",\"htm\":\"%2\",\"xmbh\":\"%3\",\"sbbh\":\"%4\","
-                                "\"bprysfz\":\"%5\",\"dwdm\":\"%6\",\"xtm\":\"%7\",\"jd\":\"%8\","
-                                "\"bpsj\":\"%9\",\"wd\":\"%10\",\"uid\":\"%11\"}")
+    QString plainText = QString(
+                            "{\"htid\":\"%1\",\"htm\":\"%2\",\"xmbh\":\"%3\",\"sbbh\":\"%4\","
+                            "\"bprysfz\":\"%5\",\"dwdm\":\"%6\",\"xtm\":\"%7\",\"jd\":\"%8\","
+                            "\"bpsj\":\"%9\",\"wd\":\"%10\",\"uid\":\"%11\"}")
                             .arg(htid)
                             .arg(htm)
                             .arg(xmbh)
@@ -145,27 +131,23 @@ bool firingWidget::uploadToDanLing(const QJsonObject &jsonObj)
     QEventLoop loop;
     QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
     loop.exec();
-    if (reply->error() == QNetworkReply::NoError)
-    {
+    if (reply->error() == QNetworkReply::NoError) {
         QByteArray responseData = reply->readAll();
         qDebug() << "Response:" << QString(responseData);
-    }
-    else
-    {
+    } else {
         qDebug() << "Error:" << reply->errorString();
     }
     reply->deleteLater();
     return true;
 }
 
-bool firingWidget::recordBlastEquipments(const QJsonObject &jsonObj)
-{
+bool firingWidget::recordBlastEquipments(const QJsonObject &jsonObj) {
     QJsonArray regsArray = jsonObj["regs"].toArray();
-    for (const auto &regValue : regsArray)
-    {
+    for (const auto &regValue : regsArray) {
         QJsonObject regObj = regValue.toObject();
         HBlastRegRecord recordReg;
-        reg_uuid = QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-"));
+        reg_uuid =
+            QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-"));
         recordReg.setUuid(reg_uuid);
         recordReg.setEquipSn(regObj["equipment_sn"].toString());
         recordReg.setEquipVersion(regObj["equipment_version"].toString());
@@ -181,108 +163,97 @@ bool firingWidget::recordBlastEquipments(const QJsonObject &jsonObj)
         recordReg.setRecordUuid(blast_uuid);
         recordReg.setCreatedAt(QDateTime::currentDateTime());
         // 插入数据到数据库
-        if (!daoReg.saveHBlastRegRecord(recordReg))
-        {
+        if (!daoReg.saveHBlastRegRecord(recordReg)) {
             return false;
         }
     }
     return true;
 }
 
-void firingWidget::handleMessageAndTopic(const QByteArray &message, const QMqttTopicName &topic)
-{
-
+void firingWidget::handleMessageAndTopic(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)
-    {
+    if (textEdit) {
         textEdit->append(msgText);
     }
     int stage = 0;
     QJsonDocument jsonDoc = QJsonDocument::fromJson(message);
-    if (!jsonDoc.isNull() && jsonDoc.isObject())
-    {
+    if (!jsonDoc.isNull() && jsonDoc.isObject()) {
         QJsonObject jsonObj = jsonDoc.object();
-        if (jsonObj.contains("type") && jsonObj["type"].toInt() == 1)
-        {
-            if (jsonObj.contains("data") && jsonObj["data"].isObject())
-            {
+        if (jsonObj.contains("type") && jsonObj["type"].toInt() == 1) {
+            if (jsonObj.contains("data") && jsonObj["data"].isObject()) {
                 QJsonObject dataObject = jsonObj["data"].toObject();
                 stage = dataObject["stage"].toInt();
-                if (stage != lastStage)
-                {
+                if (stage != lastStage) {
                     lastStage = stage;
-                    switch (stage)
-                    {
-                    case 0:
-                        navProgress->setState(0);
-                        ui->pushButton_2->setText("立即测试");
-                        ui->pushButton_2->setEnabled(false);
-                        break;
-                    case 1:
-                        navProgress->setState(1);
-                        emit progressChanged(1, m_row);
-                        emit updateBlastStatus(1, m_row);
-                        ui->pushButton_2->setText("立即测试");
-                        ui->pushButton_2->setEnabled(false);
-                        break;
-                    case 2:
-                        ui->pushButton_2->setEnabled(true);
-                        emit progressChanged(2, m_row);
-                        emit updateBlastStatus(2, m_row);
-                        qDebug() << "stage:" << stage;
-                        ui->pushButton_2->setText("充电");
-                        navProgress->setState(2);
-                        break;
-                    case 3:
-                        ui->pushButton_2->setEnabled(false);
-                        emit progressChanged(3, m_row);
-                        emit updateBlastStatus(3, m_row);
-                        ui->pushButton_2->setText("充电");
-                        navProgress->setState(3);
-                        break;
-                    case 4:
-                        ui->pushButton_2->setEnabled(true);
-                        emit progressChanged(4, m_row);
-                        emit updateBlastStatus(4, m_row);
-                        ui->pushButton_2->setText("起爆");
-                        navProgress->setState(4);
-                        break;
-                    case 5:
-                        ui->pushButton_2->setEnabled(false);
-                        emit progressChanged(5, m_row);
-                        emit updateBlastStatus(5, m_row);
-                        emit updateButton(5, m_row);
-                        ui->pushButton_2->setText("起爆");
-                        navProgress->setState(5);
-                        break;
-                    case 6:
-                        ui->pushButton_2->setEnabled(false);
-                        emit progressChanged(6, m_row);
-                        emit updateBlastStatus(6, m_row);
-                        emit updateProjectStatus(m_uuid);
-                        ui->pushButton_2->setText("已完成起爆");
-                        navProgress->setState(6);
-                        break;
-                    case 7:
-                        qDebug() << "status:" << stage;
-                        ui->pushButton_2->setEnabled(false);
-                        emit progressChanged(0, m_row);   // 发送进度值
-                        emit updateBlastStatus(0, m_row); // 正在测试
-                        ui->pushButton_2->setText("已完成起爆");
-                        navProgress->setState(6);
-                        break;
-                    default:
-                        break;
+                    switch (stage) {
+                        case 0:
+                            navProgress->setState(0);
+                            ui->pushButton_2->setText("立即测试");
+                            ui->pushButton_2->setEnabled(false);
+                            break;
+                        case 1:
+                            navProgress->setState(1);
+                            emit progressChanged(1, m_row);
+                            emit updateBlastStatus(1, m_row);
+                            ui->pushButton_2->setText("立即测试");
+                            ui->pushButton_2->setEnabled(false);
+                            break;
+                        case 2:
+                            ui->pushButton_2->setEnabled(true);
+                            emit progressChanged(2, m_row);
+                            emit updateBlastStatus(2, m_row);
+                            qDebug() << "stage:" << stage;
+                            ui->pushButton_2->setText("充电");
+                            navProgress->setState(2);
+                            break;
+                        case 3:
+                            ui->pushButton_2->setEnabled(false);
+                            emit progressChanged(3, m_row);
+                            emit updateBlastStatus(3, m_row);
+                            ui->pushButton_2->setText("充电");
+                            navProgress->setState(3);
+                            break;
+                        case 4:
+                            ui->pushButton_2->setEnabled(true);
+                            emit progressChanged(4, m_row);
+                            emit updateBlastStatus(4, m_row);
+                            ui->pushButton_2->setText("起爆");
+                            navProgress->setState(4);
+                            break;
+                        case 5:
+                            ui->pushButton_2->setEnabled(false);
+                            emit progressChanged(5, m_row);
+                            emit updateBlastStatus(5, m_row);
+                            emit updateButton(5, m_row);
+                            ui->pushButton_2->setText("起爆");
+                            navProgress->setState(5);
+                            break;
+                        case 6:
+                            ui->pushButton_2->setEnabled(false);
+                            emit progressChanged(6, m_row);
+                            emit updateBlastStatus(6, m_row);
+                            emit updateProjectStatus(m_uuid);
+                            ui->pushButton_2->setText("已完成起爆");
+                            navProgress->setState(6);
+                            break;
+                        case 7:
+                            qDebug() << "status:" << stage;
+                            ui->pushButton_2->setEnabled(false);
+                            emit progressChanged(0, m_row);    // 发送进度值
+                            emit updateBlastStatus(0, m_row);  // 正在测试
+                            ui->pushButton_2->setText("已完成起爆");
+                            navProgress->setState(6);
+                            break;
+                        default:
+                            break;
                     }
                     emit lastStageChanged(lastStage);
                 }
             }
         }
-        if (jsonObj.contains("type") && jsonObj["type"].toInt() == 2)
-        {
-            if (jsonObj.contains("data") && jsonObj["data"].isObject())
-            {
+        if (jsonObj.contains("type") && jsonObj["type"].toInt() == 2) {
+            if (jsonObj.contains("data") && jsonObj["data"].isObject()) {
                 QJsonObject dataObject = jsonObj["data"].toObject();
                 emit updateData(dataObject);
                 emit closeFiring(m_uuid);
@@ -291,244 +262,182 @@ void firingWidget::handleMessageAndTopic(const QByteArray &message, const QMqttT
     }
 }
 
-void firingWidget::onCountdownFinished(const QString &topic, const QString &message)
-{
+void firingWidget::onCountdownFinished(const QString &topic, const QString &message) {
     sendMqttMessage(topic, message.toUtf8());
 }
 
-void firingWidget::onMqttConnected()
-{
-    m_isMqttConnected = true;
-}
+void firingWidget::onMqttConnected() { m_isMqttConnected = true; }
 
-void firingWidget::onButtonPressedReceived(const QString &topic, const QString &message)
-{
+void firingWidget::onButtonPressedReceived(const QString &topic, const QString &message) {
     QByteArray data = "\r\nDISABLE_BUTTON\r\n";
     // 调用发送数据的方法
     bool success = serialTool->sendData(data);
-    if (success)
-    {
-        qDebug() << "Data sent successfully";
-    }
-    else
-    {
-        qDebug() << "Failed to send data";
+    if (!success) {
+        Logger::getInstance().error(
+            QString("onButtonPressedReceived: Failed to send data: %1").arg(data));
+        return;
     }
     emit countdown(m_uuid, topic, message);
+    qDebug() << "Data sent successfully";
 }
 
 // 状态改变
-void firingWidget::onLastStageChanged(int newStage)
-{
+void firingWidget::onLastStageChanged(int newStage) {
     QString topic = "hxgc/" + m_uuid + "/P";
     QString message;
     QString buttonText;
-    switch (lastStage)
-    {
-    case 0:
-        message = "起爆测试";
-        buttonText = "立即测试";
-        sendMqttMessage(topic, message.toUtf8());
-        break;
-    case 2:
-        message = "开始充电";
-        buttonText = "充电";
-        sendMqttMessage(topic, message.toUtf8());
-        break;
-    case 4:
-        message = "起爆";
-        buttonText = "起爆";
-        break;
-    case 5:
-        if (!m_select)
-        {
-            if (connection)
-            {
-                disconnect(connection);
-                qDebug() << "Connection disconnected.";
-            }
-            if (connectionPress)
-            {
-                disconnect(connectionPress);
-                qDebug() << "connectionPress disconnected.";
+    switch (lastStage) {
+        case 0:
+            message = "起爆测试";
+            buttonText = "立即测试";
+            sendMqttMessage(topic, message.toUtf8());
+            break;
+        case 2:
+            message = "开始充电";
+            buttonText = "充电";
+            sendMqttMessage(topic, message.toUtf8());
+            break;
+        case 4:
+            message = "起爆";
+            buttonText = "起爆";
+            break;
+        case 5:
+            if (!m_select) {
+                if (connection) {
+                    disconnect(connection);
+                    qDebug() << "Connection disconnected.";
+                }
+                if (connectionPress) {
+                    disconnect(connectionPress);
+                    qDebug() << "connectionPress disconnected.";
+                }
+                serialTool->releaseInstance();
             }
-            serialTool->releaseInstance();
-        }
 
-        qDebug() << ANSI_COLOR_GREEN << "释放按键 5" << ANSI_COLOR_RESET;
+            qDebug() << ANSI_COLOR_GREEN << "释放按键 5" << ANSI_COLOR_RESET;
 
-        break;
-    default:
+            break;
+        default:
 
-        return;
+            return;
     }
 
-    Logger::getInstance().info(QString("Stage changed to: %1, sending message: %2").arg(newStage).arg(message));
-    if (!message.isEmpty())
-    {
-        if (lastStage == 4 && !m_select)
-        {
+    Logger::getInstance().info(
+        QString("Stage changed to: %1, sending message: %2").arg(newStage).arg(message));
+    if (!message.isEmpty()) {
+        if (lastStage == 4 && !m_select) {
             bool success2;
             serialTool = SerialTool::getInstance(nullptr, &success2);
-            if (serialTool)
-            {
+            if (serialTool) {
                 QByteArray data = "\r\nENABLE_BUTTON\r\n";
                 bool success = serialTool->sendData(data);
-                if (success)
-                {
-                    Logger::getInstance().info(QString("Data sent successfully to serial tool: %1").arg(data));
+                if (success) {
+                    Logger::getInstance().info(
+                        QString("Data sent successfully to serial tool: %1").arg(data));
                     qDebug() << "Data sent successfully";
-                }
-                else
-                {
+                } else {
                     qDebug() << "Failed to send data";
                 }
-                connection = connect(serialTool, &SerialTool::enableButtonReceived, [this]()
-                                     { emit updateBlastStatus(10, m_row); });
-                connectionPress = connect(serialTool, &SerialTool::buttonPressedReceived, [this, topic, message]()
-                                          { this->onButtonPressedReceived(topic, message); });
-            }
-            else
-            {
+                connection = connect(serialTool, &SerialTool::enableButtonReceived,
+                                     [this]() { emit updateBlastStatus(10, m_row); });
+                connectionPress = connect(
+                    serialTool, &SerialTool::buttonPressedReceived,
+                    [this, topic, message]() { this->onButtonPressedReceived(topic, message); });
+            } else {
                 Logger::getInstance().error("SerialTool instance not found.");
                 qDebug() << "serialTool Not fond.";
                 // 在准备起爆状态下 但是没有获取串口
                 lastStage = 10;
             }
-        }
-        else if (lastStage == 4 && m_select)
-        {
+        } else if (lastStage == 4 && m_select) {
             qDebug() << "多台起爆:待起爆状态";
             emit selectSignal(m_uuid);
-        }
-        else
-        { //????
+        } else {  //????
             qDebug() << "Stage 值变为: " << newStage << "发送消息" << message.toUtf8();
         }
     }
 }
 
-void firingWidget::cancelBlasting()
-{
+void firingWidget::cancelBlasting() {
     QString message = "取消流程";
-    if (!message.isEmpty())
-    {
+    if (!message.isEmpty()) {
         sendMqttMessage(topic, message.toUtf8());
     }
 }
-void firingWidget::on_sendTest_4_clicked()
-{
-}
+void firingWidget::on_sendTest_4_clicked() {}
 
-void firingWidget::testonBlastSucess(const QJsonObject &jsonObj)
-{
-    onBlastSucess(jsonObj);
-}
+void firingWidget::testonBlastSucess(const QJsonObject &jsonObj) { onBlastSucess(jsonObj); }
 // 处理爆破成功,安全验证装置通过MQTT传回的数据
-void firingWidget::onBlastSucess(const QJsonObject &jsonObj)
-{
-    Logger::getInstance().info(QString("收到爆破完成回传记录. data: %1").arg(QJsonDocument(jsonObj).toJson(QJsonDocument::Indented)));
+void firingWidget::onBlastSucess(const QJsonObject &jsonObj) {
+    Logger::getInstance().info(QString("收到爆破完成回传记录. data: %1")
+                                   .arg(QJsonDocument(jsonObj).toJson(QJsonDocument::Indented)));
     blast_uuid = QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-"));
     lat = labLat;
     lon = labLon;
 
-    saveDataToLocalDB(jsonObj);
+    saveAndUploadRecord(jsonObj);
 
-    if (lat == "定位失败" && lat == "未知" && lon == "定位失败" && lon == "未知")
-    {
+    if (lat == "定位失败" && lat == "未知" && lon == "定位失败" && lon == "未知") {
         QMessageBox::critical(nullptr, "错误", "未获取有效定位数据,数据将暂不上传丹灵");
         // 数据:存本地 不传丹灵
     }
     uploadToDanLing(jsonObj);
 }
 
-/*
-    Id               int                              `json:"-" comment:"主键编码"` // 主键编码
-    Uuid             string                           `json:"uuid" comment:""`
-    ProjectName      string                           `json:"project_name" comment:"工程名称"`
-    ProjectHtid      string                           `json:"project_htid" comment:"合同编号"`
-    ProjectXmbh      string                           `json:"project_xmbh" comment:"项目编号"`
-    OperatorName     string                           `json:"operator_name" comment:"操作员"`
-    Phone            string                           `json:"phone" comment:"操作员电话"`
-    OperatorIdentity string                           `json:"operator_identity" comment:"操作员身份证"`
-    EquipmentSn      string                           `json:"equipment_sn" comment:"设备序列号"`
-    CompanyCode      string                           `json:"company_code" comment:"公司代码"`
-    AppVersion       string                           `json:"app_version" comment:"app版本"`
-    Longitude        string                           `json:"blast_longitude" comment:"经度"`
-    Latitude         string                           `json:"blast_latitude" comment:"纬度"`
-    EquipmentCount   string                           `json:"equipment_count" comment:"设备数量"`
-    RegDetCount      string                           `json:"reg_deto_count" comment:"注册雷管数量"`
-    ErrorDetCount    string                           `json:"error_deto_count" comment:"异常雷管数量"`
-    BlastAt          string                           `json:"blast_time" comment:"爆破时间"`
-    Regs             []HBlastRecordEquipmentInsertReq `json:"regs"`
-    WBlasterId       string                           `json:"w_blaster_id"`
-*/
-void firingWidget::uploadToServer(const QJsonObject &jsonObj)
-{
+void firingWidget::uploadToServer(const QJsonObject &jsonObj) {
     // upload blast project
     // upload blast reg dets
     // upload blast dets data
 }
 
-void firingWidget::saveDataToLocalDB(const QJsonObject &jsonObj)
-{
+void firingWidget::saveAndUploadRecord(const QJsonObject &jsonObj) {
     QSqlDatabase db = DatabaseManager::getInstance().getDatabase();
-    if (!db.transaction())
-    {
-        Logger::getInstance().critical(QString("Failed to start DB trasaction. Error: %1").arg(db.lastError().text()));
+    if (!db.transaction()) {
+        Logger::getInstance().critical(
+            QString("Failed to start DB trasaction. Error: %1").arg(db.lastError().text()));
         return;
     }
 
     HBlastRecord *blastRecord = recordBlastProject(jsonObj);
-    if (blastRecord == nullptr)
-    {
-        if (db.rollback())
-        {
-            qDebug() << "Transaction rolled back successfully for no blastRecoard created.";
-            Logger::getInstance().error(QString("Failed to create blast record. data: %1").arg(QJsonDocument(jsonObj).toJson(QJsonDocument::Indented)));
-        }
-        else
-        {
-            qDebug() << "Failed to roll back transaction:" << db.lastError().text();
-        }
+    if (blastRecord == nullptr) {
+        Logger::getInstance("error_blast_records.log")
+            .error(QString("Failed to create blast record. data: %1")
+                       .arg(QJsonDocument(jsonObj).toJson(QJsonDocument::Indented)));
+        Logger::getInstance().info(
+            QString("Failed to create blast record. try to rollback the transaction: %1")
+                .arg(db.rollback()));
+        return;
     }
-    if (!recordBlastEquipments(jsonObj))
-    {
-        if (db.rollback())
-        {
+    if (!recordBlastEquipments(jsonObj)) {
+        if (db.rollback()) {
             qDebug() << "Transaction rolled back successfully for equiments.";
-        }
-        else
-        {
+        } else {
             qDebug() << "Failed to roll back transaction:" << db.lastError().text();
         }
+        return;
     }
     QList<HBlastRecordDet *> detsRecords = recordDetsData(jsonObj);
-    if (detsRecords.isEmpty())
-    {
-        if (db.rollback())
-        {
+    if (detsRecords.isEmpty()) {
+        if (db.rollback()) {
             qDebug() << "Transaction rolled back successfully.";
-        }
-        else
-        {
+        } else {
             qDebug() << "Failed to roll back transaction:" << db.lastError().text();
         }
+        return;
     }
 
     db.commit();
 
-    if (blastRecord != nullptr)
-    {
-        if (!backendAPIManager::uploadBlastProject(blastRecord->BlastRecordToJson()))
-        {
-            Logger::getInstance().error(QString("Failed to upload blast project. data: %1").arg(QJsonDocument(blastRecord->BlastRecordToJson()).toJson(QJsonDocument::Indented)));
+    if (blastRecord != nullptr) {
+        if (!backendAPIManager::uploadBlastProject(blastRecord->BlastRecordToJson())) {
+            Logger::getInstance().error(QString("Failed to upload blast project. data: %1")
+                                            .arg(QJsonDocument(blastRecord->BlastRecordToJson())
+                                                     .toJson(QJsonDocument::Indented)));
         }
     }
 }
 
-HBlastRecord *firingWidget::recordBlastProject(const QJsonObject &jsonObj)
-{
+HBlastRecord *firingWidget::recordBlastProject(const QJsonObject &jsonObj) {
     HBlastRecord *record = new HBlastRecord();
     record->setProjectName(jsonObj["project_name"].toString());
     record->setProjectHtid(jsonObj["project_htid"].toString());
@@ -547,42 +456,38 @@ HBlastRecord *firingWidget::recordBlastProject(const QJsonObject &jsonObj)
     // record->setLatitude(lon);
     record->setRegDetCount(jsonObj["reg_deto_count"].toString().toInt());
     record->setErrorDetCount(jsonObj["error_deto_count"].toString().toInt());
-    QDateTime blastTime = QDateTime::fromString(jsonObj["blast_time"].toString(), "yyyy-MM-dd hh:mm:ss");
+    QDateTime blastTime =
+        QDateTime::fromString(jsonObj["blast_time"].toString(), "yyyy-MM-dd hh:mm:ss");
     // blastTime.setTimeZone(QTimeZone(QByteArrayLiteral("Asia/Shanghai")));
     record->setBlastAt(blastTime);
     record->setCreatedAt(QDateTime::currentDateTime());
     record->setUuid(blast_uuid);
 
-    if (dao.addHBlastRecord(*record))
-    {
+    if (dao.addHBlastRecord(*record)) {
         qDebug() << "Record inserted successfully.";
         return record;
-    }
-    else
-    {
+    } else {
         qDebug() << "Failed to insert record.";
         delete record;
         return nullptr;
     }
 }
 
-QList<HBlastRecordDet *> firingWidget::recordDetsData(const QJsonObject &jsonObj)
-{
+QList<HBlastRecordDet *> firingWidget::recordDetsData(const QJsonObject &jsonObj) {
     QList<HBlastRecordDet *> recordDets;
     QJsonArray regsArray = jsonObj["regs"].toArray();
 
-    for (const auto &regValue : regsArray)
-    {
+    for (const auto &regValue : regsArray) {
         QJsonObject regObj = regValue.toObject();
         QJsonArray detsArray = regObj["dets"].toArray();
 
-        for (const auto &detValue : detsArray)
-        {
+        for (const auto &detValue : detsArray) {
             QJsonObject detObj = detValue.toObject();
             HBlastRecordDet *recordDet = new HBlastRecordDet();
 
             recordDet->setId(0);
-            recordDet->setUuid(QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-")));
+            recordDet->setUuid(
+                QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-")));
             recordDet->setOutCode(detObj["out_code"].toString());
             recordDet->setInnerCode(detObj["in_code"].toString());
             recordDet->setUid(detObj["uid"].toString());
@@ -595,13 +500,13 @@ QList<HBlastRecordDet *> firingWidget::recordDetsData(const QJsonObject &jsonObj
             recordDet->setRegId(reg_uuid);
             recordDet->setCreatedAt(QDateTime::currentDateTime());
 
-            if (daoDet.addHBlastRecordDet(*recordDet))
-            {
+            if (daoDet.addHBlastRecordDet(*recordDet)) {
                 recordDets.append(recordDet);
-            }
-            else
-            {
-                Logger::getInstance().error(QString("Failed to insert record det. data %1").arg(QJsonDocument(recordDet->BlastRecordDetToJson()).toJson(QJsonDocument::Compact)));
+            } else {
+                Logger::getInstance().error(
+                    QString("Failed to insert record det. data %1")
+                        .arg(QJsonDocument(recordDet->BlastRecordDetToJson())
+                                 .toJson(QJsonDocument::Compact)));
                 delete recordDet;
                 continue;
             }

+ 25 - 25
fireWidget/firingwidget.h

@@ -1,42 +1,42 @@
 #ifndef FIRINGWIDGET_H
 #define FIRINGWIDGET_H
-#include "navprogress.h"
-#include "../mqtt/mqttclient.h"
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QWidget>
+
 #include "../blastRecord/hblastrecord.h"
 #include "../blastRecord/hblastrecorddao.h"
 #include "../blastRecordDet/hblastrecorddetdao.h"
 #include "../blastRegRecord/hblastregrecorddao.h"
 #include "../databasemanager.h"
-#include <QWidget>
-#include <QJsonDocument>
-#include <QJsonObject>
 #include "../des3encryption.h"
+#include "../mqtt/mqttclient.h"
 #include "../mqttthread.h"
 #include "../serial/serialtool.h"
+#include "navprogress.h"
 
-namespace Ui
-{
-    class firingWidget;
+namespace Ui {
+class firingWidget;
 }
 
-class firingWidget : public QWidget
-{
+class firingWidget : public QWidget {
     Q_OBJECT
 
-public:
-    explicit firingWidget(const int &row, const bool &select, const QString &uuid = "", QWidget *parent = nullptr);
+   public:
+    explicit firingWidget(const int &row, const bool &select, const QString &uuid = "",
+                          QWidget *parent = nullptr);
     ~firingWidget();
     void cancelBlasting();
     void testonBlastSucess(const QJsonObject &data);
 
-public slots:
+   public slots:
     void onCountdownFinished(const QString &topic, const QString &message);
-private slots:
+   private slots:
     void on_pushButton_2_clicked();
     void on_sendTest_4_clicked();
     void handleMessageAndTopic(const QByteArray &message, const QMqttTopicName &topic);
 
-signals:
+   signals:
     void progressChanged(int value, int row);
     void lastStageChanged(int newStage);
     void updateBlastStatus(int status, int row);
@@ -46,7 +46,7 @@ signals:
     void updateData(const QJsonObject &jsonObj);
     void countdown(QString uuid, const QString &topic, const QString &message);
     void closeFiring(QString uuid);
-private slots:
+   private slots:
     // 处理 MQTT 连接成功的槽函数
     void onMqttConnected();
     // 双键按下
@@ -54,17 +54,17 @@ private slots:
     void onLastStageChanged(int newStage);
     void onBlastSucess(const QJsonObject &data);
 
-private:
+   private:
     bool recordBlastEquipments(const QJsonObject &jsonObj);
     QList<HBlastRecordDet *> recordDetsData(const QJsonObject &jsonObj);
     bool uploadToDanLing(const QJsonObject &jsonObj);
     HBlastRecord *recordBlastProject(const QJsonObject &jsonObj);
-    void saveDataToLocalDB(const QJsonObject &jsonObj);
+    void saveAndUploadRecord(const QJsonObject &jsonObj);
     void uploadToServer(const QJsonObject &jsonObj);
     void sendMqttMessage(const QString &topic, const QByteArray &message);
     void startBlasting();
 
-private:
+   private:
     Ui::firingWidget *ui;
     MqttClient *pcPorjectBC;
     HBlastRecordDao dao;
@@ -73,18 +73,18 @@ private:
     NavProgress *navProgress;
     MqttThread *mqttThread;
     SerialTool *serialTool = nullptr;
-    QString m_uuid;     // 用于存储 uuid
-    QString reg_uuid;   // 用于存储 uuid
-    QString blast_uuid; // 用于存储 uuid
+    QString m_uuid;      // 用于存储 uuid
+    QString reg_uuid;    // 用于存储 uuid
+    QString blast_uuid;  // 用于存储 uuid
     QString topic;
     int m_row;
-    int lastStage = -1; // 用于记录上一次的 stage 状态
+    int lastStage = -1;  // 用于记录上一次的 stage 状态
     bool m_isMqttConnected = false;
     bool m_select;
-    QMetaObject::Connection connection; // 声明 connection 变量
+    QMetaObject::Connection connection;  // 声明 connection 变量
     QMetaObject::Connection connectionPress;
     QString lat;
     QString lon;
 };
 
-#endif // FIRINGWIDGET_H
+#endif  // FIRINGWIDGET_H

+ 5 - 1
global.cpp

@@ -1,6 +1,10 @@
 #include "global.h"
 
-QUrl g_url("http://114.55.233.194:8088/api/v1/");  // 定义并初始化全局变量
+QUrl apiBackendUrl("http://114.55.233.194:8088/api/v1/");  // 定义并初始化全局变量
 QString labLat("未知");
 QString labLon("未知");
 QString globalAuthority;
+QString firewidgetPort("COM1");
+QString gpsPort("COM3");
+QString databaseHost("127.0.0.1");
+QString mqttClientId("mqttclientOnDevPC");

+ 11 - 5
global.h

@@ -1,13 +1,19 @@
 #ifndef GLOBAL_H
 #define GLOBAL_H
 
+#include <QString>
 #include <QUrl>
 #include <QUrlQuery>
-#include <QString>
+
 #include "logger.h"
 
-extern QUrl g_url;  // 声明全局变量
-extern QString labLat;  // 新增的全局变量声明
-extern QString labLon;  // 新增的全局变量声明
+extern QUrl apiBackendUrl;  // 声明全局变量
+extern QString labLat;      // 新增的全局变量声明
+extern QString labLon;      // 新增的全局变量声明
 extern QString globalAuthority;
-#endif // GLOBAL_H
+extern QString firewidgetPort;  // 点火装置串口号
+extern QString gpsPort;         // gps串口号
+extern QString databaseHost;    // pc数据库地址
+extern QString mqttClientId;    // mqtt客户端ID
+
+#endif  // GLOBAL_H

+ 26 - 25
loadingWidget.cpp

@@ -1,36 +1,33 @@
 // loadingwidget.cpp
 #include "loadingwidget.h"
-#include <QVBoxLayout>
-#include <QResizeEvent>
+
 #include <QApplication>
-#include <QScreen>
 #include <QLabel>
 #include <QMovie>
+#include <QResizeEvent>
+#include <QScreen>
+#include <QVBoxLayout>
+
+#include "mainwindow.h"
 
 LoadingWidget* LoadingWidget::m_instance = nullptr;
 
-LoadingWidget::LoadingWidget(QWidget *parent)
-    : QWidget(parent)
-{
-    initUI();
-}
+LoadingWidget::LoadingWidget(QWidget* parent) : QWidget(parent) { initUI(); }
 
-LoadingWidget* LoadingWidget::instance()
-{
+LoadingWidget* LoadingWidget::instance() {
     if (!m_instance) {
         m_instance = new LoadingWidget();
     }
     return m_instance;
 }
 
-void LoadingWidget::showLoading(QWidget* parent, const QString& text)
-{
+void LoadingWidget::showLoading(QWidget* parent, const QString& text) {
     LoadingWidget* instance = LoadingWidget::instance();
 
     // 如果提供了parent,则设置parent
-    if (parent) {
-        instance->setParent(parent);
-    }
+    // if (parent) {
+    //     instance->setParent(parent);
+    // }
 
     instance->m_textLabel->setText(text);
     instance->m_movie->start();
@@ -39,16 +36,14 @@ void LoadingWidget::showLoading(QWidget* parent, const QString& text)
     instance->raise();
 }
 
-void LoadingWidget::hideLoading()
-{
+void LoadingWidget::hideLoading() {
     if (m_instance) {
         m_instance->m_movie->stop();
         m_instance->hide();
     }
 }
 
-void LoadingWidget::initUI()
-{
+void LoadingWidget::initUI() {
     // 设置窗口属性
     setWindowFlags(Qt::FramelessWindowHint | Qt::SubWindow);
     setAttribute(Qt::WA_TranslucentBackground);
@@ -64,7 +59,6 @@ void LoadingWidget::initUI()
     m_textLabel = new QLabel(this);
     m_textLabel->setAlignment(Qt::AlignCenter);
 
-
     // 布局
     QVBoxLayout* layout = new QVBoxLayout(this);
     layout->addWidget(m_loadingLabel);
@@ -80,14 +74,13 @@ void LoadingWidget::initUI()
     hide();
 }
 
-void LoadingWidget::resizeEvent(QResizeEvent *event)
-{
+void LoadingWidget::resizeEvent(QResizeEvent* event) {
     QWidget::resizeEvent(event);
     updatePosition();
 }
 
-void LoadingWidget::updatePosition()
-{
+void LoadingWidget::updatePosition() {
+    qDebug() << "Updating position of LoadingWidget" << parentWidget();
     if (parentWidget()) {
         // 居中显示在父窗口
         QRect parentRect = parentWidget()->rect();
@@ -96,7 +89,15 @@ void LoadingWidget::updatePosition()
     } else {
         // 如果没有父窗口,居中显示在屏幕
         QRect screenGeometry = QApplication::primaryScreen()->geometry();
-        resize(screenGeometry.size());
+        resize(1024, 768);
         move(screenGeometry.center() - rect().center());
     }
 }
+
+void LoadingWidget::init(QStackedWidget* stackedWidget) {
+    LoadingWidget* instance = LoadingWidget::instance();
+    if (stackedWidget) {
+        instance->setParent(stackedWidget);
+        instance->updatePosition();
+    }
+}

+ 9 - 8
loadingWidget.h

@@ -1,15 +1,16 @@
 #ifndef LOADINGWIDGET_H
 #define LOADINGWIDGET_H
 
+#include <QStackedWidget>
 #include <QWidget>
 
 class QLabel;
 class QMovie;
 
-class LoadingWidget : public QWidget
-{
+class LoadingWidget : public QWidget {
     Q_OBJECT
-public:
+   public:
+    static void init(QStackedWidget* stackedWidget);
     // 获取全局实例
     static LoadingWidget* instance();
 
@@ -19,11 +20,11 @@ public:
     // 隐藏加载
     static void hideLoading();
 
-protected:
-    void resizeEvent(QResizeEvent *event) override;
+   protected:
+    void resizeEvent(QResizeEvent* event) override;
 
-private:
-    explicit LoadingWidget(QWidget *parent = nullptr);
+   private:
+    explicit LoadingWidget(QWidget* parent = nullptr);
     static LoadingWidget* m_instance;
 
     void updatePosition();
@@ -34,4 +35,4 @@ private:
     QMovie* m_movie;
 };
 
-#endif // LOADINGWIDGET_H
+#endif  // LOADINGWIDGET_H

+ 67 - 85
login/loginwindow.cpp

@@ -1,11 +1,10 @@
 #include "loginwindow.h"
-#include "ui_loginwindow.h"
+
 #include "../backendapimanager.h"
+#include "ui_loginwindow.h"
 
-LoginWindow::LoginWindow(QWidget *parent) : QWidget(parent),
-                                            ui(new Ui::LoginWindow),
-                                            manager(new QNetworkAccessManager(this))
-{
+LoginWindow::LoginWindow(QWidget *parent)
+    : QWidget(parent), ui(new Ui::LoginWindow), manager(new QNetworkAccessManager(this)) {
     ui->setupUi(this);
     registryManager = new RegistryManager();
     ui->username->lineEdit()->setPlaceholderText("请输入用户名");
@@ -17,32 +16,23 @@ LoginWindow::LoginWindow(QWidget *parent) : QWidget(parent),
     initUesrCombox();
 }
 
-void LoginWindow::initUesrCombox()
-{
+void LoginWindow::initUesrCombox() {
     QStringList allUsernames = registryManager->getAllUsernames();
-    for (const QString &username : allUsernames)
-    {
+    for (const QString &username : allUsernames) {
         ui->username->addItem(username);
     }
     ui->username->setCurrentIndex(-1);
 }
-LoginWindow::~LoginWindow()
-{
-    delete ui;
-}
-
-void LoginWindow::on_btnLogin_clicked()
-{
+LoginWindow::~LoginWindow() { delete ui; }
 
+void LoginWindow::on_btnLogin_clicked() {
     QString username = ui->username->currentText();
     QString password = ui->password->text();
-    if (username.isEmpty() || password.isEmpty())
-    {
+    if (username.isEmpty() || password.isEmpty()) {
         QMessageBox::critical(nullptr, "输入错误", "用户名或密码不能为空,请重新输入。");
         return;
     }
-    try
-    {
+    try {
         // 构造请求数据
         QJsonObject jsonData;
         jsonData["username"] = username;
@@ -50,14 +40,13 @@ void LoginWindow::on_btnLogin_clicked()
         QJsonDocument doc(jsonData);
         QByteArray data = doc.toJson();
         QUrl localUrl("login/pc");
-        QUrl fullUrl = g_url.resolved(localUrl);
-        QNetworkRequest request(fullUrl); // 替换为实际的服务器接口地址
+        QUrl fullUrl = apiBackendUrl.resolved(localUrl);
+        QNetworkRequest request(fullUrl);  // 替换为实际的服务器接口地址
         request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
         // 发送 POST 请求
         QNetworkReply *reply = manager->post(request, data);
         // 处理响应
-        QObject::connect(reply, &QNetworkReply::finished, [reply, this, username, password]()
-                         {
+        QObject::connect(reply, &QNetworkReply::finished, [reply, this, username, password]() {
             try {
                 if (reply->error() == QNetworkReply::NoError) {
                     QByteArray responseData = reply->readAll();
@@ -71,54 +60,60 @@ void LoginWindow::on_btnLogin_clicked()
                                 msgBox->setAttribute(Qt::WA_TranslucentBackground, true);
                                 msgBox->setWindowTitle("");
                                 msgBox->setText("用户名或密码错误,请重试。");
-                                msgBox->setWindowFlags(msgBox->windowFlags() | Qt::FramelessWindowHint);
-                                msgBox->setStandardButtons(QMessageBox::NoButton); // 不设置标准按钮
+                                msgBox->setWindowFlags(msgBox->windowFlags() |
+                                                       Qt::FramelessWindowHint);
+                                msgBox->setStandardButtons(
+                                    QMessageBox::NoButton);  // 不设置标准按钮
 
                                 msgBox->setStyleSheet(
-                                            "QMessageBox {"
-                                            "    border: none; /* 去除边框 */"
-                                            "}"
-                                            "QLabel {"
-                                            "    color: #a94442; /* 标签文字颜色 */"
-                                            "    background-color: transparent; /* 标签背景透明 */"
-                                            "    font-size: 20px; /* 设置字体大小,可根据需要调整 */"
-                                            "}"
-                                            "QPushButton {"
-                                            "    visibility: hidden; /* 隐藏按钮 */"
-                                            "}"
-                                            );
+                                    "QMessageBox {"
+                                    "    border: none; /* 去除边框 */"
+                                    "}"
+                                    "QLabel {"
+                                    "    color: #a94442; /* 标签文字颜色 */"
+                                    "    background-color: transparent; /* 标签背景透明 */"
+                                    "    font-size: 20px; /* 设置字体大小,可根据需要调整 */"
+                                    "}"
+                                    "QPushButton {"
+                                    "    visibility: hidden; /* 隐藏按钮 */"
+                                    "}");
                                 // 使用 QTimer 在 3 秒后自动关闭消息框
                                 QTimer::singleShot(1500, msgBox, [msgBox]() {
                                     msgBox->close();
-                                    delete msgBox; // 释放内存
+                                    delete msgBox;  // 释放内存
                                 });
                                 msgBox->show();
-                            }
-                            else if (code == 200) {
+                            } else if (code == 200) {
                                 QJsonObject userInfoObj = responseObj["userInfo"].toObject();
                                 QJsonObject userObj = userInfoObj["user"].toObject();
                                 int userId = userObj["userId"].toInt();
-                                QString identity =  userObj["identity"].toString();
+                                QString identity = userObj["identity"].toString();
                                 QString userIdStr = QString::number(userId);
-                                registryManager->saveUserInfo(userIdStr,username,password,identity);
-                                QString Authority =  responseObj["currentAuthority"].toString();
+                                registryManager->saveUserInfo(userIdStr, username, password,
+                                                              identity);
+                                QString Authority = responseObj["currentAuthority"].toString();
                                 globalAuthority = "Bearer " + Authority;
                                 this->close();
                                 MainWindow *mainWindow = new MainWindow();
                                 backendAPIManager::setAuthToken(globalAuthority);
 
-    /*TODO: delete
-    QString jsonString = "{\"app_version\":\"1.52\",\"blast_latitude\":\"30.21122186731856\",\"blast_longitude\":\"120.22146062951883\",\"blast_time\":\"2025-06-03 12:00:00\",\"company_code\":\"3701234300003\",\"equipment_sn\":\"F34A0000001\",\"error_deto_count\":\"0\",\"operator_identity\":\"330781198509079292\",\"operator_name\":\"栋工\",\"phone\":\"18611112222\",\"project_htid\":\"\",\"project_name\":\"sidf\",\"project_xmbh\":\"\",\"reg_deto_count\":\"2\",\"regs\":[{\"after_test_bus_i\":\"41\",\"after_test_bus_v\":\"8006\",\"before_blasting_i\":\"49\",\"before_blasting_v\":\"13492\",\"bus_leakage_current_i\":\"0\",\"dets\":[{\"delay_time\":\"0.0\",\"freq\":\"0\",\"in_code\":\"005AC8360A4C01A7\",\"out_code\":\"2411104F18000\",\"status\":\"0x00\",\"tag\":\"1-1-1\",\"uid\":\"24211104F18000\"},{\"delay_time\":\"80.0\",\"freq\":\"0\",\"in_code\":\"015AC8360A4C014E\",\"out_code\":\"2411104F18001\",\"status\":\"0x00\",\"tag\":\"1-2-1\",\"uid\":\"24211104F18001\"}],\"equipment_sn\":\"null\",\"equipment_version\":\"null\",\"error_deto_count\":\"0\",\"net_charged_i\":\"49\",\"net_charged_v\":\"13501\",\"reg_deto_count\":\"2\"}]}";
-    // 使用 QJsonDocument::fromJson 直接解析 QByteArray 并获取 QJsonObject
-    // 这是一个非常简洁的单行操作,假设你知道顶层是 JSON 对象且不关心详细的错误信息
-    QJsonObject myJsonObject = QJsonDocument::fromJson(jsonString.toUtf8()).object();
-    qDebug() << "debug" << QDateTime::fromString(myJsonObject["blast_time"].toString(), "yyyy-MM-dd hh:mm:ss").toString(Qt::ISODateWithMs);
-    int row = 1;
-    firingWidget *wt = new firingWidget(row, false, "111");
-    wt->testonBlastSucess(myJsonObject);
-    //<< Delete
-    */
-    
+                                /*TODO: delete test code
+                                QString jsonString =
+                                "{\"app_version\":\"1.52\",\"blast_latitude\":\"30.21122186731856\",\"blast_longitude\":\"120.22146062951883\",\"blast_time\":\"2025-06-03
+                                12:00:00\",\"company_code\":\"3701234300003\",\"equipment_sn\":\"F34A0000001\",\"error_deto_count\":\"0\",\"operator_identity\":\"330781198509079292\",\"operator_name\":\"栋工\",\"phone\":\"18611112222\",\"project_htid\":\"\",\"project_name\":\"sidf\",\"project_xmbh\":\"\",\"reg_deto_count\":\"2\",\"regs\":[{\"after_test_bus_i\":\"41\",\"after_test_bus_v\":\"8006\",\"before_blasting_i\":\"49\",\"before_blasting_v\":\"13492\",\"bus_leakage_current_i\":\"0\",\"dets\":[{\"delay_time\":\"0.0\",\"freq\":\"0\",\"in_code\":\"005AC8360A4C01A7\",\"out_code\":\"2411104F18000\",\"status\":\"0x00\",\"tag\":\"1-1-1\",\"uid\":\"24211104F18000\"},{\"delay_time\":\"80.0\",\"freq\":\"0\",\"in_code\":\"015AC8360A4C014E\",\"out_code\":\"2411104F18001\",\"status\":\"0x00\",\"tag\":\"1-2-1\",\"uid\":\"24211104F18001\"}],\"equipment_sn\":\"null\",\"equipment_version\":\"null\",\"error_deto_count\":\"0\",\"net_charged_i\":\"49\",\"net_charged_v\":\"13501\",\"reg_deto_count\":\"2\"}]}";
+                                // 使用 QJsonDocument::fromJson 直接解析 QByteArray 并获取
+                                QJsonObject
+                                // 这是一个非常简洁的单行操作,假设你知道顶层是 JSON
+                                对象且不关心详细的错误信息 QJsonObject myJsonObject =
+                                QJsonDocument::fromJson(jsonString.toUtf8()).object(); qDebug() <<
+                                "debug" <<
+                                QDateTime::fromString(myJsonObject["blast_time"].toString(),
+                                "yyyy-MM-dd hh:mm:ss").toString(Qt::ISODateWithMs); int row = 1;
+                                firingWidget *wt = new firingWidget(row, false, "111");
+                                wt->testonBlastSucess(myJsonObject);
+                                //<< Delete
+                                */
+
                                 QScreen *screen = QGuiApplication::primaryScreen();
                                 QRect screenGeometry = screen->geometry();
                                 int screenWidth = screenGeometry.width();
@@ -132,61 +127,48 @@ void LoginWindow::on_btnLogin_clicked()
                                 int y = (screenHeight - windowHeight) / 2;
 
                                 // 移动窗口到居中位置
-                                mainWindow->move(x, y-10);
+                                mainWindow->move(x, y - 10);
                                 mainWindow->show();
                             }
                         }
                     }
                 } else {
                     QMessageBox::critical(nullptr, "网络请求错误",
-                                          QString("错误信息: %1\n错误代码: %2").arg(reply->errorString()).arg(reply->error()));
+                                          QString("错误信息: %1\n错误代码: %2")
+                                              .arg(reply->errorString())
+                                              .arg(reply->error()));
                 }
-            } catch (const std::exception& e) {
+            } catch (const std::exception &e) {
                 qDebug() << "Exception in response handling: " << e.what();
             }
-            reply->deleteLater(); });
-    }
-    catch (const std::exception &e)
-    {
+            reply->deleteLater();
+        });
+    } catch (const std::exception &e) {
         qDebug() << "Exception in request sending: " << e.what();
     }
 }
 
-void LoginWindow::mousePressEvent(QMouseEvent *event)
-{
-    if (event->button() == Qt::LeftButton)
-    {
+void LoginWindow::mousePressEvent(QMouseEvent *event) {
+    if (event->button() == Qt::LeftButton) {
         m_dragPosition = event->globalPos() - frameGeometry().topLeft();
         event->accept();
     }
 }
 
-void LoginWindow::mouseMoveEvent(QMouseEvent *event)
-{
-    if (event->buttons() & Qt::LeftButton)
-    {
+void LoginWindow::mouseMoveEvent(QMouseEvent *event) {
+    if (event->buttons() & Qt::LeftButton) {
         move(event->globalPos() - m_dragPosition);
         event->accept();
     }
 }
 
-void LoginWindow::on_btnClose_clicked()
-{
-    this->close();
-}
+void LoginWindow::on_btnClose_clicked() { this->close(); }
 
-void LoginWindow::on_btnMin_clicked()
-{
-    this->showMinimized();
-}
+void LoginWindow::on_btnMin_clicked() { this->showMinimized(); }
 
-void LoginWindow::on_username_activated(int index)
-{
-    qDebug() << index;
-}
+void LoginWindow::on_username_activated(int index) { qDebug() << index; }
 
-void LoginWindow::on_username_currentIndexChanged(int index)
-{
+void LoginWindow::on_username_currentIndexChanged(int index) {
     QString name = ui->username->currentText();
 
     QString pass = registryManager->getPasswordByUsername(name);

+ 34 - 62
loginwindow.cpp

@@ -1,27 +1,19 @@
 #include "loginwindow.h"
-#include "ui_loginwindow.h"
-#include "global.h"
 
+#include "global.h"
+#include "ui_loginwindow.h"
 
-LoginWindow::LoginWindow(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::LoginWindow),
-    manager(new QNetworkAccessManager(this))
-{
+LoginWindow::LoginWindow(QWidget *parent)
+    : QWidget(parent), ui(new Ui::LoginWindow), manager(new QNetworkAccessManager(this)) {
     ui->setupUi(this);
     ui->username->lineEdit()->setPlaceholderText("请输入用户名");
     // 设置窗口为无边框样式
     setWindowFlags(Qt::FramelessWindowHint);
 }
 
-LoginWindow::~LoginWindow()
-{
-    delete ui;
-}
-
-void LoginWindow::on_btnLogin_clicked()
-{
+LoginWindow::~LoginWindow() { delete ui; }
 
+void LoginWindow::on_btnLogin_clicked() {
     QString username = ui->username->currentText();
     QString password = ui->password->text();
     if (username.isEmpty() || password.isEmpty()) {
@@ -30,8 +22,7 @@ void LoginWindow::on_btnLogin_clicked()
         return;
     }
 
-
-    try{
+    try {
         // 构造请求数据
         QJsonObject jsonData;
         jsonData["username"] = username;
@@ -41,21 +32,21 @@ void LoginWindow::on_btnLogin_clicked()
 
         QUrl localUrl("login/pc");
 
-        QUrl fullUrl = g_url.resolved(localUrl);
+        QUrl fullUrl = apiBackendUrl.resolved(localUrl);
 
-        qDebug()<<"fullUrl"<<fullUrl;
+        qDebug() << "fullUrl" << fullUrl;
         // 构造请求
-        // QNetworkRequest request(QUrl("http://localhost:8000/api/v1/login/pc")); // 替换为实际的服务器接口地址
-        QNetworkRequest request(QUrl("http://localhost:8000/api/v1/login/pc")); // 替换为实际的服务器接口地址
+        // QNetworkRequest request(QUrl("http://localhost:8000/api/v1/login/pc")); //
+        // 替换为实际的服务器接口地址
+        QNetworkRequest request(
+            QUrl("http://localhost:8000/api/v1/login/pc"));  // 替换为实际的服务器接口地址
         request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
 
-
-
         // 发送 POST 请求
         QNetworkReply *reply = manager->post(request, data);
 
         // 处理响应
-        QObject::connect(reply, &QNetworkReply::finished, [reply,this]() {
+        QObject::connect(reply, &QNetworkReply::finished, [reply, this]() {
             try {
                 if (reply->error() == QNetworkReply::NoError) {
                     QByteArray responseData = reply->readAll();
@@ -71,35 +62,34 @@ void LoginWindow::on_btnLogin_clicked()
                                 // 使用指针动态分配内存
                                 QMessageBox *msgBox = new QMessageBox;
                                 msgBox->setAttribute(Qt::WA_TranslucentBackground, true);
-                                msgBox->setWindowTitle(""); // 清空窗口标题
+                                msgBox->setWindowTitle("");  // 清空窗口标题
                                 msgBox->setText("用户名或密码错误,请重试。");
-                                msgBox->setWindowFlags(msgBox->windowFlags() | Qt::FramelessWindowHint);
-                                msgBox->setStandardButtons(QMessageBox::NoButton); // 不设置标准按钮
+                                msgBox->setWindowFlags(msgBox->windowFlags() |
+                                                       Qt::FramelessWindowHint);
+                                msgBox->setStandardButtons(
+                                    QMessageBox::NoButton);  // 不设置标准按钮
 
                                 // 设置样式表
                                 msgBox->setStyleSheet(
-                                            "QMessageBox {"
-                                            "    border: none; /* 去除边框 */"
-                                            "}"
-                                            "QLabel {"
-                                            "    color: #a94442; /* 标签文字颜色 */"
-                                            "    background-color: transparent; /* 标签背景透明 */"
-                                            "    font-size: 20px; /* 设置字体大小,可根据需要调整 */"
-                                            "}"
-                                            "QPushButton {"
-                                            "    visibility: hidden; /* 隐藏按钮 */"
-                                            "}"
-                                            );
+                                    "QMessageBox {"
+                                    "    border: none; /* 去除边框 */"
+                                    "}"
+                                    "QLabel {"
+                                    "    color: #a94442; /* 标签文字颜色 */"
+                                    "    background-color: transparent; /* 标签背景透明 */"
+                                    "    font-size: 20px; /* 设置字体大小,可根据需要调整 */"
+                                    "}"
+                                    "QPushButton {"
+                                    "    visibility: hidden; /* 隐藏按钮 */"
+                                    "}");
 
                                 // 使用 QTimer 在 3 秒后自动关闭消息框
                                 QTimer::singleShot(1200, msgBox, [msgBox]() {
                                     msgBox->close();
-                                    delete msgBox; // 释放内存
+                                    delete msgBox;  // 释放内存
                                 });
                                 msgBox->show();
-                            }
-                            else if (code == 200) {
-
+                            } else if (code == 200) {
                                 // 如果登录成功 存储用户信息 关闭登录接口 打开主界面
                                 this->close();
                                 MainWindow *mainWindow = new MainWindow();
@@ -111,31 +101,13 @@ void LoginWindow::on_btnLogin_clicked()
                 } else {
                     qDebug() << "Error:" << reply->errorString();
                 }
-            } catch (const std::exception& e) {
+            } catch (const std::exception &e) {
                 qDebug() << "Exception in response handling: " << e.what();
             }
             reply->deleteLater();
         });
 
-    } catch (const std::exception& e) {
+    } catch (const std::exception &e) {
         qDebug() << "Exception in request sending: " << e.what();
     }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 }
-

+ 12 - 13
main.cpp

@@ -1,23 +1,22 @@
-#include "mainwindow.h"
-#include "loginwindow.h"
-#include "logger.h"
-#include "fireWidget/firingwidget.h"
 #include <QApplication>
 #include <QFile>
+#include <QQuickWindow>  // 关键头文件
 #include <QTextStream>
-#include <QQuickWindow> // 关键头文件
+
 #include "backendapimanager.h"
+#include "fireWidget/firingwidget.h"
+#include "logger.h"
+#include "loginwindow.h"
+#include "mainwindow.h"
 
-int main(int argc, char *argv[])
-{
+int main(int argc, char *argv[]) {
     QApplication app(argc, argv);
 
-    QQuickWindow::setSceneGraphBackend("software"); // 兼容性: 禁用GPU
+    QQuickWindow::setSceneGraphBackend("software");  // 兼容性: 禁用GPU
 
     // 加载 QSS 文件
     QFile styleFile(":/qss/qss/tableview.qss");
-    if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text))
-    {
+    if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
         QTextStream stream(&styleFile);
         QString styleSheet = stream.readAll();
         app.setStyleSheet(styleSheet);
@@ -32,11 +31,11 @@ int main(int argc, char *argv[])
     // logger
     Logger::getInstance("application.log");
 
-    Logger::getInstance().setMaxFileSize(2 * 1024 * 1024); // 2 MB
-    Logger::getInstance().setMaxBackupFiles(3);            // Keep 3 backup files
+    Logger::getInstance().setMaxFileSize(2 * 1024 * 1024);  // 2 MB
+    Logger::getInstance().setMaxBackupFiles(3);             // Keep 3 backup files
     Logger::getInstance().info("Application started from main.");
 
-    backendAPIManager::initialize(g_url.toString());
+    backendAPIManager::initialize(apiBackendUrl.toString());
 
     // MainWindow w;
     //  Page w;

+ 63 - 105
mainwindow.cpp

@@ -1,27 +1,29 @@
 #include "mainwindow.h"
-#include "ui_mainwindow.h"
-#include "jobs.h"
+
 #include <QDebug>
-#include <QWidget>
 #include <QPushButton>
-#include "logger.h"
+#include <QWidget>
+
+#include "global.h"
+#include "jobs.h"
 #include "loadingWidget.h"
+#include "logger.h"
+#include "ui_mainwindow.h"
 
 // 定义 ANzI 转义序列来设置颜色
 #define ANSI_COLOR_GREEN "\x1B[32m"
 #define ANSI_COLOR_RESET "\x1B[0m"
-#include <exception>
 #include <QMessageBox>
+#include <exception>
 
-MainWindow::MainWindow(QWidget *parent)
-    : QMainWindow(parent), ui(new Ui::MainWindow)
-{
-    try
-    {
+MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
+    try {
         // 去除窗口边界,设置为无边框窗口
         this->setWindowFlags(Qt::FramelessWindowHint);
-        this->setWindowState(Qt::WindowMaximized); // Maximizes the window
+        // this->setWindowState(Qt::WindowMaximized);  // Maximizes the window
+        this->setFixedSize(1024, 768);
         ui->setupUi(this);
+        LoadingWidget::init(ui->stackedWidget);
 
         initializeAnimate();
         initialMqttService();
@@ -34,13 +36,11 @@ MainWindow::MainWindow(QWidget *parent)
         pageFactories[ui->btnRecord] = new BlastRecordFactory();
 
         connect(ui->btnToggle, &QPushButton::clicked, this, &MainWindow::onToggleButtonClicked);
-        for (auto *widget : left_button_station)
-        {
+        for (auto *widget : left_button_station) {
             QPushButton *button = qobject_cast<QPushButton *>(widget);
-            if (button)
-            {
-                connect(button, &QPushButton::clicked, this, [this, button]
-                        { onButtonClicked(button); });
+            if (button) {
+                connect(button, &QPushButton::clicked, this,
+                        [this, button] { onButtonClicked(button); });
             }
         }
         initDateTime();
@@ -50,30 +50,23 @@ MainWindow::MainWindow(QWidget *parent)
         ui->labLon->setText("维度: " + lon);
         connect(ui->btnClose, &QPushButton::clicked, this, &MainWindow::close);
         connect(this, &MainWindow::projectTitleChanged, this, &MainWindow::updateProjectTitleLabel);
-    }
-    catch (const std::exception &ex)
-    {
+    } catch (const std::exception &ex) {
         Logger::getInstance().error(QString("Application crashed: %1").arg(ex.what()));
         QMessageBox::critical(this, "Error", QString("Application crashed: %1").arg(ex.what()));
-        throw; // rethrow to allow further handling if needed
-    }
-    catch (...)
-    {
+        throw;  // rethrow to allow further handling if needed
+    } catch (...) {
         Logger::getInstance().error("Application crashed: Unknown exception");
         QMessageBox::critical(this, "Error", "Application crashed: Unknown exception");
         throw;
     }
 }
 
-void MainWindow::updateProjectTitleLabel(const QString &newTitle)
-{
+void MainWindow::updateProjectTitleLabel(const QString &newTitle) {
     ui->projectTitleLable->setText(newTitle);
 }
 
-void MainWindow::setProjectTitle(const QString &newTitle)
-{
-    if (m_currentProjectTitle != newTitle)
-    {
+void MainWindow::setProjectTitle(const QString &newTitle) {
+    if (m_currentProjectTitle != newTitle) {
         m_currentProjectTitle = newTitle;
 
         // Emit the signal to notify listeners (like our QLabel slot)
@@ -81,49 +74,39 @@ void MainWindow::setProjectTitle(const QString &newTitle)
     }
 }
 
-void MainWindow::initializeAnimate()
-{
+void MainWindow::initializeAnimate() {
     move(200, 200);
     animate_leftFrame = new QPropertyAnimation(ui->leftFrame, "minimumWidth");
     animate_leftFrame->setDuration(300);
-    for (QObject *child : ui->left_buttonsBox->children())
-    {
-        if (qobject_cast<QWidget *>(child))
-        {
+    for (QObject *child : ui->left_buttonsBox->children()) {
+        if (qobject_cast<QWidget *>(child)) {
             left_button_station.append(qobject_cast<QWidget *>(child));
         }
     }
 }
 
-void MainWindow::onToggleButtonClicked()
-{
+void MainWindow::onToggleButtonClicked() {
     // 执行动画
     JOBS ::btn_animation(ui->leftFrame, animate_leftFrame);
-    for (QWidget *b : left_button_station)
-    {
+    for (QWidget *b : left_button_station) {
         b->setProperty("spread", !b->property("spread").toBool());
         b->setStyleSheet(b->styleSheet());
     }
 }
 
 // 选中按钮
-void MainWindow::onButtonClicked(QPushButton *button)
-{
+void MainWindow::onButtonClicked(QPushButton *button) {
     setStyleSheets(static_cast<QPushButton *>(button));
 
     switchPage(static_cast<QPushButton *>(button));
 }
 
-void MainWindow::switchPage(QWidget *button)
-{
-    LoadingWidget::showLoading(nullptr, "请稍等");
-    if (pageFactories.contains(button))
-    {
-
+void MainWindow::switchPage(QWidget *button) {
+    LoadingWidget::showLoading(this, "请稍等");
+    if (pageFactories.contains(button)) {
         PageFactory *factory = pageFactories[button];
 
-        if (createdPageByButton.contains(button))
-        {
+        if (createdPageByButton.contains(button)) {
             QWidget *existingPage = createdPageByButton[button];
             existingPage->hide();
             ui->stackedWidget->removeWidget(existingPage);
@@ -142,34 +125,28 @@ void MainWindow::switchPage(QWidget *button)
     LoadingWidget::hideLoading();
 }
 
-void MainWindow::initialMqttService()
-{
+void MainWindow::initialMqttService() {
     Logger::getInstance().info("Start init Mqtt server.");
     MqttClient *pcMqttInit = MqttClient::getInstance();
     QStringList topics = {"hxgc/topic", "hxgc/companycode/pro/P"};
-    pcMqttInit->connectToMqttBroker("114.55.233.194", 1883, "hxgc", "hxgc123456", "pcMqttInitY11", topics);
-    connect(pcMqttInit, &MqttClient::proMessageReceived, this, &MainWindow::messageAndTopicReceived);
+    pcMqttInit->connectToMqttBroker("114.55.233.194", 1883, "hxgc", "hxgc123456", mqttClientId,
+                                    topics);
+    connect(pcMqttInit, &MqttClient::proMessageReceived, this,
+            &MainWindow::messageAndTopicReceived);
     Logger::getInstance().info("Connect Mqtt server request sent.");
 }
 
-void MainWindow::messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic)
-{
+void MainWindow::messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic) {
     QJsonDocument jsonDoc = QJsonDocument::fromJson(message);
-    if (!jsonDoc.isNull() && jsonDoc.isObject())
-    {
+    if (!jsonDoc.isNull() && jsonDoc.isObject()) {
         QJsonObject jsonObj = jsonDoc.object();
-        if (jsonObj.contains("uuid") && jsonObj.contains("status"))
-        {
+        if (jsonObj.contains("uuid") && jsonObj.contains("status")) {
             QJsonValue uuidValue = jsonObj["uuid"];
             QJsonValue statusValue = jsonObj["status"];
-            if (statusValue.isString() && statusValue.toString() == "1")
-            { // "1" 未注册
-                if (uuidValue.isNull())
-                {
+            if (statusValue.isString() && statusValue.toString() == "1") {  // "1" 未注册
+                if (uuidValue.isNull()) {
                     qDebug() << "uuid 的值为 null";
-                }
-                else
-                {
+                } else {
                     QString uuid = uuidValue.toString();
                     HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
                     dao.updateBlastStatusByUuid(uuid, "2");
@@ -179,24 +156,20 @@ void MainWindow::messageAndTopicReceived(const QByteArray &message, const QMqttT
     }
 }
 
-void MainWindow::setStyleSheets(QPushButton *selectedButton)
-{
-    for (auto *b : left_button_station)
-    {
+void MainWindow::setStyleSheets(QPushButton *selectedButton) {
+    for (auto *b : left_button_station) {
         b->setProperty("selected", b == selectedButton);
-        b->setStyleSheet(b->styleSheet()); // 刷新显示
+        b->setStyleSheet(b->styleSheet());  // 刷新显示
     }
 }
 
 // 处理 MQTT 连接成功的槽函数
-void MainWindow::onMqttConnected()
-{
+void MainWindow::onMqttConnected() {
     m_isMqttConnected = true;
     Logger::getInstance().info("Mqtt connected.");
 }
 
-void MainWindow::initialBtnSerial()
-{
+void MainWindow::initialBtnSerial() {
     bool success;
     serialTool = SerialTool::getInstance(this, &success);
     connect(serialTool, &SerialTool::serialPortOpened, this, &MainWindow::onSerialToolCreated);
@@ -204,32 +177,26 @@ void MainWindow::initialBtnSerial()
     Logger::getInstance().info("Fire buttons initialized");
 }
 
-void MainWindow::onSerialToolCreated()
-{
+void MainWindow::onSerialToolCreated() {
     m_btnSerialInitialized = true;
     serialTool->releaseInstance();
     qDebug() << ANSI_COLOR_GREEN << "Serial tool initialized" << ANSI_COLOR_RESET;
     Logger::getInstance().info("SerialTool initialized");
 }
 
-void MainWindow::initialGPSSerial()
-{
+void MainWindow::initialGPSSerial() {
     Logger::getInstance().info("开始初始化GPS");
     SerialGPSThread *threadGPS = new SerialGPSThread(this);
-    connect(threadGPS, &SerialGPSThread::storedGNRMCDataUpdated, this, &MainWindow::handleStoredGNRMCData);
+    connect(threadGPS, &SerialGPSThread::storedGNRMCDataUpdated, this,
+            &MainWindow::handleStoredGNRMCData);
     threadGPS->start();
 }
 // 槽函数,用于接收 RMCData 数据
-void MainWindow::handleStoredGNRMCData(const RMCData &data)
-{
-
-    if (data.isValid)
-    {
+void MainWindow::handleStoredGNRMCData(const RMCData &data) {
+    if (data.isValid) {
         lat = QString::number(data.latitude);
         lon = QString::number(data.longitude);
-    }
-    else
-    {
+    } else {
         lat = "定位失败";
         lon = "定位失败";
     }
@@ -239,36 +206,27 @@ void MainWindow::handleStoredGNRMCData(const RMCData &data)
     labLat = lat;
     labLon = lon;
 }
-void MainWindow::initDateTime()
-{
+void MainWindow::initDateTime() {
     timeThread = new TimeUpdateThread(this);
     connect(timeThread, &TimeUpdateThread::timeUpdated, this, &MainWindow::onTimeUpdated);
     timeThread->start();
 }
-void MainWindow::onTimeUpdated(const QString &timeString)
-{
-    ui->dateTimeShow->setText(timeString);
-}
+void MainWindow::onTimeUpdated(const QString &timeString) { ui->dateTimeShow->setText(timeString); }
 
-MainWindow::~MainWindow()
-{
+MainWindow::~MainWindow() {
     timeThread->stop();
     delete ui;
 }
 
-void MainWindow::mousePressEvent(QMouseEvent *event)
-{
-    if (event->button() == Qt::LeftButton)
-    {
+void MainWindow::mousePressEvent(QMouseEvent *event) {
+    if (event->button() == Qt::LeftButton) {
         m_dragPosition = event->globalPos() - frameGeometry().topLeft();
         event->accept();
     }
 }
 
-void MainWindow::mouseMoveEvent(QMouseEvent *event)
-{
-    if (event->buttons() & Qt::LeftButton)
-    {
+void MainWindow::mouseMoveEvent(QMouseEvent *event) {
+    if (event->buttons() & Qt::LeftButton) {
         move(event->globalPos() - m_dragPosition);
         event->accept();
     }

+ 57 - 71
mqtt/mqttclient.cpp

@@ -1,45 +1,37 @@
 #include "mqttclient.h"
+
 #include <QJsonDocument>
 #include <QJsonObject>
-#include "../logger.h"
 #include <QMessageBox>
 
+#include "../logger.h"
+
 MqttClient *MqttClient::instance = nullptr;
 
-MqttClient::MqttClient(QObject *parent)
-    : QObject(parent), mqClient(new QMqttClient(this))
-{
+MqttClient::MqttClient(QObject *parent) : QObject(parent), mqClient(new QMqttClient(this)) {
     // 连接信号和槽
     connect(mqClient, &QMqttClient::connected, this, &MqttClient::onConnected);
-    // connect(mqClient, &QMqttClient::disconnected, this, &MqttClient::onDisconnected);
+    // TODO: connect(mqClient, &QMqttClient::disconnected, this, &MqttClient::onDisconnected);
     connect(mqClient, &QMqttClient::stateChanged, this, &MqttClient::onStateChanged);
     connect(mqClient, &QMqttClient::errorChanged, this, &MqttClient::onError);
     connect(mqClient, &QMqttClient::messageReceived, this, &MqttClient::onMessageReceived);
-
-    connect(mqClient, &QMqttClient::errorChanged, this, [this](QMqttClient::ClientError error)
-            { Logger::getInstance().error(QString("MQTT error: %1").arg(error)); });
+    connect(mqClient, &QMqttClient::errorChanged, this, [this](QMqttClient::ClientError error) {
+        Logger::getInstance().error(QString("MQTT client occured error: %1").arg(error));
+    });
 
     connect(mqClient, &QMqttClient::connected, this, &MqttClient::connected);
 }
 
 // 单例模式
-MqttClient *MqttClient::getInstance()
-{
-    if (instance == nullptr)
-    {
+MqttClient *MqttClient::getInstance() {
+    if (instance == nullptr) {
         instance = new MqttClient();
     }
     return instance;
 }
 
-MqttClient *MqttClient::createNewInstance()
-{
-    return new MqttClient();
-}
-void MqttClient::connectToMqttBroker()
-{
-    qDebug() << "MQTT 1511: ";
-
+MqttClient *MqttClient::createNewInstance() { return new MqttClient(); }
+void MqttClient::connectToMqttBroker() {
     mqClient->setHostname("114.55.233.194");
     mqClient->setPort(1883);
 
@@ -52,8 +44,9 @@ void MqttClient::connectToMqttBroker()
     mqClient->connectToHost();
 }
 
-void MqttClient::connectToMqttBroker(const QString &hostname, quint16 port, const QString &username, const QString &password, const QString &clientId, const QStringList &topicsToSubscribe)
-{
+void MqttClient::connectToMqttBroker(const QString &hostname, quint16 port, const QString &username,
+                                     const QString &password, const QString &clientId,
+                                     const QStringList &topicsToSubscribe) {
     mqClient->setHostname(hostname);
     mqClient->setPort(port);
 
@@ -67,77 +60,70 @@ void MqttClient::connectToMqttBroker(const QString &hostname, quint16 port, cons
     // 保存要订阅的主题列表
     m_subscribeTopics = topicsToSubscribe;
 }
-void MqttClient::onConnected()
-{
+void MqttClient::onConnected() {
     Logger::getInstance().debug("MQTT conncted");
     subscribeToTopics(m_subscribeTopics);
 }
 
-void MqttClient::subscribeToTopics(const QStringList &topics)
-{
-    for (const auto &topic : topics)
-    {
+void MqttClient::subscribeToTopics(const QStringList &topics) {
+    for (const auto &topic : topics) {
         subscribeToTopic(topic);
     }
 }
 
-void MqttClient::subscribeToTopic(const QString &topic)
-{
+void MqttClient::subscribeToTopic(const QString &topic) { mqClient->subscribe(topic); }
 
-    mqClient->subscribe(topic);
-}
-
-void MqttClient::sendMessage(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg)
-{
-    if (mqClient->state() == QMqttClient::Connected)
-    {
+void MqttClient::sendMessage(const QString &topic, const QByteArray &message, quint8 qos,
+                             bool isRetainedMsg) {
+    if (mqClient->state() == QMqttClient::Connected) {
         auto pub = mqClient->publish(QMqttTopicName(topic), message, qos, isRetainedMsg);
         if (pub == -1)
-            qDebug() << "Could not publish message";
+            Logger::getInstance().error(
+                QString(
+                    "MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
+                    .arg(topic, QString(message), QString::number(qos),
+                         isRetainedMsg ? "true" : "false"));
         else
-            qDebug() << "Message published" << message;
-    }
-    else
-    {
+            Logger::getInstance().info(
+                QString(
+                    "MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
+                    .arg(topic, QString(message), QString::number(qos),
+                         isRetainedMsg ? "true" : "false"));
+    } else {
         qDebug() << "Not connected to MQTT server";
+        Logger::getInstance().error(
+            QString("MQTT client is not connected to the server. topic: %1, msg: %2")
+                .arg(topic, QString(message)));
     }
 }
 
-void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic)
-{
-    if (topic.name() == "hxgc/companycode/pro/P")
-    {
+void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic) {
+    if (topic.name() == "hxgc/companycode/pro/P") {
         emit proMessageReceived(message, topic);
-    }
-    else
-    {
+    } else {
         emit messageAndTopicReceived(message, topic);
     }
 }
 
-void MqttClient::onStateChanged(QMqttClient::ClientState state)
-{
-    switch (state)
-    {
-    case QMqttClient::ClientState::Disconnected:
-        QMessageBox::information(nullptr, "提示", "MQTT连接已断开,请重新登录");
-        qDebug() << "MQTT 客户端状态: 断开连接";
-        Logger::getInstance().info("Start init Mqtt server.");
-        break;
-    case QMqttClient::ClientState::Connecting:
-        qDebug() << "MQTT 客户端状态: 正在连接";
-        break;
-    case QMqttClient::ClientState::Connected:
-        qDebug() << "MQTT 客户端状态: 已连接";
-        break;
-    default:
-        qDebug() << "MQTT 客户端状态: 未知状态";
-        break;
+void MqttClient::onStateChanged(QMqttClient::ClientState state) {
+    switch (state) {
+        case QMqttClient::ClientState::Disconnected:
+            QMessageBox::warning(nullptr, "提示", "mqtt连接已断开,请重新登录");
+            Logger::getInstance().info("Start init Mqtt server.");
+            break;
+        case QMqttClient::ClientState::Connecting:
+            qDebug() << "MQTT 客户端状态: 正在连接";
+            break;
+        case QMqttClient::ClientState::Connected:
+            qDebug() << "MQTT 客户端状态: 已连接";
+            break;
+        default:
+            qDebug() << "MQTT 客户端状态: 未知状态";
+            break;
     }
 }
 
-void MqttClient::onError(QMqttClient::ClientError error)
-{
-
+void MqttClient::onError(QMqttClient::ClientError error) {
     qDebug() << "MQTT 错误: " << error;
-}
+    Logger::getInstance().error(QString("MQTT client error: %1").arg(error));
+}

+ 14 - 12
mqtt/mqttclient.h

@@ -1,30 +1,32 @@
 #ifndef MQTTCLIENT_H
 #define MQTTCLIENT_H
 
-#include <QObject>
 #include <QtMqtt/qmqttclient.h>
 #include <QtMqtt/qmqttmessage.h>
 
-class MqttClient : public QObject
-{
+#include <QObject>
+
+class MqttClient : public QObject {
     Q_OBJECT
 
-public:
-    static MqttClient *getInstance(); // 静态成员函数,用于获取单例实例
+   public:
+    static MqttClient *getInstance();  // 静态成员函数,用于获取单例实例
     static MqttClient *createNewInstance();
     explicit MqttClient(QObject *parent = nullptr);
     void subscribeToTopic(const QString &topic);
-    void sendMessage(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg);
+    void sendMessage(const QString &topic, const QByteArray &message, quint8 qos,
+                     bool isRetainedMsg);
     void onMessageReceived(const QByteArray &message, const QMqttTopicName &topic);
     void connectToMqttBroker(const QString &hostname, quint16 port, const QString &username,
-                             const QString &password, const QString &clientId, const QStringList &topicsToSubscribe);
+                             const QString &password, const QString &clientId,
+                             const QStringList &topicsToSubscribe);
     void subscribeToTopics(const QStringList &topics);
     void connectToMqttBroker();
-signals:
+   signals:
     void connected();
     void messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic);
     void proMessageReceived(const QByteArray &message, const QMqttTopicName &topic);
-private slots:
+   private slots:
 
     void onConnected();
     // void onDisconnected();
@@ -32,9 +34,9 @@ private slots:
     void onError(QMqttClient::ClientError error);
     // void onMessageReceived(const QByteArray &message, const QMqttTopicName &topic);
 
-private:
-    static MqttClient *instance; // 静态成员变量,用于保存单例实例
+   private:
+    static MqttClient *instance;  // 静态成员变量,用于保存单例实例
     QMqttClient *mqClient;
     QStringList m_subscribeTopics;
 };
-#endif // MQTTCLIENT_H
+#endif  // MQTTCLIENT_H

+ 22 - 27
mqttthread.cpp

@@ -1,24 +1,22 @@
 #include "mqttthread.h"
+
+#include "./mqtt/mqttclient.h"  // 假设 MqttClient 类的头文件是 mqttclient.h
 #include "logger.h"
-#include "./mqtt/mqttclient.h" // 假设 MqttClient 类的头文件是 mqttclient.h
 
-MqttThread::MqttThread(QObject *parent) : QThread(parent)
-{
-}
+MqttThread::MqttThread(QObject *parent) : QThread(parent) {}
 
-MqttThread::~MqttThread()
-{
+MqttThread::~MqttThread() {
     m_stopFlag = true;
     quit();
     wait();
-    if (mqttClient)
-    {
+    if (mqttClient) {
         delete mqttClient;
     }
 }
 
-void MqttThread::setConnectionInfo(const QString &hostname, quint16 port, const QString &username, const QString &password, const QString &clientId, const QStringList &topicsToSubscribe)
-{
+void MqttThread::setConnectionInfo(const QString &hostname, quint16 port, const QString &username,
+                                   const QString &password, const QString &clientId,
+                                   const QStringList &topicsToSubscribe) {
     m_hostname = hostname;
     m_port = port;
     m_username = username;
@@ -27,37 +25,34 @@ void MqttThread::setConnectionInfo(const QString &hostname, quint16 port, const
     m_topicsToSubscribe = topicsToSubscribe;
 }
 
-MqttClient *MqttThread::getMqttClient() const
-{
-    return mqttClient;
-}
+MqttClient *MqttThread::getMqttClient() const { return mqttClient; }
 
-void MqttThread::stopThread()
-{
+void MqttThread::stopThread() {
     m_stopFlag = true;
     quit();
 }
 
-void MqttThread::run()
-{
+void MqttThread::run() {
     // mqttClient = new MqttClient();
     mqttClient = MqttClient::createNewInstance();
-    mqttClient->connectToMqttBroker(m_hostname, m_port, m_username, m_password, m_clientId, m_topicsToSubscribe);
+    mqttClient->connectToMqttBroker(m_hostname, m_port, m_username, m_password, m_clientId,
+                                    m_topicsToSubscribe);
 
     connect(mqttClient, &MqttClient::connected, this, &MqttThread::mqttConnected);
-    connect(mqttClient, &MqttClient::messageAndTopicReceived, this, &MqttThread::messageAndTopicReceived);
+    connect(mqttClient, &MqttClient::messageAndTopicReceived, this,
+            &MqttThread::messageAndTopicReceived);
     connect(this, &MqttThread::sendMessageRequested, mqttClient, &MqttClient::sendMessage);
-    while (!m_stopFlag)
-    {
+    while (!m_stopFlag) {
         exec();
     }
 }
 
-void MqttThread::sendMqttMessage(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg)
-{
-    if (mqttClient)
-    {
-        Logger::getInstance().info(QString("发送MQTT消息到主题: %1, 消息: %2, qos: %3, isRetainMsg: %4").arg(topic, QString(message), qos, isRetainedMsg ? "true" : "false"));
+void MqttThread::sendMqttMessage(const QString &topic, const QByteArray &message, quint8 qos,
+                                 bool isRetainedMsg) {
+    if (mqttClient) {
+        Logger::getInstance().info(
+            QString("Mqtt thread 发送MQTT消息到主题: %1, 消息: %2, qos: %3, isRetainMsg: %4")
+                .arg(topic, QString(message), qos, isRetainedMsg ? "true" : "false"));
         mqttClient->sendMessage(topic, message, qos, isRetainedMsg);
     }
 }

+ 0 - 1
qss/tableview.qss

@@ -30,7 +30,6 @@ QHeaderView::section {
     font-weight: bold;
     color: white;
     height: 34px; /* 表头高度 */
-    resize-mode: Stretch; /* 表头自适应拉伸 */
 }
 
 /* 交替行样式 */

+ 11 - 21
serial/serialgps.cpp

@@ -1,14 +1,12 @@
 #include "serialgps.h"
 
-SerialGPS::SerialGPS(QObject *parent) : QObject(parent)
-{
-    setupSerialPort();
-}
+#include "../global.h"
+
+SerialGPS::SerialGPS(QObject *parent) : QObject(parent) { setupSerialPort(); }
 
 // 打开串口的函数
-void SerialGPS::openSerialPort()
-{
-    const QString portName = "COM3";
+void SerialGPS::openSerialPort() {
+    const QString portName = gpsPort;
     const qint32 baudRate = 9600;
 
     if (!serialPort.isOpen()) {
@@ -22,39 +20,31 @@ void SerialGPS::openSerialPort()
 }
 
 // 关闭串口的函数
-void SerialGPS::closeSerialPort()
-{
+void SerialGPS::closeSerialPort() {
     if (serialPort.isOpen()) {
         serialPort.close();
     }
 }
 
-
-void SerialGPS::sendData()
-{
+void SerialGPS::sendData() {
     if (serialPort.isOpen()) {
         // serialPort.write(data.toUtf8());
     }
 }
 
-void SerialGPS::readData()
-{
+void SerialGPS::readData() {
     QByteArray data = serialPort.readAll();
     emit dataReceived(data);
     PareGNRMC parser;
     RMCData m_data = parser.parseRMC(data);
     storedGNRMCData = m_data;
     emit gnrmcDataReceived(storedGNRMCData);
-    emit storedGNRMCDataUpdated(storedGNRMCData); // 发出信号
+    emit storedGNRMCDataUpdated(storedGNRMCData);  // 发出信号
 }
 
-RMCData SerialGPS::getStoredGNRMCData() const
-{
-    return storedGNRMCData;
-}
+RMCData SerialGPS::getStoredGNRMCData() const { return storedGNRMCData; }
 
-void SerialGPS::setupSerialPort()
-{
+void SerialGPS::setupSerialPort() {
     openSerialPort();
     connect(&serialPort, &QSerialPort::readyRead, this, &SerialGPS::readData);
 }

+ 32 - 68
serial/serialtool.cpp

@@ -1,65 +1,53 @@
 #include "SerialTool.h"
+
 #include <QDebug>
+
+#include "../global.h"
 #include "../logger.h"
 
 // 定义静态成员变量并初始化为 nullptr
 SerialTool *SerialTool::instance = nullptr;
 QMutex SerialTool::globalMutex;
-SerialTool::SerialTool(QObject *parent) : QObject(parent)
-{
-}
-SerialTool::~SerialTool()
-{
-    if (serialPort.isOpen())
-    {
+SerialTool::SerialTool(QObject *parent) : QObject(parent) {}
+SerialTool::~SerialTool() {
+    if (serialPort.isOpen()) {
         serialPort.close();
     }
 }
 
-SerialTool *SerialTool::getInstance(QObject *parent, bool *success)
-{
-
-    if (instance == nullptr)
-    {
+SerialTool *SerialTool::getInstance(QObject *parent, bool *success) {
+    if (instance == nullptr) {
         instance = new SerialTool(parent);
     }
-    if (instance->isInUse)
-    {
-        if (success)
-        {
+    if (instance->isInUse) {
+        if (success) {
             *success = false;
         }
         return nullptr;
     }
     instance->isInUse = true;
-    if (success)
-    {
+    if (success) {
         *success = true;
     }
     //    globalMutex.unlock();
     return instance;
 }
 // 打开串口的函数
-void SerialTool::openSerialPort()
-{
-    const QString portName = "COM1";
+void SerialTool::openSerialPort() {
+    const QString portName = firewidgetPort;
     const qint32 baudRate = 9600;
 
-    if (!serialPort.isOpen())
-    {
+    if (!serialPort.isOpen()) {
         serialPort.setPortName(portName);
         serialPort.setBaudRate(baudRate);
 
         serialPort.setDataBits(QSerialPort::Data8);
         serialPort.setStopBits(QSerialPort::OneStop);
         serialPort.setParity(QSerialPort::NoParity);
-        if (serialPort.open(QIODevice::ReadWrite))
-        {
+        if (serialPort.open(QIODevice::ReadWrite)) {
             Logger::getInstance().info(QString("串口 %1 打开成功").arg(portName));
-            emit serialPortOpened(); // 发射新信号
-        }
-        else
-        {
+            emit serialPortOpened();  // 发射新信号
+        } else {
             Logger::getInstance().error(QString("串口 %1 打开错误").arg(portName));
             emit openError();
         }
@@ -67,79 +55,55 @@ void SerialTool::openSerialPort()
 }
 
 // 关闭串口的函数
-void SerialTool::closeSerialPort()
-{
-    if (serialPort.isOpen())
-    {
+void SerialTool::closeSerialPort() {
+    if (serialPort.isOpen()) {
         serialPort.close();
         emit openCloseButtonTextChanged("打开串口");
     }
 }
 
-bool SerialTool::sendData(const QByteArray &data)
-{
-    if (serialPort.isOpen())
-    {
+bool SerialTool::sendData(const QByteArray &data) {
+    if (serialPort.isOpen()) {
         qint64 bytesWritten = serialPort.write(data);
         return bytesWritten == data.size();
     }
     return false;
 }
 
-void SerialTool::handleSendDataReques(const QByteArray &data)
-{
-    sendData(data);
-}
+void SerialTool::handleSendDataReques(const QByteArray &data) { sendData(data); }
 
-void SerialTool::readData()
-{
+void SerialTool::readData() {
     QByteArray newData = serialPort.readAll();
     buffer.append(newData);
 
     int startIndex = buffer.indexOf("\r\n");
-    while (startIndex != -1)
-    {
+    while (startIndex != -1) {
         int endIndex = buffer.indexOf("\r\n", startIndex + 2);
-        if (endIndex != -1)
-        {
+        if (endIndex != -1) {
             QByteArray command = buffer.mid(startIndex + 2, endIndex - startIndex - 2);
             emit dataReceived(newData);
             // 根据 command 的值发射相应的信号
-            if (command == "BUTTON_DISABLED")
-            {
+            if (command == "BUTTON_DISABLED") {
                 emit disableButtonReceived();
-            }
-            else if (command == "BUTTON_PRESSED")
-            {
+            } else if (command == "BUTTON_PRESSED") {
                 emit buttonPressedReceived();
-            }
-            else if (command == "BUTTON_ENABLE")
-            {
+            } else if (command == "BUTTON_ENABLE") {
                 emit enableButtonReceived();
             }
 
             buffer = buffer.mid(endIndex + 2);
-        }
-        else
-        {
+        } else {
             break;
         }
         startIndex = buffer.indexOf("\r\n");
     }
 }
 
-void SerialTool::setupSerialPort()
-{
+void SerialTool::setupSerialPort() {
     openSerialPort();
     connect(&serialPort, &QSerialPort::readyRead, this, &SerialTool::readData);
 }
 
-void SerialTool::releaseInstance()
-{
-    isInUse = false;
-}
+void SerialTool::releaseInstance() { isInUse = false; }
 
-bool SerialTool::getIsInUse()
-{
-    return isInUse;
-}
+bool SerialTool::getIsInUse() { return isInUse; }

+ 12 - 28
serialtool.cpp

@@ -1,29 +1,24 @@
 #include "SerialTool.h"
+
 #include <QDebug>
 
 // 定义静态成员变量并初始化为 nullptr
 SerialTool* SerialTool::instance = nullptr;
-SerialTool::SerialTool(QObject *parent) : QObject(parent)
-{
-
-}
-SerialTool::~SerialTool()
-{
+SerialTool::SerialTool(QObject* parent) : QObject(parent) {}
+SerialTool::~SerialTool() {
     if (serialPort.isOpen()) {
         serialPort.close();
     }
 }
 
-SerialTool* SerialTool::getInstance(QObject *parent)
-{
+SerialTool* SerialTool::getInstance(QObject* parent) {
     if (instance == nullptr) {
         instance = new SerialTool(parent);
     }
     return instance;
 }
 // 打开串口的函数
-void SerialTool::openSerialPort()
-{
+void SerialTool::openSerialPort() {
     const QString portName = "COM8";
     const qint32 baudRate = 9600;
 
@@ -43,7 +38,7 @@ void SerialTool::openSerialPort()
         if (serialPort.open(QIODevice::ReadWrite)) {
             qDebug() << "serialPortOpened";
 
-            emit serialPortOpened(); // 发射新信号
+            emit serialPortOpened();  // 发射新信号
         } else {
             qDebug() << "Failed to open serial port:" << serialPort.errorString();
             emit openError();
@@ -52,16 +47,14 @@ void SerialTool::openSerialPort()
 }
 
 // 关闭串口的函数
-void SerialTool::closeSerialPort()
-{
+void SerialTool::closeSerialPort() {
     if (serialPort.isOpen()) {
         serialPort.close();
         emit openCloseButtonTextChanged("打开串口");
     }
 }
 
-bool SerialTool::sendData(const QByteArray& data)
-{
+bool SerialTool::sendData(const QByteArray& data) {
     if (serialPort.isOpen()) {
         qint64 bytesWritten = serialPort.write(data);
         return bytesWritten == data.size();
@@ -69,13 +62,9 @@ bool SerialTool::sendData(const QByteArray& data)
     return false;
 }
 
-void SerialTool::handleSendDataReques(const QByteArray &data)
-{
-    sendData(data);
-}
+void SerialTool::handleSendDataReques(const QByteArray& data) { sendData(data); }
 
-void SerialTool::readData()
-{
+void SerialTool::readData() {
     QByteArray newData = serialPort.readAll();
     buffer.append(newData);
 
@@ -97,17 +86,12 @@ void SerialTool::readData()
         startIndex = buffer.indexOf("\\r\\n");
     }
 
-
     qDebug() << "Received data:" << newData;
 }
 
-
-void SerialTool::setupSerialPort()
-{
+void SerialTool::setupSerialPort() {
     openSerialPort();
     // openCloseSerialPort();
-     qDebug() << "Received data:";
+    qDebug() << "Received data:";
     connect(&serialPort, &QSerialPort::readyRead, this, &SerialTool::readData);
 }
-
-

Some files were not shown because too many files changed in this diff