主题
模型绑定与开始条件
模型绑定 是将审批流程动态植入业务表单的核心机制——选定目标模型后,系统自动在业务表单上注入审批按钮和流程图入口。一个模型可绑定多个审批流程,通过 开始条件 精准控制每个流程适用于哪些业务单据——业务单据上的任意字段(如状态、公司、供应商、币种、买家等)均可作为判断条件写入表达式,实现按业务维度自动匹配对应的审批流程。
模型绑定
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 进入模板表单页面 | BPMN工作流 → BPMN工作流 → 模板 |
| 2 | 配置 绑定模型 字段 | 在表单页面的 模型配置 选项卡中 |
| 3 | 保存 | 将审批按钮注入目标业务表单 |
| 4 | 刷新浏览器 | 更新浏览器视图缓存 |
开始条件
1. 什么是开始条件
开始条件 是一个 python 条件表达式,用来判断当前业务单据是否满足发起该审批流程的条件,默认值为 True(所有记录都可发起)。
2. 条件表达式规则
| 规则 | 说明 |
|---|---|
| 返回布尔值 | 表达式必须能求值为 True 或 False |
self 关键字 | self 代表当前业务单据记录,即发起审批的那条数据 |
| 支持 Odoo 字段访问 | self.字段名 可访问单据的任意字段,包括关系字段的点号穿透 |
| 语法兼容 Python | 支持 ==、!=、>、<、>=、<=、and、or、not、in 等 |
3. 常见场景配置
场景 1:仅草稿状态可发起审批
python
self.state == 'draft'这是最常见的配置。销售订单、采购订单等单据通常有 draft(草稿)→ confirmed(已确认)→ done(已完成)的状态流转。限制草稿状态可发起,确保单据确认后不会被重复提交审批。
场景 2:多公司模式下指定公司可用
python
self.company_id.id == 1将审批流程限定给特定公司。company_id 是多数业务单据都有的字段(Odoo 多公司机制),1 是目标公司的数据库 ID。
更灵活的写法——允许多个公司:
python
self.company_id.id in [1, 2, 3]场景 3:限定供应商/客户范围
python
self.partner_id.id == 15仅当单据的往来单位是指定供应商时才可发起该流程。partner_id 是供应商/客户字段。
场景 4:限定币种
python
self.currency_id.name == 'USD'仅外币订单走此审批流程。
场景 5:限定买家/销售员
python
self.user_id.id == 8仅指定的销售员/采购员创建的单据可发起该流程。
场景 6:组合条件
python
(self.state == 'draft' or self.state == 'sent') and self.amount_total > 5000 and self.company_id.id == 1多个条件用 and / or 组合,先判断状态、再判断金额、最后判断公司。
场景 7:限定订单包含特定产品
仅当采购/销售订单的明细行中包含某个指定产品时才可发起审批流程。
- 按产品 ID(推荐,最精确):
python
15 in self.order_line.mapped('product_id').ids15 替换为目标产品的数据库 ID。self.order_line 取到订单的所有明细行,.mapped('product_id') 提取每行的产品,.ids 得到所有产品 ID 的列表,in 判断目标 ID 是否在其中。
- 按产品内部编码(跨环境迁移时更稳定):
python
'PROD-001' in self.order_line.mapped('product_id.default_code')适合产品 SKU 编码固定不变的场景,比 ID 更具可读性。
- 按产品名称:
python
'笔记本电脑' in self.order_line.mapped('product_id.name')适合产品名称唯一的场景,但名称可能被修改,不如编码或 ID 可靠。
- 按产品类别(匹配类别下的所有产品):
python
self.order_line.filtered(lambda l: l.product_id.categ_id.id == 5)判断是否有明细行属于指定产品类别。注意返回的是记录集,非空即为 True。
注意:不同模型的明细行字段名称不同
4. 注意事项
| 注意点 | 说明 |
|---|---|
| 字段必须存在 | 表达式中使用的字段必须是目标模型上真实存在的字段,否则表达式求值会报错 |
| 空值处理 | 如果字段可能为空(如 self.partner_id 为 False),直接 .id 会报错。建议先判空:self.partner_id and self.partner_id.id == 10 |
常见问题
| 问题 | 答案 |
|---|---|
绑定模型后表单没有出现 提交 按钮? | 检查:启用 是否勾选;开始条件对当前单据是否返回 True;是否刷新浏览器 |
| 一个模型能绑几个模板? | 无数量限制,系统通过开始条件自动筛选适用模板,条件满足的都展示,在用户发起 提交 操作的时候按情况选择 |
学习交流
