hangguan.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // services/hangguan.go
  2. package services
  3. import (
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "go-policy-service/config"
  8. "go-policy-service/models"
  9. "go-policy-service/structs"
  10. "go-policy-service/utils"
  11. )
  12. type HangguanService struct {
  13. cfg *config.Config
  14. httpClient utils.HTTPClient
  15. tokenMgr *TokenManager
  16. }
  17. // 更新后的New方法
  18. func NewHangguanService(
  19. cfg *config.Config,
  20. httpClient utils.HTTPClient,
  21. tokenMgr *TokenManager,
  22. ) *HangguanService {
  23. return &HangguanService{
  24. cfg: cfg,
  25. httpClient: httpClient,
  26. tokenMgr: tokenMgr,
  27. }
  28. }
  29. func (s *HangguanService) requestSFDataConvert(task models.HgFlightSearchTask) ([]byte, error) {
  30. // 将 uint 日期转换为 YYYY-MM-DD 格式字符串)
  31. req := structs.ReqSearchFlightData{
  32. DepCode: task.Dep,
  33. ArrCode: task.Arr,
  34. Date: utils.TimestampToString(int64(task.Date), "2006-01-02"),
  35. }
  36. // 将结构体转换为 JSON
  37. jsonData, err := utils.StringJsonConvert(req)
  38. if err != nil {
  39. return []byte{}, fmt.Errorf("SF 请求数据转化失败: %w", err)
  40. }
  41. return jsonData, nil
  42. }
  43. func (h *HangguanService) RequestSFlightData(ctx context.Context, task models.HgFlightSearchTask) {
  44. token, err := h.tokenMgr.GetAccessToken()
  45. if err != nil {
  46. utils.Logger.WithField("task_id", task.ID).Error("Failed to get access token: ", err)
  47. }
  48. // 构建请求数据
  49. reqData, _ := h.requestSFDataConvert(task)
  50. // url
  51. url := fmt.Sprintf("%s%s?access_token=%s", h.cfg.HgApiUrl, "/distribution/api/search/flight/list", token)
  52. // 调用第三方接口
  53. resp, err := h.httpClient.RequestWithProxy(ctx, "POST", url, reqData, h.cfg.ProxyUrl) //测试使用
  54. //resp, err := h.httpClient.RequestJSON(ctx, "POST", url, reqData)
  55. if err != nil {
  56. utils.Logger.WithField("task_id", task.ID).Error("API request failed: ", err)
  57. return
  58. }
  59. //解析数据
  60. var srchResp structs.ResSearchFlight
  61. if err = json.Unmarshal(resp, &srchResp); err != nil {
  62. utils.Logger.WithField("task_id", task.ID).Error("数据解析失败: ", err)
  63. return
  64. }
  65. if !srchResp.Success {
  66. utils.Logger.WithField("task_id", task.ID).Error("数据请求失败: ", srchResp.Msg)
  67. return
  68. }
  69. // 处理响应数据
  70. err = processResponse(srchResp.Data)
  71. if err != nil {
  72. utils.Logger.WithField("task_id", task.ID).Error("Response processing failed: ", err)
  73. return
  74. }
  75. }
  76. func processResponse(response structs.ResSearchFlightData) error {
  77. // 实现具体的响应处理逻辑
  78. if response.Total <= 0 {
  79. return fmt.Errorf("返回数据为空")
  80. }
  81. return nil
  82. }