fwhTaskSiteInfoUpdate.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package fwhQueue
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "fwh-toolbox-server/domain"
  7. "fwh-toolbox-server/dto"
  8. "fwh-toolbox-server/repositories"
  9. "github.com/hibiken/asynq"
  10. "go.uber.org/zap"
  11. )
  12. // handleSiteInfoUpdate 是站点信息更新任务的 Asynq handler
  13. func handleSiteInfoUpdate(ctx context.Context, task *asynq.Task) error {
  14. var payload domain.TaskSiteInfoUpdate
  15. if err := json.Unmarshal(task.Payload(), &payload); err != nil {
  16. return fmt.Errorf("unmarshal SiteInfoUpdate payload: %w", err)
  17. }
  18. taskId := payload.Id.Hex()
  19. // 更新运行状态
  20. if err := repositories.UpdateSiteInfoUpdateResult(payload.Id, domain.ProgressRunning, 0); err != nil {
  21. zap.L().Error("[SiteInfoUpdate] 更新状态失败(Running)", zap.String("id", taskId))
  22. return err
  23. }
  24. // 执行任务
  25. total, err := executeSiteInfoUpdate(ctx, payload)
  26. if err != nil {
  27. zap.L().Error("[SiteInfoUpdate] 任务执行失败", zap.String("id", taskId), zap.String("err", err.Error()))
  28. repositories.UpdateSiteInfoUpdateResult(payload.Id, domain.ProgressError, 0)
  29. return nil // 业务错误不重试
  30. }
  31. zap.L().Info("[SiteInfoUpdate] 任务执行成功", zap.String("id", taskId), zap.Uint64("total", total))
  32. repositories.UpdateSiteInfoUpdateResult(payload.Id, domain.ProgressComplete, total)
  33. return nil
  34. }
  35. // executeSiteInfoUpdate 执行站点信息更新
  36. func executeSiteInfoUpdate(ctx context.Context, payload domain.TaskSiteInfoUpdate) (uint64, error) {
  37. var pageSize uint = 50
  38. var pageNum uint = 1
  39. var total uint64 = 0
  40. var realTotal uint64 = 0
  41. for {
  42. resp, err := repositories.QuerySiteInfoList(dto.SiteInfoPara{
  43. PageSize: pageSize,
  44. PageNum: pageNum,
  45. })
  46. if err != nil {
  47. return 0, fmt.Errorf("查询站点信息失败(page=%d): %w", pageNum, err)
  48. }
  49. for _, info := range *resp.Result {
  50. if err := repositories.InsertSiteInfoData(*domain.FwhSiteInfoToSiteInfoDomain(&info)); err != nil {
  51. return 0, fmt.Errorf("保存站点信息失败(page=%d): %w", pageNum, err)
  52. }
  53. realTotal++
  54. }
  55. pageNum++
  56. total = resp.Total
  57. if (int64(pageNum)-1)*int64(pageSize) >= int64(total) {
  58. break
  59. }
  60. }
  61. return realTotal, nil
  62. }