hangguan.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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) (string, 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 := json.Marshal(req)
  38. if err != nil {
  39. return "", fmt.Errorf("JSON 编码失败: %w", err)
  40. }
  41. return string(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. // 调用第三方接口
  51. resp, err := h.httpClient.PostJSON(ctx, h.cfg.HgApiUrl+"distribution/api/shopping/flight/list?token="+token, reqData)
  52. if err != nil {
  53. utils.Logger.WithField("task_id", task.ID).Error("API request failed: ", err)
  54. return
  55. }
  56. // 处理响应数据
  57. processedData, err := processResponse(resp)
  58. if err != nil {
  59. utils.Logger.WithField("task_id", task.ID).Error("Response processing failed: ", err)
  60. //models.UpdateTaskStatus(ctx, task.ID, "failed", task.Attempts+1)
  61. return
  62. }
  63. // 保存处理后的数据
  64. if err := models.SaveProcessedData(ctx, &models.ProcessedData{
  65. TaskID: task.ID,
  66. Data: processedData,
  67. }); err != nil {
  68. utils.Logger.WithField("task_id", task.ID).Error("Failed to save processed data: ", err)
  69. return
  70. }
  71. // 更新任务状态
  72. // if err := models.UpdateTaskStatus(ctx, task.ID, "completed", task.Attempts+1); err != nil {
  73. // utils.Logger.WithField("task_id", task.ID).Error("Failed to update task status: ", err)
  74. // }
  75. }
  76. func processResponse(response []byte) (string, error) {
  77. // 实现具体的响应处理逻辑
  78. // 示例:直接返回原始响应
  79. return string(response), nil
  80. }