| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- 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
- }
|