From f3df85c8e054f2fd409077c73cb22826089a11b7 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 25 Jul 2018 11:19:23 +0800 Subject: [PATCH] - fixed load pending orders. --- business/controller/controller.go | 108 +++++++++++++++--------------- business/controller/order.go | 15 ++++- business/controller/waybill.go | 7 +- business/model/model.go | 10 +++ 4 files changed, 79 insertions(+), 61 deletions(-) diff --git a/business/controller/controller.go b/business/controller/controller.go index 1c8bef09d..5f2a08882 100644 --- a/business/controller/controller.go +++ b/business/controller/controller.go @@ -1,6 +1,7 @@ package controller import ( + "sort" "time" "git.rosy.net.cn/baseapi/utils" @@ -21,6 +22,26 @@ var ( WaybillManager *WaybillController ) +type StatusTimer interface { + GetStatusTime() time.Time +} + +type StatusTimerSlice []StatusTimer + +func (s StatusTimerSlice) Len() int { + return len(s) +} + +func (s StatusTimerSlice) Less(i, j int) bool { + return s[i].GetStatusTime().Sub(s[j].GetStatusTime()) < 0 +} + +func (s StatusTimerSlice) Swap(i, j int) { + tmp := s[i] + s[i] = s[j] + s[j] = tmp +} + func init() { OrderManager = NewOrderManager() WaybillManager = NewWaybillManager() @@ -48,69 +69,48 @@ func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplica return isDuplicated, err } -// todo 可以考虑改成完全按StatusTime来发送事件 func LoadPendingOrders() { orders := OrderManager.LoadPendingOrders() globals.SugarLogger.Infof("LoadPendingOrders orders count:%d", len(orders)) bills := WaybillManager.LoadPendingWaybills() globals.SugarLogger.Infof("LoadPendingOrders waybills count:%d", len(bills)) - billsMap := map[string][]*model.Waybill{} - for _, v := range bills { - savedBills := []*model.Waybill{v} - if bills, ok := billsMap[v.VendorOrderID]; ok { - savedBills = append(bills, v) - } - billsMap[v.VendorOrderID] = savedBills - } + var sortOrders StatusTimerSlice for _, order := range orders { - isNoNewSent := false - orderNew := *order - orderNew.Status = model.OrderStatusNew - orderNew.StatusTime = order.OrderCreatedAt - jxutils.CallMsgHandlerAsync(func() { - scheduler.CurrentScheduler.OnOrderNew(&orderNew) - }, order.VendorOrderID) - for _, bill := range billsMap[order.VendorOrderID] { - if order.Status > model.OrderStatusNew && !isNoNewSent && order.StatusTime.Sub(bill.WaybillCreatedAt) < 0 { - isNoNewSent = true - order2 := *order - jxutils.CallMsgHandlerAsync(func() { - scheduler.CurrentScheduler.OnOrderStatusChanged(model.Order2Status(&order2)) - }, order.VendorOrderID) - } - billNew := *bill - billNew.Status = model.OrderStatusNew - billNew.StatusTime = order.OrderCreatedAt - jxutils.CallMsgHandlerAsync(func() { - scheduler.CurrentScheduler.OnWaybillStatusChanged(&billNew) - }, bill.VendorOrderID) - if order.Status > model.OrderStatusNew && !isNoNewSent && order.StatusTime.Sub(bill.StatusTime) < 0 { - isNoNewSent = true - order2 := *order - jxutils.CallMsgHandlerAsync(func() { - scheduler.CurrentScheduler.OnOrderStatusChanged(model.Order2Status(&order2)) - }, order.VendorOrderID) - } - if bill.Status > model.WaybillStatusNew { - bill2 := *bill - jxutils.CallMsgHandlerAsync(func() { - scheduler.CurrentScheduler.OnWaybillStatusChanged(&bill2) - }, bill.VendorOrderID) - } - if order.Status > model.OrderStatusNew && !isNoNewSent { - isNoNewSent = true - order2 := *order - jxutils.CallMsgHandlerAsync(func() { - scheduler.CurrentScheduler.OnOrderStatusChanged(model.Order2Status(&order2)) - }, order.VendorOrderID) - } - } - if order.Status > model.OrderStatusNew && !isNoNewSent { + if order.Status > model.OrderStatusNew { order2 := *order + sortOrders = append(sortOrders, &order2) + } + order.Status = model.OrderStatusNew + order.StatusTime = order.OrderCreatedAt + sortOrders = append(sortOrders, order) + } + for _, bill := range bills { + if bill.Status > model.WaybillStatusNew { + bill2 := *bill + sortOrders = append(sortOrders, &bill2) + } + bill.Status = model.WaybillStatusNew + bill.StatusTime = bill.WaybillCreatedAt + sortOrders = append(sortOrders, bill) + } + sort.Sort(sortOrders) + for _, item := range sortOrders { + if order, ok := item.(*model.GoodsOrder); ok { + if order.Status == model.OrderStatusNew { + jxutils.CallMsgHandlerAsync(func() { + scheduler.CurrentScheduler.OnOrderNew(order) + }, order.VendorOrderID) + } else { + jxutils.CallMsgHandlerAsync(func() { + scheduler.CurrentScheduler.OnOrderStatusChanged(model.Order2Status(order)) + }, order.VendorOrderID) + } + } else { + bill := item.(*model.Waybill) jxutils.CallMsgHandlerAsync(func() { - scheduler.CurrentScheduler.OnOrderStatusChanged(model.Order2Status(&order2)) - }, order.VendorOrderID) + scheduler.CurrentScheduler.OnWaybillStatusChanged(bill) + }, bill.VendorOrderID) } } } diff --git a/business/controller/order.go b/business/controller/order.go index 409dfba5e..07560a8e5 100644 --- a/business/controller/order.go +++ b/business/controller/order.go @@ -24,17 +24,23 @@ func NewOrderManager() *OrderController { func (c *OrderController) LoadPendingOrders() []*model.GoodsOrder { db := orm.NewOrm() var orders []*model.GoodsOrder + tillTime := time.Now().Add(-pendingOrderGapMax) _, err := db.Raw(` SELECT * FROM goods_order WHERE order_created_at >= ? AND status < ? - ORDER by order_created_at - `, time.Now().Add(-pendingOrderGapMax), model.OrderStatusEndBegin).QueryRows(&orders) + `, tillTime, model.OrderStatusEndBegin).QueryRows(&orders) if err != nil { globals.SugarLogger.Warnf("LoadPendingOrders load pending orders error:%v", err) return nil } + for _, order := range orders { + utils.CallFuncLogError(func() error { + _, err = db.QueryTable("order_sku").Filter("vendor_order_id", order.VendorOrderID).Filter("vendor_id", order.VendorID).All(&order.Skus) + return err + }, "LoadPendingOrders order:%v", order) + } return orders } @@ -240,7 +246,10 @@ func (c *OrderController) LoadOrder(vendorOrderID string, vendorID int) (order * VendorID: vendorID, } if err = db.Read(order, "VendorOrderID", "VendorID"); err == nil { - _, err = db.QueryTable("order_sku").Filter("vendor_order_id", vendorOrderID).Filter("vendor_id", vendorID).All(&order.Skus) + err = utils.CallFuncLogError(func() error { + _, err = db.QueryTable("order_sku").Filter("vendor_order_id", vendorOrderID).Filter("vendor_id", vendorID).All(&order.Skus) + return err + }, "LoadOrder orderID:%s", vendorOrderID) } if err != nil { globals.SugarLogger.Warnf("LoadOrder orderID:%s failed with error:%v", vendorOrderID, err) diff --git a/business/controller/waybill.go b/business/controller/waybill.go index fb0b725d9..b505030b5 100644 --- a/business/controller/waybill.go +++ b/business/controller/waybill.go @@ -22,6 +22,7 @@ func NewWaybillManager() *WaybillController { func (w *WaybillController) LoadPendingWaybills() []*model.Waybill { db := orm.NewOrm() var bills []*model.Waybill + tillTime := time.Now().Add(-pendingOrderGapMax) _, err := db.Raw(` SELECT t1.* FROM waybill t1 @@ -29,11 +30,9 @@ func (w *WaybillController) LoadPendingWaybills() []*model.Waybill { AND t2.vendor_id = t1.order_vendor_id AND t2.order_created_at >= ? AND t2.status < ? - WHERE waybill_created_at >= ? + WHERE t1.waybill_created_at >= ? AND t1.status < ? - ORDER by waybill_created_at - `, time.Now().Add(-pendingOrderGapMax), model.WaybillStatusEndBegin, - time.Now().Add(-pendingOrderGapMax), model.WaybillStatusEndBegin).QueryRows(&bills) + `, tillTime, model.OrderStatusEndBegin, tillTime, model.WaybillStatusEndBegin).QueryRows(&bills) if err != nil { globals.SugarLogger.Warnf("LoadPendingWaybills load pending waybills error:%v", err) return nil diff --git a/business/model/model.go b/business/model/model.go index b7ef434d7..ebe98d699 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -1,5 +1,7 @@ package model +import "time" + func Order2Status(order *GoodsOrder) (retVal *OrderStatus) { retVal = &OrderStatus{ VendorOrderID: order.VendorOrderID, @@ -32,3 +34,11 @@ func Waybill2Status(bill *Waybill) (retVal *OrderStatus) { func IsOrderSolid(order *GoodsOrder) bool { return !(order.ConsigneeName == "" && order.ID == 0) } + +func (o *GoodsOrder) GetStatusTime() time.Time { + return o.StatusTime +} + +func (o *Waybill) GetStatusTime() time.Time { + return o.StatusTime +}