|
@@ -0,0 +1,308 @@
|
|
|
|
+package activity
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "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"
|
|
|
|
+ "app.yhyue.com/moapp/message/rpc"
|
|
|
|
+ "encoding/json"
|
|
|
|
+ "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 BidderPlan struct {
|
|
|
|
+ St, Ed time.Time //活动开始时间、结束时间
|
|
|
|
+ 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 (
|
|
|
|
+ BidderPlanActivityCode = "bidderPlan"
|
|
|
|
+ BidderPlanRedis = "main"
|
|
|
|
+ //活动累计进度
|
|
|
|
+ BidderPlanScheduleCache = "bidderPlanScheduleValue_%s"
|
|
|
|
+ //奖励领取状态
|
|
|
|
+ BidderPlanScheduleAwardStatus = "bidderPlanScheduleAward_%s_%d"
|
|
|
|
+ BidderPlanSubscribeMissionsStatus = "bidderPlanActivitySubscribeCacheKey_%s"
|
|
|
|
+ BidderPlanInviteMissionsStatus = "bidderPlanActivityInviteCacheKey_%s"
|
|
|
|
+ BidderPlanImproveInfoMissionsStatus = "bidderPlanActivityImproveInfoCacheKey_%s"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+var JyBidderPlan *BidderPlan
|
|
|
|
+
|
|
|
|
+func init() {
|
|
|
|
+ JyBidderPlan = &BidderPlan{
|
|
|
|
+ St: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "bidderPlan.dateRange.st").String(), "2006-01-02T15:04:05Z").Time,
|
|
|
|
+ Ed: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "bidderPlan.dateRange.ed").String(), "2006-01-02T15:04:05Z").Time,
|
|
|
|
+ }
|
|
|
|
+ //加载任务
|
|
|
|
+ if loadMissionsErr := gcfg.Instance().MustGet(gctx.New(), "bidderPlan.missions").Scan(&JyBidderPlan.Missions); loadMissionsErr != nil {
|
|
|
|
+ logger.Error(fmt.Sprintf("JyBidderPlan 加载任务异常 %v", loadMissionsErr))
|
|
|
|
+ }
|
|
|
|
+ //加载进度奖励
|
|
|
|
+ if loadScheduleErr := gcfg.Instance().MustGet(gctx.New(), "bidderPlan.scheduleReward").Scan(&JyBidderPlan.ScheduleReward); loadScheduleErr != nil {
|
|
|
|
+ logger.Error(fmt.Sprintf("JyBidderPlan 加载进度异常 %v", loadScheduleErr))
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// InActivity 是否在活动时间内
|
|
|
|
+func (BP *BidderPlan) InActivity() bool {
|
|
|
|
+ now := time.Now()
|
|
|
|
+ return now.After(JyBidderPlan.St) && now.Before(JyBidderPlan.Ed)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// cacheLong 缓存时间
|
|
|
|
+func (BP *BidderPlan) cacheLong() int {
|
|
|
|
+ //return int(JyBidderPlan.Ed.Unix()-time.Now().Unix()))+ 60 * 60 * 24
|
|
|
|
+ return 60 * 60 * 24 * 30
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// GetSchedule 查询活动任务进度
|
|
|
|
+func (BP *BidderPlan) GetSchedule(userId string) int {
|
|
|
|
+ return -redis.GetInt(BidderPlanRedis, fmt.Sprintf(BidderPlanScheduleCache, userId))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (BP *BidderPlan) 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 *BidderPlan) 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: BidderPlanActivityCode,
|
|
|
|
+ Desc: "",
|
|
|
|
+ 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 *BidderPlan) 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_p"`
|
|
|
|
+ AKey []interface{} `json:"a_key"`
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MissionsSubscribeQuery 订阅任务
|
|
|
|
+// status:0 未完成 1 待领取 -1已领取
|
|
|
|
+func (BP *BidderPlan) MissionsSubscribeQuery(userId string) (status int) {
|
|
|
|
+ //非7天超级订阅或存在订阅内容则完成任务
|
|
|
|
+ finish := func() bool {
|
|
|
|
+ uData, ok := db.Mgo.FindById("user", userId, `{"o_jy":1,"i_vip_status":1,"i_member_status":1}`)
|
|
|
|
+ if !ok || uData == nil || len(*uData) == 0 {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ if gconv.Int((*uData)["i_vip_status"]) > 0 { //超级订阅
|
|
|
|
+ return true
|
|
|
|
+ } else if gconv.Int((*uData)["i_member_status"]) > 0 { //大会员
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ //查询免费订阅是否完成
|
|
|
|
+ vStatus, err := rpc.GetUserVipBaseMsgByRpc(userId)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ if vStatus.EntnicheStatus > 0 {
|
|
|
|
+ return true
|
|
|
|
+ } else {
|
|
|
|
+ bytes := gconv.Bytes((*uData)["o_jy"])
|
|
|
|
+ if bytes == nil || len(bytes) == 0 {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ freeSub := FreeSubscribe{}
|
|
|
|
+ if err = json.Unmarshal(bytes, &freeSub); err != nil {
|
|
|
|
+ fmt.Println(err)
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ if len(freeSub.AKey) > 0 && len(freeSub.OAreaP) > 0 {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ if !finish {
|
|
|
|
+ return 0
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ key := fmt.Sprintf(BidderPlanSubscribeMissionsStatus, 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
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MissionsSubscribeGiven 订阅任务领取奖励
|
|
|
|
+func (BP *BidderPlan) MissionsSubscribeGiven(userId string) error {
|
|
|
|
+ if !BP.InActivity() {
|
|
|
|
+ return fmt.Errorf("活动已结束")
|
|
|
|
+ }
|
|
|
|
+ status := BP.MissionsSubscribeQuery(userId)
|
|
|
|
+ if status != 1 {
|
|
|
|
+ return fmt.Errorf("非领取状态")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if givenPointsErr := award.GivenPoints(userId, award.Points{
|
|
|
|
+ Num: gcfg.Instance().MustGet(gctx.New(), "bidderPlan.missions.subscribe.points").Int64(),
|
|
|
|
+ Type: 1006,
|
|
|
|
+ ActivityCode: BidderPlanActivityCode,
|
|
|
|
+ Desc: "免费订阅任务完成",
|
|
|
|
+ Date: time.Now().Unix(),
|
|
|
|
+ }); givenPointsErr != nil {
|
|
|
|
+ return fmt.Errorf("领取奖励异常")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //设置已领取
|
|
|
|
+ redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanSubscribeMissionsStatus, userId), -1, BP.cacheLong())
|
|
|
|
+ //增加任务进度
|
|
|
|
+ BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "bidderPlan.missions.subscribe.schedule").Int())
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MissionsInviteQuery 邀请任务状态查询
|
|
|
|
+// status:0 未完成 1 待领取 -1已领取
|
|
|
|
+func (BP *BidderPlan) MissionsInviteQuery(userId string) (status int) {
|
|
|
|
+ status = redis.GetInt(BidderPlanRedis, fmt.Sprintf(BidderPlanInviteMissionsStatus, userId))
|
|
|
|
+ if status > 1 {
|
|
|
|
+ status = 1
|
|
|
|
+ }
|
|
|
|
+ return status
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MissionsInviteGiven 邀请任务奖励领取
|
|
|
|
+func (BP *BidderPlan) 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(), "bidderPlan.missions.invite.points").Int64(),
|
|
|
|
+ Type: 1007,
|
|
|
|
+ ActivityCode: BidderPlanActivityCode,
|
|
|
|
+ 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(), "bidderPlan.missions.invite.schedule").Int())
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MissionsImproveInfoQuery 完善信息任务
|
|
|
|
+// status:0 未完成 1 待领取 -1已领取
|
|
|
|
+func (BP *BidderPlan) MissionsImproveInfoQuery(userId string) (status int) {
|
|
|
|
+ hasMsg := db.Mgo.Count("saleLeads", map[string]interface{}{
|
|
|
|
+ "userid": userId,
|
|
|
|
+ }) > 0
|
|
|
|
+ if !hasMsg {
|
|
|
|
+ return 0
|
|
|
|
+ }
|
|
|
|
+ key := fmt.Sprintf(BidderPlanImproveInfoMissionsStatus, 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
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MissionsImproveInfoGiven 完善信息奖励领取
|
|
|
|
+func (BP *BidderPlan) MissionsImproveInfoGiven(userId string) error {
|
|
|
|
+ if !BP.InActivity() {
|
|
|
|
+ return fmt.Errorf("活动已结束")
|
|
|
|
+ }
|
|
|
|
+ status := BP.MissionsImproveInfoQuery(userId)
|
|
|
|
+ if status != 1 {
|
|
|
|
+ return fmt.Errorf("非领取状态")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if givenPointsErr := award.GivenPoints(userId, award.Points{
|
|
|
|
+ Num: gcfg.Instance().MustGet(gctx.New(), "bidderPlan.missions.improveInfo.points").Int64(),
|
|
|
|
+ Type: 1008,
|
|
|
|
+ ActivityCode: BidderPlanActivityCode,
|
|
|
|
+ Desc: "完善信息任务完成",
|
|
|
|
+ Date: time.Now().Unix(),
|
|
|
|
+ }); givenPointsErr != nil {
|
|
|
|
+ return fmt.Errorf("领取奖励异常")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //设置已领取
|
|
|
|
+ redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanImproveInfoMissionsStatus, userId), -1, BP.cacheLong())
|
|
|
|
+ //增加任务进度
|
|
|
|
+ BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "bidderPlan.missions.improveInfo.schedule").Int())
|
|
|
|
+ return nil
|
|
|
|
+}
|