87 lines
2.6 KiB
Go
87 lines
2.6 KiB
Go
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
|
|
}
|