Bläddra i källkod

feat:缓存 加锁

wangshan 2 år sedan
förälder
incheckning
c363a8af2e

+ 13 - 1
handler/activity/jyActivity.go

@@ -11,6 +11,7 @@ import (
 	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/gogf/gf/v2/os/gtime"
 	"github.com/gogf/gf/v2/util/gconv"
+	"sync"
 	"time"
 )
 
@@ -33,6 +34,14 @@ type JyActivity struct {
 	DoubleEleven bool //22年双十一活动开关
 }
 
+//大会员状态redis缓存
+type BigVipBaseMsg struct {
+	Status         int  `json:"status"`          //大会员状态
+	VipStatus      int  `json:"vip_status"`      //超级订阅状态
+	EntnicheStatus int  `json:"entniche_status"` //商机管理状态
+	EntIsNew       bool `json:"entIsNew"`        //是否是新版商机管理用户
+}
+
 const (
 	BidderPlanRedis           = "main" //redis缓存库名
 	PowerCacheDb              = "newother"
@@ -55,7 +64,10 @@ const (
 	WinnerInfoKey       = "winnerinfokey_22_11_11"
 )
 
-var MembershipDay *JyActivity
+var (
+	MembershipDay *JyActivity
+	ActivityLock  = &sync.Mutex{}
+)
 
 func init() {
 	MembershipDay = &JyActivity{

+ 13 - 0
handler/activity/jyActivityOther.go

@@ -39,6 +39,15 @@ func (BP *JyActivity) Questionnaire(userId, phone, answers string) error {
 	if inActivity, _, _ := BP.InActivity(); !inActivity {
 		return fmt.Errorf("不在活动时间内")
 	}
+	cacheKey := fmt.Sprintf(PowerCacheKey, userId)
+	if bytes, err := redis.GetBytes(PowerCacheDb, cacheKey); err == nil && bytes != nil {
+		userPower := &BigVipBaseMsg{}
+		if err := json.Unmarshal(*bytes, &userPower); err == nil {
+			if userPower.EntIsNew || userPower.Status > 0 && userPower.VipStatus > 0 {
+				return fmt.Errorf("当前用户不符合领取条件")
+			}
+		}
+	}
 	//保存问卷
 	if ok := award.SaveQuestionnaire(userId, phone, answers); ok {
 		if redis.Put(BidderPlanRedis, fmt.Sprintf(QuestionnaireSubmit, userId), "qs", BP.cacheLong()) != true {
@@ -78,12 +87,14 @@ func (BP *JyActivity) GetDailyBoonDetail(userId string) (has bool, todayBalance
 	//查询是否领取
 	hasKey := fmt.Sprintf(BidderPlanHasDailyBoonKey, userId)
 	has = redis.GetInt(BidderPlanRedis, hasKey) >= 1
+	ActivityLock.Lock()
 	//查询剩余
 	todaySumKey := fmt.Sprintf(BidderPlanDailyBoonKey, time.Now().Format(dataUtil.Date_yyyyMMdd))
 	todayBalance = gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.reward.limit", 500).Int() - redis.GetInt(BidderPlanRedis, todaySumKey)
 	if todayBalance < 0 {
 		todayBalance = 0
 	}
+	ActivityLock.Unlock()
 	// 注册时间也在活动允许范围内
 	registerBool = true
 	//是否有权限领取
@@ -133,11 +144,13 @@ func (BP *JyActivity) GetDailyBoonSVip(userId string) (err error) {
 	err = func() error {
 		hasKey := fmt.Sprintf(BidderPlanHasDailyBoonKey, userId)
 		if redis.Incr(BidderPlanRedis, hasKey) == 1 {
+			ActivityLock.Lock()
 			todaySumKey := fmt.Sprintf(BidderPlanDailyBoonKey, time.Now().Format(dataUtil.Date_yyyyMMdd))
 			balance := redis.Incr(BidderPlanRedis, todaySumKey)
 			if balance > gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.reward.limit", 500).Int64() {
 				return fmt.Errorf("剩余为零")
 			}
+			ActivityLock.Unlock()
 			if err := award.GivenSubVip(userId, award.SubVip{
 				Num:          gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.reward.svip", nil).Int64(),
 				ActivityCode: BP.ActivityCode,

+ 4 - 0
services/activity/bidderPlan/services.go

@@ -49,6 +49,10 @@ func (act *Activity) Questionnaire() {
 	userId := gconv.String(act.GetSession("userId"))
 	phone := gconv.String(act.Session().Get("phone"))
 	rData, errMsg := func() (bool, error) {
+		//连点处理
+		if !activity.MembershipDay.FastClickCheck(userId) {
+			return false, fmt.Errorf("操作频繁")
+		}
 		reqParam := map[string]interface{}{}
 		err := json.Unmarshal(act.Body(), &reqParam)
 		if err != nil || len(reqParam) == 0 {