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 { St, Ed time.Time //活动开始时间、结束时间 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"` } } const ( BidderPlanRedis = "main" //redis缓存库名 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" //分享 ) 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, 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() //加载任务 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)) } } // InActivity 是否在活动时间内 func (BP *JyActivity) InActivity() bool { now := time.Now() return now.After(MembershipDay.St) && now.Before(MembershipDay.Ed) } // 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 !BP.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 user_id=? `, BP.St.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 !BP.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 !BP.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) { hasMsg := db.Mgo.Count("saleLeads", map[string]interface{}{ "userid": userId, }) > 0 if !hasMsg { 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 !BP.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 }