From a8125a568ff9d7552f3ab55267fdaa14c3e04f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Tue, 17 Mar 2020 16:45:29 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E6=96=99=E8=AE=A2=E5=8D=95=E6=8B=86?= =?UTF-8?q?=E5=8D=95=E7=BB=88=E6=9E=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/purchase/jx/localjx/order.go | 141 +++++++----------- 1 file changed, 58 insertions(+), 83 deletions(-) diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 2bdb90de2..a51dbdb26 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -573,6 +573,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 jxSku2 := *jxSku jxSku2.SalePrice = jxSku.SalePrice jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/100))) + outJxOrder.Weight += jxSku2.Count * jxSku2.Weight jxSku.SalePrice = 1 jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 100))) outJxOrder.Skus = append(outJxOrder.Skus, jxSku) @@ -597,6 +598,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 jxSku2 := *jxSku jxSku2.SalePrice = jxSku.SalePrice jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/200))) + outJxOrder.Weight += jxSku2.Count * jxSku2.Weight jxSku.SalePrice = 1 jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 200))) outJxOrder.Skus = append(outJxOrder.Skus, jxSku) @@ -643,21 +645,12 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 //要求配送人姓名填门店名 deliveryAddress.ConsigneeName = storeDetail2.Name outJxOrder.FromStoreID = fromStoreID - ///物料订单的配送费计算,注释的是分包之后计算配送费,但后来还是直接算不分包之前的总配送费 ///规则为: 配送费用规则。起价5元(含2kg),之后每kg+2元,不足1kg按1kg计算。 - // if outJxOrder.Weight > 5000 { - // _, freightPrice, err := tryToSplitMatterOrder(outJxOrder) - // if err != nil { - // return nil, nil, err - // } - // outJxOrder.FreightPrice = int64(freightPrice) - // } else { if outJxOrder.Weight <= 2000 { outJxOrder.FreightPrice = 500 } else { outJxOrder.FreightPrice = utils.Float64TwoInt64(500 + math.Ceil((utils.Int2Float64(outJxOrder.Weight)-2000)/1000)*200) } - // } } else { if outJxOrder.FreightPrice > specialFreightPrice { outJxOrder.FreightPrice = specialFreightPrice @@ -857,8 +850,10 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) { } else { //如果重量超过5kg则需要进行拆单分包,商品分包规则。最后一个包不超过5kg,其他包不超过3kg jxOrder := &JxOrderInfo{} jxOrder.StoreID = order.StoreID + weight := 0 var skus []*JxSkuInfo for _, v := range orderSkus { + weight += v.Weight * v.Count sku := &JxSkuInfo{} sku.SkuID = v.SkuID sku.SalePrice = v.SalePrice @@ -868,6 +863,7 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) { skus = append(skus, sku) } jxOrder.Skus = skus + jxOrder.Weight = weight outOrders, _, _ := tryToSplitMatterOrder(jxOrder) //以下为仿照CreateOrder,改了一些参数 for k, v := range outOrders { @@ -1299,9 +1295,8 @@ func tryToSplitMatterOrder(jxOrder *JxOrderInfo) (outOrders []*JxOrderInfo, frei var ( skus = jxOrder.Skus weightList []*JxSkuInfo2 - flag = true ) - //我的思路为把所有商品依次按重量销量从大到小排列,然后第一个包尽量分出5kg,后面分出3kg + //我的思路为把所有商品依次按重量销量从大到小排列,然后第一个包尽量分出3kg,后面分出5kg //但是我把JxSkuInfo放进list的时候,想根据一个参数GroupSign判断是否这个商品已经分出去了 //但是在list中同一个商品通过以下方式放进去的地址是一样的,我改了一个商品的GroupSign,所有的都变了,所以只有分出一个JxSkuInfo2去弄。。 //要做优化的话更好 @@ -1326,9 +1321,10 @@ func tryToSplitMatterOrder(jxOrder *JxOrderInfo) (outOrders []*JxOrderInfo, frei } } } + weight := jxOrder.Weight for { //每拿出一组就删掉list里的值 - outOrders = append(outOrders, loop(weightList, jxOrder, flag)) + outOrders = append(outOrders, loop2(weightList, jxOrder.StoreID, &weight)) for i := 0; i < len(weightList); { if weightList[i].GroupSign { var weightList3 []*JxSkuInfo2 @@ -1338,84 +1334,13 @@ func tryToSplitMatterOrder(jxOrder *JxOrderInfo) (outOrders []*JxOrderInfo, frei i++ } } - flag = false if len(weightList) == 0 { break } } - // for _, v := range outOrders { - // if v.Weight <= 2000 { - // freightPrice += 500 - // } else { - // freightPrice += int(utils.Float64TwoInt64(500 + math.Ceil((utils.Int2Float64(v.Weight)-2000)/1000)*200)) - // } - // } return outOrders, freightPrice, err } -//商品分包规则。最后一个包不超过5kg,其他包不超过3kg -// 举例1:5.1kg,分为 2.5kg,2.6kg,确保每个包不超过3kg,最后一个包不超过5kg -// 举例2:4kg,分为4kg -// 举例3:10kg,分为 3kg,3kg,4kg -// 举例4:8.1kg,分为 3kg,3kg,2.1kg ; 不能分为3kg,5.1kg -//sum5表示5kg的计算 -//sum3表示3kg的计算 -//处理过程都是一样的,没单独拿一个函数出来了 -func loop(weightList []*JxSkuInfo2, jxOrder *JxOrderInfo, flag bool) (outOrder *JxOrderInfo) { - outOrder = &JxOrderInfo{} - outOrder.StoreID = jxOrder.StoreID - sum5 := 0 - sum3 := 0 - for i := 0; i < len(weightList); i++ { - if flag { - if weightList[i].Weight+sum5 <= 5000 { - sum5 += weightList[i].Weight - weightList[i].GroupSign = true - outOrder.Weight += weightList[i].Weight - if len(outOrder.Skus) > 0 { - for _, v := range outOrder.Skus { - if v.SkuID == weightList[i].SkuID { - v.Count++ - } else { - outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightList[i])) - } - } - } else { - outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightList[i])) - } - } else { - if sum5 >= 5000 { - break - } - continue - } - } else { - if weightList[i].Weight+sum3 <= 3000 { - sum3 += weightList[i].Weight - weightList[i].GroupSign = true - outOrder.Weight += weightList[i].Weight - if len(outOrder.Skus) > 0 { - for _, v := range outOrder.Skus { - if v.SkuID == weightList[i].SkuID { - v.Count++ - } else { - outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightList[i])) - } - } - } else { - outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightList[i])) - } - } else { - if sum3 >= 3000 { - break - } - continue - } - } - } - return outOrder -} - func jxOrderChange(sku2 *JxSkuInfo2) *JxSkuInfo { sku := &JxSkuInfo{} sku.Count = 1 @@ -1426,3 +1351,53 @@ func jxOrderChange(sku2 *JxSkuInfo2) *JxSkuInfo { sku.Weight = sku2.Weight return sku } + +//商品分包规则2。最后一个包不超过5kg,其他包不超过3kg +// 举例1:5.1kg,分为 2.5kg,2.6kg,确保每个包不超过3kg,最后一个包不超过5kg +// 举例2:4kg,分为4kg +// 举例3:10kg,分为 3kg,3kg,4kg +// 举例4:8.1kg,分为 3kg,3kg,2.1kg ; 不能分为3kg,5.1kg +//sum3表示3kg的计算 +func loop2(weightList []*JxSkuInfo2, storeID int, weight *int) (outOrder *JxOrderInfo) { + outOrder = &JxOrderInfo{} + outOrder.StoreID = storeID + sum3 := 0 + if *weight <= 5000 { + for i := 0; i < len(weightList); i++ { + buildOutOrderSkus(weightList[i], outOrder) + } + } else { + for i := 0; i < len(weightList); i++ { + if weightList[i].Weight+sum3 <= 3000 { + sum3 += weightList[i].Weight + *weight -= weightList[i].Weight + buildOutOrderSkus(weightList[i], outOrder) + } else { + if sum3 >= 3000 { + break + } + continue + } + } + } + return outOrder +} + +func buildOutOrderSkus(weightp *JxSkuInfo2, outOrder *JxOrderInfo) { + weightp.GroupSign = true + outOrder.Weight += weightp.Weight + if len(outOrder.Skus) > 0 { + var flag = false + for _, v := range outOrder.Skus { + if v.SkuID == weightp.SkuID { + v.Count++ + flag = true + } + } + if !flag { + outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightp)) + } + } else { + outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightp)) + } +}