案例: 拼团系统设计

1. 拼团

1.1. 拼团需求分析

  • 商家能创建/参与拼团活动
  • op 能审核&发布该拼团活动
  • 当拼团活动发布之后,符合一定的标准,用户可以在商品详情页看到
  • 用户可以发起或者参加某个团
  • 团符合成功标准,则拼团成功。超时未符合,则拼团失败
  • 拼团成功,则用户购买成功。失败,则退款
  • 购买成功后,用户能看到订单, 能看到后续的发货流程,正常消费。
  • 如果拼团成功,但是超卖,可能也需要退款

1.2. 拼团用户场景

  • 商家
    • 创建拼团活动
    • 修改拼团活动内容
    • 查看拼团活动审核情况
  • 管理人员
    • 审核拼团活动
    • 驳回拼团活动
  • 用户
    • 基于项目查看拼团活动
    • 创建一个拼团
    • 参与一个拼团
    • 查看拼团进度
    • 拼团成功后查看订单,消费票券
    • 拼团失败后退款

1.3. 拼团场景分析

  • 商家创建拼团活动

    /assets/blog/2018/08/20/案例-拼团系统设计/merchant-tuan-campaign.png

  • 用户创建拼团

    /assets/blog/2018/08/20/案例-拼团系统设计/user-tuan.png

1.4. 拼团系统概要设计

1.4.1. 重点概念解释

  • 拼团活动

    制作领域的概念,包含参与拼团活动的项目,场次,票档,拼团价格,结算价格,有效期,是否公开等信息

  • 第一个拼团订单创建完成,会生成一个团。用于承载拼团动作的结果

  • 拼团订单

    用于承载针对某个团的参与动作,以及支付行为, 驱动后续的订单生成等

1.4.2. 模块划分

  • 拼团活动模块
    • 负责拼团活动的创建,审核,发布功能
    • 负责拼团活动的查询
  • 拼团模块
    • 负责拼团的创建
    • 负责参团
    • 负责拼团的信息查询
    • 负责拼团状态的维护,包含拼团成功,超时失败等
    • 负责拼团成功后对应订单的创建
    • 负责可能的超卖后的退款处理
  • 支付模块
    • 负责拼团订单的支付
    • 负责拼团订单的退款
  • 订单模块
    • 负责拼团订单对应的商品按照指定价格和结算价进行下单

1.5. 拼团模块内部设计

1.5.1. 拼团活动模块

  1. 与外部模块关系
    • 提供拼团的定价和结算信息给拼团模块
    • 根据项目,提供审核通过的拼团活动的详细信息,用于演出模块展示拼团活动和最低拼团价
  2. 内部逻辑
    • 同一个项目,选择不同的票档参与拼团,设置拼团价格和库存
    • 拼团活动以项目为维度,可以审核通过或者驳回
    • 可以设置开始时间和结束时间
    • 如果考虑到一定的灵活性,审核的维度可以到票档。
    • 保证最终成团的售卖数量不超过拼团活动设置的最大库存
      • 倘若超卖,则支付成功,购买失败,做退款。产品上需有说明
      • 若拼团成功 3 单,其中 2 单有库存,一单超卖失败, 则仅退款一单
      • 可以是判断是否当前团的最后一个团员,如果是,那么提交订单时就锁定整个团的库存, 如果不是,那么提交订单时不锁定整个团的库存
  3. 外部接口
    1. 创建拼团活动
    2. 更新拼团活动
    3. 拼团活动审核
    4. 根据项目 ID,查询拼团信息(支持是否过滤 shopId)
      1. 一个商家一个项目多个票档,叫做一个拼团活动
      2. 一个项目可能会有多个拼团活动,选择其中拼团价最低的有库存的票档用于展示
      3. 如果有 shopId 的过滤条件,只查询指定 shopId 的拼团活动
    5. 批量根据项目 ID,查询拼团信息(支持是否过滤 shopId)
    6. 根据拼团活动票档 Id, 查询结算价和数量
  4. 模型设计

    • 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 票档售卖状态,开启,关闭
  5. 拼团活动审核的维度
    1. 基于票档/基于项目/基于项目当前未审核通过的部分
  6. 拼团活动票档的修改
    1. 一旦审批通过后,不可以修改拼团价格
    2. 关闭状态下,可以调整库存
  7. 拼团活动如何保证(尽量)不超卖
    1. 在参团下单前,校验一次已参团人员的库存情况,如果库存不足,则不允许新团员参团

1.5.2. 拼团模块

  1. 与外部模块关系
    • 成团后,驱动生成对应订单
    • 支付拼团
    • 拼团失败后,退款
  2. 内部逻辑
    • 创建拼团/参团订单,校验拼团商品价格
    • 支付拼团订单,创建拼团
    • 支付参团订单,参与拼团
    • 拼团超时未成功, 自动退款
    • 参团达到标准,拼团成功
    • 如果超卖,拼团订单退款
  3. 外部接口
    1. 创建拼团订单(包含发起团和参与团)
    2. 查看拼团订单详情
    3. 查看团的详情
  4. 模型设计

    • 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 拼团价格
  5. TODO: 如何自动分配选座订单的座位
  6. TODO: 如何保证驱动生成订单动作的幂等

1.6. 拼团任务分解

  • 商家后台
    • 拼团活动列表页
    • 拼团活动详情页
    • 拼团活动列表页接口
    • 拼团活动详情页接口
  • op 后台
    • 拼团活动列表表
    • 拼团活动详情页
    • 拼团活动列表接口
    • 拼团活动详情接口
    • 拼团活动审核接口
    • 拼团首页运营位配置
  • android && ios
    • 项目详情页拼团入口展示
    • 商家项目详情页拼团入口展示
    • 首页拼团运营位展示
    • 商家列表页 && 列表页拼团价格展示
    • 个人中心增加拼团订单的入口
  • m 站用户侧发起/参加拼团
    • 项目的拼团活动入口
    • 拼团详情分享
    • 拼团详情页面(各种状态和操作参考 PRD)
    • 项目的拼团活动查询接口
    • 拼团详情接口
    • TODO: 拼团项目的场次和票档以及库存查询接口
    • 拼团确认订单页面
    • 拼团下单接口
    • 拼团支付
    • 拼团订单详情页
    • 个人中心增加拼团订单的入口
  • 拼团活动服务
    • 拼团活动创建,更新,提交,审核,发布接口
    • 拼团活动信息查询接口
  • 拼团服务
    • 拼团创建接口
    • 拼团参加接口
    • 拼团成功创建订单
    • 拼团超时未成功自动退款
    • 拼团超卖?
  • 订单服务
    • TODO: 能够根据指定的商品售价创建拼团成功后的订单