- order manager added.
This commit is contained in:
@@ -342,7 +342,7 @@ func (c *OrderManager) LoadOrder(vendorOrderID string, vendorID int) (order *mod
|
||||
func (c *OrderManager) UpdateOrderStatusDirectly(order *model.GoodsOrder) (err error) {
|
||||
db := orm.NewOrm()
|
||||
utils.CallFuncLogError(func() error {
|
||||
_, err = db.Update(db, "Status")
|
||||
_, err = db.Update(order, "Status")
|
||||
return err
|
||||
}, "UpdateOrderStatusDirectly orderID:%s failed with error:%v", order.VendorOrderID, err)
|
||||
return err
|
||||
|
||||
@@ -21,7 +21,7 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
curOrderManager *OrderManager
|
||||
FixedOrderManager *OrderManager
|
||||
)
|
||||
|
||||
// 所有公共接口调用前,要求在order里或status中设置合适的Status
|
||||
@@ -53,8 +53,8 @@ func (s StatusTimerSlice) Swap(i, j int) {
|
||||
}
|
||||
|
||||
func init() {
|
||||
curOrderManager = NewOrderManager()
|
||||
partner.Init(curOrderManager)
|
||||
FixedOrderManager = NewOrderManager()
|
||||
partner.Init(FixedOrderManager)
|
||||
}
|
||||
|
||||
func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplicated bool, err error) {
|
||||
@@ -86,12 +86,12 @@ func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplica
|
||||
|
||||
// todo 最好还是改成全事件回放算了
|
||||
func LoadPendingOrders() {
|
||||
orders := curOrderManager.LoadPendingOrders()
|
||||
orders := FixedOrderManager.LoadPendingOrders()
|
||||
globals.SugarLogger.Infof("LoadPendingOrders orders count:%d", len(orders))
|
||||
|
||||
ordersCount := len(orders)
|
||||
if ordersCount > 0 {
|
||||
bills := curOrderManager.LoadPendingWaybills()
|
||||
bills := FixedOrderManager.LoadPendingWaybills()
|
||||
globals.SugarLogger.Infof("LoadPendingOrders waybills count:%d", len(bills))
|
||||
var sortOrders StatusTimerSlice
|
||||
for _, order := range orders {
|
||||
|
||||
53
business/jxcallback/orderman/orderman_ext.go
Normal file
53
business/jxcallback/orderman/orderman_ext.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package orderman
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
|
||||
"github.com/astaxie/beego/orm"
|
||||
)
|
||||
|
||||
const (
|
||||
maxLastHours = 2 * 24 // 最多只能查询两天内的订单数据
|
||||
)
|
||||
|
||||
func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStatus, toStatus int) (orders []*model.GoodsOrderExt, err error) {
|
||||
if lastHours > maxLastHours {
|
||||
lastHours = maxLastHours
|
||||
}
|
||||
if toStatus == 0 {
|
||||
toStatus = fromStatus
|
||||
}
|
||||
|
||||
db := orm.NewOrm()
|
||||
_, err = db.Raw(`
|
||||
SELECT t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile
|
||||
FROM goods_order t1
|
||||
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
|
||||
WHERE IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ?
|
||||
AND t1.order_created_at >= ?
|
||||
AND t1.Status >= ? AND t1.Status <= ?
|
||||
`, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus).QueryRows(&orders)
|
||||
if err == nil {
|
||||
return orders, nil
|
||||
}
|
||||
globals.SugarLogger.Infof("GetStoreOrderInfo storeID:%s failed with error:%v", storeID, err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func (c *OrderManager) GetOrderSkuInfo(vendorOrderID string, vendorID int) (skus []*model.OrderSkuExt, err error) {
|
||||
db := orm.NewOrm()
|
||||
_, err = db.Raw(`
|
||||
SELECT t1.*, t2.img image
|
||||
FROM order_sku t1
|
||||
LEFT JOIN jx_sku_name t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id
|
||||
WHERE vendor_order_id = ? AND vendor_id = ?
|
||||
`, vendorOrderID, vendorID).QueryRows(&skus)
|
||||
if err == nil {
|
||||
return skus, nil
|
||||
}
|
||||
globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s failed with error:%v", vendorOrderID, err)
|
||||
return nil, err
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package basesch
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
@@ -16,6 +17,14 @@ type BaseScheduler struct {
|
||||
IsReallyCallPlatformAPI bool
|
||||
}
|
||||
|
||||
var (
|
||||
FixedBaseScheduler *BaseScheduler
|
||||
)
|
||||
|
||||
var (
|
||||
ErrOrderStatusIsNotSuitable = errors.New("订单状态不适合当前操作")
|
||||
)
|
||||
|
||||
func (c *BaseScheduler) Init() {
|
||||
c.PurchasePlatformHandlers = make(map[int]partner.IPurchasePlatformHandler)
|
||||
c.DeliveryPlatformHandlers = make(map[int]*scheduler.DeliveryPlatformHandlerInfo)
|
||||
@@ -75,25 +84,12 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) {
|
||||
}, "PickupGoods orderID:%s", order.VendorOrderID)
|
||||
}
|
||||
} else {
|
||||
err = ErrOrderStatusIsNotSuitable
|
||||
globals.SugarLogger.Infof("PickupGoods orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) PickupGoodsExternal(vendorOrderID string, vendorID int) (err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
|
||||
if err == nil {
|
||||
err = c.PickupGoods(order)
|
||||
if err == nil {
|
||||
order.Status = model.OrderStatusFinishedPickup
|
||||
err = utils.CallFuncLogErrorWithInfo(func() error {
|
||||
return partner.CurOrderManager.UpdateOrderStatusDirectly(order)
|
||||
}, "PickupGoodsExternal orderID:%s", order.VendorOrderID)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) {
|
||||
globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID)
|
||||
if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup {
|
||||
@@ -106,25 +102,12 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err = ErrOrderStatusIsNotSuitable
|
||||
globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) Swtich2SelfDeliverExternal(vendorOrderID string, vendorID int) (err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
|
||||
if err == nil {
|
||||
err = c.Swtich2SelfDeliver(order)
|
||||
if err == nil {
|
||||
order.Status = model.OrderStatusDelivering
|
||||
err = utils.CallFuncLogErrorWithInfo(func() error {
|
||||
return partner.CurOrderManager.UpdateOrderStatusDirectly(order)
|
||||
}, "Swtich2SelfDeliverExternal orderID:%s", order.VendorOrderID)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) {
|
||||
globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s", order.VendorOrderID)
|
||||
if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering {
|
||||
@@ -172,21 +155,24 @@ func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err erro
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder) (err error) {
|
||||
func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) {
|
||||
globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID)
|
||||
if !model.IsOrderSolid(order) { // 如果订单是不完整的
|
||||
globals.SugarLogger.Warnf("CreateWaybill orderID:%s, vendorID:%d is not solid!!!", order.VendorOrderID, platformVendorID)
|
||||
return scheduler.ErrOrderIsNotSolid
|
||||
return nil, scheduler.ErrOrderIsNotSolid
|
||||
}
|
||||
if c.IsReallyCallPlatformAPI {
|
||||
handlerInfo := c.GetDeliveryPlatformFromVendorID(platformVendorID)
|
||||
if handlerInfo.Use4CreateWaybill {
|
||||
if err = handlerInfo.Handler.CreateWaybill(order); err != nil {
|
||||
if handlerInfo != nil && handlerInfo.Use4CreateWaybill {
|
||||
bill, err = handlerInfo.Handler.CreateWaybill(order, policy)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Infof("CreateWaybill failed orderID:%s vendorID:%d with error:%v", order.VendorOrderID, platformVendorID, err)
|
||||
}
|
||||
} else {
|
||||
err = scheduler.ErrDeliverProviderWrong
|
||||
}
|
||||
}
|
||||
return err
|
||||
return bill, err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) CancelWaybill(bill *model.Waybill) (err error) {
|
||||
|
||||
43
business/jxcallback/scheduler/basesch/basesch_ext.go
Normal file
43
business/jxcallback/scheduler/basesch/basesch_ext.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package basesch
|
||||
|
||||
import (
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
"git.rosy.net.cn/jx-callback/business/partner"
|
||||
)
|
||||
|
||||
func (c *BaseScheduler) CreateWaybillOnProviders(vendorOrderID string, vendorID int) (bills []*model.Waybill, err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
|
||||
if err == nil {
|
||||
bill, err2 := c.CreateWaybill(model.VendorIDMTPS, order, nil)
|
||||
if err = err2; err == nil {
|
||||
return []*model.Waybill{
|
||||
bill,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) Swtich2SelfDeliverAndUpdateStatus(vendorOrderID string, vendorID int) (err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
|
||||
if err == nil {
|
||||
err = c.Swtich2SelfDeliver(order)
|
||||
if err == nil {
|
||||
order.Status = model.OrderStatusDelivering
|
||||
err = partner.CurOrderManager.UpdateOrderStatusDirectly(order)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) PickupGoodsAndUpdateStatus(vendorOrderID string, vendorID int) (err error) {
|
||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
|
||||
if err == nil {
|
||||
err = c.PickupGoods(order)
|
||||
if err == nil {
|
||||
order.Status = model.OrderStatusFinishedPickup
|
||||
err = partner.CurOrderManager.UpdateOrderStatusDirectly(order)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package defsch
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"time"
|
||||
@@ -34,6 +35,14 @@ const (
|
||||
orderMapStoreMaxTime = 4 * 24 * time.Hour // cache最长存储时间
|
||||
)
|
||||
|
||||
const (
|
||||
maxAddFee = 200 // 最大增加费用,单位为分,超过不发三方配送了
|
||||
)
|
||||
|
||||
var (
|
||||
ErrAddFeeExceeded = errors.New("配送超过基准价太多")
|
||||
)
|
||||
|
||||
type WatchOrderInfo struct {
|
||||
autoPickupTimeoutMinute int // 0表示禁用,1表示用缺省值time2AutoPickupMin,其它表示分钟数
|
||||
storeDeliveryType int
|
||||
@@ -133,6 +142,7 @@ func init() {
|
||||
sch := &DefScheduler{}
|
||||
sch.IsReallyCallPlatformAPI = globals.ReallyCallPlatformAPI
|
||||
sch.Init()
|
||||
basesch.FixedBaseScheduler = &sch.BaseScheduler
|
||||
scheduler.CurrentScheduler = sch
|
||||
sch.defWorkflowConfig = []map[int]*StatusActionConfig{
|
||||
map[int]*StatusActionConfig{
|
||||
@@ -405,8 +415,24 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
|
||||
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
|
||||
successCount := 0
|
||||
for _, vendorID := range savedOrderInfo.supported3rdCarriers {
|
||||
if s.DeliveryPlatformHandlers[vendorID] != nil && s.DeliveryPlatformHandlers[vendorID].Use4CreateWaybill && savedOrderInfo.waybills[vendorID] == nil && (excludeBill == nil || vendorID != excludeBill.WaybillVendorID) {
|
||||
if err = s.CreateWaybill(vendorID, order); err == nil {
|
||||
handlerInfo := s.GetDeliveryPlatformFromVendorID(vendorID)
|
||||
if handlerInfo != nil && handlerInfo.Use4CreateWaybill && savedOrderInfo.waybills[vendorID] == nil && (excludeBill == nil || vendorID != excludeBill.WaybillVendorID) {
|
||||
if _, err = s.CreateWaybill(vendorID, order, func(deliveryFee, addFee int64) error {
|
||||
if addFee > maxAddFee {
|
||||
db := orm.NewOrm()
|
||||
globals.SugarLogger.Infof("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee)
|
||||
|
||||
tmpLog := &legacymodel.TempLog{
|
||||
VendorOrderID: order.VendorOrderID,
|
||||
RefVendorOrderID: order.VendorOrderID,
|
||||
IntValue1: addFee,
|
||||
Msg: fmt.Sprintf("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee),
|
||||
}
|
||||
db.Insert(tmpLog)
|
||||
return ErrAddFeeExceeded
|
||||
}
|
||||
return nil
|
||||
}); err == nil {
|
||||
successCount++
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ var (
|
||||
ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)")
|
||||
ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)")
|
||||
ErrOrderIsNotSolid = errors.New("订单是临时订单,不完整,不能用于创建运单")
|
||||
ErrDeliverProviderWrong = errors.New("快递商不存在或不能用于创建运单")
|
||||
)
|
||||
|
||||
type DeliveryPlatformHandlerInfo struct {
|
||||
|
||||
Reference in New Issue
Block a user