buy-process-business-analysis
约 5066 字大约 17 分钟
2026-02-03
本文档专注于 ShopXO 购买流程的业务逻辑分析,不涉及具体代码实现细节。 目标:为开发者和业务分析师提供清晰、结构化的购买流程参考。
目录
1. 概述
1.1 研究目标
本文档深入分析 ShopXO 电商系统的购买流程核心业务逻辑,涵盖从商品选择到订单创建的完整链路。
核心研究内容:
- 购物车处理机制
- 订单创建流程
- 库存管理与锁定机制
- 订单拆分策略
- 价格计算逻辑
1.2 核心概念
| 概念 | 说明 |
|---|---|
| 购买类型 | 系统支持两种购买方式:goods(直接购买) 和 cart(购物车购买) |
| 订单模式 | 定义订单的配送方式,包括快递、同城、自提、虚拟等 |
| 站点类型 | 系统级别的配送模式配置,可组合支持多种配送方式 |
| 仓库模式 | 商品按仓库分组,不同仓库的商品可能拆分为多个订单 |
| 规格商品 | 同一商品可因规格(颜色、尺寸等)差异拥有不同价格和库存 |
1.3 订单模式类型
系统支持多种订单配送模式:
| 模式值 | 名称 | 说明 | 是否需要地址 |
|---|---|---|---|
0 | 快递配送 | 传统快递发货 | ✅ 收货地址 |
1 | 同城配送 | 本地配送服务 | ✅ 收货地址 |
2 | 自提 | 用户到店自提 | ✅ 自提点地址 |
3 | 虚拟商品 | 虚拟商品或服务 | ❌ 无需地址 |
4 | 展示型 | 仅展示不可下单 | - |
组合模式:
5: 快递 + 自提6: 同城 + 自提7: 快递 + 同城8: 快递 + 同城 + 自提
1.4 相关服务层
购买流程涉及多个服务层协同:
┌─────────────────────────────────────────────────────────────┐
│ BuyService │
│ (购买流程核心服务) │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────┼─────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ GoodsCartService│ │ OrderSplitService│ │GoodsService │
│ (购物车服务) │ │ (订单拆分服务) │ │ (商品服务) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ UserService │ │ PaymentService │ │WarehouseService │
│ (用户服务) │ │ (支付服务) │ │ (仓库服务) │
└─────────────────┘ └─────────────────┘ └─────────────────┘2. 购买流程总览
2.1 购买入口
系统提供两种购买入口:
| 入口类型 | 触发场景 | 数据来源 | 典型使用场景 |
|---|---|---|---|
| 直接购买 (goods) | 用户在商品详情页直接点击购买 | 商品ID + 规格 + 数量 | 快速购买单个商品 |
| 购物车购买 (cart) | 用户从购物车页面提交订单 | 购物车内选中的商品 | 批量购买多个商品 |
2.2 主流程图
2.3 关键决策点说明
| 决策点 | 说明 | 业务影响 |
|---|---|---|
| 站点模式判断 | 根据系统配置和商品类型确定订单配送模式 | 决定是否需要地址、是否拆单 |
| 订单拆分 | 多仓库或多配送模式触发订单拆分 | 生成多个子订单 |
| 库存扣除时机 | 可配置下单时/支付时/发货时扣库存 | 影响库存并发安全 |
| 订单状态 | 预约模式/正常支付/线下支付决定初始状态 | 影响后续流程走向 |
3. 购物车处理逻辑
3.1 购物车数据获取
流程说明:
核心数据字段:
| 字段 | 来源 | 说明 |
|---|---|---|
goods_id | 购物车表 | 商品ID |
stock | 购物车表 | 购买数量 |
spec | 购物车表 | 商品规格(JSON) |
title | 商品表 | 商品标题 |
images | 商品表 | 商品图片 |
price | 规格表 | 规格价格 |
inventory | 规格表 | 规格库存 |
original_price | 规格表 | 规格原价 |
3.2 购物车商品校验
购物车商品在提交订单前会进行以下校验:
| 校验项 | 校验内容 | 失败处理 |
|---|---|---|
| 商品状态 | is_shelves = 1 且 is_delete_time = 0 | 提示商品已下架或删除 |
| 起购数量 | 购买数量 ≥ 规则起购数/商品起购数 | 提示数量不足 |
| 限购数量 | 购买数量 ≤ 规则限购数/商品限购数 | 提示数量超限 |
| 库存充足 | 购买数量 ≤ 规格库存 | 提示库存不足 |
| 模式一致性 | 多商品时需配送模式一致 | 提示模式不一致 |
3.3 购物车删除时机
购物车数据删除的时机:
| 场景 | 是否删除 | 说明 |
|---|---|---|
| 订单创建成功 | ✅ 删除 | 仅删除已下单的购物车项 |
| 订单创建失败 | ❌ 保留 | 用户可调整后重新提交 |
| 直接购买模式 | ❌ 不涉及 | 不经过购物车 |
4. 下单流程详解
4.1 流程时序图
4.2 用户状态校验
下单前必须验证用户状态:
| 校验项 | 说明 | 异常处理 |
|---|---|---|
| 用户存在 | 用户ID有效 | 提示用户信息错误 |
| 用户状态 | 账号未被禁用 | 提示账号异常 |
| 会员状态 | 会员有效期内 | 根据业务需求处理 |
4.3 商品数据校验
下单时进行二次校验,确保数据准确性:
4.4 地址处理
快递/同城配送模式:
- 用户必须选择收货地址
- 未选择时使用默认地址
- 地址信息包含:姓名、电话、省市区、详细地址、经纬度
自提模式:
- 用户选择自提点
- 可选填写联系人信息(取货人姓名、电话)
- 系统自动生成4位取货码
虚拟商品模式:
- 无需收货地址
- 商品虚拟值直接写入订单详情
4.5 支付方式处理
| 配置项 | 说明 |
|---|---|
| 预约模式 | 开启后订单状态为待确认,无需支付 |
| 支付方式必选 | 订单金额>0时必须选择支付方式 |
| 线下支付 | 线下支付订单可直接设为已支付状态 |
订单状态决策表:
| 预约模式 | 支付方式 | 线下支付正常流程 | 订单状态 |
|---|---|---|---|
| 开启 | - | - | 0 待确认 |
| 关闭 | 已选择 | 否 | 1 待支付 |
| 关闭 | 已选择 | 是 | 2 已支付 |
4.6 订单数据结构
订单创建时生成的核心数据:
订单主表字段:
order_no- 订单号(YmdHis + 6位随机数)user_id- 用户IDwarehouse_id- 仓库IDstatus- 订单状态price- 商品总价preferential_price- 优惠金额increase_price- 增加金额total_price- 实际支付金额payment_id- 支付方式IDorder_model- 订单配送模式
订单详情字段:
goods_id- 商品IDtitle- 商品标题images- 商品图片price- 规格价格original_price- 规格原价spec- 商品规格(JSON)buy_number- 购买数量total_price- 小计金额
5. 库存校验与锁定
5.1 库存扣除规则
系统支持三种库存扣除时机,由配置 common_deduction_inventory_rules 控制:
| 规则值 | 名称 | 扣除时机 | 优缺点 |
|---|---|---|---|
0 | 下单扣库存 | 订单确认成功时 | 优点:库存准确 缺点:恶意下单占用库存 |
1 | 支付扣库存 | 订单支付成功时 | 优点:减少恶意占用 缺点:超卖风险 |
2 | 发货扣库存 | 订单发货时 | 优点:灵活度高 缺点:库存预警困难 |
配置检查点:
common_is_deduction_inventory- 是否启用库存扣除功能
5.2 库存扣除流程图
5.3 商品校验
库存扣除前进行商品校验:
| 校验项 | 校验内容 | 说明 |
|---|---|---|
| 商品库存 | inventory >= buy_number | 商品级库存充足 |
| 规格库存 | spec.inventory >= buy_number | 规格级库存充足 |
| 扣库存标志 | is_deduction_inventory = 1 | 商品启用扣库存 |
| 重复扣除检查 | 查询库存日志 | 避免模式切换导致重复扣除 |
5.4 仓库库存联动
库存扣除涉及三层库存:
6. 库存回滚机制
6.1 回滚触发条件
库存回滚仅在订单取消或关闭时触发:
| 订单状态 | 说明 | 是否回滚 |
|---|---|---|
5 | 已取消 | ✅ 回滚库存 |
6 | 已关闭 | ✅ 回滚库存 |
| 其他状态 | - | ❌ 不回滚 |
6.2 回滚流程图
6.3 回滚日志
库存日志表 sxo_order_goods_inventory_log 记录完整操作历史:
| 字段 | 说明 |
|---|---|
order_id | 订单ID |
order_detail_id | 订单详情ID |
goods_id | 商品ID |
order_status | 扣除时的订单状态 |
original_inventory | 原始库存量 |
new_inventory | 扣除后库存量 |
is_rollback | 是否已回滚 |
rollback_time | 回滚时间 |
add_time | 扣除时间 |
7. 订单拆分逻辑
7.1 拆分触发场景
订单拆分由以下场景触发:
| 场景 | 拆分原因 | 拆分规则 |
|---|---|---|
| 多仓库 | 商品位于不同仓库 | 每个仓库生成一个订单 |
| 混合配送模式 | 系统支持多种配送模式 | 按配送模式拆分 |
| 用户指定 | 用户选择不同配送方式 | 按用户选择拆分 |
7.2 拆分流程图
7.3 金额计算
每个拆分订单独立计算金额:
| 字段 | 计算方式 | 说明 |
|---|---|---|
total_price | Σ(商品价格 × 数量) | 商品总价 |
actual_price | total_price - preferential + increase | 实际支付金额 |
preferential_price | 扩展数据中type=0的总和 | 优惠金额 |
increase_price | 扩展数据中type=1的总和 | 增加金额 |
示例:
订单A: 快递模式
- 商品1: 价格100 × 2 = 200
- 商品2: 价格50 × 1 = 50
- total_price = 250
- 运费(增加): +10
- 优惠券(优惠): -20
- actual_price = 250 + 10 - 20 = 240
订单B: 自提模式
- 商品3: 价格80 × 1 = 80
- total_price = 80
- 自提优惠: -5
- actual_price = 80 - 5 = 75
总计: actual_price = 240 + 75 = 3158. 价格计算逻辑
8.1 价格字段说明
| 字段 | 含义 | 计算来源 |
|---|---|---|
original_price | 商品原价 | 规格原价 |
price | 售价 | 规格价格(可应用VIP价) |
total_price | 商品总价 | Σ(price × buy_number) |
preferential_price | 优惠金额 | 优惠券、满减等 |
increase_price | 增加金额 | 运费、服务费等 |
actual_price | 实际支付 | total_price - preferential + increase |
8.2 计算流程
8.3 VIP 价格应用
VIP 用户享受特殊价格:
| 条件 | 处理方式 |
|---|---|
| 用户是VIP | 覆盖原价,使用VIP价格 |
| 用户非VIP | 使用规格原价 |
| 未设置VIP价 | 使用规格原价 |
价格优先级:
VIP价格 > 规格价格 > 商品基础价格9. 订单状态流转
9.1 状态说明
| 状态值 | 名称 | 说明 | 可操作 |
|---|---|---|---|
0 | 待确认 | 预约模式或待审核 | 确认、取消 |
1 | 待支付 | 已确认待付款 | 支付、取消 |
2 | 已支付 | 已付款待发货 | 发货、退款 |
3 | 已发货 | 商品已发出 | 确认收货 |
4 | 已完成 | 交易完成 | 评价、售后 |
5 | 已取消 | 订单取消 | - |
6 | 已关闭 | 订单关闭 | - |
9.2 状态流转图
10. 扩展机制
10.1 钩子系统
购买流程通过钩子系统提供扩展点,允许插件介入业务流程:
钩子触发位置:
- 订单创建前
- 订单创建后
- 库存扣除前
- 价格计算时
- 订单拆分时
10.2 主要扩展点
| 钩子名称 | 触发时机 | 用途 |
|---|---|---|
plugins_service_buy_oredr_site_type_model | 确定订单模式 | 修改配送模式 |
plugins_service_buy_handle | 订单数据处理 | 修改订单数据 |
plugins_service_buy_order_insert_begin | 订单插入前 | 添加额外字段 |
plugins_service_buy_order_insert_end | 订单插入后 | 关联数据处理 |
plugins_service_buy_order_submit_success | 订单提交成功 | 发送通知等 |
11. 业务规则汇总
11.1 校验规则
| 规则 | 触发时机 | 校验内容 | 失败提示 |
|---|---|---|---|
| 商品上架校验 | 下单前 | is_shelves = 1 | 商品已下架 |
| 起购数量校验 | 下单前 | stock ≥ min_number | 数量不足 |
| 限购数量校验 | 下单前 | stock ≤ max_number | 数量超限 |
| 库存校验 | 下单前/支付前 | stock ≤ inventory | 库存不足 |
| 模式一致性校验 | 购物车下单 | 所有商品模式一致 | 模式不一致 |
| 地址必填校验 | 下单前 | 快递/同城需地址 | 请选择地址 |
| 支付方式校验 | 下单前 | 金额>0需选支付 | 请选择支付方式 |
11.2 库存规则
| 规则 | 配置项 | 说明 |
|---|---|---|
| 启用库存扣除 | common_is_deduction_inventory | 全局开关 |
| 扣除时机 | common_deduction_inventory_rules | 0:下单 1:支付 2:发货 |
| 扣库存标志 | goods.is_deduction_inventory | 商品级控制 |
| 重复扣除防护 | 日志表查询 | 避免模式切换重复扣 |
| 回滚条件 | 订单状态=5或6 | 取消/关闭时回滚 |
11.3 价格规则
| 规则 | 说明 |
|---|---|
| 价格来源 | 优先级: VIP价 > 规格价 > 商品价 |
| 扩展金额 | type=0减少, type=1增加 |
| 负数防护 | actual_price < 0 时设为 0 |
| 金额精度 | 使用 PriceNumberFormat 格式化 |
附录
A. 数据表关系
sxo_order (订单主表)
├── sxo_order_detail (订单详情)
│ └── sxo_order_fictitious_value (虚拟商品值)
├── sxo_order_address (订单地址)
├── sxo_order_extraction_code (自提码)
├── sxo_order_currency (订单货币)
└── sxo_order_goods_inventory_log (库存日志)
sxo_cart (购物车)
├── sxo_goods (商品)
│ └── sxo_goods_spec_base (规格)
└── sxo_user (用户)B. 关键方法映射
| 业务功能 | 对应方法 |
|---|---|
| 购买入口 | BuyTypeGoodsList() |
| 购物车购买 | BuyCart() |
| 直接购买 | BuyGoods() |
| 订单创建 | OrderInsert() |
| 订单拆分 | OrderSplitHandle() |
| 库存扣除 | OrderInventoryDeduct() |
| 库存回滚 | OrderInventoryRollback() |
| 商品校验 | BuyGoodsCheck() |
C. 配置项索引
| 配置键 | 默认值 | 说明 |
|---|---|---|
common_order_is_booking | 0 | 预约模式 |
common_is_deduction_inventory | 0 | 启用库存扣除 |
common_deduction_inventory_rules | 1 | 库存扣除规则 |
common_fictitious_order_direct_pay | 0 | 虚拟商品直接下单 |
common_is_under_line_order_normal | 0 | 线下订单正常流程 |
文档版本: v1.0 更新日期: 2025-01-31 适用版本: ShopXO v6.7.0+
