From 52ac5ca64a0525783009863741efd5347d2dcb75 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 22 Jul 2018 21:57:56 +0800 Subject: [PATCH] - save real order status when new order msg came. --- business/controller/elm/order.go | 25 +++++++++++++++--- business/controller/jd/order.go | 45 +++++++++++++++++--------------- business/controller/order.go | 19 +++++++++----- business/model/model.go | 5 ++++ business/scheduler/scheduler.go | 6 +++++ 5 files changed, 70 insertions(+), 30 deletions(-) diff --git a/business/controller/elm/order.go b/business/controller/elm/order.go index d4db83eee..52ab91a1b 100644 --- a/business/controller/elm/order.go +++ b/business/controller/elm/order.go @@ -23,6 +23,17 @@ const ( fakePickedUp = "fakefinishedpickup" ) +var ( + VendorStatus2StatusMap = map[string]int{ + elmapi.OrderStatusUnprocessed: model.OrderStatusNew, + elmapi.OrderStatusValid: model.OrderStatusAccepted, + elmapi.OrderStatusPending: model.OrderStatusNew, + elmapi.OrderStatusRefunding: model.OrderStatusApplyRefund, + elmapi.OrderStatusInvalid: model.OrderStatusCanceled, + elmapi.OrderStatusSettled: model.OrderStatusFinished, + } +) + type OrderController struct { scheduler.BasePurchasePlatform } @@ -146,6 +157,7 @@ func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["totalPrice"])), Skus: []*model.OrderSku{}, } + order.Status = c.GetStatusFromVendorStatus(order.VendorStatus) deliveryGeo := strings.Split(utils.Interface2String(result["deliveryGeo"]), ",") if len(deliveryGeo) == 2 { order.CoordinateType = model.CoordinateTypeMars @@ -183,9 +195,8 @@ func (c *OrderController) onOrderNew(msg map[string]interface{}) (response *elma // todo 这里应该可以直接用msg里的内容,而不用再次去查 order, err := c.GetOrder(msg["orderId"].(string)) if err == nil { - order.VendorStatus = c.stateAndType2Str(msg["status"].(string), elmapi.MsgTypeOrderValid) - order.Status = model.OrderStatusNew - err = controller.OrderManager.OnOrderNew(order) + order.VendorStatus = c.stateAndType2Str(order.VendorStatus, elmapi.MsgTypeOrderValid) + err = controller.OrderManager.OnOrderNew(order, c.stateAndType2Str(msg["status"].(string), elmapi.MsgTypeOrderValid)) // if globals.HandleLegacyJxOrder && err == nil { // c.legacyWriteElmOrder(order) // } @@ -227,6 +238,14 @@ func (c *OrderController) spliltCompositeState(compositeState string) (state str } // PurchasePlatformHandler +func (c *OrderController) GetStatusFromVendorStatus(vendorStatus string) int { + state, _ := c.spliltCompositeState(vendorStatus) + if status, ok := VendorStatus2StatusMap[state]; ok { + return status + } + return model.OrderStatusUnknown +} + func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { if isAcceptIt { err = api.ElmAPI.ConfirmOrder(order.VendorOrderID) diff --git a/business/controller/jd/order.go b/business/controller/jd/order.go index fa99f28f0..5e1d5ddf0 100644 --- a/business/controller/jd/order.go +++ b/business/controller/jd/order.go @@ -15,6 +15,18 @@ import ( "git.rosy.net.cn/jx-callback/legacy/freshfood" ) +var ( + VendorStatus2StatusMap = map[string]int{ + jdapi.OrderStatusNew: 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, + } +) + type OrderController struct { scheduler.BasePurchasePlatform } @@ -37,26 +49,11 @@ func (c *OrderController) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi retVal = c.onOrderAdjust(msg) } else { status := c.callbackMsg2Status(msg) - switch msg.StatusID { - case jdapi.OrderStatusWaitOutStore: - status.Status = model.OrderStatusAccepted - case jdapi.OrderStatusFinishedPickup: - status.Status = model.OrderStatusFinishedPickup - case jdapi.OrderStatusDelivering: - status.Status = model.OrderStatusDelivering - case jdapi.OrderStatusDelivered: - status.Status = model.OrderStatusDelivered - case jdapi.OrderStatusCanceled: - status.Status = model.OrderStatusCanceled - case jdapi.OrderStatusUserApplyCancel: - status.Status = model.OrderStatusApplyCancel - case jdapi.OrderStatusAddComment, jdapi.OrderStatusModifyComment: - status.Status = model.OrderStatusUnknown + status.Status = c.GetStatusFromVendorStatus(msg.StatusID) + if msg.StatusID == jdapi.OrderStatusAddComment || msg.StatusID == jdapi.OrderStatusModifyComment { if globals.ReallyCallPlatformAPI { freshfood.FreshFoodAPI.JDOrderComment(msg) } - default: - status.Status = model.OrderStatusUnknown } err := controller.OrderManager.OnOrderStatusChanged(status) // if globals.HandleLegacyJxOrder && err == nil { @@ -90,6 +87,7 @@ func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err ActualPayPrice: utils.MustInterface2Int64(result["orderBuyerPayableMoney"]), Skus: []*model.OrderSku{}, } + order.Status = c.GetStatusFromVendorStatus(order.VendorStatus) coordinateType := utils.Interface2Int64WithDefault(result["buyerCoordType"], 1) originalLng := utils.MustInterface2Float64(result["buyerLng"]) originalLat := utils.MustInterface2Float64(result["buyerLat"]) @@ -136,8 +134,7 @@ func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jdapi.CallbackResponse) { order, err := c.GetOrder(msg.BillID) if err == nil { - order.Status = model.OrderStatusNew - err = controller.OrderManager.OnOrderNew(order) + err = controller.OrderManager.OnOrderNew(order, msg.StatusID) // if err == nil { // c.legacyWriteJdOrder(order, false) // } @@ -148,8 +145,7 @@ func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jda func (c *OrderController) onOrderAdjust(msg *jdapi.CallbackOrderMsg) *jdapi.CallbackResponse { order, err := c.GetOrder(msg.BillID) if err == nil { - order.Status = model.OrderStatusAdjust - err = controller.OrderManager.OnOrderAdjust(order) + err = controller.OrderManager.OnOrderAdjust(order, msg.StatusID) // if globals.HandleLegacyJxOrder && err == nil { // c.legacyWriteJdOrder(order, true) // } @@ -171,6 +167,13 @@ func (c *OrderController) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model } // PurchasePlatformHandler +func (c *OrderController) GetStatusFromVendorStatus(vendorStatus string) int { + if status, ok := VendorStatus2StatusMap[vendorStatus]; ok { + return status + } + return model.OrderStatusUnknown +} + func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { _, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt) return err diff --git a/business/controller/order.go b/business/controller/order.go index 92eaaf4d4..2cb43f6b3 100644 --- a/business/controller/order.go +++ b/business/controller/order.go @@ -4,12 +4,11 @@ import ( "fmt" "time" - "git.rosy.net.cn/jx-callback/business/scheduler" - "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/scheduler" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) @@ -39,9 +38,14 @@ func (c *OrderController) LoadPendingOrders() []*model.GoodsOrder { return orders } -func (c *OrderController) OnOrderNew(order *model.GoodsOrder) (err error) { +// msgVendorStatus的意思是事件本身的类型,类似有时收到NewOrder事件去取,订单状态不一定就是New的 +// OnOrderAdjust也类似,而OrderStatus要记录的是消息,所以添加这个 +func (c *OrderController) OnOrderNew(order *model.GoodsOrder, msgVendorStatus string) (err error) { db := orm.NewOrm() - isDuplicated, err := addOrderOrWaybillStatus(model.Order2Status(order), db) + status := model.Order2Status(order) + status.Status = model.OrderStatusNew + status.VendorStatus = msgVendorStatus + isDuplicated, err := addOrderOrWaybillStatus(status, db) if err == nil && !isDuplicated { if err = c.saveOrder(order, false, db); err == nil { err = scheduler.CurrentScheduler.OnOrderNew(order) @@ -52,9 +56,11 @@ func (c *OrderController) OnOrderNew(order *model.GoodsOrder) (err error) { } // todo 调整单的处理可能还需要再细化一点,当前只是简单的删除重建 -func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder) (err error) { +func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder, msgVendorStatus string) (err error) { db := orm.NewOrm() status := model.Order2Status(order) + status.Status = model.OrderStatusAdjust + status.VendorStatus = msgVendorStatus isDuplicated, err := addOrderOrWaybillStatus(status, db) if err == nil && !isDuplicated { err = utils.CallFuncLogError(func() error { @@ -72,7 +78,8 @@ func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder) (err error) { return err } if err = c.saveOrder(order, true, db); err == nil { - err = scheduler.CurrentScheduler.OnOrderStatusChanged(status) + // 因为订单调度器需要的是真实状态,所以用order的状态 + err = scheduler.CurrentScheduler.OnOrderStatusChanged(model.Order2Status(order)) } } return err diff --git a/business/model/model.go b/business/model/model.go index d92567613..b7ef434d7 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -27,3 +27,8 @@ func Waybill2Status(bill *Waybill) (retVal *OrderStatus) { } return retVal } + +// 判断订单是否是临时的,不是真实收到了new order消息后的订单 +func IsOrderSolid(order *GoodsOrder) bool { + return !(order.ConsigneeName == "" && order.ID == 0) +} diff --git a/business/scheduler/scheduler.go b/business/scheduler/scheduler.go index 9ec53d819..bcab6b90d 100644 --- a/business/scheduler/scheduler.go +++ b/business/scheduler/scheduler.go @@ -19,6 +19,7 @@ var ( ErrCanNotCreateAtLeastOneWaybill = errors.New("一个运单都不能创建") ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)") ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)") + ErrOrderIsNotSolid = errors.New("订单是临时订单,不完整,不能用于创建运单") ) type StatusActionConfig struct { @@ -27,6 +28,7 @@ type StatusActionConfig struct { } type PurchasePlatformHandler interface { + GetStatusFromVendorStatus(vendorStatus string) int GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) GetStatusActionConfig(status int) *StatusActionConfig @@ -157,6 +159,10 @@ func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err erro func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder) (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 ErrOrderIsNotSolid + } if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { return c.GetDeliveryPlatformFromVendorID(platformVendorID).CreateWaybill(order)