- 防止运单事件反绕,导致连续的取消运单失败,比如运单(282585256173066)

This commit is contained in:
gazebo
2019-05-22 14:52:36 +08:00
parent 4ae02a5eb2
commit 132e6a9fd7

View File

@@ -92,8 +92,12 @@ func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
panic(r) panic(r)
} }
}() }()
duplicatedCount := 0
if bill.Status == model.WaybillStatusNew { if bill.Status == model.WaybillStatusNew {
isDuplicated, err = w.onWaybillNew(bill, db) isDuplicated, err = w.onWaybillNew(bill, db)
if isDuplicated {
duplicatedCount = 1
}
} else { } else {
if bill.Status == model.WaybillStatusAccepted { // 处理美团配送丢失新运单消息的情况 if bill.Status == model.WaybillStatusAccepted { // 处理美团配送丢失新运单消息的情况
if _, err2 := w.LoadWaybill(bill.VendorWaybillID, bill.WaybillVendorID); err2 != nil { if _, err2 := w.LoadWaybill(bill.VendorWaybillID, bill.WaybillVendorID); err2 != nil {
@@ -126,11 +130,14 @@ func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
} else if bill.Status >= model.WaybillStatusEndBegin { } else if bill.Status >= model.WaybillStatusEndBegin {
addParams["waybill_finished_at"] = bill.StatusTime addParams["waybill_finished_at"] = bill.StatusTime
} }
isDuplicated, err = w.addWaybillStatus(bill, db, addParams) duplicatedCount, err = w.addWaybillStatus(bill, db, addParams)
if err != nil {
return err
}
} }
if err == nil { if err == nil {
dao.Commit(db) dao.Commit(db)
if !isDuplicated { if duplicatedCount == 0 {
scheduler.CurrentScheduler.OnWaybillStatusChanged(bill, false) scheduler.CurrentScheduler.OnWaybillStatusChanged(bill, false)
} }
} else { } else {
@@ -155,21 +162,27 @@ func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
return err return err
} }
func (w *OrderManager) addWaybillStatus(bill *model.Waybill, db *dao.DaoDB, addParams orm.Params) (isDuplicated bool, err error) { func (w *OrderManager) addWaybillStatus(bill *model.Waybill, db *dao.DaoDB, addParams orm.Params) (duplicatedCount int, err error) {
waybillStatus := model.Waybill2Status(bill) waybillStatus := model.Waybill2Status(bill)
isDuplicated, err = addOrderOrWaybillStatus(waybillStatus, db) isDuplicated, err := addOrderOrWaybillStatus(waybillStatus, db)
if err == nil && !isDuplicated && waybillStatus.Status > model.WaybillStatusUnknown { // todo 这里应该和addOrderStatus一样的改法状态不能回绕 if err == nil && !isDuplicated {
params := utils.MergeMaps(orm.Params{ if waybillStatus.Status > model.WaybillStatusUnknown { // todo 这里应该和addOrderStatus一样的改法状态不能回绕
"status": bill.Status, params := utils.MergeMaps(orm.Params{
"vendor_status": bill.VendorStatus, "status": bill.Status,
"status_time": bill.StatusTime, "vendor_status": bill.VendorStatus,
}, addParams) "status_time": bill.StatusTime,
utils.CallFuncLogError(func() error { }, addParams)
_, err = db.Db.QueryTable("waybill").Filter("vendor_waybill_id", bill.VendorWaybillID).Filter("waybill_vendor_id", bill.WaybillVendorID).Filter("status__lte", bill.Status).Update(params) utils.CallFuncLogError(func() error {
return err _, err = db.Db.QueryTable("waybill").Filter("vendor_waybill_id", bill.VendorWaybillID).Filter("waybill_vendor_id", bill.WaybillVendorID).Filter("status__lte", bill.Status).Update(params)
}, "addWaybillStatus update waybill status, bill:%v", bill) return err
}, "addWaybillStatus update waybill status, bill:%v", bill)
} else {
duplicatedCount = -1
}
} else {
duplicatedCount = 1
} }
return isDuplicated, err return duplicatedCount, err
} }
func (c *OrderManager) LoadWaybill(vendorWaybillID string, waybillVendorID int) (bill *model.Waybill, err error) { func (c *OrderManager) LoadWaybill(vendorWaybillID string, waybillVendorID int) (bill *model.Waybill, err error) {