package fwhQueue import ( "context" "encoding/json" "fmt" "fwh-toolbox-server/domain" "fwh-toolbox-server/dto" "fwh-toolbox-server/repositories" "github.com/hibiken/asynq" "go.uber.org/zap" ) // handleSiteInfoUpdate 是站点信息更新任务的 Asynq handler func handleSiteInfoUpdate(ctx context.Context, task *asynq.Task) error { var payload domain.TaskSiteInfoUpdate if err := json.Unmarshal(task.Payload(), &payload); err != nil { return fmt.Errorf("unmarshal SiteInfoUpdate payload: %w", err) } taskId := payload.Id.Hex() // 更新运行状态 if err := repositories.UpdateSiteInfoUpdateResult(payload.Id, domain.ProgressRunning, 0); err != nil { zap.L().Error("[SiteInfoUpdate] 更新状态失败(Running)", zap.String("id", taskId)) return err } // 执行任务 total, err := executeSiteInfoUpdate(ctx, payload) if err != nil { zap.L().Error("[SiteInfoUpdate] 任务执行失败", zap.String("id", taskId), zap.String("err", err.Error())) repositories.UpdateSiteInfoUpdateResult(payload.Id, domain.ProgressError, 0) return nil // 业务错误不重试 } zap.L().Info("[SiteInfoUpdate] 任务执行成功", zap.String("id", taskId), zap.Uint64("total", total)) repositories.UpdateSiteInfoUpdateResult(payload.Id, domain.ProgressComplete, total) return nil } // executeSiteInfoUpdate 执行站点信息更新 func executeSiteInfoUpdate(ctx context.Context, payload domain.TaskSiteInfoUpdate) (uint64, error) { var pageSize uint = 50 var pageNum uint = 1 var total uint64 = 0 var realTotal uint64 = 0 for { resp, err := repositories.QuerySiteInfoList(dto.SiteInfoPara{ PageSize: pageSize, PageNum: pageNum, }) if err != nil { return 0, fmt.Errorf("查询站点信息失败(page=%d): %w", pageNum, err) } for _, info := range *resp.Result { if err := repositories.InsertSiteInfoData(*domain.FwhSiteInfoToSiteInfoDomain(&info)); err != nil { return 0, fmt.Errorf("保存站点信息失败(page=%d): %w", pageNum, err) } realTotal++ } pageNum++ total = resp.Total if (int64(pageNum)-1)*int64(pageSize) >= int64(total) { break } } return realTotal, nil }