出库时的 stock.move.line 是如何确定的
用通俗但不失源码细节的方式,讲清楚 Odoo 出库时 stock.move.line 的生成逻辑:从 stock.move、stock.quant、移除策略到 lot/serial 拆行。
CATEGORY FOCUS
聚合 Odoo 开发基础、源码理解、ORM、模型、视图、安全与扩展实践。
TOPIC PICKS
用通俗但不失源码细节的方式,讲清楚 Odoo 出库时 stock.move.line 的生成逻辑:从 stock.move、stock.quant、移除策略到 lot/serial 拆行。
很多开发者会把 onchange、compute、constraints 都当成‘字段变了就会触发的东西’,结果一到线上就困惑:为什么界面上是对的,保存后又变了?为什么 onchange 跑了,但约束还没报?本文把表单编辑到真正写库这条管线按源码拆开。
注册付款并不是简单打个“已付”标记。account_payment_register 会先分批生成 payment,再按应收应付科目做 reconcile,最后 account.move 根据残额、核销对手和 payment 匹配状态重算 payment_state。
现在的 Odoo 里,company_dependent 字段已经不是很多人印象中的 ir.property 老路子了。它更像“字段本体存 JSONB,多公司值按公司 id 取,缺值时再走 ir.default 回退”。
很多人以为 Odoo 活动问卷只是给报名表多加几个字段。实际上,event.question、event.question.answer、event.registration.answer 和事件上的 general / specific questions 共同组成了一套独立的数据模型。看懂它,才能理解为什么有些问题按订单问一次,有些问题却要对每个参会人分别作答。
很多人以为 Odoo Activity 的“下一步”只是界面上的推荐按钮。实际上,mail.activity.type 里 suggest 和 trigger 是两套完全不同的机制:一套负责给人选项,一套负责在完成时自动长出下一条。看懂这条链,才能把提醒真正配置成流程。
很多人以为 Odoo 的多公司切换只是“点一下菜单,然后整页刷新”。但从 `switch_company_menu.js` 和 `user.js` 看,官方真正维护的是一套前端用户上下文:cookie 记录当前公司集合,`allowed_company_ids` 驱动 RPC 上下文,`userBus` 负责广播变化,路由层再决定是局部栈回退还是整页刷新。本文把这套链路讲透。