Featured image of post 优惠券功能的实现

优惠券功能的实现

给星期一商城加上一个优惠券功能

最近开发了比较多类似商城类的项目,自然不可避免的优惠券的设计。
之前也没有做过此模块,加上 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找到优惠券模板,并为此会员生成一张优惠券
      • 标记次兑换码已经使用