- big refactor for scheduler.
This commit is contained in:
@@ -10,6 +10,20 @@ import (
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
)
|
||||
|
||||
const (
|
||||
TimerStatusTypeUnknown = -1
|
||||
TimerStatusTypeOrder = 0
|
||||
TimerStatusTypeWaybill = 1
|
||||
)
|
||||
|
||||
const (
|
||||
TimerTypeNoTimer = 0 // 即此状态没有TIMER(但为停掉之前的TIMER,如果要保持TIMER应该用TimerTypeByPass),状态没有配置缺省就是没有TIMER
|
||||
TimerTypeByPass = 1
|
||||
TimerTypeBaseNow = 2
|
||||
TimerTypeBaseStatusTime = 3
|
||||
TimerTypeBaseExpectedDeliveredTime = 4 // 以expected delivery time倒推的时间(减去StatusActionConfig.Timeout)
|
||||
)
|
||||
|
||||
var (
|
||||
CurrentScheduler Scheduler
|
||||
)
|
||||
@@ -23,14 +37,16 @@ var (
|
||||
)
|
||||
|
||||
type StatusActionConfig struct {
|
||||
Timeout time.Duration // 超时时间,为0的话表示禁用
|
||||
TimerType int // 参见上面的相关常量定义
|
||||
Timeout time.Duration // 超时时间,为0表示立即执行(其实也不能立即执行,因为有最小时间限制)
|
||||
TimeoutGap int // 以秒为单位的随机时间,0表示不随机
|
||||
TimeoutAction func(order *model.GoodsOrder) (err error) // 超时后需要执行的动作,为nil表示此状态不需要执行监控
|
||||
}
|
||||
|
||||
type PurchasePlatformHandler interface {
|
||||
GetStatusFromVendorStatus(vendorStatus string) int
|
||||
GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error)
|
||||
GetStatusActionConfig(status int) *StatusActionConfig
|
||||
GetStatusActionConfig(statusType, status int) *StatusActionConfig
|
||||
|
||||
AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error)
|
||||
PickedUpGoods(order *model.GoodsOrder) (err error)
|
||||
@@ -45,35 +61,40 @@ type DeliveryPlatformHandler interface {
|
||||
CancelWaybill(bill *model.Waybill) (err error)
|
||||
}
|
||||
|
||||
type DeliveryPlatformHandlerInfo struct {
|
||||
Handler DeliveryPlatformHandler
|
||||
Use4CreateWaybill bool
|
||||
}
|
||||
|
||||
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)
|
||||
UpdateWaybillVendorID(bill *model.Waybill, revertStatus bool) (err error)
|
||||
}
|
||||
|
||||
type Scheduler interface {
|
||||
RegisterOrderManager(handler OrderManager)
|
||||
RegisterPurchasePlatform(vendorID int, handler PurchasePlatformHandler)
|
||||
RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler)
|
||||
RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler, isUse4CreateWaybill bool)
|
||||
|
||||
// 以下是订单
|
||||
OnOrderNew(order *model.GoodsOrder) (err error)
|
||||
OnOrderStatusChanged(status *model.OrderStatus) (err error)
|
||||
OnOrderNew(order *model.GoodsOrder, isPending bool) (err error)
|
||||
OnOrderStatusChanged(status *model.OrderStatus, isPending bool) (err error)
|
||||
|
||||
// 以下是运单
|
||||
OnWaybillStatusChanged(bill *model.Waybill) (err error)
|
||||
OnWaybillStatusChanged(bill *model.Waybill, isPending bool) (err error)
|
||||
}
|
||||
|
||||
type BaseScheduler struct {
|
||||
CurOrderManager OrderManager
|
||||
PurchasePlatformHandlers map[int]PurchasePlatformHandler
|
||||
DeliveryPlatformHandlers map[int]DeliveryPlatformHandler
|
||||
DeliveryPlatformHandlers map[int]*DeliveryPlatformHandlerInfo
|
||||
IsReallyCallPlatformAPI bool
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) Init() {
|
||||
c.PurchasePlatformHandlers = make(map[int]PurchasePlatformHandler)
|
||||
c.DeliveryPlatformHandlers = make(map[int]DeliveryPlatformHandler)
|
||||
c.DeliveryPlatformHandlers = make(map[int]*DeliveryPlatformHandlerInfo)
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) RegisterOrderManager(handler OrderManager) {
|
||||
@@ -90,21 +111,24 @@ func (c *BaseScheduler) RegisterPurchasePlatform(vendorID int, handler PurchaseP
|
||||
c.PurchasePlatformHandlers[vendorID] = handler
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler) {
|
||||
func (c *BaseScheduler) RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler, isUse4CreateWaybill bool) {
|
||||
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
|
||||
c.DeliveryPlatformHandlers[vendorID] = &DeliveryPlatformHandlerInfo{
|
||||
Handler: handler,
|
||||
Use4CreateWaybill: isUse4CreateWaybill,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) GetPurchasePlatformFromVendorID(vendorID int) PurchasePlatformHandler {
|
||||
return c.PurchasePlatformHandlers[vendorID]
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) DeliveryPlatformHandler {
|
||||
func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) *DeliveryPlatformHandlerInfo {
|
||||
return c.DeliveryPlatformHandlers[vendorID]
|
||||
}
|
||||
|
||||
@@ -144,7 +168,7 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error)
|
||||
}, "Swtich2SelfDeliver orderID:%s", order.VendorOrderID)
|
||||
}
|
||||
} else {
|
||||
globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:% is not suitable", order.VendorOrderID, order.Status)
|
||||
globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -184,19 +208,24 @@ func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOr
|
||||
return ErrOrderIsNotSolid
|
||||
}
|
||||
if c.IsReallyCallPlatformAPI {
|
||||
err = utils.CallFuncLogError(func() error {
|
||||
return c.GetDeliveryPlatformFromVendorID(platformVendorID).CreateWaybill(order)
|
||||
}, "CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID)
|
||||
handlerInfo := c.GetDeliveryPlatformFromVendorID(platformVendorID)
|
||||
if handlerInfo.Use4CreateWaybill {
|
||||
err = utils.CallFuncLogError(func() error {
|
||||
return handlerInfo.Handler.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)
|
||||
if c.IsReallyCallPlatformAPI && bill.OrderVendorID != bill.WaybillVendorID {
|
||||
if handlerInfo := c.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID); handlerInfo != nil {
|
||||
err = utils.CallFuncLogError(func() error {
|
||||
return handlerInfo.Handler.CancelWaybill(bill)
|
||||
}, "CancelWaybill bill:%v", bill)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -204,6 +233,6 @@ func (c *BaseScheduler) CancelWaybill(bill *model.Waybill) (err error) {
|
||||
type BasePurchasePlatform struct {
|
||||
}
|
||||
|
||||
func (p *BasePurchasePlatform) GetStatusActionConfig(status int) *StatusActionConfig {
|
||||
func (p *BasePurchasePlatform) GetStatusActionConfig(statusType, status int) *StatusActionConfig {
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user