最近开发了比较多类似商城类的项目,自然不可避免的优惠券的设计。
之前也没有做过此模块,加上 monday-shop 商城项目也没有此模块,正好趁着这段时间慢慢加上此功能。
参考一号店的样式,做了类似一个这样的模板
下面讲讲大概的逻辑:
- 首先我们需要一个优惠券模板表
- 这个表用于后台生成优惠券模板,然后会员兑换、领取
- 还需要一张用户优惠券表
- 表结构大概如下
# 模板表
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '优惠券标题',
`amount` decimal(8,2) NOT NULL COMMENT '满减金额',
`full_amount` decimal(8,2) NOT NULL COMMENT '门槛金额',
`score` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用多少积分兑换优惠券',
`start_date` date NOT NULL COMMENT '开始日期',
`end_date` date NOT NULL COMMENT '结束日期',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
# 优惠券表
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned COMMENT '会员主键',
`title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '优惠券标题',
`amount` decimal(8,2) NOT NULL COMMENT '满减金额',
`full_amount` decimal(8,2) NOT NULL COMMENT '门槛金额',
`start_date` date NOT NULL COMMENT '开始日期',
`end_date` date NOT NULL COMMENT '结束日期',
`used_at` timestamp NULL DEFAULT NULL COMMENT '使用日期',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
我们可以看到两张表很类似,大致业务流程如下
- 运维人员在后台发布活动(创建优惠券模板)
- 运维人员填入券标题,如某某假日优惠券等等
- 并包含满减金额和门槛金额(门槛金额为 0,代表无门槛券)
score
代表需要积分兑换,某些商城需要积分才能兑换优惠券- 最后加上一个使用日期的限制即可
- 优惠券模板发布之后,会员即可在活动中心点击领取
- 如果会员券需要积分则判断会员积分是否充足
- 某些商城会限制同一种优惠券只可领取一次
- 之后直接从模板表把
title, amount, full_amount, start_date, end_date
公共字段复制给会员券表 - 领取之后,会员可在自己的券中心查看
- 优惠券的使用
- 当会员下单,判断订单的总金额是否大于优惠券的门槛金额,如果满足即可使用
- 标记优惠券的
used_at
为当前时间,代表优惠券已经使用,订单并关联优惠券主键
- 优惠券的退单
- 当发生优惠券退单时,实际退还优惠之后的金额
- 此订单和优惠券的关联取消掉
- 把优惠券的
used_at
标记为null
代表未使用
类似京东还有一个比较有趣的功能,是我比较喜欢的。
就是使用兑换码来兑换优惠券。
我们可以新建一张这样的表。
# 兑换码表
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`template_id` int(10) COMMENT '优惠券模板主键',
`code` varchar(191) COMMENT '兑换码',
`user_id` int(10) NULL COMMENT '使用的会员主键',
`used_at` timestamp NULL DEFAULT NULL COMMENT '使用日期',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
- 使用流程如下
- 运维人员可以预先生成一批兑换码
- 此时只需要有
template_id
关联到券模板和code
(随机码生成)即可 - 发放有两种方式,条件筛选批量发放或者单独对某个会员方法
- 发放之后绑定
user_id
关联会员(也可不需要绑定用户)
- 此时只需要有
- 会员收到提醒,得到兑换码
- 去到兑奖区,输入兑换码
- 通过
used_at
判断是否使用过,user_id
判断是否为正确的用户 - 通过
template_id
找到优惠券模板,并为此会员生成一张优惠券 - 标记次兑换码已经使用
- 运维人员可以预先生成一批兑换码