package jobs import ( "fwh-toolbox-server/domain" "fwh-toolbox-server/repositories" "time" "go.mongodb.org/mongo-driver/bson/primitive" "go.uber.org/zap" ) func StatisticsShutdown(date string, data []domain.ShutdownRecord, analysisFunc func(sn string, date string) (*primitive.ObjectID, error)) error { _, err := time.Parse(time.DateOnly, date) if err != nil { zap.L().Error("StatisticsShutdown日期参数错误", zap.String("date", date)) return err } item, err := statisticsShutdown(date, data, analysisFunc) if err != nil { repositories.InsertStatisticsShutdown(domain.ShutdownStatisticsItem{ Date: date, Status: domain.ShutdownStatisticsError, }) return err } repositories.InsertStatisticsShutdown(*item) return nil } // 分析统计告警关机站点 // analysisFunc为触发站点分析任务的回调函数 func statisticsShutdown(date string, data []domain.ShutdownRecord, analysisFunc func(sn string, date string) (*primitive.ObjectID, error)) (*domain.ShutdownStatisticsItem, error) { siteMap := make(map[string]domain.ShutdownStatisticsInfo) var siteCount domain.ShutdownStatisticsArea[uint] var country string for _, d := range data { sn := d.GatewayId activeTime := d.ActiveTime deviceTime := d.DeviceTime shutdownType := d.ShutdownType country = d.Country // 解析为 time.Time timeActive, err := time.Parse(time.DateTime, activeTime) if err != nil { zap.L().Error("ActiveTime解析错误", zap.String("ActiveTime", activeTime)) return nil, err } timeAlarm, err := time.Parse(time.DateTime, deviceTime) if err != nil { zap.L().Error("DeviceTime解析错误", zap.String("DeviceTime", deviceTime)) return nil, err } // 如果告警发生在激活之前,则不统计 if timeAlarm.Before(timeActive) { continue } info := siteMap[sn] if info.SiteAnalysisId == nil { siteCount.ALL++ switch country { case "美国": siteCount.US++ case "澳大利亚": siteCount.AU++ } // 触发一次站点分析 var siteAnalysisId *primitive.ObjectID = nil analysisId, err := analysisFunc(sn, date) if err != nil { zap.L().Error("自动触发站点分析失败", zap.String("err", err.Error())) } else { siteAnalysisId = analysisId } info.SiteAnalysisId = siteAnalysisId } info.ShutdownTimeList = append(info.ShutdownTimeList, domain.ShutdownTimePointInfo{ Time: deviceTime, Type: shutdownType, }) siteMap[sn] = info } item := domain.ShutdownStatisticsItem{ Date: date, Status: domain.ShutdownStatisticsComplete, Count: siteCount, Country: country, SiteMap: siteMap, } return &item, nil }