taskSiteAnalysis.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package taskQueue
  2. import (
  3. "context"
  4. "fmt"
  5. "fwh-toolbox-server/domain"
  6. "fwh-toolbox-server/jobs"
  7. "fwh-toolbox-server/logger"
  8. "fwh-toolbox-server/repositories"
  9. "time"
  10. "go.uber.org/zap"
  11. )
  12. var (
  13. TaskTypeSiteAnalysis = "task_SiteAnalysis"
  14. )
  15. // type TaskSiteAnalysis = types.TaskSiteAnalysis
  16. func handleTaskSiteAnalysis(ctx context.Context, payload domain.TaskSiteAnalysis) error {
  17. // 更新运行状态
  18. fmt.Println("更新任务运行状态")
  19. if repoErr := repositories.UpdateSiteAnalysisResult(payload.Id, domain.ProgressRunning); repoErr != nil {
  20. zap.L().Error("更新站点分析结果状态失败(Running)", zap.String("id", payload.Id.String()))
  21. return repoErr
  22. }
  23. fmt.Printf("开始执行任务 %v\n", payload)
  24. err := executeTaskSiteAnalysis(ctx, payload)
  25. // 记录任务执行结果
  26. if err != nil {
  27. fmt.Printf("任务执行失败 %s\n", err.Error())
  28. if repoErr := repositories.UpdateSiteAnalysisResult(payload.Id, domain.ProgressError); repoErr != nil {
  29. zap.L().Error("更新站点分析结果状态失败(Error)", zap.String("id", payload.Id.String()))
  30. return repoErr
  31. }
  32. } else {
  33. fmt.Println("任务执行成功")
  34. if repoErr := repositories.UpdateSiteAnalysisResult(payload.Id, domain.ProgressComplete); repoErr != nil {
  35. zap.L().Error("更新站点分析结果状态失败(Complete)", zap.String("id", payload.Id.String()))
  36. return repoErr
  37. }
  38. }
  39. return err
  40. }
  41. var executeTaskSiteAnalysis = func(ctx context.Context, payload domain.TaskSiteAnalysis) error {
  42. // 转换时间范围,只取用日期部分
  43. startTime, err := time.Parse(time.DateOnly, payload.TimePeriod[0])
  44. if err != nil {
  45. zap.L().Error("StartTime 格式错误", zap.String("time", payload.TimePeriod[0]))
  46. return err
  47. }
  48. endTime, err := time.Parse(time.DateOnly, payload.TimePeriod[1])
  49. if err != nil {
  50. zap.L().Error("EndTime 格式错误", zap.String("time", payload.TimePeriod[1]))
  51. return err
  52. }
  53. // 将 endTime 调整到当天的 23:59:59
  54. endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
  55. if payload.Options.EnableTimeline {
  56. // 时间线展示功能
  57. // Site 时间线生成逻辑:
  58. // 1、分析MQTT日志0和101,获取离线上线状态
  59. // 2、分析事件日志,获取站点的事件触发记录
  60. // 3、分析告警日志,获取站点的告警开始-结束触发记录
  61. // 4、分析MQTT日志357,获取站点模式切换记录
  62. // 最终处理:获取事件时间点的MQTT日志201数据,关联到事件点。
  63. // if payload.SiteAnalysisOptions.EnableTimeline
  64. // 查询MQTT日志0和101
  65. fmt.Println("查询MQTT日志0")
  66. logList_0, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_0, startTime, endTime)
  67. if err != nil {
  68. zap.L().Error("查询MQTT日志0失败")
  69. return err
  70. }
  71. fmt.Println("查询MQTT日志101")
  72. logList_101, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_101, startTime, endTime)
  73. if err != nil {
  74. zap.L().Error("查询MQTT日志101失败")
  75. return err
  76. }
  77. // 查询站点的事件触发记录
  78. fmt.Println("查询站点的事件触发记录")
  79. eventLog, err := repositories.QueryEventOrAlarmListOnTimeRange(payload.Sn, startTime, endTime, repositories.Event)
  80. if err != nil {
  81. zap.L().Error("查询事件日志失败")
  82. return err
  83. }
  84. // 查询站点的告警开始-结束触发记录
  85. fmt.Println("查询站点的告警开始-结束触发记录")
  86. alarmLog, err := repositories.QueryEventOrAlarmListOnTimeRange(payload.Sn, startTime, endTime, repositories.Alarm)
  87. if err != nil {
  88. zap.L().Error("查询事件日志失败")
  89. return err
  90. }
  91. // 查询MQTT日志357
  92. fmt.Println("查询MQTT日志357")
  93. logList_357, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_357, startTime, endTime)
  94. if err != nil {
  95. zap.L().Error("查询MQTT日志357失败")
  96. return err
  97. }
  98. // 分析数据,并将结果写入数据库
  99. fmt.Println("分析数据,并将结果写入数据库")
  100. err = jobs.AnalysisSiteTimeline(payload.Id, jobs.SiteDataSet{
  101. Log_0: logList_0,
  102. Log_101: logList_101,
  103. Log_357: logList_357,
  104. EventLog: eventLog,
  105. AlarmLog: alarmLog,
  106. })
  107. if err != nil {
  108. zap.L().Error("站点时间线数据分析失败", zap.String("sn", payload.Sn))
  109. return err
  110. }
  111. }
  112. // if payload.Options.EnableRuntime {
  113. // // 实时数据展示
  114. // }
  115. return nil
  116. }
  117. func EnqueueSiteAnalysisTask(payload domain.TaskSiteAnalysis) error {
  118. p := TaskPayload[domain.TaskSiteAnalysis]{
  119. TaskPayloadBase: TaskPayloadBase{
  120. Type: TaskTypeSiteAnalysis,
  121. },
  122. Payload: payload,
  123. }
  124. if err := EnqueueTask[domain.TaskSiteAnalysis](p); err != nil {
  125. logger.Std.Printf("EnqueueSiteAnalysisTask - %s : %s\n", payload.Id, err.Error())
  126. return err
  127. }
  128. return nil
  129. }