企业 绩效技能

Odoo 企业版绩效技能为什么不是“给 appraisal 多几行 skill”而已:target job 基线、确认快照与完成差异回写讲透

基于 hr_appraisal_skills 源码与测试,讲清 target job 如何补齐技能基线、员工确认时为何复制当前技能快照,以及完成评估后怎样只回写真正发生变化的技能。

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

很多团队第一次上绩效评估时,会把“技能”理解成附加说明:评语旁边多几行等级、主管手动改一下,最后再同步回员工档案。但 /home/ubuntu/odoo-temp/enterprise/hr_appraisal_skills 做的事情更像一个受控的技能变更链路,而不是表单装饰。

这篇主要参考:

  • enterprise/hr_appraisal_skills/models/hr_appraisal.py
  • enterprise/hr_appraisal_skills/models/hr_appraisal_goal.py
  • enterprise/hr_appraisal_skills/models/hr_appraisal_goal_skill.py
  • enterprise/hr_appraisal_skills/tests/test_hr_appraisal_skills.py

一、target_job_id 不是展示字段,而是技能基线生成器

_compute_appraisal_skill_ids() 会先看目标岗位 target_job_id.current_job_skill_ids,再拿当前 appraisal 里仍然有效的技能去做差集。缺的技能会被补成新的 hr.appraisal.skill 记录,已有但没有等级的空行会被删掉。

这意味着 target job 的作用不是“方便 HR 看岗位要求”,而是把岗位画像变成当前评估的比较基线。你改的不是静态模板,而是本轮 appraisal 应该讨论哪些技能。

二、员工确认时复制的是“当前技能快照”,不是永远实时联动

当状态从 1_new 进入 2_pending_copy_skills_when_confirmed() 会把员工当前技能复制进 appraisal。这里复制的内容包括:技能、旧等级、当前等级、有效期。

这一步非常关键。官方不是让 appraisal 永远实时读取 employee.current_employee_skill_ids,而是在确认节点把事实冻结下来。否则评估过程中员工技能档案又被别的流程改动,评估上下文就会漂移。

三、完成 appraisal 时不是全量覆盖,而是按差异更新

write() 在 state 变成 3_done 时,会把 appraisal 里的有效技能和员工当前技能做三类比对:

  • 等级变化的,记入 updated_skills
  • appraisal 有但员工档案没有的,视为新增;
  • 员工档案有但 appraisal 里没有的,视为删除。

然后才写回 employee_skill_ids。同时,QWeb 模板 appraisal_skills_update_template 会把变更摘要发到消息流。这说明官方要保留的是“技能结果 + 变更说明”,而不是只留下一个最终等级。

四、current_appraisal_skill_ids 是 UI 入口,不是第二套数据模型

很多人看到 current_appraisal_skill_ids 容易误会成另一张表。其实它只是对 appraisal_skill_ids 的受控投影:过滤掉过期技能,但保留证书类或仍然有效的记录。create()write() 里还会把它转换回真正的 appraisal_skill_ids command。

所以这里的设计重点不是多建一套模型,而是给前台一个“只看当前有效技能”的编辑入口,同时避免直接把无效数据混进评估结果。

五、最容易误解的点:被动字段改动不一定算“新技能记录”

测试 test_changing_skill_level_preserves_justification_valuetest_changing_justification_value_should_not_create_new_skill 很值得看。官方明确区分:

  • 改核心字段(比如 skill level)可能需要创建新的技能记录;
  • 只改 justification 这类被动说明,不应该制造一条新技能历史。

这背后反映的是一个很成熟的建模思路:技能等级是业务事实,justification 是解释事实的备注,两者不能混成同一层变更。

六、实战注意事项

  • 如果你想让 appraisal 用于晋升或转岗,先把 target_job_id 设计好,否则技能基线会失真。
  • 不要把 appraisal 当成实时读员工技能档案的看板,确认节点之后它就是快照流程。
  • 如果发现技能历史异常膨胀,优先检查是不是把说明字段的修改也当成“等级变更”处理了。

七、结论

hr_appraisal_skills 真正解决的是:岗位要求、员工当前能力、评估结论三者如何在一个受控流程里对齐。它不是“多几行技能”,而是把技能评估变成可冻结、可比较、可回写、可审计的 HR 链路。

DISCUSSION

评论区

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