jyActivity.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. package activity
  2. import (
  3. dateFormate "app.yhyue.com/moapp/jybase/date"
  4. "app.yhyue.com/moapp/jybase/go-logger/logger"
  5. "app.yhyue.com/moapp/jybase/redis"
  6. "app.yhyue.com/moapp/message/db"
  7. "app.yhyue.com/moapp/message/handler/award"
  8. "fmt"
  9. "github.com/gogf/gf/v2/os/gcfg"
  10. "github.com/gogf/gf/v2/os/gctx"
  11. "github.com/gogf/gf/v2/os/gtime"
  12. "github.com/gogf/gf/v2/util/gconv"
  13. "sync"
  14. "time"
  15. )
  16. /*
  17. 投标人专属免费计划
  18. */
  19. type JyActivity struct {
  20. T1, T2, Ed time.Time //预热活动、开始时间、结束时间
  21. DailyClock string //预热活动每天开始时间
  22. ActivityCode string //活动code
  23. Missions map[string]struct { //任务
  24. Points int `json:"points"`
  25. Schedule int `json:"schedule"`
  26. }
  27. ScheduleReward map[int]struct { //进度奖励
  28. SubVip int `json:"subvip"`
  29. Schedule int `json:"schedule"`
  30. }
  31. DoubleEleven bool //22年双十一活动开关
  32. }
  33. //大会员状态redis缓存
  34. type BigVipBaseMsg struct {
  35. Status int `json:"status"` //大会员状态
  36. VipStatus int `json:"vip_status"` //超级订阅状态
  37. EntnicheStatus int `json:"entniche_status"` //商机管理状态
  38. EntIsNew bool `json:"entIsNew"` //是否是新版商机管理用户
  39. }
  40. const (
  41. BidderPlanRedis = "main" //redis缓存库名
  42. PowerCacheDb = "newother"
  43. PowerCacheKey = "bigmember_power_3_%s"
  44. IsGetUserBaseInfoRedisKey = "baseinfo_%s"
  45. BidderPlanScheduleCache = "bidderPlan_v1_ScheduleValue_%s" //活动累计进度
  46. BidderPlanFastClickCheck = "bidderPlanFastClickValue_%s" //防止连点
  47. BidderPlanScheduleAwardStatus = "bidderPlan_v1_ScheduleAward_%s_%d" //奖励领取状态
  48. BidderPlanBuySVipStatus = "bidderPlanActivity_v1_BuySVipCacheKey_%s" //购买
  49. BidderPlanInviteMissionsStatus = "bidderPlanActivity_v1_InviteCacheKey_%s" //邀请
  50. BidderPlanShareMissionsStatus = "bidderPlanActivity_v1_ShareCacheKey_%s" //分享
  51. BidderPlanDailyBoonKey = "bidderPlanActivity_v1_DailyBoon_%s" //领取每日限量福利
  52. BidderPlanHasDailyBoonKey = "bidderPlanActivity_v1_HasDailyBoon_%s" //是否领取过每日限量福利
  53. BidderPlanShare = "bidderPlanActivity_v1_ShareOk_%s" //是否分享
  54. QuestionnaireSubmit = "questionnaireSubmit_%s" //是否已提交问卷
  55. WinnerInfoKey = "winnerinfokey_22_11_11"
  56. )
  57. var (
  58. MembershipDay *JyActivity
  59. ActivityLock = &sync.Mutex{}
  60. )
  61. func init() {
  62. MembershipDay = &JyActivity{
  63. T1: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.t1").String(), "2006-01-02T15:04:05Z").Time,
  64. T2: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.t2").String(), "2006-01-02T15:04:05Z").Time,
  65. Ed: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.ed").String(), "2006-01-02T15:04:05Z").Time,
  66. }
  67. MembershipDay.DailyClock = gcfg.Instance().MustGet(gctx.New(), "jyactivity.dailyBoon.clock").String()
  68. MembershipDay.ActivityCode = gcfg.Instance().MustGet(gctx.New(), "jyactivity.code").String()
  69. //加载任务
  70. if loadMissionsErr := gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions").Scan(&MembershipDay.Missions); loadMissionsErr != nil {
  71. logger.Error(fmt.Sprintf("JyBidderPlan 加载任务异常 %v", loadMissionsErr))
  72. }
  73. //加载进度奖励
  74. if loadScheduleErr := gcfg.Instance().MustGet(gctx.New(), "jyactivity.scheduleReward").Scan(&MembershipDay.ScheduleReward); loadScheduleErr != nil {
  75. logger.Error(fmt.Sprintf("JyBidderPlan 加载进度异常 %v", loadScheduleErr))
  76. }
  77. MembershipDay.DoubleEleven = gcfg.Instance().MustGet(gctx.New(), "jyactivity.power.switch", false).Bool()
  78. }
  79. // InActivity 是否在活动时间内
  80. // bTime 是否在预热时间段内
  81. // iTime 是否在正式活动时间内
  82. // aTime 是否在全部活动时间内
  83. func (BP *JyActivity) InActivity() (bTime, iTime, aTime bool) {
  84. now := time.Now()
  85. bTime = now.After(MembershipDay.T1) && now.Before(MembershipDay.T2)
  86. aTime = now.After(MembershipDay.T1) && now.Before(MembershipDay.Ed)
  87. if bTime {
  88. return
  89. }
  90. iTime = now.After(MembershipDay.T2) && now.Before(MembershipDay.Ed)
  91. return
  92. }
  93. // cacheLong 缓存时间
  94. func (BP *JyActivity) cacheLong() int {
  95. return 60 * 60 * 24 * 30
  96. }
  97. // FastClickCheck 连点处理,防止重复领取
  98. func (BP *JyActivity) FastClickCheck(userId string) bool {
  99. key := fmt.Sprintf(BidderPlanFastClickCheck, userId)
  100. if redis.Incr(BidderPlanRedis, key) == 1 {
  101. _ = redis.SetExpire(BidderPlanRedis, key, 1)
  102. return true
  103. }
  104. return false
  105. }
  106. // GetSchedule 查询活动任务进度
  107. func (BP *JyActivity) GetSchedule(userId string) int {
  108. return -redis.GetInt(BidderPlanRedis, fmt.Sprintf(BidderPlanScheduleCache, userId))
  109. }
  110. func (BP *JyActivity) GetScheduleQuery(userId string, schedule int) (status int) {
  111. if BP.GetSchedule(userId) < schedule {
  112. return 0
  113. }
  114. key := fmt.Sprintf(BidderPlanScheduleAwardStatus, userId, schedule)
  115. if redis.Get(BidderPlanRedis, key) == nil {
  116. status = gconv.Int(redis.Incr(BidderPlanRedis, key))
  117. _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
  118. } else {
  119. status = redis.GetInt(BidderPlanRedis, key)
  120. }
  121. if status > 1 {
  122. status = 1
  123. }
  124. return
  125. }
  126. // ScheduleGiven 活动任务进度奖励
  127. func (BP *JyActivity) ScheduleGiven(userId string, schedule int) error {
  128. if _, inActivity, _ := BP.InActivity(); !inActivity {
  129. return fmt.Errorf("不在活动时间内")
  130. }
  131. if BP.GetScheduleQuery(userId, schedule) != 1 {
  132. return fmt.Errorf("非领取状态")
  133. }
  134. scheduleAward, ok := BP.ScheduleReward[schedule]
  135. if !ok {
  136. return fmt.Errorf("未知请求")
  137. }
  138. if err := award.GivenSubVip(userId, award.SubVip{
  139. Num: gconv.Int64(scheduleAward.SubVip),
  140. ActivityCode: BP.ActivityCode,
  141. Desc: fmt.Sprintf("达到%d剑鱼币", schedule),
  142. Date: time.Now().Unix(),
  143. }); err != nil {
  144. return fmt.Errorf("领取奖励异常")
  145. }
  146. key := fmt.Sprintf(BidderPlanScheduleAwardStatus, userId, schedule)
  147. redis.Put(BidderPlanRedis, key, -1, BP.cacheLong())
  148. return nil
  149. }
  150. // AddSchedule 增加活动进度
  151. func (BP *JyActivity) AddSchedule(userId string, value int) (after int) {
  152. if value > 0 {
  153. key := fmt.Sprintf(BidderPlanScheduleCache, userId)
  154. after = -gconv.Int(redis.Decrby(BidderPlanRedis, key, value))
  155. if value == after { //首次设置过期值
  156. _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
  157. }
  158. }
  159. return
  160. }
  161. // FreeSubscribe 免费订阅
  162. type FreeSubscribe struct {
  163. OAreaP map[string]interface{} `json:"o_area"`
  164. AKey []interface{} `json:"a_key"`
  165. }
  166. // MissionsSVipBuyQuery 购买超级订阅
  167. // status:0 未完成 1 待领取 -1已领取
  168. // 是否购买超级订阅
  169. func (BP *JyActivity) MissionsSVipBuyQuery(userId string) (status int) {
  170. finish := func() bool {
  171. 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)
  172. if count > 0 {
  173. return true
  174. }
  175. return false
  176. }()
  177. if !finish {
  178. return 0
  179. }
  180. key := fmt.Sprintf(BidderPlanBuySVipStatus, userId)
  181. if redis.Get(BidderPlanRedis, key) == nil {
  182. status = gconv.Int(redis.Incr(BidderPlanRedis, key))
  183. _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
  184. } else {
  185. status = redis.GetInt(BidderPlanRedis, key)
  186. }
  187. if status > 1 {
  188. status = 1
  189. }
  190. return
  191. }
  192. // MissionsSVipBuyGiven 订阅任务领取奖励
  193. func (BP *JyActivity) MissionsSVipBuyGiven(userId string) error {
  194. if _, inActivity, _ := BP.InActivity(); !inActivity {
  195. return fmt.Errorf("不在活动时间内")
  196. }
  197. status := BP.MissionsSVipBuyQuery(userId)
  198. if status != 1 {
  199. return fmt.Errorf("非领取状态")
  200. }
  201. if givenPointsErr := award.GivenPoints(userId, award.Points{
  202. Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.buysubvip.points").Int64(),
  203. Type: 1010,
  204. ActivityCode: BP.ActivityCode,
  205. Desc: "购买超级订阅任务完成",
  206. Date: time.Now().Unix(),
  207. }); givenPointsErr != nil {
  208. return fmt.Errorf("领取奖励异常")
  209. }
  210. //设置已领取
  211. redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanBuySVipStatus, userId), -1, BP.cacheLong())
  212. //增加任务进度
  213. BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.buysubvip.schedule").Int())
  214. return nil
  215. }
  216. // MissionsInviteQuery 邀请任务状态查询
  217. // status:0 未完成 1 待领取 -1已领取
  218. func (BP *JyActivity) MissionsInviteQuery(userId string) (status int) {
  219. status = redis.GetInt(BidderPlanRedis, fmt.Sprintf(BidderPlanInviteMissionsStatus, userId))
  220. if status > 1 {
  221. status = 1
  222. }
  223. return status
  224. }
  225. // MissionsInviteGiven 邀请任务奖励领取
  226. func (BP *JyActivity) MissionsInviteGiven(userId string) error {
  227. if _, inActivity, _ := BP.InActivity(); !inActivity {
  228. return fmt.Errorf("不在活动时间内")
  229. }
  230. status := BP.MissionsInviteQuery(userId)
  231. if status != 1 {
  232. return fmt.Errorf("非领取状态")
  233. }
  234. //领取
  235. if givenPointsErr := award.GivenPoints(userId, award.Points{
  236. Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.invite.points").Int64(),
  237. Type: 1008,
  238. ActivityCode: BP.ActivityCode,
  239. Desc: "邀请领好礼任务完成",
  240. Date: time.Now().Unix(),
  241. }); givenPointsErr != nil {
  242. return fmt.Errorf("领取奖励异常")
  243. }
  244. //设置已领取
  245. redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanInviteMissionsStatus, userId), -1, BP.cacheLong())
  246. //增加任务进度
  247. BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.invite.schedule").Int())
  248. return nil
  249. }
  250. // MissionsShareQuery 分享活动
  251. // status:0 未完成 1 待领取 -1已领取
  252. func (BP *JyActivity) MissionsShareQuery(userId string) (status int) {
  253. finished, _ := redis.Exists(BidderPlanRedis, fmt.Sprintf(BidderPlanShare, userId))
  254. if !finished {
  255. return 0
  256. }
  257. key := fmt.Sprintf(BidderPlanShareMissionsStatus, userId)
  258. if redis.Get(BidderPlanRedis, key) == nil {
  259. status = gconv.Int(redis.Incr(BidderPlanRedis, key))
  260. _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
  261. } else {
  262. status = redis.GetInt(BidderPlanRedis, key)
  263. }
  264. if status > 1 {
  265. status = 1
  266. }
  267. return
  268. }
  269. // MissionsShareGiven 分享活动
  270. func (BP *JyActivity) MissionsShareGiven(userId string) error {
  271. if _, inActivity, _ := BP.InActivity(); !inActivity {
  272. return fmt.Errorf("不在活动时间内")
  273. }
  274. status := BP.MissionsShareQuery(userId)
  275. if status != 1 {
  276. return fmt.Errorf("非领取状态")
  277. }
  278. if givenPointsErr := award.GivenPoints(userId, award.Points{
  279. Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.share.points").Int64(),
  280. Type: 1011,
  281. ActivityCode: BP.ActivityCode,
  282. Desc: "分享活动任务完成",
  283. Date: time.Now().Unix(),
  284. }); givenPointsErr != nil {
  285. return fmt.Errorf("领取奖励异常")
  286. }
  287. //设置已领取
  288. redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanShareMissionsStatus, userId), -1, BP.cacheLong())
  289. //增加任务进度
  290. BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.share.schedule").Int())
  291. return nil
  292. }