feat:完成事件确认的全部流程逻辑
This commit is contained in:
parent
8e3239fe71
commit
6a68212a9a
|
|
@ -26,13 +26,13 @@ public:
|
||||||
void start();
|
void start();
|
||||||
void stop();
|
void stop();
|
||||||
void queryHistoricalEvents(const QDateTime& startTime, const QDateTime& endTime, int confirmStatus = -1);
|
void queryHistoricalEvents(const QDateTime& startTime, const QDateTime& endTime, int confirmStatus = -1);
|
||||||
void confirmEvents(const QStringList& uuids);
|
void confirmEvents(const QStringList& uuids, QVariant context = QVariant());
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void realTimeEventReceived(const EventData& event);
|
void realTimeEventReceived(const EventData& event);
|
||||||
void historicalQueryError(const QString& msg);
|
void historicalQueryError(const QString& msg);
|
||||||
void historicalQueryData(const QList<EventData>& events);
|
void historicalQueryData(const QList<EventData>& events);
|
||||||
void confirmEventsResult(bool success, const QString& mesg, const QStringList& successUuids);
|
void confirmEventsResult(bool success, const QString& mesg, const QStringList& successUuids, QVariant context);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onRabbitMQConnected();
|
void onRabbitMQConnected();
|
||||||
|
|
@ -58,7 +58,6 @@ private:
|
||||||
void cancelReconnect();
|
void cancelReconnect();
|
||||||
//实时信息处理
|
//实时信息处理
|
||||||
MessageHandleResult processMessage(const QAmqpMessage& message);
|
MessageHandleResult processMessage(const QAmqpMessage& message);
|
||||||
EventData parseEventFromMessage(const QByteArray& data, QString& errorString);
|
|
||||||
bool validateEvent(const EventData& event);
|
bool validateEvent(const EventData& event);
|
||||||
//历史数据处理
|
//历史数据处理
|
||||||
QUrl bulidHistoricalQueryUrl(const QDateTime& startTime, const QDateTime& endTime, int confirmStatus);
|
QUrl bulidHistoricalQueryUrl(const QDateTime& startTime, const QDateTime& endTime, int confirmStatus);
|
||||||
|
|
@ -89,6 +88,8 @@ private:
|
||||||
QSettings* m_settings;
|
QSettings* m_settings;
|
||||||
QString m_settingsFile;
|
QString m_settingsFile;
|
||||||
bool m_isVaildSettingsFile;
|
bool m_isVaildSettingsFile;
|
||||||
|
|
||||||
|
quint64 m_currentRequestId;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ private slots:
|
||||||
void onRealTimeEventReceived(const EventData& event);
|
void onRealTimeEventReceived(const EventData& event);
|
||||||
void onHistoricalEventsReceived(const QList<EventData>& events);
|
void onHistoricalEventsReceived(const QList<EventData>& events);
|
||||||
void onHistoricalQueryError(const QString&);
|
void onHistoricalQueryError(const QString&);
|
||||||
void onConfirmEventsResult(bool success, const QString& mesg, const QStringList& successUuids);
|
void onConfirmEventsResult(bool success, const QString& mesg, const QStringList& successUuids, QVariant context);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void iniHeaderData();
|
void iniHeaderData();
|
||||||
|
|
@ -104,6 +104,7 @@ private:
|
||||||
AlarmDataMode m_dataMode;
|
AlarmDataMode m_dataMode;
|
||||||
AlarmEventDataFilter m_currentFilter;
|
AlarmEventDataFilter m_currentFilter;
|
||||||
int m_maxRealTimeEvents;
|
int m_maxRealTimeEvents;
|
||||||
|
quint64 m_lastRequestId; //请求ID,在实例化的不同对象调用某同一个对象(此处是AlarmEventDataService)的某个函数并触发其emit某个signal进而触发自身的某个slot时做判别用
|
||||||
|
|
||||||
//QMap<qint64, QVector<QModelIndex>> m_confirmedEvents;
|
//QMap<qint64, QVector<QModelIndex>> m_confirmedEvents;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ AlarmEventDataService::AlarmEventDataService()
|
||||||
, m_amqpExchange(nullptr)
|
, m_amqpExchange(nullptr)
|
||||||
, m_reconnectAttempts(0)
|
, m_reconnectAttempts(0)
|
||||||
, m_maxReconnectAttempts(10)
|
, m_maxReconnectAttempts(10)
|
||||||
|
, m_currentRequestId(1)
|
||||||
{
|
{
|
||||||
m_reconnectTimer = new QTimer(this);
|
m_reconnectTimer = new QTimer(this);
|
||||||
m_reconnectTimer->setSingleShot(true);
|
m_reconnectTimer->setSingleShot(true);
|
||||||
|
|
@ -113,8 +114,10 @@ void AlarmEventDataService::queryHistoricalEvents(const QDateTime& startTime, co
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmEventDataService::confirmEvents(const QStringList& uuids)
|
void AlarmEventDataService::confirmEvents(const QStringList& uuids, QVariant context)
|
||||||
{
|
{
|
||||||
|
m_currentRequestId = context.toULongLong();
|
||||||
|
|
||||||
QUrl url = buildConfirmEventsUrl();
|
QUrl url = buildConfirmEventsUrl();
|
||||||
if(!url.isValid())
|
if(!url.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
@ -200,42 +203,37 @@ void AlarmEventDataService::cancelReconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageHandleResult AlarmEventDataService::processMessage(const QAmqpMessage& message)
|
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;
|
QJsonParseError parseError;
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(data, &parseError);
|
QJsonDocument doc = QJsonDocument::fromJson(message.payload(), &parseError);
|
||||||
|
|
||||||
if(parseError.error != QJsonParseError::NoError)
|
if(parseError.error != QJsonParseError::NoError)
|
||||||
{
|
{
|
||||||
errorString = QString("JSON parse error: %1 at offset %2")
|
// QString errorString = QString("JSON parse error: %1 at offset %2")
|
||||||
.arg(parseError.errorString())
|
// .arg(parseError.errorString())
|
||||||
.arg(parseError.offset);
|
// .arg(parseError.offset);
|
||||||
return EventData();
|
|
||||||
|
return MessageHandleResult::ParseError;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!doc.isObject())
|
if(!doc.isObject())
|
||||||
{
|
{
|
||||||
errorString = "JSON document is not an object";
|
//QString errorString = "JSON document is not an object";
|
||||||
return EventData();
|
return MessageHandleResult::ValidationError;
|
||||||
}
|
}
|
||||||
|
|
||||||
QJsonObject obj = doc.object();
|
QJsonObject obj = doc.object();
|
||||||
EventData event = EventData::fromJson(obj);
|
//加一层判断,当前实时报警信息和确认同步信息都走该接口,并且没有做消息层面的标识,因此先从消息体结构来判断
|
||||||
return event;
|
if(obj.contains("event_uuid") && obj.contains("event") && obj.contains("type"))
|
||||||
|
{
|
||||||
|
EventData event = EventData::fromJson(obj);
|
||||||
|
if(!validateEvent(event))
|
||||||
|
return MessageHandleResult::ValidationError;
|
||||||
|
|
||||||
|
emit realTimeEventReceived(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
return MessageHandleResult::Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AlarmEventDataService::validateEvent(const EventData& event)
|
bool AlarmEventDataService::validateEvent(const EventData& event)
|
||||||
|
|
@ -414,6 +412,8 @@ void AlarmEventDataService::onConfirmEventsRequestFinished(QNetworkReply* reply)
|
||||||
if(parseError.error == QJsonParseError::NoError && doc.isObject())
|
if(parseError.error == QJsonParseError::NoError && doc.isObject())
|
||||||
{
|
{
|
||||||
QJsonObject docObj = doc.object();
|
QJsonObject docObj = doc.object();
|
||||||
|
//int code = docObj.value("code").toInt();
|
||||||
|
QString msg = docObj.value("msg").toString();
|
||||||
QJsonValue dataValue = docObj.value("data");
|
QJsonValue dataValue = docObj.value("data");
|
||||||
if(dataValue.isObject())
|
if(dataValue.isObject())
|
||||||
{
|
{
|
||||||
|
|
@ -428,19 +428,34 @@ void AlarmEventDataService::onConfirmEventsRequestFinished(QNetworkReply* reply)
|
||||||
successUuids.append(value.toString());
|
successUuids.append(value.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
emit confirmEventsResult(true, "", successUuids);
|
emit confirmEventsResult(true, "", successUuids, m_currentRequestId);
|
||||||
return;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QString errorMsg = QString("ConfirmEvents reply error, msg: %1").arg(msg);
|
||||||
|
LOG_ERROR("Http", errorMsg);
|
||||||
|
emit confirmEventsResult(false, QString("确认事件失败(%1)").arg(msg), successUuids, m_currentRequestId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QString errorMsg = QString("ConfirmEvents reply Json is not object: %1").arg(QString(data));
|
||||||
|
LOG_ERROR("Http", errorMsg);
|
||||||
|
emit confirmEventsResult(false, QString("确认事件失败(Json is not object)"), successUuids, m_currentRequestId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QString errorMsg = QString("ConfirmEvents reply Json parse error: %1").arg(parseError.errorString());
|
||||||
|
LOG_ERROR("Http", errorMsg);
|
||||||
|
emit confirmEventsResult(false, QString("确认事件失败(JsonParseError)"), successUuids, m_currentRequestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit confirmEventsResult(false, QString("确认事件失败(Json错误)"), successUuids);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString errorMsg = QString("ConfirmEvents error: %1").arg(reply->errorString());
|
QString errorMsg = QString("ConfirmEvents reply Network error: %1").arg(reply->errorString());
|
||||||
LOG_ERROR("Http", errorMsg);
|
LOG_ERROR("Http", errorMsg);
|
||||||
emit confirmEventsResult(false, QString("确认事件失败(%1)").arg(errorMsg), successUuids);
|
emit confirmEventsResult(false, QString("确认事件失败(Reply Network error)"), successUuids, m_currentRequestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ AlarmEventDataModel::AlarmEventDataModel(AlarmDataMode mode, QObject* parent)
|
||||||
: QAbstractTableModel(parent)
|
: QAbstractTableModel(parent)
|
||||||
, m_dataMode(mode)
|
, m_dataMode(mode)
|
||||||
, m_maxRealTimeEvents(5)
|
, m_maxRealTimeEvents(5)
|
||||||
|
, m_lastRequestId(0)
|
||||||
{
|
{
|
||||||
m_paginationInfo.entriesPerPage = 100;
|
m_paginationInfo.entriesPerPage = 100;
|
||||||
m_paginationInfo.currentPage = 1;
|
m_paginationInfo.currentPage = 1;
|
||||||
|
|
@ -36,13 +37,14 @@ AlarmEventDataModel::AlarmEventDataModel(AlarmDataMode mode, QObject* parent)
|
||||||
{
|
{
|
||||||
connect(AlarmEventDataService::instance(), &AlarmEventDataService::historicalQueryData, this, &AlarmEventDataModel::onHistoricalEventsReceived);
|
connect(AlarmEventDataService::instance(), &AlarmEventDataService::historicalQueryData, this, &AlarmEventDataModel::onHistoricalEventsReceived);
|
||||||
connect(AlarmEventDataService::instance(), &AlarmEventDataService::historicalQueryError, this, &AlarmEventDataModel::onHistoricalQueryError);
|
connect(AlarmEventDataService::instance(), &AlarmEventDataService::historicalQueryError, this, &AlarmEventDataModel::onHistoricalQueryError);
|
||||||
connect(AlarmEventDataService::instance(), &AlarmEventDataService::confirmEventsResult, this, &AlarmEventDataModel::onConfirmEventsResult);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(AlarmEventDataService::instance(), &AlarmEventDataService::confirmEventsResult, this, &AlarmEventDataModel::onConfirmEventsResult);
|
||||||
|
|
||||||
//实时数据测试
|
//实时数据测试
|
||||||
m_simulatedDataTimer = new QTimer(this);
|
m_simulatedDataTimer = new QTimer(this);
|
||||||
connect(m_simulatedDataTimer, &QTimer::timeout, this, &AlarmEventDataModel::onTimeoutSimulateData);
|
connect(m_simulatedDataTimer, &QTimer::timeout, this, &AlarmEventDataModel::onTimeoutSimulateData);
|
||||||
m_simulatedDataTimer->start(3000);
|
m_simulatedDataTimer->start(5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
AlarmEventDataModel::~AlarmEventDataModel()
|
AlarmEventDataModel::~AlarmEventDataModel()
|
||||||
|
|
@ -285,18 +287,47 @@ void AlarmEventDataModel::updateEventData(int index, const EventData& updatedEve
|
||||||
void AlarmEventDataModel::confirmEvent(const QModelIndex index)
|
void AlarmEventDataModel::confirmEvent(const QModelIndex index)
|
||||||
{
|
{
|
||||||
int row = index.row();
|
int row = index.row();
|
||||||
|
if(m_displayEvents.at(row).status == 3)
|
||||||
|
{
|
||||||
|
qDebug() << "the event has been confirmed";
|
||||||
|
return;
|
||||||
|
}
|
||||||
QString uuid = m_displayEvents.at(row).id;
|
QString uuid = m_displayEvents.at(row).id;
|
||||||
QStringList uuids;
|
QStringList uuids;
|
||||||
uuids.append(uuid);
|
uuids.append(uuid);
|
||||||
AlarmEventDataService::instance()->confirmEvents(uuids);
|
|
||||||
|
// 为本次请求创建一个唯一标识。
|
||||||
|
// 简单做法:使用对象的唯一性(this指针)。但要注意对象可能被销毁。
|
||||||
|
// 更稳健做法:使用一个递增的成员变量作为请求ID。
|
||||||
|
static quint64 s_localRequestId = 0;
|
||||||
|
quint64 currentRequestId = ++s_localRequestId;
|
||||||
|
m_lastRequestId = currentRequestId;
|
||||||
|
// 发送请求,附加上下文标识
|
||||||
|
AlarmEventDataService::instance()->confirmEvents(uuids, currentRequestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmEventDataModel::confirmCurPageEvents()
|
void AlarmEventDataModel::confirmCurPageEvents()
|
||||||
{
|
{
|
||||||
QStringList uuids;
|
QStringList uuids;
|
||||||
for(const EventData& event : m_displayEvents)
|
for(const EventData& event : m_displayEvents)
|
||||||
uuids.append(event.id);
|
{
|
||||||
AlarmEventDataService::instance()->confirmEvents(uuids);
|
if(event.status != 3)
|
||||||
|
uuids.append(event.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(uuids.isEmpty())
|
||||||
|
{
|
||||||
|
qDebug() << "all events have been confirmed";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 为本次请求创建一个唯一标识。
|
||||||
|
// 简单做法:使用对象的唯一性(this指针)。但要注意对象可能被销毁。
|
||||||
|
// 更稳健做法:使用一个递增的成员变量作为请求ID。
|
||||||
|
static quint64 s_localRequestId = 0;
|
||||||
|
quint64 currentRequestId = ++s_localRequestId;
|
||||||
|
m_lastRequestId = currentRequestId;
|
||||||
|
// 发送请求,附加上下文标识
|
||||||
|
AlarmEventDataService::instance()->confirmEvents(uuids, currentRequestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmEventDataModel::updateCurPageData()
|
void AlarmEventDataModel::updateCurPageData()
|
||||||
|
|
@ -437,16 +468,25 @@ void AlarmEventDataModel::onHistoricalQueryError(const QString& error)
|
||||||
emit loadDataError(error);
|
emit loadDataError(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmEventDataModel::onConfirmEventsResult(bool success, const QString& mesg, const QStringList& successUuids)
|
void AlarmEventDataModel::onConfirmEventsResult(bool success, const QString& mesg, const QStringList& successUuids, QVariant context)
|
||||||
{
|
{
|
||||||
|
// 检查上下文是否匹配此模型的请求
|
||||||
|
quint64 resultRequestId = context.toULongLong();
|
||||||
|
if (resultRequestId != m_lastRequestId)
|
||||||
|
{
|
||||||
|
//qDebug() << "is not my signal, i am " << this;
|
||||||
|
return; // 不是本模型发起的请求,直接忽略
|
||||||
|
}
|
||||||
|
|
||||||
if(!success)
|
if(!success)
|
||||||
{
|
{
|
||||||
|
qDebug() << "confirm error: " << mesg;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_dataMode == RealTime)
|
if(m_dataMode == RealTime)
|
||||||
{
|
{
|
||||||
beginResetModel();
|
//beginResetModel();
|
||||||
|
|
||||||
for(const QString& uuid : successUuids)
|
for(const QString& uuid : successUuids)
|
||||||
{
|
{
|
||||||
|
|
@ -460,10 +500,17 @@ void AlarmEventDataModel::onConfirmEventsResult(bool success, const QString& mes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
endResetModel();
|
QModelIndex topLeft = createIndex(0, Status);
|
||||||
|
QModelIndex bottomRight = createIndex(m_displayEvents.count() - 1, Status);
|
||||||
|
emit dataChanged(topLeft, bottomRight, {Qt::DisplayRole, Qt::ForegroundRole});
|
||||||
|
qDebug() << "realtime view confirm refresh";
|
||||||
|
//endResetModel();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
qDebug() << "historical view confirm refresh";
|
||||||
refresh();
|
refresh();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AlarmEventDataModel::setCurrentPage(int page)
|
bool AlarmEventDataModel::setCurrentPage(int page)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue