From 33fb46040c781ec97a6170ebdc5aa9f65e103909 Mon Sep 17 00:00:00 2001 From: gazebo Date: Thu, 26 Jul 2018 09:38:21 +0800 Subject: [PATCH] - fixed get latest order status bug. - add GoodsOrder.VendorWaybillID. --- business/controller/jd/order.go | 13 +++++++++++ business/controller/order.go | 16 +++++++------ business/controller/order_legacy.go | 2 +- business/model/order.go | 5 +++-- business/scheduler/defsch/defsch.go | 35 ++++++++++++++++------------- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/business/controller/jd/order.go b/business/controller/jd/order.go index b0ecfe0c4..0c16503a8 100644 --- a/business/controller/jd/order.go +++ b/business/controller/jd/order.go @@ -194,6 +194,19 @@ func (c *OrderController) PickedUpGoods(order *model.GoodsOrder) (err error) { func (c *OrderController) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { _, 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 } diff --git a/business/controller/order.go b/business/controller/order.go index 522949470..c86267b69 100644 --- a/business/controller/order.go +++ b/business/controller/order.go @@ -120,13 +120,14 @@ func (c *OrderController) saveOrder(order *model.GoodsOrder, isAdjust bool, db o order.OrderCreatedAt = order.StatusTime // hardcode 兼容京东消息错序问题 - orderStatus := &model.OrderStatus{ - VendorOrderID: order.VendorOrderID, - VendorID: order.VendorID, - OrderType: model.OrderTypeOrder, - } - if db.Read(orderStatus, "VendorOrderID", "VendorID", "OrderType") == nil { - globals.SugarLogger.Debugf("saveOrder orderID:%s get previous status:%d", order.VendorOrderID, orderStatus.Status) + orderStatus := &model.OrderStatus{} + if db.Raw(` + SELECT * + FROM order_status + WHERE order_type = ? AND vendor_order_id = ? AND vendor_id = ? + ORDER BY status_time DESC + LIMIT 1 + `, model.OrderTypeOrder, order.VendorOrderID, order.VendorID).QueryRow(orderStatus) == nil { order.Status = orderStatus.Status order.VendorStatus = orderStatus.VendorStatus order.StatusTime = orderStatus.StatusTime @@ -284,6 +285,7 @@ func (c *OrderController) UpdateWaybillVendorID(bill *model.Waybill, revertStatu globals.SugarLogger.Debugf("UpdateWaybillVendorID bill:%v", bill) db := orm.NewOrm() params := orm.Params{ + "vendor_waybill_id": bill.VendorWaybillID, "waybill_vendor_id": bill.WaybillVendorID, } // 如果运单被取消,则要保持在已拣货状态 diff --git a/business/controller/order_legacy.go b/business/controller/order_legacy.go index 9ce477877..3937732f1 100644 --- a/business/controller/order_legacy.go +++ b/business/controller/order_legacy.go @@ -237,7 +237,7 @@ func (c *OrderController) legacyJxOrderStatusChanged(status *model.OrderStatus, updateFields = append(updateFields, "DeliveryFinishTime") } _, 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(` UPDATE `+globals.JxorderTableName+` t1 JOIN waybill t2 ON t2.vendor_order_id = t1.order_id AND t2.status = 105 diff --git a/business/model/order.go b/business/model/order.go index 0d47887bd..434d3fb31 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -35,8 +35,9 @@ type GoodsOrder struct { OrderSeq int // 门店订单序号 BuyerComment string `orm:"size(255)"` BusinessType int - ExpectedDeliveredTime time.Time `orm:"type(datetime)"` // 预期送达时间 - CancelApplyReason string `orm:"size(255)"` // ""表示没有申请,不为null表示用户正在取消申请 + ExpectedDeliveredTime time.Time `orm:"type(datetime)"` // 预期送达时间 + CancelApplyReason string `orm:"size(255)"` // ""表示没有申请,不为null表示用户正在取消申请 + VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)"` WaybillVendorID int `orm:"column(waybill_vendor_id)"` // 表示当前承运商,-1表示还没有安排 DuplicatedCount int // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的 OrderCreatedAt time.Time `orm:"type(datetime);index"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间) diff --git a/business/scheduler/defsch/defsch.go b/business/scheduler/defsch/defsch.go index 834bbdfe9..19b3f3511 100644 --- a/business/scheduler/defsch/defsch.go +++ b/business/scheduler/defsch/defsch.go @@ -143,11 +143,11 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } if bill.Status == model.WaybillStatusNew { s.addWaybill2Map(savedOrderInfo, bill) - if order.WaybillVendorID != model.VendorIDUnknown && order.WaybillVendorID != bill.WaybillVendorID { - globals.SugarLogger.Infof("OnWaybillStatusChanged multiple waybill created, bill:%v", bill) - if bill.WaybillVendorID != bill.WaybillVendorID { + if order.WaybillVendorID != model.VendorIDUnknown { + globals.SugarLogger.Debugf("OnWaybillStatusChanged multiple waybill created, bill:%v", bill) + if !(order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID) && bill.WaybillVendorID != order.VendorID { 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) } } @@ -164,7 +164,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false) case model.WaybillStatusAcceptCanceled: - if order.WaybillVendorID == bill.WaybillVendorID { + if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID { bill.WaybillVendorID = model.VendorIDUnknown 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) } case model.WaybillStatusCourierArrived: // do nothing - if order.WaybillVendorID == bill.WaybillVendorID { + if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID { } else { + // s.CancelWaybill(bill) globals.SugarLogger.Warnf("OnWaybillStatusChanged CourierArrived bill:%v shouldn't got here", bill) } s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false) case model.WaybillStatusFailed: // todo WaybillStatusFailed理解成订单整个失败了,不需要再尝试创建运单了,注意这里应该加个zabbix日志的报警 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) if order.WaybillVendorID == bill.WaybillVendorID { bill.WaybillVendorID = model.VendorIDUnknown @@ -194,7 +195,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } case model.WaybillStatusCanceled: s.removeWaybillFromMap(savedOrderInfo, bill) - if order.WaybillVendorID == bill.WaybillVendorID { + if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID { bill.WaybillVendorID = model.VendorIDUnknown 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) } case model.WaybillStatusDelivering: - if order.WaybillVendorID == bill.WaybillVendorID { + if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID { if order.VendorID != bill.WaybillVendorID { s.SelfDeliverDelievering(order) } } else { + // s.CancelWaybill(bill) globals.SugarLogger.Warnf("OnWaybillStatusChanged Delivering bill:%v shouldn't got here", bill) } s.resetTimer(savedOrderInfo, scheduler.TimerStatusTypeWaybill, bill.Status, false) case model.WaybillStatusDelivered: s.removeWaybillFromMap(savedOrderInfo, bill) - if order.WaybillVendorID == bill.WaybillVendorID { + if order.WaybillVendorID == bill.WaybillVendorID && order.VendorWaybillID == bill.VendorWaybillID { if order.VendorID != bill.WaybillVendorID { s.SelfDeliverDelievered(order) } @@ -276,15 +278,15 @@ func (s *DefScheduler) createWaybillOn3rdProviders(order *model.GoodsOrder, excl return nil } -func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { - globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill) +func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill) (err error) { + globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep) 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) } } - if bill != nil && bill.WaybillVendorID != bill.OrderVendorID { - s.swtich2SelfDeliverWithRetry(savedOrderInfo.order, bill, 2, 10*time.Second) + if bill2Keep != nil && bill2Keep.WaybillVendorID != bill2Keep.OrderVendorID { + s.swtich2SelfDeliverWithRetry(savedOrderInfo.order, bill2Keep, 2, 10*time.Second) } 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) { + if bill.WaybillVendorID == model.VendorIDUnknown { + bill.VendorWaybillID = "" + } s.CurOrderManager.UpdateWaybillVendorID(bill, revertStatus) order.WaybillVendorID = bill.WaybillVendorID if revertStatus {