package jobs import ( "fmt" "fwh-toolbox-server/domain" "fwh-toolbox-server/repositories" "time" "go.mongodb.org/mongo-driver/bson/primitive" "go.uber.org/zap" ) func StatisticsAlarm(analysisFunc func(sn string, date string) (*primitive.ObjectID, error)) error { alarmStatisticsItem := domain.AlarmStatisticsItem{ Id: nil, Date: "", Status: domain.AlarmStatisticsError, CodeStatistics: map[string]uint{}, SiteMap: map[string]*primitive.ObjectID{}, } err := statisticsAlarm(&alarmStatisticsItem, analysisFunc) if err != nil { repositories.InsertStatisticsAlarm(alarmStatisticsItem) return err } alarmStatisticsItem.Status = domain.AlarmStatisticsComplete repositories.InsertStatisticsAlarm(alarmStatisticsItem) return nil } func statisticsAlarm(alarmItem *domain.AlarmStatisticsItem, analysisFunc func(sn string, date string) (*primitive.ObjectID, error)) error { if alarmItem == nil { return fmt.Errorf("AlarmStatisticsItem参数为nil") } dateStr := time.Now().Format(time.DateTime) alarmItem.Date = dateStr var codeInfoList []domain.AlarmStatisticsInfo = []domain.AlarmStatisticsInfo{} var codeInfoTotal int = 0 var codeInfoSize int = 0 var codeInfoPage int = 1 for { // 查询告警码列表 records, err := repositories.QueryAlarmStatistics(domain.CTRY_ALL, codeInfoPage) // 请求所有告警统计 if err != nil { return err } if records.Data != nil { codeInfoList = append(codeInfoList, records.Data.Records...) if codeInfoSize == 0 { codeInfoSize = records.Data.PageSize } if codeInfoTotal == 0 { codeInfoTotal = records.Data.PageTotal } } else { zap.L().Warn("告警统计数据为空", zap.String("date", dateStr)) } // 判断数据是否查询完成 if codeInfoPage*codeInfoSize >= codeInfoTotal { break } codeInfoPage++ } // 收集告警码列表 var codeList []string = []string{} for _, d := range codeInfoList { codeList = append(codeList, d.AlarmCode) alarmItem.CodeStatistics[d.AlarmCode] = uint(d.AlarmCount) } // 根据每个code查询站点SN列表 var siteInfoList []domain.AlarmStatisticsFromCodeInfo = []domain.AlarmStatisticsFromCodeInfo{} for _, c := range codeList { var siteInfoTotal int = 0 var siteInfoSize int = 0 var siteInfoPage int = 1 for { // 查询告警码对应的站点列表 records, err := repositories.QueryAlarmStatisticsFromCode(domain.CTRY_ALL, c, siteInfoPage) // 请求所有告警统计 if err != nil { return err } if records.Data != nil { siteInfoList = append(siteInfoList, records.Data.Records...) if siteInfoSize == 0 { siteInfoSize = records.Data.PageSize } if siteInfoTotal == 0 { siteInfoTotal = records.Data.PageTotal } } else { zap.L().Warn("告警统计站点数据为空", zap.String("date", dateStr)) } // 判断数据是否查询完成 if siteInfoPage*siteInfoSize >= siteInfoTotal { break } siteInfoPage++ } } // 提取 SN - Date var siteDateMap map[string]string = map[string]string{} for _, info := range siteInfoList { alarmDate := info.LogTime[:10] // 提取日期部分 siteDateMap[info.GatewayId] = alarmDate } // 添加到站点分析队列 for sn, date := range siteDateMap { analysisId, err := analysisFunc(sn, date) if err != nil { zap.L().Error("自动触发站点分析失败", zap.String("err", err.Error())) alarmItem.SiteMap[sn] = nil continue } alarmItem.SiteMap[sn] = analysisId } return nil }