2025-11-06 18:54:50 +08:00
|
|
|
|
#include "alarmEventDataService.h"
|
2025-12-03 17:09:26 +08:00
|
|
|
|
#include "logger.h"
|
2025-11-11 10:51:01 +08:00
|
|
|
|
#include <QNetworkAccessManager>
|
|
|
|
|
|
#include <QNetworkRequest>
|
|
|
|
|
|
#include <QUrlQuery>
|
|
|
|
|
|
#include <QNetworkReply>
|
2025-11-07 17:33:04 +08:00
|
|
|
|
#include <QTimer>
|
2025-11-12 14:48:47 +08:00
|
|
|
|
#include <QFile>
|
|
|
|
|
|
#include <QSettings>
|
2025-11-06 18:54:50 +08:00
|
|
|
|
#include <QJsonObject>
|
|
|
|
|
|
#include <QJsonDocument>
|
|
|
|
|
|
#include <QJsonArray>
|
|
|
|
|
|
#include <QJsonParseError>
|
2025-11-12 14:48:47 +08:00
|
|
|
|
#include <QCoreApplication>
|
2025-11-06 18:54:50 +08:00
|
|
|
|
|
|
|
|
|
|
AlarmEventDataService* AlarmEventDataService::instance()
|
|
|
|
|
|
{
|
|
|
|
|
|
static AlarmEventDataService instance;
|
|
|
|
|
|
return &instance;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AlarmEventDataService::AlarmEventDataService()
|
|
|
|
|
|
: m_serviceStatus(ServiceStatus::Uninitialized)
|
|
|
|
|
|
//, m_realTimeConnectionStatus(ConnectionStatus::Disconnected)
|
|
|
|
|
|
//, m_historicalConnectionStatus(ConnectionStatus::Disconnected)
|
|
|
|
|
|
, m_amqpClient(nullptr)
|
|
|
|
|
|
, m_amqpQueue(nullptr)
|
|
|
|
|
|
, m_amqpExchange(nullptr)
|
2025-11-07 17:33:04 +08:00
|
|
|
|
, m_reconnectAttempts(0)
|
|
|
|
|
|
, m_maxReconnectAttempts(10)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_reconnectTimer = new QTimer(this);
|
|
|
|
|
|
m_reconnectTimer->setSingleShot(true);
|
|
|
|
|
|
connect(m_reconnectTimer, &QTimer::timeout, this, &AlarmEventDataService::onReconnectTimeout);
|
2025-11-11 10:51:01 +08:00
|
|
|
|
|
|
|
|
|
|
m_networkManager = new QNetworkAccessManager(this);
|
2025-11-12 14:48:47 +08:00
|
|
|
|
|
|
|
|
|
|
initialize();
|
2025-11-07 17:33:04 +08:00
|
|
|
|
}
|
2025-11-06 18:54:50 +08:00
|
|
|
|
|
|
|
|
|
|
AlarmEventDataService::~AlarmEventDataService()
|
2025-11-13 18:14:24 +08:00
|
|
|
|
{
|
|
|
|
|
|
stop();
|
|
|
|
|
|
}
|
2025-11-06 18:54:50 +08:00
|
|
|
|
|
2025-11-12 14:48:47 +08:00
|
|
|
|
void AlarmEventDataService::initialize()
|
2025-11-06 18:54:50 +08:00
|
|
|
|
{
|
2025-11-12 14:48:47 +08:00
|
|
|
|
//读取配置文件
|
|
|
|
|
|
QString cofigDir = QCoreApplication::applicationDirPath();
|
|
|
|
|
|
m_settingsFile = cofigDir + "/config/alarmEventService_config.ini";
|
|
|
|
|
|
QFile file(m_settingsFile);
|
|
|
|
|
|
if(file.open(QIODevice::ReadWrite))
|
|
|
|
|
|
{
|
|
|
|
|
|
m_isVaildSettingsFile = true;
|
|
|
|
|
|
m_settings = new QSettings(m_settingsFile, QSettings::IniFormat);
|
2025-11-06 18:54:50 +08:00
|
|
|
|
|
2025-11-12 14:48:47 +08:00
|
|
|
|
//RabbitMQConfig
|
|
|
|
|
|
m_config.rabbitMQConfig.host = m_settings->value("RabbitMQConfig/host").toString();
|
|
|
|
|
|
m_config.rabbitMQConfig.port = m_settings->value("RabbitMQConfig/port").toInt();
|
|
|
|
|
|
m_config.rabbitMQConfig.username = m_settings->value("RabbitMQConfig/username").toString();
|
|
|
|
|
|
m_config.rabbitMQConfig.password = m_settings->value("RabbitMQConfig/password").toString();
|
|
|
|
|
|
m_config.rabbitMQConfig.virtualHost = m_settings->value("RabbitMQConfig/virtualHost").toString();
|
|
|
|
|
|
m_config.rabbitMQConfig.exchangeName = m_settings->value("RabbitMQConfig/exchangeName").toString();
|
|
|
|
|
|
m_config.rabbitMQConfig.queueName = m_settings->value("RabbitMQConfig/queueName").toString();
|
|
|
|
|
|
m_config.rabbitMQConfig.routingKey = m_settings->value("RabbitMQConfig/routingKey").toString();
|
|
|
|
|
|
m_config.rabbitMQConfig.reconnectInterval = m_settings->value("RabbitMQConfig/reconnectInterval").toInt();
|
|
|
|
|
|
m_config.rabbitMQConfig.heartbeat = m_settings->value("RabbitMQConfig/heartbeat").toInt();
|
|
|
|
|
|
m_config.rabbitMQConfig.autoAck = m_settings->value("RabbitMQConfig/autoAck").toBool();
|
|
|
|
|
|
//HistoricalDataConfig
|
|
|
|
|
|
m_config.historicalConfig.baseUrl = m_settings->value("HistoricalDataConfig/baseUrl").toString();
|
|
|
|
|
|
m_config.historicalConfig.timeout = m_settings->value("HistoricalDataConfig/timeout").toInt();
|
|
|
|
|
|
m_config.historicalConfig.maxRetries = m_settings->value("HistoricalDataConfig/maxRetries").toInt();
|
|
|
|
|
|
m_config.historicalConfig.retryInterval = m_settings->value("HistoricalDataConfig/retryInterval").toInt();
|
2025-11-06 18:54:50 +08:00
|
|
|
|
|
2025-11-12 14:48:47 +08:00
|
|
|
|
m_serviceStatus = ServiceStatus::Disconnected;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
m_isVaildSettingsFile = false;
|
2025-11-06 18:54:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::start()
|
|
|
|
|
|
{
|
2025-11-07 17:33:04 +08:00
|
|
|
|
if(m_serviceStatus != ServiceStatus::Disconnected)
|
2025-11-06 18:54:50 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_serviceStatus = ServiceStatus::Connecting;
|
2025-11-07 17:33:04 +08:00
|
|
|
|
//启动实时数据服务
|
2025-11-06 18:54:50 +08:00
|
|
|
|
startRealTimeDataService();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::stop()
|
2025-11-07 17:33:04 +08:00
|
|
|
|
{
|
|
|
|
|
|
cancelReconnect();
|
|
|
|
|
|
cleanupRabbitMQConnection();
|
|
|
|
|
|
|
|
|
|
|
|
m_serviceStatus = ServiceStatus::Disconnected;
|
|
|
|
|
|
}
|
2025-11-06 18:54:50 +08:00
|
|
|
|
|
2025-11-25 11:54:16 +08:00
|
|
|
|
void AlarmEventDataService::queryHistoricalEvents(const QDateTime& startTime, const QDateTime& endTime, int confirmStatus)
|
2025-11-11 10:51:01 +08:00
|
|
|
|
{
|
2025-11-25 11:54:16 +08:00
|
|
|
|
QUrl url = bulidHistoricalQueryUrl(startTime, endTime, confirmStatus);
|
2025-11-18 14:26:29 +08:00
|
|
|
|
//QUrl url = m_config.historicalConfig.baseUrl;
|
2025-11-11 10:51:01 +08:00
|
|
|
|
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);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-04 18:05:44 +08:00
|
|
|
|
void AlarmEventDataService::confirmEvents(const QStringList& uuids)
|
|
|
|
|
|
{
|
|
|
|
|
|
QUrl url = buildConfirmEventsUrl();
|
|
|
|
|
|
if(url.isValid())
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
//创建网络请求
|
|
|
|
|
|
QNetworkRequest request(url);
|
|
|
|
|
|
request.setTransferTimeout(m_config.historicalConfig.timeout);
|
|
|
|
|
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
|
|
|
|
//将uuis转换为json数组
|
|
|
|
|
|
QJsonArray jsonArray;
|
|
|
|
|
|
for(const QString& uuid : uuids)
|
|
|
|
|
|
jsonArray.append(uuid);
|
|
|
|
|
|
QJsonDocument doc(jsonArray);
|
|
|
|
|
|
QByteArray jsonData = doc.toJson();
|
|
|
|
|
|
//发送请求
|
|
|
|
|
|
QNetworkReply* reply = m_networkManager->post(request, jsonData);
|
|
|
|
|
|
connect(reply, &QNetworkReply::finished, this, [this, reply](){
|
|
|
|
|
|
onConfirmEventsRequestFinished(reply);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-06 18:54:50 +08:00
|
|
|
|
void AlarmEventDataService::startRealTimeDataService()
|
|
|
|
|
|
{
|
|
|
|
|
|
cleanupRabbitMQConnection();
|
|
|
|
|
|
|
|
|
|
|
|
m_amqpClient = new QAmqpClient(this);
|
2025-11-13 18:14:24 +08:00
|
|
|
|
/*connect(m_amqpClient, &QAmqpClient::connected, this, &AlarmEventDataService::onRabbitMQConnected);
|
|
|
|
|
|
connect(m_amqpClient, &QAmqpClient::disconnected, this, &AlarmEventDataService::onRabbitMQDisconnected);
|
|
|
|
|
|
connect(m_amqpClient, QOverload<QAMQP::Error>::of(&QAmqpClient::error), this, &AlarmEventDataService::onRabbitMQError);*/
|
|
|
|
|
|
//采用QT4的连接方式,新的连接方式无法识别
|
|
|
|
|
|
connect(m_amqpClient, SIGNAL(connected()), this, SLOT(onRabbitMQConnected()));
|
|
|
|
|
|
connect(m_amqpClient, SIGNAL(disconnected()), this, SLOT(onRabbitMQDisconnected()));
|
|
|
|
|
|
connect(m_amqpClient, SIGNAL(error(QAMQP::Error)), this, SLOT(onRabbitMQError(QAMQP::Error)));
|
2025-11-18 14:26:29 +08:00
|
|
|
|
connect(m_amqpClient, SIGNAL(socketErrorOccurred(QAbstractSocket::SocketError)), this, SLOT(onRabbitMQSocketError(QAbstractSocket::SocketError)));
|
2025-11-13 18:14:24 +08:00
|
|
|
|
|
2025-11-06 18:54:50 +08:00
|
|
|
|
m_amqpClient->setHost(m_config.rabbitMQConfig.host);
|
|
|
|
|
|
m_amqpClient->setPort(m_config.rabbitMQConfig.port);
|
|
|
|
|
|
m_amqpClient->setUsername(m_config.rabbitMQConfig.username);
|
|
|
|
|
|
m_amqpClient->setPassword(m_config.rabbitMQConfig.password);
|
|
|
|
|
|
m_amqpClient->setVirtualHost(m_config.rabbitMQConfig.virtualHost);
|
2025-11-13 18:14:24 +08:00
|
|
|
|
m_amqpClient->connectToHost();
|
2025-11-06 18:54:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::cleanupRabbitMQConnection()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_amqpQueue)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_amqpQueue->deleteLater();
|
|
|
|
|
|
m_amqpQueue = nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(m_amqpExchange)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_amqpExchange->deleteLater();
|
|
|
|
|
|
m_amqpExchange = nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(m_amqpClient)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_amqpClient->disconnectFromHost();
|
|
|
|
|
|
m_amqpClient->deleteLater();
|
|
|
|
|
|
m_amqpClient = nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-07 17:33:04 +08:00
|
|
|
|
void AlarmEventDataService::scheduleReconnect()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_reconnectAttempts < m_maxReconnectAttempts)
|
|
|
|
|
|
{
|
2025-11-13 18:14:24 +08:00
|
|
|
|
int delay = m_config.rabbitMQConfig.reconnectInterval * (1 /*<< m_reconnectAttempts*/); // 指数退避,<<n相当于乘以2的n次方
|
2025-11-07 17:33:04 +08:00
|
|
|
|
m_reconnectTimer->start(delay);
|
|
|
|
|
|
m_reconnectAttempts++;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
qInfo() << "Maximum reconnection attempts reached";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::cancelReconnect()
|
|
|
|
|
|
{
|
2025-11-13 18:14:24 +08:00
|
|
|
|
if(m_reconnectTimer->isActive())
|
|
|
|
|
|
m_reconnectTimer->stop();
|
2025-11-07 17:33:04 +08:00
|
|
|
|
m_reconnectAttempts = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-06 18:54:50 +08:00
|
|
|
|
MessageHandleResult AlarmEventDataService::processMessage(const QAmqpMessage& message)
|
|
|
|
|
|
{
|
|
|
|
|
|
QString errorString;
|
|
|
|
|
|
EventData event = parseEventFromMessage(message.payload(), errorString);
|
|
|
|
|
|
|
|
|
|
|
|
if(!errorString.isEmpty())
|
|
|
|
|
|
return MessageHandleResult::ParseError;
|
|
|
|
|
|
|
|
|
|
|
|
if(!validateEvent(event))
|
|
|
|
|
|
return MessageHandleResult::ValidationError;
|
|
|
|
|
|
|
|
|
|
|
|
emit realTimeEventReceived(event);
|
|
|
|
|
|
return MessageHandleResult::Success;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EventData AlarmEventDataService::parseEventFromMessage(const QByteArray& data, QString& errorString)
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonParseError parseError;
|
|
|
|
|
|
QJsonDocument doc = QJsonDocument::fromJson(data, &parseError);
|
|
|
|
|
|
|
|
|
|
|
|
if(parseError.error != QJsonParseError::NoError)
|
|
|
|
|
|
{
|
|
|
|
|
|
errorString = QString("JSON parse error: %1 at offset %2")
|
|
|
|
|
|
.arg(parseError.errorString())
|
|
|
|
|
|
.arg(parseError.offset);
|
|
|
|
|
|
return EventData();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(!doc.isObject())
|
|
|
|
|
|
{
|
|
|
|
|
|
errorString = "JSON document is not an object";
|
|
|
|
|
|
return EventData();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QJsonObject obj = doc.object();
|
|
|
|
|
|
EventData event = EventData::fromJson(obj);
|
|
|
|
|
|
return event;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool AlarmEventDataService::validateEvent(const EventData& event)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(event.id.isEmpty())
|
|
|
|
|
|
return false;
|
|
|
|
|
|
QDateTime eventTime = QDateTime::fromMSecsSinceEpoch(event.timestamp);
|
|
|
|
|
|
if(!eventTime.isValid())
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-25 11:54:16 +08:00
|
|
|
|
QUrl AlarmEventDataService::bulidHistoricalQueryUrl(const QDateTime& startTime, const QDateTime& endTime, int confirmStatus)
|
2025-11-11 10:51:01 +08:00
|
|
|
|
{
|
|
|
|
|
|
QUrl url = m_config.historicalConfig.baseUrl;
|
|
|
|
|
|
QUrlQuery query;
|
|
|
|
|
|
query.addQueryItem("begin", QString::number(startTime.toMSecsSinceEpoch()));
|
2025-11-18 14:26:29 +08:00
|
|
|
|
query.addQueryItem("end", QString::number(endTime.toMSecsSinceEpoch()));
|
2025-11-25 11:54:16 +08:00
|
|
|
|
if(confirmStatus == 0) //未确认
|
|
|
|
|
|
query.addQueryItem("status", "0,1,2");
|
|
|
|
|
|
if(confirmStatus == 1) //已确认
|
|
|
|
|
|
query.addQueryItem("status", "3,4,5");
|
2025-11-11 10:51:01 +08:00
|
|
|
|
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 ;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-01 09:55:07 +08:00
|
|
|
|
QList<EventData> historicalEvents;
|
2025-11-11 10:51:01 +08:00
|
|
|
|
QJsonObject obj = doc.object();
|
|
|
|
|
|
QJsonValue dataValue = obj.value("data");
|
|
|
|
|
|
if(dataValue.isArray())
|
|
|
|
|
|
{
|
|
|
|
|
|
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);
|
2025-11-12 10:06:10 +08:00
|
|
|
|
if(validateEvent(event))
|
2025-11-11 10:51:01 +08:00
|
|
|
|
historicalEvents.append(event);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-01 09:55:07 +08:00
|
|
|
|
emit historicalQueryData(historicalEvents);
|
2025-11-11 10:51:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-04 18:05:44 +08:00
|
|
|
|
QUrl AlarmEventDataService::buildConfirmEventsUrl()
|
|
|
|
|
|
{
|
|
|
|
|
|
QUrl url = m_config.historicalConfig.baseUrl;
|
|
|
|
|
|
QUrlQuery query;
|
|
|
|
|
|
query.addQueryItem("status", "3");
|
|
|
|
|
|
url.setQuery(query);
|
|
|
|
|
|
return url;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-06 18:54:50 +08:00
|
|
|
|
// ==================== 槽函数 ====================
|
|
|
|
|
|
void AlarmEventDataService::onRabbitMQConnected()
|
|
|
|
|
|
{
|
2025-11-25 11:54:16 +08:00
|
|
|
|
//qInfo() << "RabbitMQ connectecd";
|
2025-11-06 18:54:50 +08:00
|
|
|
|
m_serviceStatus = ServiceStatus::Connected;
|
|
|
|
|
|
//Exchange
|
|
|
|
|
|
m_amqpExchange = m_amqpClient->createExchange(m_config.rabbitMQConfig.exchangeName);
|
|
|
|
|
|
m_amqpExchange->declare(QAmqpExchange::FanOut, QAmqpExchange::Durable);
|
|
|
|
|
|
//Queue
|
|
|
|
|
|
m_amqpQueue = m_amqpClient->createQueue(m_config.rabbitMQConfig.queueName);
|
2025-12-04 18:05:44 +08:00
|
|
|
|
connect(m_amqpQueue, SIGNAL(opened()), this, SLOT(onAmqpQueueOpened()));
|
2025-11-06 18:54:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::onRabbitMQDisconnected()
|
2025-11-07 17:33:04 +08:00
|
|
|
|
{
|
2025-12-03 17:09:26 +08:00
|
|
|
|
//qWarning() << "Disconnected to RabbitMQ";
|
|
|
|
|
|
LOG_WARN("RabbitMQ", "Disconnected to RabbitMQ");
|
2025-11-07 17:33:04 +08:00
|
|
|
|
m_serviceStatus = ServiceStatus::Disconnected;
|
|
|
|
|
|
scheduleReconnect();
|
|
|
|
|
|
}
|
2025-11-06 18:54:50 +08:00
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::onRabbitMQError(QAMQP::Error error)
|
|
|
|
|
|
{
|
2025-12-03 17:09:26 +08:00
|
|
|
|
//qWarning() << m_amqpClient->errorString();
|
|
|
|
|
|
LOG_WARN("RabbitMQ", m_amqpClient->errorString());
|
2025-11-06 18:54:50 +08:00
|
|
|
|
m_serviceStatus = ServiceStatus::Error;
|
2025-11-07 17:33:04 +08:00
|
|
|
|
scheduleReconnect();
|
2025-11-06 18:54:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-18 14:26:29 +08:00
|
|
|
|
void AlarmEventDataService::onRabbitMQSocketError(QAbstractSocket::SocketError error)
|
2025-11-13 18:14:24 +08:00
|
|
|
|
{
|
2025-12-03 17:09:26 +08:00
|
|
|
|
//qWarning() << "RabbitMQ connection socket error: " << error;
|
|
|
|
|
|
LOG_WARN("RabbitMQ", QString("RabbitMQ connection socket error: %1").arg(error));
|
2025-11-13 18:14:24 +08:00
|
|
|
|
m_serviceStatus = ServiceStatus::Error;
|
|
|
|
|
|
scheduleReconnect();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-04 18:05:44 +08:00
|
|
|
|
void AlarmEventDataService::onAmqpQueueOpened()
|
2025-11-13 18:14:24 +08:00
|
|
|
|
{
|
2025-12-03 17:09:26 +08:00
|
|
|
|
LOG_INFO("RabbitMQ", "AmqpQueue opend");
|
2025-11-13 18:14:24 +08:00
|
|
|
|
m_amqpQueue->declare(QAmqpQueue::AutoDelete);
|
|
|
|
|
|
m_amqpQueue->bind(m_amqpExchange, m_config.rabbitMQConfig.routingKey); //对于广播类型的交换机,消息会发送给所有与之绑定的队列,所以此时routingKey无所谓
|
|
|
|
|
|
connect(m_amqpQueue, SIGNAL(messageReceived()), this, SLOT(onMessageReceived()));
|
|
|
|
|
|
if(m_config.rabbitMQConfig.autoAck)
|
|
|
|
|
|
m_amqpQueue->consume(QAmqpQueue::coNoAck);
|
|
|
|
|
|
else
|
|
|
|
|
|
m_amqpQueue->consume(0); //0表示不适用任何特殊选项,即手动确认
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-06 18:54:50 +08:00
|
|
|
|
void AlarmEventDataService::onMessageReceived()
|
|
|
|
|
|
{
|
|
|
|
|
|
QAmqpMessage message = m_amqpQueue->dequeue();
|
2025-11-13 18:14:24 +08:00
|
|
|
|
//qDebug() << message.payload();
|
2025-12-03 17:09:26 +08:00
|
|
|
|
LOG_INFO("RabbitMQ", QString("messageReceived: %1").arg(message.payload()));
|
2025-11-06 18:54:50 +08:00
|
|
|
|
MessageHandleResult result = processMessage(message);
|
|
|
|
|
|
|
|
|
|
|
|
//手动确认消息
|
|
|
|
|
|
if(!m_config.rabbitMQConfig.autoAck && result == MessageHandleResult::Success)
|
|
|
|
|
|
m_amqpQueue->ack(message);
|
|
|
|
|
|
}
|
2025-11-07 17:33:04 +08:00
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::onReconnectTimeout()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_serviceStatus == ServiceStatus::Connected || m_serviceStatus == ServiceStatus::Reconnecting)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_serviceStatus = ServiceStatus::Reconnecting;
|
|
|
|
|
|
startRealTimeDataService();
|
|
|
|
|
|
}
|
2025-11-11 10:51:01 +08:00
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::onHistoricalRequestFinished(QNetworkReply* reply)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(reply->error() == QNetworkReply::NoError)
|
|
|
|
|
|
{
|
|
|
|
|
|
QByteArray data = reply->readAll();
|
|
|
|
|
|
processHistoricalResponse(data);
|
2025-12-03 17:09:26 +08:00
|
|
|
|
LOG_INFO("Http", QString(data));
|
2025-11-11 10:51:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2025-11-25 11:54:16 +08:00
|
|
|
|
QString errorMsg = QString("Request HistoricalData error: %1").arg(/*reply->request().url().toDisplayString(),*/ reply->errorString());
|
2025-11-11 10:51:01 +08:00
|
|
|
|
emit historicalQueryError(errorMsg);
|
2025-12-03 17:09:26 +08:00
|
|
|
|
LOG_ERROR("Http", errorMsg);
|
2025-11-11 10:51:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
reply->deleteLater();
|
|
|
|
|
|
}
|
2025-12-04 18:05:44 +08:00
|
|
|
|
|
|
|
|
|
|
void AlarmEventDataService::onConfirmEventsRequestFinished(QNetworkReply* reply)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(reply->error() == QNetworkReply::NoError)
|
|
|
|
|
|
{
|
|
|
|
|
|
QByteArray data = reply->readAll();
|
|
|
|
|
|
QJsonParseError parseError;
|
|
|
|
|
|
QJsonDocument doc = QJsonDocument::fromJson(data, &parseError);
|
|
|
|
|
|
|
|
|
|
|
|
if(parseError.error == QJsonParseError::NoError && doc.isObject())
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonObject docObj = doc.object();
|
|
|
|
|
|
int code = docObj.value("code").toInt();
|
|
|
|
|
|
if(code == 0)
|
|
|
|
|
|
emit confirmEventsResult(true, "");
|
|
|
|
|
|
else
|
|
|
|
|
|
emit confirmEventsResult(false, QString("确认事件失败, error code = %1").arg(QString::number(code)));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
emit confirmEventsResult(false, QString("确认事件失败(Json错误)"));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
QString errorMsg = QString("ConfirmEvents error: %1").arg(reply->errorString());
|
|
|
|
|
|
LOG_ERROR("Http", errorMsg);
|
|
|
|
|
|
emit confirmEventsResult(false, QString("确认事件失败(%1)").arg(errorMsg));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
reply->deleteLater();
|
|
|
|
|
|
}
|