一、概述
在物流系统中,中台只负责物流订单的流转,具体的物流履行往往需要对接第三方快递公司。由于第三方快递公司的技术标准不一样,因此我们需要对第三方快递公司的接口进行封装,这里涉及到两大类封装,一个是下发请求的封装,一个是接收回传的物流详情的封装。对于下发快递公司,我们不仅仅是接口层面的封装,而是抽象出了一套服务模板,让快递公司的物流服务以一种产品形式呈现给商家和用户。对于物流详情,我们会设计一套自己的数据模型,来对接不同的快递公司。
二、物流服务
1、概念模型
物流服务从模型上又分成三个部分:服务模板、快递公司模型和运费模板。物流服务从流程上来说分成三个阶段:物流服务的表达、物流服务的路由、物流服务的履行。
首先我们会录入快递公司,并且配置好快递公司的运费模板,然后我们会编辑服务模板,最后我们把可以提供相应服务的快递公司挂载到对应的服务模板下面。完成上面的步骤后,商家就可以针对不同的商品选择对应的服务模板,挂载了服务模板的商品在用户交易下单的时候是可以看到物流服务的,这时候就会让用户选择服务模板下的不同快递公司,然后根据快递公司的运费模板进行物流费用的计算,从而完成订单金额的计算,后续商家发货的时候,中台会根据订单上的物流服务快照信息,调用不同的快递公司进行发货。
2、数据模型
ER数据模型如下图所示:
2.1、logistics_service
描述:物流服务模板
字段名称
|
字段类型
|
是否可为空
|
描述
|
id
|
bigint
|
否
|
主键
|
service_name
|
varchar(32)
|
否
|
服务模板名称
|
service_code
|
varchar(32)
|
否
|
服务模板code
|
type
|
int
|
否
|
模板类型
|
status
|
int
|
否
|
模板状态
|
is_delete
|
int
|
否
|
是否删除标记
|
feature
|
varchar(1024)
|
是
|
扩展字段
|
version
|
int
|
是
|
版本号,默认0
|
gmt_created
|
Datetime
|
否
|
创建时间
|
gmt_modified
|
Datetime
|
否
|
修改时间
|
索引字段:id、service_code
2.2、logistics_company
字段名称
|
字段类型
|
是否可为空
|
描述
|
id
|
bigint
|
否
|
主键
|
company_name
|
varchar(32)
|
否
|
快递公司名称
|
company_code
|
varchar(32)
|
否
|
快递公司编码
|
telephone
|
varchar(32)
|
是
|
公司手机号
|
phone
|
varchar(32)
|
是
|
公司座机号
|
country
|
varchar(32)
|
是
|
国家
|
address
|
varchar(1024)
|
是
|
公司地址
|
company_url
|
varchar(1024)
|
是
|
公司网站地址
|
company_logo
|
varchar(1024)
|
是
|
公司logo图片地址
|
status
|
int
|
否
|
状态
|
is_delete
|
int
|
否
|
是否删除
|
feature
|
varchar(1024)
|
是
|
扩展字段
|
version
|
int
|
是
|
版本号,默认为0
|
gmt_created
|
Datetime
|
否
|
创建时间
|
gmt_modified
|
Datetime
|
否
|
修改时间
|
索引字段:id、company_code
2.3、logistics_service_company
描述:物流服务模板与物流公司的关联表
字段名称
|
字段类型
|
是否可以为空
|
描述
|
id
|
bigint
|
否
|
主键
|
service_id
|
bigint
|
否
|
服务模板ID
|
company_id
|
bigint
|
否
|
物流公司ID
|
gmt_created
|
Datetime
|
否
|
创建时间
|
gmt_modified
|
Datetime
|
否
|
修改时间
|
索引:id、service_id、company_id
2.4、freight_template
描述:运费模板
字段名称
|
字段类型
|
是否可为空
|
描述
|
id
|
bigint
|
否
|
主键
|
template_name
|
varchar(32)
|
否
|
运费模板名称
|
company_id
|
bigint
|
否
|
公司ID
|
company_code
|
varchar(32)
|
否
|
公司code
|
template_type
|
int
|
否
|
模板类型
|
is_default
|
int
|
否
|
是否默认
|
is_delete
|
int
|
否
|
是否删除
|
status
|
int
|
否
|
状态
|
feature
|
varchar(1024)
|
是
|
扩展字段
|
version
|
int
|
是
|
版本号,默认0
|
gmt_created
|
Datetime
|
否
|
创建时间
|
gmt_modified
|
Datetime
|
否
|
修改时间
|
索引:id、company_id、company_code
2.5、freight_template_detail
描述:运费模板明细
字段名称
|
字段类型
|
是否可为空
|
描述
|
id
|
bigint
|
否
|
主键
|
template_id
|
bigint
|
否
|
运费模板ID
|
sendAreaCode
|
varchar(32)
|
否
|
发货地四级地址code
|
sendAreaName
|
varchar(64)
|
是
|
发货地四级地址名称
|
sendAreaLevel
|
int
|
否
|
发货地四级地址level
|
receiveAreaCode
|
varchar(32)
|
否
|
收货地四级地址code
|
receiveAreaName
|
varchar(64)
|
是
|
收货地四级地址名称
|
receiveAreaLevel
|
int
|
否
|
收货地四级地址level
|
min_weight
|
Decimal
|
是
|
重量下限
|
max_weight
|
Decimal
|
是
|
重量上限
|
min_volumn
|
Decimal
|
是
|
体积下限
|
max_volumn
|
Decimal
|
是
|
体积上限
|
min_count
|
int
|
是
|
数量下限
|
max_count
|
int
|
是
|
数量上限
|
price
|
Decimal
|
否
|
价格
|
is_default
|
int
|
否
|
是否默认
|
is_delete
|
int
|
否
|
是否删除
|
status
|
int
|
否
|
状态
|
calculate_type
|
int
|
否
|
计算类型:1 重量 2体积 3 数量
|
priority
|
int
|
否
|
优先级,默认0
|
feature
|
varchar(1024)
|
是
|
扩展字段
|
version
|
int
|
是
|
版本号,默认0
|
gmt_created
|
Datetime
|
否
|
创建时间
|
gmt_modified
|
Datetime
|
否
|
修改时间
|
索引:id、template_id、sendAreaCode、receiveAreaCode
三、物流详情
1、流程设计
物流订单发货的时候,会发送异步消息,物流详情接收到消息后创建一个物流详情单,然后去订阅第三方快递公司,然后快递公司会异步回传物流详情给我们。对于一些无法订阅物流详情的快递公司,我们通过定时任务定时批量查物流详情,同步到我们的数据库中。
2、数据模型
2.1、logistics_detail
描述:物流详情单
字段名称
|
字段类型
|
是否必填
|
描述
|
id
|
bigint
|
必填
|
主键
|
lg_detail_code
|
varchar(128)
|
必填
|
物流详情单号
|
outer_id
|
varchar(128)
|
必填
|
外部单号
|
outer_order_type
|
int
|
必填
|
外部单类型:1物流订单
|
receiver_id
|
bigint
|
非必填
|
收货人ID
|
receiver_name
|
varchar(64)
|
非必填
|
收货人姓名
|
receiver_telephone
|
varchar(32)
|
非必填
|
收货人电话
|
receiver_province
|
varchar(32)
|
非必填
|
收货人省份
|
receiver_city
|
varchar(64)
|
非必填
|
收货人城市
|
receiver_area
|
varchar(64)
|
非必填
|
收货人地区
|
receiver_street
|
varchar(64)
|
非必填
|
收货人街道
|
receiver_address
|
varchar(1024)
|
非必填
|
收货人详细地址
|
receiver_address_code
|
varchar(32)
|
非必填
|
四级地址编码
|
sender_id
|
bigint
|
非必填
|
发货人ID
|
sender_name
|
varchar(64)
|
非必填
|
发货人姓名
|
sender_telephone
|
varchar(32)
|
非必填
|
发货人电话
|
sender_province
|
varchar(32)
|
非必填
|
发货人省份
|
sender_city
|
varchar(64)
|
非必填
|
发货人城市
|
sender_area
|
varchar(64)
|
非必填
|
发货人地区
|
sender_street
|
varchar(64)
|
非必填
|
发货人街道
|
sender_address
|
varchar(1024)
|
非必填
|
发货人详细地址
|
sender_address_code
|
varchar(32)
|
非必填
|
四级地址编码
|
mail_no
|
varchar(128)
|
必填
|
运单号
|
company_code
|
varchar(32)
|
非必填
|
快递公司code
|
company_name
|
varchar(32)
|
非必填
|
快递公司名称
|
service_code
|
varchar(32)
|
非必填
|
服务模板code
|
status
|
int
|
必填
|
状态
|
is_delete
|
int
|
必填
|
是否删除
|
feature
|
varchar(1024)
|
非必填
|
扩展字段
|
version
|
int
|
非必填
|
版本号,默认0
|
gmt_created
|
Datetime
|
必填
|
创建时间
|
gmt_modified
|
Datetime
|
必填
|
修改时间
|
索引:id、lg_detail_code、unique(outer_id,outer_order_type)
2.2、logistics_detail_node
字段名称
|
字段类型
|
是否必填
|
描述
|
id
|
bigint
|
必填
|
主键
|
lg_detail_code
|
varchar(128)
|
必填
|
物流详情单code
|
mail_no
|
varchar(128)
|
必填
|
运单号
|
node_time
|
Datetime
|
非必填
|
物流详情节点时间
|
node_detail
|
varchar(2048)
|
非必填
|
物流详情节点内容
|
sort_value
|
int
|
非必填
|
排序
|
feature
|
varchar(1024)
|
非必填
|
扩展字段
|
version
|
int
|
非必填
|
版本号,默认0
|
gmt_created
|
Datetime
|
必填
|
创建时间
|
gmt_modified
|
Datetime
|
必填
|
修改时间
|
索引:id、lg_detail_code
四、总结
物流服务和物流详情是对第三方快递公司的一层抽象和封装,相对来说比较简单,下一篇文章我们将进入重点内容:产品服务层的设计。
联系邮箱:[email protected]
(未经同意,请勿转载)