statisticsShutdown.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package jobs
  2. import (
  3. "fwh-toolbox-server/domain"
  4. "fwh-toolbox-server/repositories"
  5. "time"
  6. "go.mongodb.org/mongo-driver/bson/primitive"
  7. "go.uber.org/zap"
  8. )
  9. func StatisticsShutdown(date string, data []domain.ShutdownRecord, analysisFunc func(sn string, date string) (*primitive.ObjectID, error)) error {
  10. _, err := time.Parse(time.DateOnly, date)
  11. if err != nil {
  12. zap.L().Error("StatisticsShutdown日期参数错误", zap.String("date", date))
  13. return err
  14. }
  15. item, err := statisticsShutdown(date, data, analysisFunc)
  16. if err != nil {
  17. repositories.InsertStatisticsShutdown(domain.ShutdownStatisticsItem{
  18. Date: date,
  19. Status: domain.ShutdownStatisticsError,
  20. })
  21. return err
  22. }
  23. repositories.InsertStatisticsShutdown(*item)
  24. return nil
  25. }
  26. // 分析统计告警关机站点
  27. // analysisFunc为触发站点分析任务的回调函数
  28. func statisticsShutdown(date string, data []domain.ShutdownRecord, analysisFunc func(sn string, date string) (*primitive.ObjectID, error)) (*domain.ShutdownStatisticsItem, error) {
  29. siteMap := make(map[string]domain.ShutdownStatisticsInfo)
  30. var siteCount domain.ShutdownStatisticsArea[uint]
  31. var country string
  32. for _, d := range data {
  33. sn := d.GatewayId
  34. activeTime := d.ActiveTime
  35. deviceTime := d.DeviceTime
  36. shutdownType := d.ShutdownType
  37. country = d.Country
  38. // 解析为 time.Time
  39. timeActive, err := time.Parse(time.DateTime, activeTime)
  40. if err != nil {
  41. zap.L().Error("ActiveTime解析错误", zap.String("ActiveTime", activeTime))
  42. return nil, err
  43. }
  44. timeAlarm, err := time.Parse(time.DateTime, deviceTime)
  45. if err != nil {
  46. zap.L().Error("DeviceTime解析错误", zap.String("DeviceTime", deviceTime))
  47. return nil, err
  48. }
  49. // 如果告警发生在激活之前,则不统计
  50. if timeAlarm.Before(timeActive) {
  51. continue
  52. }
  53. info := siteMap[sn]
  54. if info.SiteAnalysisId == nil {
  55. siteCount.ALL++
  56. switch country {
  57. case "美国":
  58. siteCount.US++
  59. case "澳大利亚":
  60. siteCount.AU++
  61. }
  62. // 触发一次站点分析
  63. var siteAnalysisId *primitive.ObjectID = nil
  64. analysisId, err := analysisFunc(sn, date)
  65. if err != nil {
  66. zap.L().Error("自动触发站点分析失败", zap.String("err", err.Error()))
  67. } else {
  68. siteAnalysisId = analysisId
  69. }
  70. info.SiteAnalysisId = siteAnalysisId
  71. }
  72. info.ShutdownTimeList = append(info.ShutdownTimeList, domain.ShutdownTimePointInfo{
  73. Time: deviceTime,
  74. Type: shutdownType,
  75. })
  76. siteMap[sn] = info
  77. }
  78. item := domain.ShutdownStatisticsItem{
  79. Date: date,
  80. Status: domain.ShutdownStatisticsComplete,
  81. Count: siteCount,
  82. Country: country,
  83. SiteMap: siteMap,
  84. }
  85. return &item, nil
  86. }