- handle exceptional msg(e.g. userapplycancel, lock, unlock).
This commit is contained in:
@@ -25,7 +25,10 @@ var (
|
|||||||
jdapi.OrderStatusDelivering: model.OrderStatusDelivering,
|
jdapi.OrderStatusDelivering: model.OrderStatusDelivering,
|
||||||
jdapi.OrderStatusDelivered: model.OrderStatusDelivered,
|
jdapi.OrderStatusDelivered: model.OrderStatusDelivered,
|
||||||
jdapi.OrderStatusCanceled: model.OrderStatusCanceled,
|
jdapi.OrderStatusCanceled: model.OrderStatusCanceled,
|
||||||
|
|
||||||
jdapi.OrderStatusUserApplyCancel: model.OrderStatusApplyCancel,
|
jdapi.OrderStatusUserApplyCancel: model.OrderStatusApplyCancel,
|
||||||
|
jdapi.OrderStatusLocked: model.OrderStatusLocked,
|
||||||
|
jdapi.OrderStatusUnlocked: model.OrderStatusUnlocked,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -51,7 +54,6 @@ 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)
|
||||||
status.Status = c.GetStatusFromVendorStatus(msg.StatusID)
|
|
||||||
if msg.StatusID == jdapi.OrderStatusAddComment || msg.StatusID == jdapi.OrderStatusModifyComment {
|
if msg.StatusID == jdapi.OrderStatusAddComment || msg.StatusID == jdapi.OrderStatusModifyComment {
|
||||||
if globals.ReallyCallPlatformAPI {
|
if globals.ReallyCallPlatformAPI {
|
||||||
freshfood.FreshFoodAPI.JDOrderComment(msg)
|
freshfood.FreshFoodAPI.JDOrderComment(msg)
|
||||||
@@ -169,6 +171,7 @@ func (c *OrderController) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model
|
|||||||
RefVendorOrderID: msg.BillID,
|
RefVendorOrderID: msg.BillID,
|
||||||
RefVendorID: model.VendorIDJD,
|
RefVendorID: model.VendorIDJD,
|
||||||
VendorStatus: msg.StatusID,
|
VendorStatus: msg.StatusID,
|
||||||
|
Status: c.GetStatusFromVendorStatus(msg.StatusID),
|
||||||
StatusTime: utils.Str2Time(msg.Timestamp),
|
StatusTime: utils.Str2Time(msg.Timestamp),
|
||||||
Remark: msg.Remark,
|
Remark: msg.Remark,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -254,16 +254,29 @@ func (c *OrderController) addOrderStatus(orderStatus *model.OrderStatus, db orm.
|
|||||||
VendorID: orderStatus.VendorID,
|
VendorID: orderStatus.VendorID,
|
||||||
}
|
}
|
||||||
if err = db.ReadForUpdate(order, "VendorOrderID", "VendorID"); err == nil {
|
if err = db.ReadForUpdate(order, "VendorOrderID", "VendorID"); err == nil {
|
||||||
if orderStatus.Status >= order.Status { // todo 要求status不能回绕
|
if (orderStatus.Status == model.OrderStatusUnlocked || orderStatus.Status == model.OrderStatusLocked || orderStatus.Status == model.OrderStatusApplyCancel) ||
|
||||||
order.Status = orderStatus.Status
|
(orderStatus.Status > model.OrderStatusUnknown && orderStatus.Status >= order.Status) { // todo 要求status不能回绕
|
||||||
order.VendorStatus = orderStatus.VendorStatus
|
order.VendorStatus = orderStatus.VendorStatus
|
||||||
order.StatusTime = orderStatus.StatusTime
|
order.StatusTime = orderStatus.StatusTime
|
||||||
order.OrderFinishedAt = orderStatus.StatusTime
|
|
||||||
updateFields := []string{
|
updateFields := []string{
|
||||||
"status", "vendor_status", "status_time",
|
"VendorStatus", "StatusTime",
|
||||||
|
}
|
||||||
|
if orderStatus.Status > model.OrderStatusUnknown {
|
||||||
|
order.LockStatus = model.OrderStatusUnknown
|
||||||
|
order.Status = orderStatus.Status
|
||||||
|
updateFields = append(updateFields, "Status", "LockStatus")
|
||||||
|
} else {
|
||||||
|
if orderStatus.Status == model.OrderStatusUnlocked {
|
||||||
|
order.LockStatus = model.OrderStatusUnknown
|
||||||
|
updateFields = append(updateFields, "LockStatus")
|
||||||
|
} else if orderStatus.Status == model.OrderStatusLocked || orderStatus.Status == model.OrderStatusApplyCancel {
|
||||||
|
order.LockStatus = orderStatus.Status
|
||||||
|
updateFields = append(updateFields, "LockStatus")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if orderStatus.Status >= model.OrderStatusEndBegin {
|
if orderStatus.Status >= model.OrderStatusEndBegin {
|
||||||
updateFields = append(updateFields, "order_finished_at")
|
order.OrderFinishedAt = orderStatus.StatusTime
|
||||||
|
updateFields = append(updateFields, "OrderFinishedAt")
|
||||||
}
|
}
|
||||||
utils.CallFuncLogError(func() error {
|
utils.CallFuncLogError(func() error {
|
||||||
_, err = db.Update(order, updateFields...)
|
_, err = db.Update(order, updateFields...)
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
OrderStatusUnlocked = -25
|
||||||
|
OrderStatusLocked = -20
|
||||||
OrderStatusApplyUrgeOrder = -15
|
OrderStatusApplyUrgeOrder = -15
|
||||||
OrderStatusApplyRefund = -10
|
OrderStatusApplyRefund = -10
|
||||||
OrderStatusApplyCancel = -5
|
OrderStatusApplyCancel = -5
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ func Order2Status(order *GoodsOrder) (retVal *OrderStatus) {
|
|||||||
Status: order.Status,
|
Status: order.Status,
|
||||||
VendorStatus: order.VendorStatus,
|
VendorStatus: order.VendorStatus,
|
||||||
StatusTime: order.StatusTime,
|
StatusTime: order.StatusTime,
|
||||||
|
LockStatus: order.LockStatus,
|
||||||
}
|
}
|
||||||
return retVal
|
return retVal
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ type OrderStatus struct {
|
|||||||
DuplicatedCount int // 收到的重复状态转换(或消息)数,一般是由于重发造成的
|
DuplicatedCount int // 收到的重复状态转换(或消息)数,一般是由于重发造成的
|
||||||
Remark string `orm:"size(255)"`
|
Remark string `orm:"size(255)"`
|
||||||
ModelTimeInfo
|
ModelTimeInfo
|
||||||
|
LockStatus int `orm:"-"` // todo 只是用于传递状态,应该可以优化掉
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *OrderStatus) TableIndex() [][]string {
|
func (v *OrderStatus) TableIndex() [][]string {
|
||||||
|
|||||||
@@ -208,16 +208,21 @@ func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo 这个接口应该可以直接传order的,因为在OrderManager中每次都生成了
|
||||||
func (s *DefScheduler) OnOrderStatusChanged(status *model.OrderStatus, isPending bool) (err error) {
|
func (s *DefScheduler) OnOrderStatusChanged(status *model.OrderStatus, isPending bool) (err error) {
|
||||||
if status.Status > model.OrderStatusUnknown { // 只处理状态转换,一般消息不处理
|
if status.LockStatus != model.OrderStatusUnknown || status.Status > model.OrderStatusUnknown {
|
||||||
globals.SugarLogger.Debugf("OnOrderStatusChanged orderID:%s %s, status:%v", status.VendorOrderID, model.OrderStatusName[status.Status], status)
|
globals.SugarLogger.Debugf("OnOrderStatusChanged orderID:%s %s, status:%v", status.VendorOrderID, model.OrderStatusName[status.Status], status)
|
||||||
savedOrderInfo := s.loadSavedOrderFromMap(status, true)
|
savedOrderInfo := s.loadSavedOrderFromMap(status, true)
|
||||||
s.updateOrderByStatus(savedOrderInfo.order, status)
|
s.updateOrderByStatus(savedOrderInfo.order, status)
|
||||||
|
if status.LockStatus == model.OrderStatusUnknown && status.Status > model.OrderStatusUnknown { // 只处理状态转换,一般消息不处理
|
||||||
s.resetTimer(savedOrderInfo, nil, isPending)
|
s.resetTimer(savedOrderInfo, nil, isPending)
|
||||||
if status.Status >= model.OrderStatusEndBegin {
|
if status.Status >= model.OrderStatusEndBegin {
|
||||||
s.cancelOtherWaybills(savedOrderInfo, nil)
|
s.cancelOtherWaybills(savedOrderInfo, nil)
|
||||||
s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status))
|
s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status))
|
||||||
}
|
}
|
||||||
|
} else if status.LockStatus != model.OrderStatusUnknown {
|
||||||
|
s.stopTimer(savedOrderInfo)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -367,7 +372,7 @@ func (s *DefScheduler) removeWaybillFromMap(savedOrderInfo *WatchOrderInfo, bill
|
|||||||
func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInfo, excludeBill *model.Waybill) (err error) {
|
func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInfo, excludeBill *model.Waybill) (err error) {
|
||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d, excludeBill:%v", order.VendorOrderID, order.Status, excludeBill)
|
globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d, excludeBill:%v", order.VendorOrderID, order.Status, excludeBill)
|
||||||
if order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin { // 订单在配送中被取消时就是配送中状态
|
if order.LockStatus == model.OrderStatusUnknown && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin { // 订单在配送中被取消时就是配送中状态
|
||||||
if savedOrderInfo.isNeed3rdDelivery {
|
if savedOrderInfo.isNeed3rdDelivery {
|
||||||
savedOrderInfo.retryCount++
|
savedOrderInfo.retryCount++
|
||||||
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
|
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
|
||||||
@@ -612,6 +617,7 @@ func (s *DefScheduler) updateOrderByStatus(order *model.GoodsOrder, status *mode
|
|||||||
order.Status = status.Status
|
order.Status = status.Status
|
||||||
order.VendorStatus = status.VendorStatus
|
order.VendorStatus = status.VendorStatus
|
||||||
order.StatusTime = status.StatusTime
|
order.StatusTime = status.StatusTime
|
||||||
|
order.LockStatus = status.LockStatus
|
||||||
return order
|
return order
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) *DeliveryP
|
|||||||
|
|
||||||
func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) {
|
func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) {
|
||||||
globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
|
globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
|
||||||
if order.Status == model.OrderStatusNew {
|
if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusNew {
|
||||||
if c.IsReallyCallPlatformAPI {
|
if c.IsReallyCallPlatformAPI {
|
||||||
err = utils.CallFuncLogErrorWithInfo(func() error {
|
err = utils.CallFuncLogErrorWithInfo(func() error {
|
||||||
return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt)
|
return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt)
|
||||||
@@ -146,7 +146,7 @@ func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt
|
|||||||
}
|
}
|
||||||
func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) {
|
func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) {
|
||||||
globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID)
|
||||||
if order.Status == model.OrderStatusAccepted {
|
if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusAccepted {
|
||||||
if c.IsReallyCallPlatformAPI {
|
if c.IsReallyCallPlatformAPI {
|
||||||
err = utils.CallFuncLogErrorWithInfo(func() error {
|
err = utils.CallFuncLogErrorWithInfo(func() error {
|
||||||
return c.GetPurchasePlatformFromVendorID(order.VendorID).PickupGoods(order)
|
return c.GetPurchasePlatformFromVendorID(order.VendorID).PickupGoods(order)
|
||||||
@@ -160,7 +160,7 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) {
|
|||||||
|
|
||||||
func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) {
|
func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) {
|
||||||
globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID)
|
||||||
if order.Status == model.OrderStatusFinishedPickup {
|
if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup {
|
||||||
if c.IsReallyCallPlatformAPI {
|
if c.IsReallyCallPlatformAPI {
|
||||||
err = utils.CallFuncLogErrorWithInfo(func() error {
|
err = utils.CallFuncLogErrorWithInfo(func() error {
|
||||||
return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDeliver(order)
|
return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDeliver(order)
|
||||||
@@ -174,7 +174,7 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error)
|
|||||||
|
|
||||||
func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) {
|
func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) {
|
||||||
globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID)
|
||||||
if order.Status == model.OrderStatusFinishedPickup {
|
if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup {
|
||||||
if c.IsReallyCallPlatformAPI {
|
if c.IsReallyCallPlatformAPI {
|
||||||
err = utils.CallFuncLogError(func() error {
|
err = utils.CallFuncLogError(func() error {
|
||||||
return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievering(order)
|
return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievering(order)
|
||||||
@@ -190,7 +190,7 @@ func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err err
|
|||||||
|
|
||||||
func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) {
|
func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) {
|
||||||
globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID)
|
||||||
if order.Status == model.OrderStatusFinishedPickup || order.Status == model.OrderStatusDelivering { // todo 饿了么转自送后,不会发送配送中消息,暂时先这样
|
if order.LockStatus == model.OrderStatusUnknown && (order.Status == model.OrderStatusFinishedPickup || order.Status == model.OrderStatusDelivering) { // todo 饿了么转自送后,不会发送配送中消息,暂时先这样
|
||||||
if c.IsReallyCallPlatformAPI {
|
if c.IsReallyCallPlatformAPI {
|
||||||
err = utils.CallFuncLogError(func() error {
|
err = utils.CallFuncLogError(func() error {
|
||||||
return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievered(order)
|
return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievered(order)
|
||||||
|
|||||||
Reference in New Issue
Block a user