- elm sometimes have no delivery msg - elm sometimes delivery msg arrvied before finished pickup - the gap between finished pickup and first delivery msg is big
112 lines
3.7 KiB
Go
112 lines
3.7 KiB
Go
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
|
||
}
|