Files
be.ems/features/fm/relation.go
2025-05-23 18:24:18 +08:00

79 lines
2.1 KiB
Go

package fm
import (
"time"
"be.ems/lib/config"
"xorm.io/xorm"
)
func JudgeDerived(alarm *Alarm, session *xorm.Session) (parentId string, found bool) {
for _, rule := range config.RelationRules.Derived {
if alarm.AlarmCode == rule.ChildCode {
// 查询是否有 parent_code 的告警
var parent Alarm
has, _ := session.Table("alarm").
Where("alarm_code=? AND ne_id=? AND alarm_status=1", rule.ParentCode, alarm.NeId).
Get(&parent)
if has {
return parent.AlarmId, true
}
}
}
return "", false
}
func JudgeRelated(alarm *Alarm, session *xorm.Session, rules []config.RelatedRule) (relatedId string, found bool) {
for _, rule := range rules {
// 1. 检查 ne_type 是否匹配
if rule.NeType != "" && alarm.NeType != rule.NeType {
continue
}
// 2. 检查 code 是否在 codes 列表
codeMatch := false
for _, c := range rule.Codes {
if alarm.AlarmCode == c {
codeMatch = true
break
}
}
if !codeMatch {
continue
}
// 3. 查询同一ne_id、codes列表内、时间窗口内的其他告警
var brother Alarm
parsedTime, err := time.Parse(time.RFC3339, alarm.EventTime)
if err != nil {
continue
}
timeStart := parsedTime.Add(-time.Duration(rule.TimeWindow) * time.Second)
has, _ := session.Table("alarm").
Where("ne_id=? AND alarm_code IN (?) AND event_time BETWEEN ? AND ? AND alarm_id!=?",
alarm.NeId, rule.Codes, timeStart, alarm.EventTime, alarm.AlarmId).
Get(&brother)
if has {
return brother.AlarmId, true
}
}
return "", false
}
type AlarmRelation struct {
Id int64 `xorm:"pk autoincr 'id'"`
AlarmId string `xorm:"alarm_id"`
RelatedAlarmId string `xorm:"related_alarm_id"`
RelationType string `xorm:"relation_type"`
CreateAt time.Time `xorm:"create_at"`
}
func InsertAlarmRelation(session *xorm.Session, alarmId, relatedId, relationType string) (int64, error) {
relation := &AlarmRelation{
AlarmId: alarmId,
RelatedAlarmId: relatedId,
RelationType: relationType,
CreateAt: time.Now(),
}
_, err := session.Insert(relation)
return relation.Id, err // 返回插入的ID
}