statisticsShutdown.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. for _, d := range data {
  31. sn := d.GatewayId
  32. activeTime := d.ActiveTime
  33. deviceTime := d.DeviceTime
  34. // 解析为 time.Time
  35. timeActive, err := time.Parse(time.DateTime, activeTime)
  36. if err != nil {
  37. zap.L().Error("ActiveTime解析错误", zap.String("ActiveTime", activeTime))
  38. return nil, err
  39. }
  40. timeAlarm, err := time.Parse(time.DateTime, deviceTime)
  41. if err != nil {
  42. zap.L().Error("DeviceTime解析错误", zap.String("DeviceTime", deviceTime))
  43. return nil, err
  44. }
  45. // 如果告警发生在激活之前,则不统计
  46. if timeAlarm.Before(timeActive) {
  47. continue
  48. }
  49. info := siteMap[sn]
  50. if info.SiteAnalysisId == nil {
  51. // 触发一次站点分析
  52. var siteAnalysisId *primitive.ObjectID = nil
  53. analysisId, err := analysisFunc(sn, date)
  54. if err != nil {
  55. zap.L().Error("自动触发站点分析失败", zap.String("err", err.Error()))
  56. } else {
  57. siteAnalysisId = analysisId
  58. }
  59. info.SiteAnalysisId = siteAnalysisId
  60. }
  61. info.ShutdownTimeList = append(info.ShutdownTimeList, deviceTime)
  62. siteMap[sn] = info
  63. }
  64. item := domain.ShutdownStatisticsItem{
  65. Date: date,
  66. Status: domain.ShutdownStatisticsComplete,
  67. SiteMap: siteMap,
  68. }
  69. return &item, nil
  70. }