123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- package activity
- import (
- dateFormate "app.yhyue.com/moapp/jybase/date"
- "app.yhyue.com/moapp/jybase/go-logger/logger"
- "app.yhyue.com/moapp/jybase/redis"
- "app.yhyue.com/moapp/message/db"
- "app.yhyue.com/moapp/message/handler/award"
- "fmt"
- "github.com/gogf/gf/v2/os/gcfg"
- "github.com/gogf/gf/v2/os/gctx"
- "github.com/gogf/gf/v2/os/gtime"
- "github.com/gogf/gf/v2/util/gconv"
- "time"
- )
- /*
- 投标人专属免费计划
- */
- type JyActivity struct {
- T1, T2, Ed time.Time //预热活动、开始时间、结束时间
- DailyClock string //预热活动每天开始时间
- ActivityCode string //活动code
- Missions map[string]struct { //任务
- Points int `json:"points"`
- Schedule int `json:"schedule"`
- }
- ScheduleReward map[int]struct { //进度奖励
- SubVip int `json:"subvip"`
- Schedule int `json:"schedule"`
- }
- DoubleEleven bool //22年双十一活动开关
- }
- const (
- BidderPlanRedis = "main" //redis缓存库名
- PowerCacheDb = "newother"
- PowerCacheKey = "bigmember_power_3_%s"
- IsGetUserBaseInfoRedisKey = "baseinfo_%s"
- BidderPlanScheduleCache = "bidderPlan_v1_ScheduleValue_%s" //活动累计进度
- BidderPlanFastClickCheck = "bidderPlanFastClickValue_%s" //防止连点
- BidderPlanScheduleAwardStatus = "bidderPlan_v1_ScheduleAward_%s_%d" //奖励领取状态
- 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" //是否分享
- QuestionnaireSubmit = "questionnaireSubmit_%s" //是否已提交问卷
- )
- var MembershipDay *JyActivity
- func init() {
- MembershipDay = &JyActivity{
- 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.DailyClock = gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.clock").String()
- MembershipDay.ActivityCode = gcfg.Instance().MustGet(gctx.New(), "jyactivity.code").String()
- //加载任务
- if loadMissionsErr := gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions").Scan(&MembershipDay.Missions); loadMissionsErr != nil {
- logger.Error(fmt.Sprintf("JyBidderPlan 加载任务异常 %v", loadMissionsErr))
- }
- //加载进度奖励
- if loadScheduleErr := gcfg.Instance().MustGet(gctx.New(), "jyactivity.scheduleReward").Scan(&MembershipDay.ScheduleReward); loadScheduleErr != nil {
- logger.Error(fmt.Sprintf("JyBidderPlan 加载进度异常 %v", loadScheduleErr))
- }
- MembershipDay.DoubleEleven = gcfg.Instance().MustGet(gctx.New(), "jyactivity.power.switch", false).Bool()
- }
- // InActivity 是否在活动时间内
- // bTime 是否在预热时间段内
- // iTime 是否在正式活动时间内
- // aTime 是否在全部活动时间内
- func (BP *JyActivity) InActivity() (bTime, iTime, aTime bool) {
- now := time.Now()
- bTime = now.After(MembershipDay.T1) && now.Before(MembershipDay.T2)
- aTime = now.After(MembershipDay.T1) && now.Before(MembershipDay.Ed)
- if bTime {
- return
- }
- iTime = now.After(MembershipDay.T2) && now.Before(MembershipDay.Ed)
- return
- }
- // cacheLong 缓存时间
- func (BP *JyActivity) cacheLong() int {
- return 60 * 60 * 24 * 30
- }
- // FastClickCheck 连点处理,防止重复领取
- func (BP *JyActivity) FastClickCheck(userId string) bool {
- key := fmt.Sprintf(BidderPlanFastClickCheck, userId)
- if redis.Incr(BidderPlanRedis, key) == 1 {
- _ = redis.SetExpire(BidderPlanRedis, key, 1)
- return true
- }
- return false
- }
- // GetSchedule 查询活动任务进度
- func (BP *JyActivity) GetSchedule(userId string) int {
- return -redis.GetInt(BidderPlanRedis, fmt.Sprintf(BidderPlanScheduleCache, userId))
- }
- func (BP *JyActivity) GetScheduleQuery(userId string, schedule int) (status int) {
- if BP.GetSchedule(userId) < schedule {
- return 0
- }
- key := fmt.Sprintf(BidderPlanScheduleAwardStatus, userId, schedule)
- if redis.Get(BidderPlanRedis, key) == nil {
- status = gconv.Int(redis.Incr(BidderPlanRedis, key))
- _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
- } else {
- status = redis.GetInt(BidderPlanRedis, key)
- }
- if status > 1 {
- status = 1
- }
- return
- }
- // ScheduleGiven 活动任务进度奖励
- func (BP *JyActivity) ScheduleGiven(userId string, schedule int) error {
- if _, inActivity, _ := BP.InActivity(); !inActivity {
- return fmt.Errorf("不在活动时间内")
- }
- if BP.GetScheduleQuery(userId, schedule) != 1 {
- return fmt.Errorf("非领取状态")
- }
- scheduleAward, ok := BP.ScheduleReward[schedule]
- if !ok {
- return fmt.Errorf("未知请求")
- }
- if err := award.GivenSubVip(userId, award.SubVip{
- Num: gconv.Int64(scheduleAward.SubVip),
- ActivityCode: BP.ActivityCode,
- Desc: fmt.Sprintf("达到%d剑鱼币", schedule),
- Date: time.Now().Unix(),
- }); err != nil {
- return fmt.Errorf("领取奖励异常")
- }
- key := fmt.Sprintf(BidderPlanScheduleAwardStatus, userId, schedule)
- redis.Put(BidderPlanRedis, key, -1, BP.cacheLong())
- return nil
- }
- // AddSchedule 增加活动进度
- func (BP *JyActivity) AddSchedule(userId string, value int) (after int) {
- if value > 0 {
- key := fmt.Sprintf(BidderPlanScheduleCache, userId)
- after = -gconv.Int(redis.Decrby(BidderPlanRedis, key, value))
- if value == after { //首次设置过期值
- _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
- }
- }
- return
- }
- // FreeSubscribe 免费订阅
- type FreeSubscribe struct {
- OAreaP map[string]interface{} `json:"o_area"`
- AKey []interface{} `json:"a_key"`
- }
- // MissionsSVipBuyQuery 购买超级订阅
- // status:0 未完成 1 待领取 -1已领取
- // 是否购买超级订阅
- 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 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
- }
- return false
- }()
- if !finish {
- return 0
- }
- key := fmt.Sprintf(BidderPlanBuySVipStatus, userId)
- if redis.Get(BidderPlanRedis, key) == nil {
- status = gconv.Int(redis.Incr(BidderPlanRedis, key))
- _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
- } else {
- status = redis.GetInt(BidderPlanRedis, key)
- }
- if status > 1 {
- status = 1
- }
- return
- }
- // MissionsSVipBuyGiven 订阅任务领取奖励
- func (BP *JyActivity) MissionsSVipBuyGiven(userId string) error {
- if _, inActivity, _ := BP.InActivity(); !inActivity {
- return fmt.Errorf("不在活动时间内")
- }
- status := BP.MissionsSVipBuyQuery(userId)
- if status != 1 {
- return fmt.Errorf("非领取状态")
- }
- if givenPointsErr := award.GivenPoints(userId, award.Points{
- Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.buysubvip.points").Int64(),
- Type: 1010,
- ActivityCode: BP.ActivityCode,
- Desc: "购买超级订阅任务完成",
- Date: time.Now().Unix(),
- }); givenPointsErr != nil {
- return fmt.Errorf("领取奖励异常")
- }
- //设置已领取
- redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanBuySVipStatus, userId), -1, BP.cacheLong())
- //增加任务进度
- BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.buysubvip.schedule").Int())
- return nil
- }
- // MissionsInviteQuery 邀请任务状态查询
- // status:0 未完成 1 待领取 -1已领取
- func (BP *JyActivity) MissionsInviteQuery(userId string) (status int) {
- status = redis.GetInt(BidderPlanRedis, fmt.Sprintf(BidderPlanInviteMissionsStatus, userId))
- if status > 1 {
- status = 1
- }
- return status
- }
- // MissionsInviteGiven 邀请任务奖励领取
- func (BP *JyActivity) MissionsInviteGiven(userId string) error {
- if _, inActivity, _ := BP.InActivity(); !inActivity {
- return fmt.Errorf("不在活动时间内")
- }
- status := BP.MissionsInviteQuery(userId)
- if status != 1 {
- return fmt.Errorf("非领取状态")
- }
- //领取
- if givenPointsErr := award.GivenPoints(userId, award.Points{
- Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.invite.points").Int64(),
- Type: 1008,
- ActivityCode: BP.ActivityCode,
- Desc: "邀请领好礼任务完成",
- Date: time.Now().Unix(),
- }); givenPointsErr != nil {
- return fmt.Errorf("领取奖励异常")
- }
- //设置已领取
- redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanInviteMissionsStatus, userId), -1, BP.cacheLong())
- //增加任务进度
- BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.invite.schedule").Int())
- return nil
- }
- // MissionsShareQuery 分享活动
- // status:0 未完成 1 待领取 -1已领取
- func (BP *JyActivity) MissionsShareQuery(userId string) (status int) {
- finished, _ := redis.Exists(BidderPlanRedis, fmt.Sprintf(BidderPlanShare, userId))
- if !finished {
- return 0
- }
- key := fmt.Sprintf(BidderPlanShareMissionsStatus, userId)
- if redis.Get(BidderPlanRedis, key) == nil {
- status = gconv.Int(redis.Incr(BidderPlanRedis, key))
- _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
- } else {
- status = redis.GetInt(BidderPlanRedis, key)
- }
- if status > 1 {
- status = 1
- }
- return
- }
- // MissionsShareGiven 分享活动
- func (BP *JyActivity) MissionsShareGiven(userId string) error {
- if _, inActivity, _ := BP.InActivity(); !inActivity {
- return fmt.Errorf("不在活动时间内")
- }
- status := BP.MissionsShareQuery(userId)
- if status != 1 {
- return fmt.Errorf("非领取状态")
- }
- if givenPointsErr := award.GivenPoints(userId, award.Points{
- Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.share.points").Int64(),
- Type: 1011,
- ActivityCode: BP.ActivityCode,
- Desc: "分享活动任务完成",
- Date: time.Now().Unix(),
- }); givenPointsErr != nil {
- return fmt.Errorf("领取奖励异常")
- }
- //设置已领取
- redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanShareMissionsStatus, userId), -1, BP.cacheLong())
- //增加任务进度
- BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.share.schedule").Int())
- return nil
- }
|