package scheduler import ( "errors" "fmt" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" ) 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 { GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) GetStatusActionConfig(status int) *StatusActionConfig AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) PickedUpGoods(order *model.GoodsOrder) (err error) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) SelfDeliverDelievering(order *model.GoodsOrder) (err error) SelfDeliverDelievered(order *model.GoodsOrder) (err error) } 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 IsReallyCallPlatformAPI bool } 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] } func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt) }, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) } return err } func (c *BaseScheduler) PickedUpGoods(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("PickedUpGoods orderID:%s", order.VendorOrderID) if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).PickedUpGoods(order) }, "PickedUpGoods orderID:%s", order.VendorOrderID) } return err } func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID) if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDeliver(order) }, "Swtich2SelfDeliver orderID:%s", order.VendorOrderID) } return err } func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID) if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievering(order) }, "SelfDeliverDelievering orderID:%s", order.VendorOrderID) } return err } func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID) if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievered(order) }, "SelfDeliverDelievered orderID:%s", order.VendorOrderID) } return err } func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID) if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetDeliveryPlatformFromVendorID(platformVendorID).CreateWaybill(order) }, "CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID) } return err } func (c *BaseScheduler) CancelWaybill(bill *model.Waybill) (err error) { globals.SugarLogger.Infof("CancelWaybill bill:%v", bill) if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID).CancelWaybill(bill) }, "CancelWaybill bill:%v", bill) } return err } type BasePurchasePlatform struct { } func (p *BasePurchasePlatform) GetStatusActionConfig(status int) *StatusActionConfig { return nil }