实现列表查询活跃告警和历史告警

This commit is contained in:
2025-11-10 13:41:26 +08:00
parent b94aa6137c
commit 37f515d4a8
13 changed files with 1792 additions and 70 deletions

View File

@@ -23,6 +23,18 @@ type ActiveAlarmListOptions struct {
OrderBy string // 排序字段,例如 "trigger_time DESC"
}
// HistoricalAlarmListOptions 定义了查询历史告警列表时的可选参数
type HistoricalAlarmListOptions struct {
SourceType *models.AlarmSourceType // 按告警来源类型过滤
SourceID *uint // 按告警来源ID过滤
Level *models.SeverityLevel // 按告警严重性等级过滤
TriggerTimeStart *time.Time // 告警触发时间范围 - 开始时间
TriggerTimeEnd *time.Time // 告警触发时间范围 - 结束时间
ResolveTimeStart *time.Time // 告警解决时间范围 - 开始时间 (对应 models.HistoricalAlarm.ResolveTime)
ResolveTimeEnd *time.Time // 告警解决时间范围 - 结束时间 (对应 models.HistoricalAlarm.ResolveTime)
OrderBy string // 排序字段,例如 "trigger_time DESC"
}
// AlarmRepository 定义了对告警模型的数据库操作接口
type AlarmRepository interface {
// CreateActiveAlarm 创建一条新的活跃告警记录
@@ -47,6 +59,10 @@ type AlarmRepository interface {
// 返回活跃告警列表、总记录数和错误。
ListActiveAlarms(ctx context.Context, opts ActiveAlarmListOptions, page, pageSize int) ([]models.ActiveAlarm, int64, error)
// ListHistoricalAlarms 支持分页和过滤的历史告警列表查询。
// 返回历史告警列表、总记录数和错误。
ListHistoricalAlarms(ctx context.Context, opts HistoricalAlarmListOptions, page, pageSize int) ([]models.HistoricalAlarm, int64, error)
// UpdateAlarmNotificationStatus 显式更新告警的通知相关状态字段。
// lastNotifiedAt: 传入具体的发送时间。
// isIgnored: 告警新的忽略状态。
@@ -148,7 +164,7 @@ func (r *gormAlarmRepository) ListActiveAlarms(ctx context.Context, opts ActiveA
repoCtx := logs.AddFuncName(ctx, r.ctx, "ListActiveAlarms")
// --- 校验分页参数 ---
if page <= 0 || pageSize <= 0 {
return nil, 0, ErrInvalidPagination // 复用已定义的错误
return nil, 0, ErrInvalidPagination
}
var results []models.ActiveAlarm
@@ -195,6 +211,61 @@ func (r *gormAlarmRepository) ListActiveAlarms(ctx context.Context, opts ActiveA
return results, total, err
}
// ListHistoricalAlarms 实现了分页和过滤查询历史告警记录的功能
func (r *gormAlarmRepository) ListHistoricalAlarms(ctx context.Context, opts HistoricalAlarmListOptions, page, pageSize int) ([]models.HistoricalAlarm, int64, error) {
repoCtx := logs.AddFuncName(ctx, r.ctx, "ListHistoricalAlarms")
// --- 校验分页参数 ---
if page <= 0 || pageSize <= 0 {
return nil, 0, ErrInvalidPagination
}
var results []models.HistoricalAlarm
var total int64
query := r.db.WithContext(repoCtx).Model(&models.HistoricalAlarm{})
// --- 应用过滤条件 ---
if opts.SourceType != nil {
query = query.Where("source_type = ?", *opts.SourceType)
}
if opts.SourceID != nil {
query = query.Where("source_id = ?", *opts.SourceID)
}
if opts.Level != nil {
query = query.Where("level = ?", *opts.Level)
}
if opts.TriggerTimeStart != nil {
query = query.Where("trigger_time >= ?", *opts.TriggerTimeStart)
}
if opts.TriggerTimeEnd != nil {
query = query.Where("trigger_time <= ?", *opts.TriggerTimeEnd)
}
if opts.ResolveTimeStart != nil { // 修改字段名
query = query.Where("resolve_time >= ?", *opts.ResolveTimeStart) // 修改查询字段名
}
if opts.ResolveTimeEnd != nil { // 修改字段名
query = query.Where("resolve_time <= ?", *opts.ResolveTimeEnd) // 修改查询字段名
}
// --- 计算总数 ---
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
// --- 应用排序条件 ---
orderBy := "trigger_time DESC" // 默认按触发时间倒序
if opts.OrderBy != "" {
orderBy = opts.OrderBy
}
query = query.Order(orderBy)
// --- 分页 ---
offset := (page - 1) * pageSize
err := query.Limit(pageSize).Offset(offset).Find(&results).Error
return results, total, err
}
func (r *gormAlarmRepository) UpdateAlarmNotificationStatus(ctx context.Context, alarmID uint, lastNotifiedAt time.Time, isIgnored bool, ignoredUntil *time.Time) error {
repoCtx := logs.AddFuncName(ctx, r.ctx, "UpdateAlarmNotificationStatus")