diff --git a/internal/api/mobile/order_preview/addr_update.go b/internal/api/mobile/order_preview/addr_update.go index 35ebd49..39cf3d6 100755 --- a/internal/api/mobile/order_preview/addr_update.go +++ b/internal/api/mobile/order_preview/addr_update.go @@ -58,7 +58,7 @@ func UpdateOrderAddr(c *gin.Context) { var goodsList []order_preview.GoodsDetail dbc.DB.Find(&goodsList, "order_id = ?", p.OrderID) for _, v := range goodsList { - if v.VendorID == 1800 || v.VendorID == 2000 || v.VendorID == 3000 { + if v.VendorID == 1800 || v.VendorID == 2000 || v.VendorID == 3000 || v.VendorID == 4000 { continue } if checkIsDelivery(addr.Province, addr.City, v.FreightID) == false { @@ -104,8 +104,9 @@ func UpdateOrderAddr(c *gin.Context) { jg := make(map[*goods.Sku]uint) ojg := make(map[*goods.Sku]uint) sjg := make(map[*goods.Sku]uint) + supplySkus := make(map[*goods.Sku]uint) for _, v := range goodsList { - if v.VendorID == 1800 || v.VendorID == 2000 || v.VendorID == 3000 { + if v.VendorID == 1800 || v.VendorID == 2000 || v.VendorID == 3000 || v.VendorID == 4000 { var sku goods.Sku { if err = dbc.DB.First(&sku, "id = ?", v.SkuID).Error; err != nil { @@ -120,6 +121,8 @@ func UpdateOrderAddr(c *gin.Context) { ojg[&sku] = v.Quantity case 3000: sjg[&sku] = v.Quantity + case 4000: + supplySkus[&sku] = v.Quantity } continue } @@ -198,6 +201,27 @@ func UpdateOrderAddr(c *gin.Context) { } } } + if len(supplySkus) > 0 { + unitMap, err := SupplyExpressFee(supplySkus, addr.GetAddress()) + if err != nil { + back.Fail(c, err.Error()) + return + } + for _, v := range goodsList { + if value, ok := unitMap[v.SkuID]; ok { + expressTotalFee = expressTotalFee.Add(value) + if err = tx.Model(&v).Updates(map[string]interface{}{ + "express_fee": value, + "actual_amount": v.ActualAmount.Sub(v.ExpressFee).Add(value).Round(2), + }).Error; err != nil { + back.Err(c, err.Error()) + tx.Rollback() + return + } + + } + } + } err = tx.Model(&previewOrderInfo).Updates(map[string]interface{}{ "express_total_fee": expressTotalFee, diff --git a/internal/api/mobile/order_preview/shopping_trolley_create.go b/internal/api/mobile/order_preview/shopping_trolley_create.go index 161c57a..38e1e32 100755 --- a/internal/api/mobile/order_preview/shopping_trolley_create.go +++ b/internal/api/mobile/order_preview/shopping_trolley_create.go @@ -1,6 +1,7 @@ package order_preview import ( + "errors" "fmt" "recook/configs" "recook/internal/back" @@ -13,6 +14,7 @@ import ( "recook/internal/model/vend" "recook/internal/v2/lib/jcook" "recook/internal/v2/lib/shama" + "recook/internal/v2/lib/supply" "recook/tools" "strconv" "time" @@ -94,9 +96,10 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) { goodsTotalAmount := decimal.NewFromFloat(0.0) goodsTotalCommission := decimal.NewFromFloat(0.0) preOrderGoodsList := make([]*order_preview.GoodsDetail, 0, 0) - jg := make(map[*goods.Sku]uint) // 自营商品计算运费 - ojg := make(map[*goods.Sku]uint) // pop商品计算运费 - sjg := make(map[*goods.Sku]uint) // 沙马供应链计算运费 + jg := make(map[*goods.Sku]uint) // 自营商品计算运费 + ojg := make(map[*goods.Sku]uint) // pop商品计算运费 + sjg := make(map[*goods.Sku]uint) // 沙马供应链计算运费 + supplySkus := make(map[*goods.Sku]uint) // 瑞库客供应链计算运费 cost := decimal.Zero { for _, v := range trolleyInfoList { @@ -126,8 +129,8 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) { } if sku.ThirdPartyType != 0 && !configs.IsProductionEnv() { - back.Fail(c, "测试服不支持购买") - return + //back.Fail(c, "测试服不支持购买") + //return } cost = cost.Add(sku.PurchasePrice.Mul(decimal.NewFromInt(int64(v.Quantity)))) if gs.VendorID == 1800 { @@ -141,6 +144,9 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) { if gs.VendorID == 3000 { sjg[&sku] = v.Quantity } + if gs.VendorID == 4000 { + supplySkus[&sku] = v.Quantity + } var promotionGoods promotion.Goods var promotionSku promotion.Sku @@ -241,7 +247,7 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) { goodsTotalAmount = goodsTotalAmount.Add(one.GoodsAmount) } } - if (len(jg) != 0 || len(ojg) != 0 || len(sjg) != 0) && p.Address == "" && defaultAddr.ID == 0 { + if (len(jg) != 0 || len(ojg) != 0 || len(sjg) != 0 || len(supplySkus) != 0) && p.Address == "" && defaultAddr.ID == 0 { back.Err(c, "请填写默认收货地址") return } @@ -251,7 +257,7 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) { IsAddrDelivery := true for _, v := range preOrderGoodsList { // 如果该地区不发货,不用计算运费了 - if v.VendorID == 1800 || v.VendorID == 2000 || v.VendorID == 3000 { + if v.VendorID == 1800 || v.VendorID == 2000 || v.VendorID == 3000 || v.VendorID == 4000 { continue } can, _, _ := computeExpressFeeWithPreviewGoods(v.Quantity, v, defaultAddr.Province, defaultAddr.City) @@ -264,7 +270,7 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) { } if IsAddrDelivery { // 如果是发货地区,计算每个商品的 for _, v := range preOrderGoodsList { // 如果该地区不发货,不用计算运费了 - if v.VendorID == 1800 || v.VendorID == 2000 || v.VendorID == 3000 { + if v.VendorID == 1800 || v.VendorID == 2000 || v.VendorID == 3000 || v.VendorID == 4000 { continue } _, expressFee, _ := computeExpressFeeWithPreviewGoods(v.Quantity, v, defaultAddr.Province, defaultAddr.City) @@ -319,6 +325,19 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) { } } } + if len(supplySkus) > 0 { + unitMap, err := SupplyExpressFee(supplySkus, p.Address) + if err != nil { + back.Fail(c, err.Error()) + return + } + for _, v := range preOrderGoodsList { + if value, ok := unitMap[v.SkuID]; ok { + v.ExpressFee = value + expressTotalFee = expressTotalFee.Add(value) + } + } + } } coinTotalAmount := decimal.NewFromFloat(0.0) @@ -513,3 +532,36 @@ func JdExpressFee(obj map[*goods.Sku]uint, address string) (map[uint]decimal.Dec } return unitMap, nil } + +// SupplyExpressFee @Title 处理运费 +func SupplyExpressFee(obj map[*goods.Sku]uint, address string) (map[uint]decimal.Decimal, error) { + var orderFreightFeeItems []supply.OrderFreightFeeItem + mThirdSku := map[string]goods.Sku{} + for k, v := range obj { + thirdSkuId, _ := strconv.ParseUint(k.ThirdPartySkuId, 10, 64) + orderFreightFeeItems = append(orderFreightFeeItems, supply.OrderFreightFeeItem{ + SkuId: uint(thirdSkuId), + Quantity: v, + Price: k.PurchasePrice, + }) + mThirdSku[k.ThirdPartySkuId] = *k + } + freightFee, err := supply.Api.Order.FreightFee(address, orderFreightFeeItems) + if err != nil { + return nil, err + } + unitMap := make(map[uint]decimal.Decimal) + for _, fee := range freightFee { + if fee.ErrCode == supply.ReplyOrderFreightFeeErrCodeErr { + return nil, errors.New(fee.ErrMsg) + } + skuFee := decimal.NewFromFloat(fee.FreightFee) + oneSkuFee := skuFee.Div(decimal.NewFromInt(int64(len(fee.SkuIds)))).Truncate(2) + for _, skuId := range fee.SkuIds { + skuFee = skuFee.Sub(oneSkuFee) + unitMap[mThirdSku[fmt.Sprintf("%d", skuId)].ID] = oneSkuFee + } + unitMap[mThirdSku[fmt.Sprintf("%d", fee.SkuIds[0])].ID] = oneSkuFee.Add(skuFee) + } + return unitMap, nil +}