- 调整QueryOrderWaybillFeeInfo
This commit is contained in:
@@ -157,19 +157,25 @@ func (c *OrderManager) GetOrderInfo(ctx *jxcontext.Context, vendorOrderID string
|
|||||||
return nil, err
|
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)
|
globals.SugarLogger.Debugf("GetOrderWaybillInfo orderID:%s", vendorOrderID)
|
||||||
db := orm.NewOrm()
|
db := dao.GetDB()
|
||||||
_, err = db.Raw(`
|
sql := `
|
||||||
SELECT t1.*
|
SELECT t1.*
|
||||||
FROM waybill t1
|
FROM waybill t1
|
||||||
WHERE t1.vendor_order_id = ? AND order_vendor_id = ?
|
WHERE t1.vendor_order_id = ? AND order_vendor_id = ?
|
||||||
`, vendorOrderID, vendorID).QueryRows(&bills)
|
`
|
||||||
if err == nil {
|
sqlParams := []interface{}{
|
||||||
return bills, nil
|
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)
|
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) {
|
func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toDateStr string) (excelContent []byte, err error) {
|
||||||
|
|||||||
@@ -13,16 +13,23 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/globals"
|
"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()
|
userName := ctx.GetUserName()
|
||||||
globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s", order.VendorOrderID, userName)
|
globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s", order.VendorOrderID, userName)
|
||||||
storeCourierList, err := dao.GetStoreCourierList(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), model.StoreStatusOpened)
|
storeCourierList, err := dao.GetStoreCourierList(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), model.StoreStatusOpened)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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
|
var errList []string
|
||||||
for _, storeCourier := range storeCourierList {
|
for _, storeCourier := range storeCourierList {
|
||||||
|
if courierVendorIDMap == nil || courierVendorIDMap[storeCourier.VendorID] {
|
||||||
if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil && handler.Use4CreateWaybill {
|
if handler := partner.GetDeliveryPlatformFromVendorID(storeCourier.VendorID); handler != nil && handler.Use4CreateWaybill {
|
||||||
courierVendorID := storeCourier.VendorID
|
courierVendorID := storeCourier.VendorID
|
||||||
if order.VendorID != model.VendorIDWSC || courierVendorID != model.VendorIDDada { // 达达作为微商城的自有配送,不参与配送竞争
|
if order.VendorID != model.VendorIDWSC || courierVendorID != model.VendorIDDada { // 达达作为微商城的自有配送,不参与配送竞争
|
||||||
@@ -40,6 +47,7 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if len(bills) > 0 {
|
if len(bills) > 0 {
|
||||||
err = nil
|
err = nil
|
||||||
} else if len(errList) == 0 {
|
} else if len(errList) == 0 {
|
||||||
@@ -182,46 +190,10 @@ func (c *BaseScheduler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *BaseScheduler) QueryOrderWaybillFeeInfoEx(ctx *jxcontext.Context, vendorOrderID string, vendorID int) (deliveryFeeMap map[int]*partner.WaybillFeeInfo, err error) {
|
func (c *BaseScheduler) CancelWaybillByID(ctx *jxcontext.Context, vendorWaybillID string, waybillVendorID int, cancelReasonID int, cancelReason string) (err error) {
|
||||||
jxutils.CallMsgHandler(func() {
|
bill, err := partner.CurOrderManager.LoadWaybill(vendorWaybillID, waybillVendorID)
|
||||||
deliveryFeeMap, err = func() (deliveryFeeMap map[int]*partner.WaybillFeeInfo, err error) {
|
if err == nil {
|
||||||
userName := ctx.GetUserName()
|
err = c.CancelWaybill(bill, cancelReasonID, cancelReason)
|
||||||
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)
|
return err
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ type WatchOrderInfo struct {
|
|||||||
timerStatusType int // 0表示订单,1表示运单
|
timerStatusType int // 0表示订单,1表示运单
|
||||||
timerStatus int
|
timerStatus int
|
||||||
timer *time.Timer
|
timer *time.Timer
|
||||||
|
timerTime time.Time
|
||||||
|
|
||||||
retryCount int // 失败后尝试的次数,调试阶段可能出现死循化,阻止这种情况发生
|
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 {
|
if status.Status >= model.OrderStatusEndBegin {
|
||||||
s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status))
|
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)
|
globals.SugarLogger.Infof("OnWaybillStatusChanged orderID:%s purchase platform waybill arrvied later, may cause problem", order.VendorOrderID)
|
||||||
}
|
}
|
||||||
s.updateOrderByBill(order, bill, false)
|
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 {
|
if !s.IsOrderPlatformWaybill(bill) && savedOrderInfo.storeDeliveryType != scheduler.StoreDeliveryTypeByStore {
|
||||||
s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second)
|
s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second)
|
||||||
} else if s.IsSpecialOrderPlatformWaybill(bill) {
|
} else if s.IsSpecialOrderPlatformWaybill(bill) {
|
||||||
@@ -500,7 +501,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
|
|||||||
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
|
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
|
||||||
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
|
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
|
||||||
savedOrderInfo.retryCount++
|
savedOrderInfo.retryCount++
|
||||||
_, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, false, 0, 0)
|
_, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, false, 0, 0)
|
||||||
} else {
|
} else {
|
||||||
err = fmt.Errorf("订单:%s已经自动创建过了%d次运单,请人工处理", order.VendorOrderID, savedOrderInfo.retryCount)
|
err = fmt.Errorf("订单:%s已经自动创建过了%d次运单,请人工处理", order.VendorOrderID, savedOrderInfo.retryCount)
|
||||||
globals.SugarLogger.Infof("createWaybillOn3rdProviders [运营]同一订单orderID:%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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
func (s *DefScheduler) cancelOtherWaybillsCheckOrderDeliveryFlag(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("cancelOtherWaybillsCheckOrderDeliveryFlag, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep)
|
||||||
if (savedOrderInfo.order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
|
if (savedOrderInfo.order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
|
||||||
err = s.cancelOtherWaybills2(savedOrderInfo, bill2Keep, cancelReasonID, cancelReason)
|
err = s.cancelOtherWaybills(savedOrderInfo, bill2Keep, cancelReasonID, cancelReason)
|
||||||
} else {
|
} 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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DefScheduler) cancelOtherWaybills2(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
||||||
globals.SugarLogger.Debugf("cancelOtherWaybills2, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep)
|
globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep)
|
||||||
toBeDeleted := []*model.Waybill{}
|
toBeDeleted := []*model.Waybill{}
|
||||||
for _, v := range savedOrderInfo.waybills {
|
for _, v := range savedOrderInfo.waybills {
|
||||||
if !s.IsOrderPlatformWaybill(v) && (bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) {
|
if v.Status < model.WaybillStatusEndBegin &&
|
||||||
err2 := s.ProxyCancelWaybill(savedOrderInfo.order, v, cancelReasonID, cancelReason)
|
!s.IsOrderPlatformWaybill(v) &&
|
||||||
|
(bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) {
|
||||||
|
err2 := s.CancelWaybill(v, cancelReasonID, cancelReason)
|
||||||
if err2 == nil {
|
if err2 == nil {
|
||||||
toBeDeleted = append(toBeDeleted, v)
|
toBeDeleted = append(toBeDeleted, v)
|
||||||
}
|
}
|
||||||
@@ -626,7 +629,7 @@ func (s *DefScheduler) stopTimer(savedOrderInfo *WatchOrderInfo) {
|
|||||||
if savedOrderInfo.timer != nil {
|
if savedOrderInfo.timer != nil {
|
||||||
globals.SugarLogger.Debugf("stopTimer orderID:%s", savedOrderInfo.order.VendorOrderID)
|
globals.SugarLogger.Debugf("stopTimer orderID:%s", savedOrderInfo.order.VendorOrderID)
|
||||||
savedOrderInfo.timer.Stop()
|
savedOrderInfo.timer.Stop()
|
||||||
savedOrderInfo.timerStatus = 0
|
savedOrderInfo.timerStatus = model.OrderStatusUnknown
|
||||||
savedOrderInfo.timerStatusType = scheduler.TimerStatusTypeUnknown
|
savedOrderInfo.timerStatusType = scheduler.TimerStatusTypeUnknown
|
||||||
savedOrderInfo.timer = nil
|
savedOrderInfo.timer = nil
|
||||||
}
|
}
|
||||||
@@ -669,6 +672,7 @@ func (s *DefScheduler) resetTimer(savedOrderInfo *WatchOrderInfo, bill *model.Wa
|
|||||||
}
|
}
|
||||||
savedOrderInfo.timerStatusType = statusType
|
savedOrderInfo.timerStatusType = statusType
|
||||||
savedOrderInfo.timerStatus = status
|
savedOrderInfo.timerStatus = status
|
||||||
|
savedOrderInfo.timerTime = time.Now().Add(timeout)
|
||||||
savedOrderInfo.timer = utils.AfterFuncWithRecover(timeout, func() {
|
savedOrderInfo.timer = utils.AfterFuncWithRecover(timeout, func() {
|
||||||
jxutils.CallMsgHandlerAsync(func() {
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
globals.SugarLogger.Debugf("fire timer:%s, orderID:%s", timerName, order.VendorOrderID)
|
globals.SugarLogger.Debugf("fire timer:%s, orderID:%s", timerName, order.VendorOrderID)
|
||||||
|
|||||||
@@ -15,18 +15,21 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/globals"
|
"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) {
|
func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, vendorOrderID string, vendorID int, userName string) (err error) {
|
||||||
jxutils.CallMsgHandler(func() {
|
jxutils.CallMsgHandler(func() {
|
||||||
err = func() (err error) {
|
err = func() (err error) {
|
||||||
globals.SugarLogger.Infof("SelfDeliveringAndUpdateStatus orderID:%s userName:%s", vendorOrderID, userName)
|
globals.SugarLogger.Infof("SelfDeliveringAndUpdateStatus orderID:%s userName:%s", vendorOrderID, userName)
|
||||||
status := &model.OrderStatus{
|
savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true)
|
||||||
RefVendorOrderID: vendorOrderID,
|
|
||||||
RefVendorID: vendorID,
|
|
||||||
}
|
|
||||||
savedOrderInfo := s.loadSavedOrderFromMap(status, true)
|
|
||||||
if savedOrderInfo != nil {
|
if savedOrderInfo != nil {
|
||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
err = s.cancelOtherWaybills(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive)
|
err = s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
// todo
|
// todo
|
||||||
if true { //order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled == 0 {
|
if true { //order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled == 0 {
|
||||||
@@ -76,7 +79,7 @@ func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder) (e
|
|||||||
return err
|
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
|
order := savedOrderInfo.order
|
||||||
err = s.canOrderCreateWaybillNormally(order)
|
err = s.canOrderCreateWaybillNormally(order)
|
||||||
if forceCreate || err == nil {
|
if forceCreate || err == nil {
|
||||||
@@ -87,7 +90,7 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex
|
|||||||
} else if maxAddFee != 0 {
|
} else if maxAddFee != 0 {
|
||||||
feeHandler = delivery.CreateWaybillPolicy(maxDiffFee2Mtps, maxAddFee)
|
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 {
|
if forceCreate {
|
||||||
order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled
|
order.DeliveryFlag |= model.OrderDeliveryFlagMaskScheduleDisabled
|
||||||
err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order)
|
err = partner.CurOrderManager.UpdateOrderStatusAndFlag(order)
|
||||||
@@ -107,7 +110,7 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex
|
|||||||
return nil, err
|
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() {
|
jxutils.CallMsgHandler(func() {
|
||||||
bills, err = func() (bills []*model.Waybill, err error) {
|
bills, err = func() (bills []*model.Waybill, err error) {
|
||||||
userName := ctx.GetUserName()
|
userName := ctx.GetUserName()
|
||||||
@@ -115,11 +118,7 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor
|
|||||||
if vendorID == model.VendorIDELM {
|
if vendorID == model.VendorIDELM {
|
||||||
return nil, fmt.Errorf("不要直接使用饿了么订单号,请使用相应的饿百订单号")
|
return nil, fmt.Errorf("不要直接使用饿了么订单号,请使用相应的饿百订单号")
|
||||||
}
|
}
|
||||||
status := &model.OrderStatus{
|
savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true)
|
||||||
RefVendorOrderID: vendorOrderID,
|
|
||||||
RefVendorID: vendorID,
|
|
||||||
}
|
|
||||||
savedOrderInfo := s.loadSavedOrderFromMap(status, true)
|
|
||||||
if savedOrderInfo != nil {
|
if savedOrderInfo != nil {
|
||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
if scheduler.StoreDeliveryTypeByStore != s.GetStoreDeliveryType(order, nil) &&
|
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 {
|
time.Now().Sub(order.StatusTime) < minMinute2Schedule3rdCarrier*time.Minute {
|
||||||
return nil, fmt.Errorf("非自配送门店转3方配送至少要求拣货完成后%d分钟才能操作", minMinute2Schedule3rdCarrier)
|
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 {
|
} else {
|
||||||
err = scheduler.ErrCanNotFindOrder
|
err = scheduler.ErrCanNotFindOrder
|
||||||
}
|
}
|
||||||
@@ -143,13 +142,9 @@ func (s *DefScheduler) CancelAll3rdWaybills(ctx *jxcontext.Context, vendorOrderI
|
|||||||
jxutils.CallMsgHandler(func() {
|
jxutils.CallMsgHandler(func() {
|
||||||
err = func() (err error) {
|
err = func() (err error) {
|
||||||
globals.SugarLogger.Infof("CancelAll3rdWaybills orderID:%s userName:%s", vendorOrderID, ctx.GetUserName())
|
globals.SugarLogger.Infof("CancelAll3rdWaybills orderID:%s userName:%s", vendorOrderID, ctx.GetUserName())
|
||||||
status := &model.OrderStatus{
|
savedOrderInfo := s.loadSavedOrderByID(vendorOrderID, vendorID, true)
|
||||||
RefVendorOrderID: vendorOrderID,
|
|
||||||
RefVendorID: vendorID,
|
|
||||||
}
|
|
||||||
savedOrderInfo := s.loadSavedOrderFromMap(status, true)
|
|
||||||
if savedOrderInfo != nil {
|
if savedOrderInfo != nil {
|
||||||
err = s.cancelOtherWaybills2(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive)
|
err = s.cancelOtherWaybills(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive)
|
||||||
} else {
|
} else {
|
||||||
err = scheduler.ErrCanNotFindOrder
|
err = scheduler.ErrCanNotFindOrder
|
||||||
}
|
}
|
||||||
@@ -167,3 +162,80 @@ func (s *DefScheduler) CancelAll3rdWaybills(ctx *jxcontext.Context, vendorOrderI
|
|||||||
}, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID))
|
}, jxutils.ComposeUniversalOrderID(vendorOrderID, vendorID))
|
||||||
return err
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -63,11 +63,21 @@ type StatusActionParams struct {
|
|||||||
TimeoutGap int // 以秒为单位的随机时间,0在GetStatusActionConfig返回时表示不修改缺省
|
TimeoutGap int // 以秒为单位的随机时间,0在GetStatusActionConfig返回时表示不修改缺省
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
WaybillFeeErrCodeCourierNotOpen = 1 //配送门店没有启用
|
||||||
|
WaybillFeeErrCodeCourierNotSupported = 2 //配送门店不被系统支持
|
||||||
|
WaybillFeeErrCodeCourierForbidden = 3 //配送门店内部禁用
|
||||||
|
WaybillFeeErrCodeCourierOthers = 10 //其它错误
|
||||||
|
)
|
||||||
|
|
||||||
type WaybillFeeInfo struct {
|
type WaybillFeeInfo struct {
|
||||||
|
ErrCode int `json:"errCode"`
|
||||||
ErrStr string `json:"errStr"`
|
ErrStr string `json:"errStr"`
|
||||||
RefDeliveryFee int64 `json:"refDeliveryFee"`
|
RefDeliveryFee int64 `json:"refDeliveryFee"`
|
||||||
RefAddFee int64 `json:"refAddFee"`
|
RefAddFee int64 `json:"refAddFee"`
|
||||||
DeliveryFee int64 `json:"deliveryFee"`
|
DeliveryFee int64 `json:"deliveryFee"`
|
||||||
|
TimeoutSecond int `json:"timeoutSecond"` // 系统会自动发运单的倒计时
|
||||||
|
Waybill *model.Waybill `json:"waybill"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StatusActionParams) GetRefTimeout(statusTime time.Time) (timeout time.Duration) {
|
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)
|
SaveOrderFinancialInfo(order *model.OrderFinancial, operation string) (err error)
|
||||||
SaveAfsOrderFinancialInfo(afsOrder *model.AfsOrder) (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 {
|
type IStoreManager interface {
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ func (c *OrderController) QueryOrderWaybillFeeInfo() {
|
|||||||
// @Param token header string true "认证token"
|
// @Param token header string true "认证token"
|
||||||
// @Param vendorOrderID formData string true "订单ID"
|
// @Param vendorOrderID formData string true "订单ID"
|
||||||
// @Param vendorID formData int true "订单所属的厂商ID"
|
// @Param vendorID formData int true "订单所属的厂商ID"
|
||||||
|
// @Param courierVendorIDs formData string false "运单厂商ID(缺省全部)"
|
||||||
// @Param forceCreate formData bool false "是否强制创建(忽略订单状态检查及其它参数)"
|
// @Param forceCreate formData bool false "是否强制创建(忽略订单状态检查及其它参数)"
|
||||||
// @Param maxAddFee formData int false "最大加价,单位为分(为0时为缺省值)"
|
// @Param maxAddFee formData int false "最大加价,单位为分(为0时为缺省值)"
|
||||||
// @Param maxDiffFee2Mtps formData int false "最大与美团配送差价,单位为分(maxAddFee不为0时才可能有效)"
|
// @Param maxDiffFee2Mtps formData int false "最大与美团配送差价,单位为分(maxAddFee不为0时才可能有效)"
|
||||||
@@ -106,7 +107,10 @@ func (c *OrderController) QueryOrderWaybillFeeInfo() {
|
|||||||
// @router /CreateWaybillOnProviders [post]
|
// @router /CreateWaybillOnProviders [post]
|
||||||
func (c *OrderController) CreateWaybillOnProviders() {
|
func (c *OrderController) CreateWaybillOnProviders() {
|
||||||
c.callCreateWaybillOnProviders(func(params *tOrderCreateWaybillOnProvidersParams) (retVal interface{}, errCode string, err error) {
|
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
|
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 得到门店订单信息
|
// @Title 得到门店订单信息
|
||||||
// @Description 得到门店订单信息
|
// @Description 得到门店订单信息
|
||||||
// @Param token header string true "认证token"
|
// @Param token header string true "认证token"
|
||||||
@@ -193,12 +218,13 @@ func (c *OrderController) GetOrderInfo() {
|
|||||||
// @Param token header string true "认证token"
|
// @Param token header string true "认证token"
|
||||||
// @Param vendorOrderID query string true "订单ID"
|
// @Param vendorOrderID query string true "订单ID"
|
||||||
// @Param vendorID query int true "订单所属的厂商ID"
|
// @Param vendorID query int true "订单所属的厂商ID"
|
||||||
|
// @Param isNotEnded query bool false "是否只是没有结束的运单"
|
||||||
// @Success 200 {object} controllers.CallResult
|
// @Success 200 {object} controllers.CallResult
|
||||||
// @Failure 200 {object} controllers.CallResult
|
// @Failure 200 {object} controllers.CallResult
|
||||||
// @router /GetOrderWaybillInfo [get]
|
// @router /GetOrderWaybillInfo [get]
|
||||||
func (c *OrderController) GetOrderWaybillInfo() {
|
func (c *OrderController) GetOrderWaybillInfo() {
|
||||||
c.callGetOrderWaybillInfo(func(params *tOrderGetOrderWaybillInfoParams) (retVal interface{}, errCode string, err error) {
|
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
|
return retVal, "", err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -565,6 +565,15 @@ func init() {
|
|||||||
Filters: nil,
|
Filters: nil,
|
||||||
Params: 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.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
|
||||||
beego.ControllerComments{
|
beego.ControllerComments{
|
||||||
Method: "ConfirmReceiveGoods",
|
Method: "ConfirmReceiveGoods",
|
||||||
|
|||||||
Reference in New Issue
Block a user