Skip to content

审批流程 ​

指用户在业务单据表单上通过审批按钮完成审批的整个过程,主要操作有:提交发起审批、同意推进流程、加签临时插入审批人、驳回到指定节点重新审批、查看流程图追踪进度,以及审批过程中自动执行节点代码。

提交 ​

1. 操作步骤 ​

步骤操作说明
1点击 提交 按钮按钮位于业务单据表单顶部
2选择审批模板下拉框只列出当前单据满足开始条件的已启用模板
3填写审批备注可选,建议填写
4点击 确认 按钮系统创建审批实例并启动流程

2. 状态变化 ​

对象状态变化
业务单据不变(状态由审批代码控制)
审批实例运行中
第一个审批节点READY(就绪待审批)
其余节点WAITING(等待中)
提交人提交 按钮消失,显示 流程图 按钮
审批人收到审批通知,表单页面显示同意、驳回、加签、流程图四个按钮
抄送人收到审批通知

同意 ​

1. 操作步骤 ​

步骤操作说明
1点击 同意 按钮仅审批节点 就绪(READY) + 当前用户是审批人时显示
2填写审批备注可选,建议填写
3点击 确认 按钮执行审批通过代码,推进流程到下一审批节点

2. 状态变化 ​

对象状态变化
业务单据状态由审批代码决定
审批实例运行中或已完成(如果下一节点是结束节点)
第一个审批节点COMPLETED(已完成)
下一个审批节点READY或COMPLETED(如果下一节点是结束节点)
其余节点WAITING(等待中)
审批人收到审批通知,表单页面显示同意、驳回、加签、流程图四个按钮
抄送人收到审批通知
提交人如果审批实例已完成,提交人收到审批通知

加签 ​

1. 什么是加签 ​

加签是指在当前审批节点前或后临时插入一个新的审批人。典型场景:审批人认为需要征求某人意见,先加签给那人审批,再回到自己。

2. 前加签与后加签的区别 ​

前加签后加签
插入位置在当前 READY 节点前面在当前 READY 节点后面
效果加签节点先审批,通过后回到原审批节点原审批节点审批通过,加签节点成为新的 READY 节点
适用场景领导表态之前先让法务看一下我批完了,但还需财务确认

3. 操作步骤 ​

步骤操作说明
1点击 加签 按钮仅审批节点 就绪(READY) + 当前用户是审批人时显示
2选择加签类型前加签(在当前节点前插入)/ 后加签(在当前节点后插入)
3输入新节点名称如"法务审核"
4选择加签审批人多选用户列表
5填写审批备注可选,建议填写
6点击 确认 按钮审批实例插入新节点

驳回 ​

1. 操作步骤 ​

步骤操作说明
1点击 驳回 按钮仅审批节点 就绪(READY) + 当前用户是审批人时显示
2选择驳回目标节点下拉框列出所有已完成的 用户任务节点和开始节点
3填写驳回备注可选,建议写明驳回原因
4点击 确认 按钮执行驳回逻辑:执行被驳回节点和驳回目标节点之间的所有用户节点配置的驳回代码,并将这些节点和被驳回节点都改为 WAITING 状态;驳回目标节点改为 READY 状态

2. 驳回场景 ​

场景处理
驳回到 开始节点删除整个审批实例,相当于撤回审批,单据恢复未发起状态
驳回到之前的 用户任务流程退回到该节点,该节点重新变为 READY
驳回路径包含多个节点依次执行每个节点的 驳回代码

3. 状态变化 ​

对象状态
业务单据由被驳回节点的 驳回代码 决定(如退回草稿)
审批实例running
驳回目标节点READY
被驳回节点节点状态变为 WAITING
驳回目标审批人重新收到审批通知
提交人收到"审批被驳回"通知

流程图 ​

1. 操作入口 ​

入口位置说明
业务表单点击 流程图 按钮审批实例存在时可见
实例列表点击 查看流程图 按钮实例 列表视图
实例表单点击 查看流程图 按钮实例 表单详情

2. 流程图颜色标注含义 ​

颜色含义
🟢 绿色已完成节点
🔵 青色待审批节点
⚪ 默认等待中节点
🟢 绿色箭头已走过的流转路径

节点代码执行 ​

1. 触发时机 ​

操作触发代码备注说明
同意批准执行方法 → 批准执行代码
驳回驳回执行方法 → 驳回执行代码倒序逐一执行被驳回节点的 驳回 代码
脚本任务脚本代码引擎自动执行(无人工交互)

2. 批准/驳回执行方法 ​

批准/驳回执行方法是单行 Python 表达式,如下所示:

python
# 同意时确认订单
self.button_confirm()

# 驳回时退回草稿
self.button_draft()

# 同意时写入审批日期
self.write({'x_approved_date': fields.Date.today()})

3. 批准/驳回执行代码 ​

批准/驳回执行代码支持多行、条件判断、ORM 操作等复杂逻辑,预置变量见下表:

变量类型说明使用示例
envEnvironmentOdoo 执行环境,可访问所有 ORMenv['sale.order'].search([])
crCursor数据库游标不常用(优先用 env)
uidint当前用户 IDuid
userRecord当前用户记录user.name
companyRecord当前公司记录company.name
modelModel流程绑定的模型类model.search([])
recordRecord当前正在审批的单据记录record.write({'state': 'done'})
timemodulePython time 模块time.time()
datetimemodulePython datetime 模块datetime.date.today()
dateutilmodulePython dateutil 模块dateutil.parser.parse(...)
timezonefunctionpytz timezone 函数timezone('Asia/Shanghai')
float_comparefunction浮点数精确比较float_compare(a, b, 2)
logfunction日志记录到 ir_logging 表log('审批通过', level='info')
_loggerLoggerPython Logger(服务器日志)_logger.info('审批完成')
UserErrorException用户警告异常raise UserError('金额超限')
CommandnamespaceOdoo x2many 操作命令Command.create({...})

4. 审批通过时的代码编写范例 ​

范例 1:简单确认订单

python
# 批准/驳回执行方法(单行)
self.button_confirm()

范例 2:带日志和字段更新的审批代码

python
# 批准/驳回执行代码(多行)
log(f"订单 {record.name} 审批通过,金额:{record.amount_total}")

# 更新自定义字段
record.write({
    'x_approved_date': datetime.date.today(),
    'x_approved_by': user.id,
})

# 如果金额超过 50000,额外通知财务
if record.amount_total > 50000:
    finance_group = env.ref('account.group_account_manager')
    env['mail.activity'].create({
        'res_id': record.id,
        'res_model_id': model._abstract is False and model._name or record._name,
        'activity_type_id': env.ref('mail.mail_activity_data_todo').id,
        'summary': '大额订单已审批,请复核',
        'user_ids': [(6, 0, finance_group.users.ids)],
    })

5. 审批拒绝时的代码编写范例 ​

python
# Reject Code
log(f"订单 {record.name} 被驳回,原因:驳回")

# 将订单退回草稿状态
if record.state == 'confirmed':
    record.write({'state': 'draft'})

# 给提交人发内部消息
record.message_post(
    body=f"审批被驳回,请修改后重新提交",
    subtype_xmlid='mail.mt_comment',
)

6. 调试技巧 ​

技巧说明
log()写入 ir_logging 表,可在 设置 → 技术 → 数据库结构 → 记录 中查看
_logger.info()写入 Odoo 服务器日志文件
raise UserError()抛出用户可见的警告消息,终止审批操作
record.message_post()在单据的 Chatter 中留下记录,直观可见

学习交流 ​

操作预览