Java生鲜电商平台-电商促销业务分析设计与系统架构
Java生鲜电商平台-电商促销业务分析设计与系统架构
说明:Java开源生鲜电商平台-电商促销业务分析设计与系统架构,列举的是常见的促销场景与源代码下载
左侧为享受促销的资格,常见为这三种:
首单
大于或等于某个会员级别
特定会员组:比如女性,月消费满1000等等,都是通过查询条件查询出来的特定分组。
优惠类型,对于电商网站主要是下面4类:
金额
赠品:商品、优惠券、现金券、积分等
包邮(实际上也是钱)
其它:如送精美包装等。 对于其它业务类型的平台,则估计会有其它形式的优惠,比如赠送三个VIP会员等等。
范围,无非就是:
整单
指定品类或特定品类(临时的活动分类,比如夏季新品特卖)
指定商品
满减:针对金额的减免,可以指定金额或百分比,涉及阶梯累加和数量累加等。
满赠:满足条件后获得赠品,赠品可以是五花八门,对于电商平台一般是商品、现金券、优惠券、积分等。
包邮:金额减免的另一种方式,但效果比减免小额金额要好。
其它规则:有些会带来设计的复杂度,但本质无非就是满减或满赠。
2促 销 的 表 现 形 式
促销的表现形式主要分为促销活动和优惠券两种。
站在系统的角度,促销活动是主动的,优惠券是被动的。
促销活动表示只要满足条件,下单时自动会进行促销规则计算,进行减免或者赠送。但是优惠券必须客户进行选择(或者输入券码)。
促销活动可以多个同时生效,比如:
首单包邮
满100减20
买电磁炉赠送餐具
这三个促销活动对于新会员(未曾购买过)都是同时有效的。
但促销活动存在互斥和优先级,这两个概念在后面再分析。
优惠券只存在一张优惠券生效。
即客户选择使用哪一张,就哪一张生效,无所谓互斥或者优先级。
优惠券可以和促销活动同时生效,只要生效促销活动不排斥优惠券即可。
那么,对于促销规则而言,促销活动和优惠券只是它上层的表现形式,实际的底层的促销规则是可以共用的(无非都是满减、满赠)
3促 销 规 则 分 析
从第一节场景来看,促销无非就是看:
是否满足资格
没有资格享受该优惠,就不必往下计算了。
当前规则的优惠类型是什么?
满减、满赠、包邮或者其它?
当前规则的生效范围是什么?
判断客户当前订单(购物车)是否满足当前规则生效范围之内,是则计算优惠。
规则的累加规则是什么?
阶梯累加:一般只针对金额
数量累加:否则只计算一次,是则乘以倍数。
规则之间的关系是怎样的?
优先级
兼容
互斥
可以通过这张图整体理解这个结构:
4促 销 规 则 的 关 系
促销规则的关系是设计的一个难点,对于规则而言本身是独立的,所以所谓关系就是它的上层表现形式的关系,而前面第二节也谈到,优惠券之间是无所谓关系的,用那张就那张生效(前提是该张优惠券可用,可以用)。
那么现在要分析的关系就只有:
促销活动之间的关系
促销活动和优惠券之间的关系
其中促销活动与优惠券的关系是一票否决方式,即只要本次订单(购物车)对应的生效促销活动有任一个设置为:排斥优惠券,则本订单(购物车)不能使用优惠券。
那么我们剩下要分析的就是促销活动之间的关系了,详见下图:
5领 域 业 务 建 模(模块级别)
促销规则独立为一个模块
促销活动、优惠券的管理在模块内,共规则模型调用。
规则模型对外提供接口,其它模块只能通过该接口访问模型。
模型实现该接口。
规则接口要求传入上下文参数
该上下文参数包含:商品列表(购物车当前选择的商品,客户ID 和 使用的优惠券。
规则接口是规则模块的边界。
调用者为购物车模块。
任何时候购物车发生修改时,调用规则接口重新计算。
规则发生更改时,会发送事件出来。
购物车模块计算价格业务监听此事件,有变更则更新相关购物车的价格。
此监听器为异步。
外部支持接口
客户接口:供查询客户资格相关使用
商品接口:供查询商品分类和其它定义使用。
6领 域 业 务 建 模(类级别)
类图有些大,手机上如果看不清,可以分享到pc上查看。
设计思路过程描述:
提供CartRuleService作为对外接口
分别调用:
PromotionService:促销活动接口
CouponService:优惠券接口
来处理促销活动和优惠券。
促销活动接口和优惠券接口均是实际调用RuleService来实现促销规则计算。
RuleService的实现采用桥模式和策略模式,并通过工程模式获得各个策略的实例。
传入的上下文参数封装为RuleContext,传给RuleService
RuleService返回RuleResult对象
PromotionResult和CoupontResult分别封装RuleResult对象进行返回。
通过这个设计方案,当有新的资格判断方式、目标范围和优惠类型时,通过新增策略实现即可,符合开闭原则。
7规 则 的 持 久 化
前面已经充分分析了规则的各个内容,如何将促销活动、优惠券和促销规则持久化以及持久化存储到那里其实已经是水到渠成的事情。怎样存储其实都可以,哪怕是一个json结构。
因为无论什么结构,最终在代码中都会被解析为对象并缓存起来供接口实现来调用。所以数据库设计在效率上不会要求太高。
数据库结构ER图:
规则定义和规则利益是独立的两个表,和优惠券、促销活动一对一关联。
规则定义包含:
资格类型、资格配置
利益类型、利益参数(是否累加)
目标范围类型、范围设置
其它字段根据项目情况自由添加。
规则利益
可以对不同的利益分别设计字段。
也可以设置一个利益类型和利益配置(json结构)
之所以独立出来作为子表,是因为存在阶梯累加的业务情况需要配置多条利益。
优惠券的设计为常规方式
定义:定义它的各种参数
实体:具体某一张优惠券
使用:一般一张优惠券只会使用一次,记录使用历史,也有优惠券可以使用多次。
促销活动定义
前面第4节说的促销规则的关系(其实是促销活动的关系)就是定义在这里。
分组、优先级、对优惠券的排斥等。
促销活动的参与日志
记录谁参与过
有些促销活动只能参与一次,则通过此表判断。
Java生鲜电商平台-电商促销业务分析设计与系统架构的更多相关文章
- Java生鲜电商平台-电商订单系统全解析
Java生鲜电商平台-电商订单系统全解析 说明:Java生鲜电商平台-电商订单系统全解析主要讲解OMS的内容,设计,开发,架构等知识. 今天分享将会分为以下三个环节来阐述: 1.订单系统的介绍 2.订 ...
- Java生鲜电商平台-商品的spu和sku数据结构设计与架构
Java生鲜电商平台-商品的spu和sku数据结构设计与架构 1. 先说明几个概念. 电商网站采用在商品模块,常采用spu+sku的数据结构算法,这种算法可以将商品的属性和商品的基本信息分离,分开维护 ...
- Java生鲜电商平台-商品无限极目录的设计与架构
Java生鲜电商平台-商品无限极目录的设计与架构 说明:任何一个商品都应该是先属于某一个目录,然后在目录中添加商品,目录理论上最多支持三级,因为级别太多,不容易管理.但是设计中需要设计无限制的级别. ...
- Java开源生鲜电商平台-订单抽成模块的设计与架构(源码可下载)
Java开源生鲜电商平台-订单抽成模块的设计与架构(源码可下载) 说明:订单抽成指的是向卖家收取相应的信息服务费.(目前市场上有两种抽成方式,一种是按照总额的抽成比率,另外一种是按照订单明细的抽成比率 ...
- Java生鲜电商平台-电商会员体系搭建
Java生鲜电商平台-电商会员体系搭建 说明:因为之前一直从事的是B端的生鲜电商方面的产品,对会员体系方面有深刻的理解,今天来聊一聊会员体系的搭建. 明确会员体系的目的 首先我们需要明确的知道,搭建电 ...
- Java生鲜电商平台-电商虚拟币的充值与消费思考
Java生鲜电商平台-电商虚拟币的充值与消费思考 项目背景 最近由于项目业务原因,需要为系统设计虚拟币的充值及消费功能.公司内已经有成熟的支付网关服务,所以重点变成了如何设计项目内虚拟币的充值流程,让 ...
- Java生鲜电商平台-电商起送价的深入思考与实战
Java生鲜电商平台-电商起送价的深入思考与实战 说明:在生鲜电商中,起送价是一个非常普遍的话题,今天我们就用实战来告诉大家,如何设置起送价,如何编写起送价的代码,以及如何同步起送价. 在开始题目之前 ...
- Java生鲜电商平台-电商系统性能指标
Java生鲜电商平台-电商系统性能指标 1.响应时间和吞吐量 根据应用程序的响应时间可以知道程序完成传输数据所用的时间.也可以从HTTP请求级别,或者成为数据库级别来看.对那些缓慢的查询你需要做一些优 ...
- Java生鲜电商平台-电商数据运营统计与分析
Java生鲜电商平台-电商数据运营统计与分析 今天分享将会分为以下几个方面来阐述: 1. 作为运营我们需要统计与分析的几个核心数据是什么? 2. 核心数据对业务的指导价值在哪里呢? 3. 作为产品PM ...
随机推荐
- CSS3 新增选择器
CSS3 新增选择器 结构(位置)伪类选择器(CSS3) :first-child :选取属于其父元素的首个子元素的指定选择器 :last-child :选取属于其父元素的最后一个子元素的指定选择器 ...
- 升鲜宝V2.0_杭州生鲜配送行业,条码标签管理之批量打印标签与分配配送任务相关操作说明_升鲜宝生鲜配送系统_15382353715_余东升
升鲜宝V2.0_杭州生鲜配送行业,条码标签管理之批量打印标签与分配配送任务相关操作说明_升鲜宝供应链管理生鲜配送系统 题外话,随着国家对食材安全这个行业重视性越来越强,最近国家又出具了一些 ...
- Qt之圆角阴影边框
Qt的主窗体要做出类似WIN7那种圆角阴影边框,这一直是美工的需求. 这里是有一些门道的,尤其是,这里藏着一个很大的秘密. 这个秘密是一个QT的至少横跨3个版本,存在了2年多的BUG... https ...
- (转载)林轩田机器学习基石课程学习笔记1 — The Learning Problem
(转载)林轩田机器学习基石课程学习笔记1 - The Learning Problem When Can Machine Learn? Why Can Machine Learn? How Can M ...
- Tomcat启动分析(二)-自己编译Tomcat
为了方便分析Tomcat源码,利用大家习惯的方式来进行Debug调试,那么如何将Tomcat源码导入到Eclipse呢,这就是本文的重点 1 准备 1.1 获取Tomcat源码 获取tomcat源码有 ...
- web网页利用JavaScript实现对摄像头的调用
实现效果: 代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset=&qu ...
- Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 "&#原因
Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 "&#原因:接口响应数据中有&#
- 线性回归——lasso回归和岭回归(ridge regression)
目录 线性回归--最小二乘 Lasso回归和岭回归 为什么 lasso 更容易使部分权重变为 0 而 ridge 不行? References 线性回归很简单,用线性函数拟合数据,用 mean squ ...
- [转] 从零推导支持向量机 (SVM)
原文连接 - https://zhuanlan.zhihu.com/p/31652569 摘要 支持向量机 (SVM) 是一个非常经典且高效的分类模型.但是,支持向量机中涉及许多复杂的数学推导,并需要 ...
- appium Ui自动化调起应用点击
appium Ui自动化调起微信并点击登录按钮的java代码(对的,就这么一丢丢). public class testWX { public static void main(String[] ar ...