Răsfoiți Sursa

wip:超级会员节代码提交

wangkaiyue 3 ani în urmă
părinte
comite
817dc7a097

+ 8 - 2
etc/config.yaml

@@ -74,8 +74,9 @@ jyactivity: # 临时活动
   name: 剑鱼超级会员节
   code: membershipDay
   dateRange: #活动时间
-    st: 2022-07-25 12:00:00
-    ed: 2022-08-07 9:00:00
+    t1: 2022-07-25 00:00:00 #预热活动
+    t2: 2022-07-25 00:00:00 #活动开始
+    ed: 2022-08-07 00:00:00 #活动结束
   missions: #任务列表
     buysubvip: #购买超级订阅
       points: 800
@@ -91,3 +92,8 @@ jyactivity: # 临时活动
       subvip: 30
     1500:
       subvip: 30
+  dailyBoon: #预热活动每日领取
+    clock: 10:00:00 #每日开抢时间
+    reward:
+      svip: 7 #赠送超级订阅限制
+      limit: 500 #每日数量限制

+ 1 - 1
handler/activity/inviteRegister.go

@@ -55,7 +55,7 @@ func InviteActivity(msg *model.Message) {
 
 	//投标人专属免费计划-邀请任务
 	key := fmt.Sprintf(BidderPlanInviteMissionsStatus, msg.E_userId)
-	if MembershipDay.InActivity() && redis.Get(BidderPlanRedis, key) == nil {
+	if _, inActivity := MembershipDay.InActivity(); inActivity && redis.Get(BidderPlanRedis, key) == nil {
 		redis.Incr(BidderPlanRedis, key)
 		_ = redis.SetExpire(BidderPlanRedis, key, MembershipDay.cacheLong())
 	}

+ 25 - 13
handler/activity/bidderPlan.go → handler/activity/jyActivity.go

@@ -19,7 +19,8 @@ import (
 */
 
 type JyActivity struct {
-	St, Ed       time.Time           //活动开始时间、结束时间
+	T1, T2, Ed   time.Time           //预热活动、开始时间、结束时间
+	DailyClock   string              //预热活动每天开始时间
 	ActivityCode string              //活动code
 	Missions     map[string]struct { //任务
 		Points   int `json:"points"`
@@ -42,13 +43,19 @@ const (
 	BidderPlanBuySVipStatus        = "bidderPlanActivity_v1_BuySVipCacheKey_%s" //购买
 	BidderPlanInviteMissionsStatus = "bidderPlanActivity_v1_InviteCacheKey_%s"  //邀请
 	BidderPlanShareMissionsStatus  = "bidderPlanActivity_v1_ShareCacheKey_%s"   //分享
+	BidderPlanDailyBoonKey         = "bidderPlanActivity_v1_DailyBoon_%s"       //领取每日限量福利
+	BidderPlanHasDailyBoonKey      = "bidderPlanActivity_v1_HasDailyBoon_%s"    //是否领取过每日限量福利
+
+	BidderPlanShare = "bidderPlanActivity_v1_ShareOk_%s" //是否分享
+
 )
 
 var MembershipDay *JyActivity
 
 func init() {
 	MembershipDay = &JyActivity{
-		St: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.st").String(), "2006-01-02T15:04:05Z").Time,
+		T1: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.t1").String(), "2006-01-02T15:04:05Z").Time,
+		T2: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.t2").String(), "2006-01-02T15:04:05Z").Time,
 		Ed: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.ed").String(), "2006-01-02T15:04:05Z").Time,
 	}
 	MembershipDay.ActivityCode = gcfg.Instance().MustGet(gctx.New(), "jyactivity.code").String()
@@ -63,9 +70,16 @@ func init() {
 }
 
 // InActivity 是否在活动时间内
-func (BP *JyActivity) InActivity() bool {
+// bTime 是否在预热时间段内
+// iTime 是否在正式活动时间内
+func (BP *JyActivity) InActivity() (bTime, iTime bool) {
 	now := time.Now()
-	return now.After(MembershipDay.St) && now.Before(MembershipDay.Ed)
+	bTime = now.After(MembershipDay.T1) && now.Before(MembershipDay.T2)
+	if bTime {
+		return
+	}
+	iTime = now.After(MembershipDay.T2) && now.Before(MembershipDay.Ed)
+	return
 }
 
 // cacheLong 缓存时间
@@ -107,7 +121,7 @@ func (BP *JyActivity) GetScheduleQuery(userId string, schedule int) (status int)
 
 // ScheduleGiven 活动任务进度奖励
 func (BP *JyActivity) ScheduleGiven(userId string, schedule int) error {
-	if !BP.InActivity() {
+	if _, inActivity := BP.InActivity(); !inActivity {
 		return fmt.Errorf("活动已结束")
 	}
 	if BP.GetScheduleQuery(userId, schedule) != 1 {
@@ -154,7 +168,7 @@ type FreeSubscribe struct {
 // 是否购买超级订阅
 func (BP *JyActivity) MissionsSVipBuyQuery(userId string) (status int) {
 	finish := func() bool {
-		count := db.Mysql.CountBySql(`SELECT count(id) FROM dataexport_order WHERE product_type ='VIP订阅' AND order_money > 0 AND order_status>0  AND create_time > ?  AND user_id=? `, BP.St.Format(dateFormate.Date_Full_Layout), userId)
+		count := db.Mysql.CountBySql(`SELECT count(id) FROM dataexport_order WHERE product_type ='VIP订阅' AND order_money > 0 AND order_status>0  AND create_time > ? AND create_time < ? AND user_id=? `, BP.T2.Format(dateFormate.Date_Full_Layout), BP.Ed.Format(dateFormate.Date_Full_Layout), userId)
 		if count > 0 {
 			return true
 		}
@@ -180,7 +194,7 @@ func (BP *JyActivity) MissionsSVipBuyQuery(userId string) (status int) {
 
 // MissionsSVipBuyGiven 订阅任务领取奖励
 func (BP *JyActivity) MissionsSVipBuyGiven(userId string) error {
-	if !BP.InActivity() {
+	if _, inActivity := BP.InActivity(); !inActivity {
 		return fmt.Errorf("活动已结束")
 	}
 	status := BP.MissionsSVipBuyQuery(userId)
@@ -217,7 +231,7 @@ func (BP *JyActivity) MissionsInviteQuery(userId string) (status int) {
 
 // MissionsInviteGiven 邀请任务奖励领取
 func (BP *JyActivity) MissionsInviteGiven(userId string) error {
-	if !BP.InActivity() {
+	if _, inActivity := BP.InActivity(); !inActivity {
 		return fmt.Errorf("活动已结束")
 	}
 	status := BP.MissionsInviteQuery(userId)
@@ -245,10 +259,8 @@ func (BP *JyActivity) MissionsInviteGiven(userId string) error {
 // MissionsShareQuery 分享活动
 // status:0 未完成 1 待领取 -1已领取
 func (BP *JyActivity) MissionsShareQuery(userId string) (status int) {
-	hasMsg := db.Mgo.Count("saleLeads", map[string]interface{}{
-		"userid": userId,
-	}) > 0
-	if !hasMsg {
+	finished, _ := redis.Exists(BidderPlanRedis, fmt.Sprintf(BidderPlanShare, userId))
+	if !finished {
 		return 0
 	}
 	key := fmt.Sprintf(BidderPlanShareMissionsStatus, userId)
@@ -266,7 +278,7 @@ func (BP *JyActivity) MissionsShareQuery(userId string) (status int) {
 
 // MissionsShareGiven 分享活动
 func (BP *JyActivity) MissionsShareGiven(userId string) error {
-	if !BP.InActivity() {
+	if _, inActivity := BP.InActivity(); !inActivity {
 		return fmt.Errorf("活动已结束")
 	}
 	status := BP.MissionsShareQuery(userId)

+ 99 - 0
handler/activity/jyActivityOther.go

@@ -0,0 +1,99 @@
+package activity
+
+import (
+	dataUtil "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/message/handler/award"
+	"fmt"
+	"github.com/gogf/gf/v2/os/gcfg"
+	"github.com/gogf/gf/v2/os/gctx"
+	"time"
+)
+
+// ShareFinish 分享完成
+func (BP *JyActivity) ShareFinish(userId string) error {
+	if _, inActivity := BP.InActivity(); !inActivity {
+		return fmt.Errorf("活动已结束")
+	}
+	if redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanShare, userId), 1, BP.cacheLong()) != true {
+		return fmt.Errorf("存储异常")
+	}
+	return nil
+}
+
+// GetDailyBoonDetail 查询领取情况及剩余
+// has 是否已经领取
+// todayBalance 今日余额
+// err 异常
+func (BP *JyActivity) GetDailyBoonDetail(userId string) (has bool, todayBalance int, err error) {
+	if preHeatTime, _ := BP.InActivity(); !preHeatTime {
+		err = fmt.Errorf("预热活动已结束")
+		return
+	}
+	//查询是否领取
+	hasKey := fmt.Sprintf(BidderPlanHasDailyBoonKey, userId)
+	has = redis.GetInt(BidderPlanRedis, hasKey) >= 1
+	//查询剩余
+	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
+	}
+	return
+}
+
+// GetDailyBoonSVip 每日限量超级订阅领取
+func (BP *JyActivity) GetDailyBoonSVip(userId string) (err error) {
+	var has bool = false
+	var todayBalance int = -1
+
+	var startTime time.Time
+	now := time.Now()
+	startTime, err = time.ParseInLocation(dataUtil.Date_Full_Layout, fmt.Sprintf("%s %s", now.Format(dataUtil.Date_Short_Layout), BP.DailyClock), time.Local)
+	if err != nil {
+		err = fmt.Errorf("时间格式异常")
+		return
+	}
+	if !now.After(startTime) {
+		err = fmt.Errorf("活动没有开始")
+		return
+	}
+
+	has, todayBalance, err = BP.GetDailyBoonDetail(userId)
+	if err != nil {
+		return
+	}
+	if has {
+		err = fmt.Errorf("已领取")
+		return
+	} else if todayBalance == 0 {
+		err = fmt.Errorf("剩余0")
+		return
+	}
+	//剩余数量校验
+	err = func() error {
+		hasKey := fmt.Sprintf(BidderPlanHasDailyBoonKey, userId)
+		if redis.Incr(BidderPlanRedis, hasKey) == 1 {
+			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("剩余为零")
+			}
+			if err := award.GivenSubVip(userId, award.SubVip{
+				Num:          gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.reward.svip", nil).Int64(),
+				ActivityCode: InviteRegisterActivityCode,
+				Date:         time.Now().Unix(),
+				Desc:         "预热福利",
+			}); err != nil {
+				redis.Del(BidderPlanRedis, hasKey)
+				return fmt.Errorf("稍后重试")
+			}
+			if balance == 1 {
+				_ = redis.SetExpire(BidderPlanRedis, todaySumKey, BP.cacheLong())
+			}
+			_ = redis.SetExpire(BidderPlanRedis, hasKey, BP.cacheLong())
+		}
+		return nil
+	}()
+	return err
+}

+ 65 - 2
services/activity/bidderPlan/services.go

@@ -8,6 +8,7 @@ import (
 	"fmt"
 	"github.com/gogf/gf/v2/util/gconv"
 	"log"
+	"time"
 )
 
 // Activity BidderPlan 投标人专属免费计划
@@ -16,6 +17,11 @@ type Activity struct {
 	period   xweb.Mapper `xweb:"/membershipDay/period"`   //活动周期
 	schedule xweb.Mapper `xweb:"/membershipDay/schedule"` //活动进度
 	receive  xweb.Mapper `xweb:"/membershipDay/receive"`  //领取奖励
+	//其他
+	doShare xweb.Mapper `xweb:"/membershipDay/doShare"` //分享
+	//预热-每日福利
+	getDailyBoonDetail xweb.Mapper `xweb:"/membershipDay/getDailyBoonDetail"` //查询每日福利余额
+	getDailyBoonSVip   xweb.Mapper `xweb:"/membershipDay/getDailyBoonSVip"`   //获取限量vip
 }
 
 // Period 活动周期
@@ -24,8 +30,11 @@ func (act *Activity) Period() {
 	userId := gconv.String(act.GetSession("userId"))
 	rData, errMsg := func() (map[string]interface{}, error) {
 		return map[string]interface{}{
-			"start": activity.MembershipDay.St.Unix(),
-			"end":   activity.MembershipDay.Ed.Unix(),
+			"before": activity.MembershipDay.T1.Unix(),  //预热开始时间
+			"clock":  activity.MembershipDay.DailyClock, //预热活动每天开抢时间
+			"start":  activity.MembershipDay.T2.Unix(),  //活动开始
+			"end":    activity.MembershipDay.Ed.Unix(),  //活动结束
+			"now":    time.Now().Unix(),                 //服务器当前时间戳
 		}, nil
 	}()
 	if errMsg != nil {
@@ -99,3 +108,57 @@ func (act *Activity) Receive() {
 	}
 	act.ServeJson(NewResult(rData, errMsg))
 }
+
+// DoShare 分享完成接口
+func (act *Activity) DoShare() {
+	userId := gconv.String(act.GetSession("userId"))
+	rData, errMsg := func() (bool, error) {
+		err := activity.MembershipDay.ShareFinish(userId)
+		if err != nil {
+			return false, nil
+		}
+		return true, nil
+	}()
+	if errMsg != nil {
+		log.Printf("Activity BidderPlan DoShare  %s error:%s\n", userId, errMsg.Error())
+	}
+	act.ServeJson(NewResult(rData, errMsg))
+}
+
+// GetDailyBoonDetail 预热福利-查询每日余额
+func (act *Activity) GetDailyBoonDetail() {
+	userId := gconv.String(act.GetSession("userId"))
+	rData, errMsg := func() (map[string]interface{}, error) {
+		has, todayBalance, err := activity.MembershipDay.GetDailyBoonDetail(userId)
+		if err != nil {
+			return nil, err
+		}
+		return map[string]interface{}{
+			"got":   has,
+			"total": todayBalance,
+		}, nil
+	}()
+	if errMsg != nil {
+		log.Printf("Activity BidderPlan GetDailyBoonDetail  %s error:%s\n", userId, errMsg.Error())
+	}
+	act.ServeJson(NewResult(rData, errMsg))
+}
+
+// GetDailyBoonSVip 预热福利-领取超级订阅
+func (act *Activity) GetDailyBoonSVip() {
+	userId := gconv.String(act.GetSession("userId"))
+	rData, errMsg := func() (bool, error) {
+		if !activity.MembershipDay.FastClickCheck(userId) {
+			return false, fmt.Errorf("操作频繁")
+		}
+		err := activity.MembershipDay.GetDailyBoonSVip(userId)
+		if err != nil {
+			return false, nil
+		}
+		return true, nil
+	}()
+	if errMsg != nil {
+		log.Printf("Activity BidderPlan GetDailyBoonSVip  %s error:%s\n", userId, errMsg.Error())
+	}
+	act.ServeJson(NewResult(rData, errMsg))
+}