如何设计一个业务系统
Table of Contents
1. 本文的目的
- 希望能对设计过程有一个整体的概念
- 希望能够参照这个过程,完成一些简单的业务系统设计
- 本文重点针对于业务系统设计和分析。不太涉及系统设计的其他方面,如性能,可靠,可见等等。
PS:
- 也希望业务系统设计不再会是个人发展的瓶颈
2. 背景
现阶段,对人员的需求已经不再是能有一个简单的需求把做出来。更可能是能独立承接一个有点复杂的需求。比如拼团,比如加速包, 比如套票。有一个略微复杂的流程,有更多的场景,涉及到更多的状态和角色和交互。
在这种情况下,按照以往直接想想就开始做的方式,已经很难得心应手的把东西做出来了。经常会遇到:
- 做了一半,感觉好像不太对
- 写着写着写不下去了
- 怎么写都有些地方考虑不周到
在我来看,缺的就是一个设计的过程:
- 如何在不同的角度去分析这个需求
- 如何将一个复杂的问题拆解成几个更小的子问题
- 如何将一个不是很复杂的子问题落实到模块/代码中
过去也会写好一个设计文档, 再和大家去讲, 但是效果感觉并没有很好。借着这次拼团的系统,希望能把这个过程剖析的更具体一些, 看看是否能给大家更多的助益。
3. 设计的目的
为什么要设计?,
- 因为不设计已经做不下去了。
评估一个设计的好坏,就看能否清晰的表达出 要做什么 , 怎么做 , 为什么要这么做 。
为什么要详细的设计?, 在用户流程,模块,复杂对象的生命周期等不同的维度分别做设计。
- 因为脑力有限,无法同时关注这么多的细节,所以要分层,要分离不同的关注点。在不同的层面上去关注不同的具体的事情。
一句话来衡量: 设计就是让一个看起来不太可能能做好的东西变的很显然能做好
4. 如何设计
4.1. 原始需求分析
划重点: 不关心系统,不关心当前是什么样,不关心有哪些模块。只关心一点: 系统对外体现是什么样. (对外并不仅仅指对外的用户视图。只要是外部能观测到的,都是系统的对外体现)
这一阶段,关注的就是系统整体对外的承诺。到底要做什么。
- 拼团案例 5.2.1
4.2. 用户场景 && 场景分析
这一步,主要目的是把对外承诺细化。看看会有哪些不同的流程, 不同的场景。
常见的分析方法就是: 有哪些用户,哪些角色,分别关注哪些数据,数据流或者操作流大约是是什么样的。
比较常见的展示工具就是时序图了。
这一阶段, 关注的就是对外承诺的详细信息,对内会涉及到哪些场景和状态。从而可以分析出,内部需要哪些模块,如何配合。
- 拼团案例 5.2.2
4.3. 系统概要设计
在这个阶段,主要的工作是,基于上文中的具体场景,分析出需要 哪些模块 来承载各自的功能,如何配合。
我认为,这个也是从需求到落实最关键的一步。因为在这里,需要划定 模块的职责和边界, 以及, 如何通过这些职责,组织出所需要的功能。
常见的分析方法也一样是,基于上文中的系统需要提供的功能,如何分解让各个模块配合实现。
PS: 模块的拆分是一个迭代的过程(玄学),一般是先分,然后看模块间交互,然后调整。满意为止…
除了模块拆分以外,还有一些重点问题可以单独拿出来放在这个模块讨论。
- 拼团案例 5.2.4
4.4. 模块内部设计
具体方法其实类似,但是需要更多考虑一点, 如何用内部不可见的存储/状态,去实现外部的行为或者感知 。
- 拼团案例 5.2.5
4.5. 任务分解
在这里,更多是从一个这个业务需求的负责人角度,来看,需要哪些地方有工作,哪些工作,如何分解,如何跟踪。让整体的业务需求更可控。
- 拼团案例 5.2.6
5. 案例分析
5.1. 票务系统设计
整体内容相对完善一些,供参考: 票务系统设计文档下载
5.2. 拼团
5.2.1. 拼团需求分析
- 商家能创建/参与拼团活动
- op 能审核&发布该拼团活动
- 当拼团活动发布之后,符合一定的标准,用户可以在商品详情页看到
- 用户可以发起或者参加某个团
- 团符合成功标准,则拼团成功。超时未符合,则拼团失败
- 拼团成功,则用户购买成功。失败,则退款
- 购买成功后,用户能看到订单, 能看到后续的发货流程,正常消费。
- 如果拼团成功,但是超卖,可能也需要退款
5.2.2. 拼团用户场景
- 商家
- 创建拼团活动
- 修改拼团活动内容
- 查看拼团活动审核情况
- 管理人员
- 审核拼团活动
- 驳回拼团活动
- 用户
- 基于项目查看拼团活动
- 创建一个拼团
- 参与一个拼团
- 查看拼团进度
- 拼团成功后查看订单,消费票券
- 拼团失败后退款
5.2.3. 拼团场景分析
商家创建拼团活动
用户创建拼团
5.2.4. 拼团系统概要设计
- 重点概念解释
拼团活动
制作领域的概念,包含参与拼团活动的项目,场次,票档,拼团价格,结算价格,有效期,是否公开等信息
团
第一个拼团订单创建完成,会生成一个团。用于承载拼团动作的结果
拼团订单
用于承载针对某个团的参与动作,以及支付行为, 驱动后续的订单生成等
- 模块划分
- 拼团活动模块
- 负责拼团活动的创建,审核,发布功能
- 负责拼团活动的查询
- 拼团模块
- 负责拼团的创建
- 负责参团
- 负责拼团的信息查询
- 负责拼团状态的维护,包含拼团成功,超时失败等
- 负责拼团成功后对应订单的创建
- 负责可能的超卖后的退款处理
- 支付模块
- 负责拼团订单的支付
- 负责拼团订单的退款
- 订单模块
- 负责拼团订单对应的商品按照指定价格和结算价进行下单
- 拼团活动模块
5.2.5. 拼团模块内部设计
- 拼团活动模块
- 与外部模块关系
- 提供拼团的定价和结算信息给拼团模块
- 根据项目,提供审核通过的拼团活动的详细信息,用于演出模块展示拼团活动和最低拼团价
- 内部逻辑
- 同一个项目,选择不同的票档参与拼团,设置拼团价格和库存
- 拼团活动以项目为维度,可以审核通过或者驳回
- 可以设置开始时间和结束时间
- 如果考虑到一定的灵活性,审核的维度可以到票档。
- 保证最终成团的售卖数量不超过拼团活动设置的最大库存
- 倘若超卖,则支付成功,购买失败,做退款。产品上需有说明
- 若拼团成功 3 单,其中 2 单有库存,一单超卖失败, 则仅退款一单
- 可以是判断是否当前团的最后一个团员,如果是,那么提交订单时就锁定整个团的库存, 如果不是,那么提交订单时不锁定整个团的库存
- 外部接口
- 创建拼团活动
- 更新拼团活动
- 拼团活动审核
- 根据项目 ID,查询拼团信息(支持是否过滤 shopId)
- 一个商家一个项目多个票档,叫做一个拼团活动
- 一个项目可能会有多个拼团活动,选择其中拼团价最低的有库存的票档用于展示
- 如果有 shopId 的过滤条件,只查询指定 shopId 的拼团活动
- 批量根据项目 ID,查询拼团信息(支持是否过滤 shopId)
- 根据拼团活动票档 Id, 查询结算价和数量
模型设计
- PinTuanCampaign
字段名 字段类型 字段含义 - - - id int 主键 ID effectiveFrom Date 拼团活动开始时间 effectiveTo Date 拼团活动结束时间 status int 拼团活动状态,已提交,已驳回, 已发布 isOpen int 是否公开 activityId int 演出 ID - PinTuanCampaignItem
字段名 字段类型 字段含义 - - - id int 主键 ID pinTuanCampaignId int 拼团活动 ID ticketCategoryId int 票档 Id activityEventId int 场次 Id salePrice int 拼团活动售价 count int 拼团活动总库存 status int 票档审核状态, 未通过,已通过 sellStatus int 票档售卖状态,开启,关闭 - 拼团活动审核的维度
- 基于票档/基于项目/基于项目当前未审核通过的部分
- 拼团活动票档的修改
- 一旦审批通过后,不可以修改拼团价格
- 关闭状态下,可以调整库存
- 拼团活动如何保证(尽量)不超卖
- 在参团下单前,校验一次已参团人员的库存情况,如果库存不足,则不允许新团员参团
- 与外部模块关系
- 拼团模块
- 与外部模块关系
- 成团后,驱动生成对应订单
- 支付拼团
- 拼团失败后,退款
- 内部逻辑
- 创建拼团/参团订单,校验拼团商品价格
- 支付拼团订单,创建拼团
- 支付参团订单,参与拼团
- 拼团超时未成功, 自动退款
- 参团达到标准,拼团成功
- 如果超卖,拼团订单退款
- 外部接口
- 创建拼团订单(包含发起团和参与团)
- 查看拼团订单详情
- 查看团的详情
模型设计
- Tuan
字段名 字段类型 字段含义 - - - id int 团 ID ownerId int 创建团的人 status int 拼团状态 addTime Date 团的创建时间 expireTime Date 团的有效期 requiredNum int 成团订单数量要求 - PinTuanOrder
字段名 字段类型 字段含义 - - - id int 拼团订单 ID payStatus int 支付状态, 待支付,已支付,已退款 tuanId int 团的 Id userId int 拼团订单的用户 count int 购买数量 salePrice int 拼团价格 - TODO: 如何自动分配选座订单的座位
- TODO: 如何保证驱动生成订单动作的幂等
- 与外部模块关系
5.2.6. 拼团任务分解
- 商家后台
- 拼团活动列表页
- 拼团活动详情页
- 拼团活动列表页接口
- 拼团活动详情页接口
- op 后台
- 拼团活动列表表
- 拼团活动详情页
- 拼团活动列表接口
- 拼团活动详情接口
- 拼团活动审核接口
- 拼团首页运营位配置
- android && ios
- 项目详情页拼团入口展示
- 商家项目详情页拼团入口展示
- 首页拼团运营位展示
- 商家列表页 && 列表页拼团价格展示
- 个人中心增加拼团订单的入口
- m 站用户侧发起/参加拼团
- 项目的拼团活动入口
- 拼团详情分享
- 拼团详情页面(各种状态和操作参考 PRD)
- 项目的拼团活动查询接口
- 拼团详情接口
- TODO: 拼团项目的场次和票档以及库存查询接口
- 拼团确认订单页面
- 拼团下单接口
- 拼团支付
- 拼团订单详情页
- 个人中心增加拼团订单的入口
- 拼团活动服务
- 拼团活动创建,更新,提交,审核,发布接口
- 拼团活动信息查询接口
- 拼团服务
- 拼团创建接口
- 拼团参加接口
- 拼团成功创建订单
- 拼团超时未成功自动退款
- 拼团超卖?
- 订单服务
- TODO: 能够根据指定的商品售价创建拼团成功后的订单