集签玩法介绍
集签活动周期分为集签期和开奖期,集签期消耗抽签次数进行抽签,开奖期在集齐所有签后进行抽大奖:
- 获取抽签次数途径:每日签到、邀请好友助力和浏览专区;
- 获取签的途径:抽签、交换签(赠送和索取签)。
集签功能模块梳理
- B端活动、签和大奖信息配置
- 签到、浏览会场
- 邀请助力
- 抽签
- 交换签(赠送和索取签)
- 抽大奖
需求细节:
- 签到:每日签到一次,抽签次数+1,累加签到3、5天抽签次数+2;
- 浏览会场:每日浏览一次,抽签次数+1;
- 邀请助力:被助力后抽签次数+1,每个用户每天可被助力3次,已参与活动的用户不可进行助力;
- 抽签:每个用户抽到的前两张签不能重复,且只能抽到属于自己分组的签(用户和签有AB分组,刺激用户交换签);
- 交换签:用户单个签数量>=2时才能进行赠送签,一次只能赠送一张;用户缺少某个签时才能进行索取签;
- 抽大奖:用户集签所有签在抽奖期内进行抽大奖。
集签表结构设计
集签核心功能设计
邀请助力
- 用户A发起助力时,生成一条 '用户id<->分享码' 的映射纪录;
- 发到站外助力链接:http:xxxx/code={分享码};
- 用户B站外点击助力时,根据分享码查到对应的助力用户A,生成一条助力任务纪录,同时用户A的抽奖机会次数+1。
抽签
抽签时进行AB分组限制+概率限制+库存限制;
# 扣库存逻辑
update draw_info
set draw_send_number = draw_send_number + #{number}
where activity_id = #{activityId}
and draw_id = #{drawId}
and draw_send_number + #{number} <= draw_total_stock
交换签
1)赠送签
用户A赠送签x:
- check用户A签x的可用数量>=2;
- 生成一条交换签纪录(活动id,用户A,?,签x,赠送,交换码); 用户B领取签x:
- 根据交换码解析出一条交换纪录,判断是否完成;
- check用户A签x的可用数量>=2;
- 更新用户A的一条签x信息为不可用;
- 插入一条用户B签x信息;
- 更新交换纪录为已完成;
2)索取签
用户A索取签x:
- check用户A签x的可用数量=0;
- 生成一条交换签纪录(活动id,用户A,?,签x,索取,交换码);
用户B赠予签x:
- 根据交换码解析出一条交换纪录,判断是否完成;
- check用户B签x的可用数量>=2;
- 更新用户B的一条签x信息为不可用;
- 插入一条用户A签x信息。
- 更新交换纪录为已完成;
赠送/领取功能和索取/赠予功能可以分别合并为两个方法,增加参数type:标识是赠送或索取、领取或赠予。
抽大奖
同抽签逻辑;外加兜底奖品(阳光普照奖)
集签后记
- 分享码和交换码存在原因:暴露用户id到站外是很危险的事情;
- 所有的写操作都要加分布式锁,目的防重:key=活动id+用户id;
- 如果B端没有集签配置后台,预留后门接口,用于修改配置信息;
- 集签系统还涉及对接风控部门、财务部门和触达消息系统等,没有指出。