Post

电商物流:配送管理系统实践

当今电商行业蓬勃发展,物流是其中不可或缺的一个环节,而配送管理系统(Delivery Management System, DMS) 用于实物商品从下单到配货到发货到签收以及退换货的全流程管理(相对于实物商品,虚拟商品如教培行业的课程就不再DMS处理范围内,一般两者可以通过更为抽象的履约平台进行统一调度和管理)。 注意DMS并不关心商品的实际配送本身,你可以在自营仓库发货,也可以在第三方仓库发货,你可以走顺丰,也可以走圆通,DMS负责管理这些数据,使得运营人员更高效的实现商品配送。 DMS相当于公司的一层防腐层服务,用于对接内部或第三方的ERP系统,其交互大致如下:

首先介绍一些实体概念:

  • 发货单:承接公司内部发货请求生成的发货订单,上游可以是用户拍下的订单、赠品、活动奖品、之前发货的问题件需要重新发等;
  • 发货类型:发货请求来源,一种来源代表一种类型;
  • 发货任务:发货任务用于圈定发货单执行发货单推送,发货任务将符合条件的发货单”汇聚”在一起,即发货任务:发货单 = 1:n, 一个发货任务作为推送到ERP的最小单位;发货任务分为自动发货任务(定时触发)和手动发货任务;
  • 自动发货配置:用于生成自动发货任务的配置,比如每天3点执行A系统下的发货单,则自动发货配置会在每天3点生成一个发货任务,这个发货任务为圈定A系统的发货单;
  • 商品包:一个发货单对应一个商品包,一个商品包含有多种sku商品,每种sku商品的数量可以有多个;
  • 物流单:即快递单,含有物流单号,如顺丰的SF12345677,一个发货单可能有多个物流单(拆单),一个物流单也可能有多个发货单(合单),即发货单:物流单 = m:n

介绍一些行为概念:

  • 生单:生成一个发货单;
  • 圈单:发货任务圈定发货单;
  • 推单:将发货任务的发货单推送到ERP;
  • 回单:ERP发货后将发货单对应的物流单号等信息回传给DMS;
  • 拆单:由于某个库商品库存不足等原因,一个发货单发的商品需要分几次发货,此时,在回单时需要执行拆单逻辑;
  • 合单:同一个用户地址不同的发货单可以用一个物流单发货,节省资源,一般该步骤ERP自行解决,只需给不同的发货单回传一个物流单号即可。

交互图如下:

状态机如下:

其中发货单没有已签收状态,应为发货单只管发货而且用户签收的实际上是物流单

生单

生成发货单主要分为3种方式:

  • 其他服务RPC: 使用二方包调用接口同步生单,如openfeign,dubbo等;
  • Web前端HTTP: 管理系统中手动创建发货单,同步调用后台接口;
  • Excel: Web前端上传excel文件,后台异步任务解析生单,生单结果可通过邮件或IM系统发送通知。

生单时不仅仅会生成发货单数据,还有接入层数据,每一个发货类型都有一个接入层表存储其领域和发货单相关联的扩展数据, 每一条发货单数据都有一条对应的接入层数据, 这些数据DMS并不关心,但后续会有查询诉求,直接存在json字段中不优雅且查询效率低。

具体可参考:业务模型扩展字段存储

发货单包含以下信息

  • 生单请求订单号:上游系统的业务标识,一个订单号对应多个发货单
  • 收件人信息:姓名电话收件地址
  • 发货商品包:需要发货的所有商品信息,包含sku及其数量

圈单

发货任务圈定符合条件的发货单,条件可以分为多种:

  • 发货类型
  • 时间
  • 商品
  • 指定发货:指定订单号下的发货单被圈定

发货任务圈定动作由定时任务扫描发货任务表,将符合发货任务圈定条件的发货单圈定,通过另一张发货任务圈定详情表记录该任务圈定的发货单。

自动发货配置

除了在Web界面上手动创建发货任务,还可以创建自动发货配置来自动发货,自动发货配置除了要包含发货任务的配置参数信息还需要有何时触发的信息, 另使用一个发货任务扫描自动发货配置表,将可生成发货任务的配置生成发货任务。

推单

在发货任务圈单完毕后,发货任务圈定详情表记录了圈定的发货单。后续的推单流程仍然通过异步任务定时推送。

推送会经过一系列通用校验和处理,如:

  • 商品库存校验
  • 收货信息有效性校验
  • 收货人/地址黑名单拦截
  • 地址规范化
  • 赠品绑定发货
  • ERP请求参数适配转换
  • 推送ERP
  • 数据变更落库
  • 推送结果触达

当然不同的发货类型可能有单独的校验和处理需求,此时通过责任链模式将原子能力按发货类型串联在一起,保证了差异代码逻辑的隔离和通用逻辑代码的复用。

回单 & 拆单

ERP处理发货单发货后会回传对应的物流单号到DMS中,此时需要更新发货单为已发货状态,并插入已发货状态的物流单,同时需要订阅该物流单号的物流轨迹,如通过 第三方平台快递鸟跟踪物流轨迹。

在回单时要处理拆单的情况。如何拆单?拆单后会有多个物流单,每个物流单可能间隔较长时间回传, ERP每次回传都需要将拆单标记为true,同时携带的发货单号是最开始推送过去的原始发货单号,这样DMS在接收到请求时会进行处理(新建一个发货单或在原发货单基础上新增物流单)。 此外为了拆单时识别哪些商品已经发货,哪些未发货,在推单时需要记录推单的商品详情,然后回单时ERP携带已推送商品信息,DMS根据两者差异做处理。

ERP商品&地址适配

公司内部的商品和ERP商品的唯一标识可能不同,需要在DMS做转换适配; 地址可能由于用户输入格式、行政区划变化导致与ERP侧不匹配,也需要在DMS做转换适配;

This post is licensed under CC BY 4.0 by the author.