先说结论
Odoo 项目里的任务状态,早就不是一个简单 state 字段在撑着了。
官方现在的核心思路是:
团队协作状态看
stage_id,个人处理状态看 personal stage,任务推进还会受依赖关系影响。
所以你在界面上看到的是看板列,底层表达的却是几层不同语义。
为什么官方不再强调单一 state
项目模块文档里就明确写过:project.task 不再靠旧式 state 驱动,而是以 stage_id 为主。
这背后的设计思想很实用:
- 团队任务往往不是简单几种固定状态
- 不同项目的阶段列可能不同
- 看板列天然更适合协作流程
所以 stage_id 本质上是“团队流程阶段”,不是传统枚举状态。
stage_id 真正在表达什么
在源码里:
project.task.stage通过group_expand支持完整看板列展示stage_id决定任务当前落在哪个团队流程阶段fold等属性又决定列展示行为
这说明 stage 不是装饰字段,而是项目流程骨架。
为什么还会有 Personal Stage
很多团队协作里,会出现一个常见矛盾:
- 团队层面任务还在“进行中”
- 但某个具体成员其实已经“我做完了”或“我先阻塞了”
所以 Odoo 额外设计了:
project.task.stage.personalpersonal_stage_idpersonal_stage_type_id
这说明系统在承认:
团队共享流程,和个人处理感知,不一定是一回事。
这个设计比很多看起来简单的项目系统更细。
依赖关系为什么会影响你对状态的理解
project.task 里还有:
depend_on_idsdependent_ids
这表示任务推进不只取决于它被拖进哪一列,还取决于它是否被前置任务卡住。
所以有些任务“看起来在进行中”,但业务上其实还没真正可执行。
为什么 Odoo 的项目任务不只是看板拖拽
因为除了 stage 之外,它还同时管理:
- 负责人
- 子任务
- 依赖
- recurrence
- 附件/封面
- 活动/协作消息
也就是说,看板只是入口,不是全部。
新手最容易误解的 4 件事
1. 以为 stage 就是 old-school state
它更偏团队流程列,而不是死枚举。
2. 以为个人状态和团队状态必须一致
Odoo 专门拆出了 personal stage,说明两者本来就可能不同。
3. 以为拖进下一列就代表任务一定可做
依赖关系可能还没满足。
4. 以为项目模块只是轻量看板
其实它已经在往协作执行系统走。
一句话记忆法
Stage 负责团队流程,Personal Stage 负责个人视角,依赖关系决定任务是不是真的能往前走。
DISCUSSION
评论区