- fixed get latest order status bug.
- add GoodsOrder.VendorWaybillID.
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
// 如果运单被取消,则要保持在已拣货状态
|
// 如果运单被取消,则要保持在已拣货状态
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user