- save real order status when new order msg came.

This commit is contained in:
gazebo
2018-07-22 21:57:56 +08:00
parent 7ae0944fc9
commit 52ac5ca64a
5 changed files with 70 additions and 30 deletions

View File

@@ -23,6 +23,17 @@ const (
fakePickedUp = "fakefinishedpickup" 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 { type OrderController struct {
scheduler.BasePurchasePlatform scheduler.BasePurchasePlatform
} }
@@ -146,6 +157,7 @@ func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err
ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["totalPrice"])), ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["totalPrice"])),
Skus: []*model.OrderSku{}, Skus: []*model.OrderSku{},
} }
order.Status = c.GetStatusFromVendorStatus(order.VendorStatus)
deliveryGeo := strings.Split(utils.Interface2String(result["deliveryGeo"]), ",") deliveryGeo := strings.Split(utils.Interface2String(result["deliveryGeo"]), ",")
if len(deliveryGeo) == 2 { if len(deliveryGeo) == 2 {
order.CoordinateType = model.CoordinateTypeMars order.CoordinateType = model.CoordinateTypeMars
@@ -183,9 +195,8 @@ func (c *OrderController) onOrderNew(msg map[string]interface{}) (response *elma
// todo 这里应该可以直接用msg里的内容而不用再次去查 // todo 这里应该可以直接用msg里的内容而不用再次去查
order, err := c.GetOrder(msg["orderId"].(string)) order, err := c.GetOrder(msg["orderId"].(string))
if err == nil { if err == nil {
order.VendorStatus = c.stateAndType2Str(msg["status"].(string), elmapi.MsgTypeOrderValid) order.VendorStatus = c.stateAndType2Str(order.VendorStatus, elmapi.MsgTypeOrderValid)
order.Status = model.OrderStatusNew err = controller.OrderManager.OnOrderNew(order, c.stateAndType2Str(msg["status"].(string), elmapi.MsgTypeOrderValid))
err = controller.OrderManager.OnOrderNew(order)
// if globals.HandleLegacyJxOrder && err == nil { // if globals.HandleLegacyJxOrder && err == nil {
// c.legacyWriteElmOrder(order) // c.legacyWriteElmOrder(order)
// } // }
@@ -227,6 +238,14 @@ func (c *OrderController) spliltCompositeState(compositeState string) (state str
} }
// PurchasePlatformHandler // 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) { func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) {
if isAcceptIt { if isAcceptIt {
err = api.ElmAPI.ConfirmOrder(order.VendorOrderID) err = api.ElmAPI.ConfirmOrder(order.VendorOrderID)

View File

@@ -15,6 +15,18 @@ import (
"git.rosy.net.cn/jx-callback/legacy/freshfood" "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 { type OrderController struct {
scheduler.BasePurchasePlatform scheduler.BasePurchasePlatform
} }
@@ -37,26 +49,11 @@ func (c *OrderController) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi
retVal = c.onOrderAdjust(msg) retVal = c.onOrderAdjust(msg)
} else { } else {
status := c.callbackMsg2Status(msg) status := c.callbackMsg2Status(msg)
switch msg.StatusID { status.Status = c.GetStatusFromVendorStatus(msg.StatusID)
case jdapi.OrderStatusWaitOutStore: if msg.StatusID == jdapi.OrderStatusAddComment || msg.StatusID == jdapi.OrderStatusModifyComment {
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
if globals.ReallyCallPlatformAPI { if globals.ReallyCallPlatformAPI {
freshfood.FreshFoodAPI.JDOrderComment(msg) freshfood.FreshFoodAPI.JDOrderComment(msg)
} }
default:
status.Status = model.OrderStatusUnknown
} }
err := controller.OrderManager.OnOrderStatusChanged(status) err := controller.OrderManager.OnOrderStatusChanged(status)
// if globals.HandleLegacyJxOrder && err == nil { // if globals.HandleLegacyJxOrder && err == nil {
@@ -90,6 +87,7 @@ func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err
ActualPayPrice: utils.MustInterface2Int64(result["orderBuyerPayableMoney"]), ActualPayPrice: utils.MustInterface2Int64(result["orderBuyerPayableMoney"]),
Skus: []*model.OrderSku{}, Skus: []*model.OrderSku{},
} }
order.Status = c.GetStatusFromVendorStatus(order.VendorStatus)
coordinateType := utils.Interface2Int64WithDefault(result["buyerCoordType"], 1) coordinateType := utils.Interface2Int64WithDefault(result["buyerCoordType"], 1)
originalLng := utils.MustInterface2Float64(result["buyerLng"]) originalLng := utils.MustInterface2Float64(result["buyerLng"])
originalLat := utils.MustInterface2Float64(result["buyerLat"]) 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) { func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jdapi.CallbackResponse) {
order, err := c.GetOrder(msg.BillID) order, err := c.GetOrder(msg.BillID)
if err == nil { if err == nil {
order.Status = model.OrderStatusNew err = controller.OrderManager.OnOrderNew(order, msg.StatusID)
err = controller.OrderManager.OnOrderNew(order)
// if err == nil { // if err == nil {
// c.legacyWriteJdOrder(order, false) // 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 { func (c *OrderController) onOrderAdjust(msg *jdapi.CallbackOrderMsg) *jdapi.CallbackResponse {
order, err := c.GetOrder(msg.BillID) order, err := c.GetOrder(msg.BillID)
if err == nil { if err == nil {
order.Status = model.OrderStatusAdjust err = controller.OrderManager.OnOrderAdjust(order, msg.StatusID)
err = controller.OrderManager.OnOrderAdjust(order)
// if globals.HandleLegacyJxOrder && err == nil { // if globals.HandleLegacyJxOrder && err == nil {
// c.legacyWriteJdOrder(order, true) // c.legacyWriteJdOrder(order, true)
// } // }
@@ -171,6 +167,13 @@ func (c *OrderController) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model
} }
// PurchasePlatformHandler // 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) { func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) {
_, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt) _, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt)
return err return err

View File

@@ -4,12 +4,11 @@ import (
"fmt" "fmt"
"time" "time"
"git.rosy.net.cn/jx-callback/business/scheduler"
"git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg"
"git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/scheduler"
"git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm" "github.com/astaxie/beego/orm"
) )
@@ -39,9 +38,14 @@ func (c *OrderController) LoadPendingOrders() []*model.GoodsOrder {
return orders 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() 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 == nil && !isDuplicated {
if err = c.saveOrder(order, false, db); err == nil { if err = c.saveOrder(order, false, db); err == nil {
err = scheduler.CurrentScheduler.OnOrderNew(order) err = scheduler.CurrentScheduler.OnOrderNew(order)
@@ -52,9 +56,11 @@ func (c *OrderController) OnOrderNew(order *model.GoodsOrder) (err error) {
} }
// todo 调整单的处理可能还需要再细化一点,当前只是简单的删除重建 // todo 调整单的处理可能还需要再细化一点,当前只是简单的删除重建
func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder) (err error) { func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder, msgVendorStatus string) (err error) {
db := orm.NewOrm() db := orm.NewOrm()
status := model.Order2Status(order) status := model.Order2Status(order)
status.Status = model.OrderStatusAdjust
status.VendorStatus = msgVendorStatus
isDuplicated, err := addOrderOrWaybillStatus(status, db) isDuplicated, err := addOrderOrWaybillStatus(status, db)
if err == nil && !isDuplicated { if err == nil && !isDuplicated {
err = utils.CallFuncLogError(func() error { err = utils.CallFuncLogError(func() error {
@@ -72,7 +78,8 @@ func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder) (err error) {
return err return err
} }
if err = c.saveOrder(order, true, db); err == nil { if err = c.saveOrder(order, true, db); err == nil {
err = scheduler.CurrentScheduler.OnOrderStatusChanged(status) // 因为订单调度器需要的是真实状态所以用order的状态
err = scheduler.CurrentScheduler.OnOrderStatusChanged(model.Order2Status(order))
} }
} }
return err return err

View File

@@ -27,3 +27,8 @@ func Waybill2Status(bill *Waybill) (retVal *OrderStatus) {
} }
return retVal return retVal
} }
// 判断订单是否是临时的不是真实收到了new order消息后的订单
func IsOrderSolid(order *GoodsOrder) bool {
return !(order.ConsigneeName == "" && order.ID == 0)
}

View File

@@ -19,6 +19,7 @@ var (
ErrCanNotCreateAtLeastOneWaybill = errors.New("一个运单都不能创建") ErrCanNotCreateAtLeastOneWaybill = errors.New("一个运单都不能创建")
ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)") ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)")
ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)") ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)")
ErrOrderIsNotSolid = errors.New("订单是临时订单,不完整,不能用于创建运单")
) )
type StatusActionConfig struct { type StatusActionConfig struct {
@@ -27,6 +28,7 @@ type StatusActionConfig struct {
} }
type PurchasePlatformHandler interface { type PurchasePlatformHandler interface {
GetStatusFromVendorStatus(vendorStatus string) int
GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error)
GetStatusActionConfig(status int) *StatusActionConfig 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) { func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder) (err error) {
globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID) 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 { if c.IsReallyCallPlatformAPI {
err = utils.CallFuncLogError(func() error { err = utils.CallFuncLogError(func() error {
return c.GetDeliveryPlatformFromVendorID(platformVendorID).CreateWaybill(order) return c.GetDeliveryPlatformFromVendorID(platformVendorID).CreateWaybill(order)