- big refactor for scheduler.

This commit is contained in:
gazebo
2018-07-25 20:43:41 +08:00
parent f3df85c8e0
commit c0770e9ab5
16 changed files with 515 additions and 321 deletions

View File

@@ -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
}