物料订单拆单终极
This commit is contained in:
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user