| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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
- }
|