package helpers import ( "fohow.com/apps/models/order_model" "fohow.com/apps/models/product_model" "github.com/astaxie/beego" "time" ) //发放促销商品 func SetOrderPromotion(orderId string, wxUid int64) { beego.BeeLogger.Warn("******* SetOrderPromotion orderId:%s wxUid:%d", orderId, wxUid) firstOrder := false //获取订单明细 order := order_model.GetOrderById(orderId, false) if order == nil { return } //检查会员是否首次下单 list := order_model.GetWxUserOrders(wxUid) if len(list) == 1 { firstOrder = true } queryDate := time.Now() // 获取所有有效促销记录 effectivePromotions := order_model.GetEffetivePromotions(queryDate, order.OrderType, false) for _, item := range effectivePromotions { beego.Warn("item_name%d", item.Name) firstFlag := true totalFlag := true numsFlag := true if item.MaxTotal > 0 && order.TotalPrice > item.MaxTotal { beego.Warn("item-name%sMaxTotal%d fail", item.MaxTotal) totalFlag = false continue } if item.IsFirst && !firstOrder { beego.Warn("item-name%sfirst fail", item.Name) firstFlag = false continue } if item.MinTotal > 0 && order.TotalPrice < item.MinTotal { beego.Warn("item-name%s--MinTotal%d fail", item.Name, item.MinTotal) totalFlag = false firstFlag = false continue } nums := int64(99) nums1 := int64(99) nums2 := int64(99) nums3 := int64(99) nums4 := int64(99) if item.Prod1 > 0 { detail1 := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod1) if detail1 != nil && item.Prod1 > 0 && item.Nums1 > 0 { nums1 = int64(detail1.Count / item.Nums1) } } if item.Prod2 > 0 { detail2 := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod2) if detail2 != nil && item.Prod2 > 0 && item.Nums2 > 0 { nums2 = int64(detail2.Count / item.Nums2) } } if item.Prod3 > 0 { detail3 := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod3) if detail3 != nil && item.Prod3 > 0 && item.Nums3 > 0 { nums3 = int64(detail3.Count / item.Nums3) } } if item.MinTotal > 0 { nums4 = int64(order.TotalPrice / item.MinTotal) } if nums == int64(99) || nums == int64(0) { numsFlag = false } val := []int64{nums1, nums2, nums3, nums4} nums = min(val...) beego.Warn("nums-1%d", nums) if !item.IsMore { val := []int64{nums, 1} nums = min(val...) } beego.Warn("firstFlag%v", firstFlag) beego.Warn("totalFlag%v", totalFlag) beego.Warn("nums-2%d", nums) if firstFlag && totalFlag && numsFlag { if item.SendProd1 > 0 && item.SendNums1 > 0 { sendNums1 := nums * item.SendNums1 //赠送赠品1 product := product_model.GetProductById(item.Prod1, true) go order_model.SendCreate(order.OrderId, order.Id, item.Prod1, product.Price, product.Price, product.Name, sendNums1) } if item.SendProd2 > 0 && item.SendNums2 > 0 { sendNums2 := nums * item.SendNums2 //赠送赠品1 product := product_model.GetProductById(item.Prod2, true) go order_model.SendCreate(order.OrderId, order.Id, item.Prod2, product.Price, product.Price, product.Name, sendNums2) } if item.SendProd3 > 0 && item.SendNums3 > 0 { sendNums3 := nums * item.SendNums3 //赠送赠品1 product := product_model.GetProductById(item.Prod1, true) go order_model.SendCreate(order.OrderId, order.Id, item.Prod3, product.Price, product.Price, product.Name, sendNums3) } } } } func max(vals ...int64) int64 { var max int64 for _, val := range vals { if val > max { max = val } } return max } func min(vals ...int64) int64 { var min int64 for _, val := range vals { if val <= min { min = val } } return min } /* 找到所有当前时间>《开始时间》且 当前时间<《结束时间》 且《是否启用》=1的促销记录 { flag1=1,flag2=1,flag3=1 NUMs=99,NUMs1=99,NUMs2=99,NUMs3=99,NUMs4=99 如果《是否首次下单》=是,且当前订单不是首次订单,则flag1=0 如果《最大金额》>0则要求订单金额大于此项值,则flag2=0 如果:《购买产品ID1》>0且《购买数量1》>0则NUMs1=购买产品ID1的数量/《购买数量1》 如果:《购买产品ID2》>0且《购买数量2》>0则当前订单中NUMs2=购买产品ID2的数量/《购买数量2》 如果:《购买产品ID3》>0且《购买数量3》>0则当前订单中NUMs3=购买产品ID3的数量/《购买数量3》 如果:《最小金额》>0则要求订单金额大于或等于此项值,则NUMs4=订单金额/《最小金额》 NUMs=min(NUMs1,NUMs2,NUMs3,NUMs4); if(NUMs=99或NUMs=0) 则flag3=0 如果《是否多买多送》=否,NUMs=MIN(1,NUMs) if(flag1=1并且flag2=1并且flag3=1) { 如果《赠送产品ID1》>0且《赠送数量1》>0,则按《赠送数量1》*NUMs赠送《赠送产品ID1》; 如果《赠送产品ID2》>0且《赠送数量2》>0,则按《赠送数量2》*NUMs赠送《赠送产品ID2》; 如果《赠送产品ID3》>0且《赠送数量3》>0,则按《赠送数量3》*NUMs赠送《赠送产品ID3》; } 找下一个促销记录 } */