package scheduler import ( "fmt" "time" "git.rosy.net.cn/jx-callback/business/model" ) var ( CurrentScheduler Scheduler ) type StatusTimeoutAction struct { Action func(order *model.GoodsOrder) (err error) Timeout time.Duration } type StatusConfig struct { handler PurchasePlatformHandler AutoStatusChange map[int]*StatusTimeoutAction } type PurchasePlatformHandler interface { AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) ForcePickUp(order *model.GoodsOrder) (err error) SwtichSelfDeliver(order *model.GoodsOrder) (err error) } type DeliveryPlatformHandler interface { CreateWaybill(order *model.GoodsOrder) (err error) CancelWaybill(bill *model.Waybill) (err error) } type OrderManager interface { MasterWaybillStatusChanged(*model.Waybill) (err error) } type Scheduler interface { RegisterOrderManager(handler OrderManager) RegisterPurchasePlatform(vendorID int, handler PurchasePlatformHandler) RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler) // 以下是定单 OnOrderNew(order *model.GoodsOrder) (err error) OnOrderAccepted(order *model.GoodsOrder) (err error) OnOrderStatusChanged(status *model.OrderStatus) (err error) // 以下是运单 OnWaybillStatusChanged(bill *model.Waybill) (err error) } type BaseScheduler struct { orderManager OrderManager purchasePlatformHandlers map[int]PurchasePlatformHandler deliveryPlatformHandlers map[int]DeliveryPlatformHandler } func (c *BaseScheduler) Init() { c.purchasePlatformHandlers = make(map[int]PurchasePlatformHandler) c.deliveryPlatformHandlers = make(map[int]DeliveryPlatformHandler) } func (c *BaseScheduler) RegisterOrderManager(handler OrderManager) { c.orderManager = handler } func (c *BaseScheduler) RegisterPurchasePlatform(vendorID int, handler PurchasePlatformHandler) { if !(vendorID >= model.VendorIDPurchaseBegin && vendorID <= model.VendorIDPurchaseEnd) { panic(fmt.Sprintf("purchase vendor:%d is illegal", vendorID)) } if _, ok := c.purchasePlatformHandlers[vendorID]; ok { panic(fmt.Sprintf("purchase vendor:%d, already exists", vendorID)) } c.purchasePlatformHandlers[vendorID] = handler } func (c *BaseScheduler) RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler) { if !(vendorID >= model.VendorIDDeliveryBegin && vendorID <= model.VendorIDDeliveryEnd) { panic(fmt.Sprintf("delivery vendor:%d is illegal", vendorID)) } if _, ok := c.deliveryPlatformHandlers[vendorID]; ok { panic(fmt.Sprintf("delivery vendor:%d, already exists", vendorID)) } c.deliveryPlatformHandlers[vendorID] = handler }