Kaynağa Gözat

add promotion

abiao 5 yıl önce
ebeveyn
işleme
9fe079a050

+ 137 - 0
go/gopath/src/fohow.com/apps/helpers/promotion_helper.go

@@ -0,0 +1,137 @@
+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)
+	firstFlag := true
+	totalFlag := true
+	firstOrder := false
+	//获取订单明细
+	order := order_model.GetOrderById(orderId, true)
+	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 {
+		if item.MaxTotal > 0 && order.TotalPrice > item.MaxTotal {
+			totalFlag = false
+			continue
+		}
+		if item.IsFirst && !firstOrder {
+			firstFlag = false
+			continue
+		}
+		if item.MinTotal > 0 && order.TotalPrice < item.MinTotal {
+			totalFlag = false
+			firstFlag = false
+			continue
+		}
+		nums := int64(0)
+		nums1 := int64(0)
+		nums2 := int64(0)
+		nums3 := int64(0)
+		nums4 := int64(0)
+		detail1 := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod1)
+
+		if detail1 != nil && item.Prod1 > 0 && item.Nums1 > 0 {
+			nums1 = int64(detail1.Count / item.Nums1)
+		}
+
+		detail2 := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod2)
+		if detail2 != nil && item.Prod2 > 0 && item.Nums2 > 0 {
+			nums2 = int64(detail2.Count / item.Nums2)
+		}
+
+		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)
+
+		}
+		val := []int64{nums1, nums2, nums3, nums4}
+		nums = min(val...)
+		if !item.IsMore {
+			val := []int64{nums, 1}
+			nums = min(val...)
+		}
+		if firstFlag && totalFlag && nums > int64(0) {
+			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 min == 0 || val <= min {
+			min = val
+		}
+	}
+	return min
+}
+
+/*
+找到所有当前时间>《开始时间》且 当前时间<《结束时间》 且《是否启用》=1的促销记录
+{	flag1=1,flag2=1
+NUMs=0,NUMs1=0,NUMs2=0,NUMs3=0,NUMs4=0
+如果《是否首次下单》=是,且当前订单不是首次订单,则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);
+如果《是否多买多送》=否,NUMs=MIN(1,NUMs)
+if(flag1=1并且flag2=1并且NUMs>0)
+{	如果《赠送产品ID1》>0且《赠送数量1》>0,则按《赠送数量1》*NUMs赠送《赠送产品ID1》;
+如果《赠送产品ID2》>0且《赠送数量2》>0,则按《赠送数量2》*NUMs赠送《赠送产品ID2》;
+如果《赠送产品ID3》>0且《赠送数量3》>0,则按《赠送数量3》*NUMs赠送《赠送产品ID3》;
+}
+找下一个促销记录
+*/

+ 213 - 0
go/gopath/src/fohow.com/libs/lib_redis/redis.go

@@ -0,0 +1,213 @@
+package lib_redis
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/astaxie/beego"
+	"github.com/go-redis/redis"
+	"time"
+)
+
+type RedisClient struct {
+}
+
+func Del(key string) error {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return err
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	//beego.BeeLogger.Info("Connect lib_redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return err
+	}
+	return client.Del(key).Err()
+}
+
+// SetJsonEx set Json and second
+func SetJsonEx(key string, data interface{}, seconds int) error {
+	jsonData, err := json.Marshal(data)
+	if err != nil {
+		return nil
+	}
+	return SetRedisValue(key, string(jsonData), time.Duration(seconds)*time.Second)
+}
+
+//保存keyValue
+func SetRedisValue(key, value string, expiration time.Duration) error {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return err
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("Connect lib_redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return err
+	}
+
+	client.Set(key, value, expiration) //忽略错误
+	return nil
+}
+
+//获取keyValue
+func GetRedisValue(key string, resp interface{}) (bool, interface{}) {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return false, ""
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return false, ""
+	}
+	val, err := client.Get(key).Result()
+	if err != nil {
+		return false, ""
+	}
+	//beego.BeeLogger.Info("result 返回字符:%s", val)
+	err = json.Unmarshal([]byte(val), &resp)
+	if err != nil {
+		return false, ""
+	}
+	return true, resp
+}
+
+// GetFromJSON 从 lib_redis 读取数据, 自带解析JSON格式
+func GetFromJSON(data interface{}, key string) error {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return err
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return err
+	}
+	val := client.Get(key)
+	if val.Err() != nil {
+		return val.Err()
+	}
+	jsonData, err := val.Bytes()
+	if err != nil {
+		return err
+	}
+
+	if err := json.Unmarshal(jsonData, data); err != nil {
+		beego.Warn("lib_redis.GetFromJSON: %s %s", string(jsonData), err)
+
+		return err
+	}
+	//beego.BeeLogger.Info("result 返回字符:%s", jsonData)
+
+	return nil
+}
+
+//保存redis队列
+func ThrowInRedisList(key, value string) {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("Connect lib_redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	beego.BeeLogger.Info("throwin lib_redis key (%s), value=%s", key, value)
+
+	client.LPush(key, value) //rpush则在尾部插入
+	return
+}
+
+//从redis队列剔除
+func ThrowOutRedisList(key, value string) {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("Connect lib_redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client.LRem(key, 0, value)
+	beego.BeeLogger.Info("throwout lib_redis key (%s), value=%s", key, value)
+	return
+}
+
+//----------- 获取redisKey值 -------------------
+func GetKeyByOrderId(orderId string) string {
+	return fmt.Sprintf("order_model.GetOrderByOId:%s", orderId)
+
+}
+
+//所有未支付普通订单加入队列,用作倒计到时取消
+func GetOrderCancelList() string {
+	return fmt.Sprintf("mall:cancelorder")
+}
+
+//所有自动提现订单加入队列,自动提现
+func GetAutoTakeCashList() string {
+	return fmt.Sprintf("mall:takecash")
+}
+
+//商城商品ID键值
+func GetKeyByProductId(pId int64) string {
+	return fmt.Sprintf("product_model.GetProductById:%d", pId)
+}
+
+//商城微信会员rediskey
+func GetKeyByWxUserId(id int64) string {
+	return fmt.Sprintf("user_model.GetWxUserById:%d", id)
+}
+
+//商城注册会员rediskey
+func GetKeyByUserId(id int64) string {
+	return fmt.Sprintf("user_model.GetKeyByUserId:%d", id)
+}