- fixed load pending orders.

This commit is contained in:
gazebo
2018-07-25 11:19:23 +08:00
parent 38dc61a0bc
commit f3df85c8e0
4 changed files with 79 additions and 61 deletions

View File

@@ -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)
}
}
}

View File

@@ -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)

View File

@@ -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

View File

@@ -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
}