From 1037b0b2a92efdb3778a90781928c0f6c50b63e2 Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Tue, 11 Nov 2025 10:51:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=A8=A1=E5=9D=97=EF=BC=88alarmEventDataServ?= =?UTF-8?q?ice=EF=BC=89=E4=B8=AD=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/alarmEventDataService.h | 14 +++++ source/alarmEventDataService.cpp | 90 ++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/include/alarmEventDataService.h b/include/alarmEventDataService.h index b07d58b..ed21bd7 100644 --- a/include/alarmEventDataService.h +++ b/include/alarmEventDataService.h @@ -6,10 +6,13 @@ #include "qamqpclient.h" #include "qamqpexchange.h" #include "qamqpqueue.h" +//#include class QAmqpClient; class QAmqpQueue; class QAmqpExchange; +class QNetworkAccessManager; +class QNetworkReply; class QTimer; class AlarmEventDataService : public QObject @@ -21,9 +24,12 @@ public: bool initialize(const ServiceConfig& config); void start(); void stop(); + void queryHistoricalEvents(const QDateTime& startTime, const QDateTime& endTime); signals: void realTimeEventReceived(const EventData& event); + void historicalQueryError(const QString& msg); + void historicalQuertData(const QList& events); private slots: void onRabbitMQConnected(); @@ -31,6 +37,7 @@ private slots: void onRabbitMQError(QAMQP::Error error); void onMessageReceived(); void onReconnectTimeout(); + void onHistoricalRequestFinished(QNetworkReply* reply); private: explicit AlarmEventDataService(); @@ -45,6 +52,10 @@ private: MessageHandleResult processMessage(const QAmqpMessage& message); EventData parseEventFromMessage(const QByteArray& data, QString& errorString); bool validateEvent(const EventData& event); + //历史数据处理 + QUrl bulidHistoricalQueryUrl(const QDateTime& startTime, const QDateTime& endTime); + void processHistoricalResponse(const QByteArray& data); + //QNetworkRequest createHistoricalRequest(const QUrl& url); ServiceConfig m_config; ServiceStatus m_serviceStatus; @@ -60,6 +71,9 @@ private: QTimer* m_reconnectTimer; int m_reconnectAttempts; int m_maxReconnectAttempts; + + //历史数据相关 + QNetworkAccessManager* m_networkManager; }; #endif diff --git a/source/alarmEventDataService.cpp b/source/alarmEventDataService.cpp index 35e1956..88b7bec 100644 --- a/source/alarmEventDataService.cpp +++ b/source/alarmEventDataService.cpp @@ -1,4 +1,8 @@ #include "alarmEventDataService.h" +#include +#include +#include +#include #include #include #include @@ -24,6 +28,8 @@ AlarmEventDataService::AlarmEventDataService() m_reconnectTimer = new QTimer(this); m_reconnectTimer->setSingleShot(true); connect(m_reconnectTimer, &QTimer::timeout, this, &AlarmEventDataService::onReconnectTimeout); + + m_networkManager = new QNetworkAccessManager(this); } AlarmEventDataService::~AlarmEventDataService() @@ -60,6 +66,22 @@ void AlarmEventDataService::stop() m_serviceStatus = ServiceStatus::Disconnected; } +void AlarmEventDataService::queryHistoricalEvents(const QDateTime& startTime, const QDateTime& endTime) +{ + QUrl url = bulidHistoricalQueryUrl(startTime, endTime); + if(!url.isValid()) + return; + + //创建网络请求 + QNetworkRequest request(url); + request.setTransferTimeout(m_config.historicalConfig.timeout); + //发送请求 + QNetworkReply* reply = m_networkManager->get(request); + connect(reply, &QNetworkReply::finished, this, [this, reply](){ + onHistoricalRequestFinished(reply); + }); +} + void AlarmEventDataService::startRealTimeDataService() { cleanupRabbitMQConnection(); @@ -166,6 +188,58 @@ bool AlarmEventDataService::validateEvent(const EventData& event) return true; } +QUrl AlarmEventDataService::bulidHistoricalQueryUrl(const QDateTime& startTime, const QDateTime& endTime) +{ + QUrl url = m_config.historicalConfig.baseUrl; + QUrlQuery query; + query.addQueryItem("begin", QString::number(startTime.toMSecsSinceEpoch())); + query.addQueryItem("end", QString::number(startTime.toMSecsSinceEpoch())); + url.setQuery(query); + return url; +} + +void AlarmEventDataService::processHistoricalResponse(const QByteArray& data) +{ + QJsonParseError parseError; + QJsonDocument doc = QJsonDocument::fromJson(data, &parseError); + + if(parseError.error != QJsonParseError::NoError) + { + QString errorMsg = QString("Historical Events JSON parse error: %1 at offset %2") + .arg(parseError.errorString()) + .arg(parseError.offset); + emit historicalQueryError(errorMsg); + } + + if(!doc.isObject()) + { + QString errorMsg = "Historical Events JSON document is not an object"; + emit historicalQueryError(errorMsg); + return ; + } + + QJsonObject obj = doc.object(); + QJsonValue dataValue = obj.value("data"); + if(dataValue.isArray()) + { + QList historicalEvents; + QJsonArray eventArray = dataValue.toArray(); + int size = eventArray.size(); + for(int i = 0; i < size; ++i) + { + QJsonValue eventValue = eventArray.at(i); + if(!eventValue.isObject()) + continue; + + QJsonObject eventObj = eventValue.toObject(); + EventData event = EventData::fromJson(eventObj); + if(!event.id.isEmpty()) + historicalEvents.append(event); + } + emit historicalQuertData(historicalEvents); + } +} + // ==================== 槽函数 ==================== void AlarmEventDataService::onRabbitMQConnected() { @@ -216,3 +290,19 @@ void AlarmEventDataService::onReconnectTimeout() m_serviceStatus = ServiceStatus::Reconnecting; startRealTimeDataService(); } + +void AlarmEventDataService::onHistoricalRequestFinished(QNetworkReply* reply) +{ + if(reply->error() == QNetworkReply::NoError) + { + QByteArray data = reply->readAll(); + processHistoricalResponse(data); + } + else + { + QString errorMsg = QString("Request HistoricalEvents error: %1").arg(reply->errorString()); + emit historicalQueryError(errorMsg); + } + + reply->deleteLater(); +}