简介
本文件面向电商平台开发者,聚焦 DouPHP 电商系统的“仓储管理”数据模型与业务逻辑。当前仓库主表 dou_warehouse 在代码库中未直接实现,但系统已具备库存、订单锁定、商品库存字段等基础能力。本文基于现有数据库结构与代码行为,给出:
- 仓库主表 dou_warehouse 的推荐表结构设计(字段、索引、约束)
- 多仓库管理的业务规则(层级、状态、权限)
- 仓库与商品、供应商、订单的关联设计
- 仓库选址优化、库存分布策略、调拨管理的技术方案
- 与现有库存/订单流程的集成建议
项目结构
DouPHP 采用模块化组织,仓储相关能力主要分布在以下位置:
- 数据库定义:系统表结构文档与各模块 backup SQL
- 商品模型:产品表 product 含 stock 字段,作为库存主数据
- 订单流程:下单时根据配置决定是否锁定库存,并写入订单表
- 购物车:加入购物车前进行库存校验
graph TB
A["商品模块<br/>product 表"] --> B["订单模块<br/>order 表"]
A --> C["购物车服务<br/>CartService"]
B --> D["结账服务<br/>CheckoutService"]
C --> E["库存校验"]
D --> F["库存锁定开关"]
核心组件
- 商品库存主数据:product.stock 表示商品总库存,用于全局可售量展示与校验
- 订单库存锁定:order.stock_lock 表示订单是否锁定库存,配合站点配置控制下单锁库行为
- 购物车库存校验:加入购物车时调用 checkStock 校验可购数量,避免超卖
架构总览
下图展示了从购物车到下单的库存相关流程,以及未来引入多仓库后的扩展点。
sequenceDiagram
participant U as "用户"
participant C as "购物车服务"
participant P as "商品模型"
participant O as "结账服务"
participant DB as "数据库"
U->>C : "加入购物车(商品ID, 数量)"
C->>P : "checkStock(模块, 商品ID, 数量)"
P-->>C : "返回校验结果"
C-->>U : "加入成功/失败"
U->>O : "提交订单"
O->>DB : "读取站点库存配置"
alt "开启库存锁定"
O->>DB : "写入订单并设置 stock_lock=1"
else "关闭库存锁定"
O->>DB : "写入订单并设置 stock_lock=0"
end
O-->>U : "返回订单号"
详细组件分析
仓库主表 dou_warehouse 设计
说明:当前代码库未包含 dou_warehouse 表定义。以下为基于现有库存与订单能力的推荐设计,便于后续扩展多仓库管理。
-
基本信息
- id: 主键
- name: 仓库名称
- code: 仓库编码(唯一)
- type: 仓库类型(中心仓/区域仓/门店仓/虚拟仓)
- status: 状态(启用/停用/冻结)
- level: 层级(总部/大区/城市/门店)
- parent_id: 父仓库ID(支持树形结构)
- owner_type, owner_id: 负责人类型与ID(管理员/工作台/供应商)
- contact_name, contact_phone, contact_email: 联系人信息
- address_province, address_city, address_district, address_detail: 地址信息
- lat, lng: 经纬度(用于就近发货与配送时效估算)
- area_code: 地区编码(与系统区域表关联)
-
容量与作业能力
- capacity_total: 总容量(体积或件数)
- capacity_used: 已用容量
- capacity_mode: 容量模式(绝对值/增量/减量)
- max_order_per_day: 日最大处理单量
- support_types: 支持的业务类型(现货/预售/代发/自提)
- is_default: 是否默认仓库(用于自动分配)
-
运营与审计
- sort: 排序
- created_at, updated_at: 时间戳
- remark: 备注
-
索引建议
- 唯一索引:code
- 普通索引:parent_id、status、type、area_code、is_default
- 空间索引:lat, lng(可选,按数据库支持)
多仓库管理业务逻辑
-
仓库层级关系
- 通过 parent_id 构建仓库树,支持总部-大区-城市-门店的多级管理
- 子仓库继承父仓库的配置(如默认发货地、默认物流),可通过覆盖字段调整
-
仓库状态管理
- 启用:参与自动分配与下单选择
- 停用:仅可见不可选
- 冻结:暂停出入库操作,保留历史数据
-
仓库权限控制
- 通过 owner_type/owner_id 绑定责任主体(管理员/工作台/供应商)
- 结合平台权限体系,限制不同角色对仓库的查看、编辑、出库权限
- 建议增加仓库-角色/工作台的授权表,实现细粒度控制
仓库与商品、供应商、订单的关联
-
仓库与商品
- 建议在 product_stock_by_warehouse 表中记录每个仓库的商品可售库存、在途库存、锁定库存
- 商品主库存 product.stock 可作为全局汇总,或由各仓库库存聚合计算
-
仓库与供应商
- 供应商入库单关联 supplier_inbound 表,指定入库仓库、供应商、商品、数量
- 支持供应商直发(drop shipping)场景,将订单路由至供应商所在仓库
-
仓库与订单
- order 表可扩展 warehouse_id 字段,记录实际发货仓库
- 下单时根据收货地址、仓库能力、库存情况选择最优仓库
- 库存锁定:当站点开启库存锁定(stock_lock=1),下单即锁定对应仓库库存
库存分布策略与调拨管理
-
库存分布策略
- 就近原则:根据收货地址匹配最近仓库
- 负载均衡:按仓库处理能力(max_order_per_day)与当前负载动态分配
- 安全库存:为热销商品在各仓库设置最低库存阈值,低于阈值触发补货
- 预售与现货分离:不同仓库支持不同业务类型,订单路由时过滤不支持的仓库
-
调拨管理
- 创建调拨单(transfer_order),包含源仓库、目标仓库、商品、数量、状态
- 调拨流程:申请→审批→出库→在途→入库→完成
- 库存变更:出库扣减源仓库存,入库增加目标仓库存;在途阶段占用中间态库存
- 异常处理:部分到货、拒收、破损等场景记录日志并回滚或调整库存
仓库选址优化
-
数据维度
- 订单密度:按区域统计订单量与增长趋势
- 配送时效:结合经纬度与物流网络,评估各仓库到客户的平均时效
- 成本因素:仓储成本、干线运输成本、末端配送成本
- 风险因素:自然灾害、政策限制、供应链中断概率
-
算法建议
- 重心法/覆盖模型:以成本最小化或服务半径最大化为目标函数
- 多目标优化:平衡成本、时效、风险,使用加权评分或帕累托前沿
- 动态重规划:定期(月度/季度)重新评估仓库布局,随业务变化调整
与现有库存/订单流程的集成
-
购物车校验
- 加入购物车时检查商品可用库存,避免超卖
- 若引入多仓库,需按仓库维度校验可售库存
-
下单锁库
- 根据站点配置决定是否锁定库存(stock_lock)
- 引入多仓库后,锁定应指向具体仓库的库存
-
商品模型
- 商品模型提供 stock 字段的读写与格式化
- 多仓库场景下,商品主库存可由各仓库库存聚合得到
依赖关系分析
- 商品与库存
- product.stock 是全局库存主数据,未来可拆分为仓库维度库存
- 订单与库存锁定
- order.stock_lock 控制下单是否锁定库存,影响库存占用与释放时机
- 购物车与库存校验
- CartService.checkStock 在加入购物车时进行库存可用性检查
classDiagram
class 商品 {
+id
+stock
+price
+status
}
class 订单 {
+id
+order_sn
+stock_lock
+warehouse_id
}
class 仓库 {
+id
+name
+code
+status
+capacity_total
+capacity_used
}
class 购物车服务 {
+checkStock()
}
class 结账服务 {
+createOrder()
}
购物车服务 --> 商品 : "校验库存"
结账服务 --> 订单 : "创建并锁定库存"
订单 --> 仓库 : "发货仓库"
商品 --> 仓库 : "仓库库存明细"
性能考虑
- 库存查询优化
- 为 product.stock、order.stock_lock 建立必要索引
- 多仓库库存查询建议使用分区或分表,按仓库或商品维度拆分
- 库存锁定与释放
- 使用事务保证库存扣减与订单创建的原子性
- 超时释放:对未支付订单的库存锁定设置超时释放机制
- 高并发场景
- 使用乐观锁或分布式锁防止超卖
- 热点商品库存更新采用队列异步处理,降低数据库压力
故障排查指南
- 库存不一致
- 检查订单是否错误设置 stock_lock,导致库存未锁定或未释放
- 核对购物车校验逻辑,确认 checkStock 是否正确拦截超卖
- 下单失败
- 检查站点库存配置是否开启,以及插件支付模块是否启用
- 确认商品是否存在有效库存,或仓库是否支持该商品
- 调拨异常
- 检查调拨单状态流转,确认出库与入库是否成对完成
- 查看异常日志,定位在途库存未入账或重复扣减问题
结论
当前 DouPHP 已具备商品库存与订单锁定的基础能力,为多仓库管理提供了良好起点。通过新增仓库主表 dou_warehouse 及其关联表,可实现仓库层级、状态、权限控制,以及与商品、供应商、订单的精细化关联。结合库存分布策略与调拨管理,可显著提升履约效率与客户体验。建议在实施过程中优先完善库存校验与锁定逻辑,再逐步扩展多仓库能力。
附录
- 关键表字段参考
- product.stock:商品总库存
- order.stock_lock:订单库存锁定标志
- 推荐新增:dou_warehouse(仓库主表)、product_stock_by_arehouse(仓库库存明细)、supplier_inbound(供应商入库单)、transfer_order(调拨单)