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

View File

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

View File

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

View File

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