diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 1c223e7fc..ab7af13e3 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -157,19 +157,25 @@ func (c *OrderManager) GetOrderInfo(ctx *jxcontext.Context, vendorOrderID string return nil, err } -func (c *OrderManager) GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (bills []*model.Waybill, err error) { +func (c *OrderManager) GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isNotEnded bool) (bills []*model.Waybill, err error) { globals.SugarLogger.Debugf("GetOrderWaybillInfo orderID:%s", vendorOrderID) - db := orm.NewOrm() - _, err = db.Raw(` + db := dao.GetDB() + sql := ` SELECT t1.* FROM waybill t1 WHERE t1.vendor_order_id = ? AND order_vendor_id = ? - `, vendorOrderID, vendorID).QueryRows(&bills) - if err == nil { - return bills, nil + ` + sqlParams := []interface{}{ + vendorOrderID, + vendorID, } + if isNotEnded { + sql += " AND t1.status < ?" + sqlParams = append(sqlParams, model.OrderStatusEndBegin) + } + err = dao.GetRows(db, &bills, sql, sqlParams...) globals.SugarLogger.Infof("GetOrderWaybillInfo orderID:%s failed with error:%v", vendorOrderID, err) - return nil, err + return bills, err } func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toDateStr string) (excelContent []byte, err error) { diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index 8e171cb8a..53492f94b 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -13,29 +13,37 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) -func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, policyHandler partner.CreateWaybillPolicy, createOnlyOne bool) (bills []*model.Waybill, err error) { +func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs []int, policyHandler partner.CreateWaybillPolicy, 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 + } + } var errList []string for _, storeCourier := range storeCourierList { - if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil && handler.Use4CreateWaybill { - courierVendorID := storeCourier.VendorID - if order.VendorID != model.VendorIDWSC || courierVendorID != model.VendorIDDada { // 达达作为微商城的自有配送,不参与配送竞争 - bill, err2 := c.CreateWaybill(courierVendorID, order, policyHandler) - if err = err2; err == nil { - globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d bill:%v", order.VendorOrderID, userName, courierVendorID, bill) - bills = append(bills, bill) - if createOnlyOne { - break + if courierVendorIDMap == nil || courierVendorIDMap[storeCourier.VendorID] { + if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil && handler.Use4CreateWaybill { + courierVendorID := storeCourier.VendorID + if order.VendorID != model.VendorIDWSC || courierVendorID != model.VendorIDDada { // 达达作为微商城的自有配送,不参与配送竞争 + bill, err2 := c.CreateWaybill(courierVendorID, order, policyHandler) + if err = err2; err == nil { + globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d bill:%v", order.VendorOrderID, userName, courierVendorID, bill) + bills = append(bills, bill) + if createOnlyOne { + break + } + } else { + globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d failed with error:%v", order.VendorOrderID, userName, courierVendorID, err) + errList = append(errList, fmt.Sprintf("平台:%s,%s", jxutils.GetVendorName(courierVendorID), err.Error())) } - } else { - globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d failed with error:%v", order.VendorOrderID, userName, courierVendorID, err) - errList = append(errList, fmt.Sprintf("平台:%s,%s", jxutils.GetVendorName(courierVendorID), err.Error())) } } } @@ -182,46 +190,10 @@ func (c *BaseScheduler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model return err } -func (s *BaseScheduler) QueryOrderWaybillFeeInfoEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (deliveryFeeMap map[int]*partner.WaybillFeeInfo, err error) { - jxutils.CallMsgHandler(func() { - deliveryFeeMap, err = func() (deliveryFeeMap map[int]*partner.WaybillFeeInfo, err error) { - userName := ctx.GetUserName() - globals.SugarLogger.Infof("GetWaybillsInfoEx orderID:%s userName:%s", vendorOrderID, userName) - - db := dao.GetDB() - order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) - if err != nil { - return nil, err - } - storeCourierList, err := dao.GetStoreCourierList(db, jxutils.GetSaleStoreIDFromOrder(order), model.StoreStatusOpened) - if err != nil { - return nil, err - } - deliveryFeeMap = make(map[int]*partner.WaybillFeeInfo) - for _, storeCourier := range storeCourierList { - var feeInfo *partner.WaybillFeeInfo - if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil { - if handler.Use4CreateWaybill { - if feeInfo, err = handler.Handler.GetWaybillFee(order); err != nil { - feeInfo = &partner.WaybillFeeInfo{ - ErrStr: err.Error(), - } - } - } else { - feeInfo = &partner.WaybillFeeInfo{ - ErrStr: fmt.Sprintf("内部错误,%d不能用于创建运单", storeCourier.VendorID), - } - } - } else { - feeInfo = &partner.WaybillFeeInfo{ - ErrStr: fmt.Sprintf("内部错误,%d不被支持", storeCourier.VendorID), - } - } - deliveryFeeMap[storeCourier.VendorID] = feeInfo - } - err = nil - return deliveryFeeMap, err - }() - }, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID)) - return deliveryFeeMap, err +func (c *BaseScheduler) CancelWaybillByID(ctx *jxcontext.Context, vendorWaybillID string, waybillVendorID int, cancelReasonID int, cancelReason string) (err error) { + bill, err := partner.CurOrderManager.LoadWaybill(vendorWaybillID, waybillVendorID) + if err == nil { + err = c.CancelWaybill(bill, cancelReasonID, cancelReason) + } + return err } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 47068af71..c8b9129f1 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -64,6 +64,7 @@ type WatchOrderInfo struct { timerStatusType int // 0表示订单,1表示运单 timerStatus int timer *time.Timer + timerTime time.Time retryCount int // 失败后尝试的次数,调试阶段可能出现死循化,阻止这种情况发生 } @@ -277,7 +278,7 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod } } } - s.cancelOtherWaybills(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished) + s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished) if status.Status >= model.OrderStatusEndBegin { s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status)) } @@ -364,7 +365,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo globals.SugarLogger.Infof("OnWaybillStatusChanged orderID:%s purchase platform waybill arrvied later, may cause problem", order.VendorOrderID) } s.updateOrderByBill(order, bill, false) - s.cancelOtherWaybills(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) + s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) if !s.IsOrderPlatformWaybill(bill) && savedOrderInfo.storeDeliveryType != scheduler.StoreDeliveryTypeByStore { s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second) } else if s.IsSpecialOrderPlatformWaybill(bill) { @@ -500,7 +501,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { if savedOrderInfo.retryCount <= maxWaybillRetryCount { savedOrderInfo.retryCount++ - _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, false, 0, 0) + _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, false, 0, 0) } else { err = fmt.Errorf("订单:%s已经自动创建过了%d次运单,请人工处理", order.VendorOrderID, savedOrderInfo.retryCount) globals.SugarLogger.Infof("createWaybillOn3rdProviders [运营]同一订单orderID:%s尝试了%d次创建运单失败, 停止调度,如果还需要发单,请人工处理", order.VendorOrderID, savedOrderInfo.retryCount) @@ -518,22 +519,24 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf return err } -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) +func (s *DefScheduler) cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) { + globals.SugarLogger.Debugf("cancelOtherWaybillsCheckOrderDeliveryFlag, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep) if (savedOrderInfo.order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { - err = s.cancelOtherWaybills2(savedOrderInfo, bill2Keep, cancelReasonID, cancelReason) + err = s.cancelOtherWaybills(savedOrderInfo, bill2Keep, cancelReasonID, cancelReason) } else { - globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v stop schedule", savedOrderInfo.order.VendorOrderID, bill2Keep) + globals.SugarLogger.Debugf("cancelOtherWaybillsCheckOrderDeliveryFlag, orderID:%s, bill:%v stop schedule", savedOrderInfo.order.VendorOrderID, bill2Keep) } return err } -func (s *DefScheduler) cancelOtherWaybills2(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) { - globals.SugarLogger.Debugf("cancelOtherWaybills2, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep) +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) toBeDeleted := []*model.Waybill{} for _, v := range savedOrderInfo.waybills { - if !s.IsOrderPlatformWaybill(v) && (bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) { - err2 := s.ProxyCancelWaybill(savedOrderInfo.order, v, cancelReasonID, cancelReason) + if v.Status < model.WaybillStatusEndBegin && + !s.IsOrderPlatformWaybill(v) && + (bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) { + err2 := s.CancelWaybill(v, cancelReasonID, cancelReason) if err2 == nil { toBeDeleted = append(toBeDeleted, v) } @@ -626,7 +629,7 @@ func (s *DefScheduler) stopTimer(savedOrderInfo *WatchOrderInfo) { if savedOrderInfo.timer != nil { globals.SugarLogger.Debugf("stopTimer orderID:%s", savedOrderInfo.order.VendorOrderID) savedOrderInfo.timer.Stop() - savedOrderInfo.timerStatus = 0 + savedOrderInfo.timerStatus = model.OrderStatusUnknown savedOrderInfo.timerStatusType = scheduler.TimerStatusTypeUnknown savedOrderInfo.timer = nil } @@ -669,6 +672,7 @@ func (s *DefScheduler) resetTimer(savedOrderInfo *WatchOrderInfo, bill *model.Wa } savedOrderInfo.timerStatusType = statusType savedOrderInfo.timerStatus = status + savedOrderInfo.timerTime = time.Now().Add(timeout) savedOrderInfo.timer = utils.AfterFuncWithRecover(timeout, func() { jxutils.CallMsgHandlerAsync(func() { globals.SugarLogger.Debugf("fire timer:%s, orderID:%s", timerName, order.VendorOrderID) diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 1bb2c6f41..9b54a7a40 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -15,18 +15,21 @@ import ( "git.rosy.net.cn/jx-callback/globals" ) +func (s *DefScheduler) loadSavedOrderByID(vendorOrderID string, vendorID int, isForceLoad bool) *WatchOrderInfo { + return s.loadSavedOrderFromMap(&model.OrderStatus{ + RefVendorOrderID: vendorOrderID, + RefVendorID: vendorID, + }, isForceLoad) +} + func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, vendorOrderID string, vendorID int, userName string) (err error) { jxutils.CallMsgHandler(func() { err = func() (err error) { globals.SugarLogger.Infof("SelfDeliveringAndUpdateStatus orderID:%s userName:%s", vendorOrderID, userName) - status := &model.OrderStatus{ - RefVendorOrderID: vendorOrderID, - RefVendorID: vendorID, - } - savedOrderInfo := s.loadSavedOrderFromMap(status, true) + savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true) if savedOrderInfo != nil { order := savedOrderInfo.order - err = s.cancelOtherWaybills(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) + err = s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) if err == nil { // todo if true { //order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled == 0 { @@ -76,7 +79,7 @@ func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder) (e return err } -func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, forceCreate bool, maxAddFee, maxDiffFee2Mtps int64) (bills []*model.Waybill, err error) { +func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs []int, forceCreate bool, maxAddFee, maxDiffFee2Mtps int64) (bills []*model.Waybill, err error) { order := savedOrderInfo.order err = s.canOrderCreateWaybillNormally(order) if forceCreate || err == nil { @@ -87,7 +90,7 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex } else if maxAddFee != 0 { feeHandler = delivery.CreateWaybillPolicy(maxDiffFee2Mtps, maxAddFee) } - if bills, err = s.CreateWaybillOnProviders(ctx, order, feeHandler, forceCreate); err == nil { + if bills, err = s.CreateWaybillOnProviders(ctx, order, courierVendorIDs, feeHandler, forceCreate); err == nil { if forceCreate { order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order) @@ -107,7 +110,7 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex return nil, err } -func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int, forceCreate bool, maxAddFee, maxDiffFee2Mtps int64) (bills []*model.Waybill, err error) { +func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int, courierVendorIDs []int, forceCreate bool, maxAddFee, maxDiffFee2Mtps int64) (bills []*model.Waybill, err error) { jxutils.CallMsgHandler(func() { bills, err = func() (bills []*model.Waybill, err error) { userName := ctx.GetUserName() @@ -115,11 +118,7 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor if vendorID == model.VendorIDELM { return nil, fmt.Errorf("不要直接使用饿了么订单号,请使用相应的饿百订单号") } - status := &model.OrderStatus{ - RefVendorOrderID: vendorOrderID, - RefVendorID: vendorID, - } - savedOrderInfo := s.loadSavedOrderFromMap(status, true) + savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true) if savedOrderInfo != nil { order := savedOrderInfo.order if scheduler.StoreDeliveryTypeByStore != s.GetStoreDeliveryType(order, nil) && @@ -127,7 +126,7 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute { return nil, fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier) } - bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, forceCreate, maxAddFee, maxDiffFee2Mtps) + bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, forceCreate, maxAddFee, maxDiffFee2Mtps) } else { err = scheduler.ErrCanNotFindOrder } @@ -143,13 +142,9 @@ func (s *DefScheduler) CancelAll3rdWaybills(ctx *jxcontext.Context, vendorOrderI jxutils.CallMsgHandler(func() { err = func() (err error) { globals.SugarLogger.Infof("CancelAll3rdWaybills orderID:%s userName:%s", vendorOrderID, ctx.GetUserName()) - status := &model.OrderStatus{ - RefVendorOrderID: vendorOrderID, - RefVendorID: vendorID, - } - savedOrderInfo := s.loadSavedOrderFromMap(status, true) + savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true) if savedOrderInfo != nil { - err = s.cancelOtherWaybills2(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) + err = s.cancelOtherWaybills(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) } else { err = scheduler.ErrCanNotFindOrder } @@ -167,3 +162,80 @@ func (s *DefScheduler) CancelAll3rdWaybills(ctx *jxcontext.Context, vendorOrderI }, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID)) return err } + +func (s *DefScheduler) QueryOrderWaybillFeeInfoEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (deliveryFeeMap map[int]*partner.WaybillFeeInfo, err error) { + jxutils.CallMsgHandler(func() { + deliveryFeeMap, err = func() (deliveryFeeMap map[int]*partner.WaybillFeeInfo, err error) { + userName := ctx.GetUserName() + globals.SugarLogger.Infof("GetWaybillsInfoEx orderID:%s userName:%s", vendorOrderID, userName) + + db := dao.GetDB() + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) + if err != nil { + return nil, err + } + storeCourierList, err := dao.GetStoreCourierList(db, jxutils.GetSaleStoreIDFromOrder(order), model.StoreStatusAll) + if err != nil { + return nil, err + } + waybillList, err := partner.CurOrderManager.GetOrderWaybillInfo(ctx, vendorOrderID, vendorID, true) + if err != nil { + return nil, err + } + waybillMap := make(map[int]*model.Waybill) + for _, bill := range waybillList { + waybillMap[bill.WaybillVendorID] = bill + } + deliveryFeeMap = make(map[int]*partner.WaybillFeeInfo) + + var timeoutSecond int + if savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true); savedOrderInfo != nil { + if savedOrderInfo.timerStatusType == scheduler.TimerStatusTypeWaybill && savedOrderInfo.timerStatusType == model.WaybillStatusNew { + timeoutSecond = int(savedOrderInfo.timerTime.Sub(time.Now()) / time.Second) + } + } + for _, storeCourier := range storeCourierList { + var feeInfo *partner.WaybillFeeInfo + if waybillMap[storeCourier.VendorID] != nil { + feeInfo = &partner.WaybillFeeInfo{ + Waybill: waybillMap[storeCourier.VendorID], + } + } else { + if storeCourier.Status != model.StoreStatusOpened { + feeInfo = &partner.WaybillFeeInfo{ + ErrCode: partner.WaybillFeeErrCodeCourierNotOpen, + ErrStr: fmt.Sprintf("%d配送门店没有启用", storeCourier.VendorID), + } + } else { + if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil { + if handler.Use4CreateWaybill { + if feeInfo, err = handler.Handler.GetWaybillFee(order); err != nil { + feeInfo = &partner.WaybillFeeInfo{ + ErrCode: partner.WaybillFeeErrCodeCourierOthers, + ErrStr: err.Error(), + } + } else { + feeInfo.TimeoutSecond = timeoutSecond + } + } else { + feeInfo = &partner.WaybillFeeInfo{ + ErrCode: partner.WaybillFeeErrCodeCourierForbidden, + ErrStr: fmt.Sprintf("内部错误,%d不能用于创建运单", storeCourier.VendorID), + } + } + } else { + feeInfo = &partner.WaybillFeeInfo{ + ErrCode: partner.WaybillFeeErrCodeCourierNotSupported, + ErrStr: fmt.Sprintf("内部错误,%d不被支持", storeCourier.VendorID), + } + } + } + } + deliveryFeeMap[storeCourier.VendorID] = feeInfo + } + err = nil + return deliveryFeeMap, err + }() + }, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID)) + return deliveryFeeMap, err +} diff --git a/business/partner/partner.go b/business/partner/partner.go index 670f51c08..fa267577a 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -63,11 +63,21 @@ type StatusActionParams struct { TimeoutGap int // 以秒为单位的随机时间,0在GetStatusActionConfig返回时表示不修改缺省 } +const ( + WaybillFeeErrCodeCourierNotOpen = 1 //配送门店没有启用 + WaybillFeeErrCodeCourierNotSupported = 2 //配送门店不被系统支持 + WaybillFeeErrCodeCourierForbidden = 3 //配送门店内部禁用 + WaybillFeeErrCodeCourierOthers = 10 //其它错误 +) + type WaybillFeeInfo struct { - ErrStr string `json:"errStr"` - RefDeliveryFee int64 `json:"refDeliveryFee"` - RefAddFee int64 `json:"refAddFee"` - DeliveryFee int64 `json:"deliveryFee"` + ErrCode int `json:"errCode"` + ErrStr string `json:"errStr"` + RefDeliveryFee int64 `json:"refDeliveryFee"` + RefAddFee int64 `json:"refAddFee"` + DeliveryFee int64 `json:"deliveryFee"` + TimeoutSecond int `json:"timeoutSecond"` // 系统会自动发运单的倒计时 + Waybill *model.Waybill `json:"waybill"` } func (s *StatusActionParams) GetRefTimeout(statusTime time.Time) (timeout time.Duration) { @@ -129,6 +139,8 @@ type IOrderManager interface { SaveOrderFinancialInfo(order *model.OrderFinancial, operation string) (err error) SaveAfsOrderFinancialInfo(afsOrder *model.AfsOrder) (err error) + + GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isNotEnded bool) (bills []*model.Waybill, err error) } type IStoreManager interface { diff --git a/controllers/jx_order.go b/controllers/jx_order.go index e5a24d713..e4f155f6d 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -98,6 +98,7 @@ func (c *OrderController) QueryOrderWaybillFeeInfo() { // @Param token header string true "认证token" // @Param vendorOrderID formData string true "订单ID" // @Param vendorID formData int true "订单所属的厂商ID" +// @Param courierVendorIDs formData string false "运单厂商ID(缺省全部)" // @Param forceCreate formData bool false "是否强制创建(忽略订单状态检查及其它参数)" // @Param maxAddFee formData int false "最大加价,单位为分(为0时为缺省值)" // @Param maxDiffFee2Mtps formData int false "最大与美团配送差价,单位为分(maxAddFee不为0时才可能有效)" @@ -106,7 +107,10 @@ func (c *OrderController) QueryOrderWaybillFeeInfo() { // @router /CreateWaybillOnProviders [post] func (c *OrderController) CreateWaybillOnProviders() { c.callCreateWaybillOnProviders(func(params *tOrderCreateWaybillOnProvidersParams) (retVal interface{}, errCode string, err error) { - retVal, err = defsch.FixedScheduler.CreateWaybillOnProvidersEx(params.Ctx, params.VendorOrderID, params.VendorID, params.ForceCreate, int64(params.MaxAddFee), int64(params.MaxDiffFee2Mtps)) + var courierVendorIDs []int + if err = jxutils.Strings2Objs(params.CourierVendorIDs, &courierVendorIDs); err == nil { + retVal, err = defsch.FixedScheduler.CreateWaybillOnProvidersEx(params.Ctx, params.VendorOrderID, params.VendorID, courierVendorIDs, params.ForceCreate, int64(params.MaxAddFee), int64(params.MaxDiffFee2Mtps)) + } return retVal, "", err }) } @@ -127,6 +131,27 @@ func (c *OrderController) CancelAll3rdWaybills() { }) } +// @Title 取消三方运单 +// @Description 取消三方运单 +// @Param token header string true "认证token" +// @Param vendorWaybillID formData string true "订单ID" +// @Param waybillVendorID formData int true "订单所属的厂商ID" +// @Param reasonID formData int false "原因ID" +// @Param reason formData string false "取消原因" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /CancelWaybill [post] +func (c *OrderController) CancelWaybill() { + c.callCancelWaybill(func(params *tOrderCancelWaybillParams) (retVal interface{}, errCode string, err error) { + reasonID := params.ReasonID + if reasonID == 0 { + reasonID = partner.CancelWaybillReasonOther + } + err = defsch.FixedScheduler.CancelWaybillByID(params.Ctx, params.VendorWaybillID, params.WaybillVendorID, reasonID, params.Reason) + return retVal, "", err + }) +} + // @Title 得到门店订单信息 // @Description 得到门店订单信息 // @Param token header string true "认证token" @@ -193,12 +218,13 @@ func (c *OrderController) GetOrderInfo() { // @Param token header string true "认证token" // @Param vendorOrderID query string true "订单ID" // @Param vendorID query int true "订单所属的厂商ID" +// @Param isNotEnded query bool false "是否只是没有结束的运单" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult // @router /GetOrderWaybillInfo [get] func (c *OrderController) GetOrderWaybillInfo() { c.callGetOrderWaybillInfo(func(params *tOrderGetOrderWaybillInfoParams) (retVal interface{}, errCode string, err error) { - retVal, err = orderman.FixedOrderManager.GetOrderWaybillInfo(params.Ctx, params.VendorOrderID, params.VendorID) + retVal, err = orderman.FixedOrderManager.GetOrderWaybillInfo(params.Ctx, params.VendorOrderID, params.VendorID, params.IsNotEnded) return retVal, "", err }) } diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index ed03b1ba6..4ec8a84e1 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -565,6 +565,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "CancelWaybill", + Router: `/CancelWaybill`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "ConfirmReceiveGoods",