179 lines
6.3 KiB
Go
179 lines
6.3 KiB
Go
package partner
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
|
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
|
"git.rosy.net.cn/jx-callback/business/model"
|
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
|
)
|
|
|
|
const (
|
|
StoreNameSeparator = "-"
|
|
)
|
|
|
|
const (
|
|
CancelWaybillReasonNotAcceptIntime = 1
|
|
CancelWaybillReasonSwitch2SelfFailed = 2
|
|
CancelWaybillReasonOther = 10
|
|
)
|
|
|
|
var (
|
|
CancelWaybillReasonStrNotAcceptIntime = "没有及时抢单"
|
|
CancelWaybillReasonStrSwitch2SelfFailed = "转自送失败"
|
|
CancelWaybillReasonStrOrderAlreadyFinished = "订单已经结束"
|
|
CancelWaybillReasonStrActive = "操作由人员主动发起"
|
|
)
|
|
|
|
var (
|
|
ErrCanNotFindItem = errors.New("没有找到指定的东西")
|
|
)
|
|
|
|
var (
|
|
CurOrderManager IOrderManager
|
|
|
|
PurchasePlatformHandlers map[int]IPurchasePlatformHandler
|
|
DeliveryPlatformHandlers map[int]*DeliveryPlatformHandlerInfo
|
|
)
|
|
|
|
type IOrderManager interface {
|
|
OnOrderNew(order *model.GoodsOrder, msgVendorStatus string) (err error)
|
|
OnOrderAdjust(order *model.GoodsOrder, msgVendorStatus string) (err error)
|
|
OnOrderStatusChanged(orderStatus *model.OrderStatus) (err error)
|
|
|
|
OnWaybillStatusChanged(bill *model.Waybill) (err error)
|
|
|
|
LoadOrder(vendorOrderID string, vendorID int) (order *model.GoodsOrder, err error)
|
|
UpdateWaybillVendorID(bill *model.Waybill, revertStatus bool) (err error)
|
|
UpdateOrderStatusAndFlag(order *model.GoodsOrder) (err error)
|
|
|
|
LoadWaybill(vendorWaybillID string, waybillVendorID int) (bill *model.Waybill, err error)
|
|
}
|
|
|
|
type IPurchasePlatformHandler interface {
|
|
GetStatusFromVendorStatus(vendorStatus string) int
|
|
GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error)
|
|
GetStatusActionTimeout(statusType, status int) time.Duration
|
|
|
|
AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error)
|
|
PickupGoods(order *model.GoodsOrder, userName string) (err error)
|
|
|
|
// 将订单从购物平台配送转为自送
|
|
Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error)
|
|
|
|
// 将订单从购物平台配送转为自送后又送达
|
|
Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error)
|
|
|
|
// 完全自送的门店表示开始配送
|
|
SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error)
|
|
|
|
// 完全自送的门店表示配送完成
|
|
SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error)
|
|
|
|
////////
|
|
// Store
|
|
ReadStore(vendorStoreID string) (store *model.Store, err error)
|
|
UpdateStore(db *dao.DaoDB, storeID int, userName string) error
|
|
// EnableAutoAcceptOrder(vendorStoreID string, isEnabled bool) error
|
|
// OpenStore(vendorStoreID string, userName string) error
|
|
// CloseStore(vendorStoreID, closeNotice, userName string) error
|
|
|
|
SyncStoresSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, db *dao.DaoDB, storeIDs []int, skuIDs []int, isAsync bool) (hint string, err error)
|
|
RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error)
|
|
|
|
GetVendorID() int
|
|
GetFieldIDName() string
|
|
GetFieldSyncStatusName() string
|
|
}
|
|
|
|
// db *dao.DaoDB,
|
|
type IMultipleStoresHandler interface {
|
|
IPurchasePlatformHandler
|
|
ReadCategories() (cats []*model.SkuCategory, err error)
|
|
|
|
CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error)
|
|
UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error
|
|
DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error
|
|
ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error)
|
|
|
|
// sku
|
|
CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
|
ReadSku(vendorSkuID string) (skuNameExt *model.SkuNameExt, err error)
|
|
UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
|
DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error)
|
|
|
|
RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error)
|
|
}
|
|
|
|
type ISingleStoreHandler interface {
|
|
IPurchasePlatformHandler
|
|
SyncStoresCategories(db *dao.DaoDB, storeIDs []int, userName string) (err error)
|
|
ReadStoreCategories(storeID int) (cats []*model.SkuCategory, err error)
|
|
|
|
ReadStoreSku(storeID, skuID int) (skuNameExt *model.SkuNameExt, err error)
|
|
RefreshStoresAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool, storeIDs []int) (hint string, err error)
|
|
}
|
|
|
|
type IDeliveryPlatformHandler interface {
|
|
CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error)
|
|
CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error)
|
|
|
|
GetVendorID() int
|
|
}
|
|
|
|
type DeliveryPlatformHandlerInfo struct {
|
|
Handler IDeliveryPlatformHandler
|
|
Use4CreateWaybill bool
|
|
}
|
|
|
|
type BasePurchasePlatform struct {
|
|
}
|
|
|
|
func (p *BasePurchasePlatform) GetStatusActionTimeout(statusType, status int) time.Duration {
|
|
return 0
|
|
}
|
|
|
|
func init() {
|
|
PurchasePlatformHandlers = make(map[int]IPurchasePlatformHandler)
|
|
DeliveryPlatformHandlers = make(map[int]*DeliveryPlatformHandlerInfo)
|
|
}
|
|
|
|
func Init(curOrderManager IOrderManager) {
|
|
CurOrderManager = curOrderManager
|
|
}
|
|
|
|
func RegisterPurchasePlatform(handler IPurchasePlatformHandler) {
|
|
vendorID := handler.GetVendorID()
|
|
if !(vendorID >= model.VendorIDPurchaseBegin && vendorID <= model.VendorIDPurchaseEnd) {
|
|
panic(fmt.Sprintf("purchase vendor:%d is illegal", vendorID))
|
|
}
|
|
if _, ok := PurchasePlatformHandlers[vendorID]; ok {
|
|
panic(fmt.Sprintf("purchase vendor:%d, already exists", vendorID))
|
|
}
|
|
PurchasePlatformHandlers[vendorID] = handler
|
|
}
|
|
|
|
func RegisterDeliveryPlatform(handler IDeliveryPlatformHandler, isUse4CreateWaybill bool) {
|
|
vendorID := handler.GetVendorID()
|
|
if !(vendorID >= model.VendorIDDeliveryBegin && vendorID <= model.VendorIDDeliveryEnd) {
|
|
panic(fmt.Sprintf("delivery vendor:%d is illegal", vendorID))
|
|
}
|
|
if _, ok := DeliveryPlatformHandlers[vendorID]; ok {
|
|
panic(fmt.Sprintf("delivery vendor:%d, already exists", vendorID))
|
|
}
|
|
DeliveryPlatformHandlers[vendorID] = &DeliveryPlatformHandlerInfo{
|
|
Handler: handler,
|
|
Use4CreateWaybill: isUse4CreateWaybill,
|
|
}
|
|
}
|
|
func GetPurchasePlatformFromVendorID(vendorID int) IPurchasePlatformHandler {
|
|
return PurchasePlatformHandlers[vendorID]
|
|
}
|
|
|
|
func GetDeliveryPlatformFromVendorID(vendorID int) *DeliveryPlatformHandlerInfo {
|
|
return DeliveryPlatformHandlers[vendorID]
|
|
}
|