// services/hangguan.go package services import ( "context" "encoding/json" "fmt" "go-policy-service/config" "go-policy-service/models" "go-policy-service/structs" "go-policy-service/utils" ) type HangguanService struct { cfg *config.Config httpClient utils.HTTPClient tokenMgr *TokenManager } // 更新后的New方法 func NewHangguanService( cfg *config.Config, httpClient utils.HTTPClient, tokenMgr *TokenManager, ) *HangguanService { return &HangguanService{ cfg: cfg, httpClient: httpClient, tokenMgr: tokenMgr, } } func (s *HangguanService) requestSFDataConvert(task models.HgFlightSearchTask) ([]byte, error) { // 将 uint 日期转换为 YYYY-MM-DD 格式字符串) req := structs.ReqSearchFlightData{ DepCode: task.Dep, ArrCode: task.Arr, Date: utils.TimestampToString(int64(task.Date), "2006-01-02"), } // 将结构体转换为 JSON jsonData, err := utils.StringJsonConvert(req) if err != nil { return []byte{}, fmt.Errorf("SF 请求数据转化失败: %w", err) } return jsonData, nil } func (h *HangguanService) RequestSFlightData(ctx context.Context, task models.HgFlightSearchTask) { token, err := h.tokenMgr.GetAccessToken() if err != nil { utils.Logger.WithField("task_id", task.ID).Error("Failed to get access token: ", err) } // 构建请求数据 reqData, _ := h.requestSFDataConvert(task) // url url := fmt.Sprintf("%s%s?access_token=%s", h.cfg.HgApiUrl, "/distribution/api/search/flight/list", token) // 调用第三方接口 resp, err := h.httpClient.RequestWithProxy(ctx, "POST", url, reqData, h.cfg.ProxyUrl) //测试使用 //resp, err := h.httpClient.RequestJSON(ctx, "POST", url, reqData) if err != nil { utils.Logger.WithField("task_id", task.ID).Error("API request failed: ", err) return } //解析数据 var srchResp structs.ResSearchFlight if err = json.Unmarshal(resp, &srchResp); err != nil { utils.Logger.WithField("task_id", task.ID).Error("数据解析失败: ", err) return } if !srchResp.Success { utils.Logger.WithField("task_id", task.ID).Error("数据请求失败: ", srchResp.Msg) return } // 处理响应数据 err = processResponse(srchResp.Data) if err != nil { utils.Logger.WithField("task_id", task.ID).Error("Response processing failed: ", err) return } } func processResponse(response structs.ResSearchFlightData) error { // 实现具体的响应处理逻辑 if response.Total <= 0 { return fmt.Errorf("返回数据为空") } return nil }