diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index de70400f0..228b51b41 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -13,23 +13,19 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) -func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs []int, policyHandler partner.CreateWaybillPolicyFunc, createOnlyOne bool) (bills []*model.Waybill, err error) { +func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs, excludeCourierVendorIDs []int, policyHandler partner.CreateWaybillPolicyFunc, createOnlyOne bool) (bills []*model.Waybill, err error) { userName := ctx.GetUserName() globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s", order.VendorOrderID, userName) storeCourierList, err := dao.GetStoreCourierList(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), model.StoreStatusOpened) if err != nil { return nil, err } - var courierVendorIDMap map[int]bool - if len(courierVendorIDs) > 0 { - courierVendorIDMap = make(map[int]bool) - for _, courierVendorID := range courierVendorIDs { - courierVendorIDMap[courierVendorID] = true - } - } + courierVendorIDMap := jxutils.IntList2Map(courierVendorIDs) + excludeCourierVendorIDMap := jxutils.IntList2Map(excludeCourierVendorIDs) var errList []string for _, storeCourier := range storeCourierList { - if courierVendorIDMap == nil || courierVendorIDMap[storeCourier.VendorID] { + if (courierVendorIDMap == nil || courierVendorIDMap[storeCourier.VendorID] == 1) && + (excludeCourierVendorIDMap == nil || excludeCourierVendorIDMap[storeCourier.VendorID] == 0) { if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil && handler.Use4CreateWaybill { courierVendorID := storeCourier.VendorID if order.VendorID != model.VendorIDWSC || courierVendorID != model.VendorIDDada { // 达达作为微商城的自有配送,不参与配送竞争 @@ -51,7 +47,7 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order * if len(bills) > 0 { err = nil } else if len(errList) == 0 { - err = fmt.Errorf("orderID:%s没有绑定有效的三方配送门店", order.VendorOrderID) + err = fmt.Errorf("orderID:%s没有绑定有效的三方配送门店或没有剩下可用的三方配送", order.VendorOrderID) } else { err = fmt.Errorf("orderID:%s所有运单失败:\n%s", order.VendorOrderID, utils.Format4Output(errList, false)) } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 4660718ed..f2af0430e 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -138,6 +138,13 @@ func (s *WatchOrderInfo) updateOrderStoreFeature(order *model.GoodsOrder) (err e return err } +func (s *WatchOrderInfo) GetWaybillVendorIDs() (vendorIDs []int) { + for vendorID := range s.waybills { + vendorIDs = append(vendorIDs, vendorID) + } + return vendorIDs +} + func init() { sch := &DefScheduler{} basesch.FixedBaseScheduler = &sch.BaseScheduler @@ -494,6 +501,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order) } case model.WaybillStatusAcceptCanceled: + s.removeWaybillFromMap(savedOrderInfo, bill.WaybillVendorID) if s.isBillCandidate(order, bill) { s.resetTimer(savedOrderInfo, bill, isPending) if !isPending { @@ -615,7 +623,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { if savedOrderInfo.retryCount <= maxWaybillRetryCount { savedOrderInfo.isNeedCreate3rdWaybill = true - if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, false, 1000, 1000, s.getMaxDeliveryFee(savedOrderInfo)); err == nil { + if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, savedOrderInfo.GetWaybillVendorIDs(), false, 1000, 1000, s.getMaxDeliveryFee(savedOrderInfo)); err == nil { savedOrderInfo.retryCount++ } } else { diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 76d1a2b4e..2bfff6f67 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -97,7 +97,7 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e return err } -func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs []int, forceCreate bool, maxAddFee, maxDiffFee2Mtps, maxDeliveryFee int64) (bills []*model.Waybill, err error) { +func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs, excludeCourierVendorIDs []int, forceCreate bool, maxAddFee, maxDiffFee2Mtps, maxDeliveryFee int64) (bills []*model.Waybill, err error) { order := savedOrderInfo.order if !forceCreate { err = s.canOrderCreateWaybillNormally(order) @@ -109,7 +109,7 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex } else if maxAddFee != 0 || maxDiffFee2Mtps != 0 || maxDeliveryFee != 0 { feeHandler = delivery.CreateWaybillPolicy(maxDiffFee2Mtps, maxAddFee, maxDeliveryFee) } - if bills, err = s.CreateWaybillOnProviders(ctx, order, courierVendorIDs, feeHandler, forceCreate); err == nil { + if bills, err = s.CreateWaybillOnProviders(ctx, order, courierVendorIDs, excludeCourierVendorIDs, feeHandler, forceCreate); err == nil { if forceCreate { order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order) @@ -144,7 +144,7 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor err = s.isPossibleSwitch2SelfDelivery(order) } if err == nil { - if bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, forceCreate, maxAddFee, maxDiffFee2Mtps, 0); err == nil && len(bills) > 0 { + if bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, nil, forceCreate, maxAddFee, maxDiffFee2Mtps, 0); err == nil && len(bills) > 0 { partner.CurOrderManager.OnOrderMsg(order, "手动创建运单成功", fmt.Sprintf("%s创建%s平台运单,强发:%t,最高加价:%d,最高差价:%d", ctx.GetUserName(), model.VendorChineseNames[bills[0].WaybillVendorID], forceCreate, maxAddFee, maxDiffFee2Mtps)) } }