物料订单拆单终极
This commit is contained in:
@@ -573,6 +573,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
|||||||
jxSku2 := *jxSku
|
jxSku2 := *jxSku
|
||||||
jxSku2.SalePrice = jxSku.SalePrice
|
jxSku2.SalePrice = jxSku.SalePrice
|
||||||
jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/100)))
|
jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/100)))
|
||||||
|
outJxOrder.Weight += jxSku2.Count * jxSku2.Weight
|
||||||
jxSku.SalePrice = 1
|
jxSku.SalePrice = 1
|
||||||
jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 100)))
|
jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 100)))
|
||||||
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
||||||
@@ -597,6 +598,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
|||||||
jxSku2 := *jxSku
|
jxSku2 := *jxSku
|
||||||
jxSku2.SalePrice = jxSku.SalePrice
|
jxSku2.SalePrice = jxSku.SalePrice
|
||||||
jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/200)))
|
jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/200)))
|
||||||
|
outJxOrder.Weight += jxSku2.Count * jxSku2.Weight
|
||||||
jxSku.SalePrice = 1
|
jxSku.SalePrice = 1
|
||||||
jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 200)))
|
jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 200)))
|
||||||
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
outJxOrder.Skus = append(outJxOrder.Skus, jxSku)
|
||||||
@@ -643,21 +645,12 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64
|
|||||||
//要求配送人姓名填门店名
|
//要求配送人姓名填门店名
|
||||||
deliveryAddress.ConsigneeName = storeDetail2.Name
|
deliveryAddress.ConsigneeName = storeDetail2.Name
|
||||||
outJxOrder.FromStoreID = fromStoreID
|
outJxOrder.FromStoreID = fromStoreID
|
||||||
///物料订单的配送费计算,注释的是分包之后计算配送费,但后来还是直接算不分包之前的总配送费
|
|
||||||
///规则为: 配送费用规则。起价5元(含2kg),之后每kg+2元,不足1kg按1kg计算。
|
///规则为: 配送费用规则。起价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 {
|
if outJxOrder.Weight <= 2000 {
|
||||||
outJxOrder.FreightPrice = 500
|
outJxOrder.FreightPrice = 500
|
||||||
} else {
|
} else {
|
||||||
outJxOrder.FreightPrice = utils.Float64TwoInt64(500 + math.Ceil((utils.Int2Float64(outJxOrder.Weight)-2000)/1000)*200)
|
outJxOrder.FreightPrice = utils.Float64TwoInt64(500 + math.Ceil((utils.Int2Float64(outJxOrder.Weight)-2000)/1000)*200)
|
||||||
}
|
}
|
||||||
// }
|
|
||||||
} else {
|
} else {
|
||||||
if outJxOrder.FreightPrice > specialFreightPrice {
|
if outJxOrder.FreightPrice > specialFreightPrice {
|
||||||
outJxOrder.FreightPrice = specialFreightPrice
|
outJxOrder.FreightPrice = specialFreightPrice
|
||||||
@@ -857,8 +850,10 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) {
|
|||||||
} else { //如果重量超过5kg则需要进行拆单分包,商品分包规则。最后一个包不超过5kg,其他包不超过3kg
|
} else { //如果重量超过5kg则需要进行拆单分包,商品分包规则。最后一个包不超过5kg,其他包不超过3kg
|
||||||
jxOrder := &JxOrderInfo{}
|
jxOrder := &JxOrderInfo{}
|
||||||
jxOrder.StoreID = order.StoreID
|
jxOrder.StoreID = order.StoreID
|
||||||
|
weight := 0
|
||||||
var skus []*JxSkuInfo
|
var skus []*JxSkuInfo
|
||||||
for _, v := range orderSkus {
|
for _, v := range orderSkus {
|
||||||
|
weight += v.Weight * v.Count
|
||||||
sku := &JxSkuInfo{}
|
sku := &JxSkuInfo{}
|
||||||
sku.SkuID = v.SkuID
|
sku.SkuID = v.SkuID
|
||||||
sku.SalePrice = v.SalePrice
|
sku.SalePrice = v.SalePrice
|
||||||
@@ -868,6 +863,7 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) {
|
|||||||
skus = append(skus, sku)
|
skus = append(skus, sku)
|
||||||
}
|
}
|
||||||
jxOrder.Skus = skus
|
jxOrder.Skus = skus
|
||||||
|
jxOrder.Weight = weight
|
||||||
outOrders, _, _ := tryToSplitMatterOrder(jxOrder)
|
outOrders, _, _ := tryToSplitMatterOrder(jxOrder)
|
||||||
//以下为仿照CreateOrder,改了一些参数
|
//以下为仿照CreateOrder,改了一些参数
|
||||||
for k, v := range outOrders {
|
for k, v := range outOrders {
|
||||||
@@ -1299,9 +1295,8 @@ func tryToSplitMatterOrder(jxOrder *JxOrderInfo) (outOrders []*JxOrderInfo, frei
|
|||||||
var (
|
var (
|
||||||
skus = jxOrder.Skus
|
skus = jxOrder.Skus
|
||||||
weightList []*JxSkuInfo2
|
weightList []*JxSkuInfo2
|
||||||
flag = true
|
|
||||||
)
|
)
|
||||||
//我的思路为把所有商品依次按重量销量从大到小排列,然后第一个包尽量分出5kg,后面分出3kg
|
//我的思路为把所有商品依次按重量销量从大到小排列,然后第一个包尽量分出3kg,后面分出5kg
|
||||||
//但是我把JxSkuInfo放进list的时候,想根据一个参数GroupSign判断是否这个商品已经分出去了
|
//但是我把JxSkuInfo放进list的时候,想根据一个参数GroupSign判断是否这个商品已经分出去了
|
||||||
//但是在list中同一个商品通过以下方式放进去的地址是一样的,我改了一个商品的GroupSign,所有的都变了,所以只有分出一个JxSkuInfo2去弄。。
|
//但是在list中同一个商品通过以下方式放进去的地址是一样的,我改了一个商品的GroupSign,所有的都变了,所以只有分出一个JxSkuInfo2去弄。。
|
||||||
//要做优化的话更好
|
//要做优化的话更好
|
||||||
@@ -1326,9 +1321,10 @@ func tryToSplitMatterOrder(jxOrder *JxOrderInfo) (outOrders []*JxOrderInfo, frei
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
weight := jxOrder.Weight
|
||||||
for {
|
for {
|
||||||
//每拿出一组就删掉list里的值
|
//每拿出一组就删掉list里的值
|
||||||
outOrders = append(outOrders, loop(weightList, jxOrder, flag))
|
outOrders = append(outOrders, loop2(weightList, jxOrder.StoreID, &weight))
|
||||||
for i := 0; i < len(weightList); {
|
for i := 0; i < len(weightList); {
|
||||||
if weightList[i].GroupSign {
|
if weightList[i].GroupSign {
|
||||||
var weightList3 []*JxSkuInfo2
|
var weightList3 []*JxSkuInfo2
|
||||||
@@ -1338,84 +1334,13 @@ func tryToSplitMatterOrder(jxOrder *JxOrderInfo) (outOrders []*JxOrderInfo, frei
|
|||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
flag = false
|
|
||||||
if len(weightList) == 0 {
|
if len(weightList) == 0 {
|
||||||
break
|
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
|
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 {
|
func jxOrderChange(sku2 *JxSkuInfo2) *JxSkuInfo {
|
||||||
sku := &JxSkuInfo{}
|
sku := &JxSkuInfo{}
|
||||||
sku.Count = 1
|
sku.Count = 1
|
||||||
@@ -1426,3 +1351,53 @@ func jxOrderChange(sku2 *JxSkuInfo2) *JxSkuInfo {
|
|||||||
sku.Weight = sku2.Weight
|
sku.Weight = sku2.Weight
|
||||||
return sku
|
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