项目协作

Odoo 周期任务为什么不只是“自动复制一张卡片”:Project Task Recurrence 到底怎么长下一次

很多人以为 Odoo 周期任务只是到点复制任务,但源码里 recurrence 真正绑定的是关闭时机、递归链和子任务延续。本文把它讲清楚。

Odoo 开发 项目
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 6 阅读

先说结论

Odoo 的周期任务,不是“定时器到了就平地复制一张任务卡”。

从官方源码看,它更接近:

当一条属于 recurrence 的任务被真正关闭后,系统再基于 recurrence 规则生成下一次任务。

所以它的核心不是“按时复制”,而是按规则延续任务链


为什么它不是简单复制

project.task 里,周期任务是通过:

  • recurrence_id
  • project.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

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。