Browse Source

change load blast record from backend

Yao 1 month ago
parent
commit
80b47638f3

+ 33 - 11
backendapimanager.cpp

@@ -66,8 +66,30 @@ QNetworkReply *backendAPIManager::sendRequest(const QString &endpoint, const QJs
 
     return reply;
 }
+QJsonObject backendAPIManager::getBlastRecords(int page, int pageSize, QJsonObject params) {
+    if (!s_instance) return QJsonObject();
+    s_instance->requestSuccess = false;
+
+    params.insert("page", page);
+    params.insert("pageSize", pageSize);
+
+    QNetworkReply *reply = s_instance->sendRequest("blastrecord", params, "GET");
+
+    QEventLoop loop;
+    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
+    loop.exec();
+
+    QJsonObject result;
+    if (reply->error() == QNetworkReply::NoError) {
+        QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
+        result = response.object()["data"].toObject();
+    }
+
+    reply->deleteLater();
+    return result;
+}
 
-// 上传爆破记录完整记录. 包含设备和雷管记录
+// TODO: not use any more 上传爆破记录完整记录. 包含设备和雷管记录
 bool backendAPIManager::uploadBlastProjectFull(const QJsonObject &projectData) {
     if (!s_instance) return false;
 
@@ -81,12 +103,12 @@ bool backendAPIManager::uploadBlastProjectFull(const QJsonObject &projectData) {
 
     if (reply->error() == QNetworkReply::NoError) {
         QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
-        s_instance->handleUploadFinished(response, reply->url());
+        s_instance->handleReponseOKFinished(response, reply->url());
     } else {
         Logger::getInstance().error(QString("UploadBlastProjectFull request failed. uuid: %1 error message: %2")
                                         .arg(projectData.value("uuid").toString())
                                         .arg(reply->errorString()));
-        s_instance->handleUploadError(reply->errorString());
+        s_instance->handleResponseError(reply->errorString());
     }
 
     reply->deleteLater();
@@ -144,9 +166,9 @@ bool backendAPIManager::uploadBlastProject(const QJsonObject &projectData) {
 
     if (reply->error() == QNetworkReply::NoError) {
         QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
-        s_instance->handleUploadFinished(response, reply->url());
+        s_instance->handleReponseOKFinished(response, reply->url());
     } else {
-        s_instance->handleUploadError(reply->errorString());
+        s_instance->handleResponseError(reply->errorString());
     }
 
     reply->deleteLater();
@@ -166,9 +188,9 @@ bool backendAPIManager::uploadBlastProjectDets(const QJsonObject &detsData) {
 
     if (reply->error() == QNetworkReply::NoError) {
         QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
-        s_instance->handleUploadFinished(response, reply->url());
+        s_instance->handleReponseOKFinished(response, reply->url());
     } else {
-        s_instance->handleUploadError(reply->errorString());
+        s_instance->handleResponseError(reply->errorString());
     }
 
     reply->deleteLater();
@@ -188,16 +210,16 @@ bool backendAPIManager::uploadBlastEquipments(const QJsonObject &regDetsData) {
 
     if (reply->error() == QNetworkReply::NoError) {
         QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
-        s_instance->handleUploadFinished(response, reply->url());
+        s_instance->handleReponseOKFinished(response, reply->url());
     } else {
-        s_instance->handleUploadError(reply->errorString());
+        s_instance->handleResponseError(reply->errorString());
     }
 
     reply->deleteLater();
     return s_instance->requestSuccess;
 }
 
-void backendAPIManager::handleUploadFinished(const QJsonDocument &response, const QUrl &url) {
+void backendAPIManager::handleReponseOKFinished(const QJsonDocument &response, const QUrl &url) {
     // Check response status
     if (response.object().contains("code")) {
         int code = response.object()["code"].toInt();
@@ -209,7 +231,7 @@ void backendAPIManager::handleUploadFinished(const QJsonDocument &response, cons
     emit uploadFinished(response);
 }
 
-void backendAPIManager::handleUploadError(const QString &error) {
+void backendAPIManager::handleResponseError(const QString &error) {
     requestSuccess = false;
     emit uploadError(error);
 }

+ 3 - 2
backendapimanager.h

@@ -23,6 +23,7 @@ class backendAPIManager : public QObject {
     static bool uploadBlastEquipments(const QJsonObject &regDetsData);
     static QJsonArray getSysUsers();
     static QJsonArray getHAddresses();
+    static QJsonObject getBlastRecords(int page, int pageSize);
 
    signals:
     void uploadFinished(const QJsonDocument &response);
@@ -44,8 +45,8 @@ class backendAPIManager : public QObject {
     QString authToken;
 
    private slots:
-    void handleUploadFinished(const QJsonDocument &response, const QUrl &url);
-    void handleUploadError(const QString &error);
+    void handleReponseOKFinished(const QJsonDocument &response, const QUrl &url);
+    void handleResponseError(const QString &error);
 };
 
 #endif  // BACKENDAPIMANAGER_H

+ 31 - 21
blastRecord/blastrecord.cpp

@@ -1,5 +1,7 @@
 #include "blastrecord.h"
 
+#include "../backendapimanager.h"
+#include "../loadingWidget.h"
 #include "ui_blastrecord.h"
 
 BlastRecord::BlastRecord(QWidget* parent)
@@ -9,22 +11,38 @@ BlastRecord::BlastRecord(QWidget* parent)
     connect(m_pPageWidget, &PageWidget::currentPageChanged, this, &BlastRecord::PageChanged);
     connect(m_pPageWidget->getComboBox(), QOverload<int>::of(&QComboBox::currentIndexChanged), this,
             &BlastRecord::onComboBoxIndexChanged);
-    m_httpClient = new HttpClient(this);
-    pageSize = 10;
-    currentPage = 1;
+    m_pageSize = 10;
+    m_currentPage = 1;
     ui->verticalLayout_4->addWidget(m_pPageWidget);
     loadAndRefreshData();
 }
 
-void BlastRecord::loadAndRefreshData() { loadDataFromSource(currentPage, pageSize); }
+void BlastRecord::loadAndRefreshData() {
+    LoadingWidget::showLoading(this, "正在加载数据,请稍候...");
+    QJsonObject blastData = backendAPIManager::getBlastRecords(m_currentPage, m_pageSize);
+    LoadingWidget::hideLoading();
+    m_currentPage = blastData["pageIndex"].toInt();
+    m_pageSize = blastData["pageSize"].toInt();
+    m_totalCount = blastData["count"].toInt();
 
-void BlastRecord::loadDataFromSource(int currentPage, int pageSize) {
-    PaginatedHBlastRecordResult result = dao.getAllHRecords(currentPage, pageSize);
+    QList<QSharedPointer<HBlastRecord>> blastRecords;
+    for (const QJsonValue& value : blastData["list"].toArray()) {
+        QJsonObject jsonObj = value.toObject();
+        QSharedPointer<HBlastRecord> record(new HBlastRecord);
+        record->setProjectName(jsonObj["projectName"].toString());
+        record->setIsOfflineBlast(jsonObj["isOfflineBlast"].toBool());
+        record->setAppVersion(jsonObj["appVersion"].toString());
+        record->setEquipmentSn(jsonObj["equipmentSn"].toString());
+        record->setRegDetCount(jsonObj["regDetCount"].toString().toInt());
+        record->setBlastAt(QDateTime::fromString(jsonObj["blastAt"].toString(), Qt::ISODateWithMs));
+        blastRecords.append(record);
+    }
 
-    QList<QSharedPointer<HBlastRecord>> blastRecordsList = result.BlastRecords;
-    totalCount = result.totalCount;
+    drawTable(blastRecords);
+}
 
-    m_pPageWidget->setMaxPage(ceil(static_cast<double>(totalCount) / pageSize));
+void BlastRecord::drawTable(QList<QSharedPointer<HBlastRecord>> blastRecordsList) {
+    m_pPageWidget->setMaxPage(ceil(static_cast<double>(m_totalCount) / m_pageSize));
     QStandardItemModel* model;
     model = new QStandardItemModel(this);
     // 定义表头信息
@@ -74,19 +92,18 @@ void BlastRecord::loadDataFromSource(int currentPage, int pageSize) {
     ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
 }
 void BlastRecord::PageChanged(int page) {
-    currentPage = page;
-    loadDataFromSource(currentPage, pageSize);
+    m_currentPage = page;
+    loadAndRefreshData();
 }
 
 void BlastRecord::onComboBoxIndexChanged(int index) {
     QVariant variant = m_pPageWidget->getComboBox()->itemData(index);
     int value = variant.toInt();
-    pageSize = value;
-    loadDataFromSource(currentPage, pageSize);
+    m_pageSize = value;
+    loadAndRefreshData();
 }
 
 void BlastRecord::dataTable(const QJsonDocument& jsonDoc) {
-    parseJsonString(jsonDoc);
     model = new QStandardItemModel(this);
     model->setHorizontalHeaderLabels(
         {"工程名称", "离线爆破", "app版本", "起爆器编号", "注册雷管", "起爆时间", "上报时间"});
@@ -119,11 +136,4 @@ QList<QStandardItem*> BlastRecord::jsonToItem(const QJsonObject& jsonObj) {
     return QList<QStandardItem*>() << nameItem << isOfflineBlastItem << equipItem << typeItem << statusItem
                                    << onlineItem;
 }
-void BlastRecord::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));
-}
 BlastRecord::~BlastRecord() { delete ui; }

+ 4 - 6
blastRecord/blastrecord.h

@@ -24,9 +24,8 @@ class BlastRecord : public QWidget {
     ~BlastRecord();
 
    private:
-    void parseJsonString(const QJsonDocument &jsonDoc);
     void dataTable(const QJsonDocument &jsonDoc);
-    void loadDataFromSource(int currentPage, int pageSize);
+    void drawTable(QList<QSharedPointer<HBlastRecord>> blastRecordsList);
     void loadAndRefreshData();
     void PageChanged(int page);
     void onComboBoxIndexChanged(int index);
@@ -35,11 +34,10 @@ class BlastRecord : public QWidget {
    private:
     Ui::BlastRecord *ui;
     PageWidget *m_pPageWidget;
-    int pageSize;     // 每页显示的记录数量
-    int currentPage;  // 当前页面
-    int totalCount;
+    int m_pageSize;     // 每页显示的记录数量
+    int m_currentPage;  // 当前页面
+    int m_totalCount;
     HBlastRecordDao dao;
-    HttpClient *m_httpClient;
     QStandardItemModel *model;
     QJsonArray dataArray;
 };

+ 1 - 0
blastRecord/hblastrecorddao.cpp

@@ -3,6 +3,7 @@
 HBlastRecordDao::HBlastRecordDao(QSqlDatabase db) : database(db) {}
 
 PaginatedHBlastRecordResult HBlastRecordDao::getAllHRecords(int page, int pageSize) {
+    // TODO: not used anymore, consider removing
     QList<QSharedPointer<HBlastRecord>> BlastRecords;
     QSqlQuery query(database);
     int offset = (page - 1) * pageSize;

+ 2 - 2
global.cpp

@@ -12,7 +12,7 @@ QString firewidgetPort;  // 4 for dev; 1: 爆破装置
 QString gpsPort;
 QString databaseHost;
 QString mqttClientId;
-QString MQTT_TOPIC_COMPANY_PROJECTS;          // 接受爆破器的topic
+QString MQTT_TOPIC_COMPANY_PROJECTS_SUB;      // 接受爆破器的topic
 QString MQTT_TOPIC_COMPANY_PROJECTS_PUBLISH;  // 发布工程的topic
 QString COMPANY_CODE;
 QString DET_PARAM_XMBH;
@@ -30,7 +30,7 @@ void loadConfig() {
     gpsPort = settings.value("Ports/gps_port", "COM3").toString();
     databaseHost = settings.value("Database/host", "127.0.0.1").toString();
     mqttClientId = settings.value("MQTT/client_id", "mqttclient_PC").toString();
-    MQTT_TOPIC_COMPANY_PROJECTS = settings.value("MQTT/topic", "hxgc/companycode/pro/P").toString();
+    MQTT_TOPIC_COMPANY_PROJECTS_SUB = settings.value("MQTT/topic", "hxgc/companycode/pro/P").toString();
     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();

+ 1 - 1
global.h

@@ -16,7 +16,7 @@ extern QString firewidgetPort;                       // 点火装置串口号
 extern QString gpsPort;                              // gps串口号
 extern QString databaseHost;                         // pc数据库地址
 extern QString mqttClientId;                         // mqtt客户端ID
-extern QString MQTT_TOPIC_COMPANY_PROJECTS;          // 每个部署点(公司)唯一地址
+extern QString MQTT_TOPIC_COMPANY_PROJECTS_SUB;      // 每个部署点(公司)唯一地址
 extern QString MQTT_TOPIC_COMPANY_PROJECTS_PUBLISH;  // 发布工程的topic
 extern QString COMPANY_CODE;
 extern bool isShowTriggeringWidget;  // 是否显示点火装置触发中调试组件

+ 9 - 4
mainwindow.cpp

@@ -135,11 +135,12 @@ void MainWindow::switchPage(QWidget *button) {
 void MainWindow::initialMqttService() {
     Logger::getInstance().info("Start init Mqtt server.");
     if (mainMqttClient != nullptr) {
-        QMqttSubscription *projectMsgSubsciber = mainMqttClient->subscribeToTopic(MQTT_TOPIC_COMPANY_PROJECTS);
+        QMqttSubscription *projectMsgSubsciber = mainMqttClient->subscribeToTopic(MQTT_TOPIC_COMPANY_PROJECTS_SUB);
         if (projectMsgSubsciber != nullptr) {
-            connect(projectMsgSubsciber, &QMqttSubscription::messageReceived, this, &MainWindow::handleMqttProjectsMessage);
+            connect(projectMsgSubsciber, &QMqttSubscription::messageReceived, this,
+                    &MainWindow::handleMqttProjectsMessage);
         } else {
-            Logger::getInstance().error("Failed to subscribe to MQTT topic: " + MQTT_TOPIC_COMPANY_PROJECTS);
+            Logger::getInstance().error("Failed to subscribe to MQTT topic: " + MQTT_TOPIC_COMPANY_PROJECTS_SUB);
         }
     } else {
         Logger::getInstance().error("mainMqttClient is null, cannot initialize MQTT service");
@@ -163,9 +164,13 @@ void MainWindow::handleMqttProjectsMessage(const QMqttMessage &message) {
                 } else {
                     QString uuid = uuidValue.toString();
                     HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
-                    dao.updateBlastStatusByUuid(uuid, "2");
+                    dao.updateBlastStatusByUuid(uuid, BlastStatus::Registered);
                 }
             }
+        } else if (jsonObj.contains("msgType") && jsonObj["msgType"].toString() == "blastSuccess") {
+            // 爆破成功, 更新状态; 尤其是离线爆破的; 服务器收到爆破记录后发布
+            HProjectDao dao = HProjectDao(DatabaseManager::getInstance().getDatabase());
+            dao.updateBlastStatusByUuid(jsonObj["projectUuid"].toString(), BlastStatus::Blasted);
         } else if (jsonObj.contains("msgType") && jsonObj["msgType"].toString() == "safeCheck") {
             // 处理安全验证消息
             if (jsonObj["status"] != "ok") {

+ 1 - 1
mqtt/mqttclient.cpp

@@ -72,7 +72,7 @@ void MqttClient::sendMessage(const QString &topic, const QByteArray &message, qu
 }
 
 void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic) {
-    if (topic.name() == MQTT_TOPIC_COMPANY_PROJECTS) {
+    if (topic.name() == MQTT_TOPIC_COMPANY_PROJECTS_SUB) {
         emit proMessageReceived(message, topic);
     } else {
         emit messageReceived(message, topic);