diff --git a/handle/api/req_sync_alarm_file.go b/handle/api/req_sync_alarm_file.go index 57f8326..9b1e083 100644 --- a/handle/api/req_sync_alarm_file.go +++ b/handle/api/req_sync_alarm_file.go @@ -45,7 +45,7 @@ func (s *ReqSyncAlarmFile) Handle(request ziface.IRequest) { fmt.Println(endTime) } alarmSeq, alarmSeqOk := body.Data["alarmSeq"] - if !alarmSeqOk { + if !alarmSeqOk || alarmSeq == "" { fmt.Println(alarmSeq) alarmSeq = "0" } @@ -76,11 +76,15 @@ func (s *ReqSyncAlarmFile) Handle(request ziface.IRequest) { seq = 0 } - //check alarmSeq 是否存在 + // check alarmSeq 是否存在 neBind, _ := parse.ConvertBindFlag(m.BindFlag) - alarmSeqCount := service.AlarmSeqCount(neBind.NeType, neBind.NeId, int64(seq)) - if alarmSeqCount > 0 { - + alarm, err := service.ListForSaveFile(neBind.NeType, neBind.NeId, int64(seq), startTime, endTime, syncSource) + if err != nil { + zlog.Ins().ErrorF("no permissions ") + request.GetConnection().SendMsg(ReqSyncAlarmFileType, core.ResultError(ReqSyncAlarmFileName, "no permissions", reqId)) + return + } + if len(alarm) > 0 { request.GetConnection().SendMsg(ReqSyncAlarmFileResultType, core.Result(ReqSyncAlarmFileResultName, map[string]string{ "reqId": reqId, "result": "succ", diff --git a/handle/service/alarm.go b/handle/service/alarm.go index 2ae048e..f89b765 100644 --- a/handle/service/alarm.go +++ b/handle/service/alarm.go @@ -1,9 +1,11 @@ package service import ( + "errors" "omc/core/db" "omc/core/emun" "omc/handle/model" + "time" "github.com/aceld/zinx/zlog" ) @@ -11,11 +13,11 @@ import ( // AlarmSeqCount alarm_seq大于等于的记录数 func AlarmSeqCount(neType, neId string, alarmSeq int64) int64 { var num int64 - tx := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ?", neType, neId) + query := db.Client.Model(&model.Alarm{}).Where("ne_type = ? and ne_id = ?", neType, neId) if alarmSeq > 0 { - tx = tx.Where("alarm_seq >= ?", alarmSeq) + query = query.Where("alarm_seq >= ?", alarmSeq) } - if err := tx.Order("alarm_seq desc").Count(&num).Error; err != nil { + if err := query.Order("alarm_seq desc").Count(&num).Error; err != nil { zlog.Ins().ErrorF("HasAlarmSeq db error %s", err) return num } @@ -85,26 +87,105 @@ func LastAlarmSeq(neType, neId string) int64 { // 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) - } else { + } + + // 基于告警消息日志的告警消息流水数据文件 + if syncSource == "1" { if alarmSeq > 0 { - return GetAlarmOfAlarmSeq(neType, neId, alarmSeq) + // 只适用于syncSource=1的情况 同步告警的起始告警消息序号 + return alarmByAlarmSeq(neType, neId, alarmSeq) } else { - return GetAlarmOfLog(neType, neId, startTime, endTime) + // 取北向接口记录日志流水的时间 + 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 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) + 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 alarmByEventTime(startTime, endTime string) { +// 同步告警的起始告警消息序号 +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 +} -} \ No newline at end of file +// 取北向接口记录日志流水的时间 +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 +}