Files
nbi_alarm/handle/service/alarm.go
2023-08-24 20:37:19 +08:00

192 lines
5.6 KiB
Go
Raw Permalink 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.
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
}