物料订单拆单终极

This commit is contained in:
苏尹岚
2020-03-17 16:45:29 +08:00
parent d96c8152c9
commit a8125a568f

View File

@@ -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
// 举例15.1kg,分为 2.5kg,2.6kg,确保每个包不超过3kg,最后一个包不超过5kg
// 举例24kg,分为4kg
// 举例310kg分为 3kg,3kg,4kg
// 举例48.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
// 举例15.1kg,分为 2.5kg,2.6kg,确保每个包不超过3kg,最后一个包不超过5kg
// 举例24kg,分为4kg
// 举例310kg分为 3kg,3kg,4kg
// 举例48.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))
}
}