package defsch import ( "fmt" "time" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner/delivery" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" ) 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) if savedOrderInfo != nil { order := savedOrderInfo.order err = s.cancelOtherWaybills(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) if err == nil { // todo if true { //order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled == 0 { if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore { if order.Status <= model.OrderStatusFinishedPickup { storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), order.StoreID, order.VendorID) phone := userName if err = err2; err == nil { phone = storeDetail.Tel1 } err = s.SelfDeliverDelivering(order, phone) } } else { if order.Status <= model.OrderStatusFinishedPickup { err = s.Swtich2SelfDeliver(order, userName) } else if order.VendorID == order.WaybillVendorID { // 状态为配送中,且是购物平台运单,不能转自送了 err = scheduler.ErrOrderStatusIsNotSuitable4CurOperation } } } } if err == nil { order.Status = model.OrderStatusDelivering order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled | model.OrderDeliveryFlagMaskPurcahseDisabled if err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order); err == nil { s.stopTimer(savedOrderInfo) globals.SugarLogger.Infof("SelfDeliveringAndUpdateStatus orderID:%s userName:%s successfully", vendorOrderID, userName) return err } } } else { err = scheduler.ErrCanNotFindOrder } globals.SugarLogger.Infof("SelfDeliveringAndUpdateStatus orderID:%s userName:%s error:%v", vendorOrderID, userName, err) return err }() }, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID)) return err } func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder) (err error) { if !(order.LockStatus != model.OrderStatusLocked && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) { err = fmt.Errorf("当前订单%s没有处于拣货完成且没有结束没有锁定的订单才能进行召唤配送操作", order.VendorOrderID) } else if s.IsOrderHasWaybill(order) { err = fmt.Errorf("当前订单%s已经有了有效的承运人%s了", order.VendorOrderID, jxutils.GetVendorName(order.WaybillVendorID)) } return err } func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, forceCreate bool) (bills []*model.Waybill, err error) { order := savedOrderInfo.order err = s.canOrderCreateWaybillNormally(order) if forceCreate || err == nil { err = nil feeHandler := delivery.DefCreateWaybillPolicy if forceCreate { feeHandler = delivery.NullCreateWaybillPolicy } if bills, err = s.CreateWaybillOnProviders(ctx, order, feeHandler); err == nil { if forceCreate { order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order) } if err == nil { if forceCreate { s.stopTimer(savedOrderInfo) } globals.SugarLogger.Debugf("CreateWaybillOnProviders4SavedOrder orderID:%s userName:%s successfully", order.VendorOrderID, ctx.GetUserName()) return bills, err } } } if err != nil { globals.SugarLogger.Debugf("CreateWaybillOnProviders4SavedOrder orderID:%s failed with error:%v", order.VendorOrderID, err) } return nil, err } func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int, forceCreate bool) (bills []*model.Waybill, err error) { jxutils.CallMsgHandler(func() { bills, err = func() (bills []*model.Waybill, err error) { userName := ctx.GetUserName() globals.SugarLogger.Debugf("CreateWaybillOnProvidersEx orderID:%s userName:%s", vendorOrderID, userName) if vendorID == model.VendorIDELM { return nil, fmt.Errorf("不要直接使用饿了么订单号,请使用相应的饿百订单号") } status := &model.OrderStatus{ RefVendorOrderID: vendorOrderID, RefVendorID: vendorID, } savedOrderInfo := s.loadSavedOrderFromMap(status, true) if savedOrderInfo != nil { order := savedOrderInfo.order if scheduler.StoreDeliveryTypeByStore != s.GetStoreDeliveryType(order, nil) && order.Status == model.OrderStatusFinishedPickup && time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute { return nil, fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier) } bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, forceCreate) } else { err = scheduler.ErrCanNotFindOrder } globals.SugarLogger.Infof("CreateWaybillOnProvidersEx orderID:%s userName:%s error:%v", vendorOrderID, userName, err) return bills, err }() }, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID)) return bills, err } // todo 这个函数可以和SelfDeliveringAndUpdateStatus合并 func (s *DefScheduler) CancelAll3rdWaybills(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isStopSchedule bool) (err error) { 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) if savedOrderInfo != nil { err = s.cancelOtherWaybills2(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive) } else { err = scheduler.ErrCanNotFindOrder } globals.SugarLogger.Infof("CancelAll3rdWaybills orderID:%s userName:%s error:%v", vendorOrderID, ctx.GetUserName(), err) if err == nil && isStopSchedule { order := savedOrderInfo.order order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled if err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order); err == nil { s.stopTimer(savedOrderInfo) globals.SugarLogger.Infof("CancelAll3rdWaybills orderID:%s userName:%s successfully", vendorOrderID, ctx.GetUserName()) } } return err }() }, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID)) return err }