mirror of http://gitlab.batiao8.com/yic/film.git
118 lines
3.0 KiB
Go
118 lines
3.0 KiB
Go
package worker
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"encoding/json"
|
|
"film/model"
|
|
"fmt"
|
|
"github.com/go-co-op/gocron"
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/spf13/cast"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
)
|
|
|
|
type Worker struct {
|
|
Token string
|
|
}
|
|
|
|
func (w *Worker) Init() error {
|
|
timezone, _ := time.LoadLocation("Asia/Shanghai")
|
|
cron := gocron.NewScheduler(timezone)
|
|
|
|
cron.Every(30).Seconds().Do(func() {
|
|
w.syncOrder()
|
|
})
|
|
|
|
cron.StartAsync()
|
|
return nil
|
|
}
|
|
|
|
func (w *Worker) httpPost(requestUrl string) ([]byte, error) {
|
|
client := &http.Client{Timeout: 20 * time.Second}
|
|
//忽略https的证书
|
|
client.Transport = &http.Transport{
|
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
|
}
|
|
p := url.Values{}
|
|
u, _ := url.Parse(requestUrl)
|
|
|
|
u.RawQuery = p.Encode()
|
|
req, err := http.NewRequest("POST", u.String(), nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Set("token", w.Token)
|
|
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, fmt.Errorf("%d:%s", resp.StatusCode, resp.Status)
|
|
}
|
|
return io.ReadAll(resp.Body)
|
|
}
|
|
|
|
func (w *Worker) syncOrder() {
|
|
orderUrl := "https://hahapiao.cn/api/Synchro/toList"
|
|
body, err := w.httpPost(orderUrl)
|
|
if err != nil {
|
|
log.Errorf("syncOrder error : %s", err.Error())
|
|
return
|
|
}
|
|
result := make(map[string]interface{})
|
|
if err := json.Unmarshal(body, &result); err != nil {
|
|
log.Errorf("json.unmarshal [%s] error : %s", string(body), err.Error())
|
|
return
|
|
}
|
|
if cast.ToInt(result["status"]) != 200 || cast.ToInt(result["code"]) != 200 {
|
|
log.Errorf("status[%d] code[%d] message[%s]", cast.ToInt(result["status"]), cast.ToInt(result["code"]), cast.ToString(result["msg"]))
|
|
return
|
|
}
|
|
|
|
datas := cast.ToSlice(result["data"])
|
|
|
|
for _, d := range datas {
|
|
data := cast.ToStringMap(d)
|
|
id := cast.ToInt64(data["id"])
|
|
order, err := model.GetOrder(id)
|
|
if err != nil {
|
|
log.Errorf("get order id : %d error :%s", id, err.Error())
|
|
}
|
|
isAdd := false
|
|
|
|
if order == nil {
|
|
order = new(model.Order)
|
|
order.Id = id
|
|
isAdd = true
|
|
}
|
|
order.OrderId = cast.ToString(data["order_id"])
|
|
order.PayPrice = int64(cast.ToFloat64(data["payPrice"]) * 100)
|
|
order.TotalPrice = int64(cast.ToFloat64(data["total_price"]) * 100)
|
|
order.MaoyanPrice = int64(cast.ToFloat64(data["maoyan_price"]) * 100)
|
|
order.StartTime = cast.ToString(data["startTime"])
|
|
order.StartDate = cast.ToString(data["invalidateDate"])
|
|
order.SeatNum = cast.ToInt(data["seat_num"])
|
|
order.Seats = cast.ToString(data["seats"])
|
|
order.ShowTime = cast.ToInt64(data["show_time"])
|
|
order.PayTime = cast.ToInt64(data["pay_time"])
|
|
order.CityName = cast.ToString(data["cityName"])
|
|
order.ProvinceName = cast.ToString(data["provinceName"])
|
|
order.MovieName = cast.ToString(data["movieName"])
|
|
order.Address = cast.ToString(data["address"])
|
|
order.Ting = cast.ToString(data["ting"])
|
|
order.CinemaName = cast.ToString(data["cinemaName"])
|
|
|
|
if isAdd {
|
|
model.AddOrder(order)
|
|
} else {
|
|
model.UpdateOrder(order)
|
|
}
|
|
}
|
|
|
|
}
|