先说结论
不是所有采购行的“收货数量”都应该由库存自动驱动。
对服务、耗材这类采购,Odoo 允许你手工维护 qty_received,因为它们未必真的走仓库收货流程。
这时真正控制边界的,是:
qty_received_methodqty_received_manualqty_received的 inverse 逻辑
为什么服务类采购需要手工收货
服务没有实际入库动作,但业务上仍然需要知道:
- 这项服务是不是已经交付
- 交付了多少
- 后续能不能开票
如果强行把服务采购绑死到库存收货,就会失去业务灵活性。
所以 Odoo 允许某些行走“手工收货”模式。
qty_received_method 怎么控制模式
源码里很清楚:
- 如果产品类型是
consu或service qty_received_method会被设成manual- 否则就走自动逻辑
这意味着“收货数量”并不是统一规则,而是按产品类型分流。
qty_received_manual 和 _inverse_qty_received
当 qty_received_method == 'manual' 时:
qty_received的值会落到qty_received_manual- 反过来改
qty_received时,也会通过 inverse 写回手工字段
如果不是手工模式,系统会把手工值清零,避免和自动计算冲突。
这就是“看起来能改,实际有边界”的核心原因。
为什么这个设计很重要
它把两类业务分开了:
- 有真实库存动作的商品,应该让系统自动算收货
- 没有真实库存动作的服务,应该允许业务人员手工确认交付
这样既保留了会计/采购状态的完整性,又不会把服务单据硬塞进库存逻辑。
调试时怎么判断是否用对了模式
如果 qty_received 看起来不对,先查这几个点:
- 产品类型是不是 service 或 consu
- 当前行的
qty_received_method是不是 manual qty_received_manual有没有被写入- inverse 是否把值反推到了正确字段
- 业务是不是其实在处理服务而不是库存商品
很多看似“数量不对”的问题,其实是模式选错了。
实战建议
- 服务类采购不要强行套库存收货思路
- 先看
qty_received_method,再看qty_received - 手工模式不是例外,是有意设计的分支
- 如果业务同时有服务和实物,记得分别理解两条路径
- 调试时优先确认“这是自动算,还是手工填”
一句好记的话
对服务采购来说,
qty_received不是库存事实,而是业务确认;qty_received_method决定它是自动算还是手工填。
把这条边界分清,采购和开票状态就会顺很多。
DISCUSSION
评论区