diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index 60801797c..34e81703d 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -332,6 +332,7 @@ func OnPayFinished(orderPay *model.OrderPay) (err error) { order.VendorStatus = utils.Int2Str(model.OrderStatusNew) order.StatusTime = *orderPay.PayFinishedAt err = callNewOrder(order) + //如果是物料的订单,直接到拣货完成,配送中的状态 if order.FromStoreID != 0 { PickupGoods(order, false, "jxadmin") } @@ -491,12 +492,12 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 } var ( result *orderman.OrderCount - sum int + sum *int //申请物料的店的最近销量,以下会根据销量计算具体袋子的价格 flag = false //新店袋子拆分当个参数 ) if fromStoreID != 0 { result, _ = orderman.GetMatterStoreOrderCount(nil, fromStoreID) - sum = result.Count + sum = &result.Count } for _, v := range skus { if storeSkuBind := storeSkuMap[v.SkuID]; storeSkuBind != nil { @@ -509,6 +510,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 Weight: sku.Weight, Name: jxutils.ComposeSkuName(sku.Prefix, sku.Name, sku.Comment, sku.Unit, sku.SpecQuality, sku.SpecUnit, 0, sku.ExPrefix, sku.ExPrefixBegin, sku.ExPrefixEnd), } + //活动商品要拆分,一分钱的单独列一个(count为1),正常价格的列在一起(count叠加) if storeSkuBind.ActPrice != 0 && storeSkuBind.ActPrice < storeSkuBind.JxPrice { jxSku.SalePrice = int64(storeSkuBind.ActPrice) jxSku.Count = 1 @@ -532,7 +534,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice } else { //以下else为物料订单袋子金额和数量处理 if result.Count == 0 && result.Flag { //这个条件被认为是新店,袋子限量 - if bagMap[jxSku.SkuID] != 0 { + if bagMap[jxSku.SkuID] != 0 { //如果他买了袋子,第一个袋子算1分钱,其余按原价(包括所有袋子) if !flag { jxSku.SalePrice = 1 jxSku.Count = 1 @@ -553,54 +555,37 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice } } else { + //袋子总数小于等于销量就是1分钱,只要大于销量其他就按原价 + var bagPriceCount = func(jxSku *JxSkuInfo, outJxOrder *JxOrderInfo, sum *int, count float64) { + if bagMap[jxSku.SkuID] != 0 { + if *sum > 0 { + if bagMap[jxSku.SkuID]*jxSku.Count <= *sum+int(utils.Float64TwoInt64(count)) { + jxSku.SalePrice = 1 + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(1 * jxSku.Count) + } else { + jxSku2 := *jxSku + jxSku2.SalePrice = jxSku.SalePrice + jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(*sum)/count))) + jxSku.SalePrice = 1 + jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(*sum) / count))) + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.Skus = append(outJxOrder.Skus, &jxSku2) + outJxOrder.OrderPrice += jxSku.SalePrice * int64(jxSku.Count) + outJxOrder.OrderPrice += jxSku2.SalePrice * int64(jxSku2.Count) + } + } else { + outJxOrder.Skus = append(outJxOrder.Skus, jxSku) + outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice + } + *sum = *sum - bagMap[jxSku.SkuID]*jxSku.Count + } + } + //这个袋子规格是一份100个 if jxSku.SkuID == 6039382 { - if bagMap[jxSku.SkuID] != 0 { - if sum > 0 { - if bagMap[jxSku.SkuID]*jxSku.Count <= sum+100 { - jxSku.SalePrice = 1 - outJxOrder.Skus = append(outJxOrder.Skus, jxSku) - outJxOrder.OrderPrice += int64(1 * jxSku.Count) - } else { - jxSku2 := *jxSku - jxSku2.SalePrice = jxSku.SalePrice - jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/100))) - jxSku.SalePrice = 1 - jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 100))) - outJxOrder.Skus = append(outJxOrder.Skus, jxSku) - outJxOrder.Skus = append(outJxOrder.Skus, &jxSku2) - outJxOrder.OrderPrice += jxSku.SalePrice * int64(jxSku.Count) - outJxOrder.OrderPrice += jxSku2.SalePrice * int64(jxSku2.Count) - } - } else { - outJxOrder.Skus = append(outJxOrder.Skus, jxSku) - outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice - } - sum = sum - bagMap[jxSku.SkuID]*jxSku.Count - } - } else if jxSku.SkuID == 6039383 || jxSku.SkuID == 6039384 || jxSku.SkuID == 6039387 || jxSku.SkuID == 6039390 { - if bagMap[jxSku.SkuID] != 0 { - if sum > 0 { - if bagMap[jxSku.SkuID]*jxSku.Count <= sum+200 { - jxSku.SalePrice = 1 - outJxOrder.Skus = append(outJxOrder.Skus, jxSku) - outJxOrder.OrderPrice += int64(1 * jxSku.Count) - } else { - jxSku2 := *jxSku - jxSku2.SalePrice = jxSku.SalePrice - jxSku2.Count = int(int64(jxSku.Count) - utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum)/200))) - jxSku.SalePrice = 1 - jxSku.Count = int(utils.Float64TwoInt64(math.Ceil(utils.Int2Float64(sum) / 200))) - outJxOrder.Skus = append(outJxOrder.Skus, jxSku) - outJxOrder.Skus = append(outJxOrder.Skus, &jxSku2) - outJxOrder.OrderPrice += jxSku.SalePrice * int64(jxSku.Count) - outJxOrder.OrderPrice += jxSku2.SalePrice * int64(jxSku2.Count) - } - } else { - outJxOrder.Skus = append(outJxOrder.Skus, jxSku) - outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice - } - sum = sum - bagMap[jxSku.SkuID]*jxSku.Count - } + bagPriceCount(jxSku, outJxOrder, sum, 100) + } else if jxSku.SkuID == 6039383 || jxSku.SkuID == 6039384 || jxSku.SkuID == 6039387 || jxSku.SkuID == 6039390 { //这些袋子是一份200个 + bagPriceCount(jxSku, outJxOrder, sum, 200) } else { outJxOrder.Skus = append(outJxOrder.Skus, jxSku) outJxOrder.OrderPrice += int64(jxSku.Count) * jxSku.SalePrice @@ -612,6 +597,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 } } } + //物料订单的配送费另算,所以排除了免得多算一次 if fromStoreID == 0 { sort.Sort(JxSkuInfoList(outJxOrder.Skus)) outJxOrder.FreightPrice, _, err = delivery.CalculateDeliveryFee(dao.GetDB(), jxOrder.StoreID, "", @@ -630,8 +616,11 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 if err = err2; err != nil { return nil, nil, fmt.Errorf("fromStoreID有误,[%v]", fromStoreID) } + //要求配送人姓名填门店名 deliveryAddress.ConsigneeName = storeDetail2.Name outJxOrder.FromStoreID = fromStoreID + ///物料订单的配送费计算,注释的是分包之后计算配送费,但后来还是直接算不分包之前的总配送费 + ///规则为: 配送费用规则。起价5元(含2kg),之后每kg+2元,不足1kg按1kg计算。 // if outJxOrder.Weight > 5000 { // _, freightPrice, err := tryToSplitMatterOrder(outJxOrder) // if err != nil { @@ -666,6 +655,7 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 return outJxOrder, deliveryAddress, err } +//根据销量限制门店申请袋子数,现暂不使用该判断,万一以后要用就先没删 func matterSkusLimited(skus []*JxSkuInfo, storeID int) (err error) { result, err := orderman.GetMatterStoreOrderCount(nil, storeID) sum := 0 @@ -775,6 +765,7 @@ func AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList func PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { err = changeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "") + //如果是物料订单则直接进行京东物流的发单,并且状态直接变为配送中 err = orderSolutionForWuLiao(order) return err } @@ -853,11 +844,13 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) { } jxOrder.Skus = skus outOrders, _, _ := tryToSplitMatterOrder(jxOrder) + //以下为仿照CreateOrder,改了一些参数 for k, v := range outOrders { outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, v, order.AddressID, order.FromStoreID, order.UserID) if err != nil { return err } + //分包后的子订单ID默认是后面加两位(目前的规则),要改的话要注意取消订单那的判断 outJxOrder.OrderID = utils.Str2Int64(order.VendorOrderID)*100 + int64(k+1) order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID) if err = err2; err == nil { @@ -1283,6 +1276,10 @@ func tryToSplitMatterOrder(jxOrder *JxOrderInfo) (outOrders []*JxOrderInfo, frei weightList []*JxSkuInfo2 flag = true ) + //我的思路为把所有商品依次按重量销量从大到小排列,然后第一个包尽量分出5kg,后面分出3kg + //但是我把JxSkuInfo放进list的时候,想根据一个参数GroupSign判断是否这个商品已经分出去了 + //但是在list中同一个商品似乎放进去的地址是一样的,我改了一个商品的GroupSign,所有的都变了,所以只有分出一个JxSkuInfo2去弄。。 + //要做优化的话更好 for _, v := range skus { for i := 0; i < v.Count; i++ { var sku2 = &JxSkuInfo2{}