film/worker/worker.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)
}
}
}