diff --git a/cmd/film.go b/cmd/film.go index 8c66254..c184bbd 100644 --- a/cmd/film.go +++ b/cmd/film.go @@ -46,6 +46,7 @@ func initLog() { func main() { config.LoadServerConfig() + config.LoadDadiConfig() initLog() cfg := config.GetConfig() dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", cfg.Mysql.User, diff --git a/conf/server.conf.dev b/conf/server.conf.dev index 27e1351..ea6f04b 100644 --- a/conf/server.conf.dev +++ b/conf/server.conf.dev @@ -15,6 +15,7 @@ db = "film" qiye_appid = "ww288920bd3e8c92b2" qiye_secret = "3aqE6LAEKLiGtYBtX7TZm0uY_YD52w3R20AQirSICXY" qiye_agent = "1000013" +receiver = ["jiangyong", "zhangping"] [film] haha_token = "cc5f1d4c36f7e9544d641a174b298f94" diff --git a/conf/server.conf.prod b/conf/server.conf.prod index 7c508f4..48e0edf 100644 --- a/conf/server.conf.prod +++ b/conf/server.conf.prod @@ -16,6 +16,7 @@ db = "film" qiye_appid = "ww288920bd3e8c92b2" qiye_secret = "3aqE6LAEKLiGtYBtX7TZm0uY_YD52w3R20AQirSICXY" qiye_agent = "1000013" +receiver = ["jiangyong", "zhangping"] [film] haha_token = "cc5f1d4c36f7e9544d641a174b298f94" diff --git a/config/config.go b/config/config.go index e2bfadf..9a4ede2 100644 --- a/config/config.go +++ b/config/config.go @@ -37,9 +37,10 @@ type Redis struct { } type Weixin struct { - QiyeAppid string `toml:"qiye_appid"` - Qiyesecret string `toml:"qiye_secret"` - QiyeAgent string `toml:"qiye_agent"` + QiyeAppid string `toml:"qiye_appid"` + Qiyesecret string `toml:"qiye_secret"` + QiyeAgent string `toml:"qiye_agent"` + Receiver []string `toml:"receiver"` } type Film struct { diff --git a/model/orders.go b/model/orders.go index e3145db..02c75ce 100644 --- a/model/orders.go +++ b/model/orders.go @@ -1,6 +1,8 @@ package model import ( + "fmt" + "github.com/smbrave/goutil" "gorm.io/gorm" "time" ) @@ -38,6 +40,10 @@ type Order struct { UpdateTime int64 } +func (o *Order) String() string { + return fmt.Sprintf("{%s|%d} city={%s} cinema={%s} film={%s} ting={%s} show={%s}", + o.OrderId, o.Id, o.CityName, o.CinemaName, o.MovieName, o.Ting, goutil.TimeToDateTime(o.ShowTime)) +} func AddOrder(o *Order) (int64, error) { o.CreateTime = time.Now().Unix() o.CreateDate = time.Now().Format("2006-01-02") diff --git a/worker/common/processor.go b/worker/common/processor.go index cea65fe..e70a915 100644 --- a/worker/common/processor.go +++ b/worker/common/processor.go @@ -5,8 +5,7 @@ import "film/model" type CheckInfo struct { TotalOriginPrice int64 TotalRealPrice int64 - TotalCouponPrice int64 - UnitPrice int64 + CouponPrice int64 BillCode string } diff --git a/worker/dadi/processor.go b/worker/dadi/processor.go index fe23ee8..087ff2a 100644 --- a/worker/dadi/processor.go +++ b/worker/dadi/processor.go @@ -271,7 +271,7 @@ func (p *Processor) prevOrderInfo(cinema *Cinema, seatGoods []*SeatGoods) (*Prev previewOrder := new(PreviewOrder) previewOrder.TotalOriginPrice = int64(cast.ToFloat64(realData["ticketOriginPrice"]) * 100) previewOrder.TotalRealPrice = int64(cast.ToFloat64(realData["ticketRealPrice"]) * 100) - previewOrder.TotalCouponPrice = int64(cast.ToFloat64(realData["ticketCouponPrice"]) * 100) + previewOrder.CouponPrice = int64(cast.ToFloat64(realData["ticketCouponPrice"]) * 100) previewOrder.BillCode = billCode return previewOrder, nil @@ -297,9 +297,8 @@ func (p *Processor) CheckOrder(order *model.Order) (*common.CheckInfo, error) { result := new(common.CheckInfo) result.TotalRealPrice = previewOrder.TotalRealPrice - result.TotalRealPrice = previewOrder.TotalOriginPrice - result.TotalRealPrice = previewOrder.TotalCouponPrice - result.UnitPrice = previewOrder.TotalRealPrice / int64(order.SeatNum) + result.TotalOriginPrice = previewOrder.TotalOriginPrice + result.CouponPrice = previewOrder.CouponPrice result.BillCode = previewOrder.BillCode log.Infof("check order[%s][%s] previewOrder[%s] [%s][%s][%s] success", order.OrderId, result.BillCode, goutil.EncodeJSON(previewOrder), diff --git a/worker/dadi/type.go b/worker/dadi/type.go index 6f64810..a082b69 100644 --- a/worker/dadi/type.go +++ b/worker/dadi/type.go @@ -3,7 +3,7 @@ package dadi type PreviewOrder struct { TotalOriginPrice int64 TotalRealPrice int64 - TotalCouponPrice int64 + CouponPrice int64 BillCode string } diff --git a/worker/worker.go b/worker/worker.go index 7ffef8a..31acb53 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -4,6 +4,7 @@ import ( "film/base/util" "film/config" "film/model" + "film/worker/common" "film/worker/dadi" "film/worker/haha" "fmt" @@ -15,7 +16,9 @@ import ( ) type Worker struct { - qyClient *wxapi.WxQiye + qyClient *wxapi.WxQiye + dadiProcessor common.Processor + hahaProcessor *haha.Processor } func (w *Worker) initQyWeixin() { @@ -26,6 +29,93 @@ func (w *Worker) initQyWeixin() { Sender: cfg.Weixin.QiyeAgent, }) } + +func (w *Worker) getOrderMesasge(order *model.Order) []string { + message := make([]string, 0) + message = append(message, "【哈哈票订单信息】") + message = append(message, fmt.Sprintf("城市:%s", order.CityName)) + message = append(message, fmt.Sprintf("影院:%s", order.CinemaName)) + message = append(message, fmt.Sprintf("影片:%s", order.MovieName)) + message = append(message, fmt.Sprintf("影厅:%s", order.Ting)) + message = append(message, fmt.Sprintf("时间:%s", time.Unix(order.ShowTime, 0).Format("2006-01-02 15:04"))) + message = append(message, fmt.Sprintf("座位:%s,%s,%s", order.Seats, + goutil.If(order.IsSeat == 3, "可以调座", "不可调座"), + goutil.If(order.LoverSeat == 1, "情侣座", "普通座"))) + message = append(message, fmt.Sprintf("原价:%.2f", float64(order.MaoyanPrice)/100)) + message = append(message, fmt.Sprintf("编号:%s", order.OrderId)) + message = append(message, fmt.Sprintf("总金额:%.2f(%d)", float64(order.TotalPrice)/100, order.SeatNum)) + message = append(message, fmt.Sprintf("报价范围:%.2f~%.2f", float64(order.MinPrice)/100, float64(order.MaxPrice)/100)) + message = append(message, fmt.Sprintf("支付时间:%s", time.Unix(order.PayTime, 0).Format("2006-01-02 15:04"))) + message = append(message, fmt.Sprintf("创建时间:%s", time.Unix(order.OrderCreateTime, 0).Format("2006-01-02 15:04"))) + message = append(message, fmt.Sprintf("入库时间:%s", time.Unix(order.CreateTime, 0).Format("2006-01-02 15:04"))) + return message +} + +func (w *Worker) sendOrderMessage(order *model.Order, message string) { + messages := w.getOrderMesasge(order) + messages = append(messages, "\n", message) + w.qyClient.SendText(config.GetConfig().Weixin.Receiver, strings.Join(messages, "\n")) +} + +func (w *Worker) processorDadi(order *model.Order) { + checkInfo, err := w.dadiProcessor.CheckOrder(order) + if err != nil { + log.Errorf("check orrder[%s] error : %s", order.String(), err.Error()) + w.sendOrderMessage(order, err.Error()) + return + } + + //hahaProcessor.BidPrice(order.Id, checkInfo.UnitPrice) + go func() { + /* + time.Sleep(60 * time.Second) + if err := dadiProcessor.CancelOrder(order, checkInfo); err != nil { + log.Errorf("cancel order[%s] error[%s]", order.OrderId, err.Error()) + } + */ + }() + + bidStatus := false + realCost := checkInfo.TotalRealPrice + int64(goutil.If(checkInfo.CouponPrice > 0, config.GetDadiConfig().CouponCost, 0)) + realUnitCost := realCost / int64(order.SeatNum) + bidPrice := realUnitCost + config.GetDadiConfig().BidProfit + if bidPrice < order.MaxPrice { + if err := w.hahaProcessor.BidPrice(order.Id, bidPrice); err != nil { + log.Errorf("BidPrice order[%s] error[%s]", order.String(), err.Error()) + if err := w.dadiProcessor.CancelOrder(order, checkInfo); err != nil { + log.Errorf("cancel order[%s] error[%s]", order.OrderId, err.Error()) + } + message := w.getOrderMesasge(order) + message = append(message, "\n", fmt.Sprintf("竞价失败:%s", err.Error())) + w.qyClient.SendText(config.GetConfig().Weixin.Receiver, strings.Join(message, "\n")) + return + } + bidStatus = true + } + + // 发送信息 + message := w.getOrderMesasge(order) + + message = append(message, "\n") + message = append(message, "【大地订单信息】") + message = append(message, fmt.Sprintf("订单原价:%s", util.MoneyFen(checkInfo.TotalOriginPrice))) + message = append(message, fmt.Sprintf("优惠金额:%s", util.MoneyFen(checkInfo.CouponPrice))) + message = append(message, fmt.Sprintf("应付金额:%s", util.MoneyFen(checkInfo.TotalRealPrice))) + message = append(message, fmt.Sprintf("实际成本:%s", util.MoneyFen(realCost))) + message = append(message, fmt.Sprintf("实际单价:%s", util.MoneyFen(realUnitCost))) + + message = append(message, "\n") + message = append(message, "【竞价信息】") + message = append(message, fmt.Sprintf("状态:%s", goutil.If(bidStatus, "竞价中", "不可竞价"))) + if bidStatus { + message = append(message, fmt.Sprintf("出价:%s", util.MoneyFen(bidPrice))) + } + + if err := w.qyClient.SendText([]string{"jiangyong"}, strings.Join(message, "\n")); err != nil { + log.Errorf("send message error : %s", err.Error()) + } +} + func (w *Worker) Run() { w.initQyWeixin() cfg := config.GetConfig() @@ -42,62 +132,19 @@ func (w *Worker) Run() { //order, _ := model.GetOrder(590623) //newOrderChan <- order - //hahaProcessor := haha.NewProcessor(&haha.ProcessorConfig{Token: cfg.Film.HahaToken}) + w.hahaProcessor = haha.NewProcessor(&haha.ProcessorConfig{Token: cfg.Film.HahaToken}) dadiProcessor, err := dadi.NewProcessor(&dadi.ProcessorConfig{Token: cfg.Film.DadiToken}) if err != nil { panic(err) } + w.dadiProcessor = dadiProcessor for { select { case order := <-newOrderChan: - if !strings.Contains(order.CinemaName, "大地影院") { continue } - checkInfo, err := dadiProcessor.CheckOrder(order) - if err != nil { - log.Errorf("check orrder[%s] error : %s", order.OrderId, err.Error()) - continue - } - - //hahaProcessor.BidPrice(order.Id, checkInfo.UnitPrice) - go func() { - /* - time.Sleep(60 * time.Second) - if err := dadiProcessor.CancelOrder(order, checkInfo); err != nil { - log.Errorf("cancel order[%s] error[%s]", order.OrderId, err.Error()) - } - */ - }() - - // 发送信息 - message := make([]string, 0) - message = append(message, "【哈哈票订单信息】") - message = append(message, fmt.Sprintf("城市:%s", order.CityName)) - message = append(message, fmt.Sprintf("影院:%s", order.CinemaName)) - message = append(message, fmt.Sprintf("影片:%s", order.MovieName)) - message = append(message, fmt.Sprintf("影厅:%s", order.Ting)) - message = append(message, fmt.Sprintf("时间:%s", time.Unix(order.ShowTime, 0).Format("2006-01-02 15:04"))) - message = append(message, fmt.Sprintf("座位:%s,%s,%s", order.Seats, - goutil.If(order.IsSeat == 3, "可以调座", "不可调座"), - goutil.If(order.LoverSeat == 1, "情侣座", "普通座"))) - message = append(message, fmt.Sprintf("原价:%.2f", float64(order.MaoyanPrice)/100)) - message = append(message, fmt.Sprintf("编号:%s", order.OrderId)) - message = append(message, fmt.Sprintf("总金额:%.2f(%d)", float64(order.TotalPrice)/100, order.SeatNum)) - message = append(message, fmt.Sprintf("报价范围:%.2f~%.2f", float64(order.MinPrice)/100, float64(order.MaxPrice)/100)) - message = append(message, fmt.Sprintf("支付时间:%s", time.Unix(order.PayTime, 0).Format("2006-01-02 15:04"))) - message = append(message, fmt.Sprintf("创建时间:%s", time.Unix(order.OrderCreateTime, 0).Format("2006-01-02 15:04"))) - message = append(message, fmt.Sprintf("入库时间:%s", time.Unix(order.CreateTime, 0).Format("2006-01-02 15:04"))) - - message = append(message, "\n") - message = append(message, "【大地订单信息】") - message = append(message, fmt.Sprintf("订单原价:%s", util.MoneyFen(checkInfo.TotalOriginPrice))) - message = append(message, fmt.Sprintf("优惠金额:%s", util.MoneyFen(checkInfo.TotalCouponPrice))) - message = append(message, fmt.Sprintf("实际总价:%s", util.MoneyFen(checkInfo.TotalRealPrice))) - message = append(message, fmt.Sprintf("实际单价:%s", util.MoneyFen(checkInfo.UnitPrice))) - if err := w.qyClient.SendText([]string{"jiangyong"}, strings.Join(message, "\n")); err != nil { - log.Errorf("send message error : %s", err.Error()) - } + w.processorDadi(order) case updateOrder := <-updateOrderChan: log.Debugf("update:", goutil.EncodeJSON(updateOrder)) }