2025-12-19 09:45:41 +08:00
|
|
|
|
#ifndef MEASUREMENTDATAMANAGER_H
|
|
|
|
|
|
#define MEASUREMENTDATAMANAGER_H
|
|
|
|
|
|
|
2026-01-13 11:34:05 +08:00
|
|
|
|
#include "measurementDataUtils.h"
|
2025-12-19 09:45:41 +08:00
|
|
|
|
#include <QObject>
|
2026-01-04 09:51:02 +08:00
|
|
|
|
#include <QHash>
|
|
|
|
|
|
#include <QUrl>
|
|
|
|
|
|
|
2025-12-19 09:45:41 +08:00
|
|
|
|
class QSettings;
|
|
|
|
|
|
class QNetworkAccessManager;
|
|
|
|
|
|
class QNetworkReply;
|
|
|
|
|
|
class WebSocketClient;
|
|
|
|
|
|
|
|
|
|
|
|
class MeasurementDataManager : public QObject
|
|
|
|
|
|
{
|
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
Q_DISABLE_COPY(MeasurementDataManager) //禁止拷贝,等价于:DataManager(const DataManager&) = delete; DataManager& operator=(const DataManager&) = delete;
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
static MeasurementDataManager* instance();
|
|
|
|
|
|
|
|
|
|
|
|
void startSubscription(const QStringList& measurements);
|
|
|
|
|
|
void stopSubscription();
|
|
|
|
|
|
void addSubscriptionData(const QStringList& measurements);
|
|
|
|
|
|
void removeSubscriptionData(const QStringList& measurements);
|
2026-01-13 11:34:05 +08:00
|
|
|
|
MeasurementDataPoint getLatestRealtimeData(const QString& dataID);
|
2026-01-04 09:51:02 +08:00
|
|
|
|
void queryHistoricalEvents(const QString& dataID, const QDateTime& startTime, const QDateTime& endTime, const QString& step, const QString& type = "phasor");
|
2025-12-19 09:45:41 +08:00
|
|
|
|
|
|
|
|
|
|
private slots:
|
2026-01-04 09:51:02 +08:00
|
|
|
|
void onReceiveRealtimeData(const QString& dataMsg);
|
|
|
|
|
|
void onHistoricalRequestFinished(const QString& dataID, QNetworkReply* reply);
|
2025-12-19 09:45:41 +08:00
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
struct RealtimeConfig
|
|
|
|
|
|
{
|
|
|
|
|
|
QString host;
|
|
|
|
|
|
int port;
|
|
|
|
|
|
QString httpPath;
|
|
|
|
|
|
QString websocketPath;
|
|
|
|
|
|
int timeout; //请求超时(毫秒)
|
|
|
|
|
|
int maxRetries; //最大重试次数
|
|
|
|
|
|
int retryInterval; //重试间隔
|
|
|
|
|
|
|
|
|
|
|
|
RealtimeConfig()
|
|
|
|
|
|
: timeout(3000)
|
|
|
|
|
|
, maxRetries(3)
|
|
|
|
|
|
, retryInterval(1000)
|
|
|
|
|
|
{}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct HistoricalConfig
|
|
|
|
|
|
{
|
2026-01-04 09:51:02 +08:00
|
|
|
|
QUrl baseUrl;
|
2025-12-19 09:45:41 +08:00
|
|
|
|
int timeout; //请求超时(毫秒)
|
|
|
|
|
|
int maxRetries; //最大重试次数
|
|
|
|
|
|
int retryInterval; //重试间隔
|
|
|
|
|
|
|
|
|
|
|
|
HistoricalConfig()
|
|
|
|
|
|
: timeout(3000)
|
|
|
|
|
|
, maxRetries(3)
|
|
|
|
|
|
, retryInterval(1000)
|
|
|
|
|
|
{}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct ServiceConfig
|
|
|
|
|
|
{
|
|
|
|
|
|
RealtimeConfig realtimeCfg;
|
|
|
|
|
|
HistoricalConfig historicalCfg;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
explicit MeasurementDataManager();
|
|
|
|
|
|
~MeasurementDataManager();
|
|
|
|
|
|
|
|
|
|
|
|
void initialize();
|
|
|
|
|
|
void buildSubscriptionRequest(const QString& action, const QStringList& measurements);
|
|
|
|
|
|
void processSubscriptionResponse(const QString& action, QNetworkReply* reply);
|
2026-01-04 09:51:02 +08:00
|
|
|
|
QUrl buildHistoricalQueryUrl(const QString& dataID,const QDateTime& startTime, const QDateTime& endTime, const QString& step, const QString& type);
|
|
|
|
|
|
void processHistoricalResponse(const QString& dataID, const QByteArray& data);
|
2026-01-13 11:34:05 +08:00
|
|
|
|
void getSubscriptionRealtimeData();
|
2025-12-19 09:45:41 +08:00
|
|
|
|
|
|
|
|
|
|
//配置相关
|
|
|
|
|
|
ServiceConfig m_serviceConfig;
|
|
|
|
|
|
QSettings* m_settings;
|
|
|
|
|
|
QString m_settingsFile;
|
|
|
|
|
|
bool m_isVaildSettingsFile;
|
|
|
|
|
|
|
|
|
|
|
|
//服务相关
|
|
|
|
|
|
QString m_clientID;
|
|
|
|
|
|
QNetworkAccessManager* m_networkManager;
|
|
|
|
|
|
WebSocketClient* m_webSocketClient;
|
2026-01-04 09:51:02 +08:00
|
|
|
|
|
|
|
|
|
|
//数据缓存
|
|
|
|
|
|
QHash<QString, QSharedPointer<MeasurementData>> m_dataCache;
|
2025-12-19 09:45:41 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|