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