很多人第一次看 Odoo Planning,会把它理解成“把上周班表复制到这周”。但企业版真正复杂的地方,在 enterprise/planning/models/planning_slot.py 与 enterprise/planning/models/planning_template.py:模板不是为了偷懒录入,而是为了让 open shift、角色匹配、自动分配和员工自助接班都落在可控边界内。
一、template 的核心价值不是复用,而是约束
planning.slot 上的 template_id、previous_template_id、template_reset、allow_template_creation 这一组字段,说明模板不是装饰。系统会通过 _compute_template_id() 和 _different_than_template() 持续比较当前班次是否仍符合模板定义;一旦偏离,模板绑定会被重置。
这件事很关键:企业排班里最怕“看起来来自模板,实际已经人工改坏”。Odoo 用 template reset 明确告诉你,这个班已经不再代表原始标准班型。
二、role matching 才是 open shift 能否自动接单的基础
role_id 不是一个展示字段。源码里 _compute_role_id() 会在模板回填时把角色带到 slot;帮助文本也明确说明 role 用来定义这类班需要什么资源,比如厨师、吧台、面试官。
也就是说,模板定义的是“标准班型”,role 定义的是“谁有资格来接”。如果角色模型没设计好,后面的 open shift、self assign、auto plan 都会变得不可信。
三、自动分配并不是“系统随便挑个人”
企业版 Planning 的含金量主要体现在 auto_plan_ids()。这个方法不是简单轮询员工,而是先收集 open shifts,再按资源可用性、日/周剩余工时、已分配时段重叠、工作日历等条件,逐步尝试把班次塞进合适资源的时间线里。
你从源码能看见几层很硬的保护:
allocated_percentage与allocated_hours会互相校正,避免超配后看不出来;- SQL 与 Python 双层重叠检查防止两个班次叠到 100% 以上;
_get_open_shifts_resources()与后续 timeline 计算不是只看“人没请假”,还看班表和资源工作能力;- 自动分配后还能
action_rollback_auto_plan_ids()回滚,不把试算结果直接固化成业务灾难。
所以它更像“受约束的自动试排”,不是 AI 神谕。
四、员工自助接班/退班的关键守卫在哪里
很多企业上线自助排班后出问题,不是发布班次,而是员工在最后一刻乱退班。这里 Odoo 处理得很直接:
action_self_assign()限制用户至少得能读到该班次、班次必须未分配、不能是过去班次、不能跨公司;allow_self_unassign、unassign_deadline、is_unassign_deadline_passed决定员工能否自己退班;action_self_unassign()会继续检查是否允许退班、是否过截止时间、是否试图退掉别人的班。
这部分其实就是企业排班的治理边界。没有这些 guard,所谓“开放班次”很快就会演变成“谁都能改,最后没人负责”。
五、模板、角色、自动分配三者怎么串起来
一条比较健康的企业版排班链路通常是:
- 先定义 slot template,固化标准时段、时长与角色;
- 发布 open shift,把需求先落到 role 层而不是具体人头;
- 让系统通过
auto_plan_ids()试算合适资源; - 再决定是否允许员工 self assign 或 self unassign;
- 发现模板被改坏时,用 template reset 明确把班次从“标准班型”剥离出来。
这里最容易被误解的是第 3 步:自动分配不是替代调度员,而是把明显不合规的排班先挡在系统里。
六、实战注意事项
1. role 不要只当标签
如果岗位定义粗糙,系统再会算也只能在错误候选池里做选择。
2. 不要忽视 template reset
很多团队复制模板后频繁手工改时间、工时、角色,却还以为自己在用“标准班”。被 reset 的班次最好单独审查。
3. 自助退班一定要配 deadline
unassign_deadline 不只是用户体验细节,它是在保护现场主管不会临时背锅。
七、结论
Odoo 企业版 Planning 的主链路不是“复制班表”,而是“用模板定义标准、用角色圈定候选、用自动分配与退班守卫兜住风险”。真正让它和普通日历排班拉开差距的,恰恰是这些你平时最容易忽略的限制条件。
主要源码锚点:
enterprise/planning/models/planning_slot.pyenterprise/planning/models/planning_template.py
DISCUSSION
评论区