Lazada 履约流程里,“面单打印出来了”只是中段,不是终点。sale_lazada 把整个过程拆成 _pack_lazada_package()、_fetch_lazada_shipping_label()、_set_lazada_rts() 三段,说明平台发货不是一个按钮,而是多段状态回跳。
主要参考源码:
enterprise/sale_lazada/models/stock_picking.py
一、先 pack,说明平台先承认包裹,再承认发货
_pack_lazada_package() 只处理带 Lazada order item、状态还是 draft 且还没有 package_extern_id 的 picking。换句话说,系统先向 Lazada 申请/确认外部包裹身份,再进入后续动作。
二、拿到 label 不代表已经 RTS
_fetch_lazada_shipping_label() 负责下载 AWB,并对 eligible picking 继续更新状态;真正的 Ready to Ship 要到 _set_lazada_rts() 批量提交后才算。标签文件、外部包裹号和平台可发货状态是三件不同的事。
三、为什么要按 shop 分组和批量处理
源码先 _get_lazada_pickings_by_shop(),再按 shop 做 pack、label、RTS。这是在尊重平台边界:店铺上下文、接口限流和 provider 信息都不能混批。
四、落地时最容易误判什么
- 以为有 label 就等于平台已允许发货;
- 以为 picking done 之后平台状态一定自动追平;
- 以为 package_extern_id 只是一个可有可无的外部字段。
实际上,package_extern_id 是后续 label 与 RTS 的锚点,没有它,平台根本不认这次发货链路。
五、结论
Lazada 发货不是“打印面单就算出库”,而是pack package -> 获取 label -> 设置 RTS 的分段回跳链。每一段都在校验前一段是否成功,少走一步就会出现 Odoo 已出库、平台却未 ready 的断层。
DISCUSSION
评论区