Skip to content

营销中心表结构如下 alt text

1.优惠券

1.1 优惠券模版

优惠劵模版,由卖家在管理后台配置,提供给买家领取成优惠劵

CREATE TABLE `promotion_coupon_template` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '模板编号,自增唯一。',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '优惠劵名',
  
  `status` tinyint NOT NULL COMMENT '状态',

  `take_type` tinyint NOT NULL COMMENT '领取方式',  
  `total_count` int NOT NULL COMMENT '发放数量, -1 - 则表示不限制',
  `take_limit_count` tinyint NOT NULL COMMENT '每人限领个数, -1 - 则表示不限制',
  `take_count` int NOT NULL DEFAULT '0' COMMENT '领取优惠券的数量',
  `use_count` int NOT NULL DEFAULT '0' COMMENT '使用优惠券的次数',
  
  `use_price` int NOT NULL COMMENT '是否设置满多少金额可用,单位:分',
  `product_scope` tinyint NOT NULL COMMENT '商品范围',
  `product_scope_values` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品范围编号的数组',
  
  `validity_type` tinyint NOT NULL COMMENT '生效日期类型',
  `valid_start_time` datetime DEFAULT NULL COMMENT '固定日期-生效开始时间',
  `valid_end_time` datetime DEFAULT NULL COMMENT '固定日期-生效结束时间',
  `fixed_start_term` int DEFAULT NULL COMMENT '领取日期-开始天数',
  `fixed_end_term` int DEFAULT NULL COMMENT '领取日期-结束天数',
  
  `discount_type` int NOT NULL COMMENT '优惠类型:1-代金劵;2-折扣劵\n',
  `discount_percent` tinyint DEFAULT NULL COMMENT '折扣百分比',
  `discount_price` int DEFAULT NULL COMMENT '优惠金额,单位:分',
  `discount_limit_price` int DEFAULT NULL COMMENT '折扣上限,仅在 discount_type 等于 2 时生效',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='优惠劵模板';

① status 字段:优惠劵模版状态,由 CommonStatusEnum 枚举,只有开启、禁用两个状态。禁用时,无法领取。

② 【领取限制】take_type 字段:领取方式,由 CouponTemplateTakeTypeEnum 枚举,分成 3 种情况: 1、直接领取:展示在 uni-app 的 [首页]、[领劵中心]、[商品详情],由用户主动领取。如下图所示: alt text

2、指定发放:管理员在管理后台,指定用户发放。如下图所示: alt text 3、新人券:买家在注册时,自动发放,由 CouponTakeByRegisterConsumer 消息消费者实现

③ 【使用条件】product_scope 字段:商品范围,由 PromotionProductScopeEnum 枚举,分成 3 种情况:

1、通用券:全部商品 2、商品券:指定商品,由 product_scope_values 字段指定商品编号的数组 3、品类券:指定品类,由 product_scope_values 字段指定品类编号的数组 ④ 【有效期】validity_type 字段:生效日期类型,由 CouponTemplateValidityTypeEnum 枚举,分成 2 种情况:

1、固定日期:由 valid_start_time、valid_end_time 字段指定生效时间范围 2、领取日期:由 fixed_start_term、fixed_end_term 字段指定领取后多少天生效 ⑤ 【优惠金额】discount_type 字段:优惠类型,由 PromotionDiscountTypeEnum 枚举,分成 2 种情况:

1、代金劵:由 discount_price 字段指定优惠金额 2、折扣劵:由 discount_percent 字段指定折扣百分比,由 discount_limit_price 字段指定折扣上限

1.2 优惠券

优惠劵,会员领取优惠劵模版来"生成"

CREATE TABLE `promotion_coupon` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '优惠劵编号',
  
  `template_id` bigint NOT NULL COMMENT '优惠劵模板编号',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '优惠劵名',
  `use_price` int NOT NULL COMMENT '是否设置满多少金额可用,单位:分',
  `take_type` tinyint NOT NULL COMMENT '领取方式',
  `valid_start_time` datetime NOT NULL COMMENT '生效开始时间',
  `valid_end_time` datetime NOT NULL COMMENT '生效结束时间',
  `product_scope` tinyint NOT NULL COMMENT '商品范围',
  `product_scope_values` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品范围编号的数组',
  `discount_type` tinyint NOT NULL COMMENT '折扣类型',
  `discount_percent` tinyint DEFAULT NULL COMMENT '折扣百分比',
  `discount_price` int DEFAULT NULL COMMENT '优惠金额,单位:分',
  `discount_limit_price` int DEFAULT NULL COMMENT '折扣上限',
  
  `user_id` bigint NOT NULL COMMENT '用户编号',

  `status` tinyint NOT NULL COMMENT '优惠码状态;1-未使用;2-已使用;3-已失效',
  `use_order_id` bigint DEFAULT NULL COMMENT '使用订单号',
  `use_time` datetime DEFAULT NULL COMMENT '使用时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='优惠劵';

字段虽然也蛮多,但是都是从 promotion_coupon_template 中复制过来的,所以更多讲讲差异的地方。

① 【优惠劵模版】从 template_id 开始到 discount_limit_price 结束,都是从 promotion_coupon_template 中复制过来的,用于记录优惠劵模版的信息。

要注意,如果 promotion_coupon_template 中的信息发生变化,promotion_coupon 中的信息不会变化,因为买家已经领取了,不能随意变更。

② 【用户】user_id 字段:用户编号,就是领取的买家。

③ 【状态】status 字段:优惠码状态,由 CouponStatusEnum 枚举,分成 3 种情况:未使用、已使用、已失效。

如果已使用,会记录 use_order_id、use_time 字段,表示使用的订单编号、使用时间。

优惠劵的过期,由 CouponExpireJob 定时任务实现。

2.积分商城

alt text 一个积分活动,对应一条 promotion_point_activity 表记录,对应一个商品 SPU。而每个商品 SKU 在该活动下可以单独配置兑换价格,所以会有多条 promotion_point_product 子表记录。

CREATE TABLE `promotion_point_activity` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '积分商城活动编号',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
  `sort` int NOT NULL COMMENT '排序',
  
  `spu_id` bigint NOT NULL COMMENT '商品 SPU ID',
  
  `status` int NOT NULL COMMENT '活动状态',
  
  `stock` int NOT NULL COMMENT '积分商城活动库存(剩余库存积分兑换时扣减)',
  `total_stock` int NOT NULL COMMENT '积分商城活动总库存',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='积分商城活动';

① spu_id 字段:商品 SPU ID,对应商品 SPU 表的 id 字段。

注意:一个积分活动,只能对应一个商品 SPU,不能对应多个商品 SPU!!!

② status 字段:活动状态,由 CommonStatusEnum 枚举,只有开启、禁用两个状态。禁用时,无法参与积分兑换。

③ stock、total_stock 字段:积分商城活动库存,自定义参与积分兑换的数量。目前它是 promotion_point_product 表的 stock 字段的总和。

CREATE TABLE `promotion_point_product` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '积分商城商品编号',

  `activity_id` bigint NOT NULL COMMENT '积分商城活动 id',  
  `activity_status` int NOT NULL COMMENT '积分商城商品状态',
  
  `spu_id` bigint NOT NULL COMMENT '商品 SPU 编号',
  `sku_id` bigint NOT NULL COMMENT '商品 SKU 编号',
  
  `count` int NOT NULL COMMENT '可兑换次数',
  `stock` int NOT NULL COMMENT '积分商城商品库存',

  `point` int NOT NULL COMMENT '所需兑换积分',
  `price` int NOT NULL COMMENT '所需兑换金额,单位:分',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='积分商城商品';

① 【活动信息】activity_id 字段:积分商城活动 id,对应 promotion_point_activity 表的 id 字段。

② 【SKU 信息】spu_id、sku_id 字段:商品 SPU 编号、商品 SKU 编号。

count 字段:可兑换次数,例如说,每个用户最多兑换 1 次。stock 字段:积分商城商品库存。 point 字段:所需兑换积分。price 字段:所需兑换金额,单位:分。 如果想要支持纯积分兑换商品,那么 price 字段可以设置为 0。

3.拼图活动

3.1 拼团活动

包括两部分:拼团活动、拼团记录。如下图所示:

alt text

一个拼团活动,对应一条 promotion_combination_activity 表记录,对应一个商品 SPU。而每个商品 SKU 在该拼团下可以单独配置拼团价格,所以会有多条 promotion_combination_activity_sku 子表记录。

CREATE TABLE `promotion_combination_activity` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '活动编号',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '拼团名称',
  
  `spu_id` bigint NOT NULL COMMENT '商品 SPU ID',
  
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '活动状态:0开启 1关闭',

  `total_limit_count` int NOT NULL COMMENT '总限购数量',
  `single_limit_count` int NOT NULL COMMENT '单次限购数量',
  `start_time` datetime NOT NULL COMMENT '开始时间',
  `end_time` datetime NOT NULL COMMENT '结束时间',
  
  `user_size` int DEFAULT NULL COMMENT '购买人数',
  `virtual_group` int NOT NULL COMMENT '虚拟成团',
  `limit_duration` int NOT NULL COMMENT '限制时长(小时)',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='拼团活动';

① spu_id 字段:商品 SPU ID,对应商品 SPU 表的 id 字段。

注意:一个拼团活动,只能对应一个商品 SPU,不能对应多个商品 SPU!!!

② status 字段:活动状态,由 CommonStatusEnum 枚举,只有开启、禁用两个状态。禁用时,无法参与拼团。

③ user_size 字段:每个拼团需要的人数,例如说,3 人团、5 人团。

如果超过 limit_duration 时长,还没凑齐人数,就会自动拼团失败。当然,如果希望虚拟成团,则可以设置 virtual_group 字段,此时只要 user_size - virtual_group 人即可拼团成功。这块逻辑,由 CombinationRecordExpireJob 定时任务实现。

CREATE TABLE `promotion_combination_product` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  
  `activity_id` bigint DEFAULT NULL COMMENT '拼团活动编号',
  `activity_status` tinyint NOT NULL DEFAULT '0' COMMENT '拼团商品状态',
  `activity_start_time` datetime NOT NULL COMMENT '活动开始时间点',
  `activity_end_time` datetime NOT NULL COMMENT '活动结束时间点',
  
  `spu_id` bigint DEFAULT NULL COMMENT '商品 SPU 编号',
  `sku_id` bigint DEFAULT NULL COMMENT '商品 SKU 编号',

  `combination_price` int NOT NULL DEFAULT '0' COMMENT '拼团价格,单位分',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='拼团商品';

① 【活动信息】activity_id 字段:拼团活动编号,对应 promotion_combination_activity 表的 id 字段。其它 activity_* + spu_id 字段,都是冗余字段,方便查询。

② 【SKU 信息】sku_id 字段:商品 SKU 编号,对应商品 SKU 表的 id 字段。combination_price 字段:拼团价格,单位分。

3.2 拼团记录

拼团记录,由买家参与拼团时生成,分成团长和团员

CREATE TABLE `promotion_combination_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  
  `activity_id` bigint DEFAULT NULL COMMENT '拼团活动编号',
  `spu_id` bigint DEFAULT NULL COMMENT '商品 SPU 编号',
  `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '商品图片',
  `spu_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '商品名称',
  `sku_id` bigint DEFAULT NULL COMMENT '商品 SKU 编号',
  `count` int DEFAULT NULL COMMENT '购买的商品数量',
  `combination_price` int NOT NULL COMMENT '拼团商品单价,单位分',
  `user_size` int NOT NULL COMMENT '可参团人数',
  
  `user_id` bigint DEFAULT NULL COMMENT '用户编号',
  `nickname` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户昵称',
  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户头像',

  `status` tinyint NOT NULL DEFAULT '0' COMMENT '参与状态:1进行中 2已完成 3未完成',  
  `head_id` bigint DEFAULT NULL COMMENT '团长编号',
  `user_count` int NOT NULL COMMENT '已参团人数',
  `virtual_group` bit(1) DEFAULT NULL COMMENT '是否虚拟拼团',
  `expire_time` datetime NOT NULL COMMENT '过期时间',
  `start_time` datetime DEFAULT NULL COMMENT '开始时间 (订单付款后开始的时间)',
  `end_time` datetime DEFAULT NULL COMMENT '结束时间(成团时间/失败时间)',
  
  `order_id` bigint DEFAULT NULL COMMENT '订单编号',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='拼团记录';

① 【活动信息】activity_id 字段:拼团活动编号,对应 promotion_combination_activity 表的 id 字段。

其它 spu_id、pic_url、spu_name、sku_id、count、combination_price、user_size 字段,都是冗余字段,方便查询。

② 【用户信息】user_id 字段:用户编号,就是拼团的买家。

其它 nickname、avatar 字段,都是冗余字段,方便查询。

③ 【拼团信息】status 字段:参与状态,由 CombinationRecordStatusEnum 枚举,分成 3 种情况:进行中、拼团成功、拼团失败。

head_id 字段:团长"编号"。分成两种情况:

团长:则该字段为 0,表示它是团长的拼团记录。 团员:则该字段为团队拼团记录的 id,表示它是团长的拼团记录的团员。 其它 user_count、virtual_group、expire_time、start_time、end_time 字段,就是拼团的一些信息。

④ 【订单信息】order_id 字段:订单编号,对应订单表的 id 字段。每个拼团记录,都会生成一个订单。

4.秒杀活动

4.1 秒杀配置

包括两部分:秒杀配置(场次)、秒杀活动。如下图所示: alt text

CREATE TABLE `promotion_seckill_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '秒杀时段名称',
  `start_time` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '开始时间点',
  `end_time` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '结束时间点',
  `slider_pic_urls` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '秒杀主图',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '活动状态',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='秒杀时段';

4.2 秒杀活动

一个秒杀活动,对应一条 promotion_seckill_activity 表记录,对应一个商品 SPU。而每个商品 SKU 在该秒杀下可以单独配置秒杀价格、库存,所以会有多条 promotion_seckill_product 子表记录

CREATE TABLE `promotion_seckill_activity` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '秒杀活动编号',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '秒杀活动名称',
  `sort` int NOT NULL DEFAULT '0' COMMENT '排序',
  `remark` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',

  `config_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '秒杀时段 id 数组',
  
  `spu_id` bigint NOT NULL DEFAULT '0' COMMENT '秒杀活动商品',
  
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '活动状态',
  
  `total_limit_count` int DEFAULT '0' COMMENT '总限购数量',  
  `single_limit_count` int DEFAULT '0' COMMENT '单次限够数量',
  `start_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活动开始时间',
  `end_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活动结束时间',
  
  `stock` int DEFAULT '0' COMMENT '秒杀库存',
  `total_stock` int DEFAULT '0' COMMENT '秒杀总库存',  
  
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='秒杀活动';

① config_ids 字段:秒杀时段 id 数组,由 promotion_seckill_config 表的 id 字段组成的数组。

② spu_id 字段:商品 SPU ID,对应商品 SPU 表的 id 字段。

注意:一个秒杀活动,只能对应一个商品 SPU,不能对应多个商品 SPU!!!

③ status 字段:活动状态,由 CommonStatusEnum 枚举,只有开启、禁用两个状态。禁用时,无法参与秒杀。

④ stock、total_stock 字段:秒杀库存、秒杀总库存。业务上考虑秒杀价格可能较低,一般少量库存参与秒杀。

CREATE TABLE `promotion_seckill_product` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '秒杀参与商品编号',
  
  `activity_id` bigint NOT NULL DEFAULT '0' COMMENT '秒杀活动 id',
  `config_ids` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '秒杀时段 id 数组',
  `activity_status` tinyint NOT NULL DEFAULT '0' COMMENT '秒杀商品状态',
  `activity_start_time` datetime NOT NULL COMMENT '活动开始时间点',
  `activity_end_time` datetime NOT NULL COMMENT '活动结束时间点',
  `spu_id` bigint NOT NULL DEFAULT '0' COMMENT '商品 spu_id',
  
  `sku_id` bigint NOT NULL DEFAULT '0' COMMENT '商品 sku_id',
  
  `seckill_price` int NOT NULL DEFAULT '0' COMMENT '秒杀金额,单位:分',
  `stock` int NOT NULL DEFAULT '0' COMMENT '秒杀库存',
  
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='秒杀参与商品';

① 【活动信息】activity_id 字段:秒杀活动编号,对应 promotion_seckill_activity 表的 id 字段。其它 activity_* + spu_id 字段,都是冗余字段,方便查询。

② 【SKU 信息】sku_id 字段:商品 SKU 编号,对应商品 SKU 表的 id 字段。seckill_price 字段:秒杀价格,单位分。stock 字段:秒杀库存。

5.砍价活动

5.1 砍价活动

包括三部分:砍价活动、砍价助力。如下图所示: alt text

CREATE TABLE `promotion_bargain_activity` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '砍价活动编号',
  `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '砍价活动名称',
  
  `spu_id` bigint NOT NULL DEFAULT '0' COMMENT '商品 SPU 编号',
  `sku_id` bigint NOT NULL COMMENT '商品 SKU 编号',
  
  `status` int NOT NULL DEFAULT '0' COMMENT '活动状态',
  
  `total_limit_count` int NOT NULL DEFAULT '0' COMMENT '总限购数量',
  `start_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活动开始时间',
  `end_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活动结束时间',

  `bargain_first_price` int NOT NULL DEFAULT '0' COMMENT '砍价起始价格,单位分',
  `bargain_min_price` int NOT NULL DEFAULT '0' COMMENT '砍价底价,单位:分',
  `help_max_count` int NOT NULL DEFAULT '0' COMMENT '砍价人数',
  `bargain_count` int NOT NULL DEFAULT '0' COMMENT '最大帮砍次数',
  `random_min_price` int NOT NULL DEFAULT '0' COMMENT '用户每次砍价的最小金额,单位:分',
  `random_max_price` int NOT NULL DEFAULT '0' COMMENT '用户每次砍价的最大金额,单位:分',

  `stock` int NOT NULL DEFAULT '0' COMMENT '砍价库存',
  `total_stock` int NOT NULL DEFAULT '0' COMMENT '砍价总库存',

  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='砍价活动';

① spu_id、sku_id 字段:对应的商品 SPU 编号、商品 SKU 编号。

注意:一个砍价活动,只能对应一个商品 SKU,不能对应多个商品 SPU 或者 SKU!!!

② status 字段:活动状态,由 CommonStatusEnum 枚举,只有开启、禁用两个状态。禁用时,无法参与砍价。

③ stock、total_stock 字段:砍价库存,自定义参与砍价的数量。

④ bargain_first_price、bargain_min_price 字段:砍价起始价格、砍价最低价格。比如商品原价 100 元,砍价起始价格 80 元,砍价底价 50 元,那么用户发起砍价时的价格为 80 元,最多邀请好友砍价到 50 元。

help_max_count 字段:砍价人数,需要多少人,砍价才能成功。如果不砍价成功,则该砍价记录不允许下单支付。

help_max_count 字段:单个活动,用户可以帮砍的次数。例如说:帮砍次数为 1 时,A 和 B 同时将该活动链接发给 C,C 只能帮其中一个人砍价。

random_min_price、random_max_price 字段:用户每次砍价的最小金额、最大金额。比如用户每次砍价的金额为 1 元到 10 元之间的随机数。

5.2 砍价记录

CREATE TABLE `promotion_bargain_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '砍价记录编号',

  `activity_id` bigint NOT NULL COMMENT '砍价活动编号',  
  `spu_id` bigint NOT NULL DEFAULT '0' COMMENT '商品 SPU 编号',
  `sku_id` bigint NOT NULL COMMENT '商品 SKU 编号',
  
  `user_id` bigint NOT NULL COMMENT '用户编号',

  `status` int NOT NULL DEFAULT '0' COMMENT '砍价状态',
  `bargain_first_price` int NOT NULL DEFAULT '0' COMMENT '砍价起始价格,单位:分',
  `bargain_price` int NOT NULL DEFAULT '0' COMMENT '当前砍价,单位:分',
  `end_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结束时间',

  `order_id` bigint DEFAULT NULL COMMENT '订单编号',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='砍价记录表';

① 【活动信息】activity_id 字段:砍价活动编号,对应 promotion_bargain_activity 表的 id 字段。其它 spu_id、sku_id 字段,都是冗余字段,方便查询。

② 【用户信息】user_id 字段:用户编号,就是砍价发起的买家。

③ 【砍价信息】status 字段:砍价状态,由 BargainRecordStatusEnum 枚举,分成 3 种情况:砍价中、砍价成功、砍价失败。

bargain_first_price、bargain_price 字段:砍价起始价格、当前砍价。

④ 【订单信息】order_id 字段:订单编号,对应订单表的 id 字段。砍价记录的 status 为砍价成功时,才可以创建并支付订单。

5.3 砍价助力

CREATE TABLE `promotion_bargain_help` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '砍价助力编号',
  
  `user_id` bigint NOT NULL COMMENT '用户编号',
  
  `activity_id` bigint NOT NULL COMMENT '砍价活动名称',
  
  `record_id` bigint NOT NULL DEFAULT '0' COMMENT '砍价记录编号',
  
  `reduce_price` int NOT NULL DEFAULT '0' COMMENT '减少砍价,单位:分',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='砍价助力表';

比较简单,主要是一些关联的字段

6.满减送活动

CREATE TABLE `promotion_reward_activity` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '活动编号',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '活动标题',
  `start_time` datetime NOT NULL COMMENT '开始时间',
  `end_time` datetime NOT NULL COMMENT '结束时间',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',
  
  `status` tinyint NOT NULL DEFAULT '-1' COMMENT '活动状态',
  
  `product_scope` tinyint NOT NULL COMMENT '商品范围',
  `product_scope_values` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '商品范围编号的数组',
  
  `condition_type` tinyint NOT NULL DEFAULT '-1' COMMENT '条件类型',
  `rules` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '优惠规则的数组',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='满减送活动';

① status 字段:活动状态,由 CommonStatusEnum 枚举,只有开启、禁用两个状态。禁用时,无法参与满减送活动。

② product_scope 字段:商品范围,商品范围,由 PromotionProductScopeEnum 枚举,分成 3 种情况:

1、通用券:全部商品 2、商品券:指定商品,由 product_scope_values 字段指定商品编号的数组 3、品类券:指定品类,由 product_scope_values 字段指定品类编号的数组 ③ condition_type 字段:条件类型,由 PromotionConditionTypeEnum 枚举,分成 2 种情况:满 N 元、满 N 件。

rules 字段:优惠规则的数组,支持多层级,可配置优惠金额、包邮、赠送积分、优惠劵。

7.限时折扣

一个限时折扣活动,可以有多个商品参与,所以它有一个 promotion_discount_activity 活动主表,和 promotion_discount_activity_product 活动商品子表 alt text

CREATE TABLE `promotion_discount_activity` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '活动编号',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '活动标题',
  
  `status` tinyint NOT NULL DEFAULT '-1' COMMENT '活动状态',
  
  `start_time` datetime NOT NULL COMMENT '开始时间',
  `end_time` datetime NOT NULL COMMENT '结束时间',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='限时折扣活动';

7.1 限时折扣商品

CREATE TABLE `promotion_discount_product` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号,主键自增',
  
  `activity_id` bigint NOT NULL COMMENT '活动编号',
  `activity_status` tinyint NOT NULL DEFAULT '0' COMMENT '秒杀商品状态',
  `activity_start_time` datetime NOT NULL COMMENT '活动开始时间点',
  `activity_end_time` datetime NOT NULL COMMENT '活动结束时间点',
  
  `spu_id` bigint NOT NULL DEFAULT '-1' COMMENT '商品 SPU 编号',
  `sku_id` bigint NOT NULL COMMENT '商品 SKU 编号',
  
  `discount_type` int NOT NULL COMMENT '优惠类型;1-代金劵;2-折扣劵',
  `discount_percent` tinyint DEFAULT NULL COMMENT '折扣百分比',
  `discount_price` int DEFAULT NULL COMMENT '优惠金额,单位:分',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='限时折扣商品\n';

① activity_id 字段:活动编号,对应 promotion_discount_activity 表的 id 字段。而 activity_* 开头字段,是为了方便查询,冗余存储的。

② spu_id、sku_id 字段:对应的商品 SPU 编号、商品 SKU 编号。

③ discount_type 字段:优惠类型,由 DiscountTypeEnum 枚举,分成 2 种情况:

满减:配合 discount_price 字段,表示优惠多少金额 折扣:配合 discount_percent 字段,表示折扣百分比

8.内容管理

8.1 文章分类

CREATE TABLE `promotion_article_category` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '文章分类编号',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '分类名称',
  `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '图标地址',
  `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态',
  `sort` int NOT NULL DEFAULT '99999' COMMENT '排序',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章分类表';

8.2 文章内容

CREATE TABLE `promotion_article` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '文章管理编号',
  `category_id` bigint NOT NULL COMMENT '分类编号',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文章标题',
  `author` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '文章作者',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文章内容',
  `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文章封面图片地址',
  `introduction` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '文章简介',
  `sort` int unsigned NOT NULL DEFAULT '0' COMMENT '排序',
  `status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '状态',
  `recommend_hot` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否热门(小程序)',
  `recommend_banner` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否轮播图(小程序)',
  `browse_count` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '浏览次数',
  
  `spu_id` bigint NOT NULL DEFAULT '0' COMMENT '关联商品编号',

  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章管理表';

8.2 轮播图

CREATE TABLE `promotion_banner` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'Banner 编号',
  `title` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'Banner 标题',
  `pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '图片 URL',
  `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '跳转地址',
  `status` tinyint NOT NULL DEFAULT '-1' COMMENT '活动状态',
  `sort` int DEFAULT NULL COMMENT '排序',
  `position` tinyint NOT NULL COMMENT '位置',
  `memo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '描述',
  `browse_count` int DEFAULT NULL COMMENT 'Banner 点击次数',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Banner 广告位';