- save real order status when new order msg came.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user