promotion_helper.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package helpers
  2. import (
  3. "fohow.com/apps/models/order_model"
  4. "fohow.com/apps/models/product_model"
  5. "github.com/astaxie/beego"
  6. "time"
  7. )
  8. //发放促销商品
  9. func SetOrderPromotion(orderId string, wxUid int64) {
  10. beego.BeeLogger.Warn("******* SetOrderPromotion orderId:%s wxUid:%d", orderId, wxUid)
  11. firstOrder := false
  12. //获取订单明细
  13. order := order_model.GetOrderById(orderId, false)
  14. if order == nil {
  15. return
  16. }
  17. //检查会员是否首次下单
  18. list := order_model.GetWxUserOrders(wxUid)
  19. if len(list) == 1 {
  20. firstOrder = true
  21. }
  22. queryDate := time.Now()
  23. // 获取所有有效促销记录
  24. effectivePromotions := order_model.GetEffetivePromotions(queryDate, order.OrderType, false)
  25. for _, item := range effectivePromotions {
  26. beego.Warn("item_name%d", item.Name)
  27. firstFlag := true
  28. totalFlag := true
  29. numsFlag := true
  30. if item.MaxTotal > 0 && order.TotalPrice > item.MaxTotal {
  31. totalFlag = false
  32. continue
  33. }
  34. if item.IsFirst && !firstOrder {
  35. firstFlag = false
  36. continue
  37. }
  38. if item.MinTotal > 0 && order.TotalPrice < item.MinTotal {
  39. totalFlag = false
  40. firstFlag = false
  41. continue
  42. }
  43. nums := int64(99)
  44. nums1 := int64(99)
  45. nums2 := int64(99)
  46. nums3 := int64(99)
  47. nums4 := int64(99)
  48. if item.Prod1 > 0 {
  49. detail1 := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod1)
  50. if detail1 != nil && item.Prod1 > 0 && item.Nums1 > 0 {
  51. nums1 = int64(detail1.Count / item.Nums1)
  52. }
  53. }
  54. if item.Prod2 > 0 {
  55. detail2 := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod2)
  56. if detail2 != nil && item.Prod2 > 0 && item.Nums2 > 0 {
  57. nums2 = int64(detail2.Count / item.Nums2)
  58. }
  59. }
  60. if item.Prod3 > 0 {
  61. detail3 := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod3)
  62. if detail3 != nil && item.Prod3 > 0 && item.Nums3 > 0 {
  63. nums3 = int64(detail3.Count / item.Nums3)
  64. }
  65. }
  66. if item.MinTotal > 0 {
  67. nums4 = int64(order.TotalPrice / item.MinTotal)
  68. }
  69. if nums == int64(99) || nums == int64(0) {
  70. numsFlag = false
  71. }
  72. val := []int64{nums1, nums2, nums3, nums4}
  73. nums = min(val...)
  74. if !item.IsMore {
  75. val := []int64{nums, 1}
  76. nums = min(val...)
  77. }
  78. beego.Warn("firstFlag%v", firstFlag)
  79. beego.Warn("totalFlag%v", totalFlag)
  80. beego.Warn("numsFlag%v", numsFlag)
  81. beego.Warn("nums%d", nums)
  82. if firstFlag && totalFlag && numsFlag {
  83. if item.SendProd1 > 0 && item.SendNums1 > 0 {
  84. sendNums1 := nums * item.SendNums1
  85. //赠送赠品1
  86. product := product_model.GetProductById(item.SendProd1, true)
  87. go order_model.SendCreate(order.OrderId, order.Id, product.Id, product.Price, product.Price, product.Name, sendNums1)
  88. }
  89. if item.SendProd2 > 0 && item.SendNums2 > 0 {
  90. sendNums2 := nums * item.SendNums2
  91. //赠送赠品1
  92. product := product_model.GetProductById(item.SendProd2, true)
  93. go order_model.SendCreate(order.OrderId, order.Id, product.Id, product.Price, product.Price, product.Name, sendNums2)
  94. }
  95. if item.SendProd3 > 0 && item.SendNums3 > 0 {
  96. sendNums3 := nums * item.SendNums3
  97. //赠送赠品1
  98. product := product_model.GetProductById(item.SendProd3, true)
  99. go order_model.SendCreate(order.OrderId, order.Id, product.Id, product.Price, product.Price, product.Name, sendNums3)
  100. }
  101. }
  102. }
  103. }
  104. func max(vals ...int64) int64 {
  105. var max int64
  106. for _, val := range vals {
  107. if val > max {
  108. max = val
  109. }
  110. }
  111. return max
  112. }
  113. func min(vals ...int64) int64 {
  114. min := int64(0)
  115. for _, val := range vals {
  116. if val <= min || min == int64(0) {
  117. min = val
  118. }
  119. }
  120. return min
  121. }
  122. /*
  123. 找到所有当前时间>《开始时间》且 当前时间<《结束时间》 且《是否启用》=1的促销记录
  124. { flag1=1,flag2=1,flag3=1
  125. NUMs=99,NUMs1=99,NUMs2=99,NUMs3=99,NUMs4=99
  126. 如果《是否首次下单》=是,且当前订单不是首次订单,则flag1=0
  127. 如果《最大金额》>0则要求订单金额大于此项值,则flag2=0
  128. 如果:《购买产品ID1》>0且《购买数量1》>0则NUMs1=购买产品ID1的数量/《购买数量1》
  129. 如果:《购买产品ID2》>0且《购买数量2》>0则当前订单中NUMs2=购买产品ID2的数量/《购买数量2》
  130. 如果:《购买产品ID3》>0且《购买数量3》>0则当前订单中NUMs3=购买产品ID3的数量/《购买数量3》
  131. 如果:《最小金额》>0则要求订单金额大于或等于此项值,则NUMs4=订单金额/《最小金额》
  132. NUMs=min(NUMs1,NUMs2,NUMs3,NUMs4);
  133. if(NUMs=99或NUMs=0) 则flag3=0
  134. 如果《是否多买多送》=否,NUMs=MIN(1,NUMs)
  135. if(flag1=1并且flag2=1并且flag3=1)
  136. { 如果《赠送产品ID1》>0且《赠送数量1》>0,则按《赠送数量1》*NUMs赠送《赠送产品ID1》;
  137. 如果《赠送产品ID2》>0且《赠送数量2》>0,则按《赠送数量2》*NUMs赠送《赠送产品ID2》;
  138. 如果《赠送产品ID3》>0且《赠送数量3》>0,则按《赠送数量3》*NUMs赠送《赠送产品ID3》;
  139. }
  140. 找下一个促销记录
  141. }
  142. */