很多团队第一次上绩效评估时,会把“技能”理解成附加说明:评语旁边多几行等级、主管手动改一下,最后再同步回员工档案。但 /home/ubuntu/odoo-temp/enterprise/hr_appraisal_skills 做的事情更像一个受控的技能变更链路,而不是表单装饰。
这篇主要参考:
enterprise/hr_appraisal_skills/models/hr_appraisal.pyenterprise/hr_appraisal_skills/models/hr_appraisal_goal.pyenterprise/hr_appraisal_skills/models/hr_appraisal_goal_skill.pyenterprise/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_value 与 test_changing_justification_value_should_not_create_new_skill 很值得看。官方明确区分:
- 改核心字段(比如 skill level)可能需要创建新的技能记录;
- 只改 justification 这类被动说明,不应该制造一条新技能历史。
这背后反映的是一个很成熟的建模思路:技能等级是业务事实,justification 是解释事实的备注,两者不能混成同一层变更。
六、实战注意事项
- 如果你想让 appraisal 用于晋升或转岗,先把
target_job_id设计好,否则技能基线会失真。 - 不要把 appraisal 当成实时读员工技能档案的看板,确认节点之后它就是快照流程。
- 如果发现技能历史异常膨胀,优先检查是不是把说明字段的修改也当成“等级变更”处理了。
七、结论
hr_appraisal_skills 真正解决的是:岗位要求、员工当前能力、评估结论三者如何在一个受控流程里对齐。它不是“多几行技能”,而是把技能评估变成可冻结、可比较、可回写、可审计的 HR 链路。
DISCUSSION
评论区