- fixed get latest order status bug.

- add GoodsOrder.VendorWaybillID.
This commit is contained in:
gazebo
2018-07-26 09:38:21 +08:00
parent 9a68ad0f39
commit 33fb46040c
5 changed files with 46 additions and 25 deletions

View File

@@ -194,6 +194,19 @@ func (c *OrderController) PickedUpGoods(order *model.GoodsOrder) (err error) {
func (c *OrderController) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { func (c *OrderController) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) {
_, err = api.JdAPI.ModifySellerDelivery(order.VendorOrderID) _, err = api.JdAPI.ModifySellerDelivery(order.VendorOrderID)
if err != nil {
if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 {
globals.SugarLogger.Infof("Swtich2SelfDeliver failed with error:%v try get current status", err)
if order2, err2 := c.GetOrder(order.VendorOrderID); err2 == nil {
var mapData map[string]interface{}
if err2 = utils.UnmarshalUseNumber([]byte(order2.OriginalData), &mapData); err2 == nil {
if utils.Interface2String(mapData["deliveryCarrierNo"]) == "2938" { // 当前已经是自送状态了
err = nil
}
}
}
}
}
return err return err
} }

View File

@@ -120,13 +120,14 @@ func (c *OrderController) saveOrder(order *model.GoodsOrder, isAdjust bool, db o
order.OrderCreatedAt = order.StatusTime order.OrderCreatedAt = order.StatusTime
// hardcode 兼容京东消息错序问题 // hardcode 兼容京东消息错序问题
orderStatus := &model.OrderStatus{ orderStatus := &model.OrderStatus{}
VendorOrderID: order.VendorOrderID, if db.Raw(`
VendorID: order.VendorID, SELECT *
OrderType: model.OrderTypeOrder, FROM order_status
} WHERE order_type = ? AND vendor_order_id = ? AND vendor_id = ?
if db.Read(orderStatus, "VendorOrderID", "VendorID", "OrderType") == nil { ORDER BY status_time DESC
globals.SugarLogger.Debugf("saveOrder orderID:%s get previous status:%d", order.VendorOrderID, orderStatus.Status) LIMIT 1
`, model.OrderTypeOrder, order.VendorOrderID, order.VendorID).QueryRow(orderStatus) == nil {
order.Status = orderStatus.Status order.Status = orderStatus.Status
order.VendorStatus = orderStatus.VendorStatus order.VendorStatus = orderStatus.VendorStatus
order.StatusTime = orderStatus.StatusTime order.StatusTime = orderStatus.StatusTime
@@ -284,6 +285,7 @@ func (c *OrderController) UpdateWaybillVendorID(bill *model.Waybill, revertStatu
globals.SugarLogger.Debugf("UpdateWaybillVendorID bill:%v", bill) globals.SugarLogger.Debugf("UpdateWaybillVendorID bill:%v", bill)
db := orm.NewOrm() db := orm.NewOrm()
params := orm.Params{ params := orm.Params{
"vendor_waybill_id": bill.VendorWaybillID,
"waybill_vendor_id": bill.WaybillVendorID, "waybill_vendor_id": bill.WaybillVendorID,
} }
// 如果运单被取消,则要保持在已拣货状态 // 如果运单被取消,则要保持在已拣货状态

View File

@@ -237,7 +237,7 @@ func (c *OrderController) legacyJxOrderStatusChanged(status *model.OrderStatus,
updateFields = append(updateFields, "DeliveryFinishTime") updateFields = append(updateFields, "DeliveryFinishTime")
} }
_, err = db.Update(jxorder, updateFields...) _, err = db.Update(jxorder, updateFields...)
if orderStatus == JX_ORDER_STATUS_DELIVERY_DONE { if orderStatus == JX_ORDER_STATUS_DELIVERY_DONE || orderStatus == JX_ORDER_STATUS_DELIVERING {
db.Raw(` db.Raw(`
UPDATE `+globals.JxorderTableName+` t1 UPDATE `+globals.JxorderTableName+` t1
JOIN waybill t2 ON t2.vendor_order_id = t1.order_id AND t2.status = 105 JOIN waybill t2 ON t2.vendor_order_id = t1.order_id AND t2.status = 105

View File

@@ -37,6 +37,7 @@ type GoodsOrder struct {
BusinessType int BusinessType int
ExpectedDeliveredTime time.Time `orm:"type(datetime)"` // 预期送达时间 ExpectedDeliveredTime time.Time `orm:"type(datetime)"` // 预期送达时间
CancelApplyReason string `orm:"size(255)"` // ""表示没有申请不为null表示用户正在取消申请 CancelApplyReason string `orm:"size(255)"` // ""表示没有申请不为null表示用户正在取消申请
VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)"`
WaybillVendorID int `orm:"column(waybill_vendor_id)"` // 表示当前承运商,-1表示还没有安排 WaybillVendorID int `orm:"column(waybill_vendor_id)"` // 表示当前承运商,-1表示还没有安排
DuplicatedCount int // 重复新订单消息数这个一般不是由于消息重发造成的消息重发由OrderStatus过滤一般是业务逻辑造成的 DuplicatedCount int // 重复新订单消息数这个一般不是由于消息重发造成的消息重发由OrderStatus过滤一般是业务逻辑造成的
OrderCreatedAt time.Time `orm:"type(datetime);index"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间) OrderCreatedAt time.Time `orm:"type(datetime);index"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间)

View File

@@ -143,11 +143,11 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
} }
if bill.Status == model.WaybillStatusNew { if bill.Status == model.WaybillStatusNew {
s.addWaybill2Map(savedOrderInfo, bill) s.addWaybill2Map(savedOrderInfo, bill)
if order.WaybillVendorID != model.VendorIDUnknown && order.WaybillVendorID != bill.WaybillVendorID { if order.WaybillVendorID != model.VendorIDUnknown {
globals.SugarLogger.Infof("OnWaybillStatusChanged multiple waybill created, bill:%v", bill) globals.SugarLogger.Debugf("OnWaybillStatusChanged multiple waybill created, bill:%v", bill)
if bill.WaybillVendorID != bill.WaybillVendorID { if !(order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID) && bill.WaybillVendorID != order.VendorID {
s.CancelWaybill(bill) s.CancelWaybill(bill)
} else { } else if bill.WaybillVendorID == order.VendorID {
globals.SugarLogger.Warnf("OnWaybillStatusChanged bill:%v purchase platform bill came later than others, strange!!!", bill) globals.SugarLogger.Warnf("OnWaybillStatusChanged bill:%v purchase platform bill came later than others, strange!!!", bill)
} }
} }
@@ -164,7 +164,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
} }
s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false) s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false)
case model.WaybillStatusAcceptCanceled: case model.WaybillStatusAcceptCanceled:
if order.WaybillVendorID == bill.WaybillVendorID { if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID {
bill.WaybillVendorID = model.VendorIDUnknown bill.WaybillVendorID = model.VendorIDUnknown
s.updateOrderByBill(order, bill, false) s.updateOrderByBill(order, bill, false)
@@ -175,14 +175,15 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
globals.SugarLogger.Warnf("OnWaybillStatusChanged AcceptCanceled orderID:%s got multiple bill:%v, order details:%v", order.VendorOrderID, bill, order) globals.SugarLogger.Warnf("OnWaybillStatusChanged AcceptCanceled orderID:%s got multiple bill:%v, order details:%v", order.VendorOrderID, bill, order)
} }
case model.WaybillStatusCourierArrived: // do nothing case model.WaybillStatusCourierArrived: // do nothing
if order.WaybillVendorID == bill.WaybillVendorID { if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID {
} else { } else {
// s.CancelWaybill(bill)
globals.SugarLogger.Warnf("OnWaybillStatusChanged CourierArrived bill:%v shouldn't got here", bill) globals.SugarLogger.Warnf("OnWaybillStatusChanged CourierArrived bill:%v shouldn't got here", bill)
} }
s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false) s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false)
case model.WaybillStatusFailed: // todo WaybillStatusFailed理解成订单整个失败了不需要再尝试创建运单了注意这里应该加个zabbix日志的报警 case model.WaybillStatusFailed: // todo WaybillStatusFailed理解成订单整个失败了不需要再尝试创建运单了注意这里应该加个zabbix日志的报警
s.removeWaybillFromMap(savedOrderInfo, bill) s.removeWaybillFromMap(savedOrderInfo, bill)
if order.WaybillVendorID == bill.WaybillVendorID { if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID {
globals.SugarLogger.Infof("OnWaybillStatusChanged WaybillStatusFailed, bill:%v", bill) globals.SugarLogger.Infof("OnWaybillStatusChanged WaybillStatusFailed, bill:%v", bill)
if order.WaybillVendorID == bill.WaybillVendorID { if order.WaybillVendorID == bill.WaybillVendorID {
bill.WaybillVendorID = model.VendorIDUnknown bill.WaybillVendorID = model.VendorIDUnknown
@@ -194,7 +195,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
} }
case model.WaybillStatusCanceled: case model.WaybillStatusCanceled:
s.removeWaybillFromMap(savedOrderInfo, bill) s.removeWaybillFromMap(savedOrderInfo, bill)
if order.WaybillVendorID == bill.WaybillVendorID { if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID {
bill.WaybillVendorID = model.VendorIDUnknown bill.WaybillVendorID = model.VendorIDUnknown
s.updateOrderByBill(order, bill, true) s.updateOrderByBill(order, bill, true)
@@ -207,17 +208,18 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false) s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false)
} }
case model.WaybillStatusDelivering: case model.WaybillStatusDelivering:
if order.WaybillVendorID == bill.WaybillVendorID { if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID {
if order.VendorID != bill.WaybillVendorID { if order.VendorID != bill.WaybillVendorID {
s.SelfDeliverDelievering(order) s.SelfDeliverDelievering(order)
} }
} else { } else {
// s.CancelWaybill(bill)
globals.SugarLogger.Warnf("OnWaybillStatusChanged Delivering bill:%v shouldn't got here", bill) globals.SugarLogger.Warnf("OnWaybillStatusChanged Delivering bill:%v shouldn't got here", bill)
} }
s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false) s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false)
case model.WaybillStatusDelivered: case model.WaybillStatusDelivered:
s.removeWaybillFromMap(savedOrderInfo, bill) s.removeWaybillFromMap(savedOrderInfo, bill)
if order.WaybillVendorID == bill.WaybillVendorID { if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID {
if order.VendorID != bill.WaybillVendorID { if order.VendorID != bill.WaybillVendorID {
s.SelfDeliverDelievered(order) s.SelfDeliverDelievered(order)
} }
@@ -276,15 +278,15 @@ func (s *DefScheduler) createWaybillOn3rdProviders(order *model.GoodsOrder, excl
return nil return nil
} }
func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill) (err error) {
globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill) globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep)
for _, v := range savedOrderInfo.waybills { for _, v := range savedOrderInfo.waybills {
if (v.OrderVendorID != v.WaybillVendorID) && (bill == nil || !(v.WaybillVendorID == bill.WaybillVendorID && v.VendorWaybillID == bill.VendorWaybillID)) { if (v.OrderVendorID != v.WaybillVendorID) && (bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) {
s.CancelWaybill(v) s.CancelWaybill(v)
} }
} }
if bill != nil && bill.WaybillVendorID != bill.OrderVendorID { if bill2Keep != nil && bill2Keep.WaybillVendorID != bill2Keep.OrderVendorID {
s.swtich2SelfDeliverWithRetry(savedOrderInfo.order, bill, 2, 10*time.Second) s.swtich2SelfDeliverWithRetry(savedOrderInfo.order, bill2Keep, 2, 10*time.Second)
} }
return nil return nil
} }
@@ -469,6 +471,9 @@ func (s *DefScheduler) isOrderSupport3rdDelivery(order *model.GoodsOrder) (retVa
} }
func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Waybill, revertStatus bool) { func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Waybill, revertStatus bool) {
if bill.WaybillVendorID == model.VendorIDUnknown {
bill.VendorWaybillID = ""
}
s.CurOrderManager.UpdateWaybillVendorID(bill, revertStatus) s.CurOrderManager.UpdateWaybillVendorID(bill, revertStatus)
order.WaybillVendorID = bill.WaybillVendorID order.WaybillVendorID = bill.WaybillVendorID
if revertStatus { if revertStatus {