Przeglądaj źródła

修复了一些 bug

light 6 miesięcy temu
rodzic
commit
1d3607102a

+ 1 - 1
models/task.go

@@ -11,7 +11,7 @@ type HgFlightSearchTask struct {
 	ID         uint   `gorm:"primaryKey;column:id"`
 	Dep        string `gorm:"type:varchar(12);column:dep"`
 	Arr        string `gorm:"type:varchar(12);column:arr"`
-	Date       uint   `gorm:"column:date"` // 通常是 YYYYMMDD 的整数表示
+	DateRange  string `gorm:"type:varchar(12);column:date_range"`
 	TripType   string `gorm:"type:char(2);column:trip_type"`
 	FlightNo   string `gorm:"type:varchar(12);column:flight_no"`
 	Flight     string `gorm:"type:char(2);column:flight"`

+ 45 - 30
services/hangguan.go

@@ -33,12 +33,13 @@ func NewHangguanService(
 	}
 }
 
-func (s *HangguanService) requestSFDataConvert(task models.HgFlightSearchTask) ([]byte, error) {
+func (s *HangguanService) requestSFDataConvert(task models.HgFlightSearchTask, startDate string) ([]byte, error) {
 	// 将 uint 日期转换为 YYYY-MM-DD 格式字符串)
 	req := structs.ReqSearchFlightData{
 		DepCode: task.Dep,
 		ArrCode: task.Arr,
-		Date:    utils.TimestampToString(int64(task.Date), "2006-01-02"),
+		Date:    startDate,
+		FlyNo:   task.FlightNo,
 	}
 
 	// 将结构体转换为 JSON
@@ -54,38 +55,51 @@ func (h *HangguanService) RequestSFlightData(ctx context.Context, task models.Hg
 	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)
+	//获取起飞时间列表
+	startDateList, err := utils.ParseDateRange(task.DateRange)
 	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)
+		utils.Logger.WithField("task_id", task.ID).Error("获取起飞日期时间列表错误: ", err)
 		return
 	}
+	for _, startDate := range startDateList {
+		// 构建请求数据
+		reqData, _ := h.requestSFDataConvert(task, startDate)
+		// url
+		url := fmt.Sprintf("%s%s?access_token=%s", h.cfg.HgApiUrl, "/distribution/api/search/flight/list", token)
+
+		// 记录请求数据
+		//utils.Logger.WithField("task_id", task.ID).Info("请求数据: ", string(reqData))
+		// 调用第三方接口
+		resp, err := h.httpClient.RequestWithProxy(ctx, "POST", url, reqData, h.cfg.ProxyUrl) //测试使用
+		//resp, err := h.httpClient.RequestJSON(ctx, "POST", url, reqData)
+		// 记录响应数据
+		//utils.Logger.WithField("task_id", task.ID).Info("响应数据: ", string(resp))
+		if err != nil {
+			utils.Logger.WithField("task_id", task.ID).Error("API request failed: ", err)
+			continue
+		}
+		//解析数据
+		var srchResp structs.ResSearchFlight
+		if err = json.Unmarshal(resp, &srchResp); err != nil {
+			utils.Logger.WithField("task_id", task.ID).Error("数据解析失败: ", err)
+			continue
+		}
 
-	if !srchResp.Success {
-		utils.Logger.WithField("task_id", task.ID).Error("数据请求失败: ", srchResp.Msg)
-		return
-	}
+		if !srchResp.Success {
+			utils.Logger.WithField("task_id", task.ID).Error("数据请求失败: ", srchResp.Msg)
+			continue
+		}
 
-	// 处理响应数据
-	err = h.processResponse(ctx, &task, &srchResp.Data)
-	if err != nil {
-		utils.Logger.WithField("task_id", task.ID).Error("Response processing failed: ", err)
-		return
+		// 处理响应数据
+		err = h.processResponse(ctx, &task, &srchResp.Data, startDate)
+		if err != nil {
+			utils.Logger.WithField("task_id", task.ID).Error("Response processing failed: ", err)
+			continue
+		}
 	}
 }
 
-func (h *HangguanService) processResponse(ctx context.Context, task *models.HgFlightSearchTask, response *structs.ResSearchFlightData) error {
+func (h *HangguanService) processResponse(ctx context.Context, task *models.HgFlightSearchTask, response *structs.ResSearchFlightData, startDate string) error {
 	// 实现具体的响应处理逻辑
 	if response.Total <= 0 {
 		return fmt.Errorf("返回数据为空")
@@ -134,6 +148,7 @@ func (h *HangguanService) processResponse(ctx context.Context, task *models.HgFl
 					PrintPrice:      cabinPrice.AdtPrice.Price,
 					Stock:           cabinPrice.Left,
 					FlightNo:        fltData.FlightInfo.FlyNo,
+					Cabin:           cabinPrice.BaseCabin,
 					FlightEndDate:   utils.DateFormmat(fltData.FlightInfo.ArrDateTime, "2006-01-02"),
 				}
 			}
@@ -150,10 +165,13 @@ func (h *HangguanService) processResponse(ctx context.Context, task *models.HgFl
 		Query: structs.Query{
 			DepAir:  task.Dep,
 			ArrAir:  task.Arr,
-			DepDate: utils.TimestampToString(int64(task.Date), "2006-01-02"),
+			DepDate: startDate,
 		},
 		ServiceTag: "hgSpecail",
 	}
+	// 推送数据打印成 json 格式
+	pushDataJson, _ := json.Marshal(pushData)
+	utils.Logger.WithField("task_id", task.ID).Info("推送数据: ", string(pushDataJson))
 	// 推送数据
 	if err := h.PushPolicyData(ctx, pushData); err != nil {
 		utils.Logger.WithField("task_id", task.ID).Error("推送失败: ", err)
@@ -167,9 +185,6 @@ func (h *HangguanService) PushPolicyData(ctx context.Context, data structs.PushD
 	if err != nil {
 		return fmt.Errorf("推送数据JSON 编码失败: %w", err)
 	}
-	if err != nil {
-		return fmt.Errorf("推送数据序列化失败: %w", err)
-	}
 
 	url := h.cfg.PushUrl
 	resp, err := h.httpClient.RequestJSON(ctx, "POST", url, pushData)

+ 1 - 2
services/validate.go

@@ -7,9 +7,8 @@ import (
 
 func validateTask(task models.HgFlightSearchTask) error {
 	// 验证参数
-	if task.Dep == "" || task.Arr == "" || task.Date == 0 {
+	if task.Dep == "" || task.Arr == "" || task.DateRange == "" {
 		return fmt.Errorf("dep, arr, date, 参数不能为空: %v", task)
 	}
-
 	return nil
 }

+ 1 - 0
structs/push_data.go

@@ -15,6 +15,7 @@ type Datum struct {
 	FlightStartDate string  `json:"flightStartDate"`
 	PrintPrice      float64 `json:"printPrice"`
 	Stock           int     `json:"stock"`
+	Cabin           string  `json:"cabin"`
 }
 
 type Query struct {

+ 1 - 1
structs/search_flight_api.go

@@ -4,7 +4,7 @@ type ReqSearchFlightData struct {
 	DepCode string `json:"depCode"`
 	ArrCode string `json:"arrCode"`
 	Date    string `json:"date"`
-	FlyNo   string `json:"flight_no"`
+	FlyNo   string `json:"flyNo"`
 }
 
 type ResSearchFlight struct {

+ 28 - 1
utils/function.go

@@ -3,6 +3,8 @@ package utils
 import (
 	"encoding/json"
 	"fmt"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -13,7 +15,7 @@ import (
 // 返回值:
 // 格式化后的日期字符串
 func DateFormmat(t string, format string) string {
-	return TimestampToString(StringToTimestamp(t, "006-01-02 15:04"), "2006-01-02")
+	return TimestampToString(StringToTimestamp(t, "2006-01-02 15:04"), "2006-01-02")
 }
 
 // TimestampToString 将 Unix 时间戳转换为指定格式的时间字符串
@@ -75,3 +77,28 @@ func StringJsonConvert[T comparable](jsonSt T) ([]byte, error) {
 
 	return cleanJson, nil
 }
+
+func ParseDateRange(rangeStr string) ([]string, error) {
+	parts := strings.Split(rangeStr, "-")
+	if len(parts) != 2 {
+		return nil, fmt.Errorf("invalid format, expected start-end")
+	}
+
+	start, err1 := strconv.Atoi(parts[0])
+	end, err2 := strconv.Atoi(parts[1])
+	if err1 != nil || err2 != nil {
+		return nil, fmt.Errorf("invalid number format")
+	}
+
+	if start > end {
+		return nil, fmt.Errorf("start cannot be greater than end")
+	}
+
+	now := time.Now()
+	var dates []string
+	for i := start; i <= end; i++ {
+		t := now.AddDate(0, 0, i)
+		dates = append(dates, t.Format("2006-01-02"))
+	}
+	return dates, nil
+}