package scheduler import ( "errors" "fmt" "time" "git.rosy.net.cn/jx-callback/business/model" ) var ( CurrentScheduler Scheduler ) var ( ErrStatusIsNotOKForOperation = errors.New("当前状态操作无效") ErrCanNotCreateAtLeastOneWaybill = errors.New("一个运单都不能创建") ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)") ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)") ) type StatusActionConfig struct { Timeout time.Duration // 超时时间,为0的话表示立即执行 TimeoutAction func(order *model.GoodsOrder) (err error) // 超时后需要执行的动作,为nil表示此状态不需要执行监控 } type PurchasePlatformHandler interface { AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) PickedUpGoods(order *model.GoodsOrder) (err error) Swtich2SelfDeliver(vendorOrderID string) (err error) SelfDeliverDelievering(order *model.GoodsOrder) (err error) SelfDeliverDelievered(order *model.GoodsOrder) (err error) GetStatusActionConfig(status int) *StatusActionConfig } type DeliveryPlatformHandler interface { CreateWaybill(order *model.GoodsOrder) (err error) CancelWaybill(bill *model.Waybill) (err error) } type OrderManager interface { LoadOrder(vendorOrderID string, vendorID int) (order *model.GoodsOrder, err error) OnOrderStatusChanged(status *model.OrderStatus) (err error) // 此消息是否使用还不确定 UpdateWaybillVendorID(bill *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) OnOrderStatusChanged(status *model.OrderStatus) (err error) // 以下是运单 OnWaybillStatusChanged(bill *model.Waybill) (err error) } type BaseScheduler struct { CurOrderManager 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.CurOrderManager = 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 } func (c *BaseScheduler) GetPurchasePlatformFromVendorID(vendorID int) PurchasePlatformHandler { return c.PurchasePlatformHandlers[vendorID] } func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) DeliveryPlatformHandler { return c.DeliveryPlatformHandlers[vendorID] } type BasePurchasePlatform struct { } func (p *BasePurchasePlatform) GetStatusActionConfig(status int) *StatusActionConfig { return nil }