优惠活动模块设计方案整理

这里我先根据工作经验列出一个大纲, 然后会一步步慢慢细化实施过程中遇到的问题

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.其他

阶梯价活动设置(非一次性购买)

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>