如何在 Odoo 18 中配置定时动作
在企业工作流程中,常常会遇到不需要人工干预但需要定期执行的任务,这时自动化或定时操作就能派上用场。定时操作也被称为 cron 作业,它是一个强大的工具,可实现日常定时任务的自动化。
作为 Odoo 18 中的强大功能,它通过后台作业机制实现自动化任务调度。下面我们将详细讲解如何在 Odoo 18 中配置 Cron 定时任务。
通过界面配置计划动作
到目前为止创建的所有定时操作,都可以在 “设置” > “技术” > “自动化” 菜单中查看。
通过该菜单,我们可以看到所有定时操作的详细信息,如动作名称、模型、优先级、是否有效等。
点击左上角名为 “新建” 的按钮,我们会在用户界面中看到一个表单视图,在其中可以添加运行计划的操作所需的详细信息,如名称、技术设置、动作详情以及如下标记的代码。
通过代码配置计划任务(开发者模式)
通过代码来配置定时操作。这需要在为此目的创建的模块的数据目录内,创建一个标准名称为 ir_cron_data.xml 的 XML 文件,添加如下示例代码:
<?xml version="1.0" encoding="UTF-8"?><odoo> <data noupdate="1"> <record id="daily_task_arrange" model="ir.cron"> <!-- 基础配置 --> <field name="name">每日任务调度</field> <field name="model_id" ref="model_res_partner"/> <!-- 执行设置 --> <field name="state">code</field> <field name="code">model.send_mail()</field> <field name="user_id" ref="base.user_root"/> <!-- 调度参数 --> <field name="interval_number">1</field> <field name="interval_type">days</field> <field name="nextcall" eval="(DateTime.now() + timedelta(days=1)).strftime('%Y-%m-%d 12:00:00')"/> <!-- 优先级 --> <field name="priority">1</field> </record> </data> </odoo>
代码分析:
当模块安装时,在 <odoo> 标签对中,‘noupdate’初始化为 1,作用为防止模块升级时覆盖现有配置。
<data noupdate="1">
这样,此标签内的代码在每次升级时都不会被更新。
然后在‘ir_cron’表中创建一个具有合适唯一标识 ID 的记录:
<record id="daily_task_arrange" model="ir.cron">
然后为正在创建的记录定义各种属性了。有很多属性,如‘name’、‘state’、‘model_id’、‘code’等。下面我们来逐个讨论。
<field name="name">每日任务调度</field>
这用于为 ir_cron 记录设置一个名称。在 <field> 和 </field> 标签对之间,我们将名称设为 “每日任务调度”。
<field name="model_id" ref="model_res_partner"/>
model_id 的作用,关联模型的技术名称(使用 ref 属性指向模型)。此属性指定计划的操作将在哪个 Odoo 模型上调用。
<field name="state">code</field> <field name="code">model.send_mail()</field>
这两个属性可以一起定义。‘state’属性表示服务器操作的类型。这里我们将其设置为‘code’,这表示要执行一段 Python 代码。此外,‘code’属性指定编写 Python 代码的方法名称。我们必须编写操作将执行的 Python 代码。这里在模型对象上使用了 send_mail () 方法。
<field name="user_id" ref="base.user_root"/>
‘user_id’是与 cron 作业关联的用户 ID。通常,该用户将是基础模块的根用户。
<field name='interval_number'>1</field>
Interval_number 属性指定定时操作应激活的时间间隔。这里我们给出的值为 1,这意味着它应每隔 1 个指定间隔类型的单位运行一次。
<field name='interval_type'>days</field>
间隔类型可以是分钟、小时、天、周、月。在这里间隔是天,意味着每隔一天运行一次。
<field name="nextcall" eval="(DateTime.now() + timedelta(days=1)).strftime('%Y-%m-%d 12:00:00')"/>
‘nextcall’确定计划执行定时 cron 作业的时间。这里设置为每天 12:00:00。
<field name="priority">1</field>
这用于指定作业的优先级,为一个整数。数字 0 表示最低优先级,10 表示最高优先级。
设置完所有这些属性后,我们需要编写业务方法,在 res.partner 模型中定义 send_mail 方法。在此代码中,Python 代码仅发送一封测试邮件。
def send_mail(self): """ 邮件发送示例 """ mail_template = self.env.ref('mail.mail_template_test').with_context( lang=self.env.user.lang ) mail_template.send_mail(self.id, force_send=True)
升级模块后,可以在前面提到的常规设置菜单中看到定时操作。
典型应用场景
- 定期邮件通知(日报/周报)。
- 自动化数据清理(如清理过期日志)。
- 业务状态自动更新(订单超时处理)。
- 系统健康检查(数据库备份验证)。
简而言之,在需要自动定期运行任务的情况下,Odoo 18 中的定时操作非常有用。这些操作可用于生成报告、发送邮件等,无需人工干预即可执行,从而使 ERP 工作流程更加顺畅并确保一致性。