package service import ( "errors" "omc/core/db" "omc/core/emun" "omc/handle/model" "time" "github.com/aceld/zinx/zlog" ) // AlarmSeqCount alarm_seq大于等于的记录数 func AlarmSeqCount(neType, neId string, alarmSeq int64) int64 { var num int64 query := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ?", neType, neId) if alarmSeq > 0 { query = query.Where("alarm_seq >= ?", alarmSeq) } if err := query.Order("alarm_seq desc").Count(&num).Error; err != nil { zlog.Ins().ErrorF("HasAlarmSeq db error %s", err) return num } return num } // List 获取告警信息 alarm_seq大于等于的 func List(neType, neId string, alarmSeq int64) ([]model.Alarm, error) { // 从数据库读取告警记录 var alarms []model.Alarm if err := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ? and alarm_seq >= ?", neType, neId, alarmSeq).Order("alarm_seq asc").Find(&alarms).Error; err != nil { zlog.Ins().ErrorF("AlarmList db error %s", err) return nil, err } return alarms, nil } // ConvertOMCAlarm 转换上报的告警信息 func ConvertOMCAlarm(alarms []model.Alarm) []model.OmcAlarm { result := make([]model.OmcAlarm, 0) for _, v := range alarms { var item model.OmcAlarm item.AlarmSeq = v.AlarmSeq item.AlarmTitle = v.AlarmTitle item.AlarmStatus = v.AlarmStatus item.AlarmType = v.AlarmType item.OrigSeverity = emun.OrigSeverity(v.OrigSeverity) item.EventTime = v.EventTime.Format("2006-01-02 15:04:05") item.AlarmId = v.AlarmId item.SpecificProblemID = v.SpecificProblemId item.SpecificProblem = v.SpecificProblem item.NeUID = v.NeId item.NeName = v.NeName item.NeType = v.NeType item.ObjectUID = v.ObjectUid item.ObjectName = v.NeName item.ObjectType = v.ObjectType item.LocationInfo = v.LocationInfo item.AddInfo = v.AddInfo item.PVFlag = v.PvFlag item.Province = v.Province result = append(result, item) } return result } // 检查列表里最大的AlarmSeq func MaxAlarmSeq(current int64, alarms []model.OmcAlarm) int64 { var maxAlarmSeq = current for _, v := range alarms { if v.AlarmSeq > maxAlarmSeq { maxAlarmSeq = v.AlarmSeq } } return maxAlarmSeq } // LastAlarmSeq 获取最新的alarm_seq 序号 func LastAlarmSeq(neType, neId string) int64 { var alarm model.Alarm if err := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ?", neType, neId).Order("alarm_seq desc").First(&alarm).Error; err != nil { zlog.Ins().ErrorF("LastAlarmSeq db error %s", err) return 0 } return alarm.AlarmSeq } // List 获取告警信息为文件保存 func ListForSaveFile(neType, neId string, alarmSeq int64, startTime, endTime, syncSource string) ([]model.Alarm, error) { // 基于OMC数据库的存量活动告警数据文件 if syncSource == "0" { // 取告警发生的时间,即告警本身的event_time return alarmByEventTime(neType, neId, startTime, endTime) } // 基于告警消息日志的告警消息流水数据文件 if syncSource == "1" { if alarmSeq > 0 { // 只适用于syncSource=1的情况 同步告警的起始告警消息序号 return alarmByAlarmSeq(neType, neId, alarmSeq) } else { // 取北向接口记录日志流水的时间 return alarmByLog(neType, neId, startTime, endTime) } } return []model.Alarm{}, nil } // 取告警发生的时间,即告警本身的event_time func alarmByEventTime(neType, neId, startTime, endTime string) ([]model.Alarm, error) { var alarms []model.Alarm if startTime == "" && endTime == "" { return alarms, nil } query := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ?", neType, neId) // 从当前告警中最早的开始 if startTime != "" { startT, err := time.Parse("2006-01-02 15:04:05", startTime) if err != nil { return nil, errors.New("startTime invalid") } query = query.Where("event_time >= ?", startT) } // 取到当前最新的告警截止 if endTime != "" { endT, err := time.Parse("2006-01-02 15:04:05", endTime) if err != nil { return nil, errors.New("endTime invalid") } query = query.Where("event_time <= ?", endT) } // 查询 if err := query.Order("alarm_seq asc").Find(&alarms).Error; err != nil { return nil, err } return alarms, nil } // 同步告警的起始告警消息序号 func alarmByAlarmSeq(neType, neId string, alarmSeq int64) ([]model.Alarm, error) { var alarms []model.Alarm // 查询 query := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ? and alarm_seq >= ?", neType, neId, alarmSeq) if err := query.Order("alarm_seq asc").Find(&alarms).Error; err != nil { return nil, err } return alarms, nil } // 取北向接口记录日志流水的时间 func alarmByLog(neType, neId, startTime, endTime string) ([]model.Alarm, error) { var alarms []model.Alarm if startTime == "" && endTime == "" { return alarms, nil } var aIDs []int64 query := db.Client.Model(&model.NbiAlarmLog{}).Select("distinct a_id").Where("ne_type = ? and ne_id = ?", neType, neId) // 从当前告警中最早的开始 if startTime != "" { startT, err := time.Parse("2006-01-02 15:04:05", startTime) if err != nil { return nil, errors.New("startTime invalid") } query = query.Where("log_time >= ?", startT) } // 取到当前最新的告警截止 if endTime != "" { endT, err := time.Parse("2006-01-02 15:04:05", endTime) if err != nil { return nil, errors.New("endTime invalid") } query = query.Where("log_time <= ?", endT) } // 查询记录日志流水的id组 if err := query.Order("alarm_seq asc").Find(&aIDs).Error; err != nil { return nil, err } // 查询告警本身的记录 if err := db.Client.Model(&model.Alarm{}).Where("id in (?)", aIDs).Find(&alarms).Error; err != nil { return nil, err } return alarms, nil }