- 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"
)
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)

View File

@@ -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

View File

@@ -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

View File

@@ -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)
}

View File

@@ -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)