fwhTaskSiteAnalysis.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package fwhQueue
  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()), zap.String("err", repoErr.Error()))
  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]), zap.String("err", err.Error()))
  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]), zap.String("err", err.Error()))
  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. // 创建记录数据库用于存储原始MQTT日志请求数据
  57. queryRecord, err := repositories.CreateSitesAnalysisRecordTable(string(payload.Id.Hex()))
  58. if err != nil {
  59. return err
  60. }
  61. if payload.Options.EnableTimeline {
  62. // 时间线展示功能
  63. // Site 时间线生成逻辑:
  64. // 1、分析MQTT日志0和101,获取离线上线状态
  65. // 2、分析事件日志,获取站点的事件触发记录
  66. // 3、分析告警日志,获取站点的告警开始-结束触发记录
  67. // 4、分析MQTT日志357,获取站点模式切换记录
  68. // 最终处理:获取事件时间点的MQTT日志201数据,关联到事件点。
  69. // if payload.SiteAnalysisOptions.EnableTimeline
  70. // 查询MQTT日志0和101
  71. fmt.Println("查询MQTT日志0")
  72. logList_0, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_0, startTime, endTime)
  73. if err != nil {
  74. zap.L().Error("查询MQTT日志0失败", zap.String("err", err.Error()))
  75. return err
  76. }
  77. for _, l := range logList_0 {
  78. if err := queryRecord.InsertSitesAnalysisRecord(l); err != nil {
  79. return err
  80. }
  81. }
  82. fmt.Println("查询MQTT日志101")
  83. logList_101, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_101, startTime, endTime)
  84. if err != nil {
  85. zap.L().Error("查询MQTT日志101失败", zap.String("err", err.Error()))
  86. return err
  87. }
  88. for _, l := range logList_101 {
  89. if err := queryRecord.InsertSitesAnalysisRecord(l); err != nil {
  90. return err
  91. }
  92. }
  93. // 查询站点的事件触发记录
  94. fmt.Println("查询站点的事件触发记录")
  95. eventLog, err := repositories.QueryEventOrAlarmListOnTimeRange(payload.Sn, startTime, endTime, repositories.Event)
  96. if err != nil {
  97. zap.L().Error("查询事件日志失败", zap.String("err", err.Error()))
  98. return err
  99. }
  100. time.Sleep(time.Second) // 延时1s
  101. // 查询站点的告警开始-结束触发记录
  102. fmt.Println("查询站点的告警开始-结束触发记录")
  103. alarmLog, err := repositories.QueryEventOrAlarmListOnTimeRange(payload.Sn, startTime, endTime, repositories.Alarm)
  104. if err != nil {
  105. zap.L().Error("查询事件日志失败", zap.String("err", err.Error()))
  106. return err
  107. }
  108. time.Sleep(time.Second) // 延时1s
  109. // 查询MQTT日志357
  110. logList_357, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_357, startTime, endTime)
  111. if err != nil {
  112. zap.L().Error("查询MQTT日志357失败", zap.String("err", err.Error()))
  113. return err
  114. }
  115. for _, l := range logList_357 {
  116. if err := queryRecord.InsertSitesAnalysisRecord(l); err != nil {
  117. return err
  118. }
  119. }
  120. // 分析数据,并将结果写入数据库
  121. fmt.Println("分析数据,并将结果写入数据库")
  122. err = jobs.AnalysisSiteTimeline(payload.Id, jobs.SiteDataSet{
  123. Log_0: logList_0,
  124. Log_101: logList_101,
  125. Log_357: logList_357,
  126. EventLog: eventLog,
  127. AlarmLog: alarmLog,
  128. })
  129. if err != nil {
  130. zap.L().Error("站点时间线数据分析失败", zap.String("sn", payload.Sn), zap.String("err", err.Error()))
  131. return err
  132. }
  133. }
  134. if payload.Options.EnableRuntime {
  135. // 实时数据展示
  136. // 查询MQTT日志201
  137. fmt.Println("查询MQTT日志201")
  138. logList_201, err := repositories.QueryMqttLogListOnTimeRange(payload.Sn, domain.MQTT_LOG_201, startTime, endTime)
  139. if err != nil {
  140. zap.L().Error("查询MQTT日志201失败", zap.String("err", err.Error()))
  141. return err
  142. }
  143. for _, l := range logList_201 {
  144. if err := queryRecord.InsertSitesAnalysisRecord(l); err != nil {
  145. return err
  146. }
  147. }
  148. // 分析数据,并将结果写入数据库
  149. fmt.Println("分析数据,并将结果写入数据库")
  150. err = jobs.AnalysisSiteRuntime(payload.Id, jobs.SiteDataSet{
  151. Log_201: logList_201,
  152. })
  153. if err != nil {
  154. zap.L().Error("站点运行时数据分析失败", zap.String("sn", payload.Sn), zap.String("err", err.Error()))
  155. return err
  156. }
  157. }
  158. return nil
  159. }
  160. // 插入站点分析队列
  161. // payload - 任务参数
  162. // auto - 是否是自动插入
  163. func EnqueueSiteAnalysisTask(payload domain.TaskSiteAnalysis, auto bool) error {
  164. p := TaskPayload[domain.TaskSiteAnalysis]{
  165. TaskPayloadBase: TaskPayloadBase{
  166. Type: TaskTypeSiteAnalysis,
  167. },
  168. Payload: payload,
  169. }
  170. if err := EnqueueTask[domain.TaskSiteAnalysis](p); err != nil {
  171. logger.Std.Printf("EnqueueSiteAnalysisTask - %s : %s\n", payload.Id, err.Error())
  172. return err
  173. }
  174. return nil
  175. }