statisticsAlarm.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package jobs
  2. import (
  3. "fmt"
  4. "fwh-toolbox-server/domain"
  5. "fwh-toolbox-server/repositories"
  6. "time"
  7. "go.mongodb.org/mongo-driver/bson/primitive"
  8. "go.uber.org/zap"
  9. )
  10. func StatisticsAlarm(analysisFunc func(sn string, date string) (*primitive.ObjectID, error)) error {
  11. alarmStatisticsItem := domain.AlarmStatisticsItem{
  12. Id: nil,
  13. Date: "",
  14. Status: domain.AlarmStatisticsError,
  15. CodeStatistics: map[string]uint{},
  16. SiteMap: map[string]*primitive.ObjectID{},
  17. }
  18. err := statisticsAlarm(&alarmStatisticsItem, analysisFunc)
  19. if err != nil {
  20. repositories.InsertStatisticsAlarm(alarmStatisticsItem)
  21. return err
  22. }
  23. alarmStatisticsItem.Status = domain.AlarmStatisticsComplete
  24. repositories.InsertStatisticsAlarm(alarmStatisticsItem)
  25. return nil
  26. }
  27. func statisticsAlarm(alarmItem *domain.AlarmStatisticsItem, analysisFunc func(sn string, date string) (*primitive.ObjectID, error)) error {
  28. if alarmItem == nil {
  29. return fmt.Errorf("AlarmStatisticsItem参数为nil")
  30. }
  31. dateStr := time.Now().Format(time.DateTime)
  32. alarmItem.Date = dateStr
  33. var codeInfoList []domain.AlarmStatisticsInfo = []domain.AlarmStatisticsInfo{}
  34. var codeInfoTotal int = 0
  35. var codeInfoSize int = 0
  36. var codeInfoPage int = 1
  37. for {
  38. // 查询告警码列表
  39. records, err := repositories.QueryAlarmStatistics(domain.CTRY_ALL, codeInfoPage) // 请求所有告警统计
  40. if err != nil {
  41. return err
  42. }
  43. if records.Data != nil {
  44. codeInfoList = append(codeInfoList, records.Data.Records...)
  45. if codeInfoSize == 0 {
  46. codeInfoSize = records.Data.PageSize
  47. }
  48. if codeInfoTotal == 0 {
  49. codeInfoTotal = records.Data.PageTotal
  50. }
  51. } else {
  52. zap.L().Warn("告警统计数据为空", zap.String("date", dateStr))
  53. }
  54. // 判断数据是否查询完成
  55. if codeInfoPage*codeInfoSize >= codeInfoTotal {
  56. break
  57. }
  58. codeInfoPage++
  59. }
  60. // 收集告警码列表
  61. var codeList []string = []string{}
  62. for _, d := range codeInfoList {
  63. codeList = append(codeList, d.AlarmCode)
  64. alarmItem.CodeStatistics[d.AlarmCode] = uint(d.AlarmCount)
  65. }
  66. // 根据每个code查询站点SN列表
  67. var siteInfoList []domain.AlarmStatisticsFromCodeInfo = []domain.AlarmStatisticsFromCodeInfo{}
  68. for _, c := range codeList {
  69. var siteInfoTotal int = 0
  70. var siteInfoSize int = 0
  71. var siteInfoPage int = 1
  72. for {
  73. // 查询告警码对应的站点列表
  74. records, err := repositories.QueryAlarmStatisticsFromCode(domain.CTRY_ALL, c, siteInfoPage) // 请求所有告警统计
  75. if err != nil {
  76. return err
  77. }
  78. if records.Data != nil {
  79. siteInfoList = append(siteInfoList, records.Data.Records...)
  80. if siteInfoSize == 0 {
  81. siteInfoSize = records.Data.PageSize
  82. }
  83. if siteInfoTotal == 0 {
  84. siteInfoTotal = records.Data.PageTotal
  85. }
  86. } else {
  87. zap.L().Warn("告警统计站点数据为空", zap.String("date", dateStr))
  88. }
  89. // 判断数据是否查询完成
  90. if siteInfoPage*siteInfoSize >= siteInfoTotal {
  91. break
  92. }
  93. siteInfoPage++
  94. }
  95. }
  96. // 提取 SN - Date
  97. var siteDateMap map[string]string = map[string]string{}
  98. for _, info := range siteInfoList {
  99. alarmDate := info.LogTime[:10] // 提取日期部分
  100. siteDateMap[info.GatewayId] = alarmDate
  101. }
  102. // 添加到站点分析队列
  103. for sn, date := range siteDateMap {
  104. analysisId, err := analysisFunc(sn, date)
  105. if err != nil {
  106. zap.L().Error("自动触发站点分析失败", zap.String("err", err.Error()))
  107. alarmItem.SiteMap[sn] = nil
  108. continue
  109. }
  110. alarmItem.SiteMap[sn] = analysisId
  111. }
  112. return nil
  113. }