PowerMaster/include/alarmEventUtils.h

270 lines
6.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef ALARMEVENTUTILS_H
#define ALARMEVENTUTILS_H
#include <QUrl>
#include "alarmEventGlobal.h"
///////------structs-----
//RabbitMQ链接配置
struct RabbitMQConfig
{
QString host;
int port;
QString username;
QString password;
QString virtualHost;
QString exchangeName;
QString queueName;
QString routingKey;
int reconnectInterval; //重连间隔(毫秒)
int heartbeat;
bool autoAck;
RabbitMQConfig()
: port(5672)
, reconnectInterval(5000)
, heartbeat(60)
, autoAck(true)
{}
bool isValid() const
{
if(host.isEmpty())
{
qWarning() << "RabbitMQ host is empty";
return false;
}
if(port <= 0 || port > 65535)
{
qWarning() << "RabbitMQ port is invalid: " << port;
return false;
}
if(username.isEmpty())
{
qWarning() << "RabbitMQ username is empty";
return false;
}
if(exchangeName.isEmpty())
{
qWarning() << "RabbitMQ exchange name is empty";
return false;
}
if(queueName.isEmpty())
{
qWarning() << "RabbitMQ queue name is empty";
return false;
}
if(routingKey.isEmpty())
{
qWarning() << "RabbitMQ routingKey is empty";
return false;
}
if (reconnectInterval <= 0)
{
qWarning() << "RabbitMQ reconnect interval is invalid:" << reconnectInterval;
return false;
}
return true;
}
};
//历史数据服务配置
struct HistoricalConfig
{
QUrl baseUrl;
int timeout; //请求超时(毫秒)
QVariantMap requestHeaders;
int maxRetries; //最大重试次数
int retryInterval; //重试间隔
HistoricalConfig()
: timeout(3000)
, maxRetries(3)
, retryInterval(1000)
{}
bool isValid() const
{
if(!baseUrl.isValid())
{
qWarning() << "Historical service base URL is invalid:" << baseUrl.errorString();
return false;
}
if(timeout <= 0)
{
qWarning() << "Historical service timeout is invalid:" << timeout;
return false;
}
if(maxRetries < 0)
{
qWarning() << "Historical service max retries is invalid:" << maxRetries;
return false;
}
if(retryInterval <= 0)
{
qWarning() << "Historical service retry interval is invalid:" << retryInterval;
return false;
}
return true;
}
};
//缓存配置
struct CacheConfig
{
int maxSize; //缓存事件最大数量
int cleanupInterval; //清理间隔(毫秒)
bool enableStatistics; //是否统计
CacheConfig()
: maxSize(10000)
, cleanupInterval(60000) //1分钟
, enableStatistics(false)
{}
bool isValid() const
{
if(maxSize <= 0)
{
qWarning() << "Cache max size is invalid:" << maxSize;
return false;
}
if(cleanupInterval < 0 )
{
qWarning() << "Cache cleanup interval is invalid:" << cleanupInterval;
return false;
}
return true;
}
};
//统一服务配置
struct ServiceConfig
{
RabbitMQConfig rabbitMQConfig;
HistoricalConfig historicalConfig;
CacheConfig cacheConfig;
ServiceConfig() {}
bool isValid() const
{
return rabbitMQConfig.isValid() && historicalConfig.isValid() && cacheConfig.isValid();
}
//从JSON对象加载配置
static ServiceConfig fromJson(const QJsonObject& json);
//转化为JSON对象
QJsonObject toJson() const;
};
///////------enums-----
//服务状态
enum class ServiceStatus
{
Uninitialized,//未初始化
Initialized, //已初始化
Disconnected, //未连接
Connecting, //连接中
Connected, //已连接
Error, //错误状态
Reconnecting //重连中
};
//连接状态
enum class ConnectionStatus
{
Disconnected,
Connecting,
Connected
};
//错误严重程度
enum class ErrorSeverity
{
Info, //信息
Warning, //警告
Error, //错误
Critical //严重错误
};
//消息处理结果
enum class MessageHandleResult
{
Success,
ParseError, //解析错误
ValidationError, //验证错误
Duplicate //重复消息
};
//注册为元类型用于信号槽的chuandi
Q_DECLARE_METATYPE(ServiceStatus)
Q_DECLARE_METATYPE(ConnectionStatus)
Q_DECLARE_METATYPE(ErrorSeverity)
Q_DECLARE_METATYPE(MessageHandleResult)
///////------classes-----
class AlarmEventDataFilter
{
public:
AlarmEventDataFilter();
void setTimeRange(const QDateTime& start, const QDateTime& end) {m_startTime = start; m_endTime = end;}
void setStationFilter(const QString& station) {m_station = station;}
void setBayFilter(const QString& bay) {m_bay = bay;}
void setTypeFilter(int type) {m_type = type;}
void setSeverityFilter(const QString& severity) {m_severity = severity;}
void setDescriptionFilter(const QString& description) {m_description = description;}
void setConfirmStatusFilter(int status) {m_status = status;}
bool matches(const EventData& event);
void clear();
QVector<EventData> apply(const QVector<EventData>& events);
private:
bool isEmpty();
QDateTime m_startTime;
QDateTime m_endTime;
QString m_station;
QString m_bay;
int m_type;
QString m_severity;
QString m_description;
int m_status;
};
/**
* @brief 数据缓存
*
* 数据缓存的主要作用:
* 批量存储:当数据需要做本地存储时,可以先存入缓存,达到一定数量后批量进行存储,从而减少数据库的频繁操作
* 快速访问:按条件查询数据时,先从缓存中查找,减少数据库或网络操作
* 数据去重:避免存储重复数据
* 清理策略例如采用LRU自动清理最久未使用的数据从而控制内存内使用
*
* 若有以上场景,可以按需扩展该类,目前暂无场景
*/
class AlarmEventCache
{
public:
AlarmEventCache();
void setMaxSize(int maxSize);
int getMaxSize() const {return m_maxSize;}
void addEvent(const EventData& event);
void clear();
private:
void trimToSize();
int m_maxSize;
QVector<EventData> m_events;
};
#endif