bidderPlan.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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. "time"
  14. )
  15. /*
  16. 投标人专属免费计划
  17. */
  18. type JyActivity struct {
  19. St, Ed time.Time //活动开始时间、结束时间
  20. ActivityCode string //活动code
  21. Missions map[string]struct { //任务
  22. Points int `json:"points"`
  23. Schedule int `json:"schedule"`
  24. }
  25. ScheduleReward map[int]struct { //进度奖励
  26. SubVip int `json:"subvip"`
  27. Schedule int `json:"schedule"`
  28. }
  29. }
  30. const (
  31. BidderPlanRedis = "main" //redis缓存库名
  32. BidderPlanScheduleCache = "bidderPlan_v1_ScheduleValue_%s" //活动累计进度
  33. BidderPlanFastClickCheck = "bidderPlanFastClickValue_%s" //防止连点
  34. BidderPlanScheduleAwardStatus = "bidderPlan_v1_ScheduleAward_%s_%d" //奖励领取状态
  35. BidderPlanBuySVipStatus = "bidderPlanActivity_v1_BuySVipCacheKey_%s" //购买
  36. BidderPlanInviteMissionsStatus = "bidderPlanActivity_v1_InviteCacheKey_%s" //邀请
  37. BidderPlanShareMissionsStatus = "bidderPlanActivity_v1_ShareCacheKey_%s" //分享
  38. )
  39. var MembershipDay *JyActivity
  40. func init() {
  41. MembershipDay = &JyActivity{
  42. St: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.st").String(), "2006-01-02T15:04:05Z").Time,
  43. Ed: gtime.NewFromStrLayout(gcfg.Instance().MustGet(gctx.New(), "jyactivity.dateRange.ed").String(), "2006-01-02T15:04:05Z").Time,
  44. }
  45. MembershipDay.ActivityCode = gcfg.Instance().MustGet(gctx.New(), "jyactivity.code").String()
  46. //加载任务
  47. if loadMissionsErr := gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions").Scan(&MembershipDay.Missions); loadMissionsErr != nil {
  48. logger.Error(fmt.Sprintf("JyBidderPlan 加载任务异常 %v", loadMissionsErr))
  49. }
  50. //加载进度奖励
  51. if loadScheduleErr := gcfg.Instance().MustGet(gctx.New(), "jyactivity.scheduleReward").Scan(&MembershipDay.ScheduleReward); loadScheduleErr != nil {
  52. logger.Error(fmt.Sprintf("JyBidderPlan 加载进度异常 %v", loadScheduleErr))
  53. }
  54. }
  55. // InActivity 是否在活动时间内
  56. func (BP *JyActivity) InActivity() bool {
  57. now := time.Now()
  58. return now.After(MembershipDay.St) && now.Before(MembershipDay.Ed)
  59. }
  60. // cacheLong 缓存时间
  61. func (BP *JyActivity) cacheLong() int {
  62. return 60 * 60 * 24 * 30
  63. }
  64. // FastClickCheck 连点处理,防止重复领取
  65. func (BP *JyActivity) FastClickCheck(userId string) bool {
  66. key := fmt.Sprintf(BidderPlanFastClickCheck, userId)
  67. if redis.Incr(BidderPlanRedis, key) == 1 {
  68. _ = redis.SetExpire(BidderPlanRedis, key, 1)
  69. return true
  70. }
  71. return false
  72. }
  73. // GetSchedule 查询活动任务进度
  74. func (BP *JyActivity) GetSchedule(userId string) int {
  75. return -redis.GetInt(BidderPlanRedis, fmt.Sprintf(BidderPlanScheduleCache, userId))
  76. }
  77. func (BP *JyActivity) GetScheduleQuery(userId string, schedule int) (status int) {
  78. if BP.GetSchedule(userId) < schedule {
  79. return 0
  80. }
  81. key := fmt.Sprintf(BidderPlanScheduleAwardStatus, userId, schedule)
  82. if redis.Get(BidderPlanRedis, key) == nil {
  83. status = gconv.Int(redis.Incr(BidderPlanRedis, key))
  84. _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
  85. } else {
  86. status = redis.GetInt(BidderPlanRedis, key)
  87. }
  88. if status > 1 {
  89. status = 1
  90. }
  91. return
  92. }
  93. // ScheduleGiven 活动任务进度奖励
  94. func (BP *JyActivity) ScheduleGiven(userId string, schedule int) error {
  95. if !BP.InActivity() {
  96. return fmt.Errorf("活动已结束")
  97. }
  98. if BP.GetScheduleQuery(userId, schedule) != 1 {
  99. return fmt.Errorf("非领取状态")
  100. }
  101. scheduleAward, ok := BP.ScheduleReward[schedule]
  102. if !ok {
  103. return fmt.Errorf("未知请求")
  104. }
  105. if err := award.GivenSubVip(userId, award.SubVip{
  106. Num: gconv.Int64(scheduleAward.SubVip),
  107. ActivityCode: BP.ActivityCode,
  108. Desc: fmt.Sprintf("达到%d剑鱼币", schedule),
  109. Date: time.Now().Unix(),
  110. }); err != nil {
  111. return fmt.Errorf("领取奖励异常")
  112. }
  113. key := fmt.Sprintf(BidderPlanScheduleAwardStatus, userId, schedule)
  114. redis.Put(BidderPlanRedis, key, -1, BP.cacheLong())
  115. return nil
  116. }
  117. // AddSchedule 增加活动进度
  118. func (BP *JyActivity) AddSchedule(userId string, value int) (after int) {
  119. if value > 0 {
  120. key := fmt.Sprintf(BidderPlanScheduleCache, userId)
  121. after = -gconv.Int(redis.Decrby(BidderPlanRedis, key, value))
  122. if value == after { //首次设置过期值
  123. _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
  124. }
  125. }
  126. return
  127. }
  128. // FreeSubscribe 免费订阅
  129. type FreeSubscribe struct {
  130. OAreaP map[string]interface{} `json:"o_area"`
  131. AKey []interface{} `json:"a_key"`
  132. }
  133. // MissionsSVipBuyQuery 购买超级订阅
  134. // status:0 未完成 1 待领取 -1已领取
  135. // 是否购买超级订阅
  136. func (BP *JyActivity) MissionsSVipBuyQuery(userId string) (status int) {
  137. finish := func() bool {
  138. 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)
  139. if count > 0 {
  140. return true
  141. }
  142. return false
  143. }()
  144. if !finish {
  145. return 0
  146. }
  147. key := fmt.Sprintf(BidderPlanBuySVipStatus, userId)
  148. if redis.Get(BidderPlanRedis, key) == nil {
  149. status = gconv.Int(redis.Incr(BidderPlanRedis, key))
  150. _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
  151. } else {
  152. status = redis.GetInt(BidderPlanRedis, key)
  153. }
  154. if status > 1 {
  155. status = 1
  156. }
  157. return
  158. }
  159. // MissionsSVipBuyGiven 订阅任务领取奖励
  160. func (BP *JyActivity) MissionsSVipBuyGiven(userId string) error {
  161. if !BP.InActivity() {
  162. return fmt.Errorf("活动已结束")
  163. }
  164. status := BP.MissionsSVipBuyQuery(userId)
  165. if status != 1 {
  166. return fmt.Errorf("非领取状态")
  167. }
  168. if givenPointsErr := award.GivenPoints(userId, award.Points{
  169. Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.buysubvip.points").Int64(),
  170. Type: 1010,
  171. ActivityCode: BP.ActivityCode,
  172. Desc: "购买超级订阅任务完成",
  173. Date: time.Now().Unix(),
  174. }); givenPointsErr != nil {
  175. return fmt.Errorf("领取奖励异常")
  176. }
  177. //设置已领取
  178. redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanBuySVipStatus, userId), -1, BP.cacheLong())
  179. //增加任务进度
  180. BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.buysubvip.schedule").Int())
  181. return nil
  182. }
  183. // MissionsInviteQuery 邀请任务状态查询
  184. // status:0 未完成 1 待领取 -1已领取
  185. func (BP *JyActivity) MissionsInviteQuery(userId string) (status int) {
  186. status = redis.GetInt(BidderPlanRedis, fmt.Sprintf(BidderPlanInviteMissionsStatus, userId))
  187. if status > 1 {
  188. status = 1
  189. }
  190. return status
  191. }
  192. // MissionsInviteGiven 邀请任务奖励领取
  193. func (BP *JyActivity) MissionsInviteGiven(userId string) error {
  194. if !BP.InActivity() {
  195. return fmt.Errorf("活动已结束")
  196. }
  197. status := BP.MissionsInviteQuery(userId)
  198. if status != 1 {
  199. return fmt.Errorf("非领取状态")
  200. }
  201. //领取
  202. if givenPointsErr := award.GivenPoints(userId, award.Points{
  203. Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.invite.points").Int64(),
  204. Type: 1008,
  205. ActivityCode: BP.ActivityCode,
  206. Desc: "邀请领好礼任务完成",
  207. Date: time.Now().Unix(),
  208. }); givenPointsErr != nil {
  209. return fmt.Errorf("领取奖励异常")
  210. }
  211. //设置已领取
  212. redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanInviteMissionsStatus, userId), -1, BP.cacheLong())
  213. //增加任务进度
  214. BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.invite.schedule").Int())
  215. return nil
  216. }
  217. // MissionsShareQuery 分享活动
  218. // status:0 未完成 1 待领取 -1已领取
  219. func (BP *JyActivity) MissionsShareQuery(userId string) (status int) {
  220. hasMsg := db.Mgo.Count("saleLeads", map[string]interface{}{
  221. "userid": userId,
  222. }) > 0
  223. if !hasMsg {
  224. return 0
  225. }
  226. key := fmt.Sprintf(BidderPlanShareMissionsStatus, userId)
  227. if redis.Get(BidderPlanRedis, key) == nil {
  228. status = gconv.Int(redis.Incr(BidderPlanRedis, key))
  229. _ = redis.SetExpire(BidderPlanRedis, key, BP.cacheLong())
  230. } else {
  231. status = redis.GetInt(BidderPlanRedis, key)
  232. }
  233. if status > 1 {
  234. status = 1
  235. }
  236. return
  237. }
  238. // MissionsShareGiven 分享活动
  239. func (BP *JyActivity) MissionsShareGiven(userId string) error {
  240. if !BP.InActivity() {
  241. return fmt.Errorf("活动已结束")
  242. }
  243. status := BP.MissionsShareQuery(userId)
  244. if status != 1 {
  245. return fmt.Errorf("非领取状态")
  246. }
  247. if givenPointsErr := award.GivenPoints(userId, award.Points{
  248. Num: gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.share.points").Int64(),
  249. Type: 1011,
  250. ActivityCode: BP.ActivityCode,
  251. Desc: "分享活动任务完成",
  252. Date: time.Now().Unix(),
  253. }); givenPointsErr != nil {
  254. return fmt.Errorf("领取奖励异常")
  255. }
  256. //设置已领取
  257. redis.Put(BidderPlanRedis, fmt.Sprintf(BidderPlanShareMissionsStatus, userId), -1, BP.cacheLong())
  258. //增加任务进度
  259. BP.AddSchedule(userId, gcfg.Instance().MustGet(gctx.New(), "jyactivity.missions.share.schedule").Int())
  260. return nil
  261. }