- cancel waybill reason added.

- api operator added.
- token added.
This commit is contained in:
gazebo
2018-08-22 16:06:47 +08:00
parent 5afe95d422
commit 79ed0a7929
9 changed files with 122 additions and 93 deletions

View File

@@ -61,12 +61,12 @@ func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) *scheduler
return c.DeliveryPlatformHandlers[vendorID] return c.DeliveryPlatformHandlers[vendorID]
} }
func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (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.LockStatus == model.OrderStatusUnknown && 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, userName)
}, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) }, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
} }
} else { } else {
@@ -75,12 +75,12 @@ func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt
return err return err
} }
func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder, userName string) (err error) {
globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID) globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID)
if order.LockStatus == model.OrderStatusUnknown && 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, userName)
}, "PickupGoods orderID:%s", order.VendorOrderID) }, "PickupGoods orderID:%s", order.VendorOrderID)
} }
} else { } else {
@@ -92,12 +92,12 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) {
return err return err
} }
func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) {
globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID) globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID)
if order.LockStatus == model.OrderStatusUnknown && 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, userName)
}, "Swtich2SelfDeliver orderID:%s", order.VendorOrderID) }, "Swtich2SelfDeliver orderID:%s", order.VendorOrderID)
if err == nil { // 因为有些平台转自送后,不会再发送订单在配送中消息过来,所以成功后就强制设置状态为配送中 if err == nil { // 因为有些平台转自送后,不会再发送订单在配送中消息过来,所以成功后就强制设置状态为配送中
order.Status = model.OrderStatusDelivering order.Status = model.OrderStatusDelivering
@@ -112,12 +112,12 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error)
return err return err
} }
func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) {
globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s", order.VendorOrderID) globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s", order.VendorOrderID)
if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering {
if c.IsReallyCallPlatformAPI { if c.IsReallyCallPlatformAPI {
err = utils.CallFuncLogError(func() error { err = utils.CallFuncLogError(func() error {
return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDelivered(order) return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDelivered(order, userName)
}, "Swtich2SelfDelivered orderID:%s", order.VendorOrderID) }, "Swtich2SelfDelivered orderID:%s", order.VendorOrderID)
} }
} else { } else {
@@ -126,12 +126,12 @@ func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error
return err return err
} }
func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder, userName string) (err error) {
globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID) globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID)
if order.LockStatus == model.OrderStatusUnknown && 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, userName)
}, "SelfDeliverDelievering orderID:%s", order.VendorOrderID) }, "SelfDeliverDelievering orderID:%s", order.VendorOrderID)
if err == nil { // 因为有些平台设置配送中后,不会发送订单在配送中消息过来,所以成功后就强制设置状态为配送中 if err == nil { // 因为有些平台设置配送中后,不会发送订单在配送中消息过来,所以成功后就强制设置状态为配送中
order.Status = model.OrderStatusDelivering order.Status = model.OrderStatusDelivering
@@ -145,12 +145,12 @@ func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err err
return err return err
} }
func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error) {
globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID) globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID)
if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering {
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, userName)
}, "SelfDeliverDelievered orderID:%s", order.VendorOrderID) }, "SelfDeliverDelievered orderID:%s", order.VendorOrderID)
} }
} else { } else {
@@ -179,12 +179,12 @@ func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOr
return bill, err return bill, err
} }
func (c *BaseScheduler) CancelWaybill(bill *model.Waybill) (err error) { func (c *BaseScheduler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
globals.SugarLogger.Infof("CancelWaybill bill:%v", bill) globals.SugarLogger.Infof("CancelWaybill bill:%v, cancelReasonID:%d cancelReason:%s", bill, cancelReasonID, cancelReason)
if c.IsReallyCallPlatformAPI && bill.OrderVendorID != bill.WaybillVendorID { if c.IsReallyCallPlatformAPI && bill.OrderVendorID != bill.WaybillVendorID {
if handlerInfo := c.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID); handlerInfo != nil { if handlerInfo := c.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID); handlerInfo != nil {
err = utils.CallFuncLogError(func() error { err = utils.CallFuncLogError(func() error {
return handlerInfo.Handler.CancelWaybill(bill) return handlerInfo.Handler.CancelWaybill(bill, cancelReasonID, cancelReason)
}, "CancelWaybill bill:%v", bill) }, "CancelWaybill bill:%v", bill)
globals.SugarLogger.Debugf("CancelWaybill bill:%v canceled by myself", bill) globals.SugarLogger.Debugf("CancelWaybill bill:%v canceled by myself", bill)
} }

View File

@@ -18,10 +18,10 @@ func (c *BaseScheduler) CreateWaybillOnProviders(vendorOrderID string, vendorID
return nil, err return nil, err
} }
func (c *BaseScheduler) Swtich2SelfDeliverAndUpdateStatus(vendorOrderID string, vendorID int) (err error) { func (c *BaseScheduler) Swtich2SelfDeliverAndUpdateStatus(vendorOrderID string, vendorID int, userName string) (err error) {
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
if err == nil { if err == nil {
err = c.Swtich2SelfDeliver(order) err = c.Swtich2SelfDeliver(order, userName)
if err == nil { if err == nil {
order.Status = model.OrderStatusDelivering order.Status = model.OrderStatusDelivering
err = partner.CurOrderManager.UpdateOrderStatusDirectly(order) err = partner.CurOrderManager.UpdateOrderStatusDirectly(order)
@@ -30,10 +30,10 @@ func (c *BaseScheduler) Swtich2SelfDeliverAndUpdateStatus(vendorOrderID string,
return err return err
} }
func (c *BaseScheduler) PickupGoodsAndUpdateStatus(vendorOrderID string, vendorID int) (err error) { func (c *BaseScheduler) PickupGoodsAndUpdateStatus(vendorOrderID string, vendorID int, userName string) (err error) {
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
if err == nil { if err == nil {
err = c.PickupGoods(order) err = c.PickupGoods(order, userName)
if err == nil { if err == nil {
order.Status = model.OrderStatusFinishedPickup order.Status = model.OrderStatusFinishedPickup
err = partner.CurOrderManager.UpdateOrderStatusDirectly(order) err = partner.CurOrderManager.UpdateOrderStatusDirectly(order)

View File

@@ -152,7 +152,7 @@ func init() {
TimeoutAction: func(savedOrderInfo *WatchOrderInfo) (err error) { TimeoutAction: func(savedOrderInfo *WatchOrderInfo) (err error) {
order := savedOrderInfo.order order := savedOrderInfo.order
_ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, jxutils.GetJxStoreIDFromOrder(order), nil, func(isAcceptIt bool) error { _ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, jxutils.GetJxStoreIDFromOrder(order), nil, func(isAcceptIt bool) error {
if err = sch.AcceptOrRefuseOrder(order, isAcceptIt); err != nil { if err = sch.AcceptOrRefuseOrder(order, isAcceptIt, ""); err != nil {
// 为了解决京东新消息与接单消息乱序的问题 // 为了解决京东新消息与接单消息乱序的问题
if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 { if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 {
if order2, err2 := sch.GetPurchasePlatformFromVendorID(order.VendorID).GetOrder(order.VendorOrderID); err2 == nil && order2.Status > order.Status { if order2, err2 := sch.GetPurchasePlatformFromVendorID(order.VendorID).GetOrder(order.VendorOrderID); err2 == nil && order2.Status > order.Status {
@@ -238,7 +238,7 @@ func (s *DefScheduler) OnOrderStatusChanged(status *model.OrderStatus, isPending
globals.SugarLogger.Infof("OnOrderStatusChanged [运营2]订单orderID:%s可能被手动点击送达会对程序状态产生不利影响请通知门店不要这样操作", status.VendorOrderID) globals.SugarLogger.Infof("OnOrderStatusChanged [运营2]订单orderID:%s可能被手动点击送达会对程序状态产生不利影响请通知门店不要这样操作", status.VendorOrderID)
} }
} }
s.cancelOtherWaybills(savedOrderInfo, curWaybill) s.cancelOtherWaybills(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished)
s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status)) s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status))
} }
} else if status.LockStatus != model.OrderStatusUnknown { } else if status.LockStatus != model.OrderStatusUnknown {
@@ -266,11 +266,11 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
s.addWaybill2Map(savedOrderInfo, bill) s.addWaybill2Map(savedOrderInfo, bill)
if !isPending { if !isPending {
if order.Status > model.OrderStatusEndBegin { if order.Status > model.OrderStatusEndBegin {
s.CancelWaybill(bill) s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
} else if order.WaybillVendorID != model.VendorIDUnknown { } else if order.WaybillVendorID != model.VendorIDUnknown {
globals.SugarLogger.Debugf("OnWaybillStatusChanged multiple waybill created, bill:%v", bill) globals.SugarLogger.Debugf("OnWaybillStatusChanged multiple waybill created, bill:%v", bill)
if !s.isBillCandidate(order, bill) && bill.WaybillVendorID != order.VendorID { if !s.isBillCandidate(order, bill) && bill.WaybillVendorID != order.VendorID {
s.CancelWaybill(bill) s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
} else if bill.WaybillVendorID == order.VendorID && order.WaybillVendorID != order.VendorID { } else if bill.WaybillVendorID == order.VendorID && order.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)
} }
@@ -293,10 +293,10 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
globals.SugarLogger.Infof("OnWaybillStatusChanged orderID:%s purchase platform waybill arrvied later, may case problem", order.VendorOrderID) globals.SugarLogger.Infof("OnWaybillStatusChanged orderID:%s purchase platform waybill arrvied later, may case problem", order.VendorOrderID)
} }
s.updateOrderByBill(order, bill, false) s.updateOrderByBill(order, bill, false)
s.cancelOtherWaybills(savedOrderInfo, bill) s.cancelOtherWaybills(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
if bill.WaybillVendorID != bill.OrderVendorID { if bill.WaybillVendorID != bill.OrderVendorID {
if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore { if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore {
s.SelfDeliverDelievering(savedOrderInfo.order) s.SelfDeliverDelievering(savedOrderInfo.order, "")
} else { } else {
s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second) s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second)
} }
@@ -306,7 +306,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
} }
} else if !s.isBillCandidate(order, bill) && bill.WaybillVendorID != order.VendorID { } else if !s.isBillCandidate(order, bill) && bill.WaybillVendorID != order.VendorID {
// 发生这种情况的原因就是两个接单事件几乎同时到达(来不及取消),也算正常 // 发生这种情况的原因就是两个接单事件几乎同时到达(来不及取消),也算正常
s.CancelWaybill(bill) s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
globals.SugarLogger.Infof("OnWaybillStatusChanged Accepted orderID:%s got multiple bill:%v", order.VendorOrderID, bill) globals.SugarLogger.Infof("OnWaybillStatusChanged Accepted orderID:%s got multiple bill:%v", order.VendorOrderID, bill)
} }
} }
@@ -320,14 +320,14 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
s.createWaybillOn3rdProviders(savedOrderInfo, bill) s.createWaybillOn3rdProviders(savedOrderInfo, bill)
} }
} else if order.WaybillVendorID != model.VendorIDUnknown { } else if order.WaybillVendorID != model.VendorIDUnknown {
s.CancelWaybill(bill) s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
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
s.resetTimer(savedOrderInfo, bill, isPending) s.resetTimer(savedOrderInfo, bill, isPending)
if s.isBillCandidate(order, bill) { if s.isBillCandidate(order, bill) {
} else { } else {
// s.CancelWaybill(bill) // s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
globals.SugarLogger.Infof("OnWaybillStatusChanged CourierArrived order(%d, %s) bill(%d, %s), bill:%v shouldn't get here", order.WaybillVendorID, order.VendorWaybillID, bill.WaybillVendorID, bill.VendorWaybillID, bill) globals.SugarLogger.Infof("OnWaybillStatusChanged CourierArrived order(%d, %s) bill(%d, %s), bill:%v shouldn't get here", order.WaybillVendorID, order.VendorWaybillID, bill.WaybillVendorID, bill.VendorWaybillID, bill)
} }
case model.WaybillStatusFailed: // todo WaybillStatusFailed理解成订单整个失败了不需要再尝试创建运单了注意这里应该加个zabbix日志的报警 case model.WaybillStatusFailed: // todo WaybillStatusFailed理解成订单整个失败了不需要再尝试创建运单了注意这里应该加个zabbix日志的报警
@@ -362,7 +362,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
if s.isBillCandidate(order, bill) { if s.isBillCandidate(order, bill) {
// do nothing // do nothing
} else { } else {
// s.CancelWaybill(bill) // s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
globals.SugarLogger.Infof("OnWaybillStatusChanged Delivering order(%d, %s) bill(%d, %s), bill:%v shouldn't get here", order.WaybillVendorID, order.VendorWaybillID, bill.WaybillVendorID, bill.VendorWaybillID, bill) globals.SugarLogger.Infof("OnWaybillStatusChanged Delivering order(%d, %s) bill(%d, %s), bill:%v shouldn't get here", order.WaybillVendorID, order.VendorWaybillID, bill.WaybillVendorID, bill.VendorWaybillID, bill)
} }
case model.WaybillStatusDelivered: case model.WaybillStatusDelivered:
@@ -370,9 +370,9 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
s.removeWaybillFromMap(savedOrderInfo, bill) s.removeWaybillFromMap(savedOrderInfo, bill)
if order.VendorID != bill.WaybillVendorID && !isPending { if order.VendorID != bill.WaybillVendorID && !isPending {
if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore { if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore {
s.SelfDeliverDelievered(order) s.SelfDeliverDelievered(order, "")
} else { } else {
s.Swtich2SelfDelivered(order) s.Swtich2SelfDelivered(order, "")
} }
} }
if !s.isBillCandidate(order, bill) { if !s.isBillCandidate(order, bill) {
@@ -464,11 +464,11 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
return err return err
} }
func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill) (err error) { func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep) 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) && (bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) { if (v.OrderVendorID != v.WaybillVendorID) && (bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) {
s.CancelWaybill(v) s.CancelWaybill(v, cancelReasonID, cancelReason)
} }
} }
return nil return nil
@@ -478,7 +478,7 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf
order := savedOrderInfo.order order := savedOrderInfo.order
globals.SugarLogger.Debugf("swtich2SelfDeliverWithRetry orderID:%s", order.VendorOrderID) globals.SugarLogger.Debugf("swtich2SelfDeliverWithRetry orderID:%s", order.VendorOrderID)
if order.WaybillVendorID != order.VendorID { if order.WaybillVendorID != order.VendorID {
if err := s.Swtich2SelfDeliver(order); err != nil { if err := s.Swtich2SelfDeliver(order, ""); err != nil {
globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err) globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err)
if retryCount > 0 { if retryCount > 0 {
time.AfterFunc(duration, func() { time.AfterFunc(duration, func() {
@@ -497,7 +497,7 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf
db := orm.NewOrm() db := orm.NewOrm()
db.Insert(tmpLog) db.Insert(tmpLog)
if s.CancelWaybill(bill) == nil { if s.CancelWaybill(bill, partner.CancelWaybillReasonSwitch2SelfFailed, partner.CancelWaybillReasonStrSwitch2SelfFailed) == nil {
// 转自送失败的取消,要将订单中的运单状态更新 // 转自送失败的取消,要将订单中的运单状态更新
if s.isBillCandidate(order, bill) { if s.isBillCandidate(order, bill) {
bill.WaybillVendorID = model.VendorIDUnknown bill.WaybillVendorID = model.VendorIDUnknown
@@ -697,7 +697,7 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa
} }
func (s *DefScheduler) autoPickupGood(order *model.GoodsOrder) (err error) { func (s *DefScheduler) autoPickupGood(order *model.GoodsOrder) (err error) {
return s.PickupGoods(order) return s.PickupGoods(order, "")
} }
func (s *DefScheduler) isBillCandidate(order *model.GoodsOrder, bill *model.Waybill) bool { func (s *DefScheduler) isBillCandidate(order *model.GoodsOrder, bill *model.Waybill) bool {

View File

@@ -148,17 +148,16 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del
return bill, err return bill, err
} }
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill) (err error) { func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
reasonID := dadaapi.ReasonIDOther switch cancelReasonID {
reasonMsg := "send not in time" case partner.CancelWaybillReasonNotAcceptIntime:
if bill.Status < model.WaybillStatusAccepted { cancelReasonID = dadaapi.ReasonIDNobodyAccept
reasonID = dadaapi.ReasonIDNobodyAccept case partner.CancelWaybillReasonSwitch2SelfFailed:
reasonMsg = "ReasonIDNobodyAccept" cancelReasonID = dadaapi.ReasonIDClientDontWantItAnymore
} else if bill.Status < model.WaybillStatusCourierArrived { default:
reasonID = dadaapi.ReasonIDNobodyPickup cancelReasonID = dadaapi.ReasonIDOther
reasonMsg = "ReasonIDNobodyPickup"
} }
_, err = api.DadaAPI.CancelOrder(bill.VendorOrderID, reasonID, reasonMsg) _, err = api.DadaAPI.CancelOrder(bill.VendorOrderID, cancelReasonID, cancelReason)
return err return err
} }

View File

@@ -245,17 +245,16 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del
return bill, err return bill, err
} }
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill) (err error) { func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
reasonID := mtpsapi.CancelReasonRidderSendNotIntime switch cancelReasonID {
reasonMsg := "CancelReasonRidderSendNotIntime" case partner.CancelWaybillReasonNotAcceptIntime:
if bill.Status < model.WaybillStatusAccepted { cancelReasonID = mtpsapi.CancelReasonRideerMtpsOther
reasonID = mtpsapi.CancelReasonMerchantOther case partner.CancelWaybillReasonSwitch2SelfFailed:
reasonMsg = "nobody accept order" cancelReasonID = mtpsapi.CancelReasonMerchantOther
} else if bill.Status < model.WaybillStatusCourierArrived { default:
reasonID = mtpsapi.CancelReasonRideerGetGoodNotIntime cancelReasonID = mtpsapi.CancelReasonRideerOther
reasonMsg = "CancelReasonRideerGetGoodNotIntime"
} }
_, err = api.MtpsAPI.CancelOrder(utils.Str2Int64(bill.VendorWaybillID2), bill.VendorWaybillID, reasonID, reasonMsg) _, err = api.MtpsAPI.CancelOrder(utils.Str2Int64(bill.VendorWaybillID2), bill.VendorWaybillID, cancelReasonID, cancelReason)
return nil return nil
} }

View File

@@ -6,6 +6,18 @@ import (
"git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model"
) )
const (
CancelWaybillReasonNotAcceptIntime = 1
CancelWaybillReasonSwitch2SelfFailed = 2
CancelWaybillReasonOther = 10
)
var (
CancelWaybillReasonStrNotAcceptIntime = "没有及时抢单"
CancelWaybillReasonStrSwitch2SelfFailed = "转自送失败"
CancelWaybillReasonStrOrderAlreadyFinished = "订单已经结束"
)
var ( var (
CurOrderManager IOrderManager CurOrderManager IOrderManager
) )
@@ -27,25 +39,25 @@ type IPurchasePlatformHandler interface {
GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error)
GetStatusActionTimeout(statusType, status int) time.Duration GetStatusActionTimeout(statusType, status int) time.Duration
AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error)
PickupGoods(order *model.GoodsOrder) (err error) PickupGoods(order *model.GoodsOrder, userName string) (err error)
// 将订单从购物平台配送转为自送 // 将订单从购物平台配送转为自送
Swtich2SelfDeliver(order *model.GoodsOrder) (err error) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error)
// 将订单从购物平台配送转为自送后又送达 // 将订单从购物平台配送转为自送后又送达
Swtich2SelfDelivered(order *model.GoodsOrder) (err error) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error)
// 完全自送的门店表示开始配送 // 完全自送的门店表示开始配送
SelfDeliverDelievering(order *model.GoodsOrder) (err error) SelfDeliverDelievering(order *model.GoodsOrder, userName string) (err error)
// 完全自送的门店表示配送完成 // 完全自送的门店表示配送完成
SelfDeliverDelievered(order *model.GoodsOrder) (err error) SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error)
} }
type IDeliveryPlatformHandler interface { type IDeliveryPlatformHandler interface {
CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error)
CancelWaybill(bill *model.Waybill) (err error) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error)
} }
func Init(curOrderManager IOrderManager) { func Init(curOrderManager IOrderManager) {

View File

@@ -264,7 +264,7 @@ func (c *PurchaseHandler) GetStatusFromVendorStatus(vendorStatus string) int {
return model.OrderStatusUnknown return model.OrderStatusUnknown
} }
func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
if isAcceptIt { if isAcceptIt {
err = api.ElmAPI.ConfirmOrder(order.VendorOrderID) err = api.ElmAPI.ConfirmOrder(order.VendorOrderID)
} else { } else {
@@ -275,25 +275,25 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
// 饿了么没有拣货这个状态,直接返回成功 // 饿了么没有拣货这个状态,直接返回成功
// 真实流程中也不会调用这个方法,因为接收订单后状态会直接转移到已拣货 // 真实流程中也不会调用这个方法,因为接收订单后状态会直接转移到已拣货
func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, userName string) (err error) {
return nil return nil
} }
func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) {
err = api.ElmAPI.DeliveryBySelfLite(order.VendorOrderID) err = api.ElmAPI.DeliveryBySelfLite(order.VendorOrderID)
return err return err
} }
// 饿了么转商家自送后,没有确认送达的概念,空操作 // 饿了么转商家自送后,没有确认送达的概念,空操作
func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) {
return nil return nil
} }
func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder, userName string) (err error) {
return api.ElmAPI.StartDeliveryBySelf(order.VendorOrderID, order.ConsigneeMobile) return api.ElmAPI.StartDeliveryBySelf(order.VendorOrderID, order.ConsigneeMobile)
} }
func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error) {
return api.ElmAPI.CompleteDeliveryBySelf(order.VendorOrderID, order.ConsigneeMobile) return api.ElmAPI.CompleteDeliveryBySelf(order.VendorOrderID, order.ConsigneeMobile)
} }

View File

@@ -184,18 +184,18 @@ func (c *PurchaseHandler) GetStatusFromVendorStatus(vendorStatus string) int {
return model.OrderStatusUnknown return model.OrderStatusUnknown
} }
func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
_, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt) _, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt, userName)
return err return err
} }
func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, userName string) (err error) {
_, err = api.JdAPI.OrderJDZBDelivery(order.VendorOrderID) _, err = api.JdAPI.OrderJDZBDelivery(order.VendorOrderID, userName)
return err return err
} }
func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) {
_, err = api.JdAPI.ModifySellerDelivery(order.VendorOrderID) _, err = api.JdAPI.ModifySellerDelivery(order.VendorOrderID, userName)
if err != nil { if err != nil {
if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 { if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 {
globals.SugarLogger.Infof("Swtich2SelfDeliver failed with error:%v try get current status", err) globals.SugarLogger.Infof("Swtich2SelfDeliver failed with error:%v try get current status", err)
@@ -212,17 +212,17 @@ func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error
return err return err
} }
func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) {
_, err = api.JdAPI.DeliveryEndOrder(order.VendorOrderID) _, err = api.JdAPI.DeliveryEndOrder(order.VendorOrderID, userName)
return err return err
} }
func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder, userName string) (err error) {
_, err = api.JdAPI.OrderSerllerDelivery(order.VendorOrderID) _, err = api.JdAPI.OrderSerllerDelivery(order.VendorOrderID, userName)
return err return err
} }
// 京东送达接口都是一样的 // 京东送达接口都是一样的
func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error) {
return c.Swtich2SelfDelivered(order) return c.Swtich2SelfDelivered(order, userName)
} }

View File

@@ -13,6 +13,14 @@ type OrderController struct {
beego.Controller beego.Controller
} }
func GetUserNameFromToken(token string) string {
userName := token
if len(userName) > 10 {
userName = userName[:10]
}
return userName
}
func (c *OrderController) URLMapping() { func (c *OrderController) URLMapping() {
c.Mapping("FinishedPickup", c.FinishedPickup) c.Mapping("FinishedPickup", c.FinishedPickup)
c.Mapping("GetStoreOrderInfo", c.GetStoreOrderInfo) c.Mapping("GetStoreOrderInfo", c.GetStoreOrderInfo)
@@ -21,16 +29,17 @@ func (c *OrderController) URLMapping() {
c.Mapping("Swtich2SelfDeliver", c.Swtich2SelfDeliver) c.Mapping("Swtich2SelfDeliver", c.Swtich2SelfDeliver)
} }
func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendorID int) (interface{}, error)) { func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendorID int, userName string) (interface{}, error)) {
var ( var (
vendorOrderID string vendorOrderID, token string
vendorID int vendorID int
err error err error
) )
token = c.Ctx.Input.Header("token")
vendorOrderID = c.GetString("vendorOrderID") vendorOrderID = c.GetString("vendorOrderID")
vendorID, err1 := c.GetInt("vendorID", 0) vendorID, err1 := c.GetInt("vendorID", 0)
if vendorOrderID != "" && err1 == nil { if vendorOrderID != "" && token != "" && err1 == nil {
result, err2 := handler(vendorOrderID, vendorID) result, err2 := handler(vendorOrderID, vendorID, GetUserNameFromToken(token))
if err = err2; err == nil { if err = err2; err == nil {
retObj := &model.CallResult{ retObj := &model.CallResult{
Code: "0", Code: "0",
@@ -45,6 +54,9 @@ func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendor
if vendorOrderID == "" { if vendorOrderID == "" {
errMsg += "vendorOrderID is empty\n" errMsg += "vendorOrderID is empty\n"
} }
if token == "" {
errMsg += "token is empty\n"
}
if errMsg != "" { if errMsg != "" {
c.Data["json"] = &model.CallResult{ c.Data["json"] = &model.CallResult{
Code: "-1", Code: "-1",
@@ -56,45 +68,49 @@ func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendor
// @Title 完成拣货 // @Title 完成拣货
// @Description 完成拣货 // @Description 完成拣货
// @Param token header string true "认证toke"
// @Param vendorOrderID formData string true "订单ID" // @Param vendorOrderID formData string true "订单ID"
// @Param vendorID formData int true "订单所属的厂商ID" // @Param vendorID formData int true "订单所属的厂商ID"
// @Success 200 {object} business.model.CallResult // @Success 200 {object} business.model.CallResult
// @Failure 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult
// @router /FinishedPickup [post] // @router /FinishedPickup [post]
func (c *OrderController) FinishedPickup() { func (c *OrderController) FinishedPickup() {
c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { c.orderOperate(func(vendorOrderID string, vendorID int, userName string) (interface{}, error) {
return nil, basesch.FixedBaseScheduler.PickupGoodsAndUpdateStatus(vendorOrderID, vendorID) return nil, basesch.FixedBaseScheduler.PickupGoodsAndUpdateStatus(vendorOrderID, vendorID, userName)
}) })
} }
// @Title 转自送 // @Title 转自送
// @Description 转自送 // @Description 转自送
// @Param token header string true "认证toke"
// @Param vendorOrderID formData string true "订单ID" // @Param vendorOrderID formData string true "订单ID"
// @Param vendorID formData int true "订单所属的厂商ID" // @Param vendorID formData int true "订单所属的厂商ID"
// @Success 200 {object} business.model.CallResult // @Success 200 {object} business.model.CallResult
// @Failure 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult
// @router /Swtich2SelfDeliver [post] // @router /Swtich2SelfDeliver [post]
func (c *OrderController) Swtich2SelfDeliver() { func (c *OrderController) Swtich2SelfDeliver() {
c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { c.orderOperate(func(vendorOrderID string, vendorID int, userName string) (interface{}, error) {
return nil, basesch.FixedBaseScheduler.Swtich2SelfDeliverAndUpdateStatus(vendorOrderID, vendorID) return nil, basesch.FixedBaseScheduler.Swtich2SelfDeliverAndUpdateStatus(vendorOrderID, vendorID, userName)
}) })
} }
// @Title 创建三方运单 // @Title 创建三方运单
// @Description 创建三方运单 // @Description 创建三方运单
// @Param token header string true "认证toke"
// @Param vendorOrderID formData string true "订单ID" // @Param vendorOrderID formData string true "订单ID"
// @Param vendorID formData int true "订单所属的厂商ID" // @Param vendorID formData int true "订单所属的厂商ID"
// @Success 200 {object} business.model.CallResult // @Success 200 {object} business.model.CallResult
// @Failure 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult
// @router /CreateWaybillOnProviders [post] // @router /CreateWaybillOnProviders [post]
func (c *OrderController) CreateWaybillOnProviders() { func (c *OrderController) CreateWaybillOnProviders() {
c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { c.orderOperate(func(vendorOrderID string, vendorID int, userName string) (interface{}, error) {
return basesch.FixedBaseScheduler.CreateWaybillOnProviders(vendorOrderID, vendorID) return basesch.FixedBaseScheduler.CreateWaybillOnProviders(vendorOrderID, vendorID)
}) })
} }
// @Title 得到门店订单信息 // @Title 得到门店订单信息
// @Description 得到门店订单信息 // @Description 得到门店订单信息
// @Param token header string true "认证toke"
// @Param storeID query string true "京西门店ID" // @Param storeID query string true "京西门店ID"
// @Param lastHours query int false "最近多少小时的信息(缺省为两天)" // @Param lastHours query int false "最近多少小时的信息(缺省为两天)"
// @Success 200 {object} business.model.CallResult // @Success 200 {object} business.model.CallResult
@@ -132,6 +148,7 @@ func (c *OrderController) GetStoreOrderCountInfo() {
// @Title 得到门店订单状态信息 // @Title 得到门店订单状态信息
// @Description 得到门店订单状态信息 // @Description 得到门店订单状态信息
// @Param token header string true "认证toke"
// @Param storeID query string true "京西门店ID" // @Param storeID query string true "京西门店ID"
// @Param lastHours query int false "最近多少小时的信息(缺省为两天)" // @Param lastHours query int false "最近多少小时的信息(缺省为两天)"
// @Param fromStatus query int true "起始状态(包括)" // @Param fromStatus query int true "起始状态(包括)"
@@ -178,13 +195,15 @@ func (c *OrderController) GetStoreOrderInfo() {
// @Title 得到订单SKU信息 // @Title 得到订单SKU信息
// @Description 得到订单SKU信息 // @Description 得到订单SKU信息
// @Param token header string true "认证toke"
// @Param vendorOrderID query string true "订单ID" // @Param vendorOrderID query string true "订单ID"
// @Param vendorID query int true "订单所属的厂商ID" // @Param vendorID query int true "订单所属的厂商ID"
// @Success 200 {object} business.model.CallResult // @Success 200 {object} business.model.CallResult
// @Failure 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult
// @router /GetOrderSkuInfo [get] // @router /GetOrderSkuInfo [get]
func (c *OrderController) GetOrderSkuInfo() { func (c *OrderController) GetOrderSkuInfo() {
c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { c.orderOperate(func(vendorOrderID string, vendorID int, userName string) (interface{}, error) {
// globals.SugarLogger.Debugf("userName:%s", userName)
return orderman.FixedOrderManager.GetOrderSkuInfo(vendorOrderID, vendorID) return orderman.FixedOrderManager.GetOrderSkuInfo(vendorOrderID, vendorID)
}) })
} }