先说结论
Odoo 的周期任务,不是“定时器到了就平地复制一张任务卡”。
从官方源码看,它更接近:
当一条属于 recurrence 的任务被真正关闭后,系统再基于 recurrence 规则生成下一次任务。
所以它的核心不是“按时复制”,而是按规则延续任务链。
为什么它不是简单复制
在 project.task 里,周期任务是通过:
recurrence_idproject.task.recurrence
这一套对象来承载的。
这说明 Odoo 并不是把周期任务当成“任务上的几个重复字段”,而是给它单独建了 recurrence 语义对象。
也就是说,系统关心的是一条持续任务链,而不是孤立的一次复制行为。
下一次任务是什么时候长出来的
这是很多人最容易误解的点。
从源码里可以看到,当任务进入关闭状态后,系统会找到每个 recurrence 当前链上的最后一条任务,再调用:
_get_last_task_id_per_recurrence_id()_create_next_occurrences()
这说明下一次任务并不是随时都能被系统乱造出来,而是通常在:
上一条真正完结后,才顺着 recurrence 继续长下一条。
这很合理,因为很多周期任务不是“无脑预生成一堆”,而是要一个接一个滚动。
为什么 recurrence 不只是重复周期字段
project.task.recurrence 里会管理:
- 重复间隔
- day/week/month/year 单位
- until / forever 等终止边界
所以 recurrence 本质上是在定义:
- 多久重复一次
- 重复到什么时候
- 当前这条链是否还应该继续
它不是单个任务的备注,而是整个任务家族的规则。
子任务为什么也重要
源码里 _create_next_occurrences_values() 还会递归处理 child tasks。
这说明 Odoo 没把周期任务理解成“只有一张父卡循环”,而是考虑到:
有些周期工作其实是一整套固定拆解结构,也应该跟着往下一轮延续。
这让周期任务比很多轻量项目工具更接近真实团队流程。
新手最容易误解的 4 件事
1. 以为系统会提前无限复制很多张任务
更常见的是滚动生成,而不是一次铺满未来。
2. 以为 recurrence 只是 UI 上几个重复选项
其实它有独立模型和链路。
3. 以为任务只要带 recurrence 就会自动继续
前一条通常要先进入关闭语义。
4. 以为子任务结构不会继承
源码里其实考虑了 child task 延续。
一句话记忆法
周期任务不是“定时复制”,而是“上一轮收口后,按 recurrence 规则顺着生成下一轮”。
DISCUSSION
评论区