电商履约与发货系统怎么设计?一次讲清拆单、配仓、发货单、物流回传与状态联动
电商履约与发货系统怎么设计一次讲清拆单、配仓、发货单、物流回传与状态联动大家好我是一名有 4 年工作经验的 Java 后端开发。订单创建出来以后真正把货送到用户手里这中间其实还有一整段很容易被低估的履约链路。这篇文章我想系统聊一聊电商履约与发货系统到底应该怎么设计。个人主页文章目录电商履约与发货系统怎么设计一次讲清拆单、配仓、发货单、物流回传与状态联动一、履约系统到底在做什么二、为什么订单状态和履约状态不能混成一个字段三、推荐的核心模型3.1 订单表3.2 发货单表3.3 发货单明细表3.4 物流轨迹表四、典型流程怎么走4.1 支付成功4.2 配仓4.3 生成发货单4.4 推物流4.5 回传物流状态五、最关键的几个设计点5.1 拆单能力5.2 部分发货能力5.3 发货动作幂等5.4 物流状态回传不要直接覆盖订单状态六、数据库示例6.1 发货单表6.2 发货单明细表6.3 物流轨迹表七、最容易踩的坑7.1 订单状态和发货状态混成一个字段7.2 没有发货单模型7.3 物流回调直接改订单状态7.4 人工补发和系统发货不统一八、面试中怎么回答九、总结十、结尾一、履约系统到底在做什么很多人会简单理解成支付后发货但真实履约链路通常包含订单拆单仓库分配发货单生成物流面单物流状态回传签收 / 失败 / 拒收处理所以履约系统本质上是在解决订单如何从“支付成功”变成“真实发货并可追踪履约过程”。二、为什么订单状态和履约状态不能混成一个字段很多系统一开始只在订单表里放一个status。但很快就会发现不够订单状态是PAID履约可能还在“待配仓”也可能已经“部分发货”也可能“物流已签收”所以我更建议至少拆两层订单状态履约 / 发货状态必要时再拆物流状态三、推荐的核心模型我建议至少拆这些表3.1 订单表表示交易本身。3.2 发货单表表示一次真实发货动作。3.3 发货单明细表表示这次发货发了哪些 SKU。3.4 物流轨迹表表示物流回传节点。这样做的好处是一个订单可拆多次发货一个订单可部分发货物流状态单独维护四、典型流程怎么走4.1 支付成功订单状态改为PAID进入履约待处理队列4.2 配仓根据仓库库存、地区、运费、时效选择仓库4.3 生成发货单生成履约单 / 发货单扣减真实库存4.4 推物流调快递接口生成运单号4.5 回传物流状态已揽件运输中派送中已签收五、最关键的几个设计点5.1 拆单能力比如一个订单有多个商品来自不同仓库或一个仓库缺货这时一个订单就可能拆成多张发货单。5.2 部分发货能力不是所有订单都能一次发完。所以履约系统要支持部分发货剩余待发货5.3 发货动作幂等物流接口、仓库回调、人工补发都可能重复触发所以发货动作本身也要有幂等控制。5.4 物流状态回传不要直接覆盖订单状态物流状态更新应该先更新物流 / 发货单层再根据规则决定是否联动订单状态。六、数据库示例6.1 发货单表CREATETABLEshipment_order(idBIGINTPRIMARYKEYAUTO_INCREMENT,order_idBIGINTNOTNULL,warehouse_idBIGINTNOTNULL,shipment_statusVARCHAR(32)NOTNULL,express_companyVARCHAR(64)DEFAULTNULL,express_noVARCHAR(64)DEFAULTNULL,shipped_atDATETIMEDEFAULTNULL,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP);6.2 发货单明细表CREATETABLEshipment_order_item(idBIGINTPRIMARYKEYAUTO_INCREMENT,shipment_order_idBIGINTNOTNULL,order_item_idBIGINTNOTNULL,sku_idBIGINTNOTNULL,quantityINTNOTNULL);6.3 物流轨迹表CREATETABLElogistics_trace(idBIGINTPRIMARYKEYAUTO_INCREMENT,shipment_order_idBIGINTNOTNULL,trace_statusVARCHAR(32)NOTNULL,trace_contentVARCHAR(255)NOTNULL,trace_timeDATETIMENOTNULL);七、最容易踩的坑7.1 订单状态和发货状态混成一个字段后面很难支持部分发货和多次发货。7.2 没有发货单模型很多物流、仓库、售后逻辑都没法稳定承接。7.3 物流回调直接改订单状态中间缺少履约层后面会非常乱。7.4 人工补发和系统发货不统一很容易导致状态、日志、库存对不上。八、面试中怎么回答如果面试官问你电商履约和发货系统一般怎么设计你可以这样回答第一我不会把履约简单理解成订单支付后直接发货而是会把它拆成配仓、发货单生成、物流推送、轨迹回传几个阶段。第二我一般不会只在订单表里维护一个发货状态而是会单独设计发货单和发货单明细表这样才能支持拆单、部分发货和多次发货。第三物流状态和订单状态我会尽量解耦物流回传先更新履约层再根据规则去联动订单状态而不是直接在物流回调里改订单状态。第四发货动作本身要做幂等人工补发、仓库回调、重复通知都不能把状态搞乱。九、总结履约系统真正难的不是“发货”两个字而是如何把订单仓库发货单物流轨迹状态联动真正拆清楚。如果只记一句结论我觉得可以记住这句电商履约最稳的设计不是订单表里多加几个字段而是把订单层、发货单层、物流层真正拆开。十、结尾如果你觉得这篇文章对你有帮助欢迎点赞、收藏、关注。后面我会继续整理一些更偏实战的 Java 后端和电商系统设计文章。