feat:完成请求历史数据并加载显示到历史数据对话框的全流程

This commit is contained in:
duanshengchao 2025-11-18 14:26:29 +08:00
parent 7d1e06bda9
commit 64007be44a
10 changed files with 81 additions and 44 deletions

View File

@ -36,7 +36,7 @@ private slots:
void onRabbitMQConnected(); void onRabbitMQConnected();
void onRabbitMQDisconnected(); void onRabbitMQDisconnected();
void onRabbitMQError(QAMQP::Error error); void onRabbitMQError(QAMQP::Error error);
void onRabbitMQSocketErrot(QAbstractSocket::SocketError error); void onRabbitMQSocketError(QAbstractSocket::SocketError error);
void onAmqpQueueOpend(); void onAmqpQueueOpend();
void onMessageReceived(); void onMessageReceived();
void onReconnectTimeout(); void onReconnectTimeout();

View File

@ -32,14 +32,6 @@ public:
QVector<QVariant> values; QVector<QVariant> values;
}; };
struct PaginationInfo
{
int totalEntries;
int entriesPerPage;
int totalPages;
int currentPage;
};
struct SectionData struct SectionData
{ {
int width = -1; int width = -1;
@ -79,12 +71,15 @@ public:
void lastPage(); void lastPage();
signals: signals:
void receivedNewAlarm(const EventData& even); void receivedNewAlarm(const EventData& event);
void loadDataError(const QString& error);
void syncDataStatus(const PaginationInfo&);
private slots: private slots:
void onTimeoutSimulateData(); void onTimeoutSimulateData();
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&);
private: private:
void iniHeaderData(); void iniHeaderData();

View File

@ -11,6 +11,14 @@ enum AlarmDataMode
Historical Historical
}; };
struct PaginationInfo
{
int totalEntries;
int entriesPerPage;
int totalPages;
int currentPage;
};
struct EventData struct EventData
{ {
QString id; QString id;

View File

@ -28,6 +28,9 @@ signals:
protected: protected:
void showEvent(QShowEvent* event) override; void showEvent(QShowEvent* event) override;
private slots:
void onSyncDataStatus(const PaginationInfo&);
public slots: public slots:
void onBtnClicked_close(); void onBtnClicked_close();

View File

@ -212,7 +212,9 @@ class AlarmEventDataFilter
public: public:
AlarmEventDataFilter(); AlarmEventDataFilter();
void setTimeRange(const QDateTime& start, const QDateTime& end) {m_startTime = start; m_endTime = end;} void setTimeRange(const QDateTime& start, const QDateTime& end) {m_beginTime = start; m_endTime = end;}
QDateTime beginTime() {return m_beginTime;}
QDateTime endTime() {return m_endTime;}
void setStationFilter(const QString& station) {m_station = station;} void setStationFilter(const QString& station) {m_station = station;}
void setBayFilter(const QString& bay) {m_bay = bay;} void setBayFilter(const QString& bay) {m_bay = bay;}
void setTypeFilter(int type) {m_type = type;} void setTypeFilter(int type) {m_type = type;}
@ -228,7 +230,7 @@ private:
void reset(); void reset();
bool isEmpty(); bool isEmpty();
QDateTime m_startTime; QDateTime m_beginTime;
QDateTime m_endTime; QDateTime m_endTime;
QString m_station; QString m_station;
QString m_bay; QString m_bay;

View File

@ -98,6 +98,7 @@ void AlarmEventDataService::stop()
void AlarmEventDataService::queryHistoricalEvents(const QDateTime& startTime, const QDateTime& endTime) void AlarmEventDataService::queryHistoricalEvents(const QDateTime& startTime, const QDateTime& endTime)
{ {
QUrl url = bulidHistoricalQueryUrl(startTime, endTime); QUrl url = bulidHistoricalQueryUrl(startTime, endTime);
//QUrl url = m_config.historicalConfig.baseUrl;
if(!url.isValid()) if(!url.isValid())
return; return;
@ -123,7 +124,7 @@ void AlarmEventDataService::startRealTimeDataService()
connect(m_amqpClient, SIGNAL(connected()), this, SLOT(onRabbitMQConnected())); connect(m_amqpClient, SIGNAL(connected()), this, SLOT(onRabbitMQConnected()));
connect(m_amqpClient, SIGNAL(disconnected()), this, SLOT(onRabbitMQDisconnected())); connect(m_amqpClient, SIGNAL(disconnected()), this, SLOT(onRabbitMQDisconnected()));
connect(m_amqpClient, SIGNAL(error(QAMQP::Error)), this, SLOT(onRabbitMQError(QAMQP::Error))); connect(m_amqpClient, SIGNAL(error(QAMQP::Error)), this, SLOT(onRabbitMQError(QAMQP::Error)));
connect(m_amqpClient, SIGNAL(socketErrorOccurred(QAbstractSocket::SocketError)), this, SLOT(onRabbitMQSocketErrot(QAbstractSocket::SocketError))); connect(m_amqpClient, SIGNAL(socketErrorOccurred(QAbstractSocket::SocketError)), this, SLOT(onRabbitMQSocketError(QAbstractSocket::SocketError)));
m_amqpClient->setHost(m_config.rabbitMQConfig.host); m_amqpClient->setHost(m_config.rabbitMQConfig.host);
m_amqpClient->setPort(m_config.rabbitMQConfig.port); m_amqpClient->setPort(m_config.rabbitMQConfig.port);
@ -229,7 +230,7 @@ QUrl AlarmEventDataService::bulidHistoricalQueryUrl(const QDateTime& startTime,
QUrl url = m_config.historicalConfig.baseUrl; QUrl url = m_config.historicalConfig.baseUrl;
QUrlQuery query; QUrlQuery query;
query.addQueryItem("begin", QString::number(startTime.toMSecsSinceEpoch())); query.addQueryItem("begin", QString::number(startTime.toMSecsSinceEpoch()));
query.addQueryItem("end", QString::number(startTime.toMSecsSinceEpoch())); query.addQueryItem("end", QString::number(endTime.toMSecsSinceEpoch()));
url.setQuery(query); url.setQuery(query);
return url; return url;
} }
@ -303,7 +304,7 @@ void AlarmEventDataService::onRabbitMQError(QAMQP::Error error)
scheduleReconnect(); scheduleReconnect();
} }
void AlarmEventDataService::onRabbitMQSocketErrot(QAbstractSocket::SocketError error) void AlarmEventDataService::onRabbitMQSocketError(QAbstractSocket::SocketError error)
{ {
qWarning() << "RabbitMQ connection socket error: " << error; qWarning() << "RabbitMQ connection socket error: " << error;
m_serviceStatus = ServiceStatus::Error; m_serviceStatus = ServiceStatus::Error;

View File

@ -14,17 +14,6 @@ AlarmEventDataModel::AlarmEventDataModel(AlarmDataMode mode, QObject* parent)
, m_dataMode(mode) , m_dataMode(mode)
, m_maxRealTimeEvents(5) , m_maxRealTimeEvents(5)
{ {
if(m_dataMode == RealTime) //创建几个“空事件”来初始化表格
{
for(int i = 0; i < m_maxRealTimeEvents; ++i)
{
EventData event;
event.id = ""; //空事件
event.timestamp = 0; //给一个初始值,后续的实际事件会根据时间排名,不给初始值的话这个时间值不确定
m_displayEvents.append(event);
}
}
m_paginationInfo.entriesPerPage = 100; m_paginationInfo.entriesPerPage = 100;
m_paginationInfo.currentPage = 1; m_paginationInfo.currentPage = 1;
m_paginationInfo.totalEntries = 0; m_paginationInfo.totalEntries = 0;
@ -32,8 +21,20 @@ AlarmEventDataModel::AlarmEventDataModel(AlarmDataMode mode, QObject* parent)
connect(AlarmEventDataService::instance(), &AlarmEventDataService::realTimeEventReceived, this, &AlarmEventDataModel::onRealTimeEventReceived); connect(AlarmEventDataService::instance(), &AlarmEventDataService::realTimeEventReceived, this, &AlarmEventDataModel::onRealTimeEventReceived);
connect(AlarmEventDataService::instance(), &AlarmEventDataService::historicalQueryData, this, &AlarmEventDataModel::onHistoricalEventsReceived); connect(AlarmEventDataService::instance(), &AlarmEventDataService::historicalQueryData, this, &AlarmEventDataModel::onHistoricalEventsReceived);
AlarmEventDataService::instance()->start(); connect(AlarmEventDataService::instance(), &AlarmEventDataService::historicalQueryError, this, &AlarmEventDataModel::onHistoricalQueryError);
if(m_dataMode == RealTime)
{
for(int i = 0; i < m_maxRealTimeEvents; ++i)//创建几个“空事件”来初始化表格
{
EventData event;
event.id = ""; //空事件
event.timestamp = 0; //给一个初始值,后续的实际事件会根据时间排名,不给初始值的话这个时间值不确定
m_displayEvents.append(event);
}
AlarmEventDataService::instance()->start();
}
//实时数据测试 //实时数据测试
m_simulatedDataTimer = new QTimer(this); m_simulatedDataTimer = new QTimer(this);
@ -220,6 +221,9 @@ void AlarmEventDataModel::setMaxRealTimeEvents(int count)
void AlarmEventDataModel::setFilter(const AlarmEventDataFilter& filter) void AlarmEventDataModel::setFilter(const AlarmEventDataFilter& filter)
{ {
if(m_dataMode != Historical)
return;
m_currentFilter = filter; m_currentFilter = filter;
refresh(); refresh();
} }
@ -234,15 +238,8 @@ void AlarmEventDataModel::applyFilter()
void AlarmEventDataModel::refresh() void AlarmEventDataModel::refresh()
{ {
m_allEvents.clear(); //通过服务获取当前时间段的所有事件-m_allEvents
//1.通过服务获取当前时间段的所有事件-m_allEvents AlarmEventDataService::instance()->queryHistoricalEvents(m_currentFilter.beginTime(), m_currentFilter.endTime());
//2.过滤事件(时间区间作为服务请求参数,其它过滤在本地完成)-m_filteredEvents
applyFilter();
//3.更新页码数据
updatePaginationInfo();
//4.根据页码刷新当前页面数据()-m_displayEvents
updateCurPageData();
} }
void AlarmEventDataModel::updatePaginationInfo() void AlarmEventDataModel::updatePaginationInfo()
@ -358,7 +355,22 @@ void AlarmEventDataModel::onRealTimeEventReceived(const EventData& event)
void AlarmEventDataModel::onHistoricalEventsReceived(const QList<EventData>& events) void AlarmEventDataModel::onHistoricalEventsReceived(const QList<EventData>& events)
{ {
m_allEvents.clear();
m_allEvents = events;
//过滤事件(时间区间作为服务请求参数,其它过滤在本地完成)-m_filteredEvents
applyFilter();
//更新页码数据
updatePaginationInfo();
//根据页码刷新当前页面数据()-m_displayEvents
updateCurPageData();
emit syncDataStatus(m_paginationInfo);
}
void AlarmEventDataModel::onHistoricalQueryError(const QString& error)
{
emit loadDataError(error);
} }
bool AlarmEventDataModel::setCurrentPage(int page) bool AlarmEventDataModel::setCurrentPage(int page)

View File

@ -11,8 +11,17 @@ AlarmEventMainDialog::AlarmEventMainDialog(QWidget *parent)
setWindowFlags(Qt::FramelessWindowHint); setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_TranslucentBackground);
//时间范围初始化
QDateTime endTime = QDateTime::currentDateTime();
QDateTime beginTime = QDateTime::currentDateTime().addDays(-15);
ui->endTime->setDateTime(endTime);
ui->beginTime->setDateTime(beginTime);
m_eventFilter.setTimeRange(beginTime, endTime);
m_tableView = new AlarmEventDataView(Historical, this); m_tableView = new AlarmEventDataView(Historical, this);
m_tableView->model()->setFilter(m_eventFilter);
ui->tableLayout->addWidget(m_tableView); ui->tableLayout->addWidget(m_tableView);
connect(m_tableView->model(), &AlarmEventDataModel::syncDataStatus, this, &AlarmEventMainDialog::onSyncDataStatus);
connect(ui->btnClose, &QPushButton::clicked, this, &AlarmEventMainDialog::onBtnClicked_close); connect(ui->btnClose, &QPushButton::clicked, this, &AlarmEventMainDialog::onBtnClicked_close);
} }
@ -43,6 +52,13 @@ void AlarmEventMainDialog::setMode(AlarmDataMode mode)
m_mode = mode; m_mode = mode;
} }
void AlarmEventMainDialog::onSyncDataStatus(const PaginationInfo& paginationInfo)
{
QString recordInfo = QString::fromWCharArray(L"共 %1 条记录").arg(paginationInfo.totalEntries);
ui->recordInfo->setText(recordInfo);
ui->lineEditPage->setText(QString::number(paginationInfo.currentPage));
}
void AlarmEventMainDialog::onBtnClicked_close() void AlarmEventMainDialog::onBtnClicked_close()
{ {
//reject(); //reject();

View File

@ -8,7 +8,7 @@ AlarmEventDataFilter::AlarmEventDataFilter()
void AlarmEventDataFilter::reset() void AlarmEventDataFilter::reset()
{ {
m_startTime = QDateTime(); m_beginTime = QDateTime();
m_endTime = QDateTime(); m_endTime = QDateTime();
m_station.clear(); m_station.clear();
m_bay.clear(); m_bay.clear();
@ -20,7 +20,7 @@ void AlarmEventDataFilter::reset()
bool AlarmEventDataFilter::isEmpty() bool AlarmEventDataFilter::isEmpty()
{ {
return !m_startTime.isValid() && return !m_beginTime.isValid() &&
!m_endTime.isValid() && !m_endTime.isValid() &&
m_station.isEmpty() && m_station.isEmpty() &&
m_bay.isEmpty() && m_bay.isEmpty() &&
@ -33,7 +33,7 @@ bool AlarmEventDataFilter::isEmpty()
bool AlarmEventDataFilter::matches(const EventData& event) bool AlarmEventDataFilter::matches(const EventData& event)
{ {
QDateTime eventTime = QDateTime::fromMSecsSinceEpoch(event.timestamp); QDateTime eventTime = QDateTime::fromMSecsSinceEpoch(event.timestamp);
if(m_startTime.isValid() && eventTime < m_startTime) if(m_beginTime.isValid() && eventTime < m_beginTime)
return false; return false;
if(m_endTime.isValid() && eventTime > m_endTime) if(m_endTime.isValid() && eventTime > m_endTime)
return false; return false;
@ -44,7 +44,7 @@ bool AlarmEventDataFilter::matches(const EventData& event)
if(!m_bay.isEmpty() && event.bayName != m_bay) if(!m_bay.isEmpty() && event.bayName != m_bay)
return false; return false;
if(event.type != m_type) if(m_type != -1 && event.type != m_type)
return false; return false;
if(!m_severity.isEmpty() && event.severity != m_severity) if(!m_severity.isEmpty() && event.severity != m_severity)
@ -53,7 +53,7 @@ bool AlarmEventDataFilter::matches(const EventData& event)
if(!m_description.isEmpty() && event.description != m_description) if(!m_description.isEmpty() && event.description != m_description)
return false; return false;
if(event.status != m_status) if(m_status != -1 && event.status != m_status)
return false; return false;
return true; return true;

View File

@ -62,7 +62,7 @@ font: 12pt &quot;黑体&quot;;
color: rgb(250, 250, 250); color: rgb(250, 250, 250);
background-color: rgb(24, 32, 38); background-color: rgb(24, 32, 38);
border:1px solid rgb(200,200,200); border:1px solid rgb(200,200,200);
padding-right:25px; padding-right:25px; /*给按钮留出空间否则自定义样式时比如border会干扰按钮的点击*/
} }
QDateTimeEdit:focus QDateTimeEdit:focus
{ {
@ -810,7 +810,7 @@ border:1px solid rgb(100,100,100);
<string notr="true">font: 10pt &quot;黑体&quot;;</string> <string notr="true">font: 10pt &quot;黑体&quot;;</string>
</property> </property>
<property name="text"> <property name="text">
<string>共100条记录</string> <string>共0条记录</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set> <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter</set>
@ -948,7 +948,7 @@ border:1px solid rgb(100,100,100);
</size> </size>
</property> </property>
</widget> </widget>
<widget class="QLineEdit" name="lineEdit"> <widget class="QLineEdit" name="lineEditPage">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>60</x> <x>60</x>