这里我先根据工作经验列出一个大纲, 然后会一步步慢慢细化实施过程中遇到的问题
1.优惠方式
1.1 基础的方式
①指定最终商品金额 ②减免部分金额 ③折扣
1.2 复杂的方式
① 满减 ② 打包 ③ 返利 ④ 阶梯价
1.3 注意
①打包价格中, 如果商品原单价低于平均价格, 要加金额保证最终价格是均价
②有些活动可能要求先打款才能生效, 注意状态管理
2. 主要架构设计
2.1 活动规则+记名优惠券 (规则和受益人分开)
适用于定价权在商家的活动, 这个优惠的金额没有讲价的余地, 每个客户来了都一样, 比如超市
2.2 活动分类+记名优惠券(规则和受益人在一起)
适用于不同客户不同价格的定价策略,
比如汽车, 卖给不同区域或不同客户有个可以上下浮动的范围; 一线销售有个价格授权, 经理又会有更高的额度授权.
2.3 优惠券内容
①受益人/受益方
②对应的活动信息(名称等)
③活动起止时间
④状态(领导是否已审批, 预付款款项是否已到, 是否生效作废等)
⑤创建时间, 备注等
⑥已经适用了此优惠的商品
2.4 订单数据如何记录
① 直接改价格 ② 订单表中同时记录原价和优惠金额
3. 常用功能
3.1. 活动和优惠券的增删改查等常规功能
3.2. 手动生效/失效
3.3. 测试商品是否能参与某个活动
3.4.给一个商品, 找出他能参与的活动
3.5.创建一个活动/优惠券, 找出在创建之前符合这个活动的商品
3.6. 人工强行绑定, 使商品可以参与活动
3.7.批量修改开始/结束时间
3.8. 某个商家已经参与或正在参与的活动
3.9. (批量)解绑活动
3.10 活动到期前提醒, 或额度到期前提醒
3.11 不同系统调用活动模块的接口修改或展示数据
3.12 审批
4. 不常用功能但需要注意
4.1 客户的回款到账后才能生效
4.2 客户要求退款怎么处理
4.3 活动是否需要审批, 审批通过后通过什么方式通知到对应的人
4.4 海外市场
①税率相关的事情怎么处理
② 邮件服务器配置, 模板配置
③用户信息保密(加密与解密)
4.5 跟结算系统相关的数据校验和处理(结算对象/开票对象等)
5.其他要点
5.1 异步执行
①商品下单后自动优惠
②活动录入后, 自动查找之前已下单的能参与优惠的商品
③各种提醒
5.2 开关控制
①控制5.1中的脚本是否执行 ② 控制用户是否接收提醒等
5.3 自动创建优惠券
有些场景下不用业务员或销售手工录入, 系统判定符合一定条件就自动创建优惠券
5.5 优惠券匹配, 规则配置化
5.6 提供一些小工具, 可以组合使用, 以便解决一些异常场景
① 客户已经打款, 款项也核销部分订单, 有些甚至已经开票, 客户又反悔要退款,
② 客户倒闭了要退剩下的活动款等
6. 表结构
-- 导出 discount 的数据库结构
CREATE DATABASE IF NOT EXISTS `discount` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */;
USE `discount`;
-- 导出 表 discount.activity 结构
CREATE TABLE IF NOT EXISTS `activity` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(20) NOT NULL COMMENT '编码',
`name` varchar(50) NOT NULL COMMENT '活动名称',
`desc` varchar(500) NOT NULL COMMENT '描述',
`discount_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '优惠类型: 指定病例价格/减免部分金额/折扣/打包/满赠满减/返利/',
`level` tinyint(4) NOT NULL DEFAULT 0 COMMENT '活动级别, 公司级活动/区域级活动/特殊活动',
`is_limit` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否限制参与活动的商品数量',
`is_circle` tinyint(4) NOT NULL DEFAULT 0 COMMENT '当优惠类型是满赠满减时, 优惠完一轮, 是否继续下一轮',
`price` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '如果价格不区分客户对待,可以放在这张表',
`ext` varchar(50) NOT NULL DEFAULT '0' COMMENT '其他一对一的属性',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态: 审批中/已生效/失效等',
`is_delete` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除',
`start_time` datetime NOT NULL COMMENT '活动开始时间, 如果不因客户不同而不同就可以放在这里',
`end_time` datetime NOT NULL COMMENT '活动结束时间, 如果不因客户不同而不同就可以放在这里',
`create_time` datetime NOT NULL DEFAULT current_timestamp() COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '最后修改时间',
PRIMARY KEY (`id`),
KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动信息表';
-- 导出 表 discount.activity_attr_price 结构
CREATE TABLE IF NOT EXISTS `activity_attr_price` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`activity_code` varchar(50) DEFAULT '' COMMENT '活动编码',
`min_num` int(10) unsigned NOT NULL COMMENT '最小购买数量',
`max_num` int(10) unsigned NOT NULL COMMENT '最大购买数量',
`price` decimal(10,2) unsigned NOT NULL DEFAULT 0.00 COMMENT '价格',
`is_delete` decimal(10,2) unsigned NOT NULL DEFAULT 0.00 COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `activity_code` (`activity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动价格, 如果价格不因客户不同而不同可以放在这里, 比如第1-10个每个100块,第11-20个每个95块';
-- 导出 表 discount.activity_attr_xx 结构
CREATE TABLE IF NOT EXISTS `activity_attr_xx` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`activity_code` varchar(50) NOT NULL DEFAULT '' COMMENT '活动编码',
`country` varchar(50) NOT NULL DEFAULT '' COMMENT '国家',
`province` varchar(50) NOT NULL DEFAULT '' COMMENT '省份',
`city` varchar(50) NOT NULL DEFAULT '' COMMENT '市',
`is_deleted` tinyint(4) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `activity_code` (`activity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存放活动的一些一对多的属性, 便于搜索, 比如省份, 一个活动只能买到某几个省份, 如果还有其他属性建议新建表存储';
-- 导出 表 discount.coupon 结构
CREATE TABLE IF NOT EXISTS `coupon` (
`id` int(10) unsigned NOT NULL,
`code` varchar(50) NOT NULL DEFAULT '' COMMENT '优惠券编码',
`activity_code` varchar(50) NOT NULL DEFAULT '' COMMENT '活动编码',
`customer_code` varchar(50) NOT NULL DEFAULT '' COMMENT '客户编码, 如果一个字段决定不了,或一对多, 可以另起一张表存储',
`start_time` datetime NOT NULL COMMENT '生效时间, 每个客户可以自定义开始结束时间的话,放在这个表',
`end_time` datetime NOT NULL COMMENT '结束时间, 每个客户可以自定义开始结束时间的话,放在这个表',
`status` tinyint(3) unsigned NOT NULL DEFAULT 0 COMMENT '状态',
`is_delete` tinyint(3) unsigned NOT NULL DEFAULT 0 COMMENT '是否删除',
`create_time` datetime NOT NULL DEFAULT current_timestamp(),
`update_time` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
KEY `code` (`code`),
KEY `activity_code` (`activity_code`),
KEY `customer_code` (`customer_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券, 记录被优惠对象的信息';
-- 导出 表 discount.orders 结构
CREATE TABLE IF NOT EXISTS `orders` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`activity_code` varchar(50) NOT NULL DEFAULT '' COMMENT '活动编码',
`coupon_code` varchar(50) NOT NULL DEFAULT '' COMMENT '优惠券编码',
`order_code` varchar(50) NOT NULL DEFAULT '' COMMENT '订单编码',
`order_amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单金额',
`discount_amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '优惠金额',
`group_code` varchar(50) NOT NULL DEFAULT '' COMMENT '分组, 比如满10赠1, 11个订单为一组',
`status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '状态, 优惠时可能出现异常',
`is_delete` tinyint(4) NOT NULL DEFAULT 0 COMMENT '解除绑定时为删除',
`create_tiem` datetime NOT NULL DEFAULT current_timestamp(),
`update_time` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
KEY `activity_code` (`activity_code`),
KEY `coupon_code` (`coupon_code`),
KEY `order_code` (`order_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='参与优惠的订单或商品, 需要其他字段可自行补充';
7.其他
阶梯价活动设置(非一次性购买)