taskSiteAnalysis.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. fmt.Println(payload.Options)
  56. if payload.Options.EnableTimeline {
  57. // 时间线展示功能
  58. // Site 时间线生成逻辑:
  59. // 1、分析MQTT日志0和101,获取离线上线状态
  60. // 2、分析事件日志,获取站点的事件触发记录
  61. // 3、分析告警日志,获取站点的告警开始-结束触发记录
  62. // 4、分析MQTT日志357,获取站点模式切换记录
  63. // 最终处理:获取事件时间点的MQTT日志201数据,关联到事件点。
  64. // if payload.SiteAnalysisOptions.EnableTimeline
  65. // 查询MQTT日志0和101
  66. fmt.Println("查询MQTT日志0")
  67. logList_0, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_0, startTime, endTime)
  68. if err != nil {
  69. zap.L().Error("查询MQTT日志0失败")
  70. return err
  71. }
  72. fmt.Println("查询MQTT日志101")
  73. logList_101, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_101, startTime, endTime)
  74. if err != nil {
  75. zap.L().Error("查询MQTT日志101失败")
  76. return err
  77. }
  78. // 查询站点的事件触发记录
  79. fmt.Println("查询站点的事件触发记录")
  80. eventLog, err := repositories.QueryEventOrAlarmListOnTimeRange(payload.Sn, startTime, endTime, repositories.Event)
  81. if err != nil {
  82. zap.L().Error("查询事件日志失败")
  83. return err
  84. }
  85. // 查询站点的告警开始-结束触发记录
  86. fmt.Println("查询站点的告警开始-结束触发记录")
  87. alarmLog, err := repositories.QueryEventOrAlarmListOnTimeRange(payload.Sn, startTime, endTime, repositories.Alarm)
  88. if err != nil {
  89. zap.L().Error("查询事件日志失败")
  90. return err
  91. }
  92. // 查询MQTT日志357
  93. fmt.Println("查询MQTT日志357")
  94. logList_357, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_357, startTime, endTime)
  95. if err != nil {
  96. zap.L().Error("查询MQTT日志357失败")
  97. return err
  98. }
  99. // 分析数据,并将结果写入数据库
  100. fmt.Println("分析数据,并将结果写入数据库")
  101. err = jobs.AnalysisSiteTimeline(payload.Id, jobs.SiteDataSet{
  102. Log_0: logList_0,
  103. Log_101: logList_101,
  104. Log_357: logList_357,
  105. EventLog: eventLog,
  106. AlarmLog: alarmLog,
  107. })
  108. if err != nil {
  109. zap.L().Error("站点时间线数据分析失败", zap.String("sn", payload.Sn))
  110. return err
  111. }
  112. }
  113. if payload.Options.EnableRuntime {
  114. // 实时数据展示
  115. // 查询MQTT日志201
  116. fmt.Println("查询MQTT日志201")
  117. logList_201, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_201, startTime, endTime)
  118. if err != nil {
  119. zap.L().Error("查询MQTT日志201失败")
  120. return err
  121. }
  122. // 分析数据,并将结果写入数据库
  123. fmt.Println("分析数据,并将结果写入数据库")
  124. err = jobs.AnalysisSiteRuntime(payload.Id, jobs.SiteDataSet{
  125. Log_201: logList_201,
  126. })
  127. if err != nil {
  128. zap.L().Error("站点运行时数据分析失败", zap.String("sn", payload.Sn))
  129. return err
  130. }
  131. }
  132. return nil
  133. }
  134. func EnqueueSiteAnalysisTask(payload domain.TaskSiteAnalysis) error {
  135. p := TaskPayload[domain.TaskSiteAnalysis]{
  136. TaskPayloadBase: TaskPayloadBase{
  137. Type: TaskTypeSiteAnalysis,
  138. },
  139. Payload: payload,
  140. }
  141. if err := EnqueueTask[domain.TaskSiteAnalysis](p); err != nil {
  142. logger.Std.Printf("EnqueueSiteAnalysisTask - %s : %s\n", payload.Id, err.Error())
  143. return err
  144. }
  145. return nil
  146. }