fwhTaskShutdownStatistics.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package fwhQueue
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "fwh-toolbox-server/domain"
  7. "fwh-toolbox-server/jobs"
  8. "fwh-toolbox-server/repositories"
  9. "github.com/hibiken/asynq"
  10. "go.mongodb.org/mongo-driver/bson/primitive"
  11. "go.uber.org/zap"
  12. )
  13. // handleShutdownStatistics 是 Shutdown 统计任务的 Asynq handler
  14. func handleShutdownStatistics(ctx context.Context, task *asynq.Task) error {
  15. var payload domain.TaskShutdownStatistics
  16. if err := json.Unmarshal(task.Payload(), &payload); err != nil {
  17. return fmt.Errorf("unmarshal ShutdownStatistics payload: %w", err)
  18. }
  19. zap.L().Info("[ShutdownStats] 开始执行", zap.String("date", payload.Date))
  20. err := executeShutdownStatistics(ctx, payload)
  21. if err != nil {
  22. zap.L().Error("[ShutdownStats] 任务执行失败", zap.String("date", payload.Date), zap.String("err", err.Error()))
  23. return nil // 业务错误不重试
  24. }
  25. zap.L().Info("[ShutdownStats] 任务执行成功", zap.String("date", payload.Date))
  26. return nil
  27. }
  28. // executeShutdownStatistics 执行 Shutdown 统计
  29. func executeShutdownStatistics(ctx context.Context, payload domain.TaskShutdownStatistics) error {
  30. records, err := repositories.QuerySiteShutdownList(payload.Date, 0)
  31. if err != nil {
  32. return fmt.Errorf("查询 Shutdown 列表失败: %w", err)
  33. }
  34. // 分析 Shutdown 统计数据
  35. err = jobs.StatisticsShutdown(payload.Date, records, analysisShutdownSiteForNew)
  36. if err != nil {
  37. return fmt.Errorf("Shutdown 统计分析失败(date=%s): %w", payload.Date, err)
  38. }
  39. return nil
  40. }
  41. // analysisShutdownSiteForNew 为 Shutdown 统计触发站点分析
  42. // 复用原有逻辑,通过新队列入队
  43. func analysisShutdownSiteForNew(sn string, date string) (*primitive.ObjectID, error) {
  44. // 读取已完成或正在进行的站点分析
  45. queryTimePeriod := [2]string{date, date}
  46. queryTrigger := domain.TriggerAuto
  47. res, err := repositories.GetSiteAnalysisManageList(1, 1000, &sn, &queryTimePeriod, nil, &queryTrigger)
  48. if err != nil {
  49. return nil, err
  50. }
  51. if res == nil {
  52. return nil, fmt.Errorf("GetSiteAnalysisManageList 查询结果为空")
  53. }
  54. if len(res.Data) > 0 {
  55. return &res.Data[0].Id, nil
  56. }
  57. // 创建新的分析任务
  58. writeConfig := domain.SiteAnalysisConfigWrite{
  59. Sn: sn,
  60. Description: fmt.Sprintf("Shutdown站点分析 %s", date),
  61. TimePeriod: [2]string{date, date},
  62. Options: domain.SiteAnalysisOptions{
  63. EnableTimeline: true,
  64. EnableRuntime: true,
  65. },
  66. }
  67. id, err := repositories.InsertSiteAnalysisConfig(writeConfig, true)
  68. if err != nil {
  69. return nil, err
  70. }
  71. // 通过新队列入队站点分析任务
  72. EnqueueSiteAnalysisTask(domain.TaskSiteAnalysis{
  73. Id: id,
  74. Sn: writeConfig.Sn,
  75. TimePeriod: writeConfig.TimePeriod,
  76. Options: writeConfig.Options,
  77. })
  78. return &id, nil
  79. }