From 877109aee0e21b5983dcb7b4ccf8b6b396c88bdd Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 30 Apr 2019 15:41:51 +0800 Subject: [PATCH] - QueryOrderWaybillFeeInfo --- .../scheduler/basesch/basesch_ext.go | 44 +++++++ business/partner/delivery/dada/waybill.go | 111 +++++++++++------- business/partner/delivery/mtps/waybill.go | 12 ++ business/partner/partner.go | 8 ++ controllers/jx_order.go | 15 +++ routers/commentsRouter_controllers.go | 9 ++ 6 files changed, 154 insertions(+), 45 deletions(-) diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index 2219bc45b..7f7b352a2 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -179,3 +179,47 @@ 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 +} diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 1061337b8..0efa09fed 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -99,17 +99,23 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal return retVal } -// IDeliveryPlatformHandler -func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) { +func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) { db := dao.GetDB() - deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) - if err != nil { - return nil, err + deliveryFeeInfo = &partner.WaybillFeeInfo{} + deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = delivery.CalculateOrderDeliveryFee(order, time.Now(), db) + billParams, addParams, err := c.getBillParams(db, order) + if err == nil { + var result *dadaapi.CreateOrderResponse + if result, err = api.DadaAPI.QueryDeliverFee(billParams, addParams); err != nil { + return nil, err + } + deliveryFeeInfo.DeliveryFee = jxutils.StandardPrice2Int(result.Fee) } - if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDDada); err != nil { - return nil, err - } - billParams := &dadaapi.OperateOrderRequiredParams{ + return deliveryFeeInfo, err +} + +func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder) (billParams *dadaapi.OperateOrderRequiredParams, addParams map[string]interface{}, err error) { + billParams = &dadaapi.OperateOrderRequiredParams{ // ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的 OriginID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), CargoPrice: jxutils.IntPrice2Standard(limitOrderPrice(order.ActualPayPrice)), @@ -121,7 +127,7 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner. if billParams.ShopNo, err = c.getDadaShopID(order, db); err == nil { if billParams.CityCode, err = c.getDataCityCodeFromOrder(order, db); err == nil { billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) - addParams := map[string]interface{}{ + addParams = map[string]interface{}{ "info": fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4(order.BuyerComment)), // "origin_mark": model.VendorNames[order.VendorID], // 订单来源标示(该字段可以显示在达达app订单详情页面,只支持字母,最大长度为10) // "origin_mark_no": fmt.Sprintf("%d", order.OrderSeq), // 订单来源编号(该字段可以显示在达达app订单详情页面,支持字母和数字,最大长度为30) @@ -129,11 +135,27 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner. "cargo_weight": jxutils.IntWeight2Float(limitOrderWeight(order.Weight)), "cargo_num": order.GoodsCount, } + } + } + return billParams, addParams, err +} - if globals.EnableStoreWrite { - // 达达要求第二次创建运单,调用函数不同。所以查找两天内有无相同订单号的运单 - var waybillList []*model.Waybill - err2 := dao.GetRows(db, &waybillList, ` +// IDeliveryPlatformHandler +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) { + db := dao.GetDB() + deliveryFee, addFee, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db) + if err != nil { + return nil, err + } + if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, deliveryFee, order, model.VendorIDDada); err != nil { + return nil, err + } + billParams, addParams, err := c.getBillParams(db, order) + if err == nil { + if globals.EnableStoreWrite { + // 达达要求第二次创建运单,调用函数不同。所以查找两天内有无相同订单号的运单 + var waybillList []*model.Waybill + err2 := dao.GetRows(db, &waybillList, ` SELECT * FROM waybill WHERE waybill_created_at > DATE_ADD(NOW(), interval -2 day) @@ -141,39 +163,38 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner. AND waybill_vendor_id = ? ORDER BY id DESC `, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), model.VendorIDDada) - var result *dadaapi.CreateOrderResponse - if err = err2; err == nil && len(waybillList) > 0 && waybillList[0].Status != model.WaybillStatusFailed { - globals.SugarLogger.Debugf("CreateWaybill orderID:%s len(waybillList)=%d use ReaddOrder", order.VendorOrderID, len(waybillList)) - result, err = api.DadaAPI.ReaddOrder(billParams, addParams) - } else { - if err != nil { - globals.SugarLogger.Warnf("CreateWaybill orderID:%s error:%v", order.VendorOrderID, err) - } - if false { - result, err = api.DadaAPI.AddOrder(billParams, addParams) - } else { - if result, err = api.DadaAPI.QueryDeliverFee(billParams, addParams); err != nil { - return nil, err - } - dadaFee := jxutils.StandardPrice2Int(result.Fee) - if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, dadaFee, order, model.VendorIDDada); err != nil { - return nil, err - } - err = api.DadaAPI.AddOrderAfterQuery(result.DeliveryNo) - } - } - if err == nil && result != nil { - bill = &model.Waybill{ - VendorOrderID: order.VendorOrderID, - OrderVendorID: order.VendorID, - WaybillVendorID: model.VendorIDDada, - DesiredFee: deliveryFee, - ActualFee: jxutils.StandardPrice2Int(result.Fee), - } - } + var result *dadaapi.CreateOrderResponse + if err = err2; err == nil && len(waybillList) > 0 && waybillList[0].Status != model.WaybillStatusFailed { + globals.SugarLogger.Debugf("CreateWaybill orderID:%s len(waybillList)=%d use ReaddOrder", order.VendorOrderID, len(waybillList)) + result, err = api.DadaAPI.ReaddOrder(billParams, addParams) } else { - err = fmt.Errorf("测试环境不能真正创建运单") + if err != nil { + globals.SugarLogger.Warnf("CreateWaybill orderID:%s error:%v", order.VendorOrderID, err) + } + if false { + result, err = api.DadaAPI.AddOrder(billParams, addParams) + } else { + if result, err = api.DadaAPI.QueryDeliverFee(billParams, addParams); err != nil { + return nil, err + } + dadaFee := jxutils.StandardPrice2Int(result.Fee) + if err = delivery.CallCreateWaybillPolicy(policy, deliveryFee, addFee, dadaFee, order, model.VendorIDDada); err != nil { + return nil, err + } + err = api.DadaAPI.AddOrderAfterQuery(result.DeliveryNo) + } } + if err == nil && result != nil { + bill = &model.Waybill{ + VendorOrderID: order.VendorOrderID, + OrderVendorID: order.VendorID, + WaybillVendorID: model.VendorIDDada, + DesiredFee: deliveryFee, + ActualFee: jxutils.StandardPrice2Int(result.Fee), + } + } + } else { + err = fmt.Errorf("测试环境不能真正创建运单") } } return bill, err diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 41a78e228..09c75ee62 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -113,6 +113,18 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (re return retVal } +func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) { + db := dao.GetDB() + deliveryFeeInfo = &partner.WaybillFeeInfo{} + deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = delivery.CalculateOrderDeliveryFee(order, time.Now(), db) + if err == nil { + if _, err = c.getMTPSShopID(order, db); err == nil { + deliveryFeeInfo.DeliveryFee = deliveryFeeInfo.RefDeliveryFee + } + } + return deliveryFeeInfo, err +} + // IDeliveryPlatformHandler func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy partner.CreateWaybillPolicy) (bill *model.Waybill, err error) { db := dao.GetDB() diff --git a/business/partner/partner.go b/business/partner/partner.go index da2e7c53c..670f51c08 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -63,6 +63,13 @@ type StatusActionParams struct { TimeoutGap int // 以秒为单位的随机时间,0在GetStatusActionConfig返回时表示不修改缺省 } +type WaybillFeeInfo struct { + ErrStr string `json:"errStr"` + RefDeliveryFee int64 `json:"refDeliveryFee"` + RefAddFee int64 `json:"refAddFee"` + DeliveryFee int64 `json:"deliveryFee"` +} + func (s *StatusActionParams) GetRefTimeout(statusTime time.Time) (timeout time.Duration) { switch s.TimerType { case TimerTypeBaseNow: @@ -220,6 +227,7 @@ type IDeliveryPlatformHandler interface { CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) GetVendorID() int + GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *WaybillFeeInfo, err error) } type IPrinterHandler interface { diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 74ab71432..e5a24d713 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -78,6 +78,21 @@ func (c *OrderController) SelfDelivered() { }) } +// @Title 查询三方运单费用信息 +// @Description 查询三方运单费用信息 +// @Param token header string true "认证token" +// @Param vendorOrderID query string true "订单ID" +// @Param vendorID query int true "订单所属的厂商ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /QueryOrderWaybillFeeInfo [get] +func (c *OrderController) QueryOrderWaybillFeeInfo() { + c.callQueryOrderWaybillFeeInfo(func(params *tOrderQueryOrderWaybillFeeInfoParams) (retVal interface{}, errCode string, err error) { + retVal, err = defsch.FixedScheduler.QueryOrderWaybillFeeInfoEx(params.Ctx, params.VendorOrderID, params.VendorID) + return retVal, "", err + }) +} + // @Title 创建三方运单 // @Description 创建三方运单 // @Param token header string true "认证token" diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 1261ef2b0..ed03b1ba6 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -691,6 +691,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: "QueryOrderWaybillFeeInfo", + Router: `/QueryOrderWaybillFeeInfo`, + AllowHTTPMethods: []string{"get"}, + 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: "RefreshOrderRealMobile",