公司间交易一旦带库存,真正复杂的不是自动建单,而是“货到底发到哪、另一家公司怎么确认收到、lot/serial 怎么保持一致”。
核心链路
models/sale_order.py的_prepare_purchase_order_data()在生成另一家公司 PO 时,不是随便找个收货类型,而是优先用intercompany_warehouse_id与intercompany_receipt_type_id。没配对仓库会直接抛错。- 同文件中销售行
_get_location_final()还判断 partner 是否代表另一家公司、partner 与 shipping 是否不同;满足条件时会把最终地点改成 inter-company transit,而不是直接送到客户地址。 models/purchase_order.py反向生成 SO 时,会把 warehouse、partner_shipping、产品自定义属性一起带过去;_get_destination_location()在 dropship/直送场景下还会回落到对方公司的 transit customer location。- 最关键的补强在
models/stock_picking.py。当本公司 delivery pickingbutton_validate()后,若另一家公司开启intercompany_sync_delivery_receipt,系统会去找对应 PO 的 incoming/dropship receipt,并通过_find_corresponding_move()找相同产品的未 picked move。 - 随后
_prepare_move_lines()会把 delivery 侧 move_line 的lot_name、lot_id、quantity、picked=True镜像到另一家公司的 receipt move_line。这样跨公司不只是单据联动,连实物批次和收货动作都被同步了。
关键源码位置
/home/ubuntu/odoo-temp/enterprise/sale_purchase_stock_inter_company_rules/models/sale_order.py/home/ubuntu/odoo-temp/enterprise/sale_purchase_stock_inter_company_rules/models/purchase_order.py/home/ubuntu/odoo-temp/enterprise/sale_purchase_stock_inter_company_rules/models/stock_picking.py
容易误解的地方
- 误区一:自动生成 PO/SO 就算公司间流程打通。库存地点和收货镜像才是真正容易错的部分。
- 误区二:直送永远直接到客户。跨公司场景下,源码可能改走 inter-company transit。
- 误区三:对方公司自己再手工录 lot 就行。企业版已经提供 move_line 镜像,重复录入反而会出错。
实战注意事项
- 做 intercompany 项目时,先配好
intercompany_warehouse_id与 receipt type,再谈自动建单。 - 若收货未自动同步,先确认 delivery picking 是否 done,以及目标公司是否开启
intercompany_sync_delivery_receipt。 - 序列号产品跨公司流转时,最好把“哪一侧是 lot 真源头”定清楚,避免双边都能改。
结语
企业版这些代码共同说明一件事:真正可上线的业务流程,靠的不是“页面上看起来能点通”,而是权限、状态、时机、对账口径和跨模块回写都被收紧。理解这些边界,实施和二开时就不容易走进“功能演示能跑、真实业务一用就散”的坑。
DISCUSSION
评论区