企业 排班模板

Odoo 企业版 Planning 为什么不是“排班复制一下就行”:slot template、角色匹配与自动分配防呆讲透

基于 planning 源码,讲清 shift template、role 回填、open shift 自动分配与 self assign / unassign 守卫如何共同构成企业版排班的可控链路。

人力资源 企业
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 4 阅读

很多人第一次看 Odoo Planning,会把它理解成“把上周班表复制到这周”。但企业版真正复杂的地方,在 enterprise/planning/models/planning_slot.pyenterprise/planning/models/planning_template.py:模板不是为了偷懒录入,而是为了让 open shift、角色匹配、自动分配和员工自助接班都落在可控边界内。

一、template 的核心价值不是复用,而是约束

planning.slot 上的 template_idprevious_template_idtemplate_resetallow_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_percentageallocated_hours 会互相校正,避免超配后看不出来;
  • SQL 与 Python 双层重叠检查防止两个班次叠到 100% 以上;
  • _get_open_shifts_resources() 与后续 timeline 计算不是只看“人没请假”,还看班表和资源工作能力;
  • 自动分配后还能 action_rollback_auto_plan_ids() 回滚,不把试算结果直接固化成业务灾难。

所以它更像“受约束的自动试排”,不是 AI 神谕。

四、员工自助接班/退班的关键守卫在哪里

很多企业上线自助排班后出问题,不是发布班次,而是员工在最后一刻乱退班。这里 Odoo 处理得很直接:

  • action_self_assign() 限制用户至少得能读到该班次、班次必须未分配、不能是过去班次、不能跨公司;
  • allow_self_unassignunassign_deadlineis_unassign_deadline_passed 决定员工能否自己退班;
  • action_self_unassign() 会继续检查是否允许退班、是否过截止时间、是否试图退掉别人的班。

这部分其实就是企业排班的治理边界。没有这些 guard,所谓“开放班次”很快就会演变成“谁都能改,最后没人负责”。

五、模板、角色、自动分配三者怎么串起来

一条比较健康的企业版排班链路通常是:

  1. 先定义 slot template,固化标准时段、时长与角色;
  2. 发布 open shift,把需求先落到 role 层而不是具体人头;
  3. 让系统通过 auto_plan_ids() 试算合适资源;
  4. 再决定是否允许员工 self assign 或 self unassign;
  5. 发现模板被改坏时,用 template reset 明确把班次从“标准班型”剥离出来。

这里最容易被误解的是第 3 步:自动分配不是替代调度员,而是把明显不合规的排班先挡在系统里。

六、实战注意事项

1. role 不要只当标签

如果岗位定义粗糙,系统再会算也只能在错误候选池里做选择。

2. 不要忽视 template reset

很多团队复制模板后频繁手工改时间、工时、角色,却还以为自己在用“标准班”。被 reset 的班次最好单独审查。

3. 自助退班一定要配 deadline

unassign_deadline 不只是用户体验细节,它是在保护现场主管不会临时背锅。

七、结论

Odoo 企业版 Planning 的主链路不是“复制班表”,而是“用模板定义标准、用角色圈定候选、用自动分配与退班守卫兜住风险”。真正让它和普通日历排班拉开差距的,恰恰是这些你平时最容易忽略的限制条件。

主要源码锚点:

  • enterprise/planning/models/planning_slot.py
  • enterprise/planning/models/planning_template.py

DISCUSSION

评论区

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