From 4862649d77b710a83616b6c58dc744e8fe94462b Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 3 Aug 2018 15:55:00 +0800 Subject: [PATCH] - handle exceptional msg(e.g. userapplycancel, lock, unlock). --- business/controller/jd/order.go | 21 ++++++++++++--------- business/controller/order.go | 23 ++++++++++++++++++----- business/model/const.go | 2 ++ business/model/model.go | 1 + business/model/order.go | 1 + business/scheduler/defsch/defsch.go | 18 ++++++++++++------ business/scheduler/scheduler.go | 10 +++++----- 7 files changed, 51 insertions(+), 25 deletions(-) diff --git a/business/controller/jd/order.go b/business/controller/jd/order.go index 831077561..dc8cb457a 100644 --- a/business/controller/jd/order.go +++ b/business/controller/jd/order.go @@ -17,15 +17,18 @@ import ( var ( VendorStatus2StatusMap = map[string]int{ - jdapi.OrderStatusPurchased: model.OrderStatusNew, - jdapi.OrderStatusNew: model.OrderStatusNew, - jdapi.OrderStatusAdjust: model.OrderStatusNew, - jdapi.OrderStatusWaitOutStore: model.OrderStatusAccepted, - jdapi.OrderStatusFinishedPickup: model.OrderStatusFinishedPickup, - jdapi.OrderStatusDelivering: model.OrderStatusDelivering, - jdapi.OrderStatusDelivered: model.OrderStatusDelivered, - jdapi.OrderStatusCanceled: model.OrderStatusCanceled, + jdapi.OrderStatusPurchased: model.OrderStatusNew, + jdapi.OrderStatusNew: model.OrderStatusNew, + jdapi.OrderStatusAdjust: model.OrderStatusNew, + jdapi.OrderStatusWaitOutStore: model.OrderStatusAccepted, + jdapi.OrderStatusFinishedPickup: model.OrderStatusFinishedPickup, + jdapi.OrderStatusDelivering: model.OrderStatusDelivering, + jdapi.OrderStatusDelivered: model.OrderStatusDelivered, + jdapi.OrderStatusCanceled: model.OrderStatusCanceled, + jdapi.OrderStatusUserApplyCancel: model.OrderStatusApplyCancel, + jdapi.OrderStatusLocked: model.OrderStatusLocked, + jdapi.OrderStatusUnlocked: model.OrderStatusUnlocked, } ) @@ -51,7 +54,6 @@ func (c *OrderController) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi retVal = c.onOrderAdjust(msg) } else { status := c.callbackMsg2Status(msg) - status.Status = c.GetStatusFromVendorStatus(msg.StatusID) if msg.StatusID == jdapi.OrderStatusAddComment || msg.StatusID == jdapi.OrderStatusModifyComment { if globals.ReallyCallPlatformAPI { freshfood.FreshFoodAPI.JDOrderComment(msg) @@ -169,6 +171,7 @@ func (c *OrderController) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model RefVendorOrderID: msg.BillID, RefVendorID: model.VendorIDJD, VendorStatus: msg.StatusID, + Status: c.GetStatusFromVendorStatus(msg.StatusID), StatusTime: utils.Str2Time(msg.Timestamp), Remark: msg.Remark, } diff --git a/business/controller/order.go b/business/controller/order.go index 50a470d57..212ca03a6 100644 --- a/business/controller/order.go +++ b/business/controller/order.go @@ -254,16 +254,29 @@ func (c *OrderController) addOrderStatus(orderStatus *model.OrderStatus, db orm. VendorID: orderStatus.VendorID, } if err = db.ReadForUpdate(order, "VendorOrderID", "VendorID"); err == nil { - if orderStatus.Status >= order.Status { // todo 要求status不能回绕 - order.Status = orderStatus.Status + if (orderStatus.Status == model.OrderStatusUnlocked || orderStatus.Status == model.OrderStatusLocked || orderStatus.Status == model.OrderStatusApplyCancel) || + (orderStatus.Status > model.OrderStatusUnknown && orderStatus.Status >= order.Status) { // todo 要求status不能回绕 order.VendorStatus = orderStatus.VendorStatus order.StatusTime = orderStatus.StatusTime - order.OrderFinishedAt = orderStatus.StatusTime updateFields := []string{ - "status", "vendor_status", "status_time", + "VendorStatus", "StatusTime", + } + if orderStatus.Status > model.OrderStatusUnknown { + order.LockStatus = model.OrderStatusUnknown + order.Status = orderStatus.Status + updateFields = append(updateFields, "Status", "LockStatus") + } else { + if orderStatus.Status == model.OrderStatusUnlocked { + order.LockStatus = model.OrderStatusUnknown + updateFields = append(updateFields, "LockStatus") + } else if orderStatus.Status == model.OrderStatusLocked || orderStatus.Status == model.OrderStatusApplyCancel { + order.LockStatus = orderStatus.Status + updateFields = append(updateFields, "LockStatus") + } } if orderStatus.Status >= model.OrderStatusEndBegin { - updateFields = append(updateFields, "order_finished_at") + order.OrderFinishedAt = orderStatus.StatusTime + updateFields = append(updateFields, "OrderFinishedAt") } utils.CallFuncLogError(func() error { _, err = db.Update(order, updateFields...) diff --git a/business/model/const.go b/business/model/const.go index 306678c11..bc99e4245 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -78,6 +78,8 @@ const ( ) const ( + OrderStatusUnlocked = -25 + OrderStatusLocked = -20 OrderStatusApplyUrgeOrder = -15 OrderStatusApplyRefund = -10 OrderStatusApplyCancel = -5 diff --git a/business/model/model.go b/business/model/model.go index 6024c5a52..f2c75f265 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -12,6 +12,7 @@ func Order2Status(order *GoodsOrder) (retVal *OrderStatus) { Status: order.Status, VendorStatus: order.VendorStatus, StatusTime: order.StatusTime, + LockStatus: order.LockStatus, } return retVal } diff --git a/business/model/order.go b/business/model/order.go index 9d2969bbb..2bfc4e331 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -127,6 +127,7 @@ type OrderStatus struct { DuplicatedCount int // 收到的重复状态转换(或消息)数,一般是由于重发造成的 Remark string `orm:"size(255)"` ModelTimeInfo + LockStatus int `orm:"-"` // todo 只是用于传递状态,应该可以优化掉 } func (v *OrderStatus) TableIndex() [][]string { diff --git a/business/scheduler/defsch/defsch.go b/business/scheduler/defsch/defsch.go index c665c8aa4..2b7571754 100644 --- a/business/scheduler/defsch/defsch.go +++ b/business/scheduler/defsch/defsch.go @@ -208,15 +208,20 @@ func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err return err } +// todo 这个接口应该可以直接传order的,因为在OrderManager中每次都生成了 func (s *DefScheduler) OnOrderStatusChanged(status *model.OrderStatus, isPending bool) (err error) { - if status.Status > model.OrderStatusUnknown { // 只处理状态转换,一般消息不处理 + if status.LockStatus != model.OrderStatusUnknown || status.Status > model.OrderStatusUnknown { globals.SugarLogger.Debugf("OnOrderStatusChanged orderID:%s %s, status:%v", status.VendorOrderID, model.OrderStatusName[status.Status], status) savedOrderInfo := s.loadSavedOrderFromMap(status, true) s.updateOrderByStatus(savedOrderInfo.order, status) - s.resetTimer(savedOrderInfo, nil, isPending) - if status.Status >= model.OrderStatusEndBegin { - s.cancelOtherWaybills(savedOrderInfo, nil) - s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status)) + if status.LockStatus == model.OrderStatusUnknown && status.Status > model.OrderStatusUnknown { // 只处理状态转换,一般消息不处理 + s.resetTimer(savedOrderInfo, nil, isPending) + if status.Status >= model.OrderStatusEndBegin { + s.cancelOtherWaybills(savedOrderInfo, nil) + s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status)) + } + } else if status.LockStatus != model.OrderStatusUnknown { + s.stopTimer(savedOrderInfo) } } return err @@ -367,7 +372,7 @@ func (s *DefScheduler) removeWaybillFromMap(savedOrderInfo *WatchOrderInfo, bill func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInfo, excludeBill *model.Waybill) (err error) { order := savedOrderInfo.order globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d, excludeBill:%v", order.VendorOrderID, order.Status, excludeBill) - if order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin { // 订单在配送中被取消时就是配送中状态 + if order.LockStatus == model.OrderStatusUnknown && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin { // 订单在配送中被取消时就是配送中状态 if savedOrderInfo.isNeed3rdDelivery { savedOrderInfo.retryCount++ if savedOrderInfo.retryCount <= maxWaybillRetryCount { @@ -612,6 +617,7 @@ func (s *DefScheduler) updateOrderByStatus(order *model.GoodsOrder, status *mode order.Status = status.Status order.VendorStatus = status.VendorStatus order.StatusTime = status.StatusTime + order.LockStatus = status.LockStatus return order } diff --git a/business/scheduler/scheduler.go b/business/scheduler/scheduler.go index 18dac9f5a..8001ac957 100644 --- a/business/scheduler/scheduler.go +++ b/business/scheduler/scheduler.go @@ -133,7 +133,7 @@ func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) *DeliveryP func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) - if order.Status == model.OrderStatusNew { + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusNew { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogErrorWithInfo(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt) @@ -146,7 +146,7 @@ func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt } func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID) - if order.Status == model.OrderStatusAccepted { + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusAccepted { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogErrorWithInfo(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).PickupGoods(order) @@ -160,7 +160,7 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID) - if order.Status == model.OrderStatusFinishedPickup { + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogErrorWithInfo(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDeliver(order) @@ -174,7 +174,7 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID) - if order.Status == model.OrderStatusFinishedPickup { + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievering(order) @@ -190,7 +190,7 @@ func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err err func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID) - if order.Status == model.OrderStatusFinishedPickup || order.Status == model.OrderStatusDelivering { // todo 饿了么转自送后,不会发送配送中消息,暂时先这样 + if order.LockStatus == model.OrderStatusUnknown && (order.Status == model.OrderStatusFinishedPickup || order.Status == model.OrderStatusDelivering) { // todo 饿了么转自送后,不会发送配送中消息,暂时先这样 if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievered(order)