package controller import ( "sort" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/scheduler" _ "git.rosy.net.cn/jx-callback/business/scheduler/defsch" // 导入缺省订单调度器 "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) const ( pendingOrderGapMax = 2 * 24 * time.Hour // 每次重启机子时,要检查几天内的订单状态 ) var ( OrderManager *OrderController 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() scheduler.CurrentScheduler.RegisterOrderManager(OrderManager) } func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplicated bool, err error) { status.ID = 0 created, _, err := db.ReadOrCreate(status, "VendorOrderID", "VendorID", "OrderType", "VendorStatus", "StatusTime") if err == nil { if !created { globals.SugarLogger.Debugf("duplicated event:%v", status) isDuplicated = true status.DuplicatedCount++ utils.CallFuncLogError(func() error { _, err = db.Update(status, "DuplicatedCount") return err }, "addOrderOrWaybillStatus update DuplicatedCount, status:%v", status) } } if err != nil { // todo 这里居然会有主键重复错误,逻辑上是不应该的 globals.SugarLogger.Warnf("addOrderOrWaybillStatus status:%v, access db error:%v", status, err) } return isDuplicated, err } 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)) var sortOrders StatusTimerSlice for _, order := range orders { 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.OnWaybillStatusChanged(bill) }, bill.VendorOrderID) } } }