Bladeren bron

optmize firing process

Yao 1 maand geleden
bovenliggende
commit
38b77f420f
9 gewijzigde bestanden met toevoegingen van 95 en 29 verwijderingen
  1. 4 1
      blastProject/blastprojectpage.cpp
  2. 11 5
      blastProject/hprojectdao.cpp
  3. 27 8
      blastopepage.cpp
  4. 6 8
      fireWidget/firingwidget.cpp
  5. 2 0
      global.cpp
  6. 2 1
      global.h
  7. 21 4
      mainwindow.cpp
  8. 1 0
      mainwindow.h
  9. 21 2
      mqtt/mqttclient.cpp

+ 4 - 1
blastProject/blastprojectpage.cpp

@@ -33,7 +33,10 @@ BlastProjectPage::BlastProjectPage(QWidget *parent)
     connect(dialog, &ProjectDialog::validateDetNumUpdate, this, &BlastProjectPage::updateProject);
 }
 
-void BlastProjectPage::RefreshData() { loadDataFromSource(currentPage, pageSize); }
+void BlastProjectPage::RefreshData() {
+    loadDataFromSource(currentPage, pageSize);
+    publishAllPendingBlastProjects();
+}
 
 void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) {
     PaginatedHProjectResult result = dao.getAllHProjects(currentPage, pageSize);

+ 11 - 5
blastProject/hprojectdao.cpp

@@ -107,8 +107,9 @@ bool HProjectDao::updateHProject(const HProject &project) {
 
 bool HProjectDao::deleteHProject(const HProject &project) {
     QSqlQuery query;
-    query.prepare("DELETE FROM h_project WHERE id = :id");
+    query.prepare("update h_project set deletion_date = :deletionDate WHERE id = :id");
     query.bindValue(":id", project.getId());
+    query.bindValue(":deletionDate", QDateTime::currentDateTime());
     if (!query.exec()) {
         return false;
     }
@@ -130,7 +131,8 @@ PaginatedHProjectResult HProjectDao::getAllHProjects(int page, int pageSize) {
     QList<QSharedPointer<HProject>> projects;
     QSqlQuery query(database);
     int offset = (page - 1) * pageSize;
-    query.prepare("SELECT * FROM h_project ORDER BY created_at desc LIMIT :pageSize OFFSET :offset");
+    query.prepare(
+        "SELECT * FROM h_project WHERE deletion_date IS NULL ORDER BY created_at desc LIMIT :pageSize OFFSET :offset");
     query.bindValue(":pageSize", pageSize);
     query.bindValue(":offset", offset);
 
@@ -155,7 +157,8 @@ PaginatedHProjectResult HProjectDao::getAllHProjectsByOpera(int page, int pageSi
     QSqlQuery query(database);
     int offset = (page - 1) * pageSize;
     query.prepare(
-        "SELECT * FROM h_project WHERE blast_status = :safeCheckedStatus ORDER BY created_at desc "
+        "SELECT * FROM h_project WHERE blast_status = :safeCheckedStatus and deletion_date IS NULL ORDER BY created_at "
+        "desc "
         "LIMIT :pageSize OFFSET :offset");
     query.bindValue(":safeCheckedStatus", BlastStatus::SafeChecked);
     query.bindValue(":pageSize", pageSize);
@@ -216,10 +219,13 @@ QList<QSharedPointer<HProject>> HProjectDao::getRegistedProjectByAddressUuid(QLi
     return projects;
 }
 
+// get all registered projects
 QList<QSharedPointer<HProject>> HProjectDao::getAllHProjectsReg() {
     QList<QSharedPointer<HProject>> projects;
     QSqlQuery query(database);
-    query.prepare("SELECT * FROM h_project WHERE blast_status =1 ORDER BY created_at ");
+    query.prepare(
+        QString("SELECT * FROM h_project WHERE blast_status = %1 and deletion_date is null ORDER BY created_at ")
+            .arg(BlastStatus::Created));
     // 执行查询并打印SQL
     if (query.exec()) {
         while (query.next()) {
@@ -237,7 +243,7 @@ bool HProjectDao::updateBlastStatusByUuid(const QString &uuid, const QString &bl
     query.prepare(
         "UPDATE h_project SET "
         "blast_status = :blastStatus "
-        "WHERE uuid = :uuid");
+        "WHERE uuid = :uuid and blast_status != :blastStatus");
     query.bindValue(":uuid", uuid);
     query.bindValue(":blastStatus", blastStatus);
 

+ 27 - 8
blastopepage.cpp

@@ -20,9 +20,13 @@ const int ColIndexUuid = 10;
 BlastOpePage::BlastOpePage(QWidget *parent)
     : QWidget(parent), ui(new Ui::BlastOpePage), dao(DatabaseManager::getInstance().getDatabase()) {
     QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
-    // InitFace();
-    ui->setupUi(this);
-    initPagination();
+    if (isFaceVerificationEnabled) {
+        InitFace();
+
+    } else {
+        ui->setupUi(this);
+        initPagination();
+    }
 }
 
 void BlastOpePage::showCountDownWidget(QString uuid, const QString &topic, const QString &message) {
@@ -473,14 +477,18 @@ void BlastOpePage::updateProgressBar(int firingStage, int row) {
                 progressBar3->setRange(0, 100);  // 设置范围为0到100
                 progressBar3->setValue(100);
                 break;
-            default:
+            case FiringStages::CancelConfirmed:
+                progressBar1->setRange(0, 100);  // 设置范围为0到100
                 progressBar1->setValue(0);
+                progressBar2->setRange(0, 100);  // 设置范围为0到100
                 progressBar2->setValue(0);
+                progressBar3->setRange(0, 100);  // 设置范围为0到100
                 progressBar3->setValue(0);
                 break;
+            default:
+                break;
         }
     }
-    qDebug() << "3333updateProgressBar: firingStage = " << firingStage << ", row = " << row;
 }
 
 // update tableView's fields about firing stage
@@ -535,9 +543,14 @@ void BlastOpePage::onFiringStageUpdated(int stage, int row) {
                 customColor = QColor("#8e620");
                 model->setData(firingStatusItem, customColor, Qt::ForegroundRole);
                 break;
+            case FiringStages::CancelConfirmed:
+                model->setData(firingStatusItem, "已取消");
+                customColor = QColor("#893c3c");
+                model->setData(firingStatusItem, customColor, Qt::ForegroundRole);
+                break;
             case FiringStages::ForceCanceled:
                 model->setData(firingStatusItem, "已强制取消");
-                customColor = QColor("#ff0000");
+                customColor = QColor("#893c3c");
                 model->setData(firingStatusItem, customColor, Qt::ForegroundRole);
                 break;
             default:
@@ -604,6 +617,10 @@ void BlastOpePage::handleSingleBlastButtonClicked(int row, QPushButton *button)
         if (widget) {
             widget->sendCancelFiringMsg();
         }
+    } else {
+        Logger::getInstance().error(
+            QString("handleSingleBlastButtonClicked: unknown button text %1").arg(button->text()));
+        return;
     }
 }
 
@@ -622,8 +639,8 @@ void BlastOpePage::handleUpdateOpButton(int stage, int row) {
 
     switch (stage) {
         case FiringStages::CancelConfirmed:
-            button->setEnabled(true);
-            button->setText(startBlastButtonTxt);
+            button->setDisabled(true);
+            button->setText(reStartButtonTxt);
             break;
         case FiringStages::Starting:
             button->setDisabled(true);
@@ -677,6 +694,8 @@ void BlastOpePage::handleUpdateOpButton(int stage, int row) {
 
 void BlastOpePage::handlerUpdateProjectStatus(QString uuid, const QString &newStatus) {
     dao.updateBlastStatusByUuid(uuid, newStatus);
+
+    firingWidget *widget = firingWidgetByUuid.value(uuid);
 }
 
 void BlastOpePage::destroyFiringWidget(const QString &uuid, int row) {

+ 6 - 8
fireWidget/firingwidget.cpp

@@ -68,7 +68,6 @@ void firingWidget::sendMqttMessage(const QString &topic, const QByteArray &messa
         QMessageBox::warning(nullptr, "MQTT未连接", "MQTT未连接, 无法发送消息: " + topic + ", " + message);
         Logger::getInstance().error("MQTT未连接, 无法发送消息" + topic + ", " + message);
     }
-    qDebug() << ANSI_COLOR_GREEN << "XXXy Sending MQTT message to topic:" << topic << "with message:" << message;
 }
 
 void firingWidget::startBlasting() {
@@ -87,7 +86,9 @@ void firingWidget::checkBlasterConnection() {
     connect(m_subscription, &QMqttSubscription::messageReceived, this,
             [&]() { m_lastMsgTime = QDateTime::currentDateTime(); });
     connect(m_connectionCheckTimer, &QTimer::timeout, this, [this]() {
-        if (m_lastStage == FiringStages::CancelConfirmed || m_lastStage == FiringStages::BlastFinished) {
+        if (m_lastStage == FiringStages::CancelConfirmed || m_lastStage == FiringStages::BlastFinished ||
+            m_lastStage == FiringStages::ForceCanceled) {
+            m_connectionCheckTimer->stop();
             return;
         }
         if (m_lastMsgTime.secsTo(QDateTime::currentDateTime()) > 3) {
@@ -96,7 +97,7 @@ void firingWidget::checkBlasterConnection() {
             msgBox.setWindowTitle("起爆检测测试错误");
             msgBox.setText("超时未收到爆破器消息,是否继续等待");
             QPushButton *yesButton = msgBox.addButton("继续等待", QMessageBox::YesRole);
-            QPushButton *noButton = msgBox.addButton("取消", QMessageBox::NoRole);
+            QPushButton *noButton = msgBox.addButton("强制取消", QMessageBox::NoRole);
             yesButton->setStyleSheet(
                 "QPushButton { background-color:rgb(5, 58, 156); color: white; padding: 5px 15px; "
                 "border-radius: 4px; }");
@@ -108,12 +109,9 @@ void firingWidget::checkBlasterConnection() {
                 emit lastStageChanged(FiringStages::ForceCanceled);
                 return;
             }
-            m_connectionCheckTimer->start(1000);
+            m_connectionCheckTimer->start(5000);
         }
     });
-
-    qDebug() << ANSI_COLOR_GREEN << "Firing widget initialized with topic: 6" << m_connectionCheckTimer
-             << ANSI_COLOR_RESET;
     m_connectionCheckTimer->start(1000);
 }
 void firingWidget::on_pushButton_2_clicked() { emit countdown(m_curProjUuid, m_topic, "message"); }
@@ -292,7 +290,7 @@ void firingWidget::handleProjectFiringMqttMessage(const QMqttMessage &message) {
                             ui->pushButton_2->setText("已确认取消");
 
                             emit progressChanged(FiringStages::Starting, m_row);
-                            emit updatefiringStage(FiringStages::Starting, m_row);
+                            emit updatefiringStage(FiringStages::CancelConfirmed, m_row);
                             emit updateProjectStatus(m_curProjUuid, BlastStatus::Created);
                             emit closeFiring(m_curProjUuid, m_row);
                             break;

+ 2 - 0
global.cpp

@@ -20,6 +20,7 @@ QString DET_PARAM_DWDM;
 QString DET_PARAM_HTID;
 QString DET_PARAM_SBBH;
 bool isShowTriggeringWidget;
+bool isFaceVerificationEnabled = true;  // 是否启用人脸识别
 
 void loadConfig() {
     QSettings settings("config.ini", QSettings::IniFormat);
@@ -34,6 +35,7 @@ void loadConfig() {
     MQTT_TOPIC_COMPANY_PROJECTS_PUBLISH = settings.value("MQTT/publish_topic", "hxgc/companycode/pro/B").toString();
     COMPANY_CODE = settings.value("Company/code", "cc_hxgc").toString();
     isShowTriggeringWidget = settings.value("UI/show_triggering_widget", false).toBool();
+    isFaceVerificationEnabled = settings.value("UI/enable_face_verfify", true).toBool();
 
     // Load det parameters
     DET_PARAM_XMBH = settings.value("DetParams/xmbh", "").toString();

+ 2 - 1
global.h

@@ -19,7 +19,8 @@ extern QString mqttClientId;                         // mqtt客户端ID
 extern QString MQTT_TOPIC_COMPANY_PROJECTS_SUB;      // 每个部署点(公司)唯一地址
 extern QString MQTT_TOPIC_COMPANY_PROJECTS_PUBLISH;  // 发布工程的topic
 extern QString COMPANY_CODE;
-extern bool isShowTriggeringWidget;  // 是否显示点火装置触发中调试组件
+extern bool isShowTriggeringWidget;     // 是否显示点火装置触发中调试组件
+extern bool isFaceVerificationEnabled;  // 是否启用人脸识别
 // 用来获取雷管参数
 extern QString DET_PARAM_XMBH;  // 项目编号
 extern QString DET_PARAM_DWDM;  // 单位代码

+ 21 - 4
mainwindow.cpp

@@ -147,6 +147,25 @@ void MainWindow::initialMqttService() {
     }
 }
 
+void MainWindow::publishBlastProjects() {
+    QJsonArray jsonArray;
+    HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
+
+    QList<QSharedPointer<HProject>> projectsReg = dao.getAllHProjectsReg();
+    for (const auto &projectPtr : projectsReg) {
+        if (projectPtr) {
+            QByteArray projectJson = projectPtr->ProjectToJson(*projectPtr);
+            QJsonDocument doc = QJsonDocument::fromJson(projectJson);
+            jsonArray.append(doc.object());
+        }
+    }
+
+    QJsonDocument jsonDoc(jsonArray);
+    QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Indented);
+
+    mainMqttClient->sendMessage(MQTT_TOPIC_COMPANY_PROJECTS_PUBLISH, jsonData, 2, true);
+}
+
 void MainWindow::handleMqttProjectsMessage(const QMqttMessage &message) {
     Logger::getInstance().info("Received Mqtt message on topic: " + message.topic().name() +
                                ", message: " + QString::fromUtf8(message.payload()));
@@ -167,12 +186,12 @@ void MainWindow::handleMqttProjectsMessage(const QMqttMessage &message) {
                     dao.updateBlastStatusByUuid(uuid, BlastStatus::Registered);
                 }
             }
-            // emit refreshPage();
         } else if (jsonObj.contains("msgType") && jsonObj["msgType"].toString() == "blastSuccess") {
             // 爆破成功, 更新状态; 尤其是离线爆破的; 服务器收到爆破记录后发布
             HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
             dao.updateBlastStatusByUuid(jsonObj["projectUuid"].toString(), BlastStatus::Blasted);
-            // emit refreshPage();
+
+            publishBlastProjects();
         } else if (jsonObj.contains("msgType") && jsonObj["msgType"].toString() == "safeCheck") {
             // 处理安全验证消息
             if (jsonObj["status"] != "ok") {
@@ -185,7 +204,6 @@ void MainWindow::handleMqttProjectsMessage(const QMqttMessage &message) {
 
             QList<QString> subAddressUuids = findAllChildUuids(addressList, addressUuid);
             subAddressUuids.append(addressUuid);  // 添加当前地址的 UUID
-            qDebug() << "子地址 UUIDs: " << subAddressUuids << "-----" << addressUuid;
             if (subAddressUuids.isEmpty()) {
                 QMessageBox::information(nullptr, "安全验证失败", QString("未找到子地址,请联系安全员确认"));
                 return;
@@ -199,7 +217,6 @@ void MainWindow::handleMqttProjectsMessage(const QMqttMessage &message) {
             if (!pendingCheckProjects.isEmpty()) {
                 QMessageBox::information(nullptr, "安全员确认信息",
                                          QString("收到工程被安全员确认,请刷新查看爆破作业列表"));
-                emit refreshPage();
                 return;
             }
         }

+ 1 - 0
mainwindow.h

@@ -59,6 +59,7 @@ class MainWindow : public QMainWindow {
     void initialGPSSerial();
     void initDateTime();
     void onSerialToolCreated();
+    void publishBlastProjects();
     QList<QString> findAllChildUuids(const QJsonArray &addressArray, const QString targetUuid);
 
    private:

+ 21 - 2
mqtt/mqttclient.cpp

@@ -3,6 +3,7 @@
 #include <QJsonDocument>
 #include <QJsonObject>
 #include <QMessageBox>
+#include <QPushButton>
 
 #include "../global.h"
 #include "../logger.h"
@@ -58,7 +59,7 @@ void MqttClient::sendMessage(const QString &topic, const QByteArray &message, qu
         auto pub = _mqClient->publish(QMqttTopicName(topic), message, qos, isRetainedMsg);
         if (pub == -1)
             Logger::getInstance().error(
-                QString("MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
+                QString("Error MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
                     .arg(topic, QString(message), QString::number(qos), isRetainedMsg ? "true" : "false"));
         else
             Logger::getInstance().info(
@@ -81,9 +82,27 @@ void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicNa
 
 void MqttClient::onStateChanged(QMqttClient::ClientState state) {
     switch (state) {
-        case QMqttClient::ClientState::Disconnected:
+        case QMqttClient::ClientState::Disconnected: {
+            QMessageBox msgBox;
+            msgBox.setWindowTitle("MQtt 错误");
+            msgBox.setText("mqtt连接失败, 请检查网络连接或MQTT服务器状态");
+            QPushButton *yesButton = msgBox.addButton("重连", QMessageBox::YesRole);
+            QPushButton *noButton = msgBox.addButton("取消", QMessageBox::NoRole);
+            yesButton->setStyleSheet(
+                "QPushButton { background-color:rgb(5, 58, 156); color: white; padding: 5px 15px; "
+                "border-radius: 4px; }");
+            noButton->setStyleSheet(
+                "QPushButton { background-color: #f44336; color: white; padding: 5px 15px; "
+                "border-radius: 4px; }");
+            msgBox.exec();
+            if (msgBox.clickedButton() == yesButton) {
+                // TODO
+                _mqClient->connectToHost();
+                break;
+            }
             Logger::getInstance().info("mqtt disconnected");
             break;
+        }
         case QMqttClient::ClientState::Connecting:
             Logger::getInstance().info("mqtt connecting");
             break;