feat:完成本地数据服务和后端数据服务的状态同步

This commit is contained in:
duanshengchao 2026-01-15 17:04:45 +08:00
parent 601040568c
commit c046668b3e
4 changed files with 43 additions and 18 deletions

View File

@ -19,11 +19,9 @@ class MeasurementDataManager : public QObject
public:
static MeasurementDataManager* instance();
void startSubscription(const QStringList& measurements);
void stopSubscription();
void addSubscriptionData(const QStringList& measurements);
void removeSubscriptionData(const QStringList& measurements);
MeasurementDataPoint getLatestRealtimeData(const QString& dataID);
void requestData(const QString& dataID, QObject* requester);
void cancelRequest(const QString& dataID, QObject* requester);
MeasurementDataPoint getLastestRealtimeData(const QString& dataID);
void queryHistoricalEvents(const QString& dataID, const QDateTime& startTime, const QDateTime& endTime, const QString& step, const QString& type = "phasor");
private slots:
@ -72,11 +70,17 @@ private:
~MeasurementDataManager();
void initialize();
//实时数据
void buildSubscriptionRequest(const QString& action, const QStringList& measurements);
void startSubscription(const QStringList& measurements);
void stopSubscription();
void addSubscriptionData(const QStringList& measurements);
void removeSubscriptionData(const QStringList& measurements);
void processSubscriptionResponse(const QString& action, QNetworkReply* reply);
void getSubscriptionRealtimeData();
//历史数据
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);
void getSubscriptionRealtimeData();
//配置相关
ServiceConfig m_serviceConfig;
@ -91,6 +95,9 @@ private:
//数据缓存
QHash<QString, QSharedPointer<MeasurementData>> m_dataCache;
//请求记录
QHash<QString, QVector<QObject*>> m_dataRequesetRecord;
};
#endif

View File

@ -43,7 +43,7 @@ public:
explicit MeasurementData(const QString& id);
int insertData(const QVector<MeasurementDataPoint>& newData);
QVector<MeasurementDataPoint> getLatestData(int count);
QVector<MeasurementDataPoint> getLastestData(int count);
QVector<MeasurementDataPoint> getDataInRange(qint64 startTime, qint64 endTime);
void cleanupOldData(qint64 cutoffTime);

View File

@ -79,7 +79,7 @@ void MeasurementDataManager::buildSubscriptionRequest(const QString& action, con
for(const QString& meaurement : measurements)
targetsArray.append(meaurement);
QJsonObject measurementObj;
measurementObj.insert("interval", "20ms");
measurementObj.insert("interval", "500ms");
measurementObj.insert("targets", targetsArray);
QJsonArray measurementArray;
measurementArray.append(measurementObj);
@ -112,7 +112,10 @@ void MeasurementDataManager::startSubscription(const QStringList& measurements)
void MeasurementDataManager::addSubscriptionData(const QStringList& measurements)
{
if(m_clientID.isEmpty())
{
buildSubscriptionRequest("start", measurements);
return;
}
buildSubscriptionRequest("add", measurements);
}
@ -127,7 +130,8 @@ void MeasurementDataManager::removeSubscriptionData(const QStringList& measureme
void MeasurementDataManager::stopSubscription()
{
//暂时不需要m_webSocketClient析构的时候会断开链接xigous
m_webSocketClient->disconnectFromServer();
m_clientID.clear();
}
void MeasurementDataManager::processSubscriptionResponse(const QString& action, QNetworkReply* reply)
@ -294,12 +298,20 @@ void MeasurementDataManager::getSubscriptionRealtimeData()
}
}
MeasurementDataPoint MeasurementDataManager::getLatestRealtimeData(const QString& dataID)
void MeasurementDataManager::requestData(const QString& dataID, QObject* requester)
{
//if()
}
void MeasurementDataManager::cancelRequest(const QString& dataID, QObject* requester)
{}
MeasurementDataPoint MeasurementDataManager::getLastestRealtimeData(const QString& dataID)
{
if(!m_dataCache.contains(dataID))
return MeasurementDataPoint();
QVector<MeasurementDataPoint> result = m_dataCache.value(dataID)->getLatestData(1);
QVector<MeasurementDataPoint> result = m_dataCache.value(dataID)->getLastestData(1);
if(result.size() > 0)
return result.at(0);
else
@ -329,8 +341,9 @@ void MeasurementDataManager::onReceiveRealtimeData(const QString& dataMsg)
if(parseError.error == QJsonParseError::NoError && doc.isObject())
{
QJsonObject docObj = doc.object();
QString msg = docObj.value("msg").toString();
if(msg == "success")
int code = docObj.value("code").toInt();
//QString msg = docObj.value("msg").toString();
if(code == 200)
{
QJsonValue payloadValue = docObj.value("payload");
if(payloadValue.isObject())
@ -350,6 +363,11 @@ void MeasurementDataManager::onReceiveRealtimeData(const QString& dataMsg)
QSharedPointer<MeasurementData> measurementData;
if(m_dataCache.contains(dataID))
measurementData = m_dataCache.value(dataID);
else
{
measurementData = QSharedPointer<MeasurementData>::create(dataID);
m_dataCache.insert(dataID, measurementData);
}
QJsonValue datasValue = targetObj.value("datas");
if(datasValue.isArray())
@ -379,10 +397,10 @@ void MeasurementDataManager::onReceiveRealtimeData(const QString& dataMsg)
LOG_ERROR("WebSockt-MeasurementData", errorMsg);
}
}
else
else if(code == 2101) //服务端协程断开,此链接已无效
{
QString errorMsg = QString("Realtime measurementData get error: %1").arg(parseError.errorString());
LOG_ERROR("WebSockt-MeasurementData", errorMsg);
m_webSocketClient->disconnectFromServer();
m_clientID.clear();
}
}
else

View File

@ -27,7 +27,7 @@ int MeasurementData::insertData(const QVector<MeasurementDataPoint>& newData)
return insertedCount;
}
QVector<MeasurementDataPoint> MeasurementData::getLatestData(int count)
QVector<MeasurementDataPoint> MeasurementData::getLastestData(int count)
{
QVector<MeasurementDataPoint> result;
@ -132,7 +132,7 @@ void WebSocketClient::setMaxReconnectAttempts(int maxAttempts)
void WebSocketClient::setupWebSocket()
{
cleanupWebSocket();
//cleanupWebSocket();
m_webSocket = new QWebSocket();
connect(m_webSocket, &QWebSocket::connected, this, &WebSocketClient::onConnected);